@gitbook/react-openapi 1.0.3 → 1.0.5

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 (68) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/InteractiveSection.jsx +10 -9
  3. package/dist/OpenAPICodeSample.jsx +8 -9
  4. package/dist/OpenAPIDisclosure.d.ts +2 -1
  5. package/dist/OpenAPIDisclosure.jsx +2 -1
  6. package/dist/OpenAPIDisclosureGroup.d.ts +1 -1
  7. package/dist/OpenAPIDisclosureGroup.jsx +3 -2
  8. package/dist/OpenAPIOperation.jsx +2 -2
  9. package/dist/OpenAPIPath.d.ts +3 -2
  10. package/dist/OpenAPIPath.jsx +4 -15
  11. package/dist/OpenAPIRequestBody.jsx +1 -1
  12. package/dist/OpenAPIResponse.jsx +1 -1
  13. package/dist/OpenAPIResponseExample.jsx +10 -10
  14. package/dist/OpenAPIResponses.d.ts +1 -1
  15. package/dist/OpenAPIResponses.jsx +5 -5
  16. package/dist/OpenAPISchema.d.ts +5 -1
  17. package/dist/OpenAPISchema.jsx +30 -21
  18. package/dist/OpenAPISchemaName.d.ts +4 -3
  19. package/dist/OpenAPISchemaName.jsx +1 -1
  20. package/dist/OpenAPISecurities.jsx +2 -2
  21. package/dist/OpenAPISpec.jsx +3 -4
  22. package/dist/OpenAPITabs.d.ts +3 -3
  23. package/dist/OpenAPITabs.jsx +52 -49
  24. package/dist/ScalarApiButton.jsx +1 -1
  25. package/dist/StaticSection.d.ts +10 -0
  26. package/dist/StaticSection.jsx +23 -0
  27. package/dist/code-samples.js +11 -11
  28. package/dist/generateSchemaExample.js +2 -1
  29. package/dist/resolveOpenAPIOperation.d.ts +3 -3
  30. package/dist/resolveOpenAPIOperation.js +1 -1
  31. package/dist/tsconfig.build.tsbuildinfo +1 -1
  32. package/dist/useSyncedTabsGlobalState.d.ts +10 -1
  33. package/dist/useSyncedTabsGlobalState.js +19 -15
  34. package/dist/util/server.d.ts +1 -1
  35. package/dist/util/server.js +1 -3
  36. package/dist/utils.d.ts +1 -1
  37. package/dist/utils.js +4 -6
  38. package/package.json +2 -7
  39. package/src/InteractiveSection.tsx +13 -21
  40. package/src/OpenAPICodeSample.tsx +11 -12
  41. package/src/OpenAPIDisclosure.tsx +5 -3
  42. package/src/OpenAPIDisclosureGroup.tsx +13 -11
  43. package/src/OpenAPIOperation.tsx +3 -3
  44. package/src/OpenAPIOperationContext.tsx +1 -1
  45. package/src/OpenAPIPath.tsx +11 -10
  46. package/src/OpenAPIRequestBody.tsx +2 -2
  47. package/src/OpenAPIResponse.tsx +3 -3
  48. package/src/OpenAPIResponseExample.tsx +12 -19
  49. package/src/OpenAPIResponses.tsx +7 -7
  50. package/src/OpenAPISchema.test.ts +5 -5
  51. package/src/OpenAPISchema.tsx +77 -27
  52. package/src/OpenAPISchemaName.tsx +5 -4
  53. package/src/OpenAPISecurities.tsx +3 -3
  54. package/src/OpenAPISpec.tsx +3 -5
  55. package/src/OpenAPITabs.tsx +56 -67
  56. package/src/ScalarApiButton.tsx +3 -3
  57. package/src/StaticSection.tsx +59 -0
  58. package/src/code-samples.test.ts +66 -66
  59. package/src/code-samples.ts +14 -14
  60. package/src/generateSchemaExample.ts +3 -3
  61. package/src/json2xml.test.ts +1 -1
  62. package/src/resolveOpenAPIOperation.test.ts +6 -6
  63. package/src/resolveOpenAPIOperation.ts +7 -7
  64. package/src/stringifyOpenAPI.ts +1 -1
  65. package/src/useSyncedTabsGlobalState.ts +33 -21
  66. package/src/util/server.test.ts +3 -3
  67. package/src/util/server.ts +2 -3
  68. package/src/utils.ts +4 -4
@@ -1,9 +1,9 @@
1
1
  'use client';
2
- import { createContext, useContext, useEffect, useMemo, useState } from 'react';
2
+ import { createContext, useContext, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import { Tab, TabList, TabPanel, Tabs } from 'react-aria-components';
4
+ import { useEventCallback } from 'usehooks-ts';
4
5
  import { Markdown } from './Markdown';
5
- import { useSyncedTabsGlobalState } from './useSyncedTabsGlobalState';
6
- import { useIntersectionObserver } from 'usehooks-ts';
6
+ import { getOrCreateTabStoreByKey } from './useSyncedTabsGlobalState';
7
7
  var OpenAPITabsContext = createContext(null);
8
8
  function useOpenAPITabsContext() {
9
9
  var context = useContext(OpenAPITabsContext);
@@ -16,60 +16,62 @@ function useOpenAPITabsContext() {
16
16
  * The OpenAPI Tabs wrapper component.
17
17
  */
18
18
  export function OpenAPITabs(props) {
19
+ var _a, _b;
19
20
  var children = props.children, items = props.items, stateKey = props.stateKey;
20
- var isVisible = stateKey
21
- ? useIntersectionObserver({
22
- threshold: 0.1,
23
- rootMargin: '200px',
24
- })
25
- : true;
26
- var defaultTab = items[0];
27
- var _a = useSyncedTabsGlobalState(), syncedTabs = _a[0], setSyncedTabs = _a[1];
28
- var _b = useState(function () {
29
- var _a, _b, _c;
30
- if (isVisible && stateKey && syncedTabs && syncedTabs.has(stateKey)) {
31
- var tabFromState = syncedTabs.get(stateKey);
32
- return (_a = tabFromState === null || tabFromState === void 0 ? void 0 : tabFromState.key) !== null && _a !== void 0 ? _a : (_b = items[0]) === null || _b === void 0 ? void 0 : _b.key;
33
- }
34
- return (_c = items[0]) === null || _c === void 0 ? void 0 : _c.key;
35
- }), selectedTabKey = _b[0], setSelectedTabKey = _b[1];
36
- var _c = useState(defaultTab), selectedTab = _c[0], setSelectedTab = _c[1];
37
- var handleSelectionChange = function (key) {
38
- setSelectedTabKey(key);
39
- if (stateKey) {
40
- var tab_1 = items.find(function (item) { return item.key === key; });
41
- if (!tab_1) {
42
- return;
21
+ var _c = useState(function () {
22
+ var _a, _b;
23
+ if (stateKey && typeof window !== 'undefined') {
24
+ var store = getOrCreateTabStoreByKey(stateKey);
25
+ var tabKey_1 = store.getState().tabKey;
26
+ if (tabKey_1) {
27
+ return tabKey_1;
43
28
  }
44
- setSyncedTabs(function (state) {
45
- var newState = new Map(state);
46
- newState.set(stateKey, tab_1);
47
- return newState;
48
- });
49
29
  }
50
- };
30
+ return (_b = (_a = items[0]) === null || _a === void 0 ? void 0 : _a.key) !== null && _b !== void 0 ? _b : null;
31
+ }), tabKey = _c[0], setTabKey = _c[1];
32
+ var selectTab = useEventCallback(function (key) {
33
+ if (!key || key === tabKey) {
34
+ return;
35
+ }
36
+ var tab = items.find(function (item) { return item.key === key; });
37
+ if (!tab) {
38
+ return;
39
+ }
40
+ setTabKey(key);
41
+ });
42
+ var selectedTab = (_b = (_a = items.find(function (item) { return item.key === tabKey; })) !== null && _a !== void 0 ? _a : items[0]) !== null && _b !== void 0 ? _b : null;
43
+ var cancelDeferRef = useRef(null);
51
44
  useEffect(function () {
52
- if (isVisible && stateKey && syncedTabs && syncedTabs.has(stateKey)) {
53
- var tabFromState_1 = syncedTabs.get(stateKey);
54
- if (!items.some(function (item) { return item.key === (tabFromState_1 === null || tabFromState_1 === void 0 ? void 0 : tabFromState_1.key); })) {
55
- return setSelectedTab(defaultTab);
56
- }
57
- if (tabFromState_1 && (tabFromState_1 === null || tabFromState_1 === void 0 ? void 0 : tabFromState_1.key) !== (selectedTab === null || selectedTab === void 0 ? void 0 : selectedTab.key)) {
58
- var tabFromItems = items.find(function (item) { return item.key === tabFromState_1.key; });
59
- if (!tabFromItems) {
60
- return;
61
- }
62
- setSelectedTab(tabFromItems);
63
- }
45
+ if (!stateKey) {
46
+ return undefined;
64
47
  }
65
- }, [isVisible, stateKey, syncedTabs, selectedTabKey]);
48
+ var store = getOrCreateTabStoreByKey(stateKey);
49
+ return store.subscribe(function (state) {
50
+ var _a;
51
+ (_a = cancelDeferRef.current) === null || _a === void 0 ? void 0 : _a.call(cancelDeferRef);
52
+ cancelDeferRef.current = defer(function () { return selectTab(state.tabKey); });
53
+ });
54
+ }, [stateKey, selectTab]);
55
+ useEffect(function () {
56
+ return function () { var _a; return (_a = cancelDeferRef.current) === null || _a === void 0 ? void 0 : _a.call(cancelDeferRef); };
57
+ }, []);
66
58
  var contextValue = useMemo(function () { return ({ items: items, selectedTab: selectedTab }); }, [items, selectedTab]);
67
59
  return (<OpenAPITabsContext.Provider value={contextValue}>
68
- <Tabs className="openapi-tabs" onSelectionChange={handleSelectionChange} selectedKey={selectedTab === null || selectedTab === void 0 ? void 0 : selectedTab.key}>
60
+ <Tabs className="openapi-tabs" onSelectionChange={function (tabKey) {
61
+ selectTab(tabKey);
62
+ if (stateKey) {
63
+ var store = getOrCreateTabStoreByKey(stateKey);
64
+ store.setState({ tabKey: tabKey });
65
+ }
66
+ }} selectedKey={tabKey}>
69
67
  {children}
70
68
  </Tabs>
71
69
  </OpenAPITabsContext.Provider>);
72
70
  }
71
+ var defer = function (fn) {
72
+ var id = setTimeout(fn, 0);
73
+ return function () { return clearTimeout(id); };
74
+ };
73
75
  /**
74
76
  * The OpenAPI Tabs list component.
75
77
  * This component should be used as a child of the OpenAPITabs component.
@@ -78,14 +80,14 @@ export function OpenAPITabs(props) {
78
80
  export function OpenAPITabsList() {
79
81
  var items = useOpenAPITabsContext().items;
80
82
  return (<TabList className="openapi-tabs-list">
81
- {items.map(function (tab) { return (<Tab style={function (_a) {
83
+ {items.map(function (tab) { return (<Tab key={tab.key} id={tab.key} style={function (_a) {
82
84
  var isFocusVisible = _a.isFocusVisible;
83
85
  return ({
84
86
  outline: isFocusVisible
85
87
  ? '2px solid rgb(var(--primary-color-500)/0.4)'
86
88
  : 'none',
87
89
  });
88
- }} className="openapi-tabs-tab" key={"Tab-".concat(tab.key)} id={tab.key}>
90
+ }} className="openapi-tabs-tab">
89
91
  {tab.label}
90
92
  </Tab>); })}
91
93
  </TabList>);
@@ -100,7 +102,8 @@ export function OpenAPITabsPanels() {
100
102
  if (!selectedTab) {
101
103
  return null;
102
104
  }
103
- return (<TabPanel key={"TabPanel-".concat(selectedTab.key)} id={selectedTab.key.toString()} className="openapi-tabs-panel">
105
+ var key = selectedTab.key.toString();
106
+ return (<TabPanel key={key} id={key} className="openapi-tabs-panel">
104
107
  {selectedTab.body}
105
108
  {selectedTab.description ? (<Markdown source={selectedTab.description} className="openapi-tabs-footer"/>) : null}
106
109
  </TabPanel>);
@@ -2,8 +2,8 @@
2
2
  import { ApiClientModalProvider, useApiClientModal } from '@scalar/api-client-react';
3
3
  import { useEffect, useImperativeHandle, useRef, useState } from 'react';
4
4
  import { createPortal } from 'react-dom';
5
- import { useOpenAPIOperationContext } from './OpenAPIOperationContext';
6
5
  import { useEventCallback } from 'usehooks-ts';
6
+ import { useOpenAPIOperationContext } from './OpenAPIOperationContext';
7
7
  /**
8
8
  * Button which launches the Scalar API Client
9
9
  */
@@ -0,0 +1,10 @@
1
+ import { type ComponentPropsWithoutRef } from 'react';
2
+ export declare function Section(props: ComponentPropsWithoutRef<'div'>): import("react").JSX.Element;
3
+ export declare function SectionHeader(props: ComponentPropsWithoutRef<'div'>): import("react").JSX.Element;
4
+ export declare function SectionHeaderContent(props: ComponentPropsWithoutRef<'div'>): import("react").JSX.Element;
5
+ export declare const SectionBody: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
6
+ export declare function StaticSection(props: {
7
+ className: string;
8
+ header: React.ReactNode;
9
+ children: React.ReactNode;
10
+ }): import("react").JSX.Element;
@@ -0,0 +1,23 @@
1
+ import clsx from 'clsx';
2
+ import { forwardRef } from 'react';
3
+ export function Section(props) {
4
+ return <div {...props} className={clsx('openapi-section', props.className)}/>;
5
+ }
6
+ export function SectionHeader(props) {
7
+ return (<div {...props} className={clsx('openapi-section-header', props.className && "".concat(props.className, "-header"))}/>);
8
+ }
9
+ export function SectionHeaderContent(props) {
10
+ return (<div {...props} className={clsx('openapi-section-header-content', props.className && "".concat(props.className, "-header-content"))}/>);
11
+ }
12
+ export var SectionBody = forwardRef(function SectionBody(props, ref) {
13
+ return (<div ref={ref} {...props} className={clsx('openapi-section-body', props.className && "".concat(props.className, "-body"))}/>);
14
+ });
15
+ export function StaticSection(props) {
16
+ var className = props.className, header = props.header, children = props.children;
17
+ return (<Section className={className}>
18
+ <SectionHeader className={className}>
19
+ <SectionHeaderContent className={className}>{header}</SectionHeaderContent>
20
+ </SectionHeader>
21
+ <SectionBody className={className}>{children}</SectionBody>
22
+ </Section>);
23
+ }
@@ -9,7 +9,7 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
- import { isFormData, isPDF, isFormUrlEncoded, isText, isXML, isCSV, isGraphQL, isPlainObject, } from './contentTypeChecks';
12
+ import { isCSV, isFormData, isFormUrlEncoded, isGraphQL, isPDF, isPlainObject, isText, isXML, } from './contentTypeChecks';
13
13
  import { stringifyOpenAPI } from './stringifyOpenAPI';
14
14
  export var codeSampleGenerators = [
15
15
  {
@@ -71,8 +71,8 @@ export var codeSampleGenerators = [
71
71
  if (body) {
72
72
  code += indent("body: ".concat(body, "\n"), 4);
73
73
  }
74
- code += "});\n\n";
75
- code += "const data = await response.json();";
74
+ code += '});\n\n';
75
+ code += 'const data = await response.json();';
76
76
  return code;
77
77
  },
78
78
  },
@@ -106,7 +106,7 @@ export var codeSampleGenerators = [
106
106
  }
107
107
  }
108
108
  code += ')\n\n';
109
- code += "data = response.json()";
109
+ code += 'data = response.json()';
110
110
  return code;
111
111
  },
112
112
  },
@@ -132,12 +132,12 @@ export var codeSampleGenerators = [
132
132
  headers.Accept = '*/*';
133
133
  }
134
134
  var headerString = headers
135
- ? Object.entries(headers)
135
+ ? "".concat(Object.entries(headers)
136
136
  .map(function (_a) {
137
137
  var key = _a[0], value = _a[1];
138
- return key.toLowerCase() !== 'host' ? "".concat(key, ": ").concat(value) : "";
138
+ return key.toLowerCase() !== 'host' ? "".concat(key, ": ").concat(value) : '';
139
139
  })
140
- .join('\n') + '\n'
140
+ .join('\n'), "\n")
141
141
  : '';
142
142
  var bodyString = body ? "\n".concat(body) : '';
143
143
  var httpRequest = "".concat(method.toUpperCase(), " ").concat(decodeURI(path), " HTTP/1.1\nHost: ").concat(host, "\n").concat(headerString).concat(bodyString);
@@ -158,7 +158,7 @@ export function parseHostAndPath(url) {
158
158
  var path = urlObj.pathname || '/';
159
159
  return { host: urlObj.host, path: path };
160
160
  }
161
- catch (e) {
161
+ catch (_e) {
162
162
  // If the URL was invalid do our best to parse the URL.
163
163
  // Check for the protocol part and pull it off to grab the host
164
164
  var splitted = url.split('//');
@@ -168,7 +168,7 @@ export function parseHostAndPath(url) {
168
168
  // pull off the host (mutates)
169
169
  var host = parts.shift();
170
170
  // add a leading slash and join the paths again
171
- var path = '/' + parts.join('/');
171
+ var path = "/".concat(parts.join('/'));
172
172
  return { host: host, path: path };
173
173
  }
174
174
  }
@@ -307,7 +307,7 @@ var BodyGenerators = {
307
307
  if (isPlainObject(body)) {
308
308
  Object.entries(body).forEach(function (_a) {
309
309
  var key = _a[0], value = _a[1];
310
- code += indent("\"".concat(key, "\": \"").concat(String(value), "\","), 4) + '\n';
310
+ code += "".concat(indent("\"".concat(key, "\": \"").concat(String(value), "\","), 4), "\n");
311
311
  });
312
312
  }
313
313
  code += '}\n\n';
@@ -315,7 +315,7 @@ var BodyGenerators = {
315
315
  }
316
316
  if (isPDF(contentType)) {
317
317
  code += 'files = {\n';
318
- code += indent("\"file\": \"".concat(body, "\","), 4) + '\n';
318
+ code += "".concat(indent("\"file\": \"".concat(body, "\","), 4), "\n");
319
319
  code += '}\n\n';
320
320
  body = 'files';
321
321
  }
@@ -26,7 +26,8 @@ export function generateSchemaExample(schema, options) {
26
26
  binary: 'binary',
27
27
  byte: 'Ynl0ZXM=',
28
28
  password: 'password',
29
- } }, options), 3);
29
+ } }, options), 3 // Max depth for circular references
30
+ );
30
31
  }
31
32
  /**
32
33
  * Generate an example for a media type.
@@ -1,6 +1,6 @@
1
- import { toJSON, fromJSON } from 'flatted';
2
- import { type OpenAPIV3xDocument, type Filesystem } from '@gitbook/openapi-parser';
3
- import { OpenAPIOperationData } from './types';
1
+ import { fromJSON, toJSON } from 'flatted';
2
+ import { type Filesystem, type OpenAPIV3xDocument } from '@gitbook/openapi-parser';
3
+ import type { OpenAPIOperationData } from './types';
4
4
  export { toJSON, fromJSON };
5
5
  /**
6
6
  * Resolve an OpenAPI operation in a file and compile it to a more usable format.
@@ -54,7 +54,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
54
54
  }
55
55
  return to.concat(ar || Array.prototype.slice.call(from));
56
56
  };
57
- import { toJSON, fromJSON } from 'flatted';
57
+ import { fromJSON, toJSON } from 'flatted';
58
58
  import { dereference, } from '@gitbook/openapi-parser';
59
59
  import { checkIsReference } from './utils';
60
60
  export { toJSON, fromJSON };