© 2026 Hedgehog Software, LLC
export class PackageSourceService extends ServiceMap.Service< PackageSourceService, <T extends PackageSourceIds>(x: PackageSourceConfig<T>) => { readonly config: PackageSourceConfig<T>; readonly search: (searchParam: string) => Effect.Effect<Array<PackageSearchResult<T>>>; } >()("PackageSource") {}
export class ModrinthSource extends ServiceMap.Service<ModrinthSource, PackageSourceService>()("PackageSourceModrinth") {} export const ModrinthSourceLive: ModrinthSource["Service"] = config => ({ config: config, search: search_term => Effect.gen(function*() { const client = yield* HttpApiClient.make(ModrinthApi, { baseUrl: "https://api.modrinth.com/v2", }); const searchRes = yield* client.projects.search({ params: { query: search_term, index: "relevance" } }); const packageList = searchRes.hits.map(x => { const out: PackageSearchResult<"modrinth"> = { id: x.project_id, title: x.title ?? "<unspecified title>", description: x.description, author: x.author, source: config.id, type: modrinthTypeMatcher(x), versions: x.versions, url: x.slug ? new URL(`https://modrinth.com/project/${x.slug}`) : undefined, }; return out; }); return packageList; }), });
ModrinthSource["Service"]