import { NodeTreeContext, provide, useNodeTree } from '@kubb/fabric-core'
import type { FabricReactElement, FabricReactNode, JSDoc, Key } from '../types.ts'
import { createJSDoc } from '../utils/createJSDoc.ts'
export type TypeProps = {
key?: Key
/**
* Name of the type, this needs to start with a capital letter.
*/
name: string
/**
* Does this type need to be exported.
*/
export?: boolean
/**
* Options for JSdocs.
*/
JSDoc?: JSDoc
/**
* Children nodes.
*/
children?: FabricReactNode
}
/**
* Generates a TypeScript type declaration.
*/
export function Type({ children, ...props }: TypeProps): FabricReactElement {
const { name, export: canExport, JSDoc } = props
const nodeTree = useNodeTree()
if (nodeTree) {
const childTree = nodeTree.addChild({ type: 'Type', props })
provide(NodeTreeContext, childTree)
}
if (name.charAt(0).toUpperCase() !== name.charAt(0)) {
throw new Error('Name should start with a capital letter(see TypeScript types)')
}
return (
<>
{JSDoc?.comments && (
<>
{createJSDoc({ comments: JSDoc?.comments })}
>
)}
{children}
>
)
}
Type.displayName = 'Type'