/** * TypeScript declaration file generator — produces index.d.ts with the fly * resource classes (App, Machine, Volume) and their property-type classes. */ import type { FlyParseResult } from "../spec/parse"; import type { NamingStrategy } from "./naming"; import { writeResourceClass, writePropertyClass, type DtsProperty, type DtsAttribute, } from "@intentius/chant/codegen/generate-typescript"; interface Entry { tsName: string; isProperty: boolean; properties: DtsProperty[]; attributes: DtsAttribute[]; } /** * Generate the complete .d.ts file content. */ export function generateTypeScriptDeclarations(results: FlyParseResult[], naming: NamingStrategy): string { const lines: string[] = []; lines.push("// Code generated by chant fly generate. DO NOT EDIT."); const entries: Entry[] = []; for (const r of results) { const tsName = naming.resolve(r.resource.typeName); if (!tsName) continue; const properties: DtsProperty[] = r.resource.properties.map((p) => ({ name: p.name, type: p.tsType, required: p.required, description: p.description, })); const attributes: DtsAttribute[] = r.resource.attributes.map((a) => ({ name: a.name, type: a.tsType })); entries.push({ tsName, isProperty: !!r.isProperty, properties, attributes }); } entries.sort((a, b) => a.tsName.localeCompare(b.tsName)); const resources = entries.filter((e) => !e.isProperty); const propertyTypes = entries.filter((e) => e.isProperty); if (resources.length > 0) { lines.push(""); lines.push("// --- Fly Resource classes ---"); for (const re of resources) { writeResourceClass(lines, re.tsName, re.properties, re.attributes); } } if (propertyTypes.length > 0) { lines.push(""); lines.push("// --- Property type classes ---"); for (const pe of propertyTypes) { writePropertyClass(lines, pe.tsName, pe.properties); } } lines.push(""); return lines.join("\n"); }