eq directive
This commit is contained in:
47
index.ts
47
index.ts
@@ -2,53 +2,6 @@ import { z } from "zod"
|
||||
import { parse, type TemplateVariable } from "./parser"
|
||||
import { renderDir } from "./render"
|
||||
|
||||
const zodTypeMap: Record<string, () => z.ZodType> = {
|
||||
string: () => z.string(),
|
||||
number: () => z.number(),
|
||||
boolean: () => z.boolean(),
|
||||
}
|
||||
|
||||
type ShapeNode = {
|
||||
type?: string
|
||||
children: Map<string, ShapeNode>
|
||||
}
|
||||
|
||||
function buildTree(variables: TemplateVariable[]): ShapeNode {
|
||||
const root: ShapeNode = { children: new Map() }
|
||||
for (const v of variables) {
|
||||
const segments = v.path.split(".")
|
||||
let node = root
|
||||
for (let i = 0; i < segments.length; i++) {
|
||||
const seg = segments[i]!
|
||||
if (!node.children.has(seg)) {
|
||||
node.children.set(seg, { children: new Map() })
|
||||
}
|
||||
node = node.children.get(seg)!
|
||||
if (i === segments.length - 1) {
|
||||
node.type = v.type
|
||||
}
|
||||
}
|
||||
}
|
||||
return root
|
||||
}
|
||||
|
||||
function nodeToSchema(node: ShapeNode): z.ZodType {
|
||||
if (node.children.size === 0 && node.type) {
|
||||
const factory = zodTypeMap[node.type]
|
||||
if (!factory) throw new Error(`Unsupported type: ${node.type}`)
|
||||
return factory()
|
||||
}
|
||||
const shape: Record<string, z.ZodType> = {}
|
||||
for (const [key, child] of node.children) {
|
||||
shape[key] = nodeToSchema(child)
|
||||
}
|
||||
return z.object(shape)
|
||||
}
|
||||
|
||||
function inferSchema(variables: TemplateVariable[]): z.ZodType {
|
||||
return nodeToSchema(buildTree(variables))
|
||||
}
|
||||
|
||||
interface Stringable {
|
||||
toString: () => string
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user