@stoplight/elements-core 9.0.25 → 9.0.26

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.
@@ -4,6 +4,7 @@ export interface ResponseState {
4
4
  bodyText?: string;
5
5
  contentType: string | null;
6
6
  blob?: Blob;
7
+ skipBodyParsing?: boolean;
7
8
  }
8
9
  export interface ErrorState {
9
10
  error: Error;
package/index.esm.js CHANGED
@@ -2,7 +2,7 @@ import { __rest, __awaiter } from 'tslib';
2
2
  import * as React from 'react';
3
3
  import React__default, { useContext, memo, useMemo, useState, useEffect, useRef, useLayoutEffect } from 'react';
4
4
  import { convertToJsonSchema } from '@stoplight/http-spec/oas';
5
- import { resolveInlineRef, hasRef, isPlainObject as isPlainObject$1, safeParse, safeStringify } from '@stoplight/json';
5
+ import { resolveInlineRef, hasRef, isPlainObject as isPlainObject$1, safeStringify, safeParse } from '@stoplight/json';
6
6
  import isArray from 'lodash/isArray.js';
7
7
  import isPlainObject from 'lodash/isPlainObject.js';
8
8
  import { NodeType, HttpParamStyles } from '@stoplight/types';
@@ -16,6 +16,7 @@ export { DefaultSMDComponents } from '@stoplight/markdown-viewer';
16
16
  import cn from 'classnames';
17
17
  import { atomWithStorage, useAtomValue } from 'jotai/utils';
18
18
  import { atom, useAtom, Provider } from 'jotai';
19
+ import * as Sampler from '@stoplight/json-schema-sampler';
19
20
  import URI from 'urijs';
20
21
  import isString from 'lodash/isString.js';
21
22
  import { CodeViewer } from '@stoplight/mosaic-code-viewer';
@@ -38,7 +39,6 @@ import map from 'lodash/map.js';
38
39
  import mapValues from 'lodash/mapValues.js';
39
40
  import pickBy from 'lodash/pickBy.js';
40
41
  import { CodeEditor } from '@stoplight/mosaic-code-editor';
41
- import * as Sampler from '@stoplight/json-schema-sampler';
42
42
  import compact from 'lodash/compact.js';
43
43
  import uniq from 'lodash/uniq.js';
44
44
  import orderBy from 'lodash/orderBy.js';
@@ -652,6 +652,242 @@ function useIsCompact(layoutOptions) {
652
652
 
653
653
  const chosenServerAtom = atom(undefined);
654
654
 
655
+ const mergeOneOfAnyOf = (schema) => {
656
+ if (!isPlainObject$1(schema)) {
657
+ return schema;
658
+ }
659
+ let result = Object.assign({}, schema);
660
+ if (result.oneOf && result.oneOf.length > 0) {
661
+ const firstOption = result.oneOf[0];
662
+ const { oneOf } = result, rest = __rest(result, ["oneOf"]);
663
+ result = Object.assign(Object.assign({}, rest), firstOption);
664
+ }
665
+ else if (result.anyOf && result.anyOf.length > 0) {
666
+ const firstOption = result.anyOf[0];
667
+ const { anyOf } = result, rest = __rest(result, ["anyOf"]);
668
+ result = Object.assign(Object.assign({}, rest), firstOption);
669
+ }
670
+ if (result.properties) {
671
+ result.properties = Object.fromEntries(Object.entries(result.properties).map(([key, value]) => [key, mergeOneOfAnyOf(value)]));
672
+ }
673
+ if (result.items) {
674
+ result.items = mergeOneOfAnyOf(result.items);
675
+ }
676
+ if (result.allOf) {
677
+ result.allOf = result.allOf.map((item) => mergeOneOfAnyOf(item));
678
+ }
679
+ delete result.oneOf;
680
+ delete result.anyOf;
681
+ return result;
682
+ };
683
+ const OAS_FORMAT_RANGES = {
684
+ int32: { minimum: 0 - Math.pow(2, 31), maximum: Math.pow(2, 31) - 1 },
685
+ int64: { minimum: Number.MIN_SAFE_INTEGER, maximum: Number.MAX_SAFE_INTEGER },
686
+ float: { minimum: 0 - Math.pow(2, 128), maximum: Math.pow(2, 128) - 1 },
687
+ double: { minimum: 0 - Number.MAX_VALUE, maximum: Number.MAX_VALUE },
688
+ };
689
+ const stripInferredNumericBounds = (schema) => {
690
+ var _a;
691
+ if (!isPlainObject$1(schema)) {
692
+ return schema;
693
+ }
694
+ const result = Object.assign({}, schema);
695
+ const explicitProperties = Array.isArray((_a = result === null || result === void 0 ? void 0 : result['x-stoplight']) === null || _a === void 0 ? void 0 : _a.explicitProperties)
696
+ ? result['x-stoplight'].explicitProperties
697
+ : [];
698
+ const isNumericType = result.type === 'integer' || result.type === 'number';
699
+ const formatRange = OAS_FORMAT_RANGES[result.format];
700
+ const hasExplicitMinimum = explicitProperties.includes('minimum') && result.minimum !== (formatRange === null || formatRange === void 0 ? void 0 : formatRange.minimum);
701
+ const hasExplicitMaximum = explicitProperties.includes('maximum') && result.maximum !== (formatRange === null || formatRange === void 0 ? void 0 : formatRange.maximum);
702
+ if (isNumericType && !hasExplicitMinimum) {
703
+ delete result.minimum;
704
+ }
705
+ if (isNumericType && !hasExplicitMaximum) {
706
+ delete result.maximum;
707
+ }
708
+ if (result.properties && isPlainObject$1(result.properties)) {
709
+ result.properties = Object.fromEntries(Object.entries(result.properties).map(([key, value]) => [key, stripInferredNumericBounds(value)]));
710
+ }
711
+ if (Array.isArray(result.items)) {
712
+ result.items = result.items.map((item) => stripInferredNumericBounds(item));
713
+ }
714
+ else if (result.items) {
715
+ result.items = stripInferredNumericBounds(result.items);
716
+ }
717
+ if (Array.isArray(result.allOf)) {
718
+ result.allOf = result.allOf.map((item) => stripInferredNumericBounds(item));
719
+ }
720
+ if (Array.isArray(result.oneOf)) {
721
+ result.oneOf = result.oneOf.map((item) => stripInferredNumericBounds(item));
722
+ }
723
+ if (Array.isArray(result.anyOf)) {
724
+ result.anyOf = result.anyOf.map((item) => stripInferredNumericBounds(item));
725
+ }
726
+ return result;
727
+ };
728
+ const FLOAT_ZERO_MARKER = '__FLOAT_ZERO__';
729
+ const markFloatZeros = (value, schema) => {
730
+ if (!isPlainObject$1(schema))
731
+ return value;
732
+ if (Array.isArray(schema.allOf)) {
733
+ return schema.allOf.reduce((currentValue, item) => markFloatZeros(currentValue, item), value);
734
+ }
735
+ if (Array.isArray(schema.oneOf) && schema.oneOf.length > 0) {
736
+ return markFloatZeros(value, schema.oneOf[0]);
737
+ }
738
+ if (Array.isArray(schema.anyOf) && schema.anyOf.length > 0) {
739
+ return markFloatZeros(value, schema.anyOf[0]);
740
+ }
741
+ if (schema.type === 'number' && (schema.format === 'float' || schema.format === 'double') && value === 0) {
742
+ return FLOAT_ZERO_MARKER;
743
+ }
744
+ if (isPlainObject$1(value) && isPlainObject$1(schema.properties)) {
745
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => { var _a; return [k, markFloatZeros(v, (_a = schema.properties[k]) !== null && _a !== void 0 ? _a : {})]; }));
746
+ }
747
+ if (Array.isArray(value) && schema.items && !Array.isArray(schema.items)) {
748
+ return value.map((item) => markFloatZeros(item, schema.items));
749
+ }
750
+ return value;
751
+ };
752
+ const stringifyWithFloatZeros = (value) => {
753
+ var _a;
754
+ if (value === FLOAT_ZERO_MARKER)
755
+ return '0.0';
756
+ return ((_a = safeStringify(value, undefined, 2)) !== null && _a !== void 0 ? _a : '').replace(/"__FLOAT_ZERO__"/g, '0.0');
757
+ };
758
+ const normalizeInferredNumericBounds = (value, schema) => {
759
+ var _a;
760
+ if (!isPlainObject$1(schema))
761
+ return value;
762
+ const schemaObject = schema;
763
+ if (Array.isArray(schemaObject.allOf)) {
764
+ return schemaObject.allOf.reduce((currentValue, item) => normalizeInferredNumericBounds(currentValue, item), value);
765
+ }
766
+ if (Array.isArray(schemaObject.oneOf) && schemaObject.oneOf.length > 0) {
767
+ return normalizeInferredNumericBounds(value, schemaObject.oneOf[0]);
768
+ }
769
+ if (Array.isArray(schemaObject.anyOf) && schemaObject.anyOf.length > 0) {
770
+ return normalizeInferredNumericBounds(value, schemaObject.anyOf[0]);
771
+ }
772
+ const explicitProperties = Array.isArray((_a = schemaObject === null || schemaObject === void 0 ? void 0 : schemaObject['x-stoplight']) === null || _a === void 0 ? void 0 : _a.explicitProperties)
773
+ ? schemaObject['x-stoplight'].explicitProperties
774
+ : [];
775
+ const isNumericType = schemaObject.type === 'integer' || schemaObject.type === 'number';
776
+ const formatRange = OAS_FORMAT_RANGES[schemaObject.format];
777
+ const hasExplicitMinimum = explicitProperties.includes('minimum') && schemaObject.minimum !== (formatRange === null || formatRange === void 0 ? void 0 : formatRange.minimum);
778
+ const hasExplicitMaximum = explicitProperties.includes('maximum') && schemaObject.maximum !== (formatRange === null || formatRange === void 0 ? void 0 : formatRange.maximum);
779
+ if (isNumericType &&
780
+ formatRange &&
781
+ ((!hasExplicitMinimum && value === formatRange.minimum) || (!hasExplicitMaximum && value === formatRange.maximum))) {
782
+ return schemaObject.type === 'number' && (schemaObject.format === 'float' || schemaObject.format === 'double')
783
+ ? FLOAT_ZERO_MARKER
784
+ : 0;
785
+ }
786
+ if (isPlainObject$1(value) && isPlainObject$1(schemaObject.properties)) {
787
+ return Object.fromEntries(Object.entries(value).map(([key, nestedValue]) => {
788
+ var _a;
789
+ return [
790
+ key,
791
+ normalizeInferredNumericBounds(nestedValue, (_a = schemaObject.properties[key]) !== null && _a !== void 0 ? _a : {}),
792
+ ];
793
+ }));
794
+ }
795
+ if (Array.isArray(value) && schemaObject.items && !Array.isArray(schemaObject.items)) {
796
+ return value.map((item) => normalizeInferredNumericBounds(item, schemaObject.items));
797
+ }
798
+ if (Array.isArray(value) && Array.isArray(schemaObject.items)) {
799
+ return value.map((item, index) => normalizeInferredNumericBounds(item, schemaObject.items[index]));
800
+ }
801
+ return value;
802
+ };
803
+ const stringifyExampleWithResolvedSchema = (value, schema) => {
804
+ const normalizedValue = normalizeInferredNumericBounds(value, schema);
805
+ return stringifyWithFloatZeros(markFloatZeros(normalizedValue, schema));
806
+ };
807
+ const useGenerateExampleFromMediaTypeContent = (mediaTypeContent, chosenExampleIndex, { skipReadOnly, skipWriteOnly, skipNonRequired, ticks } = {}) => {
808
+ const document = useDocument();
809
+ return React__default.useMemo(() => generateExampleFromMediaTypeContent(mediaTypeContent, document, chosenExampleIndex, {
810
+ skipNonRequired,
811
+ skipWriteOnly,
812
+ skipReadOnly,
813
+ ticks: ticks || 6000,
814
+ }), [mediaTypeContent, document, chosenExampleIndex, skipNonRequired, skipWriteOnly, skipReadOnly, ticks]);
815
+ };
816
+ const generateExampleFromMediaTypeContent = (mediaTypeContent, document, chosenExampleIndex = 0, options) => {
817
+ var _a;
818
+ const textRequestBodySchema = mediaTypeContent === null || mediaTypeContent === void 0 ? void 0 : mediaTypeContent.schema;
819
+ const textRequestBodyExamples = mediaTypeContent === null || mediaTypeContent === void 0 ? void 0 : mediaTypeContent.examples;
820
+ try {
821
+ if (textRequestBodyExamples === null || textRequestBodyExamples === void 0 ? void 0 : textRequestBodyExamples.length) {
822
+ return ((_a = safeStringify(textRequestBodyExamples === null || textRequestBodyExamples === void 0 ? void 0 : textRequestBodyExamples[chosenExampleIndex]['value'], undefined, 2)) !== null && _a !== void 0 ? _a : '');
823
+ }
824
+ else if (textRequestBodySchema) {
825
+ let unwrappedSchema = getResolvedObject(textRequestBodySchema);
826
+ unwrappedSchema = stripInferredNumericBounds(unwrappedSchema);
827
+ unwrappedSchema = mergeOneOfAnyOf(unwrappedSchema);
828
+ const generated = Sampler.sample(unwrappedSchema, options, document);
829
+ if (generated === null)
830
+ return '';
831
+ return stringifyExampleWithResolvedSchema(generated, unwrappedSchema);
832
+ }
833
+ }
834
+ catch (e) {
835
+ console.warn(e);
836
+ return `Example cannot be created for this schema\n${e}`;
837
+ }
838
+ return '';
839
+ };
840
+ const generateExamplesFromJsonSchema = (schema) => {
841
+ var _a;
842
+ const examples = [];
843
+ if (Array.isArray(schema === null || schema === void 0 ? void 0 : schema.examples)) {
844
+ schema.examples.forEach((example, index) => {
845
+ var _a;
846
+ examples.push({
847
+ data: (_a = safeStringify(example, undefined, 2)) !== null && _a !== void 0 ? _a : '',
848
+ label: index === 0 ? 'default' : `example-${index}`,
849
+ });
850
+ });
851
+ }
852
+ else if (isPlainObject$1(schema === null || schema === void 0 ? void 0 : schema['x-examples'])) {
853
+ for (const [label, example] of Object.entries(schema['x-examples'])) {
854
+ if (isPlainObject$1(example)) {
855
+ const val = example.hasOwnProperty('value') && Object.keys(example).length === 1 ? example.value : example;
856
+ examples.push({
857
+ label,
858
+ data: (_a = safeStringify(val, undefined, 2)) !== null && _a !== void 0 ? _a : '',
859
+ });
860
+ }
861
+ }
862
+ }
863
+ if (examples.length) {
864
+ return examples;
865
+ }
866
+ try {
867
+ let resolvedSchema = getResolvedObject(schema);
868
+ resolvedSchema = stripInferredNumericBounds(resolvedSchema);
869
+ resolvedSchema = mergeOneOfAnyOf(resolvedSchema);
870
+ const generated = Sampler.sample(resolvedSchema, {
871
+ maxSampleDepth: 4,
872
+ ticks: 6000,
873
+ });
874
+ return generated !== null
875
+ ? [
876
+ {
877
+ label: 'default',
878
+ data: stringifyExampleWithResolvedSchema(generated, resolvedSchema),
879
+ },
880
+ ]
881
+ : [{ label: 'default', data: '' }];
882
+ }
883
+ catch (e) {
884
+ return [{ label: '', data: `Example cannot be created for this schema\n${e}` }];
885
+ }
886
+ };
887
+ const exceedsSize = (example, size = 500) => {
888
+ return example.split(/\r\n|\r|\n/).length > size;
889
+ };
890
+
655
891
  function isValidServer(server) {
656
892
  return server.url !== null;
657
893
  }
@@ -1818,114 +2054,6 @@ function ExampleMenu({ examples, requestBody, onChange }) {
1818
2054
  return (React.createElement(Menu, { "aria-label": "Examples", items: menuItems, renderTrigger: ({ isOpen }) => (React.createElement(Button, { appearance: "minimal", size: "sm", iconRight: ['fas', 'sort'], active: isOpen }, "Examples")) }));
1819
2055
  }
1820
2056
 
1821
- const mergeOneOfAnyOf = (schema) => {
1822
- if (!isPlainObject$1(schema)) {
1823
- return schema;
1824
- }
1825
- let result = Object.assign({}, schema);
1826
- if (result.oneOf && result.oneOf.length > 0) {
1827
- const firstOption = result.oneOf[0];
1828
- const { oneOf } = result, rest = __rest(result, ["oneOf"]);
1829
- result = Object.assign(Object.assign({}, rest), firstOption);
1830
- }
1831
- else if (result.anyOf && result.anyOf.length > 0) {
1832
- const firstOption = result.anyOf[0];
1833
- const { anyOf } = result, rest = __rest(result, ["anyOf"]);
1834
- result = Object.assign(Object.assign({}, rest), firstOption);
1835
- }
1836
- if (result.properties) {
1837
- result.properties = Object.fromEntries(Object.entries(result.properties).map(([key, value]) => [key, mergeOneOfAnyOf(value)]));
1838
- }
1839
- if (result.items) {
1840
- result.items = mergeOneOfAnyOf(result.items);
1841
- }
1842
- if (result.allOf) {
1843
- result.allOf = result.allOf.map((item) => mergeOneOfAnyOf(item));
1844
- }
1845
- delete result.oneOf;
1846
- delete result.anyOf;
1847
- return result;
1848
- };
1849
- const useGenerateExampleFromMediaTypeContent = (mediaTypeContent, chosenExampleIndex, { skipReadOnly, skipWriteOnly, skipNonRequired, ticks } = {}) => {
1850
- const document = useDocument();
1851
- return React__default.useMemo(() => generateExampleFromMediaTypeContent(mediaTypeContent, document, chosenExampleIndex, {
1852
- skipNonRequired,
1853
- skipWriteOnly,
1854
- skipReadOnly,
1855
- ticks: ticks || 6000,
1856
- }), [mediaTypeContent, document, chosenExampleIndex, skipNonRequired, skipWriteOnly, skipReadOnly, ticks]);
1857
- };
1858
- const generateExampleFromMediaTypeContent = (mediaTypeContent, document, chosenExampleIndex = 0, options) => {
1859
- var _a, _b;
1860
- const textRequestBodySchema = mediaTypeContent === null || mediaTypeContent === void 0 ? void 0 : mediaTypeContent.schema;
1861
- const textRequestBodyExamples = mediaTypeContent === null || mediaTypeContent === void 0 ? void 0 : mediaTypeContent.examples;
1862
- try {
1863
- if (textRequestBodyExamples === null || textRequestBodyExamples === void 0 ? void 0 : textRequestBodyExamples.length) {
1864
- return ((_a = safeStringify(textRequestBodyExamples === null || textRequestBodyExamples === void 0 ? void 0 : textRequestBodyExamples[chosenExampleIndex]['value'], undefined, 2)) !== null && _a !== void 0 ? _a : '');
1865
- }
1866
- else if (textRequestBodySchema) {
1867
- let unwrappedSchema = getResolvedObject(textRequestBodySchema);
1868
- unwrappedSchema = mergeOneOfAnyOf(unwrappedSchema);
1869
- const generated = Sampler.sample(unwrappedSchema, options, document);
1870
- return generated !== null ? (_b = safeStringify(generated, undefined, 2)) !== null && _b !== void 0 ? _b : '' : '';
1871
- }
1872
- }
1873
- catch (e) {
1874
- console.warn(e);
1875
- return `Example cannot be created for this schema\n${e}`;
1876
- }
1877
- return '';
1878
- };
1879
- const generateExamplesFromJsonSchema = (schema) => {
1880
- var _a, _b;
1881
- const examples = [];
1882
- if (Array.isArray(schema === null || schema === void 0 ? void 0 : schema.examples)) {
1883
- schema.examples.forEach((example, index) => {
1884
- var _a;
1885
- examples.push({
1886
- data: (_a = safeStringify(example, undefined, 2)) !== null && _a !== void 0 ? _a : '',
1887
- label: index === 0 ? 'default' : `example-${index}`,
1888
- });
1889
- });
1890
- }
1891
- else if (isPlainObject$1(schema === null || schema === void 0 ? void 0 : schema['x-examples'])) {
1892
- for (const [label, example] of Object.entries(schema['x-examples'])) {
1893
- if (isPlainObject$1(example)) {
1894
- const val = example.hasOwnProperty('value') && Object.keys(example).length === 1 ? example.value : example;
1895
- examples.push({
1896
- label,
1897
- data: (_a = safeStringify(val, undefined, 2)) !== null && _a !== void 0 ? _a : '',
1898
- });
1899
- }
1900
- }
1901
- }
1902
- if (examples.length) {
1903
- return examples;
1904
- }
1905
- try {
1906
- let resolvedSchema = getResolvedObject(schema);
1907
- resolvedSchema = mergeOneOfAnyOf(resolvedSchema);
1908
- const generated = Sampler.sample(resolvedSchema, {
1909
- maxSampleDepth: 4,
1910
- ticks: 6000,
1911
- });
1912
- return generated !== null
1913
- ? [
1914
- {
1915
- label: 'default',
1916
- data: (_b = safeStringify(generated, undefined, 2)) !== null && _b !== void 0 ? _b : '',
1917
- },
1918
- ]
1919
- : [{ label: 'default', data: '' }];
1920
- }
1921
- catch (e) {
1922
- return [{ label: '', data: `Example cannot be created for this schema\n${e}` }];
1923
- }
1924
- };
1925
- const exceedsSize = (example, size = 500) => {
1926
- return example.split(/\r\n|\r|\n/).length > size;
1927
- };
1928
-
1929
2057
  const useTextRequestBodyState = (mediaTypeContent, skipReadOnly) => {
1930
2058
  const initialRequestBody = useGenerateExampleFromMediaTypeContent(mediaTypeContent, undefined, {
1931
2059
  skipReadOnly,
@@ -2410,7 +2538,7 @@ const TryItResponse = ({ response }) => {
2410
2538
  React.createElement(Panel.Content, null,
2411
2539
  React.createElement("div", null,
2412
2540
  React.createElement("div", { className: `sl-mb-3 sl-text-${getHttpCodeColor(response.status)}` }, `${response.status} ${(_a = HttpCodeDescriptions[response.status]) !== null && _a !== void 0 ? _a : ''}`),
2413
- response.bodyText && responseType && ['json', 'xml', 'text'].includes(responseType) ? (React.createElement(ResponseCodeViewer, { language: "json", value: responseType && bodyFormat === 'preview'
2541
+ response.bodyText && responseType && ['json', 'xml', 'text'].includes(responseType) ? (React.createElement(ResponseCodeViewer, { language: "json", value: responseType && bodyFormat === 'preview' && !response.skipBodyParsing
2414
2542
  ? parseBody(response.bodyText, responseType)
2415
2543
  : response.bodyText })) : response.blob && responseType === 'image' ? (React.createElement(Flex, { justifyContent: "center" },
2416
2544
  React.createElement(Image, { src: URL.createObjectURL(response.blob), alt: "response image" }))) : !response.bodyText ? null : (React.createElement("p", null,
@@ -2513,6 +2641,12 @@ const ServerVariables = ({ variables, values, onChangeValue }) => {
2513
2641
  };
2514
2642
 
2515
2643
  const defaultServers = [];
2644
+ const findResponseForStatus = (httpOperation, status) => {
2645
+ var _a, _b;
2646
+ const statusCode = String(status);
2647
+ const statusRange = `${Math.floor(status / 100)}XX`;
2648
+ return ((_b = (_a = httpOperation.responses.find(({ code }) => code === statusCode)) !== null && _a !== void 0 ? _a : httpOperation.responses.find(({ code }) => code.toUpperCase() === statusRange)) !== null && _b !== void 0 ? _b : httpOperation.responses.find(({ code }) => code === 'default'));
2649
+ };
2516
2650
  const TryIt = ({ httpOperation, mockUrl, onRequestChange, requestBodyIndex, embeddedInMd = false, hideTryItPanel = false, tryItCredentialsPolicy, corsProxy, }) => {
2517
2651
  var _a, _b, _c, _d, _e, _f;
2518
2652
  TryIt.displayName = 'TryIt';
@@ -2592,6 +2726,7 @@ const TryIt = ({ httpOperation, mockUrl, onRequestChange, requestBodyIndex, embe
2592
2726
  embeddedInMd,
2593
2727
  ]);
2594
2728
  const handleSendRequest = () => __awaiter(void 0, void 0, void 0, function* () {
2729
+ var _g, _h, _j;
2595
2730
  setValidateParameters(true);
2596
2731
  if (hasRequiredButEmptyParameters || !isHttpOperation(httpOperation))
2597
2732
  return;
@@ -2624,14 +2759,28 @@ const TryIt = ({ httpOperation, mockUrl, onRequestChange, requestBodyIndex, embe
2624
2759
  if (response) {
2625
2760
  const contentType = response.headers.get('Content-Type');
2626
2761
  const type = contentType ? getResponseType(contentType) : undefined;
2627
- const bodyText = type !== 'image' ? yield response.text() : undefined;
2762
+ let bodyText = type !== 'image' ? yield response.text() : undefined;
2628
2763
  const blob = type === 'image' ? yield response.blob() : undefined;
2764
+ let skipBodyParsing = false;
2765
+ if (mockData && type === 'json' && bodyText) {
2766
+ const responseMediaType = contentType === null || contentType === void 0 ? void 0 : contentType.split(';')[0];
2767
+ const responseSchema = (_j = (_h = (_g = findResponseForStatus(httpOperation, response.status)) === null || _g === void 0 ? void 0 : _g.contents) === null || _h === void 0 ? void 0 : _h.find(({ mediaType }) => mediaType === responseMediaType)) === null || _j === void 0 ? void 0 : _j.schema;
2768
+ if (responseSchema) {
2769
+ try {
2770
+ bodyText = stringifyExampleWithResolvedSchema(JSON.parse(bodyText), responseSchema);
2771
+ skipBodyParsing = true;
2772
+ }
2773
+ catch (_k) {
2774
+ }
2775
+ }
2776
+ }
2629
2777
  setResponse(undefined);
2630
2778
  setResponse({
2631
2779
  status: response.status,
2632
2780
  bodyText,
2633
2781
  blob,
2634
2782
  contentType,
2783
+ skipBodyParsing,
2635
2784
  });
2636
2785
  }
2637
2786
  }
package/index.js CHANGED
@@ -16,6 +16,7 @@ var markdownViewer = require('@stoplight/markdown-viewer');
16
16
  var cn = require('classnames');
17
17
  var utils = require('jotai/utils');
18
18
  var jotai = require('jotai');
19
+ var Sampler = require('@stoplight/json-schema-sampler');
19
20
  var URI = require('urijs');
20
21
  var isString = require('lodash/isString.js');
21
22
  var mosaicCodeViewer = require('@stoplight/mosaic-code-viewer');
@@ -38,7 +39,6 @@ var map = require('lodash/map.js');
38
39
  var mapValues = require('lodash/mapValues.js');
39
40
  var pickBy = require('lodash/pickBy.js');
40
41
  var mosaicCodeEditor = require('@stoplight/mosaic-code-editor');
41
- var Sampler = require('@stoplight/json-schema-sampler');
42
42
  var compact = require('lodash/compact.js');
43
43
  var uniq = require('lodash/uniq.js');
44
44
  var orderBy = require('lodash/orderBy.js');
@@ -673,6 +673,242 @@ function useIsCompact(layoutOptions) {
673
673
 
674
674
  const chosenServerAtom = jotai.atom(undefined);
675
675
 
676
+ const mergeOneOfAnyOf = (schema) => {
677
+ if (!json.isPlainObject(schema)) {
678
+ return schema;
679
+ }
680
+ let result = Object.assign({}, schema);
681
+ if (result.oneOf && result.oneOf.length > 0) {
682
+ const firstOption = result.oneOf[0];
683
+ const { oneOf } = result, rest = tslib.__rest(result, ["oneOf"]);
684
+ result = Object.assign(Object.assign({}, rest), firstOption);
685
+ }
686
+ else if (result.anyOf && result.anyOf.length > 0) {
687
+ const firstOption = result.anyOf[0];
688
+ const { anyOf } = result, rest = tslib.__rest(result, ["anyOf"]);
689
+ result = Object.assign(Object.assign({}, rest), firstOption);
690
+ }
691
+ if (result.properties) {
692
+ result.properties = Object.fromEntries(Object.entries(result.properties).map(([key, value]) => [key, mergeOneOfAnyOf(value)]));
693
+ }
694
+ if (result.items) {
695
+ result.items = mergeOneOfAnyOf(result.items);
696
+ }
697
+ if (result.allOf) {
698
+ result.allOf = result.allOf.map((item) => mergeOneOfAnyOf(item));
699
+ }
700
+ delete result.oneOf;
701
+ delete result.anyOf;
702
+ return result;
703
+ };
704
+ const OAS_FORMAT_RANGES = {
705
+ int32: { minimum: 0 - Math.pow(2, 31), maximum: Math.pow(2, 31) - 1 },
706
+ int64: { minimum: Number.MIN_SAFE_INTEGER, maximum: Number.MAX_SAFE_INTEGER },
707
+ float: { minimum: 0 - Math.pow(2, 128), maximum: Math.pow(2, 128) - 1 },
708
+ double: { minimum: 0 - Number.MAX_VALUE, maximum: Number.MAX_VALUE },
709
+ };
710
+ const stripInferredNumericBounds = (schema) => {
711
+ var _a;
712
+ if (!json.isPlainObject(schema)) {
713
+ return schema;
714
+ }
715
+ const result = Object.assign({}, schema);
716
+ const explicitProperties = Array.isArray((_a = result === null || result === void 0 ? void 0 : result['x-stoplight']) === null || _a === void 0 ? void 0 : _a.explicitProperties)
717
+ ? result['x-stoplight'].explicitProperties
718
+ : [];
719
+ const isNumericType = result.type === 'integer' || result.type === 'number';
720
+ const formatRange = OAS_FORMAT_RANGES[result.format];
721
+ const hasExplicitMinimum = explicitProperties.includes('minimum') && result.minimum !== (formatRange === null || formatRange === void 0 ? void 0 : formatRange.minimum);
722
+ const hasExplicitMaximum = explicitProperties.includes('maximum') && result.maximum !== (formatRange === null || formatRange === void 0 ? void 0 : formatRange.maximum);
723
+ if (isNumericType && !hasExplicitMinimum) {
724
+ delete result.minimum;
725
+ }
726
+ if (isNumericType && !hasExplicitMaximum) {
727
+ delete result.maximum;
728
+ }
729
+ if (result.properties && json.isPlainObject(result.properties)) {
730
+ result.properties = Object.fromEntries(Object.entries(result.properties).map(([key, value]) => [key, stripInferredNumericBounds(value)]));
731
+ }
732
+ if (Array.isArray(result.items)) {
733
+ result.items = result.items.map((item) => stripInferredNumericBounds(item));
734
+ }
735
+ else if (result.items) {
736
+ result.items = stripInferredNumericBounds(result.items);
737
+ }
738
+ if (Array.isArray(result.allOf)) {
739
+ result.allOf = result.allOf.map((item) => stripInferredNumericBounds(item));
740
+ }
741
+ if (Array.isArray(result.oneOf)) {
742
+ result.oneOf = result.oneOf.map((item) => stripInferredNumericBounds(item));
743
+ }
744
+ if (Array.isArray(result.anyOf)) {
745
+ result.anyOf = result.anyOf.map((item) => stripInferredNumericBounds(item));
746
+ }
747
+ return result;
748
+ };
749
+ const FLOAT_ZERO_MARKER = '__FLOAT_ZERO__';
750
+ const markFloatZeros = (value, schema) => {
751
+ if (!json.isPlainObject(schema))
752
+ return value;
753
+ if (Array.isArray(schema.allOf)) {
754
+ return schema.allOf.reduce((currentValue, item) => markFloatZeros(currentValue, item), value);
755
+ }
756
+ if (Array.isArray(schema.oneOf) && schema.oneOf.length > 0) {
757
+ return markFloatZeros(value, schema.oneOf[0]);
758
+ }
759
+ if (Array.isArray(schema.anyOf) && schema.anyOf.length > 0) {
760
+ return markFloatZeros(value, schema.anyOf[0]);
761
+ }
762
+ if (schema.type === 'number' && (schema.format === 'float' || schema.format === 'double') && value === 0) {
763
+ return FLOAT_ZERO_MARKER;
764
+ }
765
+ if (json.isPlainObject(value) && json.isPlainObject(schema.properties)) {
766
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => { var _a; return [k, markFloatZeros(v, (_a = schema.properties[k]) !== null && _a !== void 0 ? _a : {})]; }));
767
+ }
768
+ if (Array.isArray(value) && schema.items && !Array.isArray(schema.items)) {
769
+ return value.map((item) => markFloatZeros(item, schema.items));
770
+ }
771
+ return value;
772
+ };
773
+ const stringifyWithFloatZeros = (value) => {
774
+ var _a;
775
+ if (value === FLOAT_ZERO_MARKER)
776
+ return '0.0';
777
+ return ((_a = json.safeStringify(value, undefined, 2)) !== null && _a !== void 0 ? _a : '').replace(/"__FLOAT_ZERO__"/g, '0.0');
778
+ };
779
+ const normalizeInferredNumericBounds = (value, schema) => {
780
+ var _a;
781
+ if (!json.isPlainObject(schema))
782
+ return value;
783
+ const schemaObject = schema;
784
+ if (Array.isArray(schemaObject.allOf)) {
785
+ return schemaObject.allOf.reduce((currentValue, item) => normalizeInferredNumericBounds(currentValue, item), value);
786
+ }
787
+ if (Array.isArray(schemaObject.oneOf) && schemaObject.oneOf.length > 0) {
788
+ return normalizeInferredNumericBounds(value, schemaObject.oneOf[0]);
789
+ }
790
+ if (Array.isArray(schemaObject.anyOf) && schemaObject.anyOf.length > 0) {
791
+ return normalizeInferredNumericBounds(value, schemaObject.anyOf[0]);
792
+ }
793
+ const explicitProperties = Array.isArray((_a = schemaObject === null || schemaObject === void 0 ? void 0 : schemaObject['x-stoplight']) === null || _a === void 0 ? void 0 : _a.explicitProperties)
794
+ ? schemaObject['x-stoplight'].explicitProperties
795
+ : [];
796
+ const isNumericType = schemaObject.type === 'integer' || schemaObject.type === 'number';
797
+ const formatRange = OAS_FORMAT_RANGES[schemaObject.format];
798
+ const hasExplicitMinimum = explicitProperties.includes('minimum') && schemaObject.minimum !== (formatRange === null || formatRange === void 0 ? void 0 : formatRange.minimum);
799
+ const hasExplicitMaximum = explicitProperties.includes('maximum') && schemaObject.maximum !== (formatRange === null || formatRange === void 0 ? void 0 : formatRange.maximum);
800
+ if (isNumericType &&
801
+ formatRange &&
802
+ ((!hasExplicitMinimum && value === formatRange.minimum) || (!hasExplicitMaximum && value === formatRange.maximum))) {
803
+ return schemaObject.type === 'number' && (schemaObject.format === 'float' || schemaObject.format === 'double')
804
+ ? FLOAT_ZERO_MARKER
805
+ : 0;
806
+ }
807
+ if (json.isPlainObject(value) && json.isPlainObject(schemaObject.properties)) {
808
+ return Object.fromEntries(Object.entries(value).map(([key, nestedValue]) => {
809
+ var _a;
810
+ return [
811
+ key,
812
+ normalizeInferredNumericBounds(nestedValue, (_a = schemaObject.properties[key]) !== null && _a !== void 0 ? _a : {}),
813
+ ];
814
+ }));
815
+ }
816
+ if (Array.isArray(value) && schemaObject.items && !Array.isArray(schemaObject.items)) {
817
+ return value.map((item) => normalizeInferredNumericBounds(item, schemaObject.items));
818
+ }
819
+ if (Array.isArray(value) && Array.isArray(schemaObject.items)) {
820
+ return value.map((item, index) => normalizeInferredNumericBounds(item, schemaObject.items[index]));
821
+ }
822
+ return value;
823
+ };
824
+ const stringifyExampleWithResolvedSchema = (value, schema) => {
825
+ const normalizedValue = normalizeInferredNumericBounds(value, schema);
826
+ return stringifyWithFloatZeros(markFloatZeros(normalizedValue, schema));
827
+ };
828
+ const useGenerateExampleFromMediaTypeContent = (mediaTypeContent, chosenExampleIndex, { skipReadOnly, skipWriteOnly, skipNonRequired, ticks } = {}) => {
829
+ const document = useDocument();
830
+ return React.useMemo(() => generateExampleFromMediaTypeContent(mediaTypeContent, document, chosenExampleIndex, {
831
+ skipNonRequired,
832
+ skipWriteOnly,
833
+ skipReadOnly,
834
+ ticks: ticks || 6000,
835
+ }), [mediaTypeContent, document, chosenExampleIndex, skipNonRequired, skipWriteOnly, skipReadOnly, ticks]);
836
+ };
837
+ const generateExampleFromMediaTypeContent = (mediaTypeContent, document, chosenExampleIndex = 0, options) => {
838
+ var _a;
839
+ const textRequestBodySchema = mediaTypeContent === null || mediaTypeContent === void 0 ? void 0 : mediaTypeContent.schema;
840
+ const textRequestBodyExamples = mediaTypeContent === null || mediaTypeContent === void 0 ? void 0 : mediaTypeContent.examples;
841
+ try {
842
+ if (textRequestBodyExamples === null || textRequestBodyExamples === void 0 ? void 0 : textRequestBodyExamples.length) {
843
+ return ((_a = json.safeStringify(textRequestBodyExamples === null || textRequestBodyExamples === void 0 ? void 0 : textRequestBodyExamples[chosenExampleIndex]['value'], undefined, 2)) !== null && _a !== void 0 ? _a : '');
844
+ }
845
+ else if (textRequestBodySchema) {
846
+ let unwrappedSchema = getResolvedObject(textRequestBodySchema);
847
+ unwrappedSchema = stripInferredNumericBounds(unwrappedSchema);
848
+ unwrappedSchema = mergeOneOfAnyOf(unwrappedSchema);
849
+ const generated = Sampler__namespace.sample(unwrappedSchema, options, document);
850
+ if (generated === null)
851
+ return '';
852
+ return stringifyExampleWithResolvedSchema(generated, unwrappedSchema);
853
+ }
854
+ }
855
+ catch (e) {
856
+ console.warn(e);
857
+ return `Example cannot be created for this schema\n${e}`;
858
+ }
859
+ return '';
860
+ };
861
+ const generateExamplesFromJsonSchema = (schema) => {
862
+ var _a;
863
+ const examples = [];
864
+ if (Array.isArray(schema === null || schema === void 0 ? void 0 : schema.examples)) {
865
+ schema.examples.forEach((example, index) => {
866
+ var _a;
867
+ examples.push({
868
+ data: (_a = json.safeStringify(example, undefined, 2)) !== null && _a !== void 0 ? _a : '',
869
+ label: index === 0 ? 'default' : `example-${index}`,
870
+ });
871
+ });
872
+ }
873
+ else if (json.isPlainObject(schema === null || schema === void 0 ? void 0 : schema['x-examples'])) {
874
+ for (const [label, example] of Object.entries(schema['x-examples'])) {
875
+ if (json.isPlainObject(example)) {
876
+ const val = example.hasOwnProperty('value') && Object.keys(example).length === 1 ? example.value : example;
877
+ examples.push({
878
+ label,
879
+ data: (_a = json.safeStringify(val, undefined, 2)) !== null && _a !== void 0 ? _a : '',
880
+ });
881
+ }
882
+ }
883
+ }
884
+ if (examples.length) {
885
+ return examples;
886
+ }
887
+ try {
888
+ let resolvedSchema = getResolvedObject(schema);
889
+ resolvedSchema = stripInferredNumericBounds(resolvedSchema);
890
+ resolvedSchema = mergeOneOfAnyOf(resolvedSchema);
891
+ const generated = Sampler__namespace.sample(resolvedSchema, {
892
+ maxSampleDepth: 4,
893
+ ticks: 6000,
894
+ });
895
+ return generated !== null
896
+ ? [
897
+ {
898
+ label: 'default',
899
+ data: stringifyExampleWithResolvedSchema(generated, resolvedSchema),
900
+ },
901
+ ]
902
+ : [{ label: 'default', data: '' }];
903
+ }
904
+ catch (e) {
905
+ return [{ label: '', data: `Example cannot be created for this schema\n${e}` }];
906
+ }
907
+ };
908
+ const exceedsSize = (example, size = 500) => {
909
+ return example.split(/\r\n|\r|\n/).length > size;
910
+ };
911
+
676
912
  function isValidServer(server) {
677
913
  return server.url !== null;
678
914
  }
@@ -1839,114 +2075,6 @@ function ExampleMenu({ examples, requestBody, onChange }) {
1839
2075
  return (React__namespace.createElement(mosaic.Menu, { "aria-label": "Examples", items: menuItems, renderTrigger: ({ isOpen }) => (React__namespace.createElement(mosaic.Button, { appearance: "minimal", size: "sm", iconRight: ['fas', 'sort'], active: isOpen }, "Examples")) }));
1840
2076
  }
1841
2077
 
1842
- const mergeOneOfAnyOf = (schema) => {
1843
- if (!json.isPlainObject(schema)) {
1844
- return schema;
1845
- }
1846
- let result = Object.assign({}, schema);
1847
- if (result.oneOf && result.oneOf.length > 0) {
1848
- const firstOption = result.oneOf[0];
1849
- const { oneOf } = result, rest = tslib.__rest(result, ["oneOf"]);
1850
- result = Object.assign(Object.assign({}, rest), firstOption);
1851
- }
1852
- else if (result.anyOf && result.anyOf.length > 0) {
1853
- const firstOption = result.anyOf[0];
1854
- const { anyOf } = result, rest = tslib.__rest(result, ["anyOf"]);
1855
- result = Object.assign(Object.assign({}, rest), firstOption);
1856
- }
1857
- if (result.properties) {
1858
- result.properties = Object.fromEntries(Object.entries(result.properties).map(([key, value]) => [key, mergeOneOfAnyOf(value)]));
1859
- }
1860
- if (result.items) {
1861
- result.items = mergeOneOfAnyOf(result.items);
1862
- }
1863
- if (result.allOf) {
1864
- result.allOf = result.allOf.map((item) => mergeOneOfAnyOf(item));
1865
- }
1866
- delete result.oneOf;
1867
- delete result.anyOf;
1868
- return result;
1869
- };
1870
- const useGenerateExampleFromMediaTypeContent = (mediaTypeContent, chosenExampleIndex, { skipReadOnly, skipWriteOnly, skipNonRequired, ticks } = {}) => {
1871
- const document = useDocument();
1872
- return React.useMemo(() => generateExampleFromMediaTypeContent(mediaTypeContent, document, chosenExampleIndex, {
1873
- skipNonRequired,
1874
- skipWriteOnly,
1875
- skipReadOnly,
1876
- ticks: ticks || 6000,
1877
- }), [mediaTypeContent, document, chosenExampleIndex, skipNonRequired, skipWriteOnly, skipReadOnly, ticks]);
1878
- };
1879
- const generateExampleFromMediaTypeContent = (mediaTypeContent, document, chosenExampleIndex = 0, options) => {
1880
- var _a, _b;
1881
- const textRequestBodySchema = mediaTypeContent === null || mediaTypeContent === void 0 ? void 0 : mediaTypeContent.schema;
1882
- const textRequestBodyExamples = mediaTypeContent === null || mediaTypeContent === void 0 ? void 0 : mediaTypeContent.examples;
1883
- try {
1884
- if (textRequestBodyExamples === null || textRequestBodyExamples === void 0 ? void 0 : textRequestBodyExamples.length) {
1885
- return ((_a = json.safeStringify(textRequestBodyExamples === null || textRequestBodyExamples === void 0 ? void 0 : textRequestBodyExamples[chosenExampleIndex]['value'], undefined, 2)) !== null && _a !== void 0 ? _a : '');
1886
- }
1887
- else if (textRequestBodySchema) {
1888
- let unwrappedSchema = getResolvedObject(textRequestBodySchema);
1889
- unwrappedSchema = mergeOneOfAnyOf(unwrappedSchema);
1890
- const generated = Sampler__namespace.sample(unwrappedSchema, options, document);
1891
- return generated !== null ? (_b = json.safeStringify(generated, undefined, 2)) !== null && _b !== void 0 ? _b : '' : '';
1892
- }
1893
- }
1894
- catch (e) {
1895
- console.warn(e);
1896
- return `Example cannot be created for this schema\n${e}`;
1897
- }
1898
- return '';
1899
- };
1900
- const generateExamplesFromJsonSchema = (schema) => {
1901
- var _a, _b;
1902
- const examples = [];
1903
- if (Array.isArray(schema === null || schema === void 0 ? void 0 : schema.examples)) {
1904
- schema.examples.forEach((example, index) => {
1905
- var _a;
1906
- examples.push({
1907
- data: (_a = json.safeStringify(example, undefined, 2)) !== null && _a !== void 0 ? _a : '',
1908
- label: index === 0 ? 'default' : `example-${index}`,
1909
- });
1910
- });
1911
- }
1912
- else if (json.isPlainObject(schema === null || schema === void 0 ? void 0 : schema['x-examples'])) {
1913
- for (const [label, example] of Object.entries(schema['x-examples'])) {
1914
- if (json.isPlainObject(example)) {
1915
- const val = example.hasOwnProperty('value') && Object.keys(example).length === 1 ? example.value : example;
1916
- examples.push({
1917
- label,
1918
- data: (_a = json.safeStringify(val, undefined, 2)) !== null && _a !== void 0 ? _a : '',
1919
- });
1920
- }
1921
- }
1922
- }
1923
- if (examples.length) {
1924
- return examples;
1925
- }
1926
- try {
1927
- let resolvedSchema = getResolvedObject(schema);
1928
- resolvedSchema = mergeOneOfAnyOf(resolvedSchema);
1929
- const generated = Sampler__namespace.sample(resolvedSchema, {
1930
- maxSampleDepth: 4,
1931
- ticks: 6000,
1932
- });
1933
- return generated !== null
1934
- ? [
1935
- {
1936
- label: 'default',
1937
- data: (_b = json.safeStringify(generated, undefined, 2)) !== null && _b !== void 0 ? _b : '',
1938
- },
1939
- ]
1940
- : [{ label: 'default', data: '' }];
1941
- }
1942
- catch (e) {
1943
- return [{ label: '', data: `Example cannot be created for this schema\n${e}` }];
1944
- }
1945
- };
1946
- const exceedsSize = (example, size = 500) => {
1947
- return example.split(/\r\n|\r|\n/).length > size;
1948
- };
1949
-
1950
2078
  const useTextRequestBodyState = (mediaTypeContent, skipReadOnly) => {
1951
2079
  const initialRequestBody = useGenerateExampleFromMediaTypeContent(mediaTypeContent, undefined, {
1952
2080
  skipReadOnly,
@@ -2431,7 +2559,7 @@ const TryItResponse = ({ response }) => {
2431
2559
  React__namespace.createElement(mosaic.Panel.Content, null,
2432
2560
  React__namespace.createElement("div", null,
2433
2561
  React__namespace.createElement("div", { className: `sl-mb-3 sl-text-${getHttpCodeColor(response.status)}` }, `${response.status} ${(_a = HttpCodeDescriptions[response.status]) !== null && _a !== void 0 ? _a : ''}`),
2434
- response.bodyText && responseType && ['json', 'xml', 'text'].includes(responseType) ? (React__namespace.createElement(ResponseCodeViewer, { language: "json", value: responseType && bodyFormat === 'preview'
2562
+ response.bodyText && responseType && ['json', 'xml', 'text'].includes(responseType) ? (React__namespace.createElement(ResponseCodeViewer, { language: "json", value: responseType && bodyFormat === 'preview' && !response.skipBodyParsing
2435
2563
  ? parseBody(response.bodyText, responseType)
2436
2564
  : response.bodyText })) : response.blob && responseType === 'image' ? (React__namespace.createElement(mosaic.Flex, { justifyContent: "center" },
2437
2565
  React__namespace.createElement(mosaic.Image, { src: URL.createObjectURL(response.blob), alt: "response image" }))) : !response.bodyText ? null : (React__namespace.createElement("p", null,
@@ -2534,6 +2662,12 @@ const ServerVariables = ({ variables, values, onChangeValue }) => {
2534
2662
  };
2535
2663
 
2536
2664
  const defaultServers = [];
2665
+ const findResponseForStatus = (httpOperation, status) => {
2666
+ var _a, _b;
2667
+ const statusCode = String(status);
2668
+ const statusRange = `${Math.floor(status / 100)}XX`;
2669
+ return ((_b = (_a = httpOperation.responses.find(({ code }) => code === statusCode)) !== null && _a !== void 0 ? _a : httpOperation.responses.find(({ code }) => code.toUpperCase() === statusRange)) !== null && _b !== void 0 ? _b : httpOperation.responses.find(({ code }) => code === 'default'));
2670
+ };
2537
2671
  const TryIt = ({ httpOperation, mockUrl, onRequestChange, requestBodyIndex, embeddedInMd = false, hideTryItPanel = false, tryItCredentialsPolicy, corsProxy, }) => {
2538
2672
  var _a, _b, _c, _d, _e, _f;
2539
2673
  TryIt.displayName = 'TryIt';
@@ -2613,6 +2747,7 @@ const TryIt = ({ httpOperation, mockUrl, onRequestChange, requestBodyIndex, embe
2613
2747
  embeddedInMd,
2614
2748
  ]);
2615
2749
  const handleSendRequest = () => tslib.__awaiter(void 0, void 0, void 0, function* () {
2750
+ var _g, _h, _j;
2616
2751
  setValidateParameters(true);
2617
2752
  if (hasRequiredButEmptyParameters || !isHttpOperation(httpOperation))
2618
2753
  return;
@@ -2645,14 +2780,28 @@ const TryIt = ({ httpOperation, mockUrl, onRequestChange, requestBodyIndex, embe
2645
2780
  if (response) {
2646
2781
  const contentType = response.headers.get('Content-Type');
2647
2782
  const type = contentType ? getResponseType(contentType) : undefined;
2648
- const bodyText = type !== 'image' ? yield response.text() : undefined;
2783
+ let bodyText = type !== 'image' ? yield response.text() : undefined;
2649
2784
  const blob = type === 'image' ? yield response.blob() : undefined;
2785
+ let skipBodyParsing = false;
2786
+ if (mockData && type === 'json' && bodyText) {
2787
+ const responseMediaType = contentType === null || contentType === void 0 ? void 0 : contentType.split(';')[0];
2788
+ const responseSchema = (_j = (_h = (_g = findResponseForStatus(httpOperation, response.status)) === null || _g === void 0 ? void 0 : _g.contents) === null || _h === void 0 ? void 0 : _h.find(({ mediaType }) => mediaType === responseMediaType)) === null || _j === void 0 ? void 0 : _j.schema;
2789
+ if (responseSchema) {
2790
+ try {
2791
+ bodyText = stringifyExampleWithResolvedSchema(JSON.parse(bodyText), responseSchema);
2792
+ skipBodyParsing = true;
2793
+ }
2794
+ catch (_k) {
2795
+ }
2796
+ }
2797
+ }
2650
2798
  setResponse(undefined);
2651
2799
  setResponse({
2652
2800
  status: response.status,
2653
2801
  bodyText,
2654
2802
  blob,
2655
2803
  contentType,
2804
+ skipBodyParsing,
2656
2805
  });
2657
2806
  }
2658
2807
  }
package/index.mjs CHANGED
@@ -2,7 +2,7 @@ import { __rest, __awaiter } from 'tslib';
2
2
  import * as React from 'react';
3
3
  import React__default, { useContext, memo, useMemo, useState, useEffect, useRef, useLayoutEffect } from 'react';
4
4
  import { convertToJsonSchema } from '@stoplight/http-spec/oas';
5
- import { resolveInlineRef, hasRef, isPlainObject as isPlainObject$1, safeParse, safeStringify } from '@stoplight/json';
5
+ import { resolveInlineRef, hasRef, isPlainObject as isPlainObject$1, safeStringify, safeParse } from '@stoplight/json';
6
6
  import isArray from 'lodash/isArray.js';
7
7
  import isPlainObject from 'lodash/isPlainObject.js';
8
8
  import { NodeType, HttpParamStyles } from '@stoplight/types';
@@ -16,6 +16,7 @@ export { DefaultSMDComponents } from '@stoplight/markdown-viewer';
16
16
  import cn from 'classnames';
17
17
  import { atomWithStorage, useAtomValue } from 'jotai/utils';
18
18
  import { atom, useAtom, Provider } from 'jotai';
19
+ import * as Sampler from '@stoplight/json-schema-sampler';
19
20
  import URI from 'urijs';
20
21
  import isString from 'lodash/isString.js';
21
22
  import { CodeViewer } from '@stoplight/mosaic-code-viewer';
@@ -38,7 +39,6 @@ import map from 'lodash/map.js';
38
39
  import mapValues from 'lodash/mapValues.js';
39
40
  import pickBy from 'lodash/pickBy.js';
40
41
  import { CodeEditor } from '@stoplight/mosaic-code-editor';
41
- import * as Sampler from '@stoplight/json-schema-sampler';
42
42
  import compact from 'lodash/compact.js';
43
43
  import uniq from 'lodash/uniq.js';
44
44
  import orderBy from 'lodash/orderBy.js';
@@ -652,6 +652,242 @@ function useIsCompact(layoutOptions) {
652
652
 
653
653
  const chosenServerAtom = atom(undefined);
654
654
 
655
+ const mergeOneOfAnyOf = (schema) => {
656
+ if (!isPlainObject$1(schema)) {
657
+ return schema;
658
+ }
659
+ let result = Object.assign({}, schema);
660
+ if (result.oneOf && result.oneOf.length > 0) {
661
+ const firstOption = result.oneOf[0];
662
+ const { oneOf } = result, rest = __rest(result, ["oneOf"]);
663
+ result = Object.assign(Object.assign({}, rest), firstOption);
664
+ }
665
+ else if (result.anyOf && result.anyOf.length > 0) {
666
+ const firstOption = result.anyOf[0];
667
+ const { anyOf } = result, rest = __rest(result, ["anyOf"]);
668
+ result = Object.assign(Object.assign({}, rest), firstOption);
669
+ }
670
+ if (result.properties) {
671
+ result.properties = Object.fromEntries(Object.entries(result.properties).map(([key, value]) => [key, mergeOneOfAnyOf(value)]));
672
+ }
673
+ if (result.items) {
674
+ result.items = mergeOneOfAnyOf(result.items);
675
+ }
676
+ if (result.allOf) {
677
+ result.allOf = result.allOf.map((item) => mergeOneOfAnyOf(item));
678
+ }
679
+ delete result.oneOf;
680
+ delete result.anyOf;
681
+ return result;
682
+ };
683
+ const OAS_FORMAT_RANGES = {
684
+ int32: { minimum: 0 - Math.pow(2, 31), maximum: Math.pow(2, 31) - 1 },
685
+ int64: { minimum: Number.MIN_SAFE_INTEGER, maximum: Number.MAX_SAFE_INTEGER },
686
+ float: { minimum: 0 - Math.pow(2, 128), maximum: Math.pow(2, 128) - 1 },
687
+ double: { minimum: 0 - Number.MAX_VALUE, maximum: Number.MAX_VALUE },
688
+ };
689
+ const stripInferredNumericBounds = (schema) => {
690
+ var _a;
691
+ if (!isPlainObject$1(schema)) {
692
+ return schema;
693
+ }
694
+ const result = Object.assign({}, schema);
695
+ const explicitProperties = Array.isArray((_a = result === null || result === void 0 ? void 0 : result['x-stoplight']) === null || _a === void 0 ? void 0 : _a.explicitProperties)
696
+ ? result['x-stoplight'].explicitProperties
697
+ : [];
698
+ const isNumericType = result.type === 'integer' || result.type === 'number';
699
+ const formatRange = OAS_FORMAT_RANGES[result.format];
700
+ const hasExplicitMinimum = explicitProperties.includes('minimum') && result.minimum !== (formatRange === null || formatRange === void 0 ? void 0 : formatRange.minimum);
701
+ const hasExplicitMaximum = explicitProperties.includes('maximum') && result.maximum !== (formatRange === null || formatRange === void 0 ? void 0 : formatRange.maximum);
702
+ if (isNumericType && !hasExplicitMinimum) {
703
+ delete result.minimum;
704
+ }
705
+ if (isNumericType && !hasExplicitMaximum) {
706
+ delete result.maximum;
707
+ }
708
+ if (result.properties && isPlainObject$1(result.properties)) {
709
+ result.properties = Object.fromEntries(Object.entries(result.properties).map(([key, value]) => [key, stripInferredNumericBounds(value)]));
710
+ }
711
+ if (Array.isArray(result.items)) {
712
+ result.items = result.items.map((item) => stripInferredNumericBounds(item));
713
+ }
714
+ else if (result.items) {
715
+ result.items = stripInferredNumericBounds(result.items);
716
+ }
717
+ if (Array.isArray(result.allOf)) {
718
+ result.allOf = result.allOf.map((item) => stripInferredNumericBounds(item));
719
+ }
720
+ if (Array.isArray(result.oneOf)) {
721
+ result.oneOf = result.oneOf.map((item) => stripInferredNumericBounds(item));
722
+ }
723
+ if (Array.isArray(result.anyOf)) {
724
+ result.anyOf = result.anyOf.map((item) => stripInferredNumericBounds(item));
725
+ }
726
+ return result;
727
+ };
728
+ const FLOAT_ZERO_MARKER = '__FLOAT_ZERO__';
729
+ const markFloatZeros = (value, schema) => {
730
+ if (!isPlainObject$1(schema))
731
+ return value;
732
+ if (Array.isArray(schema.allOf)) {
733
+ return schema.allOf.reduce((currentValue, item) => markFloatZeros(currentValue, item), value);
734
+ }
735
+ if (Array.isArray(schema.oneOf) && schema.oneOf.length > 0) {
736
+ return markFloatZeros(value, schema.oneOf[0]);
737
+ }
738
+ if (Array.isArray(schema.anyOf) && schema.anyOf.length > 0) {
739
+ return markFloatZeros(value, schema.anyOf[0]);
740
+ }
741
+ if (schema.type === 'number' && (schema.format === 'float' || schema.format === 'double') && value === 0) {
742
+ return FLOAT_ZERO_MARKER;
743
+ }
744
+ if (isPlainObject$1(value) && isPlainObject$1(schema.properties)) {
745
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => { var _a; return [k, markFloatZeros(v, (_a = schema.properties[k]) !== null && _a !== void 0 ? _a : {})]; }));
746
+ }
747
+ if (Array.isArray(value) && schema.items && !Array.isArray(schema.items)) {
748
+ return value.map((item) => markFloatZeros(item, schema.items));
749
+ }
750
+ return value;
751
+ };
752
+ const stringifyWithFloatZeros = (value) => {
753
+ var _a;
754
+ if (value === FLOAT_ZERO_MARKER)
755
+ return '0.0';
756
+ return ((_a = safeStringify(value, undefined, 2)) !== null && _a !== void 0 ? _a : '').replace(/"__FLOAT_ZERO__"/g, '0.0');
757
+ };
758
+ const normalizeInferredNumericBounds = (value, schema) => {
759
+ var _a;
760
+ if (!isPlainObject$1(schema))
761
+ return value;
762
+ const schemaObject = schema;
763
+ if (Array.isArray(schemaObject.allOf)) {
764
+ return schemaObject.allOf.reduce((currentValue, item) => normalizeInferredNumericBounds(currentValue, item), value);
765
+ }
766
+ if (Array.isArray(schemaObject.oneOf) && schemaObject.oneOf.length > 0) {
767
+ return normalizeInferredNumericBounds(value, schemaObject.oneOf[0]);
768
+ }
769
+ if (Array.isArray(schemaObject.anyOf) && schemaObject.anyOf.length > 0) {
770
+ return normalizeInferredNumericBounds(value, schemaObject.anyOf[0]);
771
+ }
772
+ const explicitProperties = Array.isArray((_a = schemaObject === null || schemaObject === void 0 ? void 0 : schemaObject['x-stoplight']) === null || _a === void 0 ? void 0 : _a.explicitProperties)
773
+ ? schemaObject['x-stoplight'].explicitProperties
774
+ : [];
775
+ const isNumericType = schemaObject.type === 'integer' || schemaObject.type === 'number';
776
+ const formatRange = OAS_FORMAT_RANGES[schemaObject.format];
777
+ const hasExplicitMinimum = explicitProperties.includes('minimum') && schemaObject.minimum !== (formatRange === null || formatRange === void 0 ? void 0 : formatRange.minimum);
778
+ const hasExplicitMaximum = explicitProperties.includes('maximum') && schemaObject.maximum !== (formatRange === null || formatRange === void 0 ? void 0 : formatRange.maximum);
779
+ if (isNumericType &&
780
+ formatRange &&
781
+ ((!hasExplicitMinimum && value === formatRange.minimum) || (!hasExplicitMaximum && value === formatRange.maximum))) {
782
+ return schemaObject.type === 'number' && (schemaObject.format === 'float' || schemaObject.format === 'double')
783
+ ? FLOAT_ZERO_MARKER
784
+ : 0;
785
+ }
786
+ if (isPlainObject$1(value) && isPlainObject$1(schemaObject.properties)) {
787
+ return Object.fromEntries(Object.entries(value).map(([key, nestedValue]) => {
788
+ var _a;
789
+ return [
790
+ key,
791
+ normalizeInferredNumericBounds(nestedValue, (_a = schemaObject.properties[key]) !== null && _a !== void 0 ? _a : {}),
792
+ ];
793
+ }));
794
+ }
795
+ if (Array.isArray(value) && schemaObject.items && !Array.isArray(schemaObject.items)) {
796
+ return value.map((item) => normalizeInferredNumericBounds(item, schemaObject.items));
797
+ }
798
+ if (Array.isArray(value) && Array.isArray(schemaObject.items)) {
799
+ return value.map((item, index) => normalizeInferredNumericBounds(item, schemaObject.items[index]));
800
+ }
801
+ return value;
802
+ };
803
+ const stringifyExampleWithResolvedSchema = (value, schema) => {
804
+ const normalizedValue = normalizeInferredNumericBounds(value, schema);
805
+ return stringifyWithFloatZeros(markFloatZeros(normalizedValue, schema));
806
+ };
807
+ const useGenerateExampleFromMediaTypeContent = (mediaTypeContent, chosenExampleIndex, { skipReadOnly, skipWriteOnly, skipNonRequired, ticks } = {}) => {
808
+ const document = useDocument();
809
+ return React__default.useMemo(() => generateExampleFromMediaTypeContent(mediaTypeContent, document, chosenExampleIndex, {
810
+ skipNonRequired,
811
+ skipWriteOnly,
812
+ skipReadOnly,
813
+ ticks: ticks || 6000,
814
+ }), [mediaTypeContent, document, chosenExampleIndex, skipNonRequired, skipWriteOnly, skipReadOnly, ticks]);
815
+ };
816
+ const generateExampleFromMediaTypeContent = (mediaTypeContent, document, chosenExampleIndex = 0, options) => {
817
+ var _a;
818
+ const textRequestBodySchema = mediaTypeContent === null || mediaTypeContent === void 0 ? void 0 : mediaTypeContent.schema;
819
+ const textRequestBodyExamples = mediaTypeContent === null || mediaTypeContent === void 0 ? void 0 : mediaTypeContent.examples;
820
+ try {
821
+ if (textRequestBodyExamples === null || textRequestBodyExamples === void 0 ? void 0 : textRequestBodyExamples.length) {
822
+ return ((_a = safeStringify(textRequestBodyExamples === null || textRequestBodyExamples === void 0 ? void 0 : textRequestBodyExamples[chosenExampleIndex]['value'], undefined, 2)) !== null && _a !== void 0 ? _a : '');
823
+ }
824
+ else if (textRequestBodySchema) {
825
+ let unwrappedSchema = getResolvedObject(textRequestBodySchema);
826
+ unwrappedSchema = stripInferredNumericBounds(unwrappedSchema);
827
+ unwrappedSchema = mergeOneOfAnyOf(unwrappedSchema);
828
+ const generated = Sampler.sample(unwrappedSchema, options, document);
829
+ if (generated === null)
830
+ return '';
831
+ return stringifyExampleWithResolvedSchema(generated, unwrappedSchema);
832
+ }
833
+ }
834
+ catch (e) {
835
+ console.warn(e);
836
+ return `Example cannot be created for this schema\n${e}`;
837
+ }
838
+ return '';
839
+ };
840
+ const generateExamplesFromJsonSchema = (schema) => {
841
+ var _a;
842
+ const examples = [];
843
+ if (Array.isArray(schema === null || schema === void 0 ? void 0 : schema.examples)) {
844
+ schema.examples.forEach((example, index) => {
845
+ var _a;
846
+ examples.push({
847
+ data: (_a = safeStringify(example, undefined, 2)) !== null && _a !== void 0 ? _a : '',
848
+ label: index === 0 ? 'default' : `example-${index}`,
849
+ });
850
+ });
851
+ }
852
+ else if (isPlainObject$1(schema === null || schema === void 0 ? void 0 : schema['x-examples'])) {
853
+ for (const [label, example] of Object.entries(schema['x-examples'])) {
854
+ if (isPlainObject$1(example)) {
855
+ const val = example.hasOwnProperty('value') && Object.keys(example).length === 1 ? example.value : example;
856
+ examples.push({
857
+ label,
858
+ data: (_a = safeStringify(val, undefined, 2)) !== null && _a !== void 0 ? _a : '',
859
+ });
860
+ }
861
+ }
862
+ }
863
+ if (examples.length) {
864
+ return examples;
865
+ }
866
+ try {
867
+ let resolvedSchema = getResolvedObject(schema);
868
+ resolvedSchema = stripInferredNumericBounds(resolvedSchema);
869
+ resolvedSchema = mergeOneOfAnyOf(resolvedSchema);
870
+ const generated = Sampler.sample(resolvedSchema, {
871
+ maxSampleDepth: 4,
872
+ ticks: 6000,
873
+ });
874
+ return generated !== null
875
+ ? [
876
+ {
877
+ label: 'default',
878
+ data: stringifyExampleWithResolvedSchema(generated, resolvedSchema),
879
+ },
880
+ ]
881
+ : [{ label: 'default', data: '' }];
882
+ }
883
+ catch (e) {
884
+ return [{ label: '', data: `Example cannot be created for this schema\n${e}` }];
885
+ }
886
+ };
887
+ const exceedsSize = (example, size = 500) => {
888
+ return example.split(/\r\n|\r|\n/).length > size;
889
+ };
890
+
655
891
  function isValidServer(server) {
656
892
  return server.url !== null;
657
893
  }
@@ -1818,114 +2054,6 @@ function ExampleMenu({ examples, requestBody, onChange }) {
1818
2054
  return (React.createElement(Menu, { "aria-label": "Examples", items: menuItems, renderTrigger: ({ isOpen }) => (React.createElement(Button, { appearance: "minimal", size: "sm", iconRight: ['fas', 'sort'], active: isOpen }, "Examples")) }));
1819
2055
  }
1820
2056
 
1821
- const mergeOneOfAnyOf = (schema) => {
1822
- if (!isPlainObject$1(schema)) {
1823
- return schema;
1824
- }
1825
- let result = Object.assign({}, schema);
1826
- if (result.oneOf && result.oneOf.length > 0) {
1827
- const firstOption = result.oneOf[0];
1828
- const { oneOf } = result, rest = __rest(result, ["oneOf"]);
1829
- result = Object.assign(Object.assign({}, rest), firstOption);
1830
- }
1831
- else if (result.anyOf && result.anyOf.length > 0) {
1832
- const firstOption = result.anyOf[0];
1833
- const { anyOf } = result, rest = __rest(result, ["anyOf"]);
1834
- result = Object.assign(Object.assign({}, rest), firstOption);
1835
- }
1836
- if (result.properties) {
1837
- result.properties = Object.fromEntries(Object.entries(result.properties).map(([key, value]) => [key, mergeOneOfAnyOf(value)]));
1838
- }
1839
- if (result.items) {
1840
- result.items = mergeOneOfAnyOf(result.items);
1841
- }
1842
- if (result.allOf) {
1843
- result.allOf = result.allOf.map((item) => mergeOneOfAnyOf(item));
1844
- }
1845
- delete result.oneOf;
1846
- delete result.anyOf;
1847
- return result;
1848
- };
1849
- const useGenerateExampleFromMediaTypeContent = (mediaTypeContent, chosenExampleIndex, { skipReadOnly, skipWriteOnly, skipNonRequired, ticks } = {}) => {
1850
- const document = useDocument();
1851
- return React__default.useMemo(() => generateExampleFromMediaTypeContent(mediaTypeContent, document, chosenExampleIndex, {
1852
- skipNonRequired,
1853
- skipWriteOnly,
1854
- skipReadOnly,
1855
- ticks: ticks || 6000,
1856
- }), [mediaTypeContent, document, chosenExampleIndex, skipNonRequired, skipWriteOnly, skipReadOnly, ticks]);
1857
- };
1858
- const generateExampleFromMediaTypeContent = (mediaTypeContent, document, chosenExampleIndex = 0, options) => {
1859
- var _a, _b;
1860
- const textRequestBodySchema = mediaTypeContent === null || mediaTypeContent === void 0 ? void 0 : mediaTypeContent.schema;
1861
- const textRequestBodyExamples = mediaTypeContent === null || mediaTypeContent === void 0 ? void 0 : mediaTypeContent.examples;
1862
- try {
1863
- if (textRequestBodyExamples === null || textRequestBodyExamples === void 0 ? void 0 : textRequestBodyExamples.length) {
1864
- return ((_a = safeStringify(textRequestBodyExamples === null || textRequestBodyExamples === void 0 ? void 0 : textRequestBodyExamples[chosenExampleIndex]['value'], undefined, 2)) !== null && _a !== void 0 ? _a : '');
1865
- }
1866
- else if (textRequestBodySchema) {
1867
- let unwrappedSchema = getResolvedObject(textRequestBodySchema);
1868
- unwrappedSchema = mergeOneOfAnyOf(unwrappedSchema);
1869
- const generated = Sampler.sample(unwrappedSchema, options, document);
1870
- return generated !== null ? (_b = safeStringify(generated, undefined, 2)) !== null && _b !== void 0 ? _b : '' : '';
1871
- }
1872
- }
1873
- catch (e) {
1874
- console.warn(e);
1875
- return `Example cannot be created for this schema\n${e}`;
1876
- }
1877
- return '';
1878
- };
1879
- const generateExamplesFromJsonSchema = (schema) => {
1880
- var _a, _b;
1881
- const examples = [];
1882
- if (Array.isArray(schema === null || schema === void 0 ? void 0 : schema.examples)) {
1883
- schema.examples.forEach((example, index) => {
1884
- var _a;
1885
- examples.push({
1886
- data: (_a = safeStringify(example, undefined, 2)) !== null && _a !== void 0 ? _a : '',
1887
- label: index === 0 ? 'default' : `example-${index}`,
1888
- });
1889
- });
1890
- }
1891
- else if (isPlainObject$1(schema === null || schema === void 0 ? void 0 : schema['x-examples'])) {
1892
- for (const [label, example] of Object.entries(schema['x-examples'])) {
1893
- if (isPlainObject$1(example)) {
1894
- const val = example.hasOwnProperty('value') && Object.keys(example).length === 1 ? example.value : example;
1895
- examples.push({
1896
- label,
1897
- data: (_a = safeStringify(val, undefined, 2)) !== null && _a !== void 0 ? _a : '',
1898
- });
1899
- }
1900
- }
1901
- }
1902
- if (examples.length) {
1903
- return examples;
1904
- }
1905
- try {
1906
- let resolvedSchema = getResolvedObject(schema);
1907
- resolvedSchema = mergeOneOfAnyOf(resolvedSchema);
1908
- const generated = Sampler.sample(resolvedSchema, {
1909
- maxSampleDepth: 4,
1910
- ticks: 6000,
1911
- });
1912
- return generated !== null
1913
- ? [
1914
- {
1915
- label: 'default',
1916
- data: (_b = safeStringify(generated, undefined, 2)) !== null && _b !== void 0 ? _b : '',
1917
- },
1918
- ]
1919
- : [{ label: 'default', data: '' }];
1920
- }
1921
- catch (e) {
1922
- return [{ label: '', data: `Example cannot be created for this schema\n${e}` }];
1923
- }
1924
- };
1925
- const exceedsSize = (example, size = 500) => {
1926
- return example.split(/\r\n|\r|\n/).length > size;
1927
- };
1928
-
1929
2057
  const useTextRequestBodyState = (mediaTypeContent, skipReadOnly) => {
1930
2058
  const initialRequestBody = useGenerateExampleFromMediaTypeContent(mediaTypeContent, undefined, {
1931
2059
  skipReadOnly,
@@ -2410,7 +2538,7 @@ const TryItResponse = ({ response }) => {
2410
2538
  React.createElement(Panel.Content, null,
2411
2539
  React.createElement("div", null,
2412
2540
  React.createElement("div", { className: `sl-mb-3 sl-text-${getHttpCodeColor(response.status)}` }, `${response.status} ${(_a = HttpCodeDescriptions[response.status]) !== null && _a !== void 0 ? _a : ''}`),
2413
- response.bodyText && responseType && ['json', 'xml', 'text'].includes(responseType) ? (React.createElement(ResponseCodeViewer, { language: "json", value: responseType && bodyFormat === 'preview'
2541
+ response.bodyText && responseType && ['json', 'xml', 'text'].includes(responseType) ? (React.createElement(ResponseCodeViewer, { language: "json", value: responseType && bodyFormat === 'preview' && !response.skipBodyParsing
2414
2542
  ? parseBody(response.bodyText, responseType)
2415
2543
  : response.bodyText })) : response.blob && responseType === 'image' ? (React.createElement(Flex, { justifyContent: "center" },
2416
2544
  React.createElement(Image, { src: URL.createObjectURL(response.blob), alt: "response image" }))) : !response.bodyText ? null : (React.createElement("p", null,
@@ -2513,6 +2641,12 @@ const ServerVariables = ({ variables, values, onChangeValue }) => {
2513
2641
  };
2514
2642
 
2515
2643
  const defaultServers = [];
2644
+ const findResponseForStatus = (httpOperation, status) => {
2645
+ var _a, _b;
2646
+ const statusCode = String(status);
2647
+ const statusRange = `${Math.floor(status / 100)}XX`;
2648
+ return ((_b = (_a = httpOperation.responses.find(({ code }) => code === statusCode)) !== null && _a !== void 0 ? _a : httpOperation.responses.find(({ code }) => code.toUpperCase() === statusRange)) !== null && _b !== void 0 ? _b : httpOperation.responses.find(({ code }) => code === 'default'));
2649
+ };
2516
2650
  const TryIt = ({ httpOperation, mockUrl, onRequestChange, requestBodyIndex, embeddedInMd = false, hideTryItPanel = false, tryItCredentialsPolicy, corsProxy, }) => {
2517
2651
  var _a, _b, _c, _d, _e, _f;
2518
2652
  TryIt.displayName = 'TryIt';
@@ -2592,6 +2726,7 @@ const TryIt = ({ httpOperation, mockUrl, onRequestChange, requestBodyIndex, embe
2592
2726
  embeddedInMd,
2593
2727
  ]);
2594
2728
  const handleSendRequest = () => __awaiter(void 0, void 0, void 0, function* () {
2729
+ var _g, _h, _j;
2595
2730
  setValidateParameters(true);
2596
2731
  if (hasRequiredButEmptyParameters || !isHttpOperation(httpOperation))
2597
2732
  return;
@@ -2624,14 +2759,28 @@ const TryIt = ({ httpOperation, mockUrl, onRequestChange, requestBodyIndex, embe
2624
2759
  if (response) {
2625
2760
  const contentType = response.headers.get('Content-Type');
2626
2761
  const type = contentType ? getResponseType(contentType) : undefined;
2627
- const bodyText = type !== 'image' ? yield response.text() : undefined;
2762
+ let bodyText = type !== 'image' ? yield response.text() : undefined;
2628
2763
  const blob = type === 'image' ? yield response.blob() : undefined;
2764
+ let skipBodyParsing = false;
2765
+ if (mockData && type === 'json' && bodyText) {
2766
+ const responseMediaType = contentType === null || contentType === void 0 ? void 0 : contentType.split(';')[0];
2767
+ const responseSchema = (_j = (_h = (_g = findResponseForStatus(httpOperation, response.status)) === null || _g === void 0 ? void 0 : _g.contents) === null || _h === void 0 ? void 0 : _h.find(({ mediaType }) => mediaType === responseMediaType)) === null || _j === void 0 ? void 0 : _j.schema;
2768
+ if (responseSchema) {
2769
+ try {
2770
+ bodyText = stringifyExampleWithResolvedSchema(JSON.parse(bodyText), responseSchema);
2771
+ skipBodyParsing = true;
2772
+ }
2773
+ catch (_k) {
2774
+ }
2775
+ }
2776
+ }
2629
2777
  setResponse(undefined);
2630
2778
  setResponse({
2631
2779
  status: response.status,
2632
2780
  bodyText,
2633
2781
  blob,
2634
2782
  contentType,
2783
+ skipBodyParsing,
2635
2784
  });
2636
2785
  }
2637
2786
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stoplight/elements-core",
3
- "version": "9.0.25",
3
+ "version": "9.0.26",
4
4
  "main": "./index.js",
5
5
  "sideEffects": [
6
6
  "web-components.min.js",
@@ -5,6 +5,7 @@ declare type Example = {
5
5
  label: string;
6
6
  data: string;
7
7
  };
8
+ export declare const stringifyExampleWithResolvedSchema: (value: any, schema: any) => string;
8
9
  export declare type GenerateExampleFromMediaTypeContentOptions = Sampler.Options;
9
10
  export declare const useGenerateExampleFromMediaTypeContent: (mediaTypeContent: IMediaTypeContent | undefined, chosenExampleIndex?: number, { skipReadOnly, skipWriteOnly, skipNonRequired, ticks }?: GenerateExampleFromMediaTypeContentOptions) => string;
10
11
  export declare const generateExampleFromMediaTypeContent: (mediaTypeContent: IMediaTypeContent | undefined, document: any, chosenExampleIndex?: number, options?: GenerateExampleFromMediaTypeContentOptions) => string;