All files / src/api/package packages.ts

0% Statements 0/11
0% Branches 0/2
0% Functions 0/2
0% Lines 0/11

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50                                                                                                   
import { Metadata } from "./metadata";
import { Language } from "../../constants/languages";
import { API_PATHS } from "../../constants/url";
 
export interface Author {
  readonly name: string;
  readonly email?: string;
  readonly url: string;
}
 
export interface CatalogPackage {
  name: string;
  languages?: Partial<Record<Language, Record<string, unknown>>>;
  version: string;
  major: number;
  description: string;
  author: Author | string;
  keywords?: string[];
  metadata: Metadata;
}
 
export interface Packages {
  packages: CatalogPackage[];
}
 
const EMPTY_CATALOG = { packages: [] };
 
/**
 * Fetch the catalog of all packages from the backend.
 */
export const fetchPackages = async (): Promise<Packages> => {
  const response = await fetch(API_PATHS.CATALOG_SUFFIX);
 
  if (!response.ok) {
    console.error(response.statusText);
    console.warn(
      "Failed to fetch package catalog. Falling back to empty package list."
    );
    return EMPTY_CATALOG;
  }
 
  return response.json().catch((err) => {
    console.error(err);
    console.warn(
      "Invalid package catalog response. Falling back to empty package list."
    );
    return EMPTY_CATALOG;
  });
};