import type { ExtensionBuildSpec } from "./spec.ts"; /** Generated `package.json` for a built extension package. */ export interface GeneratedPackageJson { name: string; version: string; private: true; type: "module"; main: string; license?: string; description?: string; keywords?: string[]; peerDependencies?: Record; dependencies?: Record; pi: Partial>; } function toOutput(entry: string): string { return entry.replace(/\.[cm]?ts$/u, ".js"); } export function generatePackageJson( spec: ExtensionBuildSpec, version: string, ): GeneratedPackageJson { const source = spec.pkg; const extensions = ( source.pi?.extensions?.length ? source.pi.extensions : ["index.ts"] ).map(toOutput); const pi: GeneratedPackageJson["pi"] = { extensions }; for (const field of ["skills", "prompts", "themes"] as const) if (source.pi?.[field]) pi[field] = [...(source.pi[field] ?? [])]; const dependencies = Object.fromEntries( Object.keys(spec.externals) .sort() .map((dep) => [dep, source.dependencies?.[dep] ?? "*"]), ); const generated: GeneratedPackageJson = { name: source.name, version, private: true, type: "module", main: extensions[0] ?? "index.js", pi, }; if (source.license) generated.license = source.license; if (source.description) generated.description = source.description; if (source.keywords) generated.keywords = [...source.keywords]; if (source.peerDependencies) generated.peerDependencies = { ...source.peerDependencies }; if (Object.keys(dependencies).length) generated.dependencies = dependencies; return generated; }