// Extension roots on disk for the loader's tests, and a berry loading them. import { join } from "node:path"; import { createModels } from "@earendil-works/pi-ai/models"; import { MemoryStorage } from "@earendil-works/pi-durable"; import { tempDir } from "@berry/util"; import { openBerry } from "./berry.ts"; import { extensionLoader } from "./loader.ts"; import { extensionWeb } from "./web.ts"; /** An extension's source, whose description is its `VERSION`. */ export const extension = ( name: string, description = `import { VERSION } from "./version.ts";`, sortOrder?: number, ) => `import { defineExtension } from "@berry/api"; ${description} export default defineExtension({ name: ${JSON.stringify(name)}, description: VERSION, ${ sortOrder === undefined ? "" : `sortOrder: ${sortOrder}, ` }initial: () => null, setup() {} }); `; /** Write these files under `directory`. */ export async function put(directory: string, files: Record) { for (const [path, text] of Object.entries(files)) { await Deno.mkdir(join(directory, path, ".."), { recursive: true }); await Deno.writeTextFile(join(directory, path), text); } } /** A berry root with the given extension files, inside the repo so that `deno check` finds its deno.json. */ export async function fixture(files: Record, run: (root: string) => Promise) { await using rootDir = await tempDir({ dir: Deno.cwd(), prefix: ".loader-test-" }); const root = rootDir.path; await put(join(root, "extensions"), files); await run(root); } /** A berry whose loader reads `root`, or these `directories`. */ export async function open(root: string, directories?: readonly string[], web = extensionWeb()) { const berry = await openBerry(new MemoryStorage(), createModels()); const loader = extensionLoader({ berry, web, root, directories }); const close = async () => { await loader.close(); await berry.close(); }; const describe = (name: string) => berry.extensions().find((e) => e.name === name)?.description; return { berry, loader, close, describe }; }