import { safeStringify } from '@stoplight/json'; import { Dictionary } from '@stoplight/types'; import { Popover } from '@stoplight/ui-kit'; import { JSONSchema4 } from 'json-schema'; import * as React from 'react'; import { ViewModeContext } from '../JsonSchemaViewer'; import { PropertyTypeColors } from './Types'; export interface IValidations { required: boolean; validations: (Dictionary | {}) & { deprecated?: boolean; readOnly?: unknown; writeOnly?: unknown; format?: unknown; }; } export const Validations: React.FunctionComponent = ({ required, validations: { deprecated, readOnly, writeOnly, format, ...validations }, }) => { const viewMode = React.useContext(ViewModeContext); const validationCount = Object.keys(validations).length; const requiredElem = (
{required && required} {validationCount ? +{validationCount} : null}
); // Show readOnly writeOnly validations only in standalone mode and only if just one of them is present const showVisibilityValidations = viewMode === 'standalone' && !!readOnly !== !!writeOnly; const visibility = showVisibilityValidations ? ( readOnly ? ( read-only ) : ( write-only ) ) : null; return ( <> {deprecated ? deprecated : null} {visibility} {validationCount ? ( {Object.keys(validations).map((key, index) => { const validation = validations[key]; let elem = null; if (Array.isArray(validation)) { elem = validation.map((v, i) => (
{String(v)}
{i < validation.length - 1 ?
,
: null}
)); } else if (typeof validation === 'object') { elem = (
{'{...}'}
); } else { elem = (
{typeof validation === 'string' ? `"${validation}"` : safeStringify(validation)}
); } return (
{key}:
{elem}
); })} } target={requiredElem} /> ) : ( requiredElem )} ); }; export const Format: React.FunctionComponent<{ schema: JSONSchema4 }> = ({ schema }) => { return (
{`<${schema.format}>`}
); };