@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.
- package/components/TryIt/Response/Response.d.ts +1 -0
- package/index.esm.js +261 -112
- package/index.js +260 -111
- package/index.mjs +261 -112
- package/package.json +1 -1
- package/utils/exampleGeneration/exampleGeneration.d.ts +1 -0
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,
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
@@ -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;
|