@jpmorganchase/elemental 3.1.1 → 4.0.1
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/components/API/APIWithSidebarLayout.d.ts +1 -0
- package/containers/API.d.ts +1 -0
- package/containers/API.stories.d.ts +11 -12
- package/hooks/oas-nav-tree/useGetOasNavTree.d.ts +1 -0
- package/hooks/oas-nav-tree/useGetOasNavTree.spec.d.ts +1 -0
- package/index.d.ts +3 -0
- package/index.esm.js +71 -37
- package/index.js +73 -36
- package/index.mjs +71 -37
- package/package.json +3 -3
- package/web-components.min.js +1 -1
- package/web-components.min.js.LICENSE.txt +0 -28
@@ -12,6 +12,7 @@ declare type SidebarLayoutProps = {
|
|
12
12
|
tryItCredentialsPolicy?: 'omit' | 'include' | 'same-origin';
|
13
13
|
tryItCorsProxy?: string;
|
14
14
|
tryItOutDefaultServer?: string;
|
15
|
+
useCustomNav?: boolean;
|
15
16
|
};
|
16
17
|
export declare const APIWithSidebarLayout: React.FC<SidebarLayoutProps>;
|
17
18
|
export {};
|
package/containers/API.d.ts
CHANGED
@@ -18,6 +18,7 @@ export interface CommonAPIProps extends RoutingProps {
|
|
18
18
|
tryItCredentialsPolicy?: 'omit' | 'include' | 'same-origin';
|
19
19
|
tryItCorsProxy?: string;
|
20
20
|
tryItOutDefaultServer?: string;
|
21
|
+
useCustomNav?: boolean;
|
21
22
|
}
|
22
23
|
export declare const APIImpl: React.FC<APIProps>;
|
23
24
|
export declare const API: React.FC<APIProps>;
|
@@ -1,4 +1,3 @@
|
|
1
|
-
import { Story } from '@storybook/react';
|
2
1
|
import * as React from 'react';
|
3
2
|
import { APIProps } from './API';
|
4
3
|
declare const _default: {
|
@@ -44,14 +43,14 @@ declare const _default: {
|
|
44
43
|
};
|
45
44
|
};
|
46
45
|
export default _default;
|
47
|
-
export declare const APIWithYamlProvidedDirectly:
|
48
|
-
export declare const APIWithJSONProvidedDirectly:
|
49
|
-
export declare const APIWithoutDescription:
|
50
|
-
export declare const APIWithInternalOperations:
|
51
|
-
export declare const OpenApi3Schema:
|
52
|
-
export declare const BadgesForSchema:
|
53
|
-
export declare const StackedLayout:
|
54
|
-
export declare const Box:
|
55
|
-
export declare const DigitalOcean:
|
56
|
-
export declare const Github:
|
57
|
-
export declare const Instagram:
|
46
|
+
export declare const APIWithYamlProvidedDirectly: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, APIProps>;
|
47
|
+
export declare const APIWithJSONProvidedDirectly: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, APIProps>;
|
48
|
+
export declare const APIWithoutDescription: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, APIProps>;
|
49
|
+
export declare const APIWithInternalOperations: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, APIProps>;
|
50
|
+
export declare const OpenApi3Schema: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, APIProps>;
|
51
|
+
export declare const BadgesForSchema: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, APIProps>;
|
52
|
+
export declare const StackedLayout: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, APIProps>;
|
53
|
+
export declare const Box: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, APIProps>;
|
54
|
+
export declare const DigitalOcean: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, APIProps>;
|
55
|
+
export declare const Github: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, APIProps>;
|
56
|
+
export declare const Instagram: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, APIProps>;
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare const useGetOasNavTree: (apiDescriptionDocument: string | object) => any[];
|
@@ -0,0 +1 @@
|
|
1
|
+
import '@testing-library/jest-dom';
|
package/index.d.ts
CHANGED
@@ -1,2 +1,5 @@
|
|
1
1
|
export type { APIProps } from './containers/API';
|
2
2
|
export { API } from './containers/API';
|
3
|
+
export { useGetOasNavTree } from './hooks/oas-nav-tree/useGetOasNavTree';
|
4
|
+
export { useExportDocumentProps } from './hooks/useExportDocumentProps';
|
5
|
+
export { transformOasToServiceNode } from './utils/oas';
|
package/index.esm.js
CHANGED
@@ -157,13 +157,20 @@ const isInternal = (node) => {
|
|
157
157
|
return !!data['x-internal'];
|
158
158
|
};
|
159
159
|
|
160
|
-
const APIWithSidebarLayout = ({ serviceNode, logo, hideTryIt, hideSchemas, hideInternal, hideExport, exportProps, tryItCredentialsPolicy, tryItCorsProxy, tryItOutDefaultServer, }) => {
|
160
|
+
const APIWithSidebarLayout = ({ serviceNode, logo, hideTryIt, hideSchemas, hideInternal, hideExport, exportProps, tryItCredentialsPolicy, tryItCorsProxy, tryItOutDefaultServer, useCustomNav, }) => {
|
161
161
|
const container = React.useRef(null);
|
162
|
-
const tree = React.useMemo(() =>
|
162
|
+
const tree = React.useMemo(() => {
|
163
|
+
if (!useCustomNav)
|
164
|
+
return computeAPITree(serviceNode, { hideSchemas, hideInternal });
|
165
|
+
else
|
166
|
+
return [];
|
167
|
+
}, [serviceNode, hideSchemas, hideInternal, useCustomNav]);
|
163
168
|
const location = useLocation();
|
164
169
|
const { pathname } = location;
|
165
170
|
const isRootPath = !pathname || pathname === '/';
|
166
171
|
const node = isRootPath ? serviceNode : serviceNode.children.find(child => child.uri === pathname);
|
172
|
+
React.useEffect(() => {
|
173
|
+
}, [pathname]);
|
167
174
|
const layoutOptions = React.useMemo(() => ({ hideTryIt: hideTryIt, hideExport: hideExport || (node === null || node === void 0 ? void 0 : node.type) !== NodeType.HttpService }), [hideTryIt, hideExport, node]);
|
168
175
|
if (!node) {
|
169
176
|
const firstSlug = findFirstNodeSlug(tree);
|
@@ -186,12 +193,10 @@ const APIWithSidebarLayout = ({ serviceNode, logo, hideTryIt, hideSchemas, hideI
|
|
186
193
|
React.createElement(Flex, { flexGrow: true, flexShrink: true, overflowY: "auto", direction: "col" },
|
187
194
|
React.createElement(TableOfContents, { tree: tree, activeId: pathname, Link: Link, onLinkClick: handleTocClick })),
|
188
195
|
React.createElement(PoweredByLink, { source: serviceNode.name, pathname: pathname, packageType: "elements" })));
|
189
|
-
return (React.createElement(SidebarLayout, { ref: container, sidebar: sidebar }, node && (React.createElement(ParsedDocs, { key: pathname, uri: pathname, node: node, nodeTitle: node.name, layoutOptions: layoutOptions, location: location, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer }))));
|
196
|
+
return (React.createElement(SidebarLayout, { ref: container, sidebar: sidebar, renderSideBar: !useCustomNav }, node && (React.createElement(ParsedDocs, { key: pathname, uri: pathname, node: node, nodeTitle: node.name, layoutOptions: layoutOptions, location: location, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer }))));
|
190
197
|
};
|
191
198
|
|
192
|
-
const
|
193
|
-
return hash.substr(1) === `${item.name}-${item.data.method}`;
|
194
|
-
};
|
199
|
+
const itemUriMatchesPathname = (itemUri, pathname) => itemUri === pathname;
|
195
200
|
const TryItContext = React.createContext({
|
196
201
|
hideTryIt: false,
|
197
202
|
tryItCredentialsPolicy: 'omit',
|
@@ -208,24 +213,18 @@ const APIWithStackedLayout = ({ serviceNode, hideTryIt, hideExport, exportProps,
|
|
208
213
|
};
|
209
214
|
const Group = React.memo(({ group }) => {
|
210
215
|
const [isExpanded, setIsExpanded] = React.useState(false);
|
211
|
-
const {
|
212
|
-
const scrollRef = React.useRef(null);
|
213
|
-
const urlHashMatches = hash.substr(1) === group.title;
|
216
|
+
const { pathname } = useLocation();
|
214
217
|
const onClick = React.useCallback(() => setIsExpanded(!isExpanded), [isExpanded]);
|
215
218
|
const shouldExpand = React.useMemo(() => {
|
216
|
-
return
|
217
|
-
}, [group,
|
219
|
+
return group.items.some(item => itemUriMatchesPathname(item.uri, pathname));
|
220
|
+
}, [group, pathname]);
|
218
221
|
React.useEffect(() => {
|
219
|
-
var _a;
|
220
222
|
if (shouldExpand) {
|
221
223
|
setIsExpanded(true);
|
222
|
-
if (urlHashMatches && ((_a = scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current) === null || _a === void 0 ? void 0 : _a.offsetTop)) {
|
223
|
-
window.scrollTo(0, scrollRef.current.offsetTop);
|
224
|
-
}
|
225
224
|
}
|
226
|
-
}, [shouldExpand
|
225
|
+
}, [shouldExpand]);
|
227
226
|
return (React.createElement(Box, null,
|
228
|
-
React.createElement(Flex, {
|
227
|
+
React.createElement(Flex, { onClick: onClick, mx: "auto", justifyContent: "between", alignItems: "center", borderB: true, px: 2, py: 4, cursor: "pointer", color: { default: 'current', hover: 'muted' } },
|
229
228
|
React.createElement(Box, { fontSize: "lg", fontWeight: "medium" }, group.title),
|
230
229
|
React.createElement(Icon, { className: "sl-mr-2", icon: isExpanded ? 'chevron-down' : 'chevron-right', size: "sm" })),
|
231
230
|
React.createElement(Collapse, { isOpen: isExpanded }, group.items.map(item => {
|
@@ -234,36 +233,42 @@ const Group = React.memo(({ group }) => {
|
|
234
233
|
});
|
235
234
|
const Item = React.memo(({ item }) => {
|
236
235
|
const location = useLocation();
|
237
|
-
const {
|
236
|
+
const { pathname } = location;
|
238
237
|
const [isExpanded, setIsExpanded] = React.useState(false);
|
239
238
|
const scrollRef = React.useRef(null);
|
240
239
|
const color = HttpMethodColors[item.data.method] || 'gray';
|
241
240
|
const isDeprecated = !!item.data.deprecated;
|
242
241
|
const { hideTryIt, tryItCredentialsPolicy, corsProxy, tryItOutDefaultServer } = React.useContext(TryItContext);
|
243
|
-
const onClick = React.useCallback(() =>
|
242
|
+
const onClick = React.useCallback(() => {
|
243
|
+
setIsExpanded(!isExpanded);
|
244
|
+
if (window && window.location) {
|
245
|
+
window.history.pushState(null, '', `#${item.uri}`);
|
246
|
+
}
|
247
|
+
}, [isExpanded, item]);
|
244
248
|
React.useEffect(() => {
|
245
|
-
|
246
|
-
if (itemMatchesHash(hash, item)) {
|
249
|
+
if (itemUriMatchesPathname(item.uri, pathname)) {
|
247
250
|
setIsExpanded(true);
|
248
|
-
if (
|
249
|
-
|
251
|
+
if (scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current) {
|
252
|
+
scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current.scrollIntoView();
|
250
253
|
}
|
251
254
|
}
|
252
|
-
}, [
|
255
|
+
}, [pathname, item]);
|
253
256
|
return (React.createElement(Box, { ref: scrollRef, w: "full", my: 2, border: true, borderColor: { default: isExpanded ? 'light' : 'transparent', hover: 'light' }, bg: { default: isExpanded ? 'code' : 'transparent', hover: 'code' } },
|
254
257
|
React.createElement(Flex, { mx: "auto", alignItems: "center", cursor: "pointer", fontSize: "lg", p: 2, onClick: onClick, color: "current" },
|
255
258
|
React.createElement(Box, { w: 24, textTransform: "uppercase", textAlign: "center", fontWeight: "semibold", border: true, rounded: true, px: 2, bg: "canvas", className: cn(`sl-mr-5 sl-text-base`, `sl-text-${color}`, `sl-border-${color}`) }, item.data.method || 'UNKNOWN'),
|
256
|
-
React.createElement(Box, { flex: 1, fontWeight: "medium", wordBreak: "all" }, item.
|
259
|
+
React.createElement(Box, { flex: 1, fontWeight: "medium", wordBreak: "all" }, item.data.path),
|
257
260
|
isDeprecated && React.createElement(DeprecatedBadge, null)),
|
258
|
-
React.createElement(Collapse, { isOpen: isExpanded },
|
259
|
-
React.createElement(
|
260
|
-
|
261
|
-
React.createElement(
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
261
|
+
React.createElement(Collapse, { isOpen: isExpanded },
|
262
|
+
React.createElement(Box, { flex: 1, p: 2, fontWeight: "medium", mx: "auto", fontSize: "xl" }, item.name),
|
263
|
+
hideTryIt ? (React.createElement(Box, { as: ParsedDocs, layoutOptions: { noHeading: true, hideTryItPanel: true }, node: item, p: 4 })) : (React.createElement(Tabs, { appearance: "line" },
|
264
|
+
React.createElement(TabList, null,
|
265
|
+
React.createElement(Tab, null, "Docs"),
|
266
|
+
React.createElement(Tab, null, "TryIt")),
|
267
|
+
React.createElement(TabPanels, null,
|
268
|
+
React.createElement(TabPanel, null,
|
269
|
+
React.createElement(ParsedDocs, { className: "sl-px-4", node: item, location: location, layoutOptions: { noHeading: true, hideTryItPanel: true } })),
|
270
|
+
React.createElement(TabPanel, null,
|
271
|
+
React.createElement(TryItWithRequestSamples, { httpOperation: item.data, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItOutDefaultServer: tryItOutDefaultServer, corsProxy: corsProxy }))))))));
|
267
272
|
});
|
268
273
|
const Collapse = ({ isOpen, children }) => {
|
269
274
|
if (!isOpen)
|
@@ -483,7 +488,7 @@ const propsAreWithDocument = (props) => {
|
|
483
488
|
return props.hasOwnProperty('apiDescriptionDocument');
|
484
489
|
};
|
485
490
|
const APIImpl = props => {
|
486
|
-
const { layout, apiDescriptionUrl = '', logo, hideTryIt, hideSchemas, hideInternal, hideExport, tryItCredentialsPolicy, tryItCorsProxy, tryItOutDefaultServer, } = props;
|
491
|
+
const { layout, apiDescriptionUrl = '', logo, hideTryIt, hideSchemas, hideInternal, hideExport, tryItCredentialsPolicy, tryItCorsProxy, tryItOutDefaultServer, useCustomNav, } = props;
|
487
492
|
const apiDescriptionDocument = propsAreWithDocument(props) ? props.apiDescriptionDocument : undefined;
|
488
493
|
const { data: fetchedDocument, error } = useQuery([apiDescriptionUrl], () => fetch(apiDescriptionUrl).then(res => {
|
489
494
|
if (res.ok) {
|
@@ -510,8 +515,37 @@ const APIImpl = props => {
|
|
510
515
|
return (React.createElement(Flex, { justify: "center", alignItems: "center", w: "full", minH: "screen" },
|
511
516
|
React.createElement(NonIdealState, { title: "Failed to parse OpenAPI file", description: "Please make sure your OpenAPI file is valid and try again" })));
|
512
517
|
}
|
513
|
-
return (React.createElement(InlineRefResolverProvider, { document: parsedDocument }, layout === 'stacked' ? (React.createElement(APIWithStackedLayout, { serviceNode: serviceNode, hideTryIt: hideTryIt, hideExport: hideExport, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer })) : (React.createElement(APIWithSidebarLayout, { logo: logo, serviceNode: serviceNode, hideTryIt: hideTryIt, hideSchemas: hideSchemas, hideInternal: hideInternal, hideExport: hideExport, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer }))));
|
518
|
+
return (React.createElement(InlineRefResolverProvider, { document: parsedDocument }, layout === 'stacked' ? (React.createElement(APIWithStackedLayout, { serviceNode: serviceNode, hideTryIt: hideTryIt, hideExport: hideExport, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer })) : (React.createElement(APIWithSidebarLayout, { logo: logo, serviceNode: serviceNode, hideTryIt: hideTryIt, hideSchemas: hideSchemas, hideInternal: hideInternal, hideExport: hideExport, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer, useCustomNav: useCustomNav }))));
|
514
519
|
};
|
515
520
|
const API = flow(withRouter, withStyles, withPersistenceBoundary, withMosaicProvider, withQueryClientProvider)(APIImpl);
|
516
521
|
|
517
|
-
|
522
|
+
const useGetOasNavTree = (apiDescriptionDocument) => {
|
523
|
+
const parsedDocument = useParsedValue(apiDescriptionDocument);
|
524
|
+
const bundledDocument = useBundleRefsIntoDocument(parsedDocument);
|
525
|
+
if (!bundledDocument)
|
526
|
+
return [];
|
527
|
+
const groupSchemas = (tree) => {
|
528
|
+
const targetTitle = 'Schemas';
|
529
|
+
const newTree = tree.reduce((accumulator, currentObject) => {
|
530
|
+
var _a;
|
531
|
+
if (currentObject.title === targetTitle) {
|
532
|
+
accumulator.matchedObject = currentObject;
|
533
|
+
}
|
534
|
+
else if ((_a = currentObject.id) === null || _a === void 0 ? void 0 : _a.includes(targetTitle.toLowerCase())) {
|
535
|
+
accumulator.matchedObject.items = accumulator.matchedObject.items || [];
|
536
|
+
accumulator.matchedObject.items.push(currentObject);
|
537
|
+
}
|
538
|
+
else {
|
539
|
+
accumulator.others = accumulator.others || [];
|
540
|
+
accumulator.others.push(currentObject);
|
541
|
+
}
|
542
|
+
return accumulator;
|
543
|
+
}, {});
|
544
|
+
const navTree = [...newTree.others, newTree.matchedObject];
|
545
|
+
return navTree;
|
546
|
+
};
|
547
|
+
const apiTree = computeAPITree(transformOasToServiceNode(bundledDocument));
|
548
|
+
return groupSchemas(apiTree);
|
549
|
+
};
|
550
|
+
|
551
|
+
export { API, transformOasToServiceNode, useExportDocumentProps, useGetOasNavTree };
|
package/index.js
CHANGED
@@ -190,13 +190,20 @@ const isInternal = (node) => {
|
|
190
190
|
return !!data['x-internal'];
|
191
191
|
};
|
192
192
|
|
193
|
-
const APIWithSidebarLayout = ({ serviceNode, logo, hideTryIt, hideSchemas, hideInternal, hideExport, exportProps, tryItCredentialsPolicy, tryItCorsProxy, tryItOutDefaultServer, }) => {
|
193
|
+
const APIWithSidebarLayout = ({ serviceNode, logo, hideTryIt, hideSchemas, hideInternal, hideExport, exportProps, tryItCredentialsPolicy, tryItCorsProxy, tryItOutDefaultServer, useCustomNav, }) => {
|
194
194
|
const container = React__namespace.useRef(null);
|
195
|
-
const tree = React__namespace.useMemo(() =>
|
195
|
+
const tree = React__namespace.useMemo(() => {
|
196
|
+
if (!useCustomNav)
|
197
|
+
return computeAPITree(serviceNode, { hideSchemas, hideInternal });
|
198
|
+
else
|
199
|
+
return [];
|
200
|
+
}, [serviceNode, hideSchemas, hideInternal, useCustomNav]);
|
196
201
|
const location = reactRouterDom.useLocation();
|
197
202
|
const { pathname } = location;
|
198
203
|
const isRootPath = !pathname || pathname === '/';
|
199
204
|
const node = isRootPath ? serviceNode : serviceNode.children.find(child => child.uri === pathname);
|
205
|
+
React__namespace.useEffect(() => {
|
206
|
+
}, [pathname]);
|
200
207
|
const layoutOptions = React__namespace.useMemo(() => ({ hideTryIt: hideTryIt, hideExport: hideExport || (node === null || node === void 0 ? void 0 : node.type) !== types.NodeType.HttpService }), [hideTryIt, hideExport, node]);
|
201
208
|
if (!node) {
|
202
209
|
const firstSlug = findFirstNodeSlug(tree);
|
@@ -219,12 +226,10 @@ const APIWithSidebarLayout = ({ serviceNode, logo, hideTryIt, hideSchemas, hideI
|
|
219
226
|
React__namespace.createElement(mosaic.Flex, { flexGrow: true, flexShrink: true, overflowY: "auto", direction: "col" },
|
220
227
|
React__namespace.createElement(elementalCore.TableOfContents, { tree: tree, activeId: pathname, Link: reactRouterDom.Link, onLinkClick: handleTocClick })),
|
221
228
|
React__namespace.createElement(elementalCore.PoweredByLink, { source: serviceNode.name, pathname: pathname, packageType: "elements" })));
|
222
|
-
return (React__namespace.createElement(elementalCore.SidebarLayout, { ref: container, sidebar: sidebar }, node && (React__namespace.createElement(elementalCore.ParsedDocs, { key: pathname, uri: pathname, node: node, nodeTitle: node.name, layoutOptions: layoutOptions, location: location, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer }))));
|
229
|
+
return (React__namespace.createElement(elementalCore.SidebarLayout, { ref: container, sidebar: sidebar, renderSideBar: !useCustomNav }, node && (React__namespace.createElement(elementalCore.ParsedDocs, { key: pathname, uri: pathname, node: node, nodeTitle: node.name, layoutOptions: layoutOptions, location: location, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer }))));
|
223
230
|
};
|
224
231
|
|
225
|
-
const
|
226
|
-
return hash.substr(1) === `${item.name}-${item.data.method}`;
|
227
|
-
};
|
232
|
+
const itemUriMatchesPathname = (itemUri, pathname) => itemUri === pathname;
|
228
233
|
const TryItContext = React__namespace.createContext({
|
229
234
|
hideTryIt: false,
|
230
235
|
tryItCredentialsPolicy: 'omit',
|
@@ -241,24 +246,18 @@ const APIWithStackedLayout = ({ serviceNode, hideTryIt, hideExport, exportProps,
|
|
241
246
|
};
|
242
247
|
const Group = React__namespace.memo(({ group }) => {
|
243
248
|
const [isExpanded, setIsExpanded] = React__namespace.useState(false);
|
244
|
-
const {
|
245
|
-
const scrollRef = React__namespace.useRef(null);
|
246
|
-
const urlHashMatches = hash.substr(1) === group.title;
|
249
|
+
const { pathname } = reactRouterDom.useLocation();
|
247
250
|
const onClick = React__namespace.useCallback(() => setIsExpanded(!isExpanded), [isExpanded]);
|
248
251
|
const shouldExpand = React__namespace.useMemo(() => {
|
249
|
-
return
|
250
|
-
}, [group,
|
252
|
+
return group.items.some(item => itemUriMatchesPathname(item.uri, pathname));
|
253
|
+
}, [group, pathname]);
|
251
254
|
React__namespace.useEffect(() => {
|
252
|
-
var _a;
|
253
255
|
if (shouldExpand) {
|
254
256
|
setIsExpanded(true);
|
255
|
-
if (urlHashMatches && ((_a = scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current) === null || _a === void 0 ? void 0 : _a.offsetTop)) {
|
256
|
-
window.scrollTo(0, scrollRef.current.offsetTop);
|
257
|
-
}
|
258
257
|
}
|
259
|
-
}, [shouldExpand
|
258
|
+
}, [shouldExpand]);
|
260
259
|
return (React__namespace.createElement(mosaic.Box, null,
|
261
|
-
React__namespace.createElement(mosaic.Flex, {
|
260
|
+
React__namespace.createElement(mosaic.Flex, { onClick: onClick, mx: "auto", justifyContent: "between", alignItems: "center", borderB: true, px: 2, py: 4, cursor: "pointer", color: { default: 'current', hover: 'muted' } },
|
262
261
|
React__namespace.createElement(mosaic.Box, { fontSize: "lg", fontWeight: "medium" }, group.title),
|
263
262
|
React__namespace.createElement(mosaic.Icon, { className: "sl-mr-2", icon: isExpanded ? 'chevron-down' : 'chevron-right', size: "sm" })),
|
264
263
|
React__namespace.createElement(Collapse, { isOpen: isExpanded }, group.items.map(item => {
|
@@ -267,36 +266,42 @@ const Group = React__namespace.memo(({ group }) => {
|
|
267
266
|
});
|
268
267
|
const Item = React__namespace.memo(({ item }) => {
|
269
268
|
const location = reactRouterDom.useLocation();
|
270
|
-
const {
|
269
|
+
const { pathname } = location;
|
271
270
|
const [isExpanded, setIsExpanded] = React__namespace.useState(false);
|
272
271
|
const scrollRef = React__namespace.useRef(null);
|
273
272
|
const color = elementalCore.HttpMethodColors[item.data.method] || 'gray';
|
274
273
|
const isDeprecated = !!item.data.deprecated;
|
275
274
|
const { hideTryIt, tryItCredentialsPolicy, corsProxy, tryItOutDefaultServer } = React__namespace.useContext(TryItContext);
|
276
|
-
const onClick = React__namespace.useCallback(() =>
|
275
|
+
const onClick = React__namespace.useCallback(() => {
|
276
|
+
setIsExpanded(!isExpanded);
|
277
|
+
if (window && window.location) {
|
278
|
+
window.history.pushState(null, '', `#${item.uri}`);
|
279
|
+
}
|
280
|
+
}, [isExpanded, item]);
|
277
281
|
React__namespace.useEffect(() => {
|
278
|
-
|
279
|
-
if (itemMatchesHash(hash, item)) {
|
282
|
+
if (itemUriMatchesPathname(item.uri, pathname)) {
|
280
283
|
setIsExpanded(true);
|
281
|
-
if (
|
282
|
-
|
284
|
+
if (scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current) {
|
285
|
+
scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current.scrollIntoView();
|
283
286
|
}
|
284
287
|
}
|
285
|
-
}, [
|
288
|
+
}, [pathname, item]);
|
286
289
|
return (React__namespace.createElement(mosaic.Box, { ref: scrollRef, w: "full", my: 2, border: true, borderColor: { default: isExpanded ? 'light' : 'transparent', hover: 'light' }, bg: { default: isExpanded ? 'code' : 'transparent', hover: 'code' } },
|
287
290
|
React__namespace.createElement(mosaic.Flex, { mx: "auto", alignItems: "center", cursor: "pointer", fontSize: "lg", p: 2, onClick: onClick, color: "current" },
|
288
291
|
React__namespace.createElement(mosaic.Box, { w: 24, textTransform: "uppercase", textAlign: "center", fontWeight: "semibold", border: true, rounded: true, px: 2, bg: "canvas", className: cn__default["default"](`sl-mr-5 sl-text-base`, `sl-text-${color}`, `sl-border-${color}`) }, item.data.method || 'UNKNOWN'),
|
289
|
-
React__namespace.createElement(mosaic.Box, { flex: 1, fontWeight: "medium", wordBreak: "all" }, item.
|
292
|
+
React__namespace.createElement(mosaic.Box, { flex: 1, fontWeight: "medium", wordBreak: "all" }, item.data.path),
|
290
293
|
isDeprecated && React__namespace.createElement(elementalCore.DeprecatedBadge, null)),
|
291
|
-
React__namespace.createElement(Collapse, { isOpen: isExpanded },
|
292
|
-
React__namespace.createElement(mosaic.
|
293
|
-
|
294
|
-
React__namespace.createElement(mosaic.
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
294
|
+
React__namespace.createElement(Collapse, { isOpen: isExpanded },
|
295
|
+
React__namespace.createElement(mosaic.Box, { flex: 1, p: 2, fontWeight: "medium", mx: "auto", fontSize: "xl" }, item.name),
|
296
|
+
hideTryIt ? (React__namespace.createElement(mosaic.Box, { as: elementalCore.ParsedDocs, layoutOptions: { noHeading: true, hideTryItPanel: true }, node: item, p: 4 })) : (React__namespace.createElement(mosaic.Tabs, { appearance: "line" },
|
297
|
+
React__namespace.createElement(mosaic.TabList, null,
|
298
|
+
React__namespace.createElement(mosaic.Tab, null, "Docs"),
|
299
|
+
React__namespace.createElement(mosaic.Tab, null, "TryIt")),
|
300
|
+
React__namespace.createElement(mosaic.TabPanels, null,
|
301
|
+
React__namespace.createElement(mosaic.TabPanel, null,
|
302
|
+
React__namespace.createElement(elementalCore.ParsedDocs, { className: "sl-px-4", node: item, location: location, layoutOptions: { noHeading: true, hideTryItPanel: true } })),
|
303
|
+
React__namespace.createElement(mosaic.TabPanel, null,
|
304
|
+
React__namespace.createElement(elementalCore.TryItWithRequestSamples, { httpOperation: item.data, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItOutDefaultServer: tryItOutDefaultServer, corsProxy: corsProxy }))))))));
|
300
305
|
});
|
301
306
|
const Collapse = ({ isOpen, children }) => {
|
302
307
|
if (!isOpen)
|
@@ -516,7 +521,7 @@ const propsAreWithDocument = (props) => {
|
|
516
521
|
return props.hasOwnProperty('apiDescriptionDocument');
|
517
522
|
};
|
518
523
|
const APIImpl = props => {
|
519
|
-
const { layout, apiDescriptionUrl = '', logo, hideTryIt, hideSchemas, hideInternal, hideExport, tryItCredentialsPolicy, tryItCorsProxy, tryItOutDefaultServer, } = props;
|
524
|
+
const { layout, apiDescriptionUrl = '', logo, hideTryIt, hideSchemas, hideInternal, hideExport, tryItCredentialsPolicy, tryItCorsProxy, tryItOutDefaultServer, useCustomNav, } = props;
|
520
525
|
const apiDescriptionDocument = propsAreWithDocument(props) ? props.apiDescriptionDocument : undefined;
|
521
526
|
const { data: fetchedDocument, error } = reactQuery.useQuery([apiDescriptionUrl], () => fetch(apiDescriptionUrl).then(res => {
|
522
527
|
if (res.ok) {
|
@@ -543,8 +548,40 @@ const APIImpl = props => {
|
|
543
548
|
return (React__namespace.createElement(mosaic.Flex, { justify: "center", alignItems: "center", w: "full", minH: "screen" },
|
544
549
|
React__namespace.createElement(elementalCore.NonIdealState, { title: "Failed to parse OpenAPI file", description: "Please make sure your OpenAPI file is valid and try again" })));
|
545
550
|
}
|
546
|
-
return (React__namespace.createElement(elementalCore.InlineRefResolverProvider, { document: parsedDocument }, layout === 'stacked' ? (React__namespace.createElement(APIWithStackedLayout, { serviceNode: serviceNode, hideTryIt: hideTryIt, hideExport: hideExport, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer })) : (React__namespace.createElement(APIWithSidebarLayout, { logo: logo, serviceNode: serviceNode, hideTryIt: hideTryIt, hideSchemas: hideSchemas, hideInternal: hideInternal, hideExport: hideExport, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer }))));
|
551
|
+
return (React__namespace.createElement(elementalCore.InlineRefResolverProvider, { document: parsedDocument }, layout === 'stacked' ? (React__namespace.createElement(APIWithStackedLayout, { serviceNode: serviceNode, hideTryIt: hideTryIt, hideExport: hideExport, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer })) : (React__namespace.createElement(APIWithSidebarLayout, { logo: logo, serviceNode: serviceNode, hideTryIt: hideTryIt, hideSchemas: hideSchemas, hideInternal: hideInternal, hideExport: hideExport, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer, useCustomNav: useCustomNav }))));
|
547
552
|
};
|
548
553
|
const API = flow__default["default"](elementalCore.withRouter, elementalCore.withStyles, elementalCore.withPersistenceBoundary, elementalCore.withMosaicProvider, elementalCore.withQueryClientProvider)(APIImpl);
|
549
554
|
|
555
|
+
const useGetOasNavTree = (apiDescriptionDocument) => {
|
556
|
+
const parsedDocument = elementalCore.useParsedValue(apiDescriptionDocument);
|
557
|
+
const bundledDocument = elementalCore.useBundleRefsIntoDocument(parsedDocument);
|
558
|
+
if (!bundledDocument)
|
559
|
+
return [];
|
560
|
+
const groupSchemas = (tree) => {
|
561
|
+
const targetTitle = 'Schemas';
|
562
|
+
const newTree = tree.reduce((accumulator, currentObject) => {
|
563
|
+
var _a;
|
564
|
+
if (currentObject.title === targetTitle) {
|
565
|
+
accumulator.matchedObject = currentObject;
|
566
|
+
}
|
567
|
+
else if ((_a = currentObject.id) === null || _a === void 0 ? void 0 : _a.includes(targetTitle.toLowerCase())) {
|
568
|
+
accumulator.matchedObject.items = accumulator.matchedObject.items || [];
|
569
|
+
accumulator.matchedObject.items.push(currentObject);
|
570
|
+
}
|
571
|
+
else {
|
572
|
+
accumulator.others = accumulator.others || [];
|
573
|
+
accumulator.others.push(currentObject);
|
574
|
+
}
|
575
|
+
return accumulator;
|
576
|
+
}, {});
|
577
|
+
const navTree = [...newTree.others, newTree.matchedObject];
|
578
|
+
return navTree;
|
579
|
+
};
|
580
|
+
const apiTree = computeAPITree(transformOasToServiceNode(bundledDocument));
|
581
|
+
return groupSchemas(apiTree);
|
582
|
+
};
|
583
|
+
|
550
584
|
exports.API = API;
|
585
|
+
exports.transformOasToServiceNode = transformOasToServiceNode;
|
586
|
+
exports.useExportDocumentProps = useExportDocumentProps;
|
587
|
+
exports.useGetOasNavTree = useGetOasNavTree;
|
package/index.mjs
CHANGED
@@ -157,13 +157,20 @@ const isInternal = (node) => {
|
|
157
157
|
return !!data['x-internal'];
|
158
158
|
};
|
159
159
|
|
160
|
-
const APIWithSidebarLayout = ({ serviceNode, logo, hideTryIt, hideSchemas, hideInternal, hideExport, exportProps, tryItCredentialsPolicy, tryItCorsProxy, tryItOutDefaultServer, }) => {
|
160
|
+
const APIWithSidebarLayout = ({ serviceNode, logo, hideTryIt, hideSchemas, hideInternal, hideExport, exportProps, tryItCredentialsPolicy, tryItCorsProxy, tryItOutDefaultServer, useCustomNav, }) => {
|
161
161
|
const container = React.useRef(null);
|
162
|
-
const tree = React.useMemo(() =>
|
162
|
+
const tree = React.useMemo(() => {
|
163
|
+
if (!useCustomNav)
|
164
|
+
return computeAPITree(serviceNode, { hideSchemas, hideInternal });
|
165
|
+
else
|
166
|
+
return [];
|
167
|
+
}, [serviceNode, hideSchemas, hideInternal, useCustomNav]);
|
163
168
|
const location = useLocation();
|
164
169
|
const { pathname } = location;
|
165
170
|
const isRootPath = !pathname || pathname === '/';
|
166
171
|
const node = isRootPath ? serviceNode : serviceNode.children.find(child => child.uri === pathname);
|
172
|
+
React.useEffect(() => {
|
173
|
+
}, [pathname]);
|
167
174
|
const layoutOptions = React.useMemo(() => ({ hideTryIt: hideTryIt, hideExport: hideExport || (node === null || node === void 0 ? void 0 : node.type) !== NodeType.HttpService }), [hideTryIt, hideExport, node]);
|
168
175
|
if (!node) {
|
169
176
|
const firstSlug = findFirstNodeSlug(tree);
|
@@ -186,12 +193,10 @@ const APIWithSidebarLayout = ({ serviceNode, logo, hideTryIt, hideSchemas, hideI
|
|
186
193
|
React.createElement(Flex, { flexGrow: true, flexShrink: true, overflowY: "auto", direction: "col" },
|
187
194
|
React.createElement(TableOfContents, { tree: tree, activeId: pathname, Link: Link, onLinkClick: handleTocClick })),
|
188
195
|
React.createElement(PoweredByLink, { source: serviceNode.name, pathname: pathname, packageType: "elements" })));
|
189
|
-
return (React.createElement(SidebarLayout, { ref: container, sidebar: sidebar }, node && (React.createElement(ParsedDocs, { key: pathname, uri: pathname, node: node, nodeTitle: node.name, layoutOptions: layoutOptions, location: location, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer }))));
|
196
|
+
return (React.createElement(SidebarLayout, { ref: container, sidebar: sidebar, renderSideBar: !useCustomNav }, node && (React.createElement(ParsedDocs, { key: pathname, uri: pathname, node: node, nodeTitle: node.name, layoutOptions: layoutOptions, location: location, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer }))));
|
190
197
|
};
|
191
198
|
|
192
|
-
const
|
193
|
-
return hash.substr(1) === `${item.name}-${item.data.method}`;
|
194
|
-
};
|
199
|
+
const itemUriMatchesPathname = (itemUri, pathname) => itemUri === pathname;
|
195
200
|
const TryItContext = React.createContext({
|
196
201
|
hideTryIt: false,
|
197
202
|
tryItCredentialsPolicy: 'omit',
|
@@ -208,24 +213,18 @@ const APIWithStackedLayout = ({ serviceNode, hideTryIt, hideExport, exportProps,
|
|
208
213
|
};
|
209
214
|
const Group = React.memo(({ group }) => {
|
210
215
|
const [isExpanded, setIsExpanded] = React.useState(false);
|
211
|
-
const {
|
212
|
-
const scrollRef = React.useRef(null);
|
213
|
-
const urlHashMatches = hash.substr(1) === group.title;
|
216
|
+
const { pathname } = useLocation();
|
214
217
|
const onClick = React.useCallback(() => setIsExpanded(!isExpanded), [isExpanded]);
|
215
218
|
const shouldExpand = React.useMemo(() => {
|
216
|
-
return
|
217
|
-
}, [group,
|
219
|
+
return group.items.some(item => itemUriMatchesPathname(item.uri, pathname));
|
220
|
+
}, [group, pathname]);
|
218
221
|
React.useEffect(() => {
|
219
|
-
var _a;
|
220
222
|
if (shouldExpand) {
|
221
223
|
setIsExpanded(true);
|
222
|
-
if (urlHashMatches && ((_a = scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current) === null || _a === void 0 ? void 0 : _a.offsetTop)) {
|
223
|
-
window.scrollTo(0, scrollRef.current.offsetTop);
|
224
|
-
}
|
225
224
|
}
|
226
|
-
}, [shouldExpand
|
225
|
+
}, [shouldExpand]);
|
227
226
|
return (React.createElement(Box, null,
|
228
|
-
React.createElement(Flex, {
|
227
|
+
React.createElement(Flex, { onClick: onClick, mx: "auto", justifyContent: "between", alignItems: "center", borderB: true, px: 2, py: 4, cursor: "pointer", color: { default: 'current', hover: 'muted' } },
|
229
228
|
React.createElement(Box, { fontSize: "lg", fontWeight: "medium" }, group.title),
|
230
229
|
React.createElement(Icon, { className: "sl-mr-2", icon: isExpanded ? 'chevron-down' : 'chevron-right', size: "sm" })),
|
231
230
|
React.createElement(Collapse, { isOpen: isExpanded }, group.items.map(item => {
|
@@ -234,36 +233,42 @@ const Group = React.memo(({ group }) => {
|
|
234
233
|
});
|
235
234
|
const Item = React.memo(({ item }) => {
|
236
235
|
const location = useLocation();
|
237
|
-
const {
|
236
|
+
const { pathname } = location;
|
238
237
|
const [isExpanded, setIsExpanded] = React.useState(false);
|
239
238
|
const scrollRef = React.useRef(null);
|
240
239
|
const color = HttpMethodColors[item.data.method] || 'gray';
|
241
240
|
const isDeprecated = !!item.data.deprecated;
|
242
241
|
const { hideTryIt, tryItCredentialsPolicy, corsProxy, tryItOutDefaultServer } = React.useContext(TryItContext);
|
243
|
-
const onClick = React.useCallback(() =>
|
242
|
+
const onClick = React.useCallback(() => {
|
243
|
+
setIsExpanded(!isExpanded);
|
244
|
+
if (window && window.location) {
|
245
|
+
window.history.pushState(null, '', `#${item.uri}`);
|
246
|
+
}
|
247
|
+
}, [isExpanded, item]);
|
244
248
|
React.useEffect(() => {
|
245
|
-
|
246
|
-
if (itemMatchesHash(hash, item)) {
|
249
|
+
if (itemUriMatchesPathname(item.uri, pathname)) {
|
247
250
|
setIsExpanded(true);
|
248
|
-
if (
|
249
|
-
|
251
|
+
if (scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current) {
|
252
|
+
scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current.scrollIntoView();
|
250
253
|
}
|
251
254
|
}
|
252
|
-
}, [
|
255
|
+
}, [pathname, item]);
|
253
256
|
return (React.createElement(Box, { ref: scrollRef, w: "full", my: 2, border: true, borderColor: { default: isExpanded ? 'light' : 'transparent', hover: 'light' }, bg: { default: isExpanded ? 'code' : 'transparent', hover: 'code' } },
|
254
257
|
React.createElement(Flex, { mx: "auto", alignItems: "center", cursor: "pointer", fontSize: "lg", p: 2, onClick: onClick, color: "current" },
|
255
258
|
React.createElement(Box, { w: 24, textTransform: "uppercase", textAlign: "center", fontWeight: "semibold", border: true, rounded: true, px: 2, bg: "canvas", className: cn(`sl-mr-5 sl-text-base`, `sl-text-${color}`, `sl-border-${color}`) }, item.data.method || 'UNKNOWN'),
|
256
|
-
React.createElement(Box, { flex: 1, fontWeight: "medium", wordBreak: "all" }, item.
|
259
|
+
React.createElement(Box, { flex: 1, fontWeight: "medium", wordBreak: "all" }, item.data.path),
|
257
260
|
isDeprecated && React.createElement(DeprecatedBadge, null)),
|
258
|
-
React.createElement(Collapse, { isOpen: isExpanded },
|
259
|
-
React.createElement(
|
260
|
-
|
261
|
-
React.createElement(
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
261
|
+
React.createElement(Collapse, { isOpen: isExpanded },
|
262
|
+
React.createElement(Box, { flex: 1, p: 2, fontWeight: "medium", mx: "auto", fontSize: "xl" }, item.name),
|
263
|
+
hideTryIt ? (React.createElement(Box, { as: ParsedDocs, layoutOptions: { noHeading: true, hideTryItPanel: true }, node: item, p: 4 })) : (React.createElement(Tabs, { appearance: "line" },
|
264
|
+
React.createElement(TabList, null,
|
265
|
+
React.createElement(Tab, null, "Docs"),
|
266
|
+
React.createElement(Tab, null, "TryIt")),
|
267
|
+
React.createElement(TabPanels, null,
|
268
|
+
React.createElement(TabPanel, null,
|
269
|
+
React.createElement(ParsedDocs, { className: "sl-px-4", node: item, location: location, layoutOptions: { noHeading: true, hideTryItPanel: true } })),
|
270
|
+
React.createElement(TabPanel, null,
|
271
|
+
React.createElement(TryItWithRequestSamples, { httpOperation: item.data, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItOutDefaultServer: tryItOutDefaultServer, corsProxy: corsProxy }))))))));
|
267
272
|
});
|
268
273
|
const Collapse = ({ isOpen, children }) => {
|
269
274
|
if (!isOpen)
|
@@ -483,7 +488,7 @@ const propsAreWithDocument = (props) => {
|
|
483
488
|
return props.hasOwnProperty('apiDescriptionDocument');
|
484
489
|
};
|
485
490
|
const APIImpl = props => {
|
486
|
-
const { layout, apiDescriptionUrl = '', logo, hideTryIt, hideSchemas, hideInternal, hideExport, tryItCredentialsPolicy, tryItCorsProxy, tryItOutDefaultServer, } = props;
|
491
|
+
const { layout, apiDescriptionUrl = '', logo, hideTryIt, hideSchemas, hideInternal, hideExport, tryItCredentialsPolicy, tryItCorsProxy, tryItOutDefaultServer, useCustomNav, } = props;
|
487
492
|
const apiDescriptionDocument = propsAreWithDocument(props) ? props.apiDescriptionDocument : undefined;
|
488
493
|
const { data: fetchedDocument, error } = useQuery([apiDescriptionUrl], () => fetch(apiDescriptionUrl).then(res => {
|
489
494
|
if (res.ok) {
|
@@ -510,8 +515,37 @@ const APIImpl = props => {
|
|
510
515
|
return (React.createElement(Flex, { justify: "center", alignItems: "center", w: "full", minH: "screen" },
|
511
516
|
React.createElement(NonIdealState, { title: "Failed to parse OpenAPI file", description: "Please make sure your OpenAPI file is valid and try again" })));
|
512
517
|
}
|
513
|
-
return (React.createElement(InlineRefResolverProvider, { document: parsedDocument }, layout === 'stacked' ? (React.createElement(APIWithStackedLayout, { serviceNode: serviceNode, hideTryIt: hideTryIt, hideExport: hideExport, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer })) : (React.createElement(APIWithSidebarLayout, { logo: logo, serviceNode: serviceNode, hideTryIt: hideTryIt, hideSchemas: hideSchemas, hideInternal: hideInternal, hideExport: hideExport, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer }))));
|
518
|
+
return (React.createElement(InlineRefResolverProvider, { document: parsedDocument }, layout === 'stacked' ? (React.createElement(APIWithStackedLayout, { serviceNode: serviceNode, hideTryIt: hideTryIt, hideExport: hideExport, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer })) : (React.createElement(APIWithSidebarLayout, { logo: logo, serviceNode: serviceNode, hideTryIt: hideTryIt, hideSchemas: hideSchemas, hideInternal: hideInternal, hideExport: hideExport, exportProps: exportProps, tryItCredentialsPolicy: tryItCredentialsPolicy, tryItCorsProxy: tryItCorsProxy, tryItOutDefaultServer: tryItOutDefaultServer, useCustomNav: useCustomNav }))));
|
514
519
|
};
|
515
520
|
const API = flow(withRouter, withStyles, withPersistenceBoundary, withMosaicProvider, withQueryClientProvider)(APIImpl);
|
516
521
|
|
517
|
-
|
522
|
+
const useGetOasNavTree = (apiDescriptionDocument) => {
|
523
|
+
const parsedDocument = useParsedValue(apiDescriptionDocument);
|
524
|
+
const bundledDocument = useBundleRefsIntoDocument(parsedDocument);
|
525
|
+
if (!bundledDocument)
|
526
|
+
return [];
|
527
|
+
const groupSchemas = (tree) => {
|
528
|
+
const targetTitle = 'Schemas';
|
529
|
+
const newTree = tree.reduce((accumulator, currentObject) => {
|
530
|
+
var _a;
|
531
|
+
if (currentObject.title === targetTitle) {
|
532
|
+
accumulator.matchedObject = currentObject;
|
533
|
+
}
|
534
|
+
else if ((_a = currentObject.id) === null || _a === void 0 ? void 0 : _a.includes(targetTitle.toLowerCase())) {
|
535
|
+
accumulator.matchedObject.items = accumulator.matchedObject.items || [];
|
536
|
+
accumulator.matchedObject.items.push(currentObject);
|
537
|
+
}
|
538
|
+
else {
|
539
|
+
accumulator.others = accumulator.others || [];
|
540
|
+
accumulator.others.push(currentObject);
|
541
|
+
}
|
542
|
+
return accumulator;
|
543
|
+
}, {});
|
544
|
+
const navTree = [...newTree.others, newTree.matchedObject];
|
545
|
+
return navTree;
|
546
|
+
};
|
547
|
+
const apiTree = computeAPITree(transformOasToServiceNode(bundledDocument));
|
548
|
+
return groupSchemas(apiTree);
|
549
|
+
};
|
550
|
+
|
551
|
+
export { API, transformOasToServiceNode, useExportDocumentProps, useGetOasNavTree };
|