repositories / pi-ext
pi-ext
bugabingas pi extensions
owned by admin
scripts/build/manifest.ts
Rawimport 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;
}