Skip to content

Commit

Permalink
feat: json pointer on CreateEdge calls
Browse files Browse the repository at this point in the history
  • Loading branch information
jy95 committed Dec 31, 2023
1 parent 68bb794 commit 7b6ba34
Show file tree
Hide file tree
Showing 14 changed files with 266 additions and 75 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import React from "react"
import Translate from "@docusaurus/Translate"

import { CreateEdge } from "@theme/JSONSchemaViewer/components"
import {
SchemaHierarchyContextProvider,
useSchemaHierarchyContext,
} from "@theme/JSONSchemaViewer/contexts/schemaHierarchy"

import type { JSONSchemaNS } from "@theme/JSONSchemaViewer/types"

Expand All @@ -28,6 +32,8 @@ function AdditionalItemsLabel({ count }: { count: number }): JSX.Element {

// To support that scenario not possible anymore in draft-2020-12
export default function CreateAdditionalItems(props: Props): JSX.Element {
const { jsonPointer: currentJsonPointer, level: currentLevel } =
useSchemaHierarchyContext()
const { schema } = props

let items = schema.additionalItems
Expand All @@ -42,14 +48,22 @@ export default function CreateAdditionalItems(props: Props): JSX.Element {

return (
<ul>
<CreateEdge
key={`array_additionalItems`}
name={<AdditionalItemsLabel count={startingIndex} />}
schema={items}
required={
schema.minItems !== undefined && startingIndex >= schema.minItems - 1
}
/>
<SchemaHierarchyContextProvider
value={{
level: currentLevel + 1,
jsonPointer: `${currentJsonPointer}/additionalItems`,
}}
>
<CreateEdge
key={`array_additionalItems`}
name={<AdditionalItemsLabel count={startingIndex} />}
schema={items}
required={
schema.minItems !== undefined &&
startingIndex >= schema.minItems - 1
}
/>
</SchemaHierarchyContextProvider>
</ul>
)
}
25 changes: 19 additions & 6 deletions src/theme/JSONSchemaViewer/JSONSchemaElements/array/Contains.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import React from "react"
import Translate from "@docusaurus/Translate"

import { CreateEdge } from "@theme/JSONSchemaViewer/components"
import {
SchemaHierarchyContextProvider,
useSchemaHierarchyContext,
} from "@theme/JSONSchemaViewer/contexts/schemaHierarchy"

import type { JSONSchemaNS } from "@theme/JSONSchemaViewer/types"

Expand All @@ -11,6 +15,8 @@ type Props = {
}

export default function CreateContains(props: Props): JSX.Element {
const { jsonPointer: currentJsonPointer, level: currentLevel } =
useSchemaHierarchyContext()
const { schema } = props

let item = schema.contains
Expand All @@ -33,12 +39,19 @@ export default function CreateContains(props: Props): JSX.Element {

return (
<ul>
<CreateEdge
key={"contains"}
name={containsLabel}
schema={item}
required={schema.minContains !== undefined && schema.minContains > 0}
/>
<SchemaHierarchyContextProvider
value={{
level: currentLevel + 1,
jsonPointer: `${currentJsonPointer}/contains`,
}}
>
<CreateEdge
key={"contains"}
name={containsLabel}
schema={item}
required={schema.minContains !== undefined && schema.minContains > 0}
/>
</SchemaHierarchyContextProvider>
</ul>
)
}
29 changes: 23 additions & 6 deletions src/theme/JSONSchemaViewer/JSONSchemaElements/array/Items.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import React from "react"
import Translate from "@docusaurus/Translate"

import { CreateEdge } from "@theme/JSONSchemaViewer/components"
import {
SchemaHierarchyContextProvider,
useSchemaHierarchyContext,
} from "@theme/JSONSchemaViewer/contexts/schemaHierarchy"

import type { JSONSchemaNS } from "@theme/JSONSchemaViewer/types"

Expand Down Expand Up @@ -35,6 +39,8 @@ function ItemsLabel({
}

export default function CreateItems(props: Props): JSX.Element {
const { jsonPointer: currentJsonPointer, level: currentLevel } =
useSchemaHierarchyContext()
const { schema } = props

let items = schema.items
Expand All @@ -57,12 +63,23 @@ export default function CreateItems(props: Props): JSX.Element {
return (
<ul>
{itemsAsArray.map((item, idx) => (
<CreateEdge
key={`array_items_${idx}`}
name={<ItemsLabel index={startingIndex + idx} isArray={isArray} />}
schema={item}
required={schema.minItems !== undefined && schema.minItems >= minimal}
/>
<SchemaHierarchyContextProvider
value={{
level: currentLevel + 1,
jsonPointer: `${currentJsonPointer}/items${
isArray ? `/${idx}` : ""
}`,
}}
>
<CreateEdge
key={`array_items_${idx}`}
name={<ItemsLabel index={startingIndex + idx} isArray={isArray} />}
schema={item}
required={
schema.minItems !== undefined && schema.minItems >= minimal
}
/>
</SchemaHierarchyContextProvider>
))}
</ul>
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import React from "react"
import Translate from "@docusaurus/Translate"

import { CreateEdge } from "@theme/JSONSchemaViewer/components"
import {
SchemaHierarchyContextProvider,
useSchemaHierarchyContext,
} from "@theme/JSONSchemaViewer/contexts/schemaHierarchy"

import type { JSONSchema, JSONSchemaNS } from "@theme/JSONSchemaViewer/types"

Expand All @@ -27,6 +31,8 @@ function PrefixItemsLabel({ count }: { count: number }): JSX.Element {
}

export default function CreatePrefixItems(props: Props): JSX.Element {
const { jsonPointer: currentJsonPointer, level: currentLevel } =
useSchemaHierarchyContext()
const { schema } = props

let items = schema.prefixItems
Expand All @@ -36,6 +42,7 @@ export default function CreatePrefixItems(props: Props): JSX.Element {
return <></>
}

let isArray = Array.isArray(items)
let minimal = Array.isArray(items) ? items.length : 1
let array = (Array.isArray(items) ? items : [items]) as JSONSchema[]

Expand All @@ -44,14 +51,24 @@ export default function CreatePrefixItems(props: Props): JSX.Element {
<ul>
{array.map((val, idx) => {
return (
<CreateEdge
key={`array_prefixItems_${idx}`}
name={<PrefixItemsLabel count={idx} />}
schema={val}
required={
schema.minItems !== undefined && schema.minItems >= minimal
}
/>
<SchemaHierarchyContextProvider
key={`schema_hierarchy_${idx}`}
value={{
level: currentLevel + 1,
jsonPointer: `${currentJsonPointer}/prefixItems${
isArray ? `/${idx}` : ""
}`,
}}
>
<CreateEdge
key={`array_prefixItems_${idx}`}
name={<PrefixItemsLabel count={idx} />}
schema={val}
required={
schema.minItems !== undefined && schema.minItems >= minimal
}
/>
</SchemaHierarchyContextProvider>
)
})}
</ul>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import React from "react"
import Translate from "@docusaurus/Translate"

import { CreateEdge } from "@theme/JSONSchemaViewer/components"
import {
SchemaHierarchyContextProvider,
useSchemaHierarchyContext,
} from "@theme/JSONSchemaViewer/contexts/schemaHierarchy"

import type { JSONSchemaNS } from "@theme/JSONSchemaViewer/types"

Expand All @@ -27,6 +31,8 @@ function UnevaluatedItemsLabel(): JSX.Element {

// To support unevaluatedItems scenario
export default function CreateUnevaluatedItems(props: Props): JSX.Element {
const { jsonPointer: currentJsonPointer, level: currentLevel } =
useSchemaHierarchyContext()
const { schema } = props

let items = schema.unevaluatedItems
Expand All @@ -38,13 +44,20 @@ export default function CreateUnevaluatedItems(props: Props): JSX.Element {

return (
<ul>
<CreateEdge
key={`array_unevaluatedItems`}
name={<UnevaluatedItemsLabel />}
schema={items}
// By design, it isn't mandatory most of the time
required={false}
/>
<SchemaHierarchyContextProvider
value={{
level: currentLevel + 1,
jsonPointer: `${currentJsonPointer}/unevaluatedItems`,
}}
>
<CreateEdge
key={`array_unevaluatedItems`}
name={<UnevaluatedItemsLabel />}
schema={items}
// By design, it isn't mandatory most of the time
required={false}
/>
</SchemaHierarchyContextProvider>
</ul>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import React from "react"
import Translate from "@docusaurus/Translate"

import { CreateEdge } from "@theme/JSONSchemaViewer/components"
import {
SchemaHierarchyContextProvider,
useSchemaHierarchyContext,
} from "@theme/JSONSchemaViewer/contexts/schemaHierarchy"

import type { JSONSchemaNS } from "@theme/JSONSchemaViewer/types"

Expand All @@ -26,6 +30,8 @@ function AdditionalPropertiesLabel(): JSX.Element {
}

export default function CreateAdditionalProperties(props: Props): JSX.Element {
const { jsonPointer: currentJsonPointer, level: currentLevel } =
useSchemaHierarchyContext()
const { schema } = props

let additionalProperties = schema.additionalProperties
Expand All @@ -40,12 +46,19 @@ export default function CreateAdditionalProperties(props: Props): JSX.Element {

return (
<ul>
<CreateEdge
key={"object_additionalProperties"}
name={<AdditionalPropertiesLabel />}
schema={additionalProperties}
required={false}
/>
<SchemaHierarchyContextProvider
value={{
level: currentLevel + 1,
jsonPointer: `${currentJsonPointer}/additionalProperties`,
}}
>
<CreateEdge
key={"object_additionalProperties"}
name={<AdditionalPropertiesLabel />}
schema={additionalProperties}
required={false}
/>
</SchemaHierarchyContextProvider>
</ul>
)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import React from "react"

import { CreateEdge } from "@theme/JSONSchemaViewer/components"
import {
SchemaHierarchyContextProvider,
useSchemaHierarchyContext,
} from "@theme/JSONSchemaViewer/contexts/schemaHierarchy"
import { encodeStringForJSONPointer } from "@theme/JSONSchemaViewer/utils/index"

import type { JSONSchemaNS } from "@theme/JSONSchemaViewer/types"

Expand All @@ -11,6 +16,8 @@ type Props = {

// Generate properties
export default function CreatePatternProperties(props: Props): JSX.Element {
const { jsonPointer: currentJsonPointer, level: currentLevel } =
useSchemaHierarchyContext()
const { schema } = props

const patternProperties = schema.patternProperties
Expand All @@ -23,12 +30,21 @@ export default function CreatePatternProperties(props: Props): JSX.Element {
return (
<ul>
{Object.entries(patternProperties).map(([key, value]) => (
<CreateEdge
key={`object_patternProperties_${key}`}
name={<code>{key}</code>}
schema={value}
required={false}
/>
<SchemaHierarchyContextProvider
value={{
level: currentLevel + 1,
jsonPointer: `${currentJsonPointer}/patternProperties/${encodeStringForJSONPointer(
key,
)}`,
}}
>
<CreateEdge
key={`object_patternProperties_${key}`}
name={<code>{key}</code>}
schema={value}
required={false}
/>
</SchemaHierarchyContextProvider>
))}
</ul>
)
Expand Down
Loading

0 comments on commit 7b6ba34

Please sign in to comment.