/** * Lexicon JSON generator — produces lexicon-fly.json with metadata for the * fly resource and property types. */ import type { PropertyConstraints } from "@intentius/chant/codegen/json-schema"; import type { FlyParseResult } from "../spec/parse"; import { flyShortName } from "../spec/parse"; import type { NamingStrategy } from "./naming"; import { buildRegistry, serializeRegistry, type RegistryResource } from "@intentius/chant/codegen/generate-registry"; export interface FlyLexiconEntry { resourceType: string; kind: "resource" | "property"; lexicon: "fly"; constraints?: Record; } /** * Generate the lexicon-fly.json content. */ export function generateLexiconJSON(results: FlyParseResult[], naming: NamingStrategy): string { const registryResources: RegistryResource[] = results.map((r) => ({ typeName: r.resource.typeName, attributes: r.resource.attributes, properties: r.resource.properties, propertyTypes: [], })); const entries = buildRegistry(registryResources, naming, { shortName: flyShortName, buildEntry: (resource, _tsName, _attrs, propConstraints) => { const r = results.find((res) => res.resource.typeName === resource.typeName); const entry: FlyLexiconEntry = { resourceType: resource.typeName, kind: r?.isProperty ? "property" : "resource", lexicon: "fly", }; if (propConstraints && Object.keys(propConstraints).length > 0) { entry.constraints = propConstraints; } return entry; }, buildPropertyEntry: (resourceType, propertyType) => ({ resourceType: `${resourceType}.${propertyType}`, kind: "property", lexicon: "fly", }), }); return serializeRegistry(entries); }