import { escapeHtml, getGitHubUrl, getLastUpdatedHtml } from "../utils"; export interface RenderableExtension { id: string; canvasId?: string; extensionId?: string; extensionName?: string; name: string; path?: string | null; ref?: string | null; version?: string | null; description?: string; lastUpdated?: string | null; keywords?: string[]; screenshots?: { icon?: { path?: string | null; type?: string | null; } | null; gallery?: { path?: string | null; type?: string | null; } | null; } | null; imageUrl?: string | null; assetPath?: string | null; installUrl?: string | null; sourceUrl?: string | null; external?: boolean; } export type ExtensionSortOption = "title" | "lastUpdated"; export function sortExtensions( items: T[], sort: ExtensionSortOption ): T[] { return [...items].sort((a, b) => { if (sort === "lastUpdated") { const dateA = a.lastUpdated ? new Date(a.lastUpdated).getTime() : 0; const dateB = b.lastUpdated ? new Date(b.lastUpdated).getTime() : 0; return dateB - dateA; } return a.name.localeCompare(b.name); }); } export function renderExtensionsHtml(items: RenderableExtension[]): string { if (items.length === 0) { return `

No extensions found

No canvas extensions are available right now.

`; } return items .map((item) => { const installUrl = item.installUrl || (item.path && item.ref ? `https://github.com/github/awesome-copilot/tree/${item.ref}/${item.path.replace( /\\/g, "/" )}` : ""); const sourceUrl = item.sourceUrl || (item.path ? getGitHubUrl(item.path) : ""); return `
${ item.imageUrl ? `` : `` }
${escapeHtml(item.name)}
${escapeHtml( item.description || "Canvas extension" )}
${ item.keywords && item.keywords.length > 0 ? item.keywords .map( (kw) => `${escapeHtml(kw)}` ) .join("") : "" }
${ item.external ? 'External' : "" } ${getLastUpdatedHtml(item.lastUpdated)}
${ sourceUrl ? `Source` : "" }
`; }) .join(""); }