docusaurus-theme-openapi-docs 2.0.2 → 2.0.4

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 (31) hide show
  1. package/lib/theme/ApiExplorer/Body/index.js +8 -1
  2. package/lib/theme/ApiExplorer/CodeSnippets/code-snippets-types.d.ts +21 -0
  3. package/lib/theme/ApiExplorer/CodeSnippets/code-snippets-types.js +8 -0
  4. package/lib/theme/ApiExplorer/CodeSnippets/index.d.ts +2 -12
  5. package/lib/theme/ApiExplorer/CodeSnippets/index.js +87 -8
  6. package/lib/theme/ApiExplorer/CodeSnippets/languages.d.ts +2 -0
  7. package/lib/theme/ApiExplorer/CodeSnippets/languages.js +32 -0
  8. package/lib/theme/ApiExplorer/CodeTabs/_CodeTabs.scss +14 -0
  9. package/lib/theme/ApiExplorer/CodeTabs/index.js +7 -0
  10. package/lib/theme/ApiExplorer/index.js +1 -1
  11. package/lib/theme/ApiTabs/index.js +11 -3
  12. package/lib/theme/Markdown/index.js +37 -0
  13. package/lib/theme/OperationTabs/_OperationTabs.scss +68 -0
  14. package/lib/theme/OperationTabs/index.js +187 -0
  15. package/lib/theme/styles.scss +1 -0
  16. package/package.json +3 -3
  17. package/src/theme/ApiExplorer/Body/index.tsx +3 -1
  18. package/src/theme/ApiExplorer/CodeSnippets/code-snippets-types.ts +55 -0
  19. package/src/theme/ApiExplorer/CodeSnippets/index.tsx +94 -21
  20. package/src/theme/ApiExplorer/CodeSnippets/languages.ts +37 -0
  21. package/src/theme/ApiExplorer/CodeTabs/_CodeTabs.scss +14 -0
  22. package/src/theme/ApiExplorer/CodeTabs/index.js +7 -0
  23. package/src/theme/ApiExplorer/index.tsx +1 -1
  24. package/src/theme/ApiTabs/index.js +11 -3
  25. package/src/theme/Markdown/index.js +37 -0
  26. package/src/theme/OperationTabs/_OperationTabs.scss +68 -0
  27. package/src/theme/OperationTabs/index.js +187 -0
  28. package/src/theme/styles.scss +1 -0
  29. package/src/theme-openapi.d.ts +4 -0
  30. package/lib/theme/ApiExplorer/CodeSnippets/languages.json +0 -1386
  31. package/src/theme/ApiExplorer/CodeSnippets/languages.json +0 -1386
@@ -23,6 +23,7 @@ const FormTextInput_1 = __importDefault(
23
23
  );
24
24
  const LiveEditor_1 = __importDefault(require("@theme/ApiExplorer/LiveEditor"));
25
25
  const hooks_1 = require("@theme/ApiItem/hooks");
26
+ const Markdown_1 = __importDefault(require("@theme/Markdown"));
26
27
  const SchemaTabs_1 = __importDefault(require("@theme/SchemaTabs"));
27
28
  const TabItem_1 = __importDefault(require("@theme/TabItem"));
28
29
  const xml_formatter_1 = __importDefault(require("xml-formatter"));
@@ -296,6 +297,10 @@ function Body({
296
297
  react_1.default.createElement(
297
298
  TabItem_1.default,
298
299
  { label: "Example", value: "example" },
300
+ example.summary &&
301
+ react_1.default.createElement(Markdown_1.default, {
302
+ children: example.summary,
303
+ }),
299
304
  exampleBody &&
300
305
  react_1.default.createElement(
301
306
  LiveEditor_1.default,
@@ -337,7 +342,9 @@ function Body({
337
342
  key: example.label,
338
343
  },
339
344
  example.summary &&
340
- react_1.default.createElement("p", null, example.summary),
345
+ react_1.default.createElement(Markdown_1.default, {
346
+ children: example.summary,
347
+ }),
341
348
  example.body &&
342
349
  react_1.default.createElement(
343
350
  LiveEditor_1.default,
@@ -0,0 +1,21 @@
1
+ export declare type CodeSampleLanguage = "C" | "C#" | "C++" | "CoffeeScript" | "CSS" | "Dart" | "DM" | "Elixir" | "Go" | "Groovy" | "HTML" | "Java" | "JavaScript" | "Kotlin" | "Objective-C" | "Perl" | "PHP" | "PowerShell" | "Python" | "Ruby" | "Rust" | "Scala" | "Shell" | "Swift" | "TypeScript";
2
+ export interface Language {
3
+ highlight: string;
4
+ language: string;
5
+ codeSampleLanguage: CodeSampleLanguage;
6
+ logoClass: string;
7
+ variant: string;
8
+ variants: string[];
9
+ options?: {
10
+ [key: string]: boolean;
11
+ };
12
+ sample?: string;
13
+ samples?: string[];
14
+ samplesSources?: string[];
15
+ samplesLabels?: string[];
16
+ }
17
+ export interface CodeSample {
18
+ source: string;
19
+ lang: CodeSampleLanguage;
20
+ label?: string;
21
+ }
@@ -0,0 +1,8 @@
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 });
@@ -1,20 +1,10 @@
1
1
  /// <reference types="react" />
2
2
  import sdk from "@paloaltonetworks/postman-collection";
3
- export interface Language {
4
- highlight: string;
5
- language: string;
6
- logoClass: string;
7
- variant: string;
8
- variants: string[];
9
- options: {
10
- [key: string]: boolean;
11
- };
12
- source?: string;
13
- }
3
+ import { CodeSample, Language } from "./code-snippets-types";
14
4
  export declare const languageSet: Language[];
15
5
  export interface Props {
16
6
  postman: sdk.Request;
17
- codeSamples: any;
7
+ codeSamples: CodeSample[];
18
8
  }
19
9
  declare function CodeSnippets({ postman, codeSamples }: Props): JSX.Element | null;
20
10
  export default CodeSnippets;
@@ -72,10 +72,12 @@ const buildPostmanRequest_1 = __importDefault(
72
72
  const CodeTabs_1 = __importDefault(require("@theme/ApiExplorer/CodeTabs"));
73
73
  const hooks_1 = require("@theme/ApiItem/hooks");
74
74
  const merge_1 = __importDefault(require("lodash/merge"));
75
+ const languages_1 = require("./languages");
75
76
  exports.languageSet = [
76
77
  {
77
78
  highlight: "bash",
78
79
  language: "curl",
80
+ codeSampleLanguage: "Shell",
79
81
  logoClass: "bash",
80
82
  options: {
81
83
  longFormat: false,
@@ -88,6 +90,7 @@ exports.languageSet = [
88
90
  {
89
91
  highlight: "python",
90
92
  language: "python",
93
+ codeSampleLanguage: "Python",
91
94
  logoClass: "python",
92
95
  options: {
93
96
  followRedirect: true,
@@ -99,6 +102,7 @@ exports.languageSet = [
99
102
  {
100
103
  highlight: "go",
101
104
  language: "go",
105
+ codeSampleLanguage: "Go",
102
106
  logoClass: "go",
103
107
  options: {
104
108
  followRedirect: true,
@@ -110,6 +114,7 @@ exports.languageSet = [
110
114
  {
111
115
  highlight: "javascript",
112
116
  language: "nodejs",
117
+ codeSampleLanguage: "JavaScript",
113
118
  logoClass: "nodejs",
114
119
  options: {
115
120
  ES6_enabled: true,
@@ -117,11 +122,12 @@ exports.languageSet = [
117
122
  trimRequestBody: true,
118
123
  },
119
124
  variant: "axios",
120
- variants: ["axios", "native", "request", "unirest"],
125
+ variants: ["axios", "native"],
121
126
  },
122
127
  {
123
128
  highlight: "ruby",
124
129
  language: "ruby",
130
+ codeSampleLanguage: "Ruby",
125
131
  logoClass: "ruby",
126
132
  options: {
127
133
  followRedirect: true,
@@ -133,6 +139,7 @@ exports.languageSet = [
133
139
  {
134
140
  highlight: "csharp",
135
141
  language: "csharp",
142
+ codeSampleLanguage: "C#",
136
143
  logoClass: "csharp",
137
144
  options: {
138
145
  followRedirect: true,
@@ -144,6 +151,7 @@ exports.languageSet = [
144
151
  {
145
152
  highlight: "php",
146
153
  language: "php",
154
+ codeSampleLanguage: "PHP",
147
155
  logoClass: "php",
148
156
  options: {
149
157
  followRedirect: true,
@@ -155,6 +163,7 @@ exports.languageSet = [
155
163
  {
156
164
  highlight: "java",
157
165
  language: "java",
166
+ codeSampleLanguage: "Java",
158
167
  logoClass: "java",
159
168
  options: {
160
169
  followRedirect: true,
@@ -166,6 +175,7 @@ exports.languageSet = [
166
175
  {
167
176
  highlight: "powershell",
168
177
  language: "powershell",
178
+ codeSampleLanguage: "PowerShell",
169
179
  logoClass: "powershell",
170
180
  options: {
171
181
  followRedirect: true,
@@ -175,7 +185,7 @@ exports.languageSet = [
175
185
  variants: ["restmethod"],
176
186
  },
177
187
  ];
178
- function CodeTab({ children, hidden, className, onClick }) {
188
+ function CodeTab({ children, hidden, className }) {
179
189
  return react_1.default.createElement(
180
190
  "div",
181
191
  { role: "tabpanel", className: className, ...{ hidden } },
@@ -208,7 +218,6 @@ function CodeSnippets({ postman, codeSamples }) {
208
218
  // Can override languageSet, change order of langs, override options and variants
209
219
  const langs = [
210
220
  ...(siteConfig?.themeConfig?.languageTabs ?? exports.languageSet),
211
- ...codeSamples,
212
221
  ];
213
222
  // Filter languageSet by user-defined langs
214
223
  const filteredLanguageSet = exports.languageSet.filter((ls) => {
@@ -217,13 +226,17 @@ function CodeSnippets({ postman, codeSamples }) {
217
226
  });
218
227
  });
219
228
  // Merge user-defined langs into languageSet
220
- const mergedLangs = (0, merge_1.default)(filteredLanguageSet, langs);
229
+ const mergedLangs = (0, languages_1.mergeCodeSampleLanguage)(
230
+ (0, merge_1.default)(filteredLanguageSet, langs),
231
+ codeSamples
232
+ );
221
233
  // Read defaultLang from localStorage
222
234
  const defaultLang = mergedLangs.filter(
223
235
  (lang) =>
224
236
  lang.language === localStorage.getItem("docusaurus.tab.code-samples")
225
237
  );
226
238
  const [selectedVariant, setSelectedVariant] = (0, react_1.useState)();
239
+ const [selectedSample, setSelectedSample] = (0, react_1.useState)();
227
240
  const [language, setLanguage] = (0, react_1.useState)(() => {
228
241
  // Return first index if only 1 user-defined language exists
229
242
  if (mergedLangs.length === 1) {
@@ -233,7 +246,20 @@ function CodeSnippets({ postman, codeSamples }) {
233
246
  return defaultLang[0] ?? mergedLangs[0];
234
247
  });
235
248
  const [codeText, setCodeText] = (0, react_1.useState)("");
249
+ const [codeSampleCodeText, setCodeSampleCodeText] = (0, react_1.useState)("");
236
250
  (0, react_1.useEffect)(() => {
251
+ // initial active language is custom code sample
252
+ if (
253
+ language &&
254
+ language.sample &&
255
+ language.samples &&
256
+ language.samplesSources
257
+ ) {
258
+ const sampleIndex = language.samples.findIndex(
259
+ (smp) => smp === language.sample
260
+ );
261
+ setCodeSampleCodeText(language.samplesSources[sampleIndex]);
262
+ }
237
263
  if (language && !!language.options) {
238
264
  const postmanRequest = (0, buildPostmanRequest_1.default)(postman, {
239
265
  queryParams,
@@ -258,8 +284,6 @@ function CodeSnippets({ postman, codeSamples }) {
258
284
  setCodeText(snippet);
259
285
  }
260
286
  );
261
- } else if (language && !!language.source) {
262
- setCodeText(language.source);
263
287
  } else if (language && !language.options) {
264
288
  const langSource = mergedLangs.filter(
265
289
  (lang) => lang.language === language.language
@@ -308,7 +332,8 @@ function CodeSnippets({ postman, codeSamples }) {
308
332
  auth,
309
333
  mergedLangs,
310
334
  ]);
311
- (0, react_1.useEffect)(() => {
335
+ // no dependencies was intentionlly set for this particular hook. it's safe as long as if conditions are set
336
+ (0, react_1.useEffect)(function onSelectedVariantUpdate() {
312
337
  if (selectedVariant && selectedVariant !== language.variant) {
313
338
  const postmanRequest = (0, buildPostmanRequest_1.default)(postman, {
314
339
  queryParams,
@@ -335,6 +360,21 @@ function CodeSnippets({ postman, codeSamples }) {
335
360
  );
336
361
  }
337
362
  });
363
+ // no dependencies was intentionlly set for this particular hook. it's safe as long as if conditions are set
364
+ // eslint-disable-next-line react-hooks/exhaustive-deps
365
+ (0, react_1.useEffect)(function onSelectedSampleUpdate() {
366
+ if (
367
+ language.samples &&
368
+ language.samplesSources &&
369
+ selectedSample &&
370
+ selectedSample !== language.sample
371
+ ) {
372
+ const sampleIndex = language.samples.findIndex(
373
+ (smp) => smp === selectedSample
374
+ );
375
+ setCodeSampleCodeText(language.samplesSources[sampleIndex]);
376
+ }
377
+ });
338
378
  if (language === undefined) {
339
379
  return null;
340
380
  }
@@ -362,6 +402,45 @@ function CodeSnippets({ postman, codeSamples }) {
362
402
  className: `openapi-tabs__code-item--${lang.logoClass}`,
363
403
  },
364
404
  },
405
+ lang.samples &&
406
+ react_1.default.createElement(
407
+ CodeTabs_1.default,
408
+ {
409
+ className: "openapi-tabs__code-container-inner",
410
+ action: {
411
+ setLanguage: setLanguage,
412
+ setSelectedSample: setSelectedSample,
413
+ },
414
+ includeSample: true,
415
+ currentLanguage: lang.language,
416
+ defaultValue: selectedSample,
417
+ lazy: true,
418
+ },
419
+ lang.samples.map((sample, index) => {
420
+ return react_1.default.createElement(
421
+ CodeTab,
422
+ {
423
+ value: sample,
424
+ label: lang.samplesLabels
425
+ ? lang.samplesLabels[index]
426
+ : sample,
427
+ key: `${lang.language}-${lang.sample}`,
428
+ attributes: {
429
+ className: `openapi-tabs__code-item--sample`,
430
+ },
431
+ },
432
+ react_1.default.createElement(
433
+ ApiCodeBlock_1.default,
434
+ {
435
+ language: lang.highlight,
436
+ className: "openapi-explorer__code-block",
437
+ showLineNumbers: true,
438
+ },
439
+ codeSampleCodeText
440
+ )
441
+ );
442
+ })
443
+ ),
365
444
  react_1.default.createElement(
366
445
  CodeTabs_1.default,
367
446
  {
@@ -375,7 +454,7 @@ function CodeSnippets({ postman, codeSamples }) {
375
454
  defaultValue: selectedVariant,
376
455
  lazy: true,
377
456
  },
378
- lang.variants.map((variant) => {
457
+ lang.variants.map((variant, index) => {
379
458
  return react_1.default.createElement(
380
459
  CodeTab,
381
460
  {
@@ -0,0 +1,2 @@
1
+ import { CodeSample, Language } from "./code-snippets-types";
2
+ export declare function mergeCodeSampleLanguage(languages: Language[], codeSamples: CodeSample[]): Language[];
@@ -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.mergeCodeSampleLanguage = void 0;
10
+ function mergeCodeSampleLanguage(languages, codeSamples) {
11
+ return languages.map((language) => {
12
+ const languageCodeSamples = codeSamples.filter(
13
+ ({ lang }) => lang === language.codeSampleLanguage
14
+ );
15
+ if (languageCodeSamples.length) {
16
+ const samples = languageCodeSamples.map(({ lang }) => lang);
17
+ const samplesLabels = languageCodeSamples.map(
18
+ ({ label, lang }) => label || lang
19
+ );
20
+ const samplesSources = languageCodeSamples.map(({ source }) => source);
21
+ return {
22
+ ...language,
23
+ sample: samples[0],
24
+ samples,
25
+ samplesSources,
26
+ samplesLabels,
27
+ };
28
+ }
29
+ return language;
30
+ });
31
+ }
32
+ exports.mergeCodeSampleLanguage = mergeCodeSampleLanguage;
@@ -94,6 +94,20 @@ body[class="ReactModal__Body--open"] {
94
94
  padding-right: 0.5rem !important;
95
95
  }
96
96
 
97
+ .openapi-tabs__code-item--sample {
98
+ color: var(--ifm-color-secondary);
99
+
100
+ &.active {
101
+ border-color: var(--ifm-toc-border-color);
102
+ }
103
+ }
104
+
105
+ .openapi-tabs__code-item--sample > span {
106
+ padding-top: unset !important;
107
+ padding-left: 0.5rem !important;
108
+ padding-right: 0.5rem !important;
109
+ }
110
+
97
111
  .openapi-tabs__code-item--python {
98
112
  color: var(--ifm-color-success);
99
113
 
@@ -19,6 +19,7 @@ function TabList({
19
19
  action,
20
20
  currentLanguage,
21
21
  includeVariant,
22
+ includeSample,
22
23
  className,
23
24
  block,
24
25
  selectedValue,
@@ -53,6 +54,12 @@ function TabList({
53
54
  )[0];
54
55
  action.setSelectedVariant(newLanguage.variant.toLowerCase());
55
56
  }
57
+
58
+ if (currentLanguage && includeSample) {
59
+ newLanguage.sample = newTabValue;
60
+ action.setSelectedSample(newTabValue.toLowerCase());
61
+ }
62
+
56
63
  action.setLanguage(newLanguage);
57
64
  }
58
65
  };
@@ -32,7 +32,7 @@ function ApiExplorer({ item, infoPath }) {
32
32
  item.method !== "event" &&
33
33
  react_1.default.createElement(CodeSnippets_1.default, {
34
34
  postman: postman,
35
- codeSamples: item["x-code-samples"] ?? [],
35
+ codeSamples: item["x-codeSamples"] ?? [],
36
36
  }),
37
37
  react_1.default.createElement(Request_1.default, { item: item }),
38
38
  react_1.default.createElement(Response_1.default, { item: item })
@@ -15,7 +15,15 @@ import useIsBrowser from "@docusaurus/useIsBrowser";
15
15
  import Heading from "@theme/Heading";
16
16
  import clsx from "clsx";
17
17
 
18
- function TabList({ className, block, selectedValue, selectValue, tabValues }) {
18
+ function TabList({
19
+ className,
20
+ block,
21
+ selectedValue,
22
+ selectValue,
23
+ tabValues,
24
+ label = "Responses",
25
+ id = "responses",
26
+ }) {
19
27
  const tabRefs = [];
20
28
  const { blockElementScrollPositionUntilNextRender } =
21
29
  useScrollPositionBlocker();
@@ -84,8 +92,8 @@ function TabList({ className, block, selectedValue, selectValue, tabValues }) {
84
92
 
85
93
  return (
86
94
  <div className="openapi-tabs__response-header-section">
87
- <Heading as="h2" id="responses" className="openapi-tabs__response-header">
88
- Responses
95
+ <Heading as="h2" id={id} className="openapi-tabs__response-header">
96
+ {label}
89
97
  </Heading>
90
98
  <div className="openapi-tabs__response-container">
91
99
  {showTabArrows && (
@@ -0,0 +1,37 @@
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 React from "react";
9
+
10
+ import CodeBlock from "@theme/CodeBlock";
11
+ import ReactMarkdown from "react-markdown";
12
+ import rehypeRaw from "rehype-raw";
13
+
14
+ function Markdown({ children }) {
15
+ return (
16
+ <div>
17
+ <ReactMarkdown
18
+ children={children}
19
+ rehypePlugins={[rehypeRaw]}
20
+ components={{
21
+ pre: "div",
22
+ code({ node, inline, className, children, ...props }) {
23
+ const match = /language-(\w+)/.exec(className || "");
24
+ if (inline) return <code>{children}</code>;
25
+ return !inline && match ? (
26
+ <CodeBlock className={className}>{children}</CodeBlock>
27
+ ) : (
28
+ <CodeBlock>{children}</CodeBlock>
29
+ );
30
+ },
31
+ }}
32
+ />
33
+ </div>
34
+ );
35
+ }
36
+
37
+ export default Markdown;
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
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
+ .openapi-tabs__operation-container {
9
+ display: flex;
10
+ align-items: center;
11
+ margin-top: 1rem;
12
+ overflow: hidden;
13
+ }
14
+
15
+ .openapi-tabs__operation-item {
16
+ display: flex;
17
+ align-items: center;
18
+ justify-content: center;
19
+ padding: 0.35rem 0.7rem;
20
+ border: 1px solid transparent;
21
+ margin-top: 0 !important;
22
+ margin-right: 0.5rem;
23
+ font-weight: var(--ifm-font-weight-bold);
24
+ font-size: 12px;
25
+ white-space: nowrap;
26
+ transition: 300ms;
27
+
28
+ &:hover {
29
+ background-color: transparent;
30
+ border: 1px solid var(--ifm-toc-border-color);
31
+ }
32
+
33
+ &.active {
34
+ border: 1px solid var(--ifm-tabs-color-active-border);
35
+ color: var(--ifm-tabs-color-active);
36
+ }
37
+
38
+ &:last-child {
39
+ margin-right: 0 !important;
40
+ }
41
+ }
42
+
43
+ .openapi-tabs__operation-list-container {
44
+ overflow-y: hidden;
45
+ overflow-x: scroll;
46
+ scroll-behavior: smooth;
47
+
48
+ &::-webkit-scrollbar {
49
+ display: none;
50
+ }
51
+ }
52
+
53
+ .openapi-tabs__operation-schema-container {
54
+ max-width: 600px;
55
+ }
56
+
57
+ @media screen and (max-width: 500px) {
58
+ .operationTabsTopSection {
59
+ flex-direction: column;
60
+ align-items: flex-start;
61
+ }
62
+
63
+ .operationTabsContainer {
64
+ width: 100%;
65
+ margin-top: var(--ifm-spacing-vertical);
66
+ padding: 0;
67
+ }
68
+ }