@stoplight/elements-core 7.3.11 → 7.4.0

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/index.js CHANGED
@@ -5,7 +5,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var tslib = require('tslib');
6
6
  var React = require('react');
7
7
  var json = require('@stoplight/json');
8
- var _ = require('lodash');
8
+ var isArray = require('lodash/isArray.js');
9
+ var isObject = require('lodash/isObject.js');
10
+ var isPlainObject = require('lodash/isPlainObject.js');
9
11
  var markdown = require('@stoplight/markdown');
10
12
  var types = require('@stoplight/types');
11
13
  var yaml = require('@stoplight/yaml');
@@ -13,23 +15,45 @@ var mosaic = require('@stoplight/mosaic');
13
15
  var reactErrorBoundary = require('@stoplight/react-error-boundary');
14
16
  var markdownViewer = require('@stoplight/markdown-viewer');
15
17
  var freeSolidSvgIcons = require('@fortawesome/free-solid-svg-icons');
16
- var reactFontawesome = require('@fortawesome/react-fontawesome');
18
+ var throttle = require('lodash/throttle.js');
17
19
  var unistUtilSelect = require('unist-util-select');
18
20
  var cn = require('classnames');
19
21
  var jotai = require('jotai');
20
22
  var URI = require('urijs');
21
23
  var mosaicCodeViewer = require('@stoplight/mosaic-code-viewer');
22
24
  var HTTPSnippet = require('httpsnippet');
25
+ var flatten = require('lodash/flatten.js');
26
+ var capitalize = require('lodash/capitalize.js');
27
+ var filter = require('lodash/filter.js');
23
28
  var nanoid = require('nanoid');
29
+ var curry = require('lodash/curry.js');
30
+ var omit = require('lodash/omit.js');
31
+ var keyBy = require('lodash/keyBy.js');
32
+ var map = require('lodash/map.js');
33
+ var mapValues = require('lodash/mapValues.js');
34
+ var isString = require('lodash/isString.js');
35
+ var pickBy = require('lodash/pickBy.js');
24
36
  var mosaicCodeEditor = require('@stoplight/mosaic-code-editor');
25
37
  var Sampler = require('@stoplight/json-schema-sampler');
38
+ var compact = require('lodash/compact.js');
39
+ var uniq = require('lodash/uniq.js');
40
+ var orderBy = require('lodash/orderBy.js');
41
+ var uniqBy = require('lodash/uniqBy.js');
26
42
  var formatXml = require('xml-formatter');
27
- var reactRouterDom = require('react-router-dom');
43
+ var utils = require('jotai/utils');
44
+ var entries = require('lodash/entries.js');
45
+ var keys = require('lodash/keys.js');
28
46
  var jsonSchemaViewer = require('@stoplight/json-schema-viewer');
47
+ var get = require('lodash/get.js');
48
+ var isEmpty = require('lodash/isEmpty.js');
49
+ var omitBy = require('lodash/omitBy.js');
50
+ var sortBy = require('lodash/sortBy.js');
51
+ var reactRouterDom = require('react-router-dom');
29
52
  var reactRouterHashLink = require('react-router-hash-link');
30
53
  var reactQuery = require('react-query');
31
54
  var $RefParser = require('@stoplight/json-schema-ref-parser');
32
55
  var PropTypes = require('prop-types');
56
+ var isEqual = require('lodash/isEqual.js');
33
57
  var ReactDOM = require('react-dom');
34
58
 
35
59
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -54,14 +78,38 @@ function _interopNamespace(e) {
54
78
 
55
79
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
56
80
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
57
- var ___default = /*#__PURE__*/_interopDefaultLegacy(_);
81
+ var isArray__default = /*#__PURE__*/_interopDefaultLegacy(isArray);
82
+ var isObject__default = /*#__PURE__*/_interopDefaultLegacy(isObject);
83
+ var isPlainObject__default = /*#__PURE__*/_interopDefaultLegacy(isPlainObject);
84
+ var throttle__default = /*#__PURE__*/_interopDefaultLegacy(throttle);
58
85
  var cn__default = /*#__PURE__*/_interopDefaultLegacy(cn);
59
86
  var URI__default = /*#__PURE__*/_interopDefaultLegacy(URI);
60
87
  var HTTPSnippet__default = /*#__PURE__*/_interopDefaultLegacy(HTTPSnippet);
88
+ var flatten__default = /*#__PURE__*/_interopDefaultLegacy(flatten);
89
+ var capitalize__default = /*#__PURE__*/_interopDefaultLegacy(capitalize);
90
+ var filter__default = /*#__PURE__*/_interopDefaultLegacy(filter);
91
+ var curry__default = /*#__PURE__*/_interopDefaultLegacy(curry);
92
+ var omit__default = /*#__PURE__*/_interopDefaultLegacy(omit);
93
+ var keyBy__default = /*#__PURE__*/_interopDefaultLegacy(keyBy);
94
+ var map__default = /*#__PURE__*/_interopDefaultLegacy(map);
95
+ var mapValues__default = /*#__PURE__*/_interopDefaultLegacy(mapValues);
96
+ var isString__default = /*#__PURE__*/_interopDefaultLegacy(isString);
97
+ var pickBy__default = /*#__PURE__*/_interopDefaultLegacy(pickBy);
61
98
  var Sampler__namespace = /*#__PURE__*/_interopNamespace(Sampler);
99
+ var compact__default = /*#__PURE__*/_interopDefaultLegacy(compact);
100
+ var uniq__default = /*#__PURE__*/_interopDefaultLegacy(uniq);
101
+ var orderBy__default = /*#__PURE__*/_interopDefaultLegacy(orderBy);
102
+ var uniqBy__default = /*#__PURE__*/_interopDefaultLegacy(uniqBy);
62
103
  var formatXml__default = /*#__PURE__*/_interopDefaultLegacy(formatXml);
104
+ var entries__default = /*#__PURE__*/_interopDefaultLegacy(entries);
105
+ var keys__default = /*#__PURE__*/_interopDefaultLegacy(keys);
106
+ var get__default = /*#__PURE__*/_interopDefaultLegacy(get);
107
+ var isEmpty__default = /*#__PURE__*/_interopDefaultLegacy(isEmpty);
108
+ var omitBy__default = /*#__PURE__*/_interopDefaultLegacy(omitBy);
109
+ var sortBy__default = /*#__PURE__*/_interopDefaultLegacy(sortBy);
63
110
  var $RefParser__default = /*#__PURE__*/_interopDefaultLegacy($RefParser);
64
111
  var PropTypes__namespace = /*#__PURE__*/_interopNamespace(PropTypes);
112
+ var isEqual__default = /*#__PURE__*/_interopDefaultLegacy(isEqual);
65
113
  var ReactDOM__namespace = /*#__PURE__*/_interopNamespace(ReactDOM);
66
114
 
67
115
  const defaultResolver = (contextObject) => ({ pointer }, _, currentObject) => {
@@ -107,7 +155,7 @@ const recursivelyCreateResolvedObject = (currentObject, rootCurrentObject, prope
107
155
  else {
108
156
  resolvedValue = value;
109
157
  }
110
- if (_.isPlainObject(resolvedValue) || _.isArray(resolvedValue)) {
158
+ if (isPlainObject__default["default"](resolvedValue) || isArray__default["default"](resolvedValue)) {
111
159
  return recursivelyCreateResolvedObject(resolvedValue, rootCurrentObject, newPropertyPath, objectToProxiedObjectCache, mergedOptions);
112
160
  }
113
161
  return resolvedValue;
@@ -122,7 +170,7 @@ const isResolvedObjectProxy = (someObject) => {
122
170
  const getOriginalObject = (resolvedObject) => {
123
171
  return resolvedObject[originalObjectSymbol] || resolvedObject;
124
172
  };
125
- const isReference = (value) => _.isObject(value) && typeof value['$ref'] === 'string';
173
+ const isReference = (value) => isObject__default["default"](value) && typeof value['$ref'] === 'string';
126
174
 
127
175
  const InlineRefResolverContext = React__namespace.createContext(undefined);
128
176
  InlineRefResolverContext.displayName = 'InlineRefResolverContext';
@@ -143,13 +191,13 @@ const useResolvedObject = (currentObject) => {
143
191
  };
144
192
 
145
193
  function isSMDASTRoot(maybeAst) {
146
- return _.isObject(maybeAst) && maybeAst['type'] === 'root' && mosaic.isArray(maybeAst['children']);
194
+ return isObject__default["default"](maybeAst) && maybeAst['type'] === 'root' && mosaic.isArray(maybeAst['children']);
147
195
  }
148
196
  function isJSONSchema(maybeSchema) {
149
- return _.isPlainObject(maybeSchema);
197
+ return isPlainObject__default["default"](maybeSchema);
150
198
  }
151
199
  function isStoplightNode(maybeNode) {
152
- return _.isObject(maybeNode) && 'id' in maybeNode;
200
+ return isObject__default["default"](maybeNode) && 'id' in maybeNode;
153
201
  }
154
202
  function isHttpService(maybeHttpService) {
155
203
  return isStoplightNode(maybeHttpService) && 'name' in maybeHttpService && 'version' in maybeHttpService;
@@ -247,7 +295,7 @@ function useComponentSize(container) {
247
295
  if (!container) {
248
296
  return;
249
297
  }
250
- const updateComponentSize = _.throttle(() => (container ? setComponentSize(container.getBoundingClientRect()) : { width: 0, height: 0 }), 1000, {
298
+ const updateComponentSize = throttle__default["default"](() => (container ? setComponentSize(container.getBoundingClientRect()) : { width: 0, height: 0 }), 1000, {
251
299
  trailing: true,
252
300
  });
253
301
  updateComponentSize();
@@ -296,15 +344,15 @@ const ArticleHeadings = ({ tree, container }) => {
296
344
  const { width } = useComponentSize(container);
297
345
  const showHeadings = width >= 768;
298
346
  const headings = useComputeMarkdownHeadings(tree);
299
- return React__namespace.createElement(Headings, { className: "ArticleHeadings", headings: headings, minimal: !showHeadings });
347
+ return React__namespace.createElement(Headings, { className: "ArticleHeadings", headings: headings, minimal: !showHeadings, maxWidth: 300 });
300
348
  };
301
- const Headings = ({ headings, className, title = 'On This Page', minimal }) => {
349
+ const Headings = ({ headings, className, title = 'On This Page', minimal, maxWidth }) => {
302
350
  const locationHash = useLocationHash();
303
351
  if (!headings || !headings.length)
304
352
  return null;
305
- const component = (React__namespace.createElement("div", { style: { maxHeight: '85vh', overflow: 'auto' } },
353
+ const component = (React__namespace.createElement(mosaic.Box, { overflowY: "auto", style: { maxHeight: '85vh', maxWidth } },
306
354
  title && (React__namespace.createElement(mosaic.Flex, { py: 2, alignItems: "center", fontSize: "sm", fontWeight: "medium", color: "muted", style: { paddingLeft: 18 } },
307
- React__namespace.createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faStream, className: "sl-mr-2" }),
355
+ React__namespace.createElement(mosaic.Box, { as: mosaic.Icon, icon: freeSolidSvgIcons.faStream, mr: 2 }),
308
356
  title)),
309
357
  headings.map((heading, i) => (React__namespace.createElement(Heading, { key: i, item: heading, isSelected: locationHash === `#${heading.id}` })))));
310
358
  if (minimal) {
@@ -324,7 +372,7 @@ const ArticleComponent = React__namespace.memo(({ data }) => {
324
372
  const tree = React__namespace.useMemo(() => (typeof data === 'object' ? data : markdown.parse(data)), [data]);
325
373
  if (tree === null)
326
374
  return null;
327
- return (React__namespace.createElement(mosaic.Flex, { className: "sl-elements-article", w: "full", pos: "relative", ref: setContainer },
375
+ return (React__namespace.createElement(mosaic.Flex, { className: "sl-elements-article", justifyContent: "evenly", w: "full", pos: "relative", ref: setContainer },
328
376
  React__namespace.createElement(mosaic.Box, { className: "sl-elements-article-content", style: { width: 0 }, flex: 1 },
329
377
  React__namespace.createElement(MarkdownViewer, { markdown: tree })),
330
378
  React__namespace.createElement(ArticleHeadings, { tree: tree, container: container })));
@@ -345,38 +393,6 @@ function createNamedContext(name, defaultValue) {
345
393
  return context;
346
394
  }
347
395
 
348
- function getReadableSecurityName(securityScheme, includeKey = false) {
349
- let name = '';
350
- switch (securityScheme.type) {
351
- case 'apiKey':
352
- name = 'API Key';
353
- break;
354
- case 'http':
355
- name = `${_.capitalize(securityScheme.scheme)} Auth`;
356
- break;
357
- case 'oauth2':
358
- name = 'OAuth 2.0';
359
- break;
360
- case 'openIdConnect':
361
- name = 'OpenID Connect';
362
- break;
363
- case 'mutualTLS':
364
- name = 'Mutual TLS';
365
- break;
366
- }
367
- return includeKey ? `${name} (${securityScheme.key})` : name;
368
- }
369
- function getServiceUriFromOperation(uri) {
370
- const match = uri === null || uri === void 0 ? void 0 : uri.match(/(.*)\/(paths|operations)/);
371
- return match && match.length > 1 ? match[1] || '/' : undefined;
372
- }
373
- const isOAuth2ImplicitFlow = (maybeFlow) => _.isObject(maybeFlow) && 'authorizationUrl' in maybeFlow && !('tokenUrl' in maybeFlow);
374
- const isOauth2AuthorizationCodeFlow = (maybeFlow) => _.isObject(maybeFlow) && 'authorizationUrl' in maybeFlow && 'tokenUrl' in maybeFlow;
375
- const isOauth2ClientCredentialsOrPasswordFlow = (maybeFlow) => _.isObject(maybeFlow) && !('authorizationUrl' in maybeFlow) && 'tokenUrl' in maybeFlow;
376
- function shouldIncludeKey(schemes, type) {
377
- return _.filter(schemes, { type }).length > 1;
378
- }
379
-
380
396
  const NodeTypeColors = {
381
397
  http_operation: '#6a6acb',
382
398
  http_service: '#e056fd',
@@ -765,6 +781,34 @@ const RequestSamples = React__default["default"].memo(({ request, embeddedInMd =
765
781
  React__default["default"].createElement(mosaicCodeViewer.CodeViewer, { "aria-label": requestSample !== null && requestSample !== void 0 ? requestSample : fallbackText, noCopyButton: true, maxHeight: "400px", language: mosaicCodeViewerLanguage, value: requestSample || fallbackText }))));
766
782
  });
767
783
 
784
+ function getReadableSecurityName(securityScheme, includeKey = false) {
785
+ let name = '';
786
+ switch (securityScheme.type) {
787
+ case 'apiKey':
788
+ name = 'API Key';
789
+ break;
790
+ case 'http':
791
+ name = `${capitalize__default["default"](securityScheme.scheme)} Auth`;
792
+ break;
793
+ case 'oauth2':
794
+ name = 'OAuth 2.0';
795
+ break;
796
+ case 'openIdConnect':
797
+ name = 'OpenID Connect';
798
+ break;
799
+ case 'mutualTLS':
800
+ name = 'Mutual TLS';
801
+ break;
802
+ }
803
+ return includeKey ? `${name} (${securityScheme.key})` : name;
804
+ }
805
+ const isOAuth2ImplicitFlow = (maybeFlow) => isObject__default["default"](maybeFlow) && 'authorizationUrl' in maybeFlow && !('tokenUrl' in maybeFlow);
806
+ const isOauth2AuthorizationCodeFlow = (maybeFlow) => isObject__default["default"](maybeFlow) && 'authorizationUrl' in maybeFlow && 'tokenUrl' in maybeFlow;
807
+ const isOauth2ClientCredentialsOrPasswordFlow = (maybeFlow) => isObject__default["default"](maybeFlow) && !('authorizationUrl' in maybeFlow) && 'tokenUrl' in maybeFlow;
808
+ function shouldIncludeKey(schemes, type) {
809
+ return filter__default["default"](schemes, { type }).length > 1;
810
+ }
811
+
768
812
  const useUniqueId = (prefix = 'id_') => React__namespace.useRef(`${prefix}${nanoid.nanoid(8)}`).current;
769
813
 
770
814
  const AuthTokenInput = ({ type, name, value, onChange }) => {
@@ -837,7 +881,7 @@ const OAuth2Auth = ({ value, onChange }) => {
837
881
 
838
882
  const TryItAuth = ({ operationSecurityScheme: operationAuth, onChange, value }) => {
839
883
  var _a;
840
- const operationSecurityArray = _.flatten(operationAuth);
884
+ const operationSecurityArray = flatten__default["default"](operationAuth);
841
885
  const filteredSecurityItems = operationSecurityArray.filter(scheme => securitySchemeKeys.includes(scheme === null || scheme === void 0 ? void 0 : scheme.type));
842
886
  const securityScheme = value ? value.scheme : filteredSecurityItems[0];
843
887
  const menuName = securityScheme ? getReadableSecurityName(securityScheme) : 'Security Scheme';
@@ -899,15 +943,15 @@ const SecuritySchemeComponent = (_a) => {
899
943
  };
900
944
  const securitySchemeKeys = ['apiKey', 'http', 'oauth2', 'openIdConnect'];
901
945
 
902
- const caseInsensitivelyEquals = _.curry((a, b) => a.toUpperCase() === b.toUpperCase());
946
+ const caseInsensitivelyEquals = curry__default["default"]((a, b) => a.toUpperCase() === b.toUpperCase());
903
947
 
904
- const isApiKeySecurityScheme = (maybeIApiKey) => _.isObject(maybeIApiKey) && maybeIApiKey.type === 'apiKey';
905
- const isOAuth2SecurityScheme = (maybeIOAuth2) => _.isObject(maybeIOAuth2) && maybeIOAuth2.type === 'oauth2';
906
- const isBasicSecurityScheme = (maybeIBasic) => _.isObject(maybeIBasic) && maybeIBasic.type === 'http' && maybeIBasic.scheme === 'basic';
907
- const isBearerSecurityScheme = (maybeIBearer) => _.isObject(maybeIBearer) && maybeIBearer.type === 'http' && maybeIBearer.scheme === 'bearer';
908
- const isDigestSecurityScheme = (maybeIBearer) => _.isObject(maybeIBearer) && maybeIBearer.type === 'http' && maybeIBearer.scheme === 'digest';
948
+ const isApiKeySecurityScheme = (maybeIApiKey) => isObject__default["default"](maybeIApiKey) && maybeIApiKey.type === 'apiKey';
949
+ const isOAuth2SecurityScheme = (maybeIOAuth2) => isObject__default["default"](maybeIOAuth2) && maybeIOAuth2.type === 'oauth2';
950
+ const isBasicSecurityScheme = (maybeIBasic) => isObject__default["default"](maybeIBasic) && maybeIBasic.type === 'http' && maybeIBasic.scheme === 'basic';
951
+ const isBearerSecurityScheme = (maybeIBearer) => isObject__default["default"](maybeIBearer) && maybeIBearer.type === 'http' && maybeIBearer.scheme === 'bearer';
952
+ const isDigestSecurityScheme = (maybeIBearer) => isObject__default["default"](maybeIBearer) && maybeIBearer.type === 'http' && maybeIBearer.scheme === 'digest';
909
953
  function filterOutAuthorizationParams(queryParams, securitySchemes = []) {
910
- const flattenedSecuritySchemes = _.flatten(securitySchemes);
954
+ const flattenedSecuritySchemes = flatten__default["default"](securitySchemes);
911
955
  const securitySchemeNames = getSecuritySchemeNames(flattenedSecuritySchemes);
912
956
  return queryParams.filter(queryParam => !securitySchemeNames.some(caseInsensitivelyEquals(queryParam.name)));
913
957
  }
@@ -978,7 +1022,7 @@ const booleanOptions = [
978
1022
  { label: 'True', value: 'true' },
979
1023
  ];
980
1024
  function enumOptions(enumValues, required) {
981
- const options = _.map(enumValues, v => ({ value: Number.isNaN(Number(v)) ? String(v) : Number(v) }));
1025
+ const options = map__default["default"](enumValues, v => ({ value: Number.isNaN(Number(v)) ? String(v) : Number(v) }));
982
1026
  return required ? options : [{ label: 'Not Set', value: '' }, ...options];
983
1027
  }
984
1028
  function parameterOptions(parameter) {
@@ -1018,7 +1062,7 @@ function getPlaceholderForParameter(parameter) {
1018
1062
  function retrieveDefaultFromSchema(parameter) {
1019
1063
  var _a;
1020
1064
  const defaultValue = (_a = parameter.schema) === null || _a === void 0 ? void 0 : _a.default;
1021
- return _.isObject(defaultValue) ? json.safeStringify(defaultValue) : defaultValue;
1065
+ return isObject__default["default"](defaultValue) ? json.safeStringify(defaultValue) : defaultValue;
1022
1066
  }
1023
1067
  const getValueForParameter = (parameter) => {
1024
1068
  var _a, _b, _c;
@@ -1040,10 +1084,8 @@ const getInitialValueForParameter = (parameter) => {
1040
1084
  return getValueForParameter(parameter);
1041
1085
  };
1042
1086
  const initialParameterValues = params => {
1043
- return ___default["default"].chain(params)
1044
- .keyBy((param) => param.name)
1045
- .mapValues(param => getInitialValueForParameter(param))
1046
- .value();
1087
+ const paramsByName = keyBy__default["default"](params, (param) => param.name);
1088
+ return mapValues__default["default"](paramsByName, param => getInitialValueForParameter(param));
1047
1089
  };
1048
1090
  function mapSchemaPropertiesToParameters(properties, required) {
1049
1091
  return Object.entries(properties).map(([name, schema]) => (Object.assign({ name, schema: typeof schema !== 'boolean' ? schema : undefined, examples: typeof schema !== 'boolean' && schema.examples ? [{ key: 'example', value: schema.examples }] : undefined }, ((required === null || required === void 0 ? void 0 : required.includes(name)) && { required: true }))));
@@ -1085,7 +1127,7 @@ const FormDataBody = ({ specification, values, onChangeValues }) => {
1085
1127
  if (supportsFileUpload) {
1086
1128
  return (React__namespace.createElement(FileUploadParameterEditor, { key: parameter.name, parameter: parameter, value: value instanceof File ? value : undefined, onChange: newValue => newValue
1087
1129
  ? onChangeValues(Object.assign(Object.assign({}, values), { [parameter.name]: newValue }))
1088
- : onChangeValues(_.omit(values, parameter.name)) }));
1130
+ : onChangeValues(omit__default["default"](values, parameter.name)) }));
1089
1131
  }
1090
1132
  return (React__namespace.createElement(ParameterEditor, { key: parameter.name, parameter: parameter, value: typeof value === 'string' ? value : undefined, onChange: (value) => onChangeValues(Object.assign(Object.assign({}, values), { [parameter.name]: typeof value === 'number' ? String(value) : value })) }));
1091
1133
  }))));
@@ -1119,7 +1161,7 @@ function createRequestBody(mediaTypeContent, bodyParameterValues) {
1119
1161
  });
1120
1162
  }
1121
1163
  const createUrlEncodedRequestBody = ({ bodyParameterValues = {} }) => tslib.__awaiter(void 0, void 0, void 0, function* () {
1122
- const filteredValues = _.pickBy(bodyParameterValues, _.isString);
1164
+ const filteredValues = pickBy__default["default"](bodyParameterValues, isString__default["default"]);
1123
1165
  return new URLSearchParams(filteredValues);
1124
1166
  });
1125
1167
  const createMultipartRequestBody = ({ mediaTypeContent, bodyParameterValues = {} }) => tslib.__awaiter(void 0, void 0, void 0, function* () {
@@ -1269,7 +1311,6 @@ const generateExamplesFromJsonSchema = (schema) => {
1269
1311
  : [{ label: 'default', data: '' }];
1270
1312
  }
1271
1313
  catch (e) {
1272
- console.error(e);
1273
1314
  return [{ label: '', data: `Example cannot be created for this schema\n${e}` }];
1274
1315
  }
1275
1316
  };
@@ -1452,7 +1493,7 @@ function buildPreferHeader({ code, example, dynamic }, httpOperation) {
1452
1493
  }
1453
1494
  const isCodeSupported = supportsResponseCode(httpOperation, code);
1454
1495
  const isExampleSupported = isCodeSupported && supportsExample(httpOperation, code, example);
1455
- const args = _.compact([
1496
+ const args = compact__default["default"]([
1456
1497
  code && isCodeSupported ? ['code', code] : undefined,
1457
1498
  dynamic ? ['dynamic', String(dynamic)] : undefined,
1458
1499
  example && isExampleSupported ? ['example', example] : undefined,
@@ -1473,7 +1514,7 @@ function supportsExample(httpOperation, code, exampleKey) {
1473
1514
  const response = (_a = httpOperation.responses) === null || _a === void 0 ? void 0 : _a.find(response => response.code === code);
1474
1515
  if (!response)
1475
1516
  return false;
1476
- const exampleKeys = _.uniq((_b = response.contents) === null || _b === void 0 ? void 0 : _b.flatMap(c => c.examples || []).map(example => example.key));
1517
+ const exampleKeys = uniq__default["default"]((_b = response.contents) === null || _b === void 0 ? void 0 : _b.flatMap(c => c.examples || []).map(example => example.key));
1477
1518
  return exampleKeys.includes(exampleKey);
1478
1519
  }
1479
1520
 
@@ -1498,7 +1539,7 @@ const MockingButton = ({ operation, options: { isEnabled, code, example, dynamic
1498
1539
  var _a;
1499
1540
  const menuId = `response-${operationResponse.code}`;
1500
1541
  const isActive = operationResponse.code === code;
1501
- const exampleKeys = _.uniq((_a = operationResponse.contents) === null || _a === void 0 ? void 0 : _a.flatMap(c => c.examples || []).map(example => example.key));
1542
+ const exampleKeys = uniq__default["default"]((_a = operationResponse.contents) === null || _a === void 0 ? void 0 : _a.flatMap(c => c.examples || []).map(example => example.key));
1502
1543
  const exampleChildren = exampleKeys === null || exampleKeys === void 0 ? void 0 : exampleKeys.map(exampleKey => ({
1503
1544
  id: `${menuId}-example-${exampleKey}`,
1504
1545
  title: exampleKey,
@@ -1586,10 +1627,10 @@ const useRequestParameters = (httpOperation) => {
1586
1627
  function extractAllParameters(httpOperation) {
1587
1628
  var _a, _b, _c, _d, _e, _f;
1588
1629
  const getRequired = (obj) => { var _a; return (_a = obj.required) !== null && _a !== void 0 ? _a : false; };
1589
- const pathParameters = _.orderBy((_b = (_a = httpOperation.request) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : [], [getRequired, 'name'], ['desc', 'asc']);
1590
- const queryParameters = filterOutAuthorizationParams(_.orderBy((_d = (_c = httpOperation.request) === null || _c === void 0 ? void 0 : _c.query) !== null && _d !== void 0 ? _d : [], [getRequired, 'name'], ['desc', 'asc']), httpOperation.security);
1591
- const headerParameters = filterOutAuthorizationParams(_.orderBy((_f = (_e = httpOperation.request) === null || _e === void 0 ? void 0 : _e.headers) !== null && _f !== void 0 ? _f : [], [getRequired, 'name'], ['desc', 'asc']), httpOperation.security);
1592
- return _.uniqBy([...pathParameters, ...queryParameters, ...headerParameters], p => p.name);
1630
+ const pathParameters = orderBy__default["default"]((_b = (_a = httpOperation.request) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : [], [getRequired, 'name'], ['desc', 'asc']);
1631
+ const queryParameters = filterOutAuthorizationParams(orderBy__default["default"]((_d = (_c = httpOperation.request) === null || _c === void 0 ? void 0 : _c.query) !== null && _d !== void 0 ? _d : [], [getRequired, 'name'], ['desc', 'asc']), httpOperation.security);
1632
+ const headerParameters = filterOutAuthorizationParams(orderBy__default["default"]((_f = (_e = httpOperation.request) === null || _e === void 0 ? void 0 : _e.headers) !== null && _f !== void 0 ? _f : [], [getRequired, 'name'], ['desc', 'asc']), httpOperation.security);
1633
+ return uniqBy__default["default"]([...pathParameters, ...queryParameters, ...headerParameters], p => p.name);
1593
1634
  }
1594
1635
 
1595
1636
  function getHttpCodeColor(code) {
@@ -1645,19 +1686,19 @@ const TryItResponse = ({ response }) => {
1645
1686
  ? parseBody(response.bodyText, responseType)
1646
1687
  : response.bodyText })) : response.blob && responseType === 'image' ? (React__namespace.createElement(mosaic.Flex, { justifyContent: "center" },
1647
1688
  React__namespace.createElement(mosaic.Image, { src: URL.createObjectURL(response.blob), alt: "response image" }))) : (React__namespace.createElement("p", null,
1648
- React__namespace.createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faExclamationCircle, className: "sl-mr-2" }),
1689
+ React__namespace.createElement(mosaic.Box, { as: mosaic.Icon, icon: freeSolidSvgIcons.faExclamationCircle, mr: 2 }),
1649
1690
  "No supported response body returned"))))));
1650
1691
  };
1651
1692
  const ResponseMenu = ({ types, type, onChange }) => {
1652
1693
  const menuItems = React__namespace.useMemo(() => {
1653
1694
  const items = types.map(type => ({
1654
1695
  id: type,
1655
- title: _.capitalize(type),
1696
+ title: capitalize__default["default"](type),
1656
1697
  onPress: () => onChange(type),
1657
1698
  }));
1658
1699
  return items;
1659
1700
  }, [types, onChange]);
1660
- return (React__namespace.createElement(mosaic.Menu, { "aria-label": "Body Format", items: menuItems, renderTrigger: ({ isOpen }) => (React__namespace.createElement(mosaic.Button, { appearance: "minimal", size: "sm", iconRight: ['fas', 'sort'], active: isOpen }, _.capitalize(type))) }));
1701
+ return (React__namespace.createElement(mosaic.Menu, { "aria-label": "Body Format", items: menuItems, renderTrigger: ({ isOpen }) => (React__namespace.createElement(mosaic.Button, { appearance: "minimal", size: "sm", iconRight: ['fas', 'sort'], active: isOpen }, capitalize__default["default"](type))) }));
1661
1702
  };
1662
1703
  const ResponseError = ({ state: { error } }) => (React__namespace.createElement(mosaic.Panel, { defaultIsOpen: true },
1663
1704
  React__namespace.createElement(mosaic.Panel.Titlebar, null, "Error"),
@@ -1699,18 +1740,22 @@ const TryIt = ({ httpOperation, mockUrl, onRequestChange, requestBodyIndex, embe
1699
1740
  }
1700
1741
  }, []);
1701
1742
  React__namespace.useEffect(() => {
1702
- let isActive = true;
1743
+ let isMounted = true;
1703
1744
  if (onRequestChange || embeddedInMd) {
1704
1745
  buildHarRequest(Object.assign(Object.assign({ mediaTypeContent, parameterValues: parameterValuesWithDefaults, httpOperation, bodyInput: formDataState.isFormDataBody ? bodyParameterValues : textRequestBody, auth: operationAuthValue }, (mockingOptions.isEnabled && { mockData: getMockData(mockUrl, httpOperation, mockingOptions) })), { chosenServer,
1705
1746
  corsProxy })).then(request => {
1706
- if (onRequestChange && isActive)
1707
- onRequestChange(request);
1708
- if (embeddedInMd)
1709
- setRequestData(request);
1747
+ if (isMounted) {
1748
+ if (onRequestChange) {
1749
+ onRequestChange(request);
1750
+ }
1751
+ if (embeddedInMd) {
1752
+ setRequestData(request);
1753
+ }
1754
+ }
1710
1755
  });
1711
1756
  }
1712
1757
  return () => {
1713
- isActive = false;
1758
+ isMounted = false;
1714
1759
  };
1715
1760
  }, [
1716
1761
  httpOperation,
@@ -1843,18 +1888,13 @@ const TryItWithRequestSamples = (_a) => {
1843
1888
  const TwoColumnLayout = ({ header, right, left, className }) => (React__default["default"].createElement(mosaic.Box, { w: "full", className: className },
1844
1889
  header,
1845
1890
  React__default["default"].createElement(mosaic.Flex, { mt: header ? 12 : undefined },
1846
- React__default["default"].createElement(mosaic.Box, { style: { width: 0 }, flex: 1 }, left),
1891
+ React__default["default"].createElement(mosaic.Box, { w: 0, flex: 1 }, left),
1847
1892
  right && (React__default["default"].createElement(mosaic.Box, { ml: 16, pos: "relative", w: "2/5", style: { maxWidth: 500 } }, right)))));
1848
1893
 
1849
1894
  const DeprecatedBadge = () => (React__default["default"].createElement(mosaic.Tooltip, { renderTrigger: React__default["default"].createElement(mosaic.Badge, { intent: "warning", icon: freeSolidSvgIcons.faExclamationCircle, "data-testid": "badge-deprecated" }, "Deprecated") }, "This operation has been marked as deprecated, which means it could be removed at some point in the future."));
1850
- const InternalBadge = ({ isHttpService }) => (React__default["default"].createElement(mosaic.Tooltip, { renderTrigger: React__default["default"].createElement(mosaic.Badge, { icon: freeSolidSvgIcons.faEye, "data-testid": "badge-internal", className: "sl-bg-danger sl-ml-0" }, "Internal") }, `This ${isHttpService ? 'operation' : 'model'} is marked as internal and won't be visible in public docs.`));
1851
- const SecurityBadge = ({ scheme, httpServiceUri, includeKey }) => {
1852
- const badge = (React__default["default"].createElement(mosaic.Badge, { icon: freeSolidSvgIcons.faLock, "data-testid": "badge-security", className: "sl-truncate", style: { backgroundColor: badgeDefaultBackgroundColor, color: badgeDefaultColor } }, getReadableSecurityName(scheme, includeKey)));
1853
- return httpServiceUri ? (React__default["default"].createElement(reactRouterDom.Link, { to: `${httpServiceUri}?security=${scheme.key}`, className: "sl-no-underline sl-block" }, badge)) : (badge);
1854
- };
1855
- const VersionBadge = ({ value, backgroundColor }) => (React__default["default"].createElement(mosaic.Badge, { appearance: "solid", size: "sm", style: {
1895
+ const InternalBadge = ({ isHttpService }) => (React__default["default"].createElement(mosaic.Tooltip, { renderTrigger: React__default["default"].createElement(mosaic.Badge, { icon: freeSolidSvgIcons.faEye, "data-testid": "badge-internal", bg: "danger", ml: 0 }, "Internal") }, `This ${isHttpService ? 'operation' : 'model'} is marked as internal and won't be visible in public docs.`));
1896
+ const VersionBadge = ({ value, backgroundColor }) => (React__default["default"].createElement(mosaic.Badge, { appearance: "solid", size: "sm", border: 0, style: {
1856
1897
  backgroundColor: backgroundColor || badgeDefaultBackgroundColor,
1857
- border: 'none',
1858
1898
  color: badgeDefaultColor,
1859
1899
  } }, enhanceVersionString(value)));
1860
1900
  const enhanceVersionString = (version) => {
@@ -1863,16 +1903,85 @@ const enhanceVersionString = (version) => {
1863
1903
  return `v${version}`;
1864
1904
  };
1865
1905
 
1906
+ const oauthFlowNames = {
1907
+ implicit: 'Implicit',
1908
+ authorizationCode: 'Authorization Code',
1909
+ clientCredentials: 'Client Credentials',
1910
+ password: 'Password',
1911
+ };
1912
+ function getDefaultDescription(scheme) {
1913
+ switch (scheme.type) {
1914
+ case 'apiKey':
1915
+ return getApiKeyDescription(scheme.in, scheme.name);
1916
+ case 'http':
1917
+ switch (scheme.scheme) {
1918
+ case 'basic':
1919
+ return getBasicAuthDescription();
1920
+ case 'bearer':
1921
+ return getBearerAuthDescription();
1922
+ case 'digest':
1923
+ return getDigestAuthDescription();
1924
+ }
1925
+ case 'oauth2':
1926
+ return getOAuthDescription(scheme);
1927
+ }
1928
+ return '';
1929
+ }
1930
+ function getApiKeyDescription(inProperty, name) {
1931
+ return `An API key is a token that you provide when making API calls. Include the token in a ${inProperty} parameter called \`${name}\`.
1932
+
1933
+ Example: ${inProperty === 'query' ? `\`?${name}=123\`` : `\`${name}: 123\``}`;
1934
+ }
1935
+ function getBasicAuthDescription() {
1936
+ return `Basic authentication is a simple authentication scheme built into the HTTP protocol.
1937
+ To use it, send your HTTP requests with an Authorization header that contains the word Basic
1938
+ followed by a space and a base64-encoded string \`username:password\`.
1939
+
1940
+ Example: \`Authorization: Basic ZGVtbzpwQDU1dzByZA==\``;
1941
+ }
1942
+ function getBearerAuthDescription() {
1943
+ return `Provide your bearer token in the Authorization header when making requests to protected resources.
1944
+
1945
+ Example: \`Authorization: Bearer 123\``;
1946
+ }
1947
+ function getDigestAuthDescription() {
1948
+ return `Provide your encrypted digest scheme data in the Authorization header when making requests to protected resources.
1949
+
1950
+ Example: \`Authorization: Digest username=guest, realm="test", nonce="2", uri="/uri", response="123"\``;
1951
+ }
1952
+ function getOAuthDescription(scheme) {
1953
+ const flows = keys__default["default"](scheme.flows);
1954
+ return flows.map(flow => getOAuthFlowDescription(oauthFlowNames[flow], scheme.flows[flow])).join('\n\n');
1955
+ }
1956
+ function getOAuthFlowDescription(title, flow) {
1957
+ let description = `**${title} OAuth Flow**`;
1958
+ description +=
1959
+ isOAuth2ImplicitFlow(flow) || isOauth2AuthorizationCodeFlow(flow)
1960
+ ? `\n\nAuthorize URL: ${flow.authorizationUrl}`
1961
+ : '';
1962
+ description +=
1963
+ isOauth2AuthorizationCodeFlow(flow) || isOauth2ClientCredentialsOrPasswordFlow(flow)
1964
+ ? `\n\nToken URL: ${flow.tokenUrl}`
1965
+ : '';
1966
+ description += flow.refreshUrl ? `\n\nRefresh URL: ${flow.refreshUrl}` : '';
1967
+ const scopes = entries__default["default"](flow.scopes);
1968
+ if (scopes.length) {
1969
+ description += `\n\nScopes:
1970
+ ${scopes.map(([key, value]) => `- \`${key}\` - ${value}`).join('\n')}`;
1971
+ }
1972
+ return description;
1973
+ }
1974
+
1866
1975
  const SectionTitle = ({ title, children }) => {
1867
1976
  return (React__namespace.createElement(mosaic.Flex, { role: "heading", borderB: true, mb: 3, pb: 3, "aria-label": title, align: "baseline" },
1868
1977
  React__namespace.createElement(mosaic.Text, { size: "xl", fontWeight: "semibold", mr: 5 }, title),
1869
1978
  children));
1870
1979
  };
1871
- const SubSectionPanel = ({ title, children, hasContent, rightComponent }) => {
1872
- return (React__namespace.createElement(mosaic.Panel, { appearance: "minimal", isCollapsible: hasContent, defaultIsOpen: true },
1980
+ const SubSectionPanel = ({ title, children, hasContent, rightComponent, defaultIsOpen = true, onChange, }) => {
1981
+ return (React__namespace.createElement(mosaic.Panel, { appearance: "minimal", isCollapsible: hasContent, defaultIsOpen: defaultIsOpen, onChange: onChange },
1873
1982
  React__namespace.createElement(mosaic.Panel.Titlebar, { fontWeight: "medium", rightComponent: rightComponent },
1874
1983
  React__namespace.createElement("div", { role: "heading" }, title)),
1875
- hasContent !== false && (React__namespace.createElement(mosaic.Panel.Content, { pr: 3, className: "sl-py-0 sl-pl-0" }, children))));
1984
+ hasContent !== false && (React__namespace.createElement(mosaic.Panel.Content, { pr: 3, pl: 6, p: 0 }, children))));
1876
1985
  };
1877
1986
 
1878
1987
  const Body = ({ body: { contents = [], description }, onChange }) => {
@@ -1914,7 +2023,7 @@ const defaultStyle = {
1914
2023
  const Parameters = ({ parameters, parameterType }) => {
1915
2024
  if (!parameters || !parameters.length)
1916
2025
  return null;
1917
- return (React__namespace.createElement(mosaic.VStack, { spacing: 2, pl: 6, divider: React__namespace.createElement(mosaic.Box, { borderT: true, borderColor: "light", w: "full" }) }, _.sortBy(parameters, ['required', 'name']).map(parameter => {
2026
+ return (React__namespace.createElement(mosaic.VStack, { spacing: 2, divider: React__namespace.createElement(mosaic.Box, { borderT: true, borderColor: "light", w: "full" }) }, sortBy__default["default"](parameters, ['required', 'name']).map(parameter => {
1918
2027
  return React__namespace.createElement(Parameter, { key: parameter.name, parameter: parameter, parameterType: parameterType });
1919
2028
  })));
1920
2029
  };
@@ -1923,11 +2032,11 @@ const Parameter = ({ parameter, parameterType }) => {
1923
2032
  var _a, _b, _c, _d, _e;
1924
2033
  if (!parameter)
1925
2034
  return null;
1926
- const description = _.get(parameter, 'description') || _.get(parameter, 'schema.description');
1927
- const rootType = _.get(parameter, 'schema.type', 'unknown');
2035
+ const description = get__default["default"](parameter, 'description') || get__default["default"](parameter, 'schema.description');
2036
+ const rootType = get__default["default"](parameter, 'schema.type', 'unknown');
1928
2037
  const type = ((_b = (_a = parameter.schema) === null || _a === void 0 ? void 0 : _a.items) === null || _b === void 0 ? void 0 : _b['type']) && rootType === 'array' ? `array[${parameter.schema.items['type']}]` : rootType;
1929
2038
  const format = (_c = parameter.schema) === null || _c === void 0 ? void 0 : _c.format;
1930
- const deprecated = _.get(parameter, 'deprecated') || _.get(parameter, 'schema.deprecated', false);
2039
+ const deprecated = get__default["default"](parameter, 'deprecated') || get__default["default"](parameter, 'schema.deprecated', false);
1931
2040
  const parameterExamples = ((_d = parameter.examples) === null || _d === void 0 ? void 0 : _d.map(example => {
1932
2041
  if (isNodeExample(example)) {
1933
2042
  return example.value;
@@ -1936,33 +2045,35 @@ const Parameter = ({ parameter, parameterType }) => {
1936
2045
  })) || [];
1937
2046
  const schemaExamples = (_e = parameter.schema) === null || _e === void 0 ? void 0 : _e.examples;
1938
2047
  const schemaExamplesArray = Array.isArray(schemaExamples) ? schemaExamples : [];
1939
- const validations = _.omitBy(Object.assign(Object.assign(Object.assign(Object.assign({}, _.omit(parameter, ['name', 'required', 'deprecated', 'description', 'schema', 'style', 'examples'])), _.omit(_.get(parameter, 'schema'), ['description', 'type', 'deprecated'])), _.omit(_.get(parameter, 'schema.items'), ['description', 'type', 'deprecated'])), { examples: [...parameterExamples, ...schemaExamplesArray] }), value => (typeof value === 'object' && _.isEmpty(value)) || typeof value === 'undefined');
1940
- return (React__namespace.createElement("div", { className: "HttpOperation__Parameters" },
1941
- React__namespace.createElement("div", { className: "sl-flex sl-items-center sl-my-2" },
1942
- React__namespace.createElement("div", { className: "sl-flex sl-items-baseline sl-text-base sl-flex-1" },
1943
- React__namespace.createElement("div", { className: "sl-font-mono sl-font-bold" }, parameter.name),
1944
- React__namespace.createElement("div", { className: 'sl-ml-2 sl-text-muted' }, format ? `${type}<${format}>` : type)),
1945
- React__namespace.createElement("div", { className: "sl-text-sm sl-text-warning" },
1946
- deprecated && React__namespace.createElement("span", { className: "sl-ml-2" }, "deprecated"),
1947
- parameter.required && React__namespace.createElement("span", { className: "sl-ml-2" }, "required"))),
1948
- description && (React__namespace.createElement("div", { className: "sl-w-full sl-text-muted sl-text-sm sl-my-2" },
2048
+ const validations = omitBy__default["default"](Object.assign(Object.assign(Object.assign(Object.assign({}, omit__default["default"](parameter, ['name', 'required', 'deprecated', 'description', 'schema', 'style', 'examples'])), omit__default["default"](get__default["default"](parameter, 'schema'), ['description', 'type', 'deprecated'])), omit__default["default"](get__default["default"](parameter, 'schema.items'), ['description', 'type', 'deprecated'])), { examples: [...parameterExamples, ...schemaExamplesArray] }), value => (typeof value === 'object' && isEmpty__default["default"](value)) || typeof value === 'undefined');
2049
+ return (React__namespace.createElement(mosaic.Box, { className: "HttpOperation__Parameters" },
2050
+ React__namespace.createElement(mosaic.Flex, { alignItems: "center", my: 2 },
2051
+ React__namespace.createElement(mosaic.Flex, { alignItems: "baseline", fontSize: "base", flex: 1 },
2052
+ React__namespace.createElement(mosaic.Box, { fontFamily: "mono", fontWeight: "bold" }, parameter.name),
2053
+ React__namespace.createElement(mosaic.Box, { ml: 2, color: "muted" }, format ? `${type}<${format}>` : type)),
2054
+ React__namespace.createElement(mosaic.Box, { fontSize: "sm", color: "warning" },
2055
+ deprecated && (React__namespace.createElement(mosaic.Box, { as: "span", ml: 2 }, "deprecated")),
2056
+ parameter.required && (React__namespace.createElement(mosaic.Box, { as: "span", ml: 2 }, "required")))),
2057
+ description && (React__namespace.createElement(mosaic.Box, { w: "full", color: "muted", fontSize: "sm", my: 2 },
1949
2058
  React__namespace.createElement(markdownViewer.MarkdownViewer, { markdown: description }))),
1950
- React__namespace.createElement("div", { className: "sl-text-sm" },
2059
+ React__namespace.createElement(mosaic.Box, { fontSize: "sm" },
1951
2060
  React__namespace.createElement(jsonSchemaViewer.Validations, { validations: validations })),
1952
- parameter.style && defaultStyle[parameterType] !== parameter.style && (React__namespace.createElement("div", { className: "sl-flex sl-my-2" },
1953
- React__namespace.createElement("span", { className: "sl-px-1 sl-text-muted sl-font-mono sl-border sl-rounded-lg sl-text-sm sl-capitalize", style: { backgroundColor: '#EDF2F7' } }, readableStyles[parameter.style] || parameter.style)))));
2061
+ parameter.style && defaultStyle[parameterType] !== parameter.style && (React__namespace.createElement(mosaic.Flex, { my: 2 },
2062
+ React__namespace.createElement(mosaic.Box, { as: "span", px: 1, color: "muted", fontFamily: "mono", rounded: "lg", fontSize: "sm", textTransform: "capitalize", style: { backgroundColor: '#EDF2F7' } }, readableStyles[parameter.style] || parameter.style)))));
1954
2063
  };
1955
2064
  Parameter.displayName = 'HttpOperation.Parameter';
1956
2065
 
1957
2066
  const Request = ({ operation: { path, method, request, request: { path: pathParams = [], headers: headerParams = [], cookie: cookieParams = [], body, query: queryParams = [], } = {}, security, }, onChange, }) => {
1958
2067
  if (!request || typeof request !== 'object')
1959
2068
  return null;
1960
- const pathParamBlock = (React__namespace.createElement("div", null,
2069
+ const securitySchemes = flatten__default["default"](security);
2070
+ const pathParamBlock = (React__namespace.createElement(mosaic.Box, null,
1961
2071
  React__namespace.createElement(mosaic.Text, { textTransform: "uppercase", mr: 1, color: HttpMethodColors[method] }, method),
1962
2072
  ' ',
1963
2073
  path));
1964
- return (React__namespace.createElement(mosaic.Box, { mb: 10 },
2074
+ return (React__namespace.createElement(mosaic.Box, null,
1965
2075
  React__namespace.createElement(SectionTitle, { title: "Request" }),
2076
+ securitySchemes.map((scheme, i) => (React__namespace.createElement(SecurityPanel, { key: i, scheme: scheme, includeKey: shouldIncludeKey(securitySchemes, scheme.type) }))),
1966
2077
  React__namespace.createElement(SubSectionPanel, { title: pathParamBlock, hasContent: pathParams.length > 0 },
1967
2078
  React__namespace.createElement(Parameters, { parameterType: "path", parameters: pathParams })),
1968
2079
  queryParams.length > 0 && (React__namespace.createElement(SubSectionPanel, { title: "Query" },
@@ -1973,11 +2084,17 @@ const Request = ({ operation: { path, method, request, request: { path: pathPara
1973
2084
  React__namespace.createElement(Parameters, { parameterType: "cookie", parameters: cookieParams }))),
1974
2085
  body && React__namespace.createElement(Body, { onChange: onChange, body: body })));
1975
2086
  };
1976
- Request.displayName = 'HttpOperation.Request';
2087
+ Request.displayName = 'HttpOperation.Request';
2088
+ const schemeExpandedState = utils.atomWithStorage('HttpOperation_security_expanded', {});
2089
+ const SecurityPanel = ({ scheme, includeKey }) => {
2090
+ const [expandedState, setExpanded] = jotai.useAtom(schemeExpandedState);
2091
+ return (React__namespace.createElement(SubSectionPanel, { title: `Security: ${getReadableSecurityName(scheme, includeKey)}`, defaultIsOpen: !!expandedState[scheme.key], onChange: isOpen => setExpanded(Object.assign(Object.assign({}, expandedState), { [scheme.key]: isOpen })) },
2092
+ React__namespace.createElement(MarkdownViewer, { style: { fontSize: 12 }, markdown: `${scheme.description || ''}\n\n` + getDefaultDescription(scheme) })));
2093
+ };
1977
2094
 
1978
2095
  const Responses = ({ responses: unsortedResponses, onStatusCodeChange, onMediaTypeChange }) => {
1979
2096
  var _a, _b;
1980
- const responses = _.sortBy(_.uniqBy(unsortedResponses, r => r.code), r => r.code);
2097
+ const responses = sortBy__default["default"](uniqBy__default["default"](unsortedResponses, r => r.code), r => r.code);
1981
2098
  const [activeResponseId, setActiveResponseId] = React__namespace.useState((_b = (_a = responses[0]) === null || _a === void 0 ? void 0 : _a.code) !== null && _b !== void 0 ? _b : '');
1982
2099
  React__namespace.useEffect(() => {
1983
2100
  onStatusCodeChange(activeResponseId);
@@ -2009,7 +2126,7 @@ const Response = ({ response: { contents = [], headers = [], description }, onMe
2009
2126
  };
2010
2127
  Response.displayName = 'HttpOperation.Response';
2011
2128
 
2012
- const HttpOperationComponent = React__namespace.memo(({ className, data: unresolvedData, uri, allowRouting = false, layoutOptions, tryItCredentialsPolicy, tryItCorsProxy, }) => {
2129
+ const HttpOperationComponent = React__namespace.memo(({ className, data: unresolvedData, layoutOptions, tryItCredentialsPolicy, tryItCorsProxy }) => {
2013
2130
  const data = useResolvedObject(unresolvedData);
2014
2131
  const mocking = React__namespace.useContext(MockingContext);
2015
2132
  const isDeprecated = !!data.deprecated;
@@ -2017,21 +2134,17 @@ const HttpOperationComponent = React__namespace.memo(({ className, data: unresol
2017
2134
  const [responseMediaType, setResponseMediaType] = React__namespace.useState('');
2018
2135
  const [responseStatusCode, setResponseStatusCode] = React__namespace.useState('');
2019
2136
  const [requestBodyIndex, setTextRequestBodyIndex] = React__namespace.useState(0);
2020
- const httpServiceUri = uri && getServiceUriFromOperation(uri);
2021
- const securitySchemes = _.flatten(data.security);
2022
- const hasBadges = isDeprecated || securitySchemes.length > 0 || isInternal;
2137
+ const hasBadges = isDeprecated || isInternal;
2023
2138
  const header = (!(layoutOptions === null || layoutOptions === void 0 ? void 0 : layoutOptions.noHeading) || hasBadges) && (React__namespace.createElement(React__namespace.Fragment, null,
2024
2139
  !(layoutOptions === null || layoutOptions === void 0 ? void 0 : layoutOptions.noHeading) && (React__namespace.createElement(mosaic.Heading, { size: 1, mb: 4, fontWeight: "semibold" }, data.summary || data.iid || `${data.method} ${data.path}`)),
2025
2140
  hasBadges && (React__namespace.createElement(mosaic.HStack, { spacing: 2 },
2026
2141
  isDeprecated && React__namespace.createElement(DeprecatedBadge, null),
2027
- _.sortBy(securitySchemes, 'type').map((scheme, i) => (React__namespace.createElement(SecurityBadge, { key: i, scheme: scheme, httpServiceUri: allowRouting ? httpServiceUri : undefined, includeKey: shouldIncludeKey(securitySchemes, scheme.type) }))),
2028
2142
  isInternal && React__namespace.createElement(InternalBadge, { isHttpService: true })))));
2029
- const description = (React__namespace.createElement(React__namespace.Fragment, null,
2030
- data.description && (React__namespace.createElement(MarkdownViewer, { className: "HttpOperation__Description sl-mb-10", markdown: data.description })),
2143
+ const description = (React__namespace.createElement(mosaic.VStack, { spacing: 6 },
2144
+ data.description && React__namespace.createElement(MarkdownViewer, { className: "HttpOperation__Description", markdown: data.description }),
2031
2145
  React__namespace.createElement(Request, { onChange: setTextRequestBodyIndex, operation: data }),
2032
2146
  data.responses && (React__namespace.createElement(Responses, { responses: data.responses, onMediaTypeChange: setResponseMediaType, onStatusCodeChange: setResponseStatusCode }))));
2033
- const tryItPanel = !(layoutOptions === null || layoutOptions === void 0 ? void 0 : layoutOptions.hideTryItPanel) && (React__namespace.createElement(mosaic.Box, { className: "HttpOperation__gutter" },
2034
- React__namespace.createElement(TryItWithRequestSamples, { httpOperation: data, responseMediaType: responseMediaType, responseStatusCode: responseStatusCode, requestBodyIndex: requestBodyIndex, hideTryIt: layoutOptions === null || layoutOptions === void 0 ? void 0 : layoutOptions.hideTryIt, tryItCredentialsPolicy: tryItCredentialsPolicy, mockUrl: mocking.hideMocking ? undefined : mocking.mockUrl, corsProxy: tryItCorsProxy })));
2147
+ const tryItPanel = !(layoutOptions === null || layoutOptions === void 0 ? void 0 : layoutOptions.hideTryItPanel) && (React__namespace.createElement(TryItWithRequestSamples, { httpOperation: data, responseMediaType: responseMediaType, responseStatusCode: responseStatusCode, requestBodyIndex: requestBodyIndex, hideTryIt: layoutOptions === null || layoutOptions === void 0 ? void 0 : layoutOptions.hideTryIt, tryItCredentialsPolicy: tryItCredentialsPolicy, mockUrl: mocking.hideMocking ? undefined : mocking.mockUrl, corsProxy: tryItCorsProxy }));
2035
2148
  return (React__namespace.createElement(TwoColumnLayout, { className: cn__default["default"]('HttpOperation', className), header: header, left: description, right: tryItPanel }));
2036
2149
  });
2037
2150
  HttpOperationComponent.displayName = 'HttpOperation.Component';
@@ -2041,8 +2154,8 @@ const HttpOperation = reactErrorBoundary.withErrorBoundary(HttpOperationComponen
2041
2154
 
2042
2155
  const PoweredByLink = ({ source, pathname, packageType, layout = 'sidebar' }) => {
2043
2156
  return (React__namespace.createElement(mosaic.Flex, { as: "a", align: "center", borderT: layout === 'stacked' ? undefined : true, px: layout === 'stacked' ? 1 : 4, py: 3, justify: layout === 'stacked' ? 'end' : undefined, href: `https://stoplight.io/?utm_source=${packageType}&utm_medium=${source}&utm_campaign=powered_by&utm_content=${pathname}`, target: "_blank", rel: "noopener noreferrer" },
2044
- React__namespace.createElement(reactFontawesome.FontAwesomeIcon, { icon: freeSolidSvgIcons.faBolt, className: "sl-mr-1 fa-fw", style: { color: 'rgba(144, 97, 249, 1)' } }),
2045
- React__namespace.createElement("div", null,
2157
+ React__namespace.createElement(mosaic.Box, { as: mosaic.Icon, icon: freeSolidSvgIcons.faBolt, mr: 1, className: "fa-fw", style: { color: 'rgba(144, 97, 249, 1)' } }),
2158
+ React__namespace.createElement(mosaic.Box, null,
2046
2159
  "powered by\u00A0",
2047
2160
  React__namespace.createElement("strong", null, "Stoplight"))));
2048
2161
  };
@@ -2076,83 +2189,19 @@ const ExportButton = ({ original, bundled }) => {
2076
2189
  React__namespace.createElement(mosaic.Menu, { "aria-label": "Export", items: menuItems, renderTrigger: ({ isOpen }) => (React__namespace.createElement(mosaic.Button, { iconRight: "chevron-down", appearance: "default", ml: 2, active: isOpen, size: "sm" }, "Export")) })));
2077
2190
  };
2078
2191
 
2079
- const oauthFlowNames = {
2080
- implicit: 'Implicit',
2081
- authorizationCode: 'Authorization Code',
2082
- clientCredentials: 'Client Credentials',
2083
- password: 'Password',
2084
- };
2085
- const SecuritySchemes = ({ schemes, defaultScheme }) => {
2086
- return (React__default["default"].createElement(mosaic.Panel, { rounded: true, isCollapsible: false },
2192
+ const SecuritySchemes = ({ schemes, defaultScheme, defaultCollapsed = false, }) => {
2193
+ return (React__default["default"].createElement(mosaic.Panel, { rounded: true, isCollapsible: defaultCollapsed },
2087
2194
  React__default["default"].createElement(mosaic.Panel.Titlebar, { bg: "canvas-300" },
2088
- React__default["default"].createElement("span", { role: "heading" }, "Security")),
2089
- React__default["default"].createElement(mosaic.Panel.Content, { p: 0 }, _.sortBy(schemes, 'type').map((scheme, i) => (React__default["default"].createElement(mosaic.Panel, { key: i, defaultIsOpen: defaultScheme ? scheme.key === defaultScheme : i === 0, isCollapsible: schemes.length > 1 },
2090
- React__default["default"].createElement(mosaic.Panel.Titlebar, null,
2091
- React__default["default"].createElement("span", { role: "heading" }, getReadableSecurityName(scheme, shouldIncludeKey(schemes, scheme.type)))),
2092
- React__default["default"].createElement(mosaic.Panel.Content, null,
2093
- React__default["default"].createElement(MarkdownViewer, { style: { fontSize: 12 }, markdown: `${scheme.description || ''}\n\n` + getDefaultDescription(scheme) }))))))));
2195
+ React__default["default"].createElement(mosaic.Box, { as: "span", role: "heading" }, "Security")),
2196
+ React__default["default"].createElement(mosaic.Panel.Content, { p: 0 }, sortBy__default["default"](schemes, 'type').map((scheme, i) => (React__default["default"].createElement(SecurityScheme, { key: i, scheme: scheme, defaultIsOpen: defaultScheme ? scheme.key === defaultScheme : i === 0, isCollapsible: schemes.length > 1, showSchemeKey: shouldIncludeKey(schemes, scheme.type) }))))));
2094
2197
  };
2095
- function getDefaultDescription(scheme) {
2096
- switch (scheme.type) {
2097
- case 'apiKey':
2098
- return getApiKeyDescription(scheme.in, scheme.name);
2099
- case 'http':
2100
- switch (scheme.scheme) {
2101
- case 'basic':
2102
- return getBasicAuthDescription();
2103
- case 'bearer':
2104
- return getBearerAuthDescription();
2105
- case 'digest':
2106
- return getDigestAuthDescription();
2107
- }
2108
- case 'oauth2':
2109
- return getOAuthDescription(scheme);
2110
- }
2111
- return '';
2112
- }
2113
- function getApiKeyDescription(inProperty, name) {
2114
- return `An API key is a token that you provide when making API calls. Include the token in a ${inProperty} parameter called \`${name}\`.
2115
-
2116
- Example: ${inProperty === 'query' ? `\`?${name}=123\`` : `\`${name}: 123\``}`;
2117
- }
2118
- function getBasicAuthDescription() {
2119
- return `Basic authentication is a simple authentication scheme built into the HTTP protocol.
2120
- To use it, send your HTTP requests with an Authorization header that contains the word Basic
2121
- followed by a space and a base64-encoded string \`username:password\`.
2122
-
2123
- Example: \`Authorization: Basic ZGVtbzpwQDU1dzByZA==\``;
2124
- }
2125
- function getBearerAuthDescription() {
2126
- return `Provide your bearer token in the Authorization header when making requests to protected resources.
2127
-
2128
- Example: \`Authorization: Bearer 123\``;
2129
- }
2130
- function getDigestAuthDescription() {
2131
- return `Provide your encrypted digest scheme data in the Authorization header when making requests to protected resources.
2132
-
2133
- Example: \`Authorization: Digest username=guest, realm="test", nonce="2", uri="/uri", response="123"\``;
2134
- }
2135
- function getOAuthDescription(scheme) {
2136
- const flows = _.keys(scheme.flows);
2137
- return flows.map(flow => getOAuthFlowDescription(oauthFlowNames[flow], scheme.flows[flow])).join('\n\n');
2138
- }
2139
- function getOAuthFlowDescription(title, flow) {
2140
- let description = `**${title} OAuth Flow**`;
2141
- description +=
2142
- isOAuth2ImplicitFlow(flow) || isOauth2AuthorizationCodeFlow(flow)
2143
- ? `\n\nAuthorize URL: ${flow.authorizationUrl}`
2144
- : '';
2145
- description +=
2146
- isOauth2AuthorizationCodeFlow(flow) || isOauth2ClientCredentialsOrPasswordFlow(flow)
2147
- ? `\n\nToken URL: ${flow.tokenUrl}`
2148
- : '';
2149
- description += flow.refreshUrl ? `\n\nRefresh URL: ${flow.refreshUrl}` : '';
2150
- description += `\n\nScopes:
2151
- ${_.entries(flow.scopes)
2152
- .map(([key, value]) => `- \`${key}\` - ${value}`)
2153
- .join('\n')}`;
2154
- return description;
2155
- }
2198
+ const SecurityScheme = ({ scheme, defaultIsOpen, isCollapsible, showSchemeKey }) => {
2199
+ return (React__default["default"].createElement(mosaic.Panel, { defaultIsOpen: defaultIsOpen, isCollapsible: isCollapsible },
2200
+ React__default["default"].createElement(mosaic.Panel.Titlebar, null,
2201
+ React__default["default"].createElement(mosaic.Box, { as: "span", role: "heading" }, getReadableSecurityName(scheme, showSchemeKey))),
2202
+ React__default["default"].createElement(mosaic.Panel.Content, null,
2203
+ React__default["default"].createElement(MarkdownViewer, { style: { fontSize: 12 }, markdown: `${scheme.description || ''}\n\n` + getDefaultDescription(scheme) }))));
2204
+ };
2156
2205
 
2157
2206
  const ServerInfo = ({ servers, mockUrl }) => {
2158
2207
  const mocking = React__namespace.useContext(MockingContext);
@@ -2307,7 +2356,7 @@ function useParsedValue(value) {
2307
2356
  }
2308
2357
 
2309
2358
  function isPartialHttpRequest(maybeHttpRequest) {
2310
- return (_.isObject(maybeHttpRequest) &&
2359
+ return (isObject__default["default"](maybeHttpRequest) &&
2311
2360
  'method' in maybeHttpRequest &&
2312
2361
  typeof maybeHttpRequest['method'] === 'string' &&
2313
2362
  'url' in maybeHttpRequest &&
@@ -2318,7 +2367,7 @@ const SchemaAndDescription = ({ title: titleProp, schema }) => {
2318
2367
  const title = titleProp !== null && titleProp !== void 0 ? titleProp : schema.title;
2319
2368
  return (React__default["default"].createElement(mosaic.Box, { py: 2 },
2320
2369
  title && (React__default["default"].createElement(mosaic.Flex, { alignItems: "center", p: 2 },
2321
- React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, { icon: NodeTypeIconDefs[types.NodeType.Model], color: NodeTypeColors[types.NodeType.Model] }),
2370
+ React__default["default"].createElement(mosaic.Icon, { icon: NodeTypeIconDefs[types.NodeType.Model], color: NodeTypeColors[types.NodeType.Model] }),
2322
2371
  React__default["default"].createElement(mosaic.Box, { color: "muted", px: 2 }, title))),
2323
2372
  React__default["default"].createElement(jsonSchemaViewer.JsonSchemaViewer, { resolveRef: resolveRef, schema: getOriginalObject(schema) })));
2324
2373
  };
@@ -2333,7 +2382,7 @@ const CodeComponent = props => {
2333
2382
  return React__default["default"].createElement(SchemaAndDescription, { title: title, schema: parsedValue });
2334
2383
  }
2335
2384
  if (http) {
2336
- if (!_.isObject(parsedValue) || (!isPartialHttpRequest(parsedValue) && !isHttpOperation(parsedValue))) {
2385
+ if (!isObject__default["default"](parsedValue) || (!isPartialHttpRequest(parsedValue) && !isHttpOperation(parsedValue))) {
2337
2386
  return null;
2338
2387
  }
2339
2388
  return (React__default["default"].createElement(TryIt, { httpOperation: isHttpOperation(parsedValue) ? parsedValue : parseHttpRequest(parsedValue), embeddedInMd: true }));
@@ -2642,28 +2691,30 @@ function useBundleRefsIntoDocument(document, options) {
2642
2691
  const [bundledData, setBundledData] = React__namespace.useState(document);
2643
2692
  const baseUrl = options === null || options === void 0 ? void 0 : options.baseUrl;
2644
2693
  React__namespace.useEffect(() => {
2645
- if (!_.isObject(document)) {
2694
+ if (!isObject__default["default"](document)) {
2646
2695
  setBundledData(document);
2647
2696
  return;
2648
2697
  }
2649
- let isActive = true;
2698
+ let isMounted = true;
2650
2699
  doBundle(document, baseUrl)
2651
2700
  .then(res => {
2652
- if (isActive) {
2701
+ if (isMounted) {
2653
2702
  setBundledData(Object.assign({}, res));
2654
2703
  }
2655
2704
  })
2656
2705
  .catch(reason => {
2657
2706
  var _a;
2658
2707
  if (typeof reason === 'object' && reason !== null && 'files' in reason) {
2659
- setBundledData(Object.assign({}, reason.files.schema));
2708
+ if (isMounted) {
2709
+ setBundledData(Object.assign({}, reason.files.schema));
2710
+ }
2660
2711
  }
2661
2712
  else {
2662
2713
  console.warn(`Could bundle: ${(_a = reason === null || reason === void 0 ? void 0 : reason.message) !== null && _a !== void 0 ? _a : 'Unknown error'}`);
2663
2714
  }
2664
2715
  });
2665
2716
  return () => {
2666
- isActive = false;
2717
+ isMounted = false;
2667
2718
  };
2668
2719
  }, [document, baseUrl]);
2669
2720
  return bundledData;
@@ -2706,7 +2757,7 @@ const createElementClass = (Component, propDescriptors) => {
2706
2757
  constructor() {
2707
2758
  super();
2708
2759
  this._props = {};
2709
- Object.defineProperties(this, _.mapValues(propDescriptors, (_, key) => ({
2760
+ Object.defineProperties(this, mapValues__default["default"](propDescriptors, (_, key) => ({
2710
2761
  get: () => {
2711
2762
  return this._props[key];
2712
2763
  },
@@ -2727,7 +2778,7 @@ const createElementClass = (Component, propDescriptors) => {
2727
2778
  attributeChangedCallback(name, oldValue, newValue) {
2728
2779
  if (propDescriptors[name]) {
2729
2780
  const newPropValue = this._safeReadAttribute(name);
2730
- if (!_.isEqual(this._props[name], newPropValue)) {
2781
+ if (!isEqual__default["default"](this._props[name], newPropValue)) {
2731
2782
  this._props[name] = newPropValue;
2732
2783
  this._renderComponent();
2733
2784
  }
@@ -2793,7 +2844,7 @@ const createElementClass = (Component, propDescriptors) => {
2793
2844
  }
2794
2845
  _renderComponent() {
2795
2846
  if (this._mountPoint) {
2796
- const props = _.mapValues(propDescriptors, (descriptor, key) => { var _a; return (_a = this._props[key]) !== null && _a !== void 0 ? _a : descriptor.defaultValue; });
2847
+ const props = mapValues__default["default"](propDescriptors, (descriptor, key) => { var _a; return (_a = this._props[key]) !== null && _a !== void 0 ? _a : descriptor.defaultValue; });
2797
2848
  ReactDOM__namespace.render(React__namespace.createElement(Component, props), this._mountPoint);
2798
2849
  }
2799
2850
  }