import { DataObject } from 'json2md'
import { SchemaNode, SchemaRef, SchemaObject } from '@microfleet/schema-tools'
import type { Renderer, RenderedNode } from './index'
export function isProperty(node: SchemaNode): boolean {
const { params } = node
return params.isProperty || params.isAdditionalProperty || params.isPatternProperty ? true : false
}
export function linkTo(r: Renderer, referenceNode: SchemaRef): string {
if (r.config.linkTo) return `${r.config.linkTo(referenceNode)}`
const { id, hash } = referenceNode.ref
const href = `${id || ''}${hash}`.replace(/#/g, '--')
return `#${href}`
}
export function linkFrom(r: Renderer, node: SchemaNode): string {
if (r.config.linkFrom) return `${r.config.linkFrom(node)}`
return `${node.params.rootId || ''}#${node.path.toString()}`.replace(/#/g, '--')
}
export function renderDefaultsOrExample(type: string, title: string, data: unknown): RenderedNode[] {
if (type === 'object') {
return [
`${title}:`,
{
code: {
language: 'json',
content: JSON.stringify(data, null, 2)
}
}
]
}
return [`${title}: \`${JSON.stringify(data, null, 2)}\``]
}
export function getGenericInfo(renderer: Renderer, node: SchemaNode): RenderedNode[] {
const result: (DataObject|string)[] = []
const { description } = node.data
let link = ''
const dataType = node.dataType ? `\`{${node.dataType}}\`
` : ''
if (node.params.isDefinition || isProperty(node) || node.params.rootId === node.data.$id) {
link = ``
}
result.push(`${link}${dataType}`)
if (node.type === 'x-object' ) {
result.push(`Additional properties allowed: \`${(node as SchemaObject).haveAdditionalProperties}\`
`)
}
if (Object.keys(node.constraints).length > 0) {
const asStrings = Object.entries(node.constraints).map(([key, value]) => `\`${key}\`: \`${JSON.stringify(value)}\``)
result.push(`Constraints: ${asStrings.join(', ')}
`)
}
if (node.data.default) {
result.push(...renderDefaultsOrExample(node.dataType, 'Default', node.data.default))
}
if (description) {
result.push({ p: `${description}` })
}
if (node.ifCondition) {
result.push(renderer.render(node.ifCondition))
}
return result
}
export function renderProps(renderer: Renderer, props: Record | undefined): RenderedNode {
const ul = Object.entries(props ?? {}).map(( [name , prop] ) => {
return [
`**${name.replace(/\|/gi, '{')}**`,
...renderer.render(prop)
]
})
return { ul: ul as unknown as string[] } // dirty hack
}
export function renderDefinitions(renderer: Renderer, node: SchemaNode): RenderedNode {
const definitions = node.definitions ?? {}
const ul = Object.entries(definitions).map(( [,prop] ) =>
[
`**${node.data.$id || ''}#${prop.path.toString()}**`,
...renderer.render(prop),
'
'
]
)
return {
ul: ul as unknown as string[] // dirty hack
}
}