@stoplight/elements-core 8.2.0 → 8.3.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.
@@ -1 +1 @@
1
- export declare const schemaWithRefs = "---\ntitle: Schema with refs\n---\n\n# Schema with refs (Swr)\n\n### Schema\n\nThis is bundled schema with refs\n\n```json jsonSchema\n{\n \"title\": \"DerefTest\",\n \"type\": \"object\",\n \"description\": \"Dereferencing test object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"inner\": {\n \"description\": \"Inner object\",\n \"title\": \"Inner\",\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"referencedObject\": {\n \"$ref\": \"#/properties/referencedObject\",\n \"description\": \"Inner referenced object\"\n }\n },\n \"required\": [\n \"id\",\n \"bookingRate\"\n ]\n },\n \"referencedObject\": {\n \"description\": \"Referenced object\",\n \"title\": \"ReferencedObject\",\n \"type\": \"object\",\n \"required\": [\n \"property1\",\n \"property2\",\n \"property3\"\n ],\n \"properties\": {\n \"property1\": {\n \"type\": \"integer\",\n \"description\": \"Property 1\"\n },\n \"property2\": {\n \"type\": \"string\",\n \"description\": \"Property 2\"\n },\n \"property3\": {\n \"type\": \"boolean\",\n \"description\": \"Property 3\"\n }\n }\n }\n },\n \"required\": [\n \"id\",\n \"inner\",\n \"referencedObject\"\n ]\n}\n```";
1
+ export declare const schemaWithRefs = "---\ntitle: Schema with refs\n---\n\n# Schema with refs (Swr)\n\n### Schema\n\nThis is bundled schema with refs\n\n```json jsonSchema\n{\n \"title\": \"DerefTest\",\n \"type\": \"object\",\n \"description\": \"Dereferencing test object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"inner\": {\n \"description\": \"Inner object\",\n \"title\": \"Inner\",\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"referencedObject\": {\n \"$ref\": \"#/properties/referencedObject\",\n \"description\": \"Inner referenced object\"\n }\n },\n \"required\": [\n \"id\",\n \"bookingRate\"\n ]\n },\n \"referencedObject\": {\n \"description\": \"Referenced object\",\n \"title\": \"ReferencedObject\",\n \"type\": \"object\",\n \"required\": [\n \"property1\",\n \"property2\",\n \"property3\"\n ],\n \"properties\": {\n \"property1\": {\n \"type\": \"integer\",\n \"description\": \"Property 1\"\n },\n \"property2\": {\n \"type\": \"string\",\n \"description\": \"Property 2\"\n },\n \"property3\": {\n \"type\": \"boolean\",\n \"description\": \"Property 3\"\n },\n \"property4\": {\n \"type\": \"string\",\n \"enum\": [\n \"BUSINESS\",\n \"PERSONAL\",\n \"OTHER\"\n ],\n \"x-enum-descriptions\": {\n \"BUSINESS\": \"Enum description for BUSINESS\",\n \"PERSONAL\": \"Enum description for PERSONAL\",\n \"OTHER\": \"Enum description for OTHER\"\n }\n }\n }\n }\n },\n \"required\": [\n \"id\",\n \"inner\",\n \"referencedObject\"\n ]\n}\n```";
@@ -1,13 +1,17 @@
1
1
  declare const meta: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, {
2
2
  data: any;
3
+ renderExtensionAddon?: import("..").ExtensionAddonRenderer | undefined;
3
4
  } & import("@stoplight/react-error-boundary").ErrorBoundaryProps<{}>>;
4
5
  export default meta;
5
6
  export declare const Basic: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, {
6
7
  data: any;
8
+ renderExtensionAddon?: import("..").ExtensionAddonRenderer | undefined;
7
9
  } & import("@stoplight/react-error-boundary").ErrorBoundaryProps<{}>>;
8
10
  export declare const KitchenSink: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, {
9
11
  data: any;
12
+ renderExtensionAddon?: import("..").ExtensionAddonRenderer | undefined;
10
13
  } & import("@stoplight/react-error-boundary").ErrorBoundaryProps<{}>>;
11
14
  export declare const MultipleTryIts: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, {
12
15
  data: any;
16
+ renderExtensionAddon?: import("..").ExtensionAddonRenderer | undefined;
13
17
  } & import("@stoplight/react-error-boundary").ErrorBoundaryProps<{}>>;
@@ -1,3 +1,4 @@
1
+ import { SchemaNode } from '@stoplight/json-schema-tree';
1
2
  import type { NodeHasChangedFn, NodeType } from '@stoplight/types';
2
3
  import { Location } from 'history';
3
4
  import * as React from 'react';
@@ -5,6 +6,13 @@ import { ParsedNode } from '../../types';
5
6
  import { ReferenceResolver } from '../../utils/ref-resolving/ReferenceResolver';
6
7
  import { ExportButtonProps } from './HttpService/ExportButton';
7
8
  declare type NodeUnsupportedFn = (err: 'dataEmpty' | 'invalidType' | Error) => void;
9
+ export declare type VendorExtensionsData = Record<string, unknown>;
10
+ export declare type ExtensionRowProps = {
11
+ schemaNode: SchemaNode;
12
+ nestingLevel: number;
13
+ vendorExtensions: VendorExtensionsData;
14
+ };
15
+ export declare type ExtensionAddonRenderer = (props: ExtensionRowProps) => React.ReactNode;
8
16
  interface BaseDocsProps {
9
17
  className?: string;
10
18
  uri?: string;
@@ -27,6 +35,7 @@ interface BaseDocsProps {
27
35
  };
28
36
  nodeHasChanged?: NodeHasChangedFn<React.ReactNode>;
29
37
  nodeUnsupported?: NodeUnsupportedFn;
38
+ renderExtensionAddon?: ExtensionAddonRenderer;
30
39
  }
31
40
  export interface DocsProps extends BaseDocsProps {
32
41
  nodeType: NodeType;
@@ -1,4 +1,5 @@
1
1
  import { IHttpCallbackOperation } from '@stoplight/types';
2
+ import { ExtensionAddonRenderer } from '../Docs';
2
3
  export interface CallbacksProps {
3
4
  callbacks: IHttpCallbackOperation[];
4
5
  isCompact?: boolean;
@@ -6,6 +7,7 @@ export interface CallbacksProps {
6
7
  export interface CallbackProps {
7
8
  data: IHttpCallbackOperation;
8
9
  isCompact?: boolean;
10
+ renderExtensionAddon?: ExtensionAddonRenderer;
9
11
  }
10
12
  export declare const Callbacks: {
11
13
  ({ callbacks, isCompact }: CallbacksProps): JSX.Element;
@@ -1,10 +1,9 @@
1
1
  declare const meta: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, {
2
2
  data: any;
3
+ renderExtensionAddon?: import("..").ExtensionAddonRenderer | undefined;
3
4
  } & import("@stoplight/react-error-boundary").ErrorBoundaryProps<{}>>;
4
5
  export default meta;
5
6
  export declare const Story: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, {
6
7
  data: any;
7
- } & import("@stoplight/react-error-boundary").ErrorBoundaryProps<{}>>;
8
- export declare const StoryWithCustomCodeSamples: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, {
9
- data: any;
8
+ renderExtensionAddon?: import("..").ExtensionAddonRenderer | undefined;
10
9
  } & import("@stoplight/react-error-boundary").ErrorBoundaryProps<{}>>;
@@ -1,7 +1,9 @@
1
1
  declare const meta: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, {
2
2
  data: any;
3
+ renderExtensionAddon?: import("..").ExtensionAddonRenderer | undefined;
3
4
  } & import("@stoplight/react-error-boundary").ErrorBoundaryProps<{}>>;
4
5
  export default meta;
5
6
  export declare const Story: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, {
6
7
  data: any;
8
+ renderExtensionAddon?: import("..").ExtensionAddonRenderer | undefined;
7
9
  } & import("@stoplight/react-error-boundary").ErrorBoundaryProps<{}>>;
@@ -1,7 +1,9 @@
1
1
  declare const meta: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, {
2
2
  data: any;
3
+ renderExtensionAddon?: import("..").ExtensionAddonRenderer | undefined;
3
4
  } & import("@stoplight/react-error-boundary").ErrorBoundaryProps<{}>>;
4
5
  export default meta;
5
6
  export declare const Story: import("@storybook/types").AnnotatedStoryFn<import("@storybook/react/dist/types-0a347bb9").R, {
6
7
  data: any;
8
+ renderExtensionAddon?: import("..").ExtensionAddonRenderer | undefined;
7
9
  } & import("@stoplight/react-error-boundary").ErrorBoundaryProps<{}>>;
@@ -0,0 +1,7 @@
1
+ import { INode } from '@stoplight/types';
2
+ import type { JSONSchema7 } from 'json-schema';
3
+ import * as React from 'react';
4
+ export declare type NodeVendorExtensionsProps = {
5
+ data: INode | JSONSchema7;
6
+ };
7
+ export declare const NodeVendorExtensions: React.NamedExoticComponent<NodeVendorExtensionsProps>;
@@ -1,8 +1,10 @@
1
1
  import type { ErrorBoundaryProps } from '@stoplight/react-error-boundary';
2
2
  import type { Meta, StoryFn } from '@storybook/react';
3
3
  import * as React from 'react';
4
+ import { ExtensionAddonRenderer } from './Docs';
4
5
  declare type DocsProps = {
5
6
  data: any;
7
+ renderExtensionAddon?: ExtensionAddonRenderer;
6
8
  } & ErrorBoundaryProps;
7
9
  declare type storyOptions = DocsProps & {
8
10
  layoutOptions?: object;
@@ -0,0 +1,3 @@
1
+ import { ExtensionAddonRenderer } from './Docs';
2
+ export declare const renderExtensionRenderer: ExtensionAddonRenderer;
3
+ export declare const wrapOptionsContext: (story: any) => JSX.Element;
@@ -24,4 +24,7 @@ export declare const NODE_META_COLOR: {
24
24
  put: string;
25
25
  patch: string;
26
26
  delete: string;
27
+ head: string;
28
+ options: string;
29
+ trace: string;
27
30
  };
package/constants.d.ts CHANGED
@@ -11,6 +11,9 @@ export declare const HttpMethodColors: {
11
11
  readonly put: "warning";
12
12
  readonly patch: "warning";
13
13
  readonly delete: "danger";
14
+ readonly head: "#9061F9";
15
+ readonly options: "#0D5AA7";
16
+ readonly trace: "#0D0B28";
14
17
  };
15
18
  export declare const HttpCodeColor: {
16
19
  readonly 0: "red";
@@ -1,9 +1,9 @@
1
1
  import * as React from 'react';
2
2
  import type { DocsProps } from '../components/Docs';
3
- export declare type ElementsOptionsContextProps = Pick<DocsProps, 'nodeHasChanged'>;
3
+ export declare type ElementsOptionsContextProps = Pick<DocsProps, 'nodeHasChanged' | 'renderExtensionAddon'>;
4
4
  export declare const ElementsOptionsContext: React.Context<ElementsOptionsContextProps>;
5
5
  export declare const useOptionsCtx: () => ElementsOptionsContextProps;
6
6
  export declare type ProviderProps = Partial<ElementsOptionsContextProps> & {
7
7
  children: React.ReactNode;
8
8
  };
9
- export declare function ElementsOptionsProvider({ children, nodeHasChanged }: ProviderProps): JSX.Element;
9
+ export declare function ElementsOptionsProvider({ children, nodeHasChanged, renderExtensionAddon }: ProviderProps): JSX.Element;
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { Docs, DocsProps, ParsedDocs } from './components/Docs';
1
+ export { Docs, DocsProps, ExtensionAddonRenderer, ExtensionRowProps, ParsedDocs } from './components/Docs';
2
2
  export { DeprecatedBadge } from './components/Docs/HttpOperation/Badges';
3
3
  export { ExportButton, ExportButtonProps } from './components/Docs/HttpService/ExportButton';
4
4
  export { ResponsiveSidebarLayout } from './components/Layout/ResponsiveSidebarLayout';
@@ -17,6 +17,7 @@ export { TryIt, TryItProps, TryItWithRequestSamples, TryItWithRequestSamplesProp
17
17
  export { HttpMethodColors, NodeTypeColors, NodeTypeIconDefs, NodeTypePrettyName } from './constants';
18
18
  export { MockingProvider } from './containers/MockingProvider';
19
19
  export { InlineRefResolverProvider } from './context/InlineRefResolver';
20
+ export { ElementsOptionsProvider } from './context/Options';
20
21
  export { PersistenceContextProvider, withPersistenceBoundary } from './context/Persistence';
21
22
  export { RouterTypeContext } from './context/RouterType';
22
23
  export { withMosaicProvider } from './hoc/withMosaicProvider';
package/index.esm.js CHANGED
@@ -44,6 +44,7 @@ import uniq from 'lodash/uniq.js';
44
44
  import orderBy from 'lodash/orderBy.js';
45
45
  import uniqBy from 'lodash/uniqBy.js';
46
46
  import formatXml from 'xml-formatter';
47
+ import memoize from 'lodash/memoize.js';
47
48
  import entries from 'lodash/entries.js';
48
49
  import keys from 'lodash/keys.js';
49
50
  import sortBy from 'lodash/sortBy.js';
@@ -164,8 +165,8 @@ const ElementsOptionsContext = React.createContext(DEFAULT_CONTEXT);
164
165
  const useOptionsCtx = () => {
165
166
  return React.useContext(ElementsOptionsContext) || DEFAULT_CONTEXT;
166
167
  };
167
- function ElementsOptionsProvider({ children, nodeHasChanged }) {
168
- return (React.createElement(ElementsOptionsContext.Provider, { value: Object.assign({}, DEFAULT_CONTEXT, { nodeHasChanged }) }, children));
168
+ function ElementsOptionsProvider({ children, nodeHasChanged, renderExtensionAddon }) {
169
+ return (React.createElement(ElementsOptionsContext.Provider, { value: Object.assign({}, DEFAULT_CONTEXT, { nodeHasChanged, renderExtensionAddon }) }, children));
169
170
  }
170
171
 
171
172
  function isSMDASTRoot(maybeAst) {
@@ -450,6 +451,9 @@ const HttpMethodColors = {
450
451
  put: 'warning',
451
452
  patch: 'warning',
452
453
  delete: 'danger',
454
+ head: '#9061F9',
455
+ options: '#0D5AA7',
456
+ trace: '#0D0B28',
453
457
  };
454
458
  const HttpCodeColor = {
455
459
  0: 'red',
@@ -2444,6 +2448,32 @@ const TryItWithRequestSamples = (_a) => {
2444
2448
  React.createElement(ResponseExamples, Object.assign({}, props))));
2445
2449
  };
2446
2450
 
2451
+ const getVendorExtensions = memoize((data) => {
2452
+ const vendorExtensionNames = Object.keys(data).filter(item => item.startsWith('x-'));
2453
+ const vendorExtensions = vendorExtensionNames.reduce((previousValue, currentValue, currentIndex) => {
2454
+ return Object.assign(Object.assign({}, previousValue), { [currentValue]: data[currentValue] });
2455
+ }, {});
2456
+ return vendorExtensions;
2457
+ });
2458
+ const NodeVendorExtensions = React.memo(({ data }) => {
2459
+ const { renderExtensionAddon } = useOptionsCtx();
2460
+ if (!renderExtensionAddon) {
2461
+ return null;
2462
+ }
2463
+ const originalObject = getOriginalObject(data);
2464
+ const vendorExtensions = originalObject.extensions ? originalObject.extensions : getVendorExtensions(originalObject);
2465
+ const vendorExtensionKeys = Object.keys(vendorExtensions);
2466
+ if (vendorExtensionKeys.length === 0) {
2467
+ return null;
2468
+ }
2469
+ return (React.createElement(React.Fragment, null, renderExtensionAddon({
2470
+ nestingLevel: -1,
2471
+ schemaNode: originalObject,
2472
+ vendorExtensions,
2473
+ })));
2474
+ });
2475
+ NodeVendorExtensions.displayName = 'NodeVendorExtensions';
2476
+
2447
2477
  const TwoColumnLayout = React__default.forwardRef(({ header, right, left, className }, ref) => (React__default.createElement(VStack, { ref: ref, w: "full", className: className, spacing: 8 },
2448
2478
  header,
2449
2479
  React__default.createElement(Flex, null,
@@ -2601,7 +2631,7 @@ const Body = ({ body, onChange }) => {
2601
2631
  var _a;
2602
2632
  const [refResolver, maxRefDepth] = useSchemaInlineRefResolver();
2603
2633
  const [chosenContent, setChosenContent] = React.useState(0);
2604
- const { nodeHasChanged } = useOptionsCtx();
2634
+ const { nodeHasChanged, renderExtensionAddon } = useOptionsCtx();
2605
2635
  React.useEffect(() => {
2606
2636
  onChange === null || onChange === void 0 ? void 0 : onChange(chosenContent);
2607
2637
  }, [chosenContent]);
@@ -2616,7 +2646,7 @@ const Body = ({ body, onChange }) => {
2616
2646
  description && (React.createElement(Box, { pos: "relative" },
2617
2647
  React.createElement(MarkdownViewer, { markdown: description }),
2618
2648
  React.createElement(NodeAnnotation, { change: descriptionChanged }))),
2619
- isJSONSchema(schema) && (React.createElement(JsonSchemaViewer, { resolveRef: refResolver, maxRefDepth: maxRefDepth, schema: getOriginalObject(schema), viewMode: "write", renderRootTreeLines: true, nodeHasChanged: nodeHasChanged }))));
2649
+ isJSONSchema(schema) && (React.createElement(JsonSchemaViewer, { resolveRef: refResolver, maxRefDepth: maxRefDepth, schema: getOriginalObject(schema), viewMode: "write", renderRootTreeLines: true, nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon }))));
2620
2650
  };
2621
2651
  Body.displayName = 'HttpOperation.Body';
2622
2652
 
@@ -2640,12 +2670,12 @@ const defaultStyle = {
2640
2670
  cookie: HttpParamStyles.Form,
2641
2671
  };
2642
2672
  const Parameters = ({ parameters, parameterType }) => {
2643
- const { nodeHasChanged } = useOptionsCtx();
2673
+ const { nodeHasChanged, renderExtensionAddon } = useOptionsCtx();
2644
2674
  const [refResolver, maxRefDepth] = useSchemaInlineRefResolver();
2645
2675
  const schema = React.useMemo(() => httpOperationParamsToSchema({ parameters, parameterType }), [parameters, parameterType]);
2646
2676
  if (!schema)
2647
2677
  return null;
2648
- return (React.createElement(JsonSchemaViewer, { resolveRef: refResolver, maxRefDepth: maxRefDepth, schema: schema, disableCrumbs: true, nodeHasChanged: nodeHasChanged }));
2678
+ return (React.createElement(JsonSchemaViewer, { resolveRef: refResolver, maxRefDepth: maxRefDepth, schema: schema, disableCrumbs: true, nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon }));
2649
2679
  };
2650
2680
  Parameters.displayName = 'HttpOperation.Parameters';
2651
2681
  const httpOperationParamsToSchema = ({ parameters, parameterType }) => {
@@ -2785,7 +2815,7 @@ const Response = ({ response, onMediaTypeChange }) => {
2785
2815
  const { contents = [], headers = [], description } = response;
2786
2816
  const [chosenContent, setChosenContent] = React.useState(0);
2787
2817
  const [refResolver, maxRefDepth] = useSchemaInlineRefResolver();
2788
- const { nodeHasChanged } = useOptionsCtx();
2818
+ const { nodeHasChanged, renderExtensionAddon } = useOptionsCtx();
2789
2819
  const responseContent = contents[chosenContent];
2790
2820
  const schema = responseContent === null || responseContent === void 0 ? void 0 : responseContent.schema;
2791
2821
  React.useEffect(() => {
@@ -2803,7 +2833,7 @@ const Response = ({ response, onMediaTypeChange }) => {
2803
2833
  React.createElement(SectionSubtitle, { title: "Body", id: "response-body" },
2804
2834
  React.createElement(Flex, { flex: 1, justify: "end" },
2805
2835
  React.createElement(Select, { "aria-label": "Response Body Content Type", value: String(chosenContent), onChange: value => setChosenContent(parseInt(String(value), 10)), options: contents.map((content, index) => ({ label: content.mediaType, value: index })), size: "sm" }))),
2806
- schema && (React.createElement(JsonSchemaViewer, { schema: getOriginalObject(schema), resolveRef: refResolver, maxRefDepth: maxRefDepth, viewMode: "read", parentCrumbs: ['responses', response.code], renderRootTreeLines: true, nodeHasChanged: nodeHasChanged }))))));
2836
+ schema && (React.createElement(JsonSchemaViewer, { schema: getOriginalObject(schema), resolveRef: refResolver, maxRefDepth: maxRefDepth, viewMode: "read", parentCrumbs: ['responses', response.code], renderRootTreeLines: true, nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon }))))));
2807
2837
  };
2808
2838
  Response.displayName = 'HttpOperation.Response';
2809
2839
  const codeToIntentVal = (code) => {
@@ -2879,6 +2909,7 @@ const HttpOperationComponent = React.memo(({ className, data: unresolvedData, la
2879
2909
  data.description && (React.createElement(Box, { pos: "relative" },
2880
2910
  React.createElement(MarkdownViewer, { className: "HttpOperation__Description", markdown: data.description }),
2881
2911
  React.createElement(NodeAnnotation, { change: descriptionChanged }))),
2912
+ React.createElement(NodeVendorExtensions, { data: data }),
2882
2913
  React.createElement(Request, { onChange: setTextRequestBodyIndex, operation: data }),
2883
2914
  data.responses && (React.createElement(Responses, { responses: data.responses, onMediaTypeChange: setResponseMediaType, onStatusCodeChange: setResponseStatusCode, isCompact: isCompact })),
2884
2915
  ((_a = data.callbacks) === null || _a === void 0 ? void 0 : _a.length) ? React.createElement(Callbacks, { callbacks: data.callbacks, isCompact: isCompact }) : null,
@@ -3130,7 +3161,7 @@ const ModelComponent = ({ data: unresolvedData, className, nodeTitle, layoutOpti
3130
3161
  var _a, _b;
3131
3162
  const [resolveRef, maxRefDepth] = useSchemaInlineRefResolver();
3132
3163
  const data = useResolvedObject(unresolvedData);
3133
- const { nodeHasChanged } = useOptionsCtx();
3164
+ const { nodeHasChanged, renderExtensionAddon } = useOptionsCtx();
3134
3165
  const { ref: layoutRef, isCompact } = useIsCompact(layoutOptions);
3135
3166
  const nodeId = (_a = data === null || data === void 0 ? void 0 : data['x-stoplight']) === null || _a === void 0 ? void 0 : _a.id;
3136
3167
  const title = (_b = data.title) !== null && _b !== void 0 ? _b : nodeTitle;
@@ -3153,8 +3184,9 @@ const ModelComponent = ({ data: unresolvedData, className, nodeTitle, layoutOpti
3153
3184
  data.description && data.type === 'object' && (React.createElement(Box, { pos: "relative" },
3154
3185
  React.createElement(MarkdownViewer, { role: "textbox", markdown: data.description }),
3155
3186
  React.createElement(NodeAnnotation, { change: descriptionChanged }))),
3187
+ React.createElement(NodeVendorExtensions, { data: data }),
3156
3188
  isCompact && modelExamples,
3157
- React.createElement(JsonSchemaViewer, { resolveRef: resolveRef, maxRefDepth: maxRefDepth, schema: getOriginalObject(data), nodeHasChanged: nodeHasChanged, skipTopLevelDescription: true })));
3189
+ React.createElement(JsonSchemaViewer, { resolveRef: resolveRef, maxRefDepth: maxRefDepth, schema: getOriginalObject(data), nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon, skipTopLevelDescription: true })));
3158
3190
  return (React.createElement(TwoColumnLayout, { ref: layoutRef, className: cn('Model', className), header: header, left: description, right: !isCompact && modelExamples }));
3159
3191
  };
3160
3192
  const ModelExamples = React.memo(({ data, isCollapsible = false }) => {
@@ -3177,7 +3209,7 @@ const Model = withErrorBoundary(ModelComponent, { recoverableProps: ['data'] });
3177
3209
 
3178
3210
  const Docs = React.memo((_a) => {
3179
3211
  var _b;
3180
- var { nodeType, nodeData, useNodeForRefResolving = false, refResolver, maxRefDepth, nodeHasChanged } = _a, commonProps = __rest(_a, ["nodeType", "nodeData", "useNodeForRefResolving", "refResolver", "maxRefDepth", "nodeHasChanged"]);
3212
+ var { nodeType, nodeData, useNodeForRefResolving = false, refResolver, maxRefDepth, nodeHasChanged, renderExtensionAddon } = _a, commonProps = __rest(_a, ["nodeType", "nodeData", "useNodeForRefResolving", "refResolver", "maxRefDepth", "nodeHasChanged", "renderExtensionAddon"]);
3181
3213
  const parsedNode = useParsedData(nodeType, nodeData);
3182
3214
  if (!parsedNode) {
3183
3215
  (_b = commonProps.nodeUnsupported) === null || _b === void 0 ? void 0 : _b.call(commonProps, 'dataEmpty');
@@ -3187,7 +3219,7 @@ const Docs = React.memo((_a) => {
3187
3219
  if (useNodeForRefResolving) {
3188
3220
  elem = (React.createElement(InlineRefResolverProvider, { document: parsedNode.data, resolver: refResolver, maxRefDepth: maxRefDepth }, elem));
3189
3221
  }
3190
- return React.createElement(ElementsOptionsProvider, { nodeHasChanged: nodeHasChanged }, elem);
3222
+ return (React.createElement(ElementsOptionsProvider, { nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon }, elem));
3191
3223
  });
3192
3224
  const ParsedDocs = (_a) => {
3193
3225
  var { node, nodeUnsupported } = _a, commonProps = __rest(_a, ["node", "nodeUnsupported"]);
@@ -3293,6 +3325,9 @@ const NODE_META_COLOR = {
3293
3325
  put: 'warning',
3294
3326
  patch: 'warning',
3295
3327
  delete: 'danger',
3328
+ head: '#9061F9',
3329
+ options: '#0D5AA7',
3330
+ trace: '#0D0B28',
3296
3331
  };
3297
3332
 
3298
3333
  function getHtmlIdFromItemId(id) {
@@ -3646,12 +3681,13 @@ function isPartialHttpRequest(maybeHttpRequest) {
3646
3681
  }
3647
3682
  const SchemaAndDescription = ({ title: titleProp, schema }) => {
3648
3683
  const [resolveRef, maxRefDepth] = useSchemaInlineRefResolver();
3684
+ const { renderExtensionAddon } = useOptionsCtx();
3649
3685
  const title = titleProp !== null && titleProp !== void 0 ? titleProp : schema.title;
3650
3686
  return (React__default.createElement(Box, { py: 2 },
3651
3687
  title && (React__default.createElement(Flex, { alignItems: "center", p: 2 },
3652
3688
  React__default.createElement(Icon, { icon: NodeTypeIconDefs[NodeType.Model], color: NodeTypeColors[NodeType.Model] }),
3653
3689
  React__default.createElement(Box, { color: "muted", px: 2 }, title))),
3654
- React__default.createElement(JsonSchemaViewer, { resolveRef: resolveRef, maxRefDepth: maxRefDepth, schema: getOriginalObject(schema) })));
3690
+ React__default.createElement(JsonSchemaViewer, { resolveRef: resolveRef, maxRefDepth: maxRefDepth, schema: getOriginalObject(schema), renderExtensionAddon: renderExtensionAddon })));
3655
3691
  };
3656
3692
  const CodeComponent = props => {
3657
3693
  const { title, jsonSchema, http, resolved, children } = props;
@@ -3996,4 +4032,4 @@ const createElementClass = (Component, propDescriptors) => {
3996
4032
  };
3997
4033
  };
3998
4034
 
3999
- export { DeprecatedBadge, Docs, ExportButton, HttpMethodColors, InlineRefResolverProvider, LinkHeading, Logo, MarkdownComponentsProvider, MockingProvider, NodeTypeColors, NodeTypeIconDefs, NodeTypePrettyName, NonIdealState, ParsedDocs, PersistenceContextProvider, PoweredByLink, ReactRouterMarkdownLink, ResponsiveSidebarLayout, RouterTypeContext, SidebarLayout, Styled, TableOfContents, TryIt, TryItWithRequestSamples, createElementClass, createResolvedObject, findFirstNode, isHttpOperation, isHttpService, isHttpWebhookOperation, slugify, useBundleRefsIntoDocument, useParsedData, useParsedValue, useResponsiveLayout, useRouter, withMosaicProvider, withPersistenceBoundary, withQueryClientProvider, withRouter, withStyles };
4035
+ export { DeprecatedBadge, Docs, ElementsOptionsProvider, ExportButton, HttpMethodColors, InlineRefResolverProvider, LinkHeading, Logo, MarkdownComponentsProvider, MockingProvider, NodeTypeColors, NodeTypeIconDefs, NodeTypePrettyName, NonIdealState, ParsedDocs, PersistenceContextProvider, PoweredByLink, ReactRouterMarkdownLink, ResponsiveSidebarLayout, RouterTypeContext, SidebarLayout, Styled, TableOfContents, TryIt, TryItWithRequestSamples, createElementClass, createResolvedObject, findFirstNode, isHttpOperation, isHttpService, isHttpWebhookOperation, slugify, useBundleRefsIntoDocument, useParsedData, useParsedValue, useResponsiveLayout, useRouter, withMosaicProvider, withPersistenceBoundary, withQueryClientProvider, withRouter, withStyles };
package/index.js CHANGED
@@ -46,6 +46,7 @@ var uniq = require('lodash/uniq.js');
46
46
  var orderBy = require('lodash/orderBy.js');
47
47
  var uniqBy = require('lodash/uniqBy.js');
48
48
  var formatXml = require('xml-formatter');
49
+ var memoize = require('lodash/memoize.js');
49
50
  var entries = require('lodash/entries.js');
50
51
  var keys = require('lodash/keys.js');
51
52
  var sortBy = require('lodash/sortBy.js');
@@ -106,6 +107,7 @@ var uniq__default = /*#__PURE__*/_interopDefaultLegacy(uniq);
106
107
  var orderBy__default = /*#__PURE__*/_interopDefaultLegacy(orderBy);
107
108
  var uniqBy__default = /*#__PURE__*/_interopDefaultLegacy(uniqBy);
108
109
  var formatXml__default = /*#__PURE__*/_interopDefaultLegacy(formatXml);
110
+ var memoize__default = /*#__PURE__*/_interopDefaultLegacy(memoize);
109
111
  var entries__default = /*#__PURE__*/_interopDefaultLegacy(entries);
110
112
  var keys__default = /*#__PURE__*/_interopDefaultLegacy(keys);
111
113
  var sortBy__default = /*#__PURE__*/_interopDefaultLegacy(sortBy);
@@ -224,8 +226,8 @@ const ElementsOptionsContext = React__namespace.createContext(DEFAULT_CONTEXT);
224
226
  const useOptionsCtx = () => {
225
227
  return React__namespace.useContext(ElementsOptionsContext) || DEFAULT_CONTEXT;
226
228
  };
227
- function ElementsOptionsProvider({ children, nodeHasChanged }) {
228
- return (React__namespace.createElement(ElementsOptionsContext.Provider, { value: Object.assign({}, DEFAULT_CONTEXT, { nodeHasChanged }) }, children));
229
+ function ElementsOptionsProvider({ children, nodeHasChanged, renderExtensionAddon }) {
230
+ return (React__namespace.createElement(ElementsOptionsContext.Provider, { value: Object.assign({}, DEFAULT_CONTEXT, { nodeHasChanged, renderExtensionAddon }) }, children));
229
231
  }
230
232
 
231
233
  function isSMDASTRoot(maybeAst) {
@@ -510,6 +512,9 @@ const HttpMethodColors = {
510
512
  put: 'warning',
511
513
  patch: 'warning',
512
514
  delete: 'danger',
515
+ head: '#9061F9',
516
+ options: '#0D5AA7',
517
+ trace: '#0D0B28',
513
518
  };
514
519
  const HttpCodeColor = {
515
520
  0: 'red',
@@ -2504,6 +2509,32 @@ const TryItWithRequestSamples = (_a) => {
2504
2509
  React__namespace.createElement(ResponseExamples, Object.assign({}, props))));
2505
2510
  };
2506
2511
 
2512
+ const getVendorExtensions = memoize__default["default"]((data) => {
2513
+ const vendorExtensionNames = Object.keys(data).filter(item => item.startsWith('x-'));
2514
+ const vendorExtensions = vendorExtensionNames.reduce((previousValue, currentValue, currentIndex) => {
2515
+ return Object.assign(Object.assign({}, previousValue), { [currentValue]: data[currentValue] });
2516
+ }, {});
2517
+ return vendorExtensions;
2518
+ });
2519
+ const NodeVendorExtensions = React__namespace.memo(({ data }) => {
2520
+ const { renderExtensionAddon } = useOptionsCtx();
2521
+ if (!renderExtensionAddon) {
2522
+ return null;
2523
+ }
2524
+ const originalObject = getOriginalObject(data);
2525
+ const vendorExtensions = originalObject.extensions ? originalObject.extensions : getVendorExtensions(originalObject);
2526
+ const vendorExtensionKeys = Object.keys(vendorExtensions);
2527
+ if (vendorExtensionKeys.length === 0) {
2528
+ return null;
2529
+ }
2530
+ return (React__namespace.createElement(React__namespace.Fragment, null, renderExtensionAddon({
2531
+ nestingLevel: -1,
2532
+ schemaNode: originalObject,
2533
+ vendorExtensions,
2534
+ })));
2535
+ });
2536
+ NodeVendorExtensions.displayName = 'NodeVendorExtensions';
2537
+
2507
2538
  const TwoColumnLayout = React__default["default"].forwardRef(({ header, right, left, className }, ref) => (React__default["default"].createElement(mosaic.VStack, { ref: ref, w: "full", className: className, spacing: 8 },
2508
2539
  header,
2509
2540
  React__default["default"].createElement(mosaic.Flex, null,
@@ -2661,7 +2692,7 @@ const Body = ({ body, onChange }) => {
2661
2692
  var _a;
2662
2693
  const [refResolver, maxRefDepth] = useSchemaInlineRefResolver();
2663
2694
  const [chosenContent, setChosenContent] = React__namespace.useState(0);
2664
- const { nodeHasChanged } = useOptionsCtx();
2695
+ const { nodeHasChanged, renderExtensionAddon } = useOptionsCtx();
2665
2696
  React__namespace.useEffect(() => {
2666
2697
  onChange === null || onChange === void 0 ? void 0 : onChange(chosenContent);
2667
2698
  }, [chosenContent]);
@@ -2676,7 +2707,7 @@ const Body = ({ body, onChange }) => {
2676
2707
  description && (React__namespace.createElement(mosaic.Box, { pos: "relative" },
2677
2708
  React__namespace.createElement(MarkdownViewer, { markdown: description }),
2678
2709
  React__namespace.createElement(mosaic.NodeAnnotation, { change: descriptionChanged }))),
2679
- isJSONSchema(schema) && (React__namespace.createElement(jsonSchemaViewer.JsonSchemaViewer, { resolveRef: refResolver, maxRefDepth: maxRefDepth, schema: getOriginalObject(schema), viewMode: "write", renderRootTreeLines: true, nodeHasChanged: nodeHasChanged }))));
2710
+ isJSONSchema(schema) && (React__namespace.createElement(jsonSchemaViewer.JsonSchemaViewer, { resolveRef: refResolver, maxRefDepth: maxRefDepth, schema: getOriginalObject(schema), viewMode: "write", renderRootTreeLines: true, nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon }))));
2680
2711
  };
2681
2712
  Body.displayName = 'HttpOperation.Body';
2682
2713
 
@@ -2700,12 +2731,12 @@ const defaultStyle = {
2700
2731
  cookie: types.HttpParamStyles.Form,
2701
2732
  };
2702
2733
  const Parameters = ({ parameters, parameterType }) => {
2703
- const { nodeHasChanged } = useOptionsCtx();
2734
+ const { nodeHasChanged, renderExtensionAddon } = useOptionsCtx();
2704
2735
  const [refResolver, maxRefDepth] = useSchemaInlineRefResolver();
2705
2736
  const schema = React__namespace.useMemo(() => httpOperationParamsToSchema({ parameters, parameterType }), [parameters, parameterType]);
2706
2737
  if (!schema)
2707
2738
  return null;
2708
- return (React__namespace.createElement(jsonSchemaViewer.JsonSchemaViewer, { resolveRef: refResolver, maxRefDepth: maxRefDepth, schema: schema, disableCrumbs: true, nodeHasChanged: nodeHasChanged }));
2739
+ return (React__namespace.createElement(jsonSchemaViewer.JsonSchemaViewer, { resolveRef: refResolver, maxRefDepth: maxRefDepth, schema: schema, disableCrumbs: true, nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon }));
2709
2740
  };
2710
2741
  Parameters.displayName = 'HttpOperation.Parameters';
2711
2742
  const httpOperationParamsToSchema = ({ parameters, parameterType }) => {
@@ -2845,7 +2876,7 @@ const Response = ({ response, onMediaTypeChange }) => {
2845
2876
  const { contents = [], headers = [], description } = response;
2846
2877
  const [chosenContent, setChosenContent] = React__namespace.useState(0);
2847
2878
  const [refResolver, maxRefDepth] = useSchemaInlineRefResolver();
2848
- const { nodeHasChanged } = useOptionsCtx();
2879
+ const { nodeHasChanged, renderExtensionAddon } = useOptionsCtx();
2849
2880
  const responseContent = contents[chosenContent];
2850
2881
  const schema = responseContent === null || responseContent === void 0 ? void 0 : responseContent.schema;
2851
2882
  React__namespace.useEffect(() => {
@@ -2863,7 +2894,7 @@ const Response = ({ response, onMediaTypeChange }) => {
2863
2894
  React__namespace.createElement(SectionSubtitle, { title: "Body", id: "response-body" },
2864
2895
  React__namespace.createElement(mosaic.Flex, { flex: 1, justify: "end" },
2865
2896
  React__namespace.createElement(mosaic.Select, { "aria-label": "Response Body Content Type", value: String(chosenContent), onChange: value => setChosenContent(parseInt(String(value), 10)), options: contents.map((content, index) => ({ label: content.mediaType, value: index })), size: "sm" }))),
2866
- schema && (React__namespace.createElement(jsonSchemaViewer.JsonSchemaViewer, { schema: getOriginalObject(schema), resolveRef: refResolver, maxRefDepth: maxRefDepth, viewMode: "read", parentCrumbs: ['responses', response.code], renderRootTreeLines: true, nodeHasChanged: nodeHasChanged }))))));
2897
+ schema && (React__namespace.createElement(jsonSchemaViewer.JsonSchemaViewer, { schema: getOriginalObject(schema), resolveRef: refResolver, maxRefDepth: maxRefDepth, viewMode: "read", parentCrumbs: ['responses', response.code], renderRootTreeLines: true, nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon }))))));
2867
2898
  };
2868
2899
  Response.displayName = 'HttpOperation.Response';
2869
2900
  const codeToIntentVal = (code) => {
@@ -2939,6 +2970,7 @@ const HttpOperationComponent = React__namespace.memo(({ className, data: unresol
2939
2970
  data.description && (React__namespace.createElement(mosaic.Box, { pos: "relative" },
2940
2971
  React__namespace.createElement(MarkdownViewer, { className: "HttpOperation__Description", markdown: data.description }),
2941
2972
  React__namespace.createElement(mosaic.NodeAnnotation, { change: descriptionChanged }))),
2973
+ React__namespace.createElement(NodeVendorExtensions, { data: data }),
2942
2974
  React__namespace.createElement(Request, { onChange: setTextRequestBodyIndex, operation: data }),
2943
2975
  data.responses && (React__namespace.createElement(Responses, { responses: data.responses, onMediaTypeChange: setResponseMediaType, onStatusCodeChange: setResponseStatusCode, isCompact: isCompact })),
2944
2976
  ((_a = data.callbacks) === null || _a === void 0 ? void 0 : _a.length) ? React__namespace.createElement(Callbacks, { callbacks: data.callbacks, isCompact: isCompact }) : null,
@@ -3190,7 +3222,7 @@ const ModelComponent = ({ data: unresolvedData, className, nodeTitle, layoutOpti
3190
3222
  var _a, _b;
3191
3223
  const [resolveRef, maxRefDepth] = useSchemaInlineRefResolver();
3192
3224
  const data = useResolvedObject(unresolvedData);
3193
- const { nodeHasChanged } = useOptionsCtx();
3225
+ const { nodeHasChanged, renderExtensionAddon } = useOptionsCtx();
3194
3226
  const { ref: layoutRef, isCompact } = useIsCompact(layoutOptions);
3195
3227
  const nodeId = (_a = data === null || data === void 0 ? void 0 : data['x-stoplight']) === null || _a === void 0 ? void 0 : _a.id;
3196
3228
  const title = (_b = data.title) !== null && _b !== void 0 ? _b : nodeTitle;
@@ -3213,8 +3245,9 @@ const ModelComponent = ({ data: unresolvedData, className, nodeTitle, layoutOpti
3213
3245
  data.description && data.type === 'object' && (React__namespace.createElement(mosaic.Box, { pos: "relative" },
3214
3246
  React__namespace.createElement(MarkdownViewer, { role: "textbox", markdown: data.description }),
3215
3247
  React__namespace.createElement(mosaic.NodeAnnotation, { change: descriptionChanged }))),
3248
+ React__namespace.createElement(NodeVendorExtensions, { data: data }),
3216
3249
  isCompact && modelExamples,
3217
- React__namespace.createElement(jsonSchemaViewer.JsonSchemaViewer, { resolveRef: resolveRef, maxRefDepth: maxRefDepth, schema: getOriginalObject(data), nodeHasChanged: nodeHasChanged, skipTopLevelDescription: true })));
3250
+ React__namespace.createElement(jsonSchemaViewer.JsonSchemaViewer, { resolveRef: resolveRef, maxRefDepth: maxRefDepth, schema: getOriginalObject(data), nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon, skipTopLevelDescription: true })));
3218
3251
  return (React__namespace.createElement(TwoColumnLayout, { ref: layoutRef, className: cn__default["default"]('Model', className), header: header, left: description, right: !isCompact && modelExamples }));
3219
3252
  };
3220
3253
  const ModelExamples = React__namespace.memo(({ data, isCollapsible = false }) => {
@@ -3237,7 +3270,7 @@ const Model = reactErrorBoundary.withErrorBoundary(ModelComponent, { recoverable
3237
3270
 
3238
3271
  const Docs = React__namespace.memo((_a) => {
3239
3272
  var _b;
3240
- var { nodeType, nodeData, useNodeForRefResolving = false, refResolver, maxRefDepth, nodeHasChanged } = _a, commonProps = tslib.__rest(_a, ["nodeType", "nodeData", "useNodeForRefResolving", "refResolver", "maxRefDepth", "nodeHasChanged"]);
3273
+ var { nodeType, nodeData, useNodeForRefResolving = false, refResolver, maxRefDepth, nodeHasChanged, renderExtensionAddon } = _a, commonProps = tslib.__rest(_a, ["nodeType", "nodeData", "useNodeForRefResolving", "refResolver", "maxRefDepth", "nodeHasChanged", "renderExtensionAddon"]);
3241
3274
  const parsedNode = useParsedData(nodeType, nodeData);
3242
3275
  if (!parsedNode) {
3243
3276
  (_b = commonProps.nodeUnsupported) === null || _b === void 0 ? void 0 : _b.call(commonProps, 'dataEmpty');
@@ -3247,7 +3280,7 @@ const Docs = React__namespace.memo((_a) => {
3247
3280
  if (useNodeForRefResolving) {
3248
3281
  elem = (React__namespace.createElement(InlineRefResolverProvider, { document: parsedNode.data, resolver: refResolver, maxRefDepth: maxRefDepth }, elem));
3249
3282
  }
3250
- return React__namespace.createElement(ElementsOptionsProvider, { nodeHasChanged: nodeHasChanged }, elem);
3283
+ return (React__namespace.createElement(ElementsOptionsProvider, { nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon }, elem));
3251
3284
  });
3252
3285
  const ParsedDocs = (_a) => {
3253
3286
  var { node, nodeUnsupported } = _a, commonProps = tslib.__rest(_a, ["node", "nodeUnsupported"]);
@@ -3353,6 +3386,9 @@ const NODE_META_COLOR = {
3353
3386
  put: 'warning',
3354
3387
  patch: 'warning',
3355
3388
  delete: 'danger',
3389
+ head: '#9061F9',
3390
+ options: '#0D5AA7',
3391
+ trace: '#0D0B28',
3356
3392
  };
3357
3393
 
3358
3394
  function getHtmlIdFromItemId(id) {
@@ -3706,12 +3742,13 @@ function isPartialHttpRequest(maybeHttpRequest) {
3706
3742
  }
3707
3743
  const SchemaAndDescription = ({ title: titleProp, schema }) => {
3708
3744
  const [resolveRef, maxRefDepth] = useSchemaInlineRefResolver();
3745
+ const { renderExtensionAddon } = useOptionsCtx();
3709
3746
  const title = titleProp !== null && titleProp !== void 0 ? titleProp : schema.title;
3710
3747
  return (React__default["default"].createElement(mosaic.Box, { py: 2 },
3711
3748
  title && (React__default["default"].createElement(mosaic.Flex, { alignItems: "center", p: 2 },
3712
3749
  React__default["default"].createElement(mosaic.Icon, { icon: NodeTypeIconDefs[types.NodeType.Model], color: NodeTypeColors[types.NodeType.Model] }),
3713
3750
  React__default["default"].createElement(mosaic.Box, { color: "muted", px: 2 }, title))),
3714
- React__default["default"].createElement(jsonSchemaViewer.JsonSchemaViewer, { resolveRef: resolveRef, maxRefDepth: maxRefDepth, schema: getOriginalObject(schema) })));
3751
+ React__default["default"].createElement(jsonSchemaViewer.JsonSchemaViewer, { resolveRef: resolveRef, maxRefDepth: maxRefDepth, schema: getOriginalObject(schema), renderExtensionAddon: renderExtensionAddon })));
3715
3752
  };
3716
3753
  const CodeComponent = props => {
3717
3754
  const { title, jsonSchema, http, resolved, children } = props;
@@ -4062,6 +4099,7 @@ Object.defineProperty(exports, 'DefaultSMDComponents', {
4062
4099
  });
4063
4100
  exports.DeprecatedBadge = DeprecatedBadge;
4064
4101
  exports.Docs = Docs;
4102
+ exports.ElementsOptionsProvider = ElementsOptionsProvider;
4065
4103
  exports.ExportButton = ExportButton;
4066
4104
  exports.HttpMethodColors = HttpMethodColors;
4067
4105
  exports.InlineRefResolverProvider = InlineRefResolverProvider;
package/index.mjs CHANGED
@@ -44,6 +44,7 @@ import uniq from 'lodash/uniq.js';
44
44
  import orderBy from 'lodash/orderBy.js';
45
45
  import uniqBy from 'lodash/uniqBy.js';
46
46
  import formatXml from 'xml-formatter';
47
+ import memoize from 'lodash/memoize.js';
47
48
  import entries from 'lodash/entries.js';
48
49
  import keys from 'lodash/keys.js';
49
50
  import sortBy from 'lodash/sortBy.js';
@@ -164,8 +165,8 @@ const ElementsOptionsContext = React.createContext(DEFAULT_CONTEXT);
164
165
  const useOptionsCtx = () => {
165
166
  return React.useContext(ElementsOptionsContext) || DEFAULT_CONTEXT;
166
167
  };
167
- function ElementsOptionsProvider({ children, nodeHasChanged }) {
168
- return (React.createElement(ElementsOptionsContext.Provider, { value: Object.assign({}, DEFAULT_CONTEXT, { nodeHasChanged }) }, children));
168
+ function ElementsOptionsProvider({ children, nodeHasChanged, renderExtensionAddon }) {
169
+ return (React.createElement(ElementsOptionsContext.Provider, { value: Object.assign({}, DEFAULT_CONTEXT, { nodeHasChanged, renderExtensionAddon }) }, children));
169
170
  }
170
171
 
171
172
  function isSMDASTRoot(maybeAst) {
@@ -450,6 +451,9 @@ const HttpMethodColors = {
450
451
  put: 'warning',
451
452
  patch: 'warning',
452
453
  delete: 'danger',
454
+ head: '#9061F9',
455
+ options: '#0D5AA7',
456
+ trace: '#0D0B28',
453
457
  };
454
458
  const HttpCodeColor = {
455
459
  0: 'red',
@@ -2444,6 +2448,32 @@ const TryItWithRequestSamples = (_a) => {
2444
2448
  React.createElement(ResponseExamples, Object.assign({}, props))));
2445
2449
  };
2446
2450
 
2451
+ const getVendorExtensions = memoize((data) => {
2452
+ const vendorExtensionNames = Object.keys(data).filter(item => item.startsWith('x-'));
2453
+ const vendorExtensions = vendorExtensionNames.reduce((previousValue, currentValue, currentIndex) => {
2454
+ return Object.assign(Object.assign({}, previousValue), { [currentValue]: data[currentValue] });
2455
+ }, {});
2456
+ return vendorExtensions;
2457
+ });
2458
+ const NodeVendorExtensions = React.memo(({ data }) => {
2459
+ const { renderExtensionAddon } = useOptionsCtx();
2460
+ if (!renderExtensionAddon) {
2461
+ return null;
2462
+ }
2463
+ const originalObject = getOriginalObject(data);
2464
+ const vendorExtensions = originalObject.extensions ? originalObject.extensions : getVendorExtensions(originalObject);
2465
+ const vendorExtensionKeys = Object.keys(vendorExtensions);
2466
+ if (vendorExtensionKeys.length === 0) {
2467
+ return null;
2468
+ }
2469
+ return (React.createElement(React.Fragment, null, renderExtensionAddon({
2470
+ nestingLevel: -1,
2471
+ schemaNode: originalObject,
2472
+ vendorExtensions,
2473
+ })));
2474
+ });
2475
+ NodeVendorExtensions.displayName = 'NodeVendorExtensions';
2476
+
2447
2477
  const TwoColumnLayout = React__default.forwardRef(({ header, right, left, className }, ref) => (React__default.createElement(VStack, { ref: ref, w: "full", className: className, spacing: 8 },
2448
2478
  header,
2449
2479
  React__default.createElement(Flex, null,
@@ -2601,7 +2631,7 @@ const Body = ({ body, onChange }) => {
2601
2631
  var _a;
2602
2632
  const [refResolver, maxRefDepth] = useSchemaInlineRefResolver();
2603
2633
  const [chosenContent, setChosenContent] = React.useState(0);
2604
- const { nodeHasChanged } = useOptionsCtx();
2634
+ const { nodeHasChanged, renderExtensionAddon } = useOptionsCtx();
2605
2635
  React.useEffect(() => {
2606
2636
  onChange === null || onChange === void 0 ? void 0 : onChange(chosenContent);
2607
2637
  }, [chosenContent]);
@@ -2616,7 +2646,7 @@ const Body = ({ body, onChange }) => {
2616
2646
  description && (React.createElement(Box, { pos: "relative" },
2617
2647
  React.createElement(MarkdownViewer, { markdown: description }),
2618
2648
  React.createElement(NodeAnnotation, { change: descriptionChanged }))),
2619
- isJSONSchema(schema) && (React.createElement(JsonSchemaViewer, { resolveRef: refResolver, maxRefDepth: maxRefDepth, schema: getOriginalObject(schema), viewMode: "write", renderRootTreeLines: true, nodeHasChanged: nodeHasChanged }))));
2649
+ isJSONSchema(schema) && (React.createElement(JsonSchemaViewer, { resolveRef: refResolver, maxRefDepth: maxRefDepth, schema: getOriginalObject(schema), viewMode: "write", renderRootTreeLines: true, nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon }))));
2620
2650
  };
2621
2651
  Body.displayName = 'HttpOperation.Body';
2622
2652
 
@@ -2640,12 +2670,12 @@ const defaultStyle = {
2640
2670
  cookie: HttpParamStyles.Form,
2641
2671
  };
2642
2672
  const Parameters = ({ parameters, parameterType }) => {
2643
- const { nodeHasChanged } = useOptionsCtx();
2673
+ const { nodeHasChanged, renderExtensionAddon } = useOptionsCtx();
2644
2674
  const [refResolver, maxRefDepth] = useSchemaInlineRefResolver();
2645
2675
  const schema = React.useMemo(() => httpOperationParamsToSchema({ parameters, parameterType }), [parameters, parameterType]);
2646
2676
  if (!schema)
2647
2677
  return null;
2648
- return (React.createElement(JsonSchemaViewer, { resolveRef: refResolver, maxRefDepth: maxRefDepth, schema: schema, disableCrumbs: true, nodeHasChanged: nodeHasChanged }));
2678
+ return (React.createElement(JsonSchemaViewer, { resolveRef: refResolver, maxRefDepth: maxRefDepth, schema: schema, disableCrumbs: true, nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon }));
2649
2679
  };
2650
2680
  Parameters.displayName = 'HttpOperation.Parameters';
2651
2681
  const httpOperationParamsToSchema = ({ parameters, parameterType }) => {
@@ -2785,7 +2815,7 @@ const Response = ({ response, onMediaTypeChange }) => {
2785
2815
  const { contents = [], headers = [], description } = response;
2786
2816
  const [chosenContent, setChosenContent] = React.useState(0);
2787
2817
  const [refResolver, maxRefDepth] = useSchemaInlineRefResolver();
2788
- const { nodeHasChanged } = useOptionsCtx();
2818
+ const { nodeHasChanged, renderExtensionAddon } = useOptionsCtx();
2789
2819
  const responseContent = contents[chosenContent];
2790
2820
  const schema = responseContent === null || responseContent === void 0 ? void 0 : responseContent.schema;
2791
2821
  React.useEffect(() => {
@@ -2803,7 +2833,7 @@ const Response = ({ response, onMediaTypeChange }) => {
2803
2833
  React.createElement(SectionSubtitle, { title: "Body", id: "response-body" },
2804
2834
  React.createElement(Flex, { flex: 1, justify: "end" },
2805
2835
  React.createElement(Select, { "aria-label": "Response Body Content Type", value: String(chosenContent), onChange: value => setChosenContent(parseInt(String(value), 10)), options: contents.map((content, index) => ({ label: content.mediaType, value: index })), size: "sm" }))),
2806
- schema && (React.createElement(JsonSchemaViewer, { schema: getOriginalObject(schema), resolveRef: refResolver, maxRefDepth: maxRefDepth, viewMode: "read", parentCrumbs: ['responses', response.code], renderRootTreeLines: true, nodeHasChanged: nodeHasChanged }))))));
2836
+ schema && (React.createElement(JsonSchemaViewer, { schema: getOriginalObject(schema), resolveRef: refResolver, maxRefDepth: maxRefDepth, viewMode: "read", parentCrumbs: ['responses', response.code], renderRootTreeLines: true, nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon }))))));
2807
2837
  };
2808
2838
  Response.displayName = 'HttpOperation.Response';
2809
2839
  const codeToIntentVal = (code) => {
@@ -2879,6 +2909,7 @@ const HttpOperationComponent = React.memo(({ className, data: unresolvedData, la
2879
2909
  data.description && (React.createElement(Box, { pos: "relative" },
2880
2910
  React.createElement(MarkdownViewer, { className: "HttpOperation__Description", markdown: data.description }),
2881
2911
  React.createElement(NodeAnnotation, { change: descriptionChanged }))),
2912
+ React.createElement(NodeVendorExtensions, { data: data }),
2882
2913
  React.createElement(Request, { onChange: setTextRequestBodyIndex, operation: data }),
2883
2914
  data.responses && (React.createElement(Responses, { responses: data.responses, onMediaTypeChange: setResponseMediaType, onStatusCodeChange: setResponseStatusCode, isCompact: isCompact })),
2884
2915
  ((_a = data.callbacks) === null || _a === void 0 ? void 0 : _a.length) ? React.createElement(Callbacks, { callbacks: data.callbacks, isCompact: isCompact }) : null,
@@ -3130,7 +3161,7 @@ const ModelComponent = ({ data: unresolvedData, className, nodeTitle, layoutOpti
3130
3161
  var _a, _b;
3131
3162
  const [resolveRef, maxRefDepth] = useSchemaInlineRefResolver();
3132
3163
  const data = useResolvedObject(unresolvedData);
3133
- const { nodeHasChanged } = useOptionsCtx();
3164
+ const { nodeHasChanged, renderExtensionAddon } = useOptionsCtx();
3134
3165
  const { ref: layoutRef, isCompact } = useIsCompact(layoutOptions);
3135
3166
  const nodeId = (_a = data === null || data === void 0 ? void 0 : data['x-stoplight']) === null || _a === void 0 ? void 0 : _a.id;
3136
3167
  const title = (_b = data.title) !== null && _b !== void 0 ? _b : nodeTitle;
@@ -3153,8 +3184,9 @@ const ModelComponent = ({ data: unresolvedData, className, nodeTitle, layoutOpti
3153
3184
  data.description && data.type === 'object' && (React.createElement(Box, { pos: "relative" },
3154
3185
  React.createElement(MarkdownViewer, { role: "textbox", markdown: data.description }),
3155
3186
  React.createElement(NodeAnnotation, { change: descriptionChanged }))),
3187
+ React.createElement(NodeVendorExtensions, { data: data }),
3156
3188
  isCompact && modelExamples,
3157
- React.createElement(JsonSchemaViewer, { resolveRef: resolveRef, maxRefDepth: maxRefDepth, schema: getOriginalObject(data), nodeHasChanged: nodeHasChanged, skipTopLevelDescription: true })));
3189
+ React.createElement(JsonSchemaViewer, { resolveRef: resolveRef, maxRefDepth: maxRefDepth, schema: getOriginalObject(data), nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon, skipTopLevelDescription: true })));
3158
3190
  return (React.createElement(TwoColumnLayout, { ref: layoutRef, className: cn('Model', className), header: header, left: description, right: !isCompact && modelExamples }));
3159
3191
  };
3160
3192
  const ModelExamples = React.memo(({ data, isCollapsible = false }) => {
@@ -3177,7 +3209,7 @@ const Model = withErrorBoundary(ModelComponent, { recoverableProps: ['data'] });
3177
3209
 
3178
3210
  const Docs = React.memo((_a) => {
3179
3211
  var _b;
3180
- var { nodeType, nodeData, useNodeForRefResolving = false, refResolver, maxRefDepth, nodeHasChanged } = _a, commonProps = __rest(_a, ["nodeType", "nodeData", "useNodeForRefResolving", "refResolver", "maxRefDepth", "nodeHasChanged"]);
3212
+ var { nodeType, nodeData, useNodeForRefResolving = false, refResolver, maxRefDepth, nodeHasChanged, renderExtensionAddon } = _a, commonProps = __rest(_a, ["nodeType", "nodeData", "useNodeForRefResolving", "refResolver", "maxRefDepth", "nodeHasChanged", "renderExtensionAddon"]);
3181
3213
  const parsedNode = useParsedData(nodeType, nodeData);
3182
3214
  if (!parsedNode) {
3183
3215
  (_b = commonProps.nodeUnsupported) === null || _b === void 0 ? void 0 : _b.call(commonProps, 'dataEmpty');
@@ -3187,7 +3219,7 @@ const Docs = React.memo((_a) => {
3187
3219
  if (useNodeForRefResolving) {
3188
3220
  elem = (React.createElement(InlineRefResolverProvider, { document: parsedNode.data, resolver: refResolver, maxRefDepth: maxRefDepth }, elem));
3189
3221
  }
3190
- return React.createElement(ElementsOptionsProvider, { nodeHasChanged: nodeHasChanged }, elem);
3222
+ return (React.createElement(ElementsOptionsProvider, { nodeHasChanged: nodeHasChanged, renderExtensionAddon: renderExtensionAddon }, elem));
3191
3223
  });
3192
3224
  const ParsedDocs = (_a) => {
3193
3225
  var { node, nodeUnsupported } = _a, commonProps = __rest(_a, ["node", "nodeUnsupported"]);
@@ -3293,6 +3325,9 @@ const NODE_META_COLOR = {
3293
3325
  put: 'warning',
3294
3326
  patch: 'warning',
3295
3327
  delete: 'danger',
3328
+ head: '#9061F9',
3329
+ options: '#0D5AA7',
3330
+ trace: '#0D0B28',
3296
3331
  };
3297
3332
 
3298
3333
  function getHtmlIdFromItemId(id) {
@@ -3646,12 +3681,13 @@ function isPartialHttpRequest(maybeHttpRequest) {
3646
3681
  }
3647
3682
  const SchemaAndDescription = ({ title: titleProp, schema }) => {
3648
3683
  const [resolveRef, maxRefDepth] = useSchemaInlineRefResolver();
3684
+ const { renderExtensionAddon } = useOptionsCtx();
3649
3685
  const title = titleProp !== null && titleProp !== void 0 ? titleProp : schema.title;
3650
3686
  return (React__default.createElement(Box, { py: 2 },
3651
3687
  title && (React__default.createElement(Flex, { alignItems: "center", p: 2 },
3652
3688
  React__default.createElement(Icon, { icon: NodeTypeIconDefs[NodeType.Model], color: NodeTypeColors[NodeType.Model] }),
3653
3689
  React__default.createElement(Box, { color: "muted", px: 2 }, title))),
3654
- React__default.createElement(JsonSchemaViewer, { resolveRef: resolveRef, maxRefDepth: maxRefDepth, schema: getOriginalObject(schema) })));
3690
+ React__default.createElement(JsonSchemaViewer, { resolveRef: resolveRef, maxRefDepth: maxRefDepth, schema: getOriginalObject(schema), renderExtensionAddon: renderExtensionAddon })));
3655
3691
  };
3656
3692
  const CodeComponent = props => {
3657
3693
  const { title, jsonSchema, http, resolved, children } = props;
@@ -3996,4 +4032,4 @@ const createElementClass = (Component, propDescriptors) => {
3996
4032
  };
3997
4033
  };
3998
4034
 
3999
- export { DeprecatedBadge, Docs, ExportButton, HttpMethodColors, InlineRefResolverProvider, LinkHeading, Logo, MarkdownComponentsProvider, MockingProvider, NodeTypeColors, NodeTypeIconDefs, NodeTypePrettyName, NonIdealState, ParsedDocs, PersistenceContextProvider, PoweredByLink, ReactRouterMarkdownLink, ResponsiveSidebarLayout, RouterTypeContext, SidebarLayout, Styled, TableOfContents, TryIt, TryItWithRequestSamples, createElementClass, createResolvedObject, findFirstNode, isHttpOperation, isHttpService, isHttpWebhookOperation, slugify, useBundleRefsIntoDocument, useParsedData, useParsedValue, useResponsiveLayout, useRouter, withMosaicProvider, withPersistenceBoundary, withQueryClientProvider, withRouter, withStyles };
4035
+ export { DeprecatedBadge, Docs, ElementsOptionsProvider, ExportButton, HttpMethodColors, InlineRefResolverProvider, LinkHeading, Logo, MarkdownComponentsProvider, MockingProvider, NodeTypeColors, NodeTypeIconDefs, NodeTypePrettyName, NonIdealState, ParsedDocs, PersistenceContextProvider, PoweredByLink, ReactRouterMarkdownLink, ResponsiveSidebarLayout, RouterTypeContext, SidebarLayout, Styled, TableOfContents, TryIt, TryItWithRequestSamples, createElementClass, createResolvedObject, findFirstNode, isHttpOperation, isHttpService, isHttpWebhookOperation, slugify, useBundleRefsIntoDocument, useParsedData, useParsedValue, useResponsiveLayout, useRouter, withMosaicProvider, withPersistenceBoundary, withQueryClientProvider, withRouter, withStyles };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stoplight/elements-core",
3
- "version": "8.2.0",
3
+ "version": "8.3.1",
4
4
  "main": "./index.js",
5
5
  "sideEffects": [
6
6
  "web-components.min.js",
@@ -25,9 +25,9 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@stoplight/http-spec": "^7.0.3",
28
- "@stoplight/json": "^3.18.1",
29
- "@stoplight/json-schema-ref-parser": "^9.0.5",
30
- "@stoplight/json-schema-sampler": "0.2.3",
28
+ "@stoplight/json": "^3.21.0",
29
+ "@stoplight/json-schema-ref-parser": "^9.2.7",
30
+ "@stoplight/json-schema-sampler": "0.3.0",
31
31
  "@stoplight/json-schema-tree": "^4.0.0",
32
32
  "@stoplight/json-schema-viewer": "4.16.1",
33
33
  "@stoplight/markdown-viewer": "^5.7.0",
@@ -37,7 +37,7 @@
37
37
  "@stoplight/path": "^1.3.2",
38
38
  "@stoplight/react-error-boundary": "^3.0.0",
39
39
  "@stoplight/types": "^14.1.1",
40
- "@stoplight/yaml": "^4.2.3",
40
+ "@stoplight/yaml": "^4.3.0",
41
41
  "classnames": "^2.2.6",
42
42
  "httpsnippet-lite": "^3.0.5",
43
43
  "jotai": "1.3.9",
@@ -1,2 +0,0 @@
1
- import { IHttpOperation } from '@stoplight/types';
2
- export declare const xcodeSamples: IHttpOperation;