Luigit
repositories / pi-ext

pi-ext

bugabingas pi extensions

owned by admin

scripts/build/manifest.ts

Raw
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<string, string>;
	dependencies?: Record<string, string>;
	pi: Partial<Record<"extensions" | "skills" | "prompts" | "themes", string[]>>;
}

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;
}