diff --git a/api/wild/top-langs.js b/api/wild/top-langs.js new file mode 100644 index 00000000..731752b7 --- /dev/null +++ b/api/wild/top-langs.js @@ -0,0 +1,67 @@ +import { renderTopLanguages } from "../src/cards/top-languages-card.js"; +import { + clampValue, + CONSTANTS, + parseArray, + parseBoolean, + renderError, +} from "../src/common/utils.js"; + +export default async (req, res) => { + const { + hide, + hide_title, + hide_border, + card_width, + title_color, + text_color, + bg_color, + theme, + cache_seconds, + layout, + exclude_repo, + custom_title, + locale, + border_radius, + border_color, + } = req.query; + res.setHeader("Content-Type", "image/svg+xml"); + + try { + const topLangs = req.query.top_langs.split(","); + + const cacheSeconds = clampValue( + parseInt(cache_seconds || CONSTANTS.FOUR_HOURS, 10), + CONSTANTS.FOUR_HOURS, + CONSTANTS.ONE_DAY, + ); + + res.setHeader( + "Cache-Control", + `max-age=${ + cacheSeconds / 2 + }, s-maxage=${cacheSeconds}, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, + ); + + return res.send( + renderTopLanguages(topLangs, { + hide_title: parseBoolean(hide_title), + hide_border: parseBoolean(hide_border), + card_width: parseInt(card_width, 10), + hide: parseArray(hide), + title_color, + text_color, + bg_color, + theme, + layout, + langs_count: topLangs.length, + border_radius, + border_color, + locale: locale ? locale.toLowerCase() : null, + }), + ); + } catch (err) { + res.setHeader("Cache-Control", `no-cache, no-store, must-revalidate`); // Don't cache error responses. + return res.send(renderError(err.message, err.secondaryMessage)); + } +};