All files / src/util url.ts

100% Statements 29/29
75% Branches 15/20
100% Functions 7/7
100% Lines 29/29

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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119          3x       3x     5x 5x   5x   5x 1x   1x     5x           3x                 3x       22x   22x 50x   37x     22x     3x 20x   20x 20x   20x 16x       20x     3x                                     1x                     3x                         18x 18x   18x          
import { CatalogSearchSort } from "../api/catalog-search/constants";
import { CDKType } from "../constants/constructs";
import { Language } from "../constants/languages";
import { ROUTES, QUERY_PARAMS } from "../constants/url";
 
const gitSSHRegex = new RegExp(
  /git@github\.com:([a-zA-Z-]+)+\/?([a-zA-Z-]+)*(\.git)?/
);
 
export const getRepoUrlAndHost = (
  repoUrl: string
): { url: string; hostname: string } | undefined => {
  try {
    let url = repoUrl;
 
    const sshUrl = repoUrl.match(gitSSHRegex);
 
    if (sshUrl) {
      const [, author, repo] = sshUrl;
 
      url = `https://github.com/${author}/${repo}`;
    }
 
    return {
      hostname: new URL(url).hostname,
      url,
    };
  } catch {
    // Invalid URL, return undefined as a signal that we should not display it
    return undefined;
  }
};
 
export type SearchParamsObject = Record<
  string,
  string | number | undefined | null
>;
 
export const createURLSearchParams = (
  params: SearchParamsObject,
  base?: string
) => {
  const searchParams = new URLSearchParams(base);
 
  Object.entries(params)
    .filter(([, v]) => v != null)
    .forEach(([k, v]) => {
      searchParams.set(k, `${v}`);
    });
 
  return searchParams.toString();
};
 
export const createURL = (base: string, params?: SearchParamsObject) => {
  let url = base;
 
  Eif (params) {
    const search = createURLSearchParams(params);
 
    if (search) {
      url += `?${search}`;
    }
  }
 
  return url;
};
 
export const getSearchPath = ({
  cdkMajor,
  cdkType,
  keywords,
  query,
  offset,
  languages,
  sort,
  tags,
}: {
  cdkMajor?: string | number;
  query?: string;
  offset?: string | number;
  cdkType?: CDKType;
  keywords?: string[];
  languages?: Language[];
  sort?: CatalogSearchSort;
  tags?: string[];
}) =>
  createURL(ROUTES.SEARCH, {
    [QUERY_PARAMS.SEARCH_QUERY]: query,
    [QUERY_PARAMS.CDK_TYPE]: cdkType,
    [QUERY_PARAMS.CDK_MAJOR]: cdkMajor,
    [QUERY_PARAMS.KEYWORDS]: keywords?.length ? keywords.join(",") : null,
    [QUERY_PARAMS.LANGUAGES]: languages?.length ? languages.join(",") : null,
    [QUERY_PARAMS.SORT]: sort,
    [QUERY_PARAMS.OFFSET]: offset ?? 0,
    [QUERY_PARAMS.TAGS]: tags?.length ? tags.join(",") : null,
  });
 
export const getPackagePath = ({
  name,
  version,
  language,
  submodule,
  api,
}: {
  api?: string;
  name: string;
  version?: string;
  language?: Language;
  submodule?: string;
}) => {
  const versionSegment = version ? `/v/${version}` : "";
  const apiSegment = version && api ? `/api/${api}` : "";
 
  return createURL(`${ROUTES.PACKAGES}/${name}${versionSegment}${apiSegment}`, {
    [QUERY_PARAMS.SUBMODULE]: submodule,
    [QUERY_PARAMS.LANGUAGE]: language,
  });
};