fix(json-schema-2020-12): expand deeply all Schema Objects and complex keywords (#9581)
Refs #9508 Supersedes #9510 Co-authored-by: Julien Bourges <julien.bourges@actility.com>
This commit is contained in:
@@ -5,13 +5,14 @@ import React, { useCallback, useState } from "react"
|
|||||||
import classNames from "classnames"
|
import classNames from "classnames"
|
||||||
|
|
||||||
import { schema } from "../../prop-types"
|
import { schema } from "../../prop-types"
|
||||||
import { useComponent, useIsExpandedDeeply } from "../../hooks"
|
import { useComponent, useIsExpanded, useIsExpandedDeeply } from "../../hooks"
|
||||||
import { JSONSchemaDeepExpansionContext } from "../../context"
|
import { JSONSchemaDeepExpansionContext } from "../../context"
|
||||||
|
|
||||||
const $defs = ({ schema }) => {
|
const $defs = ({ schema }) => {
|
||||||
const $defs = schema?.$defs || {}
|
const $defs = schema?.$defs || {}
|
||||||
|
const isExpanded = useIsExpanded()
|
||||||
const isExpandedDeeply = useIsExpandedDeeply()
|
const isExpandedDeeply = useIsExpandedDeeply()
|
||||||
const [expanded, setExpanded] = useState(isExpandedDeeply)
|
const [expanded, setExpanded] = useState(isExpanded || isExpandedDeeply)
|
||||||
const [expandedDeeply, setExpandedDeeply] = useState(false)
|
const [expandedDeeply, setExpandedDeeply] = useState(false)
|
||||||
const Accordion = useComponent("Accordion")
|
const Accordion = useComponent("Accordion")
|
||||||
const ExpandDeepButton = useComponent("ExpandDeepButton")
|
const ExpandDeepButton = useComponent("ExpandDeepButton")
|
||||||
|
|||||||
@@ -5,11 +5,16 @@ import React, { useCallback, useState } from "react"
|
|||||||
import classNames from "classnames"
|
import classNames from "classnames"
|
||||||
|
|
||||||
import { schema } from "../../../prop-types"
|
import { schema } from "../../../prop-types"
|
||||||
import { useComponent, useIsExpandedDeeply } from "../../../hooks"
|
import {
|
||||||
|
useComponent,
|
||||||
|
useIsExpanded,
|
||||||
|
useIsExpandedDeeply,
|
||||||
|
} from "../../../hooks"
|
||||||
|
|
||||||
const $vocabulary = ({ schema }) => {
|
const $vocabulary = ({ schema }) => {
|
||||||
|
const isExpanded = useIsExpanded()
|
||||||
const isExpandedDeeply = useIsExpandedDeeply()
|
const isExpandedDeeply = useIsExpandedDeeply()
|
||||||
const [expanded, setExpanded] = useState(isExpandedDeeply)
|
const [expanded, setExpanded] = useState(isExpanded || isExpandedDeeply)
|
||||||
const Accordion = useComponent("Accordion")
|
const Accordion = useComponent("Accordion")
|
||||||
|
|
||||||
const handleExpansion = useCallback(() => {
|
const handleExpansion = useCallback(() => {
|
||||||
|
|||||||
@@ -5,14 +5,20 @@ import React, { useCallback, useState } from "react"
|
|||||||
import classNames from "classnames"
|
import classNames from "classnames"
|
||||||
|
|
||||||
import { schema } from "../../prop-types"
|
import { schema } from "../../prop-types"
|
||||||
import { useFn, useComponent, useIsExpandedDeeply } from "../../hooks"
|
import {
|
||||||
|
useFn,
|
||||||
|
useComponent,
|
||||||
|
useIsExpanded,
|
||||||
|
useIsExpandedDeeply,
|
||||||
|
} from "../../hooks"
|
||||||
import { JSONSchemaDeepExpansionContext } from "../../context"
|
import { JSONSchemaDeepExpansionContext } from "../../context"
|
||||||
|
|
||||||
const AllOf = ({ schema }) => {
|
const AllOf = ({ schema }) => {
|
||||||
const allOf = schema?.allOf || []
|
const allOf = schema?.allOf || []
|
||||||
const fn = useFn()
|
const fn = useFn()
|
||||||
|
const isExpanded = useIsExpanded()
|
||||||
const isExpandedDeeply = useIsExpandedDeeply()
|
const isExpandedDeeply = useIsExpandedDeeply()
|
||||||
const [expanded, setExpanded] = useState(isExpandedDeeply)
|
const [expanded, setExpanded] = useState(isExpanded || isExpandedDeeply)
|
||||||
const [expandedDeeply, setExpandedDeeply] = useState(false)
|
const [expandedDeeply, setExpandedDeeply] = useState(false)
|
||||||
const Accordion = useComponent("Accordion")
|
const Accordion = useComponent("Accordion")
|
||||||
const ExpandDeepButton = useComponent("ExpandDeepButton")
|
const ExpandDeepButton = useComponent("ExpandDeepButton")
|
||||||
|
|||||||
@@ -5,14 +5,20 @@ import React, { useCallback, useState } from "react"
|
|||||||
import classNames from "classnames"
|
import classNames from "classnames"
|
||||||
|
|
||||||
import { schema } from "../../prop-types"
|
import { schema } from "../../prop-types"
|
||||||
import { useFn, useComponent, useIsExpandedDeeply } from "../../hooks"
|
import {
|
||||||
|
useFn,
|
||||||
|
useComponent,
|
||||||
|
useIsExpanded,
|
||||||
|
useIsExpandedDeeply,
|
||||||
|
} from "../../hooks"
|
||||||
import { JSONSchemaDeepExpansionContext } from "../../context"
|
import { JSONSchemaDeepExpansionContext } from "../../context"
|
||||||
|
|
||||||
const AnyOf = ({ schema }) => {
|
const AnyOf = ({ schema }) => {
|
||||||
const anyOf = schema?.anyOf || []
|
const anyOf = schema?.anyOf || []
|
||||||
const fn = useFn()
|
const fn = useFn()
|
||||||
|
const isExpanded = useIsExpanded()
|
||||||
const isExpandedDeeply = useIsExpandedDeeply()
|
const isExpandedDeeply = useIsExpandedDeeply()
|
||||||
const [expanded, setExpanded] = useState(isExpandedDeeply)
|
const [expanded, setExpanded] = useState(isExpanded || isExpandedDeeply)
|
||||||
const [expandedDeeply, setExpandedDeeply] = useState(false)
|
const [expandedDeeply, setExpandedDeeply] = useState(false)
|
||||||
const Accordion = useComponent("Accordion")
|
const Accordion = useComponent("Accordion")
|
||||||
const ExpandDeepButton = useComponent("ExpandDeepButton")
|
const ExpandDeepButton = useComponent("ExpandDeepButton")
|
||||||
|
|||||||
@@ -5,13 +5,14 @@ import React, { useCallback, useState } from "react"
|
|||||||
import classNames from "classnames"
|
import classNames from "classnames"
|
||||||
|
|
||||||
import { schema } from "../../prop-types"
|
import { schema } from "../../prop-types"
|
||||||
import { useComponent, useIsExpandedDeeply } from "../../hooks"
|
import { useComponent, useIsExpanded, useIsExpandedDeeply } from "../../hooks"
|
||||||
import { JSONSchemaDeepExpansionContext } from "../../context"
|
import { JSONSchemaDeepExpansionContext } from "../../context"
|
||||||
|
|
||||||
const DependentSchemas = ({ schema }) => {
|
const DependentSchemas = ({ schema }) => {
|
||||||
const dependentSchemas = schema?.dependentSchemas || []
|
const dependentSchemas = schema?.dependentSchemas || []
|
||||||
|
const isExpanded = useIsExpanded()
|
||||||
const isExpandedDeeply = useIsExpandedDeeply()
|
const isExpandedDeeply = useIsExpandedDeeply()
|
||||||
const [expanded, setExpanded] = useState(isExpandedDeeply)
|
const [expanded, setExpanded] = useState(isExpanded || isExpandedDeeply)
|
||||||
const [expandedDeeply, setExpandedDeeply] = useState(false)
|
const [expandedDeeply, setExpandedDeeply] = useState(false)
|
||||||
const Accordion = useComponent("Accordion")
|
const Accordion = useComponent("Accordion")
|
||||||
const ExpandDeepButton = useComponent("ExpandDeepButton")
|
const ExpandDeepButton = useComponent("ExpandDeepButton")
|
||||||
|
|||||||
@@ -5,14 +5,20 @@ import React, { useCallback, useState } from "react"
|
|||||||
import classNames from "classnames"
|
import classNames from "classnames"
|
||||||
|
|
||||||
import { schema } from "../../prop-types"
|
import { schema } from "../../prop-types"
|
||||||
import { useFn, useComponent, useIsExpandedDeeply } from "../../hooks"
|
import {
|
||||||
|
useFn,
|
||||||
|
useComponent,
|
||||||
|
useIsExpanded,
|
||||||
|
useIsExpandedDeeply,
|
||||||
|
} from "../../hooks"
|
||||||
import { JSONSchemaDeepExpansionContext } from "../../context"
|
import { JSONSchemaDeepExpansionContext } from "../../context"
|
||||||
|
|
||||||
const OneOf = ({ schema }) => {
|
const OneOf = ({ schema }) => {
|
||||||
const oneOf = schema?.oneOf || []
|
const oneOf = schema?.oneOf || []
|
||||||
const fn = useFn()
|
const fn = useFn()
|
||||||
|
const isExpanded = useIsExpanded()
|
||||||
const isExpandedDeeply = useIsExpandedDeeply()
|
const isExpandedDeeply = useIsExpandedDeeply()
|
||||||
const [expanded, setExpanded] = useState(isExpandedDeeply)
|
const [expanded, setExpanded] = useState(isExpanded || isExpandedDeeply)
|
||||||
const [expandedDeeply, setExpandedDeeply] = useState(false)
|
const [expandedDeeply, setExpandedDeeply] = useState(false)
|
||||||
const Accordion = useComponent("Accordion")
|
const Accordion = useComponent("Accordion")
|
||||||
const ExpandDeepButton = useComponent("ExpandDeepButton")
|
const ExpandDeepButton = useComponent("ExpandDeepButton")
|
||||||
|
|||||||
@@ -5,14 +5,20 @@ import React, { useCallback, useState } from "react"
|
|||||||
import classNames from "classnames"
|
import classNames from "classnames"
|
||||||
|
|
||||||
import { schema } from "../../prop-types"
|
import { schema } from "../../prop-types"
|
||||||
import { useFn, useComponent, useIsExpandedDeeply } from "../../hooks"
|
import {
|
||||||
|
useFn,
|
||||||
|
useComponent,
|
||||||
|
useIsExpandedDeeply,
|
||||||
|
useIsExpanded,
|
||||||
|
} from "../../hooks"
|
||||||
import { JSONSchemaDeepExpansionContext } from "../../context"
|
import { JSONSchemaDeepExpansionContext } from "../../context"
|
||||||
|
|
||||||
const PrefixItems = ({ schema }) => {
|
const PrefixItems = ({ schema }) => {
|
||||||
const prefixItems = schema?.prefixItems || []
|
const prefixItems = schema?.prefixItems || []
|
||||||
const fn = useFn()
|
const fn = useFn()
|
||||||
|
const isExpanded = useIsExpanded()
|
||||||
const isExpandedDeeply = useIsExpandedDeeply()
|
const isExpandedDeeply = useIsExpandedDeeply()
|
||||||
const [expanded, setExpanded] = useState(isExpandedDeeply)
|
const [expanded, setExpanded] = useState(isExpanded || isExpandedDeeply)
|
||||||
const [expandedDeeply, setExpandedDeeply] = useState(false)
|
const [expandedDeeply, setExpandedDeeply] = useState(false)
|
||||||
const Accordion = useComponent("Accordion")
|
const Accordion = useComponent("Accordion")
|
||||||
const ExpandDeepButton = useComponent("ExpandDeepButton")
|
const ExpandDeepButton = useComponent("ExpandDeepButton")
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
/**
|
||||||
|
* @prettier
|
||||||
|
*/
|
||||||
|
|
||||||
|
describe("JSON Schema 2020-12 complex keywords expansion", () => {
|
||||||
|
it("should deeply expand all Schemas and complex keywords", () => {
|
||||||
|
cy.visit("/pages/json-schema-2020-12-expansion/").then(
|
||||||
|
() => {
|
||||||
|
cy.get(".json-schema-2020-12-accordion")
|
||||||
|
.find(".json-schema-2020-12-accordion__icon--collapsed")
|
||||||
|
.should("not.exist")
|
||||||
|
cy.contains("anyOf1-p1-p2-p1").should("exist")
|
||||||
|
cy.contains("oneOf1-p1-p2-p1").should("exist")
|
||||||
|
cy.contains("Prefix items").should("exist")
|
||||||
|
cy.contains("exampleDef").should("exist")
|
||||||
|
cy.contains("https://json-schema.org/draft/2020-12/vocab/core").should("exist")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
openapi: "3.1.0"
|
||||||
|
info:
|
||||||
|
version: "0.0.1"
|
||||||
|
title: "Swagger UI Webpack Setup"
|
||||||
|
description: "Demonstrates Swagger UI"
|
||||||
|
components:
|
||||||
|
schemas: {}
|
||||||
|
security: []
|
||||||
|
paths:
|
||||||
|
/pets:
|
||||||
|
get:
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: "OK"
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$vocabulary:
|
||||||
|
https://json-schema.org/draft/2020-12/vocab/core: true
|
||||||
|
https://json-schema.org/draft/2020-12/vocab/applicator: true
|
||||||
|
https://json-schema.org/draft/2020-12/vocab/validation: true
|
||||||
|
https://json-schema.org/draft/2020-12/vocab/meta-data: true
|
||||||
|
https://json-schema.org/draft/2020-12/vocab/format-annotation: false
|
||||||
|
https://example.com/my-custom-vocab: true
|
||||||
|
$defs:
|
||||||
|
exampleDef:
|
||||||
|
type: string
|
||||||
|
allOf:
|
||||||
|
- oneOf:
|
||||||
|
- type: object
|
||||||
|
properties:
|
||||||
|
oneOf1-p1:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
oneOf1-p1-p1:
|
||||||
|
type: string
|
||||||
|
oneOf1-p1-p2:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
oneOf1-p1-p2-p1:
|
||||||
|
type: string
|
||||||
|
oneOf1-p2:
|
||||||
|
type: string
|
||||||
|
- type: object
|
||||||
|
properties:
|
||||||
|
oneOf2-p1:
|
||||||
|
type: string
|
||||||
|
oneOf2-p2:
|
||||||
|
type: string
|
||||||
|
- anyOf:
|
||||||
|
- type: object
|
||||||
|
properties:
|
||||||
|
anyOf1-p1:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
anyOf1-p1-p1:
|
||||||
|
type: string
|
||||||
|
anyOf1-p1-p2:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
anyOf1-p1-p2-p1:
|
||||||
|
type: string
|
||||||
|
anyOf1-p2:
|
||||||
|
type: string
|
||||||
|
- type: object
|
||||||
|
properties:
|
||||||
|
anyOf2-p1:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
anyOf2-p1-p1:
|
||||||
|
type: string
|
||||||
|
anyOf2-p2:
|
||||||
|
type: string
|
||||||
|
- type: object
|
||||||
|
properties:
|
||||||
|
p1:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
p1-p1:
|
||||||
|
type: string
|
||||||
|
p1-p2:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
p1-p2-p1:
|
||||||
|
type: string
|
||||||
|
dependentSchemas:
|
||||||
|
p1-p1:
|
||||||
|
properties:
|
||||||
|
p3:
|
||||||
|
type: array
|
||||||
|
prefixItems:
|
||||||
|
- type: string
|
||||||
|
enum: [a, b, c]
|
||||||
|
required: [p3]
|
||||||
|
p2:
|
||||||
|
type: string
|
||||||
|
prefixItems:
|
||||||
|
- type: string
|
||||||
|
enum: [a, b, c]
|
||||||
|
tags: []
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
<!-- HTML for dev server -->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Swagger UI</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/swagger-ui.css">
|
||||||
|
<style>
|
||||||
|
html {
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: -moz-scrollbars-vertical;
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
|
*,
|
||||||
|
*:before,
|
||||||
|
*:after {
|
||||||
|
box-sizing: inherit;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
margin:0;
|
||||||
|
background: #fafafa;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="swagger-ui"></div>
|
||||||
|
|
||||||
|
<script src="/swagger-ui-bundle.js" charset="UTF-8"> </script>
|
||||||
|
<script src="/swagger-ui-standalone-preset.js" charset="UTF-8"> </script>
|
||||||
|
<script>
|
||||||
|
window.onload = function() {
|
||||||
|
window["SwaggerUIBundle"] = window["swagger-ui-bundle"]
|
||||||
|
window["SwaggerUIStandalonePreset"] = window["swagger-ui-standalone-preset"]
|
||||||
|
// Build a system
|
||||||
|
const ui = SwaggerUIBundle({
|
||||||
|
url: "./expansion.yaml",
|
||||||
|
dom_id: '#swagger-ui',
|
||||||
|
presets: [
|
||||||
|
SwaggerUIBundle.presets.apis,
|
||||||
|
SwaggerUIStandalonePreset
|
||||||
|
],
|
||||||
|
plugins: [],
|
||||||
|
layout: "StandaloneLayout",
|
||||||
|
docExpansion: "full",
|
||||||
|
defaultModelExpandDepth: 100,
|
||||||
|
defaultModelRendering: "model",
|
||||||
|
onComplete: () => {
|
||||||
|
if(window.completeCount) {
|
||||||
|
window.completeCount++
|
||||||
|
} else {
|
||||||
|
window.completeCount = 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
queryConfigEnabled: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
window.ui = ui
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user