Back

Version 47

12/9/2023
import { api } from "https://esm.town/v/pomdtr/api";

// returns the slug (author/name)
function getAliasFromUrl(valUrl: string): string {
const slug = valUrl.split("/v/")[1];
// TODO: Should be able to get specific version of val, but for now we remove versions
return slug.split("?v")[0];
}

function getDependencySlugsFromCode(valCode: string): string[] {
const regex = new RegExp(`import.*from ["'](https://esm.town/v/.*?)["'];`, "g");
let match;
const dependencies: string[] = [];

while ((match = regex.exec(valCode)) !== null) {
dependencies.push(match[1]);
}

return dependencies.map(url => getAliasFromUrl(url));
}

export async function getDependencyGraph(valUrlOrSlug: string) {
const initialSlug = valUrlOrSlug.includes("/v/")
? getAliasFromUrl(valUrlOrSlug)
: valUrlOrSlug;
const slugQueue = [initialSlug];
const dependencyMap = new Map<string, string[]>();

while (slugQueue.length > 0) {
const slug = slugQueue.shift();
if (dependencyMap.has(slug)) {
continue;
}
const { code } = await api(`/v1/alias/${slug}`);
const dependencySlugs = getDependencySlugsFromCode(code);
dependencyMap.set(slug, dependencySlugs);
Updated: April 8, 2024