diff --git a/src/core/plugins/json-schema-2020-12/components/keywords/Title/Title.jsx b/src/core/plugins/json-schema-2020-12/components/keywords/Title/Title.jsx
index ce416ac5..8bd88633 100644
--- a/src/core/plugins/json-schema-2020-12/components/keywords/Title/Title.jsx
+++ b/src/core/plugins/json-schema-2020-12/components/keywords/Title/Title.jsx
@@ -13,11 +13,7 @@ const Title = ({ title = "", schema }) => {
if (!renderedTitle) return null
- return (
-
- {title || fn.getTitle(schema)}
-
- )
+ return {renderedTitle}
}
Title.propTypes = {
diff --git a/src/core/plugins/json-schema-2020-12/fn.js b/src/core/plugins/json-schema-2020-12/fn.js
index 398e2d7a..c74bbad7 100644
--- a/src/core/plugins/json-schema-2020-12/fn.js
+++ b/src/core/plugins/json-schema-2020-12/fn.js
@@ -10,12 +10,17 @@ export const upperFirst = (value) => {
return value
}
-export const getTitle = (schema) => {
+/**
+ * Lookup can be `basic` or `extended`. By default the lookup is `extended`.
+ */
+export const getTitle = (schema, { lookup = "extended" } = {}) => {
const fn = useFn()
- if (schema?.title) return fn.upperFirst(schema.title)
- if (schema?.$anchor) return fn.upperFirst(schema.$anchor)
- if (schema?.$id) return schema.$id
+ if (schema?.title != null) return fn.upperFirst(String(schema.title))
+ if (lookup === "extended") {
+ if (schema?.$anchor != null) return fn.upperFirst(String(schema.$anchor))
+ if (schema?.$id != null) return String(schema.$id)
+ }
return ""
}
@@ -116,18 +121,18 @@ export const getType = (schema, processedSchemas = new WeakSet()) => {
const typeString = Array.isArray(type)
? type.map((t) => (t === "array" ? getArrayType() : t)).join(" | ")
: type === "array"
- ? getArrayType()
- : [
- "null",
- "boolean",
- "object",
- "array",
- "number",
- "integer",
- "string",
- ].includes(type)
- ? type
- : inferType()
+ ? getArrayType()
+ : [
+ "null",
+ "boolean",
+ "object",
+ "array",
+ "number",
+ "integer",
+ "string",
+ ].includes(type)
+ ? type
+ : inferType()
const handleCombiningKeywords = (keyword, separator) => {
if (Array.isArray(schema[keyword])) {
diff --git a/src/core/plugins/oas31/components/models/models.jsx b/src/core/plugins/oas31/components/models/models.jsx
index 77e44fb2..86b8bf57 100644
--- a/src/core/plugins/oas31/components/models/models.jsx
+++ b/src/core/plugins/oas31/components/models/models.jsx
@@ -12,6 +12,7 @@ const Models = ({
layoutActions,
getComponent,
getConfigs,
+ fn,
}) => {
const schemas = specSelectors.selectSchemas()
const hasSchemas = Object.keys(schemas).length > 0
@@ -23,6 +24,7 @@ const Models = ({
const JSONSchema202012 = getComponent("JSONSchema202012")
const ArrowUpIcon = getComponent("ArrowUpIcon")
const ArrowDownIcon = getComponent("ArrowDownIcon")
+ const { getTitle } = fn.jsonSchema202012.useFn()
/**
* Effects.
@@ -86,15 +88,19 @@ const Models = ({
- {Object.entries(schemas).map(([schemaName, schema]) => (
-
- ))}
+ {Object.entries(schemas).map(([schemaName, schema]) => {
+ const name = getTitle(schema, { lookup: "basic" }) || schemaName
+
+ return (
+
+ )
+ })}
)
@@ -117,6 +123,11 @@ Models.propTypes = {
show: PropTypes.func.isRequired,
readyToScroll: PropTypes.func.isRequired,
}).isRequired,
+ fn: PropTypes.shape({
+ jsonSchema202012: PropTypes.func.shape({
+ useFn: PropTypes.func.isRequired,
+ }).isRequired,
+ }).isRequired,
}
export default Models
diff --git a/test/e2e-cypress/e2e/features/plugins/json-schema-2020-12/schema-title.cy.js b/test/e2e-cypress/e2e/features/plugins/json-schema-2020-12/schema-title.cy.js
new file mode 100644
index 00000000..867178ce
--- /dev/null
+++ b/test/e2e-cypress/e2e/features/plugins/json-schema-2020-12/schema-title.cy.js
@@ -0,0 +1,21 @@
+/**
+ * @prettier
+ */
+
+describe("JSON Schema 2020-12 title keyword", () => {
+ it("should render a correct title for schemas", () => {
+ cy.visit("/?url=/documents/features/json-schema-2020-12-title.yaml")
+ .get(".json-schema-2020-12__title")
+ .eq(0)
+ .contains("My Pet")
+ .should("exist")
+ .get(".json-schema-2020-12__title")
+ .eq(1)
+ .contains("My Pets")
+ .should("exist")
+ .get(".json-schema-2020-12__title")
+ .eq(2)
+ .contains("Error")
+ .should("exist")
+ })
+})
diff --git a/test/e2e-cypress/static/documents/features/json-schema-2020-12-title.yaml b/test/e2e-cypress/static/documents/features/json-schema-2020-12-title.yaml
new file mode 100644
index 00000000..63d82fc9
--- /dev/null
+++ b/test/e2e-cypress/static/documents/features/json-schema-2020-12-title.yaml
@@ -0,0 +1,114 @@
+openapi: 3.1.0
+info:
+ version: 1.0.0
+ title: Swagger Petstore
+ license:
+ name: MIT
+ url: https://opensource.org/licenses/MIT
+servers:
+ - url: http://petstore.swagger.io/v1
+paths:
+ /pets:
+ get:
+ summary: List all pets
+ operationId: listPets
+ tags:
+ - pets
+ parameters:
+ - name: limit
+ in: query
+ description: How many items to return at one time (max 100)
+ required: false
+ schema:
+ type: integer
+ format: int32
+ responses:
+ '200':
+ description: A paged array of pets
+ headers:
+ x-next:
+ description: A link to the next page of responses
+ schema:
+ type: string
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pets'
+ default:
+ description: unexpected error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ post:
+ summary: Create a pet
+ operationId: createPets
+ tags:
+ - pets
+ responses:
+ '201':
+ description: Null response
+ default:
+ description: unexpected error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ /pets/{petId}:
+ get:
+ summary: Info for a specific pet
+ operationId: showPetById
+ tags:
+ - pets
+ parameters:
+ - name: petId
+ in: path
+ required: true
+ description: The id of the pet to retrieve
+ schema:
+ type: string
+ responses:
+ '200':
+ description: Expected response to a valid request
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ default:
+ description: unexpected error
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+components:
+ schemas:
+ Pet:
+ title: My Pet
+ type: object
+ required:
+ - id
+ - name
+ properties:
+ id:
+ type: integer
+ format: int64
+ name:
+ type: string
+ tag:
+ type: string
+ Pets:
+ title: My Pets
+ type: array
+ items:
+ $ref: '#/components/schemas/Pet'
+ Error:
+ type: object
+ required:
+ - code
+ - message
+ properties:
+ code:
+ type: integer
+ format: int32
+ message:
+ type: string