construct-hub-webapp 0.1.705 → 0.1.707

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"static/js/29.ab13262f.chunk.js","mappings":"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","sources":["components/Highlight/Highlight.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageCard/constants.ts","components/PackageCard/testIds.ts","components/PackageCard/Details.tsx","components/PackageCard/EditorsNote.tsx","components/PackageCard/Heading.tsx","components/PackageCard/Highlight.tsx","components/PackageLanguages/PackageLanguages.tsx","components/PackageCard/Languages.tsx","components/PackageCard/Tags.tsx","components/PackageCard/WideCard.tsx","components/PackageCard/PackageCard.tsx","components/PackageTag/PackageTag.tsx","constants/pageInfo.ts","components/Page/Page.tsx","components/Time/Time.tsx","hooks/useConfigValue/useConfigValue.ts","hooks/useLanguage/useLanguage.ts","hooks/useQueryParams/useQueryParams.ts","util/package.ts"],"sourcesContent":["import { Stack, Image, Text, useColorModeValue } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\ninterface HighlightProps {\n label: string;\n color?: string;\n icon?: string;\n}\n\nexport const Highlight: FunctionComponent<HighlightProps> = ({\n label,\n color,\n icon,\n}: HighlightProps) => {\n const brightness = useColorModeValue(\"none\", \"brightness(1.75)\");\n return (\n <Stack align=\"center\" direction=\"row\" filter={brightness} spacing={2}>\n <Image alt={`${label} icon`} src={icon} w={4} />\n <Text color={color} fontWeight=\"bold\">\n {label}\n </Text>\n </Stack>\n );\n};\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<\n LanguageSupportTooltipProps\n> = ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n};\n","export enum PackageCardType {\n Wide = \"wide\",\n}\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"packageCard\", [\n \"author\",\n \"description\",\n \"downloads\",\n \"languages\",\n \"published\",\n \"title\",\n \"version\",\n \"comment\",\n \"wideContainer\",\n] as const);\n\nexport default testIds;\n","import { Text, Tooltip } from \"@chakra-ui/react\";\nimport { formatDistanceToNowStrict } from \"date-fns\";\nimport { FunctionComponent, ReactChild } from \"react\";\nimport { useStats } from \"../../hooks/useStats\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\nimport { Time } from \"../Time\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\ninterface DetailProps {\n \"data-testid\": string;\n tooltip?: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n tooltip,\n value,\n}) => (\n <Tooltip hasArrow isDisabled={!tooltip} label={tooltip} placement=\"left\">\n {/* zIndex required to allow tooltip to display due to card link overlay */}\n <Text data-testid={dataTestid} fontSize=\"xs\" zIndex={1}>\n {value}\n </Text>\n </Tooltip>\n);\n\nexport const Details: FunctionComponent = () => {\n const {\n author,\n metadata: { date },\n name,\n } = usePackageCard();\n\n const { data } = useStats();\n const downloads: number | undefined = data?.packages?.[name]?.downloads?.npm;\n\n const authorName = typeof author === \"string\" ? author : author.name;\n const publishDate = new Date(date);\n\n return (\n <>\n {downloads !== undefined && (\n <Detail\n data-testid={testIds.downloads}\n tooltip=\"Download numbers are periodically sourced from the npm registry\"\n value={`${downloads.toLocaleString()} weekly downloads`}\n />\n )}\n <Detail\n data-testid={testIds.published}\n value={\n <Time\n date={publishDate}\n fontSize=\"xs\"\n formattedDate={formatDistanceToNowStrict(publishDate, {\n addSuffix: true,\n })}\n />\n }\n />\n <Detail\n data-testid={testIds.author}\n value={\n <>\n By{\" \"}\n <NavLink\n color=\"link\"\n to={getSearchPath({\n query: authorName,\n })}\n >\n {authorName}\n </NavLink>\n </>\n }\n />\n </>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\n\nexport const EditorsNote: FunctionComponent<{ comment?: string }> = ({\n comment,\n}) => {\n return (\n <Text\n data-testid={testIds.comment}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n <Text as=\"span\" color=\"blue.500\" fontWeight=\"bold\">\n Editor&apos;s note:{\" \"}\n </Text>\n {comment}\n </Text>\n );\n};\n","import {\n Flex,\n Heading as ChakraHeading,\n LinkOverlay,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { CDKTypeBadge } from \"../CDKType\";\nimport { EditorsNote } from \"./EditorsNote\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\nexport const Heading: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n const {\n dataEvent,\n description,\n comment,\n constructFrameworks,\n name,\n version,\n } = usePackageCard();\n\n return (\n <>\n <LinkOverlay\n as={Link}\n data-event={\n dataEvent ? eventName(dataEvent, \"Package Card\", name) : undefined\n }\n to={getPackagePath({\n name,\n version,\n language: currentLanguage,\n })}\n >\n <Flex align=\"center\">\n <CDKTypeBadge\n constructFrameworks={constructFrameworks}\n mr={2}\n zIndex={1}\n />\n <ChakraHeading\n as=\"h3\"\n color=\"textPrimary\"\n data-testid={testIds.title}\n fontSize=\"md\"\n fontWeight=\"bold\"\n wordBreak=\"normal\"\n >\n {name}\n </ChakraHeading>\n </Flex>\n </LinkOverlay>\n {comment ? (\n <EditorsNote comment={comment} />\n ) : (\n <Text\n color=\"textPrimary\"\n data-testid={testIds.description}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n {description || \"No description available.\"}\n </Text>\n )}\n </>\n );\n};\n","import { Box } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { highlightsFrom } from \"../../util/package\";\nimport { Highlight as HighlightComponent } from \"../Highlight\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Highlight: FunctionComponent = () => {\n const { packageTags = [] } = usePackageCard()?.metadata ?? {};\n const [highlight] = highlightsFrom(packageTags);\n\n if (!highlight) return null;\n\n return (\n <Box fontSize=\"xs\">\n <HighlightComponent {...highlight} />\n </Box>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Language,\n LANGUAGES,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getPackagePath } from \"../../util/url\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nconst sizes = {\n sm: 5,\n md: 6,\n lg: 8,\n};\n\nexport interface PackageLanguagesProps {\n isRounded?: boolean;\n languages?: Partial<Record<Language, unknown>>;\n name: string;\n size?: \"sm\" | \"md\" | \"lg\";\n version: string;\n}\n\nexport const PackageLanguages: FunctionComponent<PackageLanguagesProps> = ({\n isRounded = false,\n languages,\n name: packageName,\n size = \"md\",\n version,\n}) => {\n const targets = Object.keys(languages ?? {}) as Language[];\n return (\n <>\n {Object.entries(LANGUAGE_RENDER_MAP)\n // Ensure entries are always sorted in a stable way\n .sort(\n ([left], [right]) =>\n LANGUAGES.indexOf(left as Language) -\n LANGUAGES.indexOf(right as Language)\n )\n .map(([lang, info]) => {\n const language = lang as Language;\n\n const isSupportedByLibrary =\n language === Language.TypeScript || targets.includes(language);\n\n const isSupportedByConstructHub =\n language === Language.TypeScript || // TypeScript is always supported\n // Otherwise, the language must be supported by ConstructHub\n TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (!isSupportedByLibrary) return null;\n\n const { name, icon: Icon } = info;\n\n const icon = (\n <Icon\n aria-label={`Supports ${name}`}\n borderRadius={isRounded ? \"50%\" : 0}\n h={sizes[size]}\n opacity={isSupportedByConstructHub ? 1 : 0.2}\n w={sizes[size]}\n />\n );\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n {isSupportedByConstructHub ? (\n <Link\n aria-label={`View package docs for ${language}`}\n to={getPackagePath({ name: packageName, version, language })}\n >\n {icon}\n </Link>\n ) : (\n icon\n )}\n </LanguageSupportTooltip>\n );\n })}\n </>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { PackageLanguages } from \"../PackageLanguages\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Languages: FunctionComponent = () => {\n const pkg = usePackageCard();\n return <PackageLanguages {...pkg} size=\"sm\" />;\n};\n","import { FunctionComponent } from \"react\";\nimport { tagObjectsFrom } from \"../../util/package\";\nimport { PackageTag } from \"../PackageTag\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Tags: FunctionComponent = () => {\n const {\n keywords = [],\n metadata: { packageTags = [] },\n } = usePackageCard();\n\n const tags = tagObjectsFrom({\n packageTags,\n keywords,\n });\n\n return (\n <>\n {tags.slice(0, 10).map(({ id, keyword: { label, color } = {} }) => (\n <PackageTag key={id} value={id} variant={color}>\n {label}\n </PackageTag>\n ))}\n </>\n );\n};\n","import { Flex, Grid, LinkBox, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Details } from \"./Details\";\nimport { Heading } from \"./Heading\";\nimport { Highlight } from \"./Highlight\";\nimport { Languages } from \"./Languages\";\nimport { Tags } from \"./Tags\";\nimport testIds from \"./testIds\";\n\nexport const WideCard: FunctionComponent = () => {\n return (\n <LinkBox\n _hover={{\n \"> article\": {\n bg: \"hoverPrimary\",\n },\n }}\n >\n <Grid\n as=\"article\"\n bg=\"bgSecondary\"\n border=\"base\"\n borderRadius=\"sm\"\n boxShadow=\"base\"\n color=\"textPrimary\"\n data-testid={testIds.wideContainer}\n h=\"full\"\n minH=\"12.5rem\"\n templateColumns={{ base: \"1fr\", lg: \"1fr 14rem\" }}\n w=\"full\"\n >\n {/* Top / Left side of card */}\n <Flex\n direction=\"column\"\n justify=\"space-between\"\n overflow=\"hidden\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={3}>\n <Heading />\n </Stack>\n\n <Flex align=\"center\" sx={{ gap: \"0.5rem\" }} wrap=\"wrap\">\n <Tags />\n </Flex>\n </Flex>\n\n {/* Bottom / Right side of card */}\n <Flex\n align={{ base: \"end\", lg: \"initial\" }}\n borderLeft={{ lg: \"base\" }}\n borderTop={{ base: \"base\", lg: \"none\" }}\n direction={{ base: \"row\", lg: \"column\" }}\n justify=\"space-between\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={1}>\n <Highlight />\n <Stack spacing={1}>\n <Details />\n </Stack>\n </Stack>\n\n <Stack data-testid={testIds.languages} direction=\"row\" spacing={2}>\n <Languages />\n </Stack>\n </Flex>\n </Grid>\n </LinkBox>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\nimport { PackageCardType } from \"./constants\";\nimport { WideCard } from \"./WideCard\";\n\nexport interface PackageCardProps {\n \"data-event\"?: string;\n pkg: ExtendedCatalogPackage;\n variant?: PackageCardType;\n}\n\ninterface PackageCardState extends ExtendedCatalogPackage {\n comment?: string;\n dataEvent?: string;\n}\n\nconst PackageCardContext = createContext<PackageCardState | null>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n \"data-event\": dataEvent,\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={{ ...pkg, dataEvent }}>\n {variant === PackageCardType.Wide && <WideCard />}\n </PackageCardContext.Provider>\n );\n};\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ keywords: [value] })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","export const pageInfo = {\n contribute: {\n event: {\n name: \"Contribute Load\",\n },\n },\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\n// Should be the same as the \"real\" CSP, except most things come from HTTP\n// instead of HTTPS (because it is protocol-relative, and the dev site is\n// served over plain HTTP).\nconst csp = [\n \"default-src 'self' 'unsafe-inline' http://*.awsstatic.com;\",\n \"connect-src 'self' https://*.shortbread.aws.dev http://*.shortbread.aws.dev http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"frame-src http://aws.demdex.net http://dpm.demdex.net;\",\n \"img-src 'self' https://* http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"object-src 'none';\",\n \"style-src 'self' 'unsafe-inline';\",\n].join(\" \");\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const feedUrls = useConfigValue(\"feeds\") || [];\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta content={csp} httpEquiv=\"Content-Security-Policy\" />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n {feedUrls.map(({ url, mimeType }) => (\n <link href={url} key={url} rel=\"alternate\" type={mimeType} />\n ))}\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport type TimeOptions = {\n date: Date;\n format?: string;\n formattedDate?: string;\n};\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, formattedDate, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {formattedDate ?? format(date, formatString ?? \"\")}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","import type { Config } from \"../../api/config\";\nimport { useConfig } from \"../../contexts/Config\";\n\nexport const useConfigValue = <T extends keyof Config>(key: T) => {\n const { data } = useConfig();\n return (data ?? {})[key];\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { PackageHighlight, PackageTagConfig } from \"../api/config\";\nimport { KEYWORD_IGNORE_LIST } from \"../constants/keywords\";\n\nexport interface TagObject extends PackageTagConfig {}\n\n/**\n * Reduces package tags to only return highlight tags\n */\nexport const highlightsFrom = (packageTags?: PackageTagConfig[]) => {\n if (!packageTags || packageTags.length < 1) return [];\n\n return packageTags.reduce(\n (accum: PackageHighlight[], tag: PackageTagConfig): PackageHighlight[] => {\n if (tag.highlight) {\n return [...accum, tag.highlight];\n }\n\n return accum;\n },\n []\n );\n};\n\n/**\n * Maps packageTags to an array of TagObjects, which can be rendered by the PackageTags Component\n */\nexport const mapPackageTags = (\n packageTags?: PackageTagConfig[]\n): TagObject[] => {\n return (packageTags ?? [])\n .filter((tag) => {\n return Boolean(tag.keyword?.label);\n })\n .map((tag) => ({\n ...tag,\n id: tag.keyword?.label!,\n }));\n};\n\n/**\n * Maps keywords to an array of TagObjects, which can be rendered by the PackageTags component\n */\nexport const mapPackageKeywords = (keywords?: string[]): TagObject[] => {\n if (!keywords || keywords.length < 1) return [];\n\n return keywords\n .filter((label) => Boolean(label) && !KEYWORD_IGNORE_LIST.has(label))\n .map((label) => ({\n id: label,\n keyword: {\n label,\n },\n }));\n};\n\n/**\n * Maps packageTags and keywords to a list of TagObjects, using mapPackageTags and mapPackageKeywords\n */\nexport const tagObjectsFrom = ({\n packageTags,\n keywords,\n}: {\n packageTags?: PackageTagConfig[];\n keywords?: string[];\n}): TagObject[] => {\n const tagObjects = new Array<TagObject>();\n const tagLabels = new Set<string>();\n\n for (const tag of [\n ...mapPackageTags(packageTags),\n ...mapPackageKeywords(keywords),\n ]) {\n const label = tag.keyword!.label.toLowerCase();\n if (!tagLabels.has(label)) {\n tagObjects.push(tag);\n tagLabels.add(label);\n }\n }\n\n return tagObjects;\n};\n"],"names":["Highlight","label","color","icon","brightness","useColorModeValue","align","direction","filter","spacing","alt","src","w","fontWeight","LanguageSupportTooltip","children","language","isSupported","TEMP_SUPPORTED_LANGUAGES","langName","LANGUAGE_NAME_MAP","message","hasArrow","placement","PackageCardType","createTestIds","Detail","dataTestid","tooltip","value","isDisabled","fontSize","zIndex","Details","usePackageCard","author","date","metadata","name","data","useStats","downloads","packages","npm","authorName","publishDate","Date","undefined","testIds","toLocaleString","Time","formattedDate","formatDistanceToNowStrict","addSuffix","NavLink","to","getSearchPath","query","EditorsNote","comment","lineHeight","noOfLines","as","Heading","useLanguage","currentLanguage","dataEvent","description","constructFrameworks","version","Link","eventName","getPackagePath","CDKType","mr","wordBreak","packageTags","highlightsFrom","highlight","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","sort","left","right","LANGUAGES","map","lang","info","isSupportedByLibrary","Language","includes","isSupportedByConstructHub","Icon","borderRadius","h","opacity","Languages","pkg","Tags","keywords","tags","tagObjectsFrom","slice","id","keyword","PackageTag","variant","WideCard","_hover","bg","border","boxShadow","minH","templateColumns","base","justify","overflow","p","sx","gap","wrap","borderLeft","borderTop","PackageCardContext","createContext","useContext","PackageCard","Wide","Provider","tagProps","textDecoration","pageInfo","contribute","event","home","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","join","meta","pageName","trackPageView","usePageView","useEffect","feedUrls","useConfigValue","suffix","title","formattedTitle","Helmet","process","content","charSet","url","mimeType","href","rel","type","property","forwardRef","ref","formatString","format","boxProps","dateTime","toISOString","displayName","key","useConfig","defaultLang","LOCAL_KEY","isValidLang","getInitialLang","langFromParams","storedLang","localStorage","getItem","options","updateUrl","updateSaved","useLocation","pathname","hash","useHistory","replace","params","useQueryParams","get","QUERY_PARAMS","useState","setLanguage","set","toString","update","useCallback","val","setItem","useMemo","URLSearchParams","length","reduce","accum","tag","tagObjects","Array","tagLabels","Set","Boolean","mapPackageTags","KEYWORD_IGNORE_LIST","mapPackageKeywords","toLowerCase","has","push","add"],"sourceRoot":""}
1
+ {"version":3,"file":"static/js/29.ab13262f.chunk.js","mappings":"iNASaA,EAA+C,SAAH,GAIlC,IAHrBC,EAAK,EAALA,MACAC,EAAK,EAALA,MACAC,EAAI,EAAJA,KAEMC,GAAaC,EAAAA,EAAAA,IAAkB,OAAQ,oBAC7C,OACE,UAAC,KAAK,CAACC,MAAM,SAASC,UAAU,MAAMC,OAAQJ,EAAYK,QAAS,EAAE,WACnE,SAAC,KAAK,CAACC,IAAG,UAAKT,EAAK,SAASU,IAAKR,EAAMS,EAAG,KAC3C,SAAC,KAAI,CAACV,MAAOA,EAAOW,WAAW,OAAM,SAClCZ,MAIT,C,4FCXaa,EAET,SAAH,GAAgC,IAA1BC,EAAQ,EAARA,SAAUC,EAAQ,EAARA,SACTC,EAAcC,EAAAA,GAAAA,IAA6BF,GAC3CG,EAAWC,EAAAA,GAAkBJ,GAE7BK,EAAUJ,EAAW,yCACWE,GAAQ,oCACbA,EAAQ,oBAEzC,OACE,SAAC,IAAO,CAACG,UAAQ,EAACrB,MAAOoB,EAASE,UAAU,YAAW,UACrD,0BAAOR,KAGb,C,wBC3BO,IAAKS,E,uDAEX,SAFWA,GAAAA,EAAe,YAE1B,CAFWA,IAAAA,EAAe,K,sGCc3B,GAZgBC,E,SAAAA,GAAc,cAAe,CAC3C,SACA,cACA,YACA,YACA,YACA,QACA,UACA,UACA,kB,WCKIC,EAAyC,SAAH,OAC3BC,EAAU,EAAzB,eACAC,EAAO,EAAPA,QACAC,EAAK,EAALA,MAAK,OAEL,SAAC,IAAO,CAACP,UAAQ,EAACQ,YAAaF,EAAS3B,MAAO2B,EAASL,UAAU,OAAM,UAEtE,SAAC,KAAI,CAAC,cAAaI,EAAYI,SAAS,KAAKC,OAAQ,EAAE,SACpDH,KAEK,EAGCI,EAA6B,WAAO,IAAD,MAC9C,EAIIC,IAHFC,EAAM,EAANA,OACYC,EAAI,EAAhBC,SAAYD,KACZE,EAAI,EAAJA,KAGMC,GAASC,EAAAA,EAAAA,KAATD,KACFE,EAAoC,OAAJF,QAAI,IAAJA,GAAc,QAAV,EAAJA,EAAMG,gBAAQ,OAAQ,QAAR,EAAd,EAAiBJ,UAAK,OAAW,QAAX,EAAtB,EAAwBG,iBAAS,WAA7B,EAAJ,EAAmCE,IAEnEC,EAA+B,kBAAXT,EAAsBA,EAASA,EAAOG,KAC1DO,EAAc,IAAIC,KAAKV,GAE7B,OACE,qCACiBW,IAAdN,IACC,SAACf,EAAM,CACL,cAAasB,EAAAA,UACbpB,QAAQ,kEACRC,MAAK,UAAKY,EAAUQ,iBAAgB,wBAGxC,SAACvB,EAAM,CACL,cAAasB,EAAAA,UACbnB,OACE,SAACqB,EAAA,EAAI,CACHd,KAAMS,EACNd,SAAS,KACToB,eAAeC,EAAAA,EAAAA,GAA0BP,EAAa,CACpDQ,WAAW,SAKnB,SAAC3B,EAAM,CACL,cAAasB,EAAAA,OACbnB,OACE,qCACK,KACH,SAACyB,EAAA,EAAO,CACNpD,MAAM,OACNqD,IAAIC,EAAAA,EAAAA,IAAc,CAChBC,MAAOb,IACN,SAEFA,WAOf,E,sDC7Eac,EAAuD,SAAH,GAE1D,IADLC,EAAO,EAAPA,QAEA,OACE,UAAC,KAAI,CACH,cAAaX,EAAAA,QACbjB,SAAS,KACT6B,WAAW,OACXC,UAAW,EAAE,WAEb,UAAC,KAAI,CAACC,GAAG,OAAO5D,MAAM,WAAWW,WAAW,OAAM,2BAC5B,OAErB8C,IAGP,ECJaI,EAA6B,WACxC,OAA0BC,EAAAA,EAAAA,KAAnBC,GAAgC,YAAjB,GACtB,EAOI/B,IANFgC,EAAS,EAATA,UACAC,EAAW,EAAXA,YACAR,EAAO,EAAPA,QACAS,EAAmB,EAAnBA,oBACA9B,EAAI,EAAJA,KACA+B,EAAO,EAAPA,QAGF,OACE,iCACE,SAAC,KAAW,CACVP,GAAIQ,EAAAA,GACJ,aACEJ,GAAYK,EAAAA,EAAAA,IAAUL,EAAW,eAAgB5B,QAAQS,EAE3DQ,IAAIiB,EAAAA,EAAAA,IAAe,CACjBlC,KAAAA,EACA+B,QAAAA,EACArD,SAAUiD,IACT,UAEH,UAAC,KAAI,CAAC3D,MAAM,SAAQ,WAClB,SAACmE,EAAA,EAAY,CACXL,oBAAqBA,EACrBM,GAAI,EACJ1C,OAAQ,KAEV,SAAC,KAAa,CACZ8B,GAAG,KACH5D,MAAM,cACN,cAAa8C,EAAAA,MACbjB,SAAS,KACTlB,WAAW,OACX8D,UAAU,SAAQ,SAEjBrC,SAINqB,GACC,SAACD,EAAW,CAACC,QAASA,KAEtB,SAAC,KAAI,CACHzD,MAAM,cACN,cAAa8C,EAAAA,YACbjB,SAAS,KACT6B,WAAW,OACXC,UAAW,EAAE,SAEZM,GAAe,gCAK1B,E,sBCnEanE,EAA+B,WAAO,IAAD,IACa,GAAN,QAAvD,EAA6C,QAA7C,EAA6BkC,WAAgB,aAAhB,EAAkBG,gBAAQ,QAAI,CAAC,GAApDuC,YAAAA,OAAW,MAAG,GAAE,EACxB,GAAoBC,EAAAA,EAAAA,IAAeD,GAA5BE,GAAwC,YAA/B,GAEhB,OAAKA,GAGH,SAAC,KAAG,CAAC/C,SAAS,KAAI,UAChB,SAAC,KAAkB,UAAK+C,MAJL,IAOzB,E,qBCNMC,EAAQ,CACZC,GAAI,EACJC,GAAI,EACJC,GAAI,GAWOC,EAA6D,SAAH,GAMhE,IAAD,IALJC,UAAAA,OAAS,OAAQ,EACjBC,EAAS,EAATA,UACMC,EAAW,EAAjBhD,KAAI,IACJiD,KAAAA,OAAI,MAAG,KAAI,EACXlB,EAAO,EAAPA,QAEMmB,EAAUC,OAAOC,KAAc,OAATL,QAAS,IAATA,EAAAA,EAAa,CAAC,GAC1C,OACE,8BACGI,OAAOE,QAAQC,EAAAA,IAEbC,MACC,kBAAEC,GAAF,YAAM,GAAIC,GAAJ,YAAS,UACbC,EAAAA,GAAAA,QAAkBF,GAClBE,EAAAA,GAAAA,QAAkBD,EAAkB,IAEvCE,KAAI,YAAmB,IAAD,eAAhBC,EAAI,KAAEC,EAAI,KACTnF,EAAWkF,EAEXE,EACJpF,IAAaqF,EAAAA,GAAAA,YAAuBb,EAAQc,SAAStF,GAEjDuF,EACJvF,IAAaqF,EAAAA,GAAAA,YAEbnF,EAAAA,GAAAA,IAA6BF,GAE/B,IAAKoF,EAAsB,OAAO,KAElC,IAAQ9D,EAAqB6D,EAArB7D,KAAYkE,EAASL,EAAfhG,KAERA,GACJ,SAACqG,EAAI,CACH,gCAAwBlE,GACxBmE,aAAcrB,EAAY,MAAQ,EAClCsB,EAAG3B,EAAMQ,GACToB,QAASJ,EAA4B,EAAI,GACzC3F,EAAGmE,EAAMQ,KAIb,OACE,SAACzE,EAAA,EAAsB,CAAgBE,SAAUA,EAAS,SACvDuF,GACC,SAAC,KAAI,CACH,6CAAqCvF,GACrCuC,IAAIiB,EAAAA,EAAAA,IAAe,CAAElC,KAAMgD,EAAajB,QAAAA,EAASrD,SAAAA,IAAY,SAE5Db,IAGHA,GATyBa,EAajC,KAGR,EChFa4F,EAA+B,WAC1C,IAAMC,EAAM3E,IACZ,OAAO,SAACiD,GAAgB,kBAAK0B,GAAG,IAAEtB,KAAK,OACzC,E,WCFauB,EAA0B,WACrC,MAGI5E,IAAgB,IAFlB6E,SAAAA,OAAQ,MAAG,GAAE,MACb1E,SAAYuC,YAAAA,OAAW,MAAG,GAAE,EAGxBoC,GAAOC,EAAAA,EAAAA,IAAe,CAC1BrC,YAAAA,EACAmC,SAAAA,IAGF,OACE,8BACGC,EAAKE,MAAM,EAAG,IAAIjB,KAAI,gBAAGkB,EAAE,EAAFA,GAAG,EAAD,EAAEC,QAAWnH,GAAJ,aAAqB,CAAC,EAAC,GAAnBA,MAAOC,EAAK,EAALA,MAAK,OACnD,SAACmH,EAAA,EAAU,CAAUxF,MAAOsF,EAAIG,QAASpH,EAAM,SAC5CD,GADckH,EAEJ,KAIrB,EChBaI,EAA8B,WACzC,OACE,SAAC,KAAO,CACNC,OAAQ,CACN,YAAa,CACXC,GAAI,iBAEN,UAEF,UAAC,KAAI,CACH3D,GAAG,UACH2D,GAAG,cACHC,OAAO,OACPjB,aAAa,KACbkB,UAAU,OACVzH,MAAM,cACN,cAAa8C,EAAAA,cACb0D,EAAE,OACFkB,KAAK,UACLC,gBAAiB,CAAEC,KAAM,MAAO5C,GAAI,aACpCtE,EAAE,OAAM,WAGR,UAAC,KAAI,CACHL,UAAU,SACVwH,QAAQ,gBACRC,SAAS,SACTC,EAAG,EACHC,GAAI,CAAEC,IAAK,UAAW,WAEtB,SAAC,KAAK,CAAC1H,QAAS,EAAE,UAChB,SAACsD,EAAO,OAGV,SAAC,KAAI,CAACzD,MAAM,SAAS4H,GAAI,CAAEC,IAAK,UAAYC,KAAK,OAAM,UACrD,SAACtB,EAAI,UAKT,UAAC,KAAI,CACHxG,MAAO,CAAEwH,KAAM,MAAO5C,GAAI,WAC1BmD,WAAY,CAAEnD,GAAI,QAClBoD,UAAW,CAAER,KAAM,OAAQ5C,GAAI,QAC/B3E,UAAW,CAAEuH,KAAM,MAAO5C,GAAI,UAC9B6C,QAAQ,gBACRE,EAAG,EACHC,GAAI,CAAEC,IAAK,UAAW,WAEtB,UAAC,KAAK,CAAC1H,QAAS,EAAE,WAChB,SAACT,EAAS,KACV,SAAC,KAAK,CAACS,QAAS,EAAE,UAChB,SAACwB,EAAO,UAIZ,SAAC,KAAK,CAAC,cAAae,EAAAA,UAAmBzC,UAAU,MAAME,QAAS,EAAE,UAChE,SAACmG,EAAS,aAMtB,ECxDM2B,GAAqBC,EAAAA,EAAAA,eAAuC,MAErDtG,EAAiB,WAAH,OAASuG,EAAAA,EAAAA,YAAWF,EAAmB,EAErDG,EAAmD,SAAH,GAItD,IAHSxE,EAAS,EAAvB,cACA2C,EAAG,EAAHA,IAAI,EAAD,EACHS,QAAAA,OAAO,MAAG9F,EAAgBmH,KAAI,EAE9B,OACE,SAACJ,EAAmBK,SAAQ,CAAC/G,OAAK,kBAAOgF,GAAG,IAAE3C,UAAAA,IAAY,SACvDoD,IAAY9F,EAAgBmH,OAAQ,SAACpB,EAAQ,KAGpD,C,qKCnBaF,EAAiD,SAAH,GAMpD,IALLtG,EAAQ,EAARA,SACAc,EAAK,EAALA,MAAM,EAAD,EACL5B,MAAAA,OAAK,MAAG4B,EAAK,EACbG,EAAM,EAANA,OACG6G,GAAQ,YAEX,OACE,SAACvF,EAAA,EAAO,CACN,4BAAoBrD,GACpBsD,IAAIC,EAAAA,EAAAA,IAAc,CAAEuD,SAAU,CAAClF,KAC/BG,OAAQA,EAAO,UAEf,SAAC,MAAG,gBACFwF,OAAQ,CACNsB,eAAgB,cAEdD,GAAQ,cAEZ,SAAC,KAAQ,UAAE9H,QAInB,C,kFClCagI,EAAW,CACtBC,WAAY,CACVC,MAAO,CACL3G,KAAM,oBAGV4G,KAAM,CACJD,MAAO,CACL3G,KAAM,cAGV6G,IAAK,CACHF,MAAO,CACL3G,KAAM,oCAGV8G,eAAgB,CACdH,MAAO,CACL3G,KAAM,yBAGV+G,OAAQ,CACNJ,MAAO,CACL3G,KAAM,gBAGVgH,UAAW,CACTL,MAAO,CACL3G,KAAM,oBAGViH,SAAU,CACRC,KAAM,CACJC,SAAU,aAEZR,MAAO,CACL3G,KAAM,mB,iCCTCoH,GATD,CACV,6DACA,wNACA,yDACA,qKACA,qBACA,qCACAC,KAAK,KAE2C,SAAH,GAIxC,IAHL5I,EAAQ,EAARA,SACA6I,EAAI,EAAJA,KACAC,EAAQ,EAARA,SAEMC,GAAgBC,EAAAA,EAAAA,IAAYhB,EAASc,KAE3CG,EAAAA,EAAAA,YAAU,WACRF,GACF,GAAG,CAACA,IAEJ,IAAMG,GAAWC,EAAAA,EAAAA,GAAe,UAAY,GAC5C,EAA8CN,EAAtCO,OAAAA,OAAM,OAAO,EAAEC,EAAuBR,EAAvBQ,MAAOjG,EAAgByF,EAAhBzF,YACxBkG,EAAiBF,EAAM,UAAMC,EAAK,oBAAqBA,EAE7D,OACE,iCACE,UAACE,EAAA,EAAM,YACJC,GAID,iBAAMC,QAAQ,sCAAsClI,KAAK,cACzD,iBAAMmI,QAAQ,UACbR,EAAShE,KAAI,gBAAGyE,EAAG,EAAHA,IAAKC,EAAQ,EAARA,SAAQ,OAC5B,iBAAMC,KAAMF,EAAeG,IAAI,YAAYC,KAAMH,GAA3BD,EAAuC,KAG/D,2BAAQL,KACR,iBAAMG,QAASH,EAAgBU,SAAS,cACxC,iBAAMP,QAASH,EAAgB/H,KAAK,mBACpC,iBAAMkI,QAAQ,UAAUlI,KAAK,kBAE7B,iBAAMkI,QAASrG,EAAa7B,KAAK,iBACjC,iBAAMkI,QAASrG,EAAa4G,SAAS,oBACrC,iBAAMP,QAASrG,EAAa7B,KAAK,2BAElCvB,IAGP,E,iKCxDamC,GAAO8H,EAAAA,EAAAA,KAClB,WAA6DC,GAAS,IAAnE7I,EAAI,EAAJA,KAAc8I,EAAY,EAApBC,OAAsBhI,EAAa,EAAbA,cAAkBiI,GAAQ,YACvD,OACE,SAAC,MAAG,gBAACtH,GAAG,OAAOuH,SAAUjJ,EAAKkJ,cAAeL,IAAKA,GAASG,GAAQ,aACnD,OAAbjI,QAAa,IAAbA,EAAAA,GAAiBgI,EAAAA,EAAAA,GAAO/I,EAAkB,OAAZ8I,QAAY,IAAZA,EAAAA,EAAgB,MAGrD,IAGFhI,EAAKqI,YAAc,M,uEClBNrB,EAAiB,SAAyBsB,GACrD,IAAQjJ,GAASkJ,EAAAA,EAAAA,KAATlJ,KACR,OAAY,OAAJA,QAAI,IAAJA,EAAAA,EAAQ,CAAC,GAAGiJ,EACtB,C,4HCCME,EAAcrF,EAAAA,GAAAA,WAEdsF,EAAY,qBAEZC,EAAc,SAAC1F,GAAwB,OACnC,MAARA,GAAgBhF,EAAAA,GAAAA,IAA6BgF,EAAkB,EAE3D2F,EAAiB,SAACC,GAEtB,GAAIF,EAAYE,GACd,OAAOA,EAIT,IAAK,IAAD,EACIC,EAA6C,QAAnC,EAAIC,aAAaC,QAAQN,UAAU,QAAI,GACvD,GAAIC,EAAYG,GAAa,OAAOA,CAEpC,CADA,SACA,CAIF,OAAOL,CACT,EAaa1H,EAAc,WAAuC,IAAtCkI,EAA2B,uDAAG,CAAC,EACjDC,EAA2BD,EAA3BC,UAAWC,EAAgBF,EAAhBE,YACnB,GAA2BC,EAAAA,EAAAA,MAAnBC,EAAQ,EAARA,SAAUC,EAAI,EAAJA,KAClB,GAAoBC,EAAAA,EAAAA,MAAZC,EAAO,EAAPA,QACFC,GAASC,EAAAA,EAAAA,KACTb,EAAiBY,EAAOE,IAAIC,EAAAA,GAAAA,UAGlC,GAAgCC,EAAAA,EAAAA,WAAmB,kBACjDjB,EAAeC,EAAe,IAC/B,eAFM9K,EAAQ,KAAE+L,EAAW,MAK5B/C,EAAAA,EAAAA,YAAU,WACJ4B,EAAYE,IAAmBA,IAAmB9K,GACpD+L,EAAYjB,EAGhB,GAAG,CAACA,KAGJ9B,EAAAA,EAAAA,YAAU,WACJ8B,IAAmB9K,GAAYmL,IACjCO,EAAOM,IAAIH,EAAAA,GAAAA,SAAuB7L,GAClCyL,EAAQ,CAAEH,SAAAA,EAAUC,KAAAA,EAAMlD,OAAQqD,EAAOO,aAG7C,GAAG,CAACjM,EAAUmL,IAEd,IAAMe,GAASC,EAAAA,EAAAA,cACb,SAACC,GAGC,GAFAL,EAAYK,GAERhB,EACF,IACEJ,aAAaqB,QAAQ1B,EAAWyB,EAEhC,CADA,SACA,CAGN,GACA,CAAChB,IAGH,OAAOkB,EAAAA,EAAAA,UAAQ,iBAAM,CAACtM,EAAUkM,EAAO,GAAW,CAAClM,EAAUkM,GAC/D,C,iFCrFaP,EAAiB,WAC5B,IAAQtD,GAAWgD,EAAAA,EAAAA,MAAXhD,OAER,OAAOiE,EAAAA,EAAAA,UAAQ,kBAAM,IAAIC,gBAAgBlE,EAAO,GAAE,CAACA,GACrD,C,oHCCaxE,EAAiB,SAACD,GAC7B,OAAKA,GAAeA,EAAY4I,OAAS,EAAU,GAE5C5I,EAAY6I,QACjB,SAACC,EAA2BC,GAC1B,OAAIA,EAAI7I,UACA,GAAN,eAAW4I,GAAK,CAAEC,EAAI7I,YAGjB4I,CACT,GACA,GAEJ,EAqCazG,EAAiB,SAAH,GAUzB,IAJkB,IALlBrC,EAAW,EAAXA,YACAmC,EAAQ,EAARA,SAKM6G,EAAa,IAAIC,MACjBC,EAAY,IAAIC,IAEtB,wBA1C4B,SAC5BnJ,GAEA,OAAmB,OAAXA,QAAW,IAAXA,EAAAA,EAAe,IACpBpE,QAAO,SAACmN,GAAS,IAAD,EACf,OAAOK,QAAmB,QAAZ,EAACL,EAAIvG,eAAO,aAAX,EAAanH,MAC9B,IACCgG,KAAI,SAAC0H,GAAG,+BACJA,GAAG,IACNxG,GAAe,QAAb,EAAEwG,EAAIvG,eAAO,aAAX,EAAanH,OAAM,GAE7B,CAgCOgO,CAAerJ,KAAY,OA3BA,SAACmC,GACjC,OAAKA,GAAYA,EAASyG,OAAS,EAAU,GAEtCzG,EACJvG,QAAO,SAACP,GAAK,OAAK+N,QAAQ/N,KAAWiO,EAAAA,EAAAA,IAAwBjO,EAAM,IACnEgG,KAAI,SAAChG,GAAK,MAAM,CACfkH,GAAIlH,EACJmH,QAAS,CACPnH,MAAAA,GAEH,GACL,CAiBOkO,CAAmBpH,KAAS,eAC9B,CAHE,IAAM4G,EAAG,KAIN1N,EAAQ0N,EAAIvG,QAASnH,MAAMmO,cAC5BN,EAAUO,IAAIpO,KACjB2N,EAAWU,KAAKX,GAChBG,EAAUS,IAAItO,GAElB,CAEA,OAAO2N,CACT,C","sources":["components/Highlight/Highlight.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageCard/constants.ts","components/PackageCard/testIds.ts","components/PackageCard/Details.tsx","components/PackageCard/EditorsNote.tsx","components/PackageCard/Heading.tsx","components/PackageCard/Highlight.tsx","components/PackageLanguages/PackageLanguages.tsx","components/PackageCard/Languages.tsx","components/PackageCard/Tags.tsx","components/PackageCard/WideCard.tsx","components/PackageCard/PackageCard.tsx","components/PackageTag/PackageTag.tsx","constants/pageInfo.ts","components/Page/Page.tsx","components/Time/Time.tsx","hooks/useConfigValue/useConfigValue.ts","hooks/useLanguage/useLanguage.ts","hooks/useQueryParams/useQueryParams.ts","util/package.ts"],"sourcesContent":["import { Stack, Image, Text, useColorModeValue } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\ninterface HighlightProps {\n label: string;\n color?: string;\n icon?: string;\n}\n\nexport const Highlight: FunctionComponent<HighlightProps> = ({\n label,\n color,\n icon,\n}: HighlightProps) => {\n const brightness = useColorModeValue(\"none\", \"brightness(1.75)\");\n return (\n <Stack align=\"center\" direction=\"row\" filter={brightness} spacing={2}>\n <Image alt={`${label} icon`} src={icon} w={4} />\n <Text color={color} fontWeight=\"bold\">\n {label}\n </Text>\n </Stack>\n );\n};\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<\n LanguageSupportTooltipProps\n> = ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n};\n","export enum PackageCardType {\n Wide = \"wide\",\n}\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"packageCard\", [\n \"author\",\n \"description\",\n \"downloads\",\n \"languages\",\n \"published\",\n \"title\",\n \"version\",\n \"comment\",\n \"wideContainer\",\n] as const);\n\nexport default testIds;\n","import { Text, Tooltip } from \"@chakra-ui/react\";\nimport { formatDistanceToNowStrict } from \"date-fns\";\nimport { FunctionComponent, ReactChild } from \"react\";\nimport { useStats } from \"../../hooks/useStats\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\nimport { Time } from \"../Time\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\ninterface DetailProps {\n \"data-testid\": string;\n tooltip?: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n tooltip,\n value,\n}) => (\n <Tooltip hasArrow isDisabled={!tooltip} label={tooltip} placement=\"left\">\n {/* zIndex required to allow tooltip to display due to card link overlay */}\n <Text data-testid={dataTestid} fontSize=\"xs\" zIndex={1}>\n {value}\n </Text>\n </Tooltip>\n);\n\nexport const Details: FunctionComponent = () => {\n const {\n author,\n metadata: { date },\n name,\n } = usePackageCard();\n\n const { data } = useStats();\n const downloads: number | undefined = data?.packages?.[name]?.downloads?.npm;\n\n const authorName = typeof author === \"string\" ? author : author.name;\n const publishDate = new Date(date);\n\n return (\n <>\n {downloads !== undefined && (\n <Detail\n data-testid={testIds.downloads}\n tooltip=\"Download numbers are periodically sourced from the npm registry\"\n value={`${downloads.toLocaleString()} weekly downloads`}\n />\n )}\n <Detail\n data-testid={testIds.published}\n value={\n <Time\n date={publishDate}\n fontSize=\"xs\"\n formattedDate={formatDistanceToNowStrict(publishDate, {\n addSuffix: true,\n })}\n />\n }\n />\n <Detail\n data-testid={testIds.author}\n value={\n <>\n By{\" \"}\n <NavLink\n color=\"link\"\n to={getSearchPath({\n query: authorName,\n })}\n >\n {authorName}\n </NavLink>\n </>\n }\n />\n </>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\n\nexport const EditorsNote: FunctionComponent<{ comment?: string }> = ({\n comment,\n}) => {\n return (\n <Text\n data-testid={testIds.comment}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n <Text as=\"span\" color=\"blue.500\" fontWeight=\"bold\">\n Editor&apos;s note:{\" \"}\n </Text>\n {comment}\n </Text>\n );\n};\n","import {\n Flex,\n Heading as ChakraHeading,\n LinkOverlay,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { CDKTypeBadge } from \"../CDKType\";\nimport { EditorsNote } from \"./EditorsNote\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\nexport const Heading: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n const {\n dataEvent,\n description,\n comment,\n constructFrameworks,\n name,\n version,\n } = usePackageCard();\n\n return (\n <>\n <LinkOverlay\n as={Link}\n data-event={\n dataEvent ? eventName(dataEvent, \"Package Card\", name) : undefined\n }\n to={getPackagePath({\n name,\n version,\n language: currentLanguage,\n })}\n >\n <Flex align=\"center\">\n <CDKTypeBadge\n constructFrameworks={constructFrameworks}\n mr={2}\n zIndex={1}\n />\n <ChakraHeading\n as=\"h3\"\n color=\"textPrimary\"\n data-testid={testIds.title}\n fontSize=\"md\"\n fontWeight=\"bold\"\n wordBreak=\"normal\"\n >\n {name}\n </ChakraHeading>\n </Flex>\n </LinkOverlay>\n {comment ? (\n <EditorsNote comment={comment} />\n ) : (\n <Text\n color=\"textPrimary\"\n data-testid={testIds.description}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n {description || \"No description available.\"}\n </Text>\n )}\n </>\n );\n};\n","import { Box } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { highlightsFrom } from \"../../util/package\";\nimport { Highlight as HighlightComponent } from \"../Highlight\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Highlight: FunctionComponent = () => {\n const { packageTags = [] } = usePackageCard()?.metadata ?? {};\n const [highlight] = highlightsFrom(packageTags);\n\n if (!highlight) return null;\n\n return (\n <Box fontSize=\"xs\">\n <HighlightComponent {...highlight} />\n </Box>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Language,\n LANGUAGES,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getPackagePath } from \"../../util/url\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nconst sizes = {\n sm: 5,\n md: 6,\n lg: 8,\n};\n\nexport interface PackageLanguagesProps {\n isRounded?: boolean;\n languages?: Partial<Record<Language, unknown>>;\n name: string;\n size?: \"sm\" | \"md\" | \"lg\";\n version: string;\n}\n\nexport const PackageLanguages: FunctionComponent<PackageLanguagesProps> = ({\n isRounded = false,\n languages,\n name: packageName,\n size = \"md\",\n version,\n}) => {\n const targets = Object.keys(languages ?? {}) as Language[];\n return (\n <>\n {Object.entries(LANGUAGE_RENDER_MAP)\n // Ensure entries are always sorted in a stable way\n .sort(\n ([left], [right]) =>\n LANGUAGES.indexOf(left as Language) -\n LANGUAGES.indexOf(right as Language)\n )\n .map(([lang, info]) => {\n const language = lang as Language;\n\n const isSupportedByLibrary =\n language === Language.TypeScript || targets.includes(language);\n\n const isSupportedByConstructHub =\n language === Language.TypeScript || // TypeScript is always supported\n // Otherwise, the language must be supported by ConstructHub\n TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (!isSupportedByLibrary) return null;\n\n const { name, icon: Icon } = info;\n\n const icon = (\n <Icon\n aria-label={`Supports ${name}`}\n borderRadius={isRounded ? \"50%\" : 0}\n h={sizes[size]}\n opacity={isSupportedByConstructHub ? 1 : 0.2}\n w={sizes[size]}\n />\n );\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n {isSupportedByConstructHub ? (\n <Link\n aria-label={`View package docs for ${language}`}\n to={getPackagePath({ name: packageName, version, language })}\n >\n {icon}\n </Link>\n ) : (\n icon\n )}\n </LanguageSupportTooltip>\n );\n })}\n </>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { PackageLanguages } from \"../PackageLanguages\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Languages: FunctionComponent = () => {\n const pkg = usePackageCard();\n return <PackageLanguages {...pkg} size=\"sm\" />;\n};\n","import { FunctionComponent } from \"react\";\nimport { tagObjectsFrom } from \"../../util/package\";\nimport { PackageTag } from \"../PackageTag\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Tags: FunctionComponent = () => {\n const {\n keywords = [],\n metadata: { packageTags = [] },\n } = usePackageCard();\n\n const tags = tagObjectsFrom({\n packageTags,\n keywords,\n });\n\n return (\n <>\n {tags.slice(0, 10).map(({ id, keyword: { label, color } = {} }) => (\n <PackageTag key={id} value={id} variant={color}>\n {label}\n </PackageTag>\n ))}\n </>\n );\n};\n","import { Flex, Grid, LinkBox, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Details } from \"./Details\";\nimport { Heading } from \"./Heading\";\nimport { Highlight } from \"./Highlight\";\nimport { Languages } from \"./Languages\";\nimport { Tags } from \"./Tags\";\nimport testIds from \"./testIds\";\n\nexport const WideCard: FunctionComponent = () => {\n return (\n <LinkBox\n _hover={{\n \"> article\": {\n bg: \"hoverPrimary\",\n },\n }}\n >\n <Grid\n as=\"article\"\n bg=\"bgSecondary\"\n border=\"base\"\n borderRadius=\"sm\"\n boxShadow=\"base\"\n color=\"textPrimary\"\n data-testid={testIds.wideContainer}\n h=\"full\"\n minH=\"12.5rem\"\n templateColumns={{ base: \"1fr\", lg: \"1fr 14rem\" }}\n w=\"full\"\n >\n {/* Top / Left side of card */}\n <Flex\n direction=\"column\"\n justify=\"space-between\"\n overflow=\"hidden\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={3}>\n <Heading />\n </Stack>\n\n <Flex align=\"center\" sx={{ gap: \"0.5rem\" }} wrap=\"wrap\">\n <Tags />\n </Flex>\n </Flex>\n\n {/* Bottom / Right side of card */}\n <Flex\n align={{ base: \"end\", lg: \"initial\" }}\n borderLeft={{ lg: \"base\" }}\n borderTop={{ base: \"base\", lg: \"none\" }}\n direction={{ base: \"row\", lg: \"column\" }}\n justify=\"space-between\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={1}>\n <Highlight />\n <Stack spacing={1}>\n <Details />\n </Stack>\n </Stack>\n\n <Stack data-testid={testIds.languages} direction=\"row\" spacing={2}>\n <Languages />\n </Stack>\n </Flex>\n </Grid>\n </LinkBox>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\nimport { PackageCardType } from \"./constants\";\nimport { WideCard } from \"./WideCard\";\n\nexport interface PackageCardProps {\n \"data-event\"?: string;\n pkg: ExtendedCatalogPackage;\n variant?: PackageCardType;\n}\n\ninterface PackageCardState extends ExtendedCatalogPackage {\n comment?: string;\n dataEvent?: string;\n}\n\nconst PackageCardContext = createContext<PackageCardState | null>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n \"data-event\": dataEvent,\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={{ ...pkg, dataEvent }}>\n {variant === PackageCardType.Wide && <WideCard />}\n </PackageCardContext.Provider>\n );\n};\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ keywords: [value] })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","export const pageInfo = {\n contribute: {\n event: {\n name: \"Contribute Load\",\n },\n },\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\n// Should be the same as the \"real\" CSP, except most things come from HTTP\n// instead of HTTPS (because it is protocol-relative, and the dev site is\n// served over plain HTTP).\nconst csp = [\n \"default-src 'self' 'unsafe-inline' http://*.awsstatic.com;\",\n \"connect-src 'self' https://*.shortbread.aws.dev http://*.shortbread.aws.dev http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"frame-src http://aws.demdex.net http://dpm.demdex.net;\",\n \"img-src 'self' https://* http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"object-src 'none';\",\n \"style-src 'self' 'unsafe-inline';\",\n].join(\" \");\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const feedUrls = useConfigValue(\"feeds\") || [];\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta content={csp} httpEquiv=\"Content-Security-Policy\" />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n {feedUrls.map(({ url, mimeType }) => (\n <link href={url} key={url} rel=\"alternate\" type={mimeType} />\n ))}\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport type TimeOptions = {\n date: Date;\n format?: string;\n formattedDate?: string;\n};\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, formattedDate, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {formattedDate ?? format(date, formatString ?? \"\")}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","import type { Config } from \"../../api/config\";\nimport { useConfig } from \"../../contexts/Config\";\n\nexport const useConfigValue = <T extends keyof Config>(key: T) => {\n const { data } = useConfig();\n return (data ?? {})[key];\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { PackageHighlight, PackageTagConfig } from \"../api/config\";\nimport { KEYWORD_IGNORE_LIST } from \"../constants/keywords\";\n\nexport interface TagObject extends PackageTagConfig {}\n\n/**\n * Reduces package tags to only return highlight tags\n */\nexport const highlightsFrom = (packageTags?: PackageTagConfig[]) => {\n if (!packageTags || packageTags.length < 1) return [];\n\n return packageTags.reduce(\n (accum: PackageHighlight[], tag: PackageTagConfig): PackageHighlight[] => {\n if (tag.highlight) {\n return [...accum, tag.highlight];\n }\n\n return accum;\n },\n []\n );\n};\n\n/**\n * Maps packageTags to an array of TagObjects, which can be rendered by the PackageTags Component\n */\nexport const mapPackageTags = (\n packageTags?: PackageTagConfig[]\n): TagObject[] => {\n return (packageTags ?? [])\n .filter((tag) => {\n return Boolean(tag.keyword?.label);\n })\n .map((tag) => ({\n ...tag,\n id: tag.keyword?.label!,\n }));\n};\n\n/**\n * Maps keywords to an array of TagObjects, which can be rendered by the PackageTags component\n */\nexport const mapPackageKeywords = (keywords?: string[]): TagObject[] => {\n if (!keywords || keywords.length < 1) return [];\n\n return keywords\n .filter((label) => Boolean(label) && !KEYWORD_IGNORE_LIST.has(label))\n .map((label) => ({\n id: label,\n keyword: {\n label,\n },\n }));\n};\n\n/**\n * Maps packageTags and keywords to a list of TagObjects, using mapPackageTags and mapPackageKeywords\n */\nexport const tagObjectsFrom = ({\n packageTags,\n keywords,\n}: {\n packageTags?: PackageTagConfig[];\n keywords?: string[];\n}): TagObject[] => {\n const tagObjects = new Array<TagObject>();\n const tagLabels = new Set<string>();\n\n for (const tag of [\n ...mapPackageTags(packageTags),\n ...mapPackageKeywords(keywords),\n ]) {\n const label = tag.keyword!.label.toLowerCase();\n if (!tagLabels.has(label)) {\n tagObjects.push(tag);\n tagLabels.add(label);\n }\n }\n\n return tagObjects;\n};\n"],"names":["Highlight","label","color","icon","brightness","useColorModeValue","align","direction","filter","spacing","alt","src","w","fontWeight","LanguageSupportTooltip","children","language","isSupported","TEMP_SUPPORTED_LANGUAGES","langName","LANGUAGE_NAME_MAP","message","hasArrow","placement","PackageCardType","createTestIds","Detail","dataTestid","tooltip","value","isDisabled","fontSize","zIndex","Details","usePackageCard","author","date","metadata","name","data","useStats","downloads","packages","npm","authorName","publishDate","Date","undefined","testIds","toLocaleString","Time","formattedDate","formatDistanceToNowStrict","addSuffix","NavLink","to","getSearchPath","query","EditorsNote","comment","lineHeight","noOfLines","as","Heading","useLanguage","currentLanguage","dataEvent","description","constructFrameworks","version","Link","eventName","getPackagePath","CDKType","mr","wordBreak","packageTags","highlightsFrom","highlight","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","sort","left","right","LANGUAGES","map","lang","info","isSupportedByLibrary","Language","includes","isSupportedByConstructHub","Icon","borderRadius","h","opacity","Languages","pkg","Tags","keywords","tags","tagObjectsFrom","slice","id","keyword","PackageTag","variant","WideCard","_hover","bg","border","boxShadow","minH","templateColumns","base","justify","overflow","p","sx","gap","wrap","borderLeft","borderTop","PackageCardContext","createContext","useContext","PackageCard","Wide","Provider","tagProps","textDecoration","pageInfo","contribute","event","home","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","join","meta","pageName","trackPageView","usePageView","useEffect","feedUrls","useConfigValue","suffix","title","formattedTitle","Helmet","process","content","charSet","url","mimeType","href","rel","type","property","forwardRef","ref","formatString","format","boxProps","dateTime","toISOString","displayName","key","useConfig","defaultLang","LOCAL_KEY","isValidLang","getInitialLang","langFromParams","storedLang","localStorage","getItem","options","updateUrl","updateSaved","useLocation","pathname","hash","useHistory","replace","params","useQueryParams","get","QUERY_PARAMS","useState","setLanguage","set","toString","update","useCallback","val","setItem","useMemo","URLSearchParams","length","reduce","accum","tag","tagObjects","Array","tagLabels","Set","Boolean","mapPackageTags","KEYWORD_IGNORE_LIST","mapPackageKeywords","toLowerCase","has","push","add"],"sourceRoot":""}