UNPKG

vuepress-theme-plume

Version:

A Blog&Document Theme for VuePress 2.0

108 lines (106 loc) 3.21 kB
import { computed, inject, provide, ref, toValue } from "vue"; //#region src/client/features/composables/npm-badge.ts const DEFAULT_COLOR = "#32A9C3"; const DEFAULT_LABEL_COLOR = "#1B3C4A"; const BADGE_URL = "https://img.shields.io"; const GITHUB_URL = "https://github.com"; const NPM_URL = "https://www.npmjs.com/package"; const NpmBadgeSymbol = Symbol(__VUEPRESS_DEV__ ? "NpmBadge" : ""); function useNpmBadge(opt) { const parentOpt = inject(NpmBadgeSymbol, ref({})); return computed(() => { const po = toValue(parentOpt); const o = toValue(opt); return resolveNpmBadgeOptions({ name: o.name || po.name, repo: o.repo || po.repo, branch: o.branch || po.branch, dir: o.dir || po.dir, type: o.type, color: o.color || po.color, label: o.label, labelColor: o.labelColor || po.labelColor, theme: o.theme || po.theme }); }); } function useNpmBadgeGroup(opt) { provide(NpmBadgeSymbol, computed(() => { const o = toValue(opt); return { name: o.name, repo: o.repo, branch: o.branch, dir: o.dir, color: o.color, labelColor: o.labelColor, theme: o.theme }; })); } function resolveNpmBadgeOptions(options) { let { name = "", repo = "", branch = "main", dir = "", type, color, label, labelColor, theme = "" } = options; name = name || repo.split("/")?.[1] || ""; const normalizeName = encodeURIComponent(name); const githubLink = repo ? `${GITHUB_URL}/${repo}${dir ? `/tree/${branch}/${dir}` : ""}` : ""; const npmLink = `${NPM_URL}/${name}`; const params = new URLSearchParams(); if (type !== "source" && type !== "stars" && type !== "forks") { params.append("style", theme || "flat"); params.append("color", color || DEFAULT_COLOR); params.append("labelColor", labelColor || DEFAULT_LABEL_COLOR); } switch (type) { case "source": params.append("logo", "github"); params.append("color", labelColor || DEFAULT_LABEL_COLOR); return { badgeUrl: `${BADGE_URL}/badge/source-a?${params.toString()}`, link: githubLink, alt: "github source" }; case "stars": case "forks": params.append("style", theme || "social"); return { badgeUrl: `${BADGE_URL}/github/${type}/${repo}?${params.toString()}`, link: githubLink, alt: `github ${type}` }; case "license": return { badgeUrl: `${BADGE_URL}/github/license/${repo}?${params.toString()}`, link: githubLink, alt: "license" }; case "version": params.append("label", label || name || "npm"); return { badgeUrl: `${BADGE_URL}/npm/v/${normalizeName}?${params.toString()}`, link: npmLink, alt: "npm version" }; case "dt": case "d18m": params.append("label", label || "downloads"); return { badgeUrl: `${BADGE_URL}/npm/d18m/${normalizeName}?${params.toString()}`, link: npmLink, alt: "npm downloads" }; case "dm": case "dy": case "dw": params.append("label", label || "downloads"); return { badgeUrl: `${BADGE_URL}/npm/${type}/${normalizeName}?${params.toString()}`, link: npmLink, alt: "npm downloads" }; default: return { badgeUrl: `${BADGE_URL}/badge/unknown?${params.toString()}`, alt: "unknown" }; } } //#endregion export { useNpmBadge, useNpmBadgeGroup };