docusaurus-theme-openapi-docs 0.0.0-780 → 0.0.0-797

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.
@@ -1,4 +1,4 @@
1
- export 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";
1
+ export type CodeSampleLanguage = "C" | "C#" | "C++" | "CoffeeScript" | "CSS" | "Dart" | "DM" | "Elixir" | "Go" | "Groovy" | "HTML" | "Java" | "JavaScript" | "Kotlin" | "Objective-C" | "OCaml" | "Perl" | "PHP" | "PowerShell" | "Python" | "R" | "Ruby" | "Rust" | "Scala" | "Shell" | "Swift" | "TypeScript";
2
2
  export interface Language {
3
3
  highlight: string;
4
4
  language: string;
@@ -78,118 +78,7 @@ const postman_code_generators_1 = __importDefault(
78
78
  require("postman-code-generators")
79
79
  );
80
80
  const languages_1 = require("./languages");
81
- exports.languageSet = [
82
- {
83
- highlight: "bash",
84
- language: "curl",
85
- codeSampleLanguage: "Shell",
86
- logoClass: "bash",
87
- options: {
88
- longFormat: false,
89
- followRedirect: true,
90
- trimRequestBody: true,
91
- },
92
- variant: "cURL",
93
- variants: ["curl"],
94
- },
95
- {
96
- highlight: "python",
97
- language: "python",
98
- codeSampleLanguage: "Python",
99
- logoClass: "python",
100
- options: {
101
- followRedirect: true,
102
- trimRequestBody: true,
103
- },
104
- variant: "requests",
105
- variants: ["requests", "http.client"],
106
- },
107
- {
108
- highlight: "go",
109
- language: "go",
110
- codeSampleLanguage: "Go",
111
- logoClass: "go",
112
- options: {
113
- followRedirect: true,
114
- trimRequestBody: true,
115
- },
116
- variant: "native",
117
- variants: ["native"],
118
- },
119
- {
120
- highlight: "javascript",
121
- language: "nodejs",
122
- codeSampleLanguage: "JavaScript",
123
- logoClass: "nodejs",
124
- options: {
125
- ES6_enabled: true,
126
- followRedirect: true,
127
- trimRequestBody: true,
128
- },
129
- variant: "axios",
130
- variants: ["axios", "native"],
131
- },
132
- {
133
- highlight: "ruby",
134
- language: "ruby",
135
- codeSampleLanguage: "Ruby",
136
- logoClass: "ruby",
137
- options: {
138
- followRedirect: true,
139
- trimRequestBody: true,
140
- },
141
- variant: "Net::HTTP",
142
- variants: ["net::http"],
143
- },
144
- {
145
- highlight: "csharp",
146
- language: "csharp",
147
- codeSampleLanguage: "C#",
148
- logoClass: "csharp",
149
- options: {
150
- followRedirect: true,
151
- trimRequestBody: true,
152
- },
153
- variant: "RestSharp",
154
- variants: ["restsharp", "httpclient"],
155
- },
156
- {
157
- highlight: "php",
158
- language: "php",
159
- codeSampleLanguage: "PHP",
160
- logoClass: "php",
161
- options: {
162
- followRedirect: true,
163
- trimRequestBody: true,
164
- },
165
- variant: "cURL",
166
- variants: ["curl", "guzzle", "pecl_http", "http_request2"],
167
- },
168
- {
169
- highlight: "java",
170
- language: "java",
171
- codeSampleLanguage: "Java",
172
- logoClass: "java",
173
- options: {
174
- followRedirect: true,
175
- trimRequestBody: true,
176
- },
177
- variant: "OkHttp",
178
- variants: ["okhttp", "unirest"],
179
- },
180
- {
181
- highlight: "powershell",
182
- language: "powershell",
183
- codeSampleLanguage: "PowerShell",
184
- logoClass: "powershell",
185
- options: {
186
- followRedirect: true,
187
- trimRequestBody: true,
188
- },
189
- variant: "RestMethod",
190
- variants: ["restmethod"],
191
- },
192
- ];
81
+ exports.languageSet = (0, languages_1.generateLanguageSet)();
193
82
  function CodeTab({ children, hidden, className }) {
194
83
  return react_1.default.createElement(
195
84
  "div",
@@ -392,6 +281,7 @@ function CodeSnippets({ postman, codeSamples }) {
392
281
  setSelectedSample: setSelectedSample,
393
282
  },
394
283
  languageSet: mergedLangs,
284
+ defaultValue: defaultLang[0]?.language ?? mergedLangs[0].language,
395
285
  lazy: true,
396
286
  },
397
287
  mergedLangs.map((lang) => {
@@ -2,3 +2,4 @@ import { CodeSample, Language } from "./code-snippets-types";
2
2
  export declare function mergeCodeSampleLanguage(languages: Language[], codeSamples: CodeSample[]): Language[];
3
3
  export declare const mergeArraysbyLanguage: (arr1: any, arr2: any) => any[];
4
4
  export declare function getCodeSampleSourceFromLanguage(language: Language): string;
5
+ export declare function generateLanguageSet(): Language[];
@@ -11,7 +11,8 @@ var __importDefault =
11
11
  return mod && mod.__esModule ? mod : { default: mod };
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.getCodeSampleSourceFromLanguage =
14
+ exports.generateLanguageSet =
15
+ exports.getCodeSampleSourceFromLanguage =
15
16
  exports.mergeArraysbyLanguage =
16
17
  exports.mergeCodeSampleLanguage =
17
18
  void 0;
@@ -19,6 +20,9 @@ const find_1 = __importDefault(require("lodash/find"));
19
20
  const isArray_1 = __importDefault(require("lodash/isArray"));
20
21
  const mergeWith_1 = __importDefault(require("lodash/mergeWith"));
21
22
  const unionBy_1 = __importDefault(require("lodash/unionBy"));
23
+ const postman_code_generators_1 = __importDefault(
24
+ require("postman-code-generators")
25
+ );
22
26
  function mergeCodeSampleLanguage(languages, codeSamples) {
23
27
  return languages.map((language) => {
24
28
  const languageCodeSamples = codeSamples.filter(
@@ -73,3 +77,27 @@ function getCodeSampleSourceFromLanguage(language) {
73
77
  return "";
74
78
  }
75
79
  exports.getCodeSampleSourceFromLanguage = getCodeSampleSourceFromLanguage;
80
+ function generateLanguageSet() {
81
+ const languageSet = [];
82
+ postman_code_generators_1.default.getLanguageList().forEach((language) => {
83
+ const variants = [];
84
+ language.variants.forEach((variant) => {
85
+ variants.push(variant.key);
86
+ });
87
+ languageSet.push({
88
+ highlight: language.syntax_mode,
89
+ language: language.key,
90
+ codeSampleLanguage: language.label,
91
+ logoClass: language.key,
92
+ options: {
93
+ longFormat: false,
94
+ followRedirect: true,
95
+ trimRequestBody: true,
96
+ },
97
+ variant: variants[0],
98
+ variants: variants,
99
+ });
100
+ });
101
+ return languageSet;
102
+ }
103
+ exports.generateLanguageSet = generateLanguageSet;
@@ -146,6 +146,24 @@ body[class="ReactModal__Body--open"] {
146
146
  }
147
147
  }
148
148
 
149
+ .openapi-tabs__code-item--dart {
150
+ color: var(--ifm-color-info);
151
+
152
+ &::after {
153
+ content: "";
154
+ width: var(--code-tab-logo-width);
155
+ height: var(--code-tab-logo-height);
156
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/dart/dart-original.svg")
157
+ no-repeat;
158
+ margin-block: auto;
159
+ }
160
+
161
+ &.active {
162
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-dart);
163
+ border-color: var(--openapi-code-tab-border-color-dart);
164
+ }
165
+ }
166
+
149
167
  .openapi-tabs__code-item--javascript {
150
168
  color: var(--ifm-color-warning);
151
169
 
@@ -164,7 +182,7 @@ body[class="ReactModal__Body--open"] {
164
182
  }
165
183
  }
166
184
 
167
- .openapi-tabs__code-item--bash {
185
+ .openapi-tabs__code-item--curl {
168
186
  color: var(--ifm-color-danger);
169
187
 
170
188
  &::after {
@@ -179,7 +197,7 @@ body[class="ReactModal__Body--open"] {
179
197
  }
180
198
 
181
199
  &.active {
182
- box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-bash);
200
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-curl);
183
201
  border-color: var(--ifm-color-danger);
184
202
  }
185
203
  }
@@ -220,6 +238,96 @@ body[class="ReactModal__Body--open"] {
220
238
  }
221
239
  }
222
240
 
241
+ .openapi-tabs__code-item--r {
242
+ color: var(--ifm-color-gray-500);
243
+
244
+ &::after {
245
+ content: "";
246
+ width: var(--code-tab-logo-width);
247
+ height: var(--code-tab-logo-height);
248
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/r/r-original.svg")
249
+ no-repeat;
250
+ margin-block: auto;
251
+ }
252
+
253
+ &.active {
254
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-r);
255
+ border-color: var(--openapi-code-tab-border-color-r);
256
+ }
257
+ }
258
+
259
+ .openapi-tabs__code-item--swift {
260
+ color: var(--ifm-color-danger);
261
+
262
+ &::after {
263
+ content: "";
264
+ width: var(--code-tab-logo-width);
265
+ height: var(--code-tab-logo-height);
266
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/swift/swift-original.svg")
267
+ no-repeat;
268
+ margin-block: auto;
269
+ }
270
+
271
+ &.active {
272
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-swift);
273
+ border-color: var(--openapi-code-tab-border-color-swift);
274
+ }
275
+ }
276
+
277
+ .openapi-tabs__code-item--c {
278
+ color: var(--ifm-color-info);
279
+
280
+ &::after {
281
+ content: "";
282
+ width: var(--code-tab-logo-width);
283
+ height: var(--code-tab-logo-height);
284
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/c/c-original.svg")
285
+ no-repeat;
286
+ margin-block: auto;
287
+ }
288
+
289
+ &.active {
290
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-c);
291
+ border-color: var(--openapi-code-tab-border-color-c);
292
+ }
293
+ }
294
+
295
+ .openapi-tabs__code-item--objective-c {
296
+ color: var(--ifm-color-info);
297
+
298
+ &::after {
299
+ content: "";
300
+ width: var(--code-tab-logo-width);
301
+ height: var(--code-tab-logo-height);
302
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/objectivec/objectivec-plain.svg")
303
+ no-repeat;
304
+ margin-block: auto;
305
+ }
306
+
307
+ &.active {
308
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-objective-c);
309
+ border-color: var(--openapi-code-tab-border-color-objective-c);
310
+ }
311
+ }
312
+
313
+ .openapi-tabs__code-item--ocaml {
314
+ color: var(--ifm-color-warning);
315
+
316
+ &::after {
317
+ content: "";
318
+ width: var(--code-tab-logo-width);
319
+ height: var(--code-tab-logo-height);
320
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/ocaml/ocaml-original.svg")
321
+ no-repeat;
322
+ margin-block: auto;
323
+ }
324
+
325
+ &.active {
326
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-objective-ocaml);
327
+ border-color: var(--openapi-code-tab-border-color-objective-ocaml);
328
+ }
329
+ }
330
+
223
331
  .openapi-tabs__code-item--nodejs {
224
332
  color: var(--ifm-color-success);
225
333
 
@@ -256,6 +364,42 @@ body[class="ReactModal__Body--open"] {
256
364
  }
257
365
  }
258
366
 
367
+ .openapi-tabs__code-item--kotlin {
368
+ color: var(--ifm-color-gray-500);
369
+
370
+ &::after {
371
+ content: "";
372
+ width: var(--code-tab-logo-width);
373
+ height: var(--code-tab-logo-height);
374
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/kotlin/kotlin-original.svg")
375
+ no-repeat;
376
+ margin-block: auto;
377
+ }
378
+
379
+ &.active {
380
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-kotlin);
381
+ border-color: var(--openapi-code-tab-border-color-kotlin);
382
+ }
383
+ }
384
+
385
+ .openapi-tabs__code-item--rust {
386
+ color: var(--ifm-color-gray-500);
387
+
388
+ &::after {
389
+ content: "";
390
+ width: var(--code-tab-logo-width);
391
+ height: var(--code-tab-logo-height);
392
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/rust/rust-original.svg")
393
+ no-repeat;
394
+ margin-block: auto;
395
+ }
396
+
397
+ &.active {
398
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-rust);
399
+ border-color: var(--openapi-code-tab-border-color-rust);
400
+ }
401
+ }
402
+
259
403
  .openapi-tabs__code-item--java {
260
404
  color: var(--ifm-color-warning);
261
405
 
@@ -71,12 +71,24 @@ function TabList({
71
71
  selectValue,
72
72
  tabValues,
73
73
  }) {
74
- const tabRefs = [];
74
+ const tabRefs = (0, react_1.useRef)([]);
75
75
  const { blockElementScrollPositionUntilNextRender } = (0,
76
76
  internal_1.useScrollPositionBlocker)();
77
+ (0, react_1.useEffect)(() => {
78
+ const activeTab = tabRefs.current.find(
79
+ (tab) => tab?.getAttribute("aria-selected") === "true"
80
+ );
81
+ if (activeTab) {
82
+ activeTab.scrollIntoView({
83
+ behavior: "auto",
84
+ block: "center",
85
+ inline: "start",
86
+ });
87
+ }
88
+ }, []);
77
89
  const handleTabChange = (event) => {
78
90
  const newTab = event.currentTarget;
79
- const newTabIndex = tabRefs.indexOf(newTab);
91
+ const newTabIndex = tabRefs.current.indexOf(newTab);
80
92
  const newTabValue = tabValues[newTabIndex].value;
81
93
  if (newTabValue !== selectedValue) {
82
94
  blockElementScrollPositionUntilNextRender(newTab);
@@ -100,7 +112,7 @@ function TabList({
100
112
  newLanguage = languageSet.filter(
101
113
  (lang) => lang.language === newTabValue
102
114
  )[0];
103
- action.setSelectedVariant(newLanguage.variant.toLowerCase());
115
+ action.setSelectedVariant(newLanguage.variants[0].toLowerCase());
104
116
  action.setSelectedSample(newLanguage.sample);
105
117
  }
106
118
  action.setLanguage(newLanguage);
@@ -114,13 +126,15 @@ function TabList({
114
126
  break;
115
127
  }
116
128
  case "ArrowRight": {
117
- const nextTab = tabRefs.indexOf(event.currentTarget) + 1;
118
- focusElement = tabRefs[nextTab] ?? tabRefs[0];
129
+ const nextTab = tabRefs.current.indexOf(event.currentTarget) + 1;
130
+ focusElement = tabRefs.current[nextTab] ?? tabRefs.current[0];
119
131
  break;
120
132
  }
121
133
  case "ArrowLeft": {
122
- const prevTab = tabRefs.indexOf(event.currentTarget) - 1;
123
- focusElement = tabRefs[prevTab] ?? tabRefs[tabRefs.length - 1];
134
+ const prevTab = tabRefs.current.indexOf(event.currentTarget) - 1;
135
+ focusElement =
136
+ tabRefs.current[prevTab] ??
137
+ tabRefs.current[tabRefs.current.length - 1];
124
138
  break;
125
139
  }
126
140
  default:
@@ -151,7 +165,7 @@ function TabList({
151
165
  tabIndex: selectedValue === value ? 0 : -1,
152
166
  "aria-selected": selectedValue === value,
153
167
  key: value,
154
- ref: (tabControl) => tabRefs.push(tabControl),
168
+ ref: (tabControl) => tabRefs.current.push(tabControl),
155
169
  onKeyDown: handleKeydown,
156
170
  onClick: handleTabChange,
157
171
  ...attributes,
@@ -2,6 +2,7 @@ import React from "react";
2
2
  export interface Props {
3
3
  method: string;
4
4
  path: string;
5
+ context?: "endpoint" | "callback";
5
6
  }
6
- declare function MethodEndpoint({ method, path }: Props): React.JSX.Element;
7
+ declare function MethodEndpoint({ method, path, context }: Props): React.JSX.Element;
7
8
  export default MethodEndpoint;
@@ -34,12 +34,15 @@ function colorForMethod(method) {
34
34
  return undefined;
35
35
  }
36
36
  }
37
- function MethodEndpoint({ method, path }) {
37
+ function MethodEndpoint({ method, path, context }) {
38
38
  let serverValue = (0, hooks_1.useTypedSelector)(
39
39
  (state) => state.server.value
40
40
  );
41
41
  let serverUrlWithVariables = "";
42
42
  const renderServerUrl = () => {
43
+ if (context === "callback") {
44
+ return "";
45
+ }
43
46
  if (serverValue && serverValue.variables) {
44
47
  serverUrlWithVariables = serverValue.url.replace(/\/$/, "");
45
48
  Object.keys(serverValue.variables).forEach((variable) => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "docusaurus-theme-openapi-docs",
3
3
  "description": "OpenAPI theme for Docusaurus.",
4
- "version": "0.0.0-780",
4
+ "version": "0.0.0-797",
5
5
  "license": "MIT",
6
6
  "keywords": [
7
7
  "openapi",
@@ -42,7 +42,7 @@
42
42
  "clsx": "^1.1.1",
43
43
  "copy-text-to-clipboard": "^3.1.0",
44
44
  "crypto-js": "^4.1.1",
45
- "docusaurus-plugin-openapi-docs": "0.0.0-780",
45
+ "docusaurus-plugin-openapi-docs": "0.0.0-797",
46
46
  "docusaurus-plugin-sass": "^0.2.3",
47
47
  "file-saver": "^2.0.5",
48
48
  "lodash": "^4.17.20",
@@ -69,5 +69,5 @@
69
69
  "engines": {
70
70
  "node": ">=14"
71
71
  },
72
- "gitHead": "43440ab62a83e241792cc9edbcee95cf14f2195d"
72
+ "gitHead": "0ad6968bd07b838eab231eb7ef399d1dc5c6ac8d"
73
73
  }
@@ -22,10 +22,12 @@ export type CodeSampleLanguage =
22
22
  | "JavaScript"
23
23
  | "Kotlin"
24
24
  | "Objective-C"
25
+ | "OCaml"
25
26
  | "Perl"
26
27
  | "PHP"
27
28
  | "PowerShell"
28
29
  | "Python"
30
+ | "R"
29
31
  | "Ruby"
30
32
  | "Rust"
31
33
  | "Scala"
@@ -27,120 +27,10 @@ import {
27
27
  getCodeSampleSourceFromLanguage,
28
28
  mergeArraysbyLanguage,
29
29
  mergeCodeSampleLanguage,
30
+ generateLanguageSet,
30
31
  } from "./languages";
31
32
 
32
- export const languageSet: Language[] = [
33
- {
34
- highlight: "bash",
35
- language: "curl",
36
- codeSampleLanguage: "Shell",
37
- logoClass: "bash",
38
- options: {
39
- longFormat: false,
40
- followRedirect: true,
41
- trimRequestBody: true,
42
- },
43
- variant: "cURL",
44
- variants: ["curl"],
45
- },
46
- {
47
- highlight: "python",
48
- language: "python",
49
- codeSampleLanguage: "Python",
50
- logoClass: "python",
51
- options: {
52
- followRedirect: true,
53
- trimRequestBody: true,
54
- },
55
- variant: "requests",
56
- variants: ["requests", "http.client"],
57
- },
58
- {
59
- highlight: "go",
60
- language: "go",
61
- codeSampleLanguage: "Go",
62
- logoClass: "go",
63
- options: {
64
- followRedirect: true,
65
- trimRequestBody: true,
66
- },
67
- variant: "native",
68
- variants: ["native"],
69
- },
70
- {
71
- highlight: "javascript",
72
- language: "nodejs",
73
- codeSampleLanguage: "JavaScript",
74
- logoClass: "nodejs",
75
- options: {
76
- ES6_enabled: true,
77
- followRedirect: true,
78
- trimRequestBody: true,
79
- },
80
- variant: "axios",
81
- variants: ["axios", "native"],
82
- },
83
- {
84
- highlight: "ruby",
85
- language: "ruby",
86
- codeSampleLanguage: "Ruby",
87
- logoClass: "ruby",
88
- options: {
89
- followRedirect: true,
90
- trimRequestBody: true,
91
- },
92
- variant: "Net::HTTP",
93
- variants: ["net::http"],
94
- },
95
- {
96
- highlight: "csharp",
97
- language: "csharp",
98
- codeSampleLanguage: "C#",
99
- logoClass: "csharp",
100
- options: {
101
- followRedirect: true,
102
- trimRequestBody: true,
103
- },
104
- variant: "RestSharp",
105
- variants: ["restsharp", "httpclient"],
106
- },
107
- {
108
- highlight: "php",
109
- language: "php",
110
- codeSampleLanguage: "PHP",
111
- logoClass: "php",
112
- options: {
113
- followRedirect: true,
114
- trimRequestBody: true,
115
- },
116
- variant: "cURL",
117
- variants: ["curl", "guzzle", "pecl_http", "http_request2"],
118
- },
119
- {
120
- highlight: "java",
121
- language: "java",
122
- codeSampleLanguage: "Java",
123
- logoClass: "java",
124
- options: {
125
- followRedirect: true,
126
- trimRequestBody: true,
127
- },
128
- variant: "OkHttp",
129
- variants: ["okhttp", "unirest"],
130
- },
131
- {
132
- highlight: "powershell",
133
- language: "powershell",
134
- codeSampleLanguage: "PowerShell",
135
- logoClass: "powershell",
136
- options: {
137
- followRedirect: true,
138
- trimRequestBody: true,
139
- },
140
- variant: "RestMethod",
141
- variants: ["restmethod"],
142
- },
143
- ];
33
+ export const languageSet: Language[] = generateLanguageSet();
144
34
 
145
35
  export interface Props {
146
36
  postman: sdk.Request;
@@ -339,6 +229,7 @@ function CodeSnippets({ postman, codeSamples }: Props) {
339
229
 
340
230
  return (
341
231
  <>
232
+ {/* Outer language tabs */}
342
233
  <CodeTabs
343
234
  groupId="code-samples"
344
235
  action={{
@@ -347,6 +238,7 @@ function CodeSnippets({ postman, codeSamples }: Props) {
347
238
  setSelectedSample: setSelectedSample,
348
239
  }}
349
240
  languageSet={mergedLangs}
241
+ defaultValue={defaultLang[0]?.language ?? mergedLangs[0].language}
350
242
  lazy
351
243
  >
352
244
  {mergedLangs.map((lang) => {
@@ -359,6 +251,7 @@ function CodeSnippets({ postman, codeSamples }: Props) {
359
251
  className: `openapi-tabs__code-item--${lang.logoClass}`,
360
252
  }}
361
253
  >
254
+ {/* Inner x-codeSamples tabs */}
362
255
  {lang.samples && (
363
256
  <CodeTabs
364
257
  className="openapi-tabs__code-container-inner"
@@ -400,6 +293,7 @@ function CodeSnippets({ postman, codeSamples }: Props) {
400
293
  </CodeTabs>
401
294
  )}
402
295
 
296
+ {/* Inner generated code snippets */}
403
297
  <CodeTabs
404
298
  className="openapi-tabs__code-container-inner"
405
299
  action={{
@@ -9,6 +9,7 @@ import find from "lodash/find";
9
9
  import isArray from "lodash/isArray";
10
10
  import mergeWith from "lodash/mergeWith";
11
11
  import unionBy from "lodash/unionBy";
12
+ import codegen from "postman-code-generators";
12
13
 
13
14
  import { CodeSample, Language } from "./code-snippets-types";
14
15
 
@@ -73,3 +74,27 @@ export function getCodeSampleSourceFromLanguage(language: Language) {
73
74
 
74
75
  return "";
75
76
  }
77
+
78
+ export function generateLanguageSet() {
79
+ const languageSet: Language[] = [];
80
+ codegen.getLanguageList().forEach((language: any) => {
81
+ const variants: any = [];
82
+ language.variants.forEach((variant: any) => {
83
+ variants.push(variant.key);
84
+ });
85
+ languageSet.push({
86
+ highlight: language.syntax_mode,
87
+ language: language.key,
88
+ codeSampleLanguage: language.label,
89
+ logoClass: language.key,
90
+ options: {
91
+ longFormat: false,
92
+ followRedirect: true,
93
+ trimRequestBody: true,
94
+ },
95
+ variant: variants[0],
96
+ variants: variants,
97
+ });
98
+ });
99
+ return languageSet;
100
+ }
@@ -146,6 +146,24 @@ body[class="ReactModal__Body--open"] {
146
146
  }
147
147
  }
148
148
 
149
+ .openapi-tabs__code-item--dart {
150
+ color: var(--ifm-color-info);
151
+
152
+ &::after {
153
+ content: "";
154
+ width: var(--code-tab-logo-width);
155
+ height: var(--code-tab-logo-height);
156
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/dart/dart-original.svg")
157
+ no-repeat;
158
+ margin-block: auto;
159
+ }
160
+
161
+ &.active {
162
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-dart);
163
+ border-color: var(--openapi-code-tab-border-color-dart);
164
+ }
165
+ }
166
+
149
167
  .openapi-tabs__code-item--javascript {
150
168
  color: var(--ifm-color-warning);
151
169
 
@@ -164,7 +182,7 @@ body[class="ReactModal__Body--open"] {
164
182
  }
165
183
  }
166
184
 
167
- .openapi-tabs__code-item--bash {
185
+ .openapi-tabs__code-item--curl {
168
186
  color: var(--ifm-color-danger);
169
187
 
170
188
  &::after {
@@ -179,7 +197,7 @@ body[class="ReactModal__Body--open"] {
179
197
  }
180
198
 
181
199
  &.active {
182
- box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-bash);
200
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-curl);
183
201
  border-color: var(--ifm-color-danger);
184
202
  }
185
203
  }
@@ -220,6 +238,96 @@ body[class="ReactModal__Body--open"] {
220
238
  }
221
239
  }
222
240
 
241
+ .openapi-tabs__code-item--r {
242
+ color: var(--ifm-color-gray-500);
243
+
244
+ &::after {
245
+ content: "";
246
+ width: var(--code-tab-logo-width);
247
+ height: var(--code-tab-logo-height);
248
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/r/r-original.svg")
249
+ no-repeat;
250
+ margin-block: auto;
251
+ }
252
+
253
+ &.active {
254
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-r);
255
+ border-color: var(--openapi-code-tab-border-color-r);
256
+ }
257
+ }
258
+
259
+ .openapi-tabs__code-item--swift {
260
+ color: var(--ifm-color-danger);
261
+
262
+ &::after {
263
+ content: "";
264
+ width: var(--code-tab-logo-width);
265
+ height: var(--code-tab-logo-height);
266
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/swift/swift-original.svg")
267
+ no-repeat;
268
+ margin-block: auto;
269
+ }
270
+
271
+ &.active {
272
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-swift);
273
+ border-color: var(--openapi-code-tab-border-color-swift);
274
+ }
275
+ }
276
+
277
+ .openapi-tabs__code-item--c {
278
+ color: var(--ifm-color-info);
279
+
280
+ &::after {
281
+ content: "";
282
+ width: var(--code-tab-logo-width);
283
+ height: var(--code-tab-logo-height);
284
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/c/c-original.svg")
285
+ no-repeat;
286
+ margin-block: auto;
287
+ }
288
+
289
+ &.active {
290
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-c);
291
+ border-color: var(--openapi-code-tab-border-color-c);
292
+ }
293
+ }
294
+
295
+ .openapi-tabs__code-item--objective-c {
296
+ color: var(--ifm-color-info);
297
+
298
+ &::after {
299
+ content: "";
300
+ width: var(--code-tab-logo-width);
301
+ height: var(--code-tab-logo-height);
302
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/objectivec/objectivec-plain.svg")
303
+ no-repeat;
304
+ margin-block: auto;
305
+ }
306
+
307
+ &.active {
308
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-objective-c);
309
+ border-color: var(--openapi-code-tab-border-color-objective-c);
310
+ }
311
+ }
312
+
313
+ .openapi-tabs__code-item--ocaml {
314
+ color: var(--ifm-color-warning);
315
+
316
+ &::after {
317
+ content: "";
318
+ width: var(--code-tab-logo-width);
319
+ height: var(--code-tab-logo-height);
320
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/ocaml/ocaml-original.svg")
321
+ no-repeat;
322
+ margin-block: auto;
323
+ }
324
+
325
+ &.active {
326
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-objective-ocaml);
327
+ border-color: var(--openapi-code-tab-border-color-objective-ocaml);
328
+ }
329
+ }
330
+
223
331
  .openapi-tabs__code-item--nodejs {
224
332
  color: var(--ifm-color-success);
225
333
 
@@ -256,6 +364,42 @@ body[class="ReactModal__Body--open"] {
256
364
  }
257
365
  }
258
366
 
367
+ .openapi-tabs__code-item--kotlin {
368
+ color: var(--ifm-color-gray-500);
369
+
370
+ &::after {
371
+ content: "";
372
+ width: var(--code-tab-logo-width);
373
+ height: var(--code-tab-logo-height);
374
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/kotlin/kotlin-original.svg")
375
+ no-repeat;
376
+ margin-block: auto;
377
+ }
378
+
379
+ &.active {
380
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-kotlin);
381
+ border-color: var(--openapi-code-tab-border-color-kotlin);
382
+ }
383
+ }
384
+
385
+ .openapi-tabs__code-item--rust {
386
+ color: var(--ifm-color-gray-500);
387
+
388
+ &::after {
389
+ content: "";
390
+ width: var(--code-tab-logo-width);
391
+ height: var(--code-tab-logo-height);
392
+ background: url("https://raw.githubusercontent.com/devicons/devicon/master/icons/rust/rust-original.svg")
393
+ no-repeat;
394
+ margin-block: auto;
395
+ }
396
+
397
+ &.active {
398
+ box-shadow: 0 0 0 3px var(--openapi-code-tab-shadow-color-rust);
399
+ border-color: var(--openapi-code-tab-border-color-rust);
400
+ }
401
+ }
402
+
259
403
  .openapi-tabs__code-item--java {
260
404
  color: var(--ifm-color-warning);
261
405
 
@@ -5,7 +5,7 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  * ========================================================================== */
7
7
 
8
- import React, { cloneElement, ReactElement } from "react";
8
+ import React, { cloneElement, ReactElement, useEffect, useRef } from "react";
9
9
 
10
10
  import {
11
11
  sanitizeTabsChildren,
@@ -43,10 +43,23 @@ function TabList({
43
43
  selectValue,
44
44
  tabValues,
45
45
  }: CodeTabsProps & ReturnType<typeof useTabs>) {
46
- const tabRefs: (HTMLLIElement | null)[] = [];
46
+ const tabRefs = useRef<(HTMLLIElement | null)[]>([]);
47
47
  const { blockElementScrollPositionUntilNextRender } =
48
48
  useScrollPositionBlocker();
49
49
 
50
+ useEffect(() => {
51
+ const activeTab = tabRefs.current.find(
52
+ (tab) => tab?.getAttribute("aria-selected") === "true"
53
+ );
54
+ if (activeTab) {
55
+ activeTab.scrollIntoView({
56
+ behavior: "auto",
57
+ block: "center",
58
+ inline: "start",
59
+ });
60
+ }
61
+ }, []);
62
+
50
63
  const handleTabChange = (
51
64
  event:
52
65
  | React.FocusEvent<HTMLLIElement>
@@ -54,7 +67,7 @@ function TabList({
54
67
  | React.KeyboardEvent<HTMLLIElement>
55
68
  ) => {
56
69
  const newTab = event.currentTarget;
57
- const newTabIndex = tabRefs.indexOf(newTab);
70
+ const newTabIndex = tabRefs.current.indexOf(newTab);
58
71
  const newTabValue = tabValues[newTabIndex]!.value;
59
72
 
60
73
  if (newTabValue !== selectedValue) {
@@ -80,7 +93,7 @@ function TabList({
80
93
  newLanguage = languageSet.filter(
81
94
  (lang: Language) => lang.language === newTabValue
82
95
  )[0];
83
- action.setSelectedVariant(newLanguage.variant.toLowerCase());
96
+ action.setSelectedVariant(newLanguage.variants[0].toLowerCase());
84
97
  action.setSelectedSample(newLanguage.sample);
85
98
  }
86
99
  action.setLanguage(newLanguage);
@@ -96,13 +109,15 @@ function TabList({
96
109
  break;
97
110
  }
98
111
  case "ArrowRight": {
99
- const nextTab = tabRefs.indexOf(event.currentTarget) + 1;
100
- focusElement = tabRefs[nextTab] ?? tabRefs[0]!;
112
+ const nextTab = tabRefs.current.indexOf(event.currentTarget) + 1;
113
+ focusElement = tabRefs.current[nextTab] ?? tabRefs.current[0]!;
101
114
  break;
102
115
  }
103
116
  case "ArrowLeft": {
104
- const prevTab = tabRefs.indexOf(event.currentTarget) - 1;
105
- focusElement = tabRefs[prevTab] ?? tabRefs[tabRefs.length - 1]!;
117
+ const prevTab = tabRefs.current.indexOf(event.currentTarget) - 1;
118
+ focusElement =
119
+ tabRefs.current[prevTab] ??
120
+ tabRefs.current[tabRefs.current.length - 1]!;
106
121
  break;
107
122
  }
108
123
  default:
@@ -132,7 +147,7 @@ function TabList({
132
147
  tabIndex={selectedValue === value ? 0 : -1}
133
148
  aria-selected={selectedValue === value}
134
149
  key={value}
135
- ref={(tabControl) => tabRefs.push(tabControl)}
150
+ ref={(tabControl) => tabRefs.current.push(tabControl)}
136
151
  onKeyDown={handleKeydown}
137
152
  onClick={handleTabChange}
138
153
  {...attributes}
@@ -35,13 +35,18 @@ function colorForMethod(method: string) {
35
35
  export interface Props {
36
36
  method: string;
37
37
  path: string;
38
+ context?: "endpoint" | "callback";
38
39
  }
39
40
 
40
- function MethodEndpoint({ method, path }: Props) {
41
+ function MethodEndpoint({ method, path, context }: Props) {
41
42
  let serverValue = useTypedSelector((state: any) => state.server.value);
42
43
  let serverUrlWithVariables = "";
43
44
 
44
45
  const renderServerUrl = () => {
46
+ if (context === "callback") {
47
+ return "";
48
+ }
49
+
45
50
  if (serverValue && serverValue.variables) {
46
51
  serverUrlWithVariables = serverValue.url.replace(/\/$/, "");
47
52