construct-hub-webapp 0.1.371 → 0.1.375

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.
Files changed (43) hide show
  1. package/.gitattributes +21 -20
  2. package/build/asset-manifest.json +36 -36
  3. package/build/index.html +1 -1
  4. package/build/static/js/{0.8e185e41.chunk.js → 0.1511b94c.chunk.js} +1 -1
  5. package/build/static/js/{0.8e185e41.chunk.js.map → 0.1511b94c.chunk.js.map} +1 -1
  6. package/build/static/js/{1.0bc0f9ef.chunk.js → 1.7f05dc1b.chunk.js} +1 -1
  7. package/build/static/js/{1.0bc0f9ef.chunk.js.map → 1.7f05dc1b.chunk.js.map} +1 -1
  8. package/build/static/js/{10.cb0a0ad5.chunk.js → 10.2f5864a2.chunk.js} +1 -1
  9. package/build/static/js/{10.cb0a0ad5.chunk.js.map → 10.2f5864a2.chunk.js.map} +1 -1
  10. package/build/static/js/{11.5c18c5b8.chunk.js → 11.dc2f1de7.chunk.js} +1 -1
  11. package/build/static/js/{11.5c18c5b8.chunk.js.map → 11.dc2f1de7.chunk.js.map} +1 -1
  12. package/build/static/js/{12.6e403af3.chunk.js → 12.288fe983.chunk.js} +1 -1
  13. package/build/static/js/{12.6e403af3.chunk.js.map → 12.288fe983.chunk.js.map} +1 -1
  14. package/build/static/js/{13.a62ee528.chunk.js → 13.2ec99b1d.chunk.js} +2 -2
  15. package/build/static/js/{13.a62ee528.chunk.js.LICENSE.txt → 13.2ec99b1d.chunk.js.LICENSE.txt} +0 -0
  16. package/build/static/js/{13.a62ee528.chunk.js.map → 13.2ec99b1d.chunk.js.map} +1 -1
  17. package/build/static/js/{14.ab599924.chunk.js → 14.6308c024.chunk.js} +1 -1
  18. package/build/static/js/{14.ab599924.chunk.js.map → 14.6308c024.chunk.js.map} +1 -1
  19. package/build/static/js/{4.b0942e16.chunk.js → 4.85b3922a.chunk.js} +2 -2
  20. package/build/static/js/{4.b0942e16.chunk.js.LICENSE.txt → 4.85b3922a.chunk.js.LICENSE.txt} +0 -0
  21. package/build/static/js/{4.b0942e16.chunk.js.map → 4.85b3922a.chunk.js.map} +1 -1
  22. package/build/static/js/5.8ebb41a9.chunk.js +3 -0
  23. package/build/static/js/{5.63dc612f.chunk.js.LICENSE.txt → 5.8ebb41a9.chunk.js.LICENSE.txt} +0 -0
  24. package/build/static/js/5.8ebb41a9.chunk.js.map +1 -0
  25. package/build/static/js/{6.c84cea8e.chunk.js → 6.a2d54ede.chunk.js} +2 -2
  26. package/build/static/js/6.a2d54ede.chunk.js.map +1 -0
  27. package/build/static/js/{7.b1387400.chunk.js → 7.f4b14571.chunk.js} +2 -2
  28. package/build/static/js/7.f4b14571.chunk.js.map +1 -0
  29. package/build/static/js/{8.49001644.chunk.js → 8.90bc7c73.chunk.js} +2 -2
  30. package/build/static/js/8.90bc7c73.chunk.js.map +1 -0
  31. package/build/static/js/{9.be60d9a6.chunk.js → 9.4830c70a.chunk.js} +1 -1
  32. package/build/static/js/{9.be60d9a6.chunk.js.map → 9.4830c70a.chunk.js.map} +1 -1
  33. package/build/static/js/{main.d9f8442b.chunk.js → main.090a0a75.chunk.js} +2 -2
  34. package/build/static/js/main.090a0a75.chunk.js.map +1 -0
  35. package/build/static/js/{runtime-main.500a853b.js → runtime-main.240313c1.js} +2 -2
  36. package/build/static/js/{runtime-main.500a853b.js.map → runtime-main.240313c1.js.map} +1 -1
  37. package/package.json +10 -10
  38. package/build/static/js/5.63dc612f.chunk.js +0 -3
  39. package/build/static/js/5.63dc612f.chunk.js.map +0 -1
  40. package/build/static/js/6.c84cea8e.chunk.js.map +0 -1
  41. package/build/static/js/7.b1387400.chunk.js.map +0 -1
  42. package/build/static/js/8.49001644.chunk.js.map +0 -1
  43. package/build/static/js/main.d9f8442b.chunk.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","hooks/useQueryParams/useQueryParams.ts","api/package/util.ts","hooks/useLanguage/useLanguage.ts","util/css.ts","components/PackageCard/constants.ts","components/PackageCard/testIds.ts","components/PackageCard/Details.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","hooks/useConfigValue/useConfigValue.ts","components/Time/Time.tsx","components/PackageTag/PackageTag.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","../../../src/link-box.tsx","../../../src/use-tabs.ts","../../../src/tabs.tsx","views/Home/constants.ts","views/Home/testIds.ts","views/Home/PackageGrid.tsx","views/Home/CDKTypeTabs.tsx","hooks/useHistoryState/useHistoryState.ts","views/Home/Featured.tsx","views/Home/useSection.ts","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js","views/Home/GradientContainer.tsx","views/Home/Hero.tsx","views/Home/InfoSection.tsx","views/Home/Info.tsx","views/Home/Home.tsx"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","useQueryParams","useLocation","useMemo","URLSearchParams","getFullPackageName","scope","getAssetsPath","version","prefix","API_PATHS","PACKAGES_PREFIX","body","sanitizeVersion","ver","sanitized","startsWith","substring","extractMajor","split","findPackage","catalog","pkg","packages","filter","p","length","sort","p1","p2","mv1","localeCompare","defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","has","getInitialLang","langFromParams","storedLang","localStorage","getItem","useLanguage","options","updateUrl","updateSaved","pathname","hash","useHistory","replace","params","get","QUERY_PARAMS","LANGUAGE","useState","language","setLanguage","set","toString","update","useCallback","val","setItem","makeGridAreas","rows","map","row","col","join","PackageCardType","testIds","createTestIds","Detail","dataTestid","icon","label","tooltip","value","hasArrow","isDisabled","placement","fontSize","zIndex","Details","usePackageCard","author","date","metadata","data","useStats","downloads","npm","authorName","undefined","toLocaleString","published","Time","Date","format","NavLink","color","to","getSearchPath","query","Heading","currentLanguage","comment","constructFramework","cdkType","cdkVersion","majorVersion","as","Link","getPackagePath","align","CDKType","mr","fontWeight","wordBreak","lineHeight","noOfLines","Highlight","direction","spacing","alt","src","w","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","left","right","LANGUAGES","indexOf","info","isSupportedByLibrary","includes","isSupportedByConstructHub","Icon","borderRadius","h","opacity","LanguageSupportTooltip","Languages","Tags","keywords","packageTags","tags","tag","Boolean","keyword","t","isKeyword","KEYWORD_IGNORE_LIST","id","slice","PackageTag","variant","GRID_AREA","gridAreasMd","gridAreasMobile","WideCard","highlights","reduce","accum","highlight","_hover","bg","autoColumns","autoRows","border","boxShadow","wideContainer","gap","templateAreas","base","gridArea","display","maxH","overflow","alignItems","alignSelf","templateColumns","templateRows","PackageCardContext","createContext","useContext","PackageCard","Wide","Provider","useConfigValue","key","useConfig","forwardRef","ref","formatString","boxProps","dateTime","toISOString","displayName","tagProps","prop","textDecoration","isSupported","langName","LANGUAGE_NAME_MAP","message","LinkOverlay","className","cx","rel","isExternal","target","__css","position","cursor","top","width","height","LinkBox","createDescendantContext","errorMessage","makeTabId","makeTabPanelId","Tabs","styles","useMultiStyleConfig","omitThemingProps","props","lazyBehavior","orientation","React","defaultIndex","useControllableState","defaultValue","onChange","index","setFocusedIndex","descendants","useTabsDescendants","useId","selectedIndex","focusedIndex","setSelectedIndex","isManual","isLazy","htmlProps","useTabs","context","rootProps","omit","root","Tab","useStyles","tabProps","isFocusable","useTabsContext","useTabsDescendant","disabled","register","isSelected","clickableProps","useClickable","mergeRefs","onClick","callAllHandlers","role","tabIndex","type","onFocus","useTab","tabStyles","outline","justifyContent","TabList","tablistProps","useTabsDescendantsContext","onKeyDown","nextTab","next","focus","prevTab","prev","isHorizontal","isVertical","eventKey","normalizeEventKey","ArrowStart","ArrowEnd","action","first","last","useTabList","tablistStyles","TabPanel","panelProps","hasBeenSelected","determineLazyBehavior","hidden","useTabPanel","tabpanel","TabPanels","panelsProps","getValidChildren","useTabPanels","tabpanels","TabIndicator","indicatorStyle","useSafeLayoutEffect","isUndefined","tab","setRect","offsetWidth","offsetHeight","requestAnimationFrame","setHasMeasured","cancelAnimationFrame","transitionProperty","transitionDuration","hasMeasured","transitionTimingFunction","useTabIndicator","style","indicator","SECTION_PADDING","X","Y","PackageGrid","packageGrid","mt","PackageTab","cdkTypeTab","CDKTYPE_RENDER_MAP","results","PackageTabPanel","cdkTypeGrid","justify","cdkTypeSeeAllButton","window","scrollTo","CatalogSearchSort","DownloadsDesc","PublishDateDesc","colorScheme","my","CDKTypeTabs","anyCDKType","useCatalogResults","limit","awscdk","cdk8s","cdktf","initialValue","history","location","state","rawState","rawSetState","useHistoryState","setTabIndex","cdkTypeSection","px","py","cdkTypeSectionHeading","mb","cdkTypeSectionDescription","maxW","minH","Featured","homePackages","DEFAULT_FEATURED_PACKAGES","sections","featured","showLastUpdated","section","showPackages","useCatalog","loading","error","useSection","featuredContainer","featuredHeader","featuredGrid","strings","raw","animation","keyframes","freeze","defineProperties","GradientContainer","bgSize","Hero","textAlign","heroHeader","heroSubtitle","mx","SearchBar","hasButton","InfoSection","infoSection","infoSectionHeading","infoSectionDescription","Info","infoContainer","pt","wrap","cdktype","imgsrc","infoSectionIcon","Home","Flex","DevPreviewBanner"],"mappings":"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","file":"static/js/6.c84cea8e.chunk.js","sourcesContent":["export const pageInfo = {\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\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\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 { 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\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\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 { 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 { API_PATHS } from \"../../constants/url\";\nimport { CatalogPackage, Packages } from \"./packages\";\n\nexport const getFullPackageName = (name: string, scope?: string) => {\n return scope ? `${scope}/${name}` : name;\n};\n\nexport const getAssetsPath = (\n name: string,\n version: string,\n scope?: string\n) => {\n const prefix = `${API_PATHS.PACKAGES_PREFIX}/`;\n const body = getFullPackageName(name, scope);\n const suffix = `/v${version}`;\n return `${prefix}${body}${suffix}`;\n};\n\nexport const sanitizeVersion = (ver: string) => {\n let sanitized = ver;\n if (sanitized.startsWith(\"~\") || sanitized.startsWith(\"^\")) {\n sanitized = sanitized.substring(1);\n }\n return sanitized;\n};\n\nconst extractMajor = (ver: string) => {\n let sanitized = sanitizeVersion(ver);\n return sanitized.split(\".\")[0];\n};\n\nexport const findPackage = (\n catalog: Packages,\n pkg: string\n): CatalogPackage | undefined => {\n const packages = catalog.packages.filter((p) => p.name === pkg);\n\n if (packages.length > 1) {\n return packages.sort((p1, p2) => {\n const mv1 = extractMajor(p1.version);\n const mv2 = extractMajor(p2.version);\n return mv2.localeCompare(mv1);\n })[0];\n }\n\n return packages[0];\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","/**\n * @fileoverview CSS Related Utils\n */\n\n/**\n * Translates a series of grid row definitions into a grid area string\n * ```ts\n * const gridAreas = makeGridAreas(\n * [\"header\", \"header\", \"header\"],\n * [\"aside\", \"main\", \"main\"],\n * [\"aside\", \"footer\", \"footer\"]\n * ); // `\"header header header\" \"aside main main\" \"aside footer footer\"`\n *\n * const withBlank = makeGridAreas(\n * [\"header\", null, \"main\"]\n * ); // `\"header . main\"`\n * ```\n */\nexport const makeGridAreas = (...rows: (string | null)[][]): string => {\n return rows\n .map((row) => `\"${row.map((col) => col ?? \".\").join(\" \")}\"`)\n .join(\" \");\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 { DownloadIcon } from \"@chakra-ui/icons\";\nimport { Text, Tooltip } from \"@chakra-ui/react\";\nimport { FunctionComponent, ReactChild } from \"react\";\nimport { useStats } from \"../../contexts/Stats\";\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 icon?: ReactChild;\n tooltip?: string;\n label: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n icon,\n label,\n tooltip,\n value,\n}) => (\n <Tooltip hasArrow isDisabled={!tooltip} label={tooltip} placement=\"auto\">\n {/* zIndex required to allow tooltip to display due to card link overlay */}\n <Text data-testid={dataTestid} fontSize=\"xs\" zIndex={1}>\n {icon}\n {icon ? \" \" : \"\"}\n <strong>{label}</strong> {value}\n </Text>\n </Tooltip>\n);\n\nexport const Details: FunctionComponent = () => {\n const {\n author,\n metadata: { date },\n version,\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\n return (\n <>\n {downloads !== undefined && downloads >= 10 ? (\n <Detail\n data-testid={testIds.downloads}\n icon={<DownloadIcon />}\n label={downloads.toLocaleString()}\n tooltip=\"Download numbers are periodically sourced from the NPM registry\"\n value={\"Weekly downloads\"}\n />\n ) : (\n <Detail data-testid={testIds.version} label=\"Version\" value={version} />\n )}\n <Detail\n data-testid={testIds.published}\n label=\"Published\"\n value={\n <Time date={new Date(date)} fontSize=\"xs\" format=\"MMM dd, yyyy\" />\n }\n />\n <Detail\n data-testid={testIds.author}\n label=\"Author\"\n value={\n <NavLink\n color=\"blue.500\"\n to={getSearchPath({\n query: authorName,\n })}\n >\n {authorName}\n </NavLink>\n }\n />\n </>\n );\n};\n","import {\n Flex,\n Heading as ChakraHeading,\n LinkOverlay,\n Text,\n Tooltip,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { CDKTypeIcon, CDKTypeText } from \"../CDKType\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\nexport const Heading: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n const {\n comment,\n description,\n metadata: { constructFramework },\n name,\n version,\n } = usePackageCard();\n\n const cdkType = constructFramework?.name;\n const cdkVersion = constructFramework?.majorVersion;\n\n return (\n <>\n <LinkOverlay\n as={Link}\n to={getPackagePath({\n name,\n version,\n language: currentLanguage,\n })}\n >\n <Flex align=\"center\">\n {cdkType && (\n <Tooltip\n hasArrow\n label={<CDKTypeText majorVersion={cdkVersion} name={cdkType} />}\n placement=\"top\"\n >\n <CDKTypeIcon mr={2} name={cdkType} zIndex={1} />\n </Tooltip>\n )}\n <ChakraHeading\n as=\"h3\"\n color=\"blue.800\"\n data-testid={testIds.title}\n fontSize=\"md\"\n fontWeight=\"bold\"\n wordBreak=\"break-all\"\n >\n {name}\n </ChakraHeading>\n </Flex>\n </LinkOverlay>\n <Text\n color=\"blue.800\"\n data-testid={testIds.description}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n {description || \"No description available.\"}\n </Text>\n {comment && (\n <Text\n data-testid={testIds.comment}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n <Text\n as=\"span\"\n color=\"blue.500\"\n fontSize=\"md\"\n fontWeight=\"bold\"\n lineHeight=\"tall\"\n >\n Editor&apos;s note:{\" \"}\n </Text>\n {comment}\n </Text>\n )}\n </>\n );\n};\n","import { Stack, Image, Text } 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 return (\n <Stack align=\"center\" direction=\"row\" 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 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 { PackageTagConfig } from \"../../api/config\";\nimport { KEYWORD_IGNORE_LIST } from \"../../constants/keywords\";\nimport { PackageTag } from \"../PackageTag\";\nimport { usePackageCard } from \"./PackageCard\";\n\ninterface TagObject extends PackageTagConfig {\n isKeyword?: boolean;\n}\n\nexport const Tags: FunctionComponent = () => {\n const {\n keywords = [],\n metadata: { packageTags = [] },\n } = usePackageCard();\n\n const tags: TagObject[] = [\n ...packageTags\n .filter((tag) => Boolean(tag.keyword))\n .map((t) => ({ ...t, isKeyword: false })),\n\n ...keywords\n .filter((label) => Boolean(label) && !KEYWORD_IGNORE_LIST.has(label))\n .map((label) => ({\n id: label,\n isKeyword: true,\n keyword: {\n label,\n },\n })),\n ];\n return (\n <>\n {tags\n .slice(0, 3)\n .map(({ id, isKeyword, keyword: { label, color } = {} }) => (\n <PackageTag isKeyword={isKeyword} key={id} value={id} variant={color}>\n {label}\n </PackageTag>\n ))}\n </>\n );\n};\n","import { Grid, Stack, LinkBox, Divider } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { PackageTagConfig, PackageHighlight } from \"../../api/config\";\nimport { makeGridAreas } from \"../../util/css\";\nimport { Details } from \"./Details\";\nimport { Heading } from \"./Heading\";\nimport { Highlight } from \"./Highlight\";\nimport { Languages } from \"./Languages\";\nimport { usePackageCard } from \"./PackageCard\";\nimport { Tags } from \"./Tags\";\nimport testIds from \"./testIds\";\n\nconst GRID_AREA = {\n DETAILS: \"details\",\n LANGUAGES: \"languages\",\n TAGS: \"tags\",\n HEADING: \"heading\",\n};\n\nconst gridAreasMd = makeGridAreas(\n [GRID_AREA.HEADING, GRID_AREA.HEADING, GRID_AREA.DETAILS],\n [GRID_AREA.HEADING, GRID_AREA.HEADING, GRID_AREA.DETAILS],\n [GRID_AREA.TAGS, GRID_AREA.TAGS, GRID_AREA.LANGUAGES]\n);\n\nconst gridAreasMobile = makeGridAreas(\n [GRID_AREA.HEADING],\n [GRID_AREA.LANGUAGES],\n [GRID_AREA.DETAILS]\n);\n\nexport const WideCard: FunctionComponent = () => {\n const highlights =\n usePackageCard()?.metadata?.packageTags?.reduce(\n (\n accum: PackageHighlight[],\n tag: PackageTagConfig\n ): PackageHighlight[] => {\n if (tag.highlight) {\n return [...accum, tag.highlight];\n }\n return accum;\n },\n []\n ) ?? [];\n\n return (\n <LinkBox\n _hover={{\n \"> article\": {\n bg: \"gray.50\",\n },\n }}\n >\n <Grid\n as=\"article\"\n autoColumns=\"1fr\"\n autoRows=\"auto\"\n bg=\"white\"\n border=\"base\"\n borderRadius=\"sm\"\n boxShadow=\"base\"\n color=\"gray.600\"\n data-testid={testIds.wideContainer}\n gap={5}\n h=\"100%\"\n p={5}\n templateAreas={{ base: gridAreasMobile, md: gridAreasMd }}\n w=\"100%\"\n >\n {/* Name + Desc */}\n <Stack gridArea={GRID_AREA.HEADING} spacing={2}>\n <Heading />\n </Stack>\n\n <Stack\n direction=\"row\"\n display={{ base: \"none\", md: \"initial\" }}\n gridArea={GRID_AREA.TAGS}\n maxH={6}\n overflow=\"hidden\"\n spacing={2}\n >\n <Tags />\n </Stack>\n\n <Grid\n alignItems=\"start\"\n alignSelf=\"center\"\n autoColumns={{ base: \"initial\", md: \"1fr\" }}\n autoRows={{ base: \"initial\", md: \"auto\" }}\n fontSize=\"xs\"\n gap={{ base: 0, md: 1 }}\n gridArea={GRID_AREA.DETAILS}\n templateColumns={{ base: \"1fr 1fr\", md: \"initial\" }}\n templateRows={{ base: \"1fr 1fr\", md: \"initial\" }}\n >\n {highlights.map((highlight) => (\n <Highlight key={highlight.label} {...highlight} />\n ))}\n <Details />\n </Grid>\n\n <Stack gridArea={GRID_AREA.LANGUAGES} spacing={{ base: 4, md: 0 }}>\n <Divider display={{ md: \"none\" }} />\n <Stack data-testid={testIds.languages} direction=\"row\" spacing={2}>\n <Languages />\n </Stack>\n </Stack>\n </Grid>\n </LinkBox>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"./constants\";\nimport { WideCard } from \"./WideCard\";\n\nexport interface PackageCardProps {\n pkg: CatalogPackage;\n variant?: PackageCardType;\n}\n\nconst PackageCardContext = createContext<\n (CatalogPackage & { comment?: string }) | null\n>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={pkg}>\n {variant === PackageCardType.Wide && <WideCard />}\n </PackageCardContext.Provider>\n );\n};\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 { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport interface TimeOptions {\n date: Date;\n format: string;\n}\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {format(date, formatString)}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\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 isKeyword?: boolean;\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n isKeyword = false,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n const prop = isKeyword ? \"keywords\" : \"tags\";\n\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ [prop]: [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","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<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","import { chakra, forwardRef, HTMLChakraProps } from \"@chakra-ui/system\"\nimport { cx } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\nexport interface LinkOverlayProps extends HTMLChakraProps<\"a\"> {\n /**\n * If `true`, the link will open in new tab\n */\n isExternal?: boolean\n}\n\nexport const LinkOverlay = forwardRef<LinkOverlayProps, \"a\">((props, ref) => {\n const { isExternal, target, rel, className, ...rest } = props\n return (\n <chakra.a\n {...rest}\n ref={ref}\n className={cx(\"chakra-linkbox__overlay\", className)}\n rel={isExternal ? \"noopener noreferrer\" : rel}\n target={isExternal ? \"_blank\" : target}\n __css={{\n position: \"static\",\n \"&::before\": {\n content: \"''\",\n cursor: \"inherit\",\n display: \"block\",\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 0,\n width: \"100%\",\n height: \"100%\",\n },\n }}\n />\n )\n})\n\nexport interface LinkBoxProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * `LinkBox` is used to wrap content areas within a link while ensuring semantic html\n *\n * @see Docs https://chakra-ui.com/docs/navigation/link-overlay\n * @see Resources https://www.sarasoueidan.com/blog/nested-links\n */\nexport const LinkBox = forwardRef<LinkBoxProps, \"div\">((props, ref) => {\n const { className, ...rest } = props\n\n return (\n <chakra.div\n ref={ref}\n position=\"relative\"\n {...rest}\n className={cx(\"chakra-linkbox\", className)}\n __css={{\n /* Elevate the links and abbreviations up */\n \"a[href]:not(.chakra-linkbox__overlay), abbr[title]\": {\n position: \"relative\",\n zIndex: 1,\n },\n }}\n />\n )\n})\n","import { useClickable, UseClickableProps } from \"@chakra-ui/clickable\"\nimport { createDescendantContext } from \"@chakra-ui/descendant\"\nimport {\n useControllableState,\n useId,\n useSafeLayoutEffect,\n} from \"@chakra-ui/hooks\"\nimport {\n createContext,\n EventKeyMap,\n getValidChildren,\n mergeRefs,\n} from \"@chakra-ui/react-utils\"\nimport {\n callAllHandlers,\n determineLazyBehavior,\n Dict,\n focus,\n isUndefined,\n LazyBehavior,\n normalizeEventKey,\n} from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\n/* -------------------------------------------------------------------------------------------------\n * Create context to track descendants and their indices\n * -----------------------------------------------------------------------------------------------*/\n\nexport const [\n TabsDescendantsProvider,\n useTabsDescendantsContext,\n useTabsDescendants,\n useTabsDescendant,\n] = createDescendantContext<HTMLButtonElement>()\n\n/* -------------------------------------------------------------------------------------------------\n * useTabs - The root react hook that manages all tab items\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface UseTabsProps {\n /**\n * The orientation of the tab list.\n */\n orientation?: \"vertical\" | \"horizontal\"\n /**\n * If `true`, the tabs will be manually activated and\n * display its panel by pressing Space or Enter.\n *\n * If `false`, the tabs will be automatically activated\n * and their panel is displayed when they receive focus.\n */\n isManual?: boolean\n /**\n * Callback when the index (controlled or un-controlled) changes.\n */\n onChange?: (index: number) => void\n /**\n * The index of the selected tab (in controlled mode)\n */\n index?: number\n /**\n * The initial index of the selected tab (in uncontrolled mode)\n */\n defaultIndex?: number\n /**\n * The id of the tab\n */\n id?: string\n /**\n * Performance 🚀:\n * If `true`, rendering of the tab panel's will be deferred until it is selected.\n */\n isLazy?: boolean\n /**\n * Performance 🚀:\n * The lazy behavior of tab panels' content when not active.\n * Only works when `isLazy={true}`\n *\n * - \"unmount\": The content of inactive tab panels are always unmounted.\n * - \"keepMounted\": The content of inactive tab panels is initially unmounted,\n * but stays mounted when selected.\n *\n * @default \"unmount\"\n */\n lazyBehavior?: LazyBehavior\n /**\n * The writing mode direction.\n *\n * - When in RTL, the left and right navigation is flipped\n */\n direction?: \"rtl\" | \"ltr\"\n}\n\n/**\n * Tabs hooks that provides all the states, and accessibility\n * helpers to keep all things working properly.\n *\n * Its returned object will be passed unto a Context Provider\n * so all child components can read from it.\n * There is no document link yet\n * @see Docs https://chakra-ui.com/docs/components/useTabs\n */\nexport function useTabs(props: UseTabsProps) {\n const {\n defaultIndex,\n onChange,\n index,\n isManual,\n isLazy,\n lazyBehavior = \"unmount\",\n orientation = \"horizontal\",\n direction = \"ltr\",\n ...htmlProps\n } = props\n\n /**\n * We use this to keep track of the index of the focused tab.\n *\n * Tabs can be automatically activated, this means selection follows focus.\n * When we navigate with the arrow keys, we move focus and selection to next/prev tab\n *\n * Tabs can also be manually activated, this means selection does not follow focus.\n * When we navigate with the arrow keys, we only move focus NOT selection. The user\n * will need not manually activate the tab using `Enter` or `Space`.\n *\n * This is why we need to keep track of the `focusedIndex` and `selectedIndex`\n */\n const [focusedIndex, setFocusedIndex] = React.useState(defaultIndex ?? 0)\n\n const [selectedIndex, setSelectedIndex] = useControllableState({\n defaultValue: defaultIndex ?? 0,\n value: index,\n onChange,\n })\n\n /**\n * Sync focused `index` with controlled `selectedIndex` (which is the `props.index`)\n */\n React.useEffect(() => {\n if (index != null) {\n setFocusedIndex(index)\n }\n }, [index])\n\n /**\n * Think of `useDescendants` as a register for the tab nodes.\n */\n const descendants = useTabsDescendants()\n\n /**\n * Generate a unique id or use user-provided id for the tabs widget\n */\n const id = useId(props.id, `tabs`)\n\n return {\n id,\n selectedIndex,\n focusedIndex,\n setSelectedIndex,\n setFocusedIndex,\n isManual,\n isLazy,\n lazyBehavior,\n orientation,\n descendants,\n direction,\n htmlProps,\n }\n}\n\nexport type UseTabsReturn = Omit<\n ReturnType<typeof useTabs>,\n \"htmlProps\" | \"descendants\"\n>\n\nexport const [TabsProvider, useTabsContext] = createContext<UseTabsReturn>({\n name: \"TabsContext\",\n errorMessage:\n \"useTabsContext: `context` is undefined. Seems you forgot to wrap all tabs components within <Tabs />\",\n})\n\ntype Child = React.ReactElement<any>\n\nexport interface UseTabListProps {\n children?: React.ReactNode\n onKeyDown?: React.KeyboardEventHandler\n ref?: React.Ref<any>\n}\n\n/**\n * Tabs hook to manage multiple tab buttons,\n * and ensures only one tab is selected per time.\n *\n * @param props props object for the tablist\n */\nexport function useTabList<P extends UseTabListProps>(props: P) {\n const { focusedIndex, orientation, direction } = useTabsContext()\n\n const descendants = useTabsDescendantsContext()\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n const nextTab = () => {\n const next = descendants.nextEnabled(focusedIndex)\n if (next) focus(next.node)\n }\n const prevTab = () => {\n const prev = descendants.prevEnabled(focusedIndex)\n if (prev) focus(prev.node)\n }\n const firstTab = () => {\n const first = descendants.firstEnabled()\n if (first) focus(first.node)\n }\n const lastTab = () => {\n const last = descendants.lastEnabled()\n if (last) focus(last.node)\n }\n\n const isHorizontal = orientation === \"horizontal\"\n const isVertical = orientation === \"vertical\"\n\n const eventKey = normalizeEventKey(event)\n\n const ArrowStart = direction === \"ltr\" ? \"ArrowLeft\" : \"ArrowRight\"\n const ArrowEnd = direction === \"ltr\" ? \"ArrowRight\" : \"ArrowLeft\"\n\n const keyMap: EventKeyMap = {\n [ArrowStart]: () => isHorizontal && prevTab(),\n [ArrowEnd]: () => isHorizontal && nextTab(),\n ArrowDown: () => isVertical && nextTab(),\n ArrowUp: () => isVertical && prevTab(),\n Home: firstTab,\n End: lastTab,\n }\n\n const action = keyMap[eventKey]\n\n if (action) {\n event.preventDefault()\n action(event)\n }\n },\n [descendants, focusedIndex, orientation, direction],\n )\n\n return {\n ...props,\n role: \"tablist\",\n \"aria-orientation\": orientation,\n onKeyDown: callAllHandlers(props.onKeyDown, onKeyDown),\n }\n}\n\nexport type UseTabListReturn = ReturnType<typeof useTabList>\n\nexport interface UseTabOptions {\n id?: string\n isSelected?: boolean\n panelId?: string\n /**\n * If `true`, the `Tab` won't be toggleable\n */\n isDisabled?: boolean\n}\n\nexport interface UseTabProps\n extends Omit<UseClickableProps, \"color\">,\n UseTabOptions {}\n\n/**\n * Tabs hook to manage each tab button.\n *\n * A tab can be disabled and focusable, or both,\n * hence the use of `useClickable` to handle this scenario\n */\nexport function useTab<P extends UseTabProps>(props: P) {\n const { isDisabled, isFocusable, ...htmlProps } = props\n\n const {\n setSelectedIndex,\n isManual,\n id,\n setFocusedIndex,\n selectedIndex,\n } = useTabsContext()\n\n const { index, register } = useTabsDescendant({\n disabled: isDisabled && !isFocusable,\n })\n\n const isSelected = index === selectedIndex\n\n const onClick = () => {\n setSelectedIndex(index)\n }\n\n const onFocus = () => {\n setFocusedIndex(index)\n const isDisabledButFocusable = isDisabled && isFocusable\n const shouldSelect = !isManual && !isDisabledButFocusable\n if (shouldSelect) {\n setSelectedIndex(index)\n }\n }\n\n const clickableProps = useClickable({\n ...htmlProps,\n ref: mergeRefs(register, props.ref),\n isDisabled,\n isFocusable,\n onClick: callAllHandlers(props.onClick, onClick),\n })\n\n const type: \"button\" | \"submit\" | \"reset\" = \"button\"\n\n return {\n ...clickableProps,\n id: makeTabId(id, index),\n role: \"tab\",\n tabIndex: isSelected ? 0 : -1,\n type,\n \"aria-selected\": isSelected,\n \"aria-controls\": makeTabPanelId(id, index),\n onFocus: isDisabled ? undefined : callAllHandlers(props.onFocus, onFocus),\n }\n}\n\nexport interface UseTabPanelsProps {\n children?: React.ReactNode\n}\n\n/**\n * Tabs hook for managing the visibility of multiple tab panels.\n *\n * Since only one panel can be show at a time, we use `cloneElement`\n * to inject `selected` panel to each TabPanel.\n *\n * It returns a cloned version of its children with\n * all functionality included.\n */\nexport function useTabPanels<P extends UseTabPanelsProps>(props: P) {\n const context = useTabsContext()\n\n const { id, selectedIndex } = context\n\n const validChildren = getValidChildren(props.children)\n\n const children = validChildren.map((child, index) =>\n React.cloneElement(child as Child, {\n isSelected: index === selectedIndex,\n id: makeTabPanelId(id, index),\n // Refers to the associated tab element, and also provides an accessible name to the tab panel.\n \"aria-labelledby\": makeTabId(id, index),\n }),\n )\n\n return { ...props, children }\n}\n\n/**\n * Tabs hook for managing the visible/hidden states\n * of the tab panel.\n *\n * @param props props object for the tab panel\n */\nexport function useTabPanel(props: Dict) {\n const { isSelected, id, children, ...htmlProps } = props\n const { isLazy, lazyBehavior } = useTabsContext()\n\n const hasBeenSelected = React.useRef(false)\n if (isSelected) {\n hasBeenSelected.current = true\n }\n\n const shouldRenderChildren = determineLazyBehavior({\n hasBeenSelected: hasBeenSelected.current,\n isSelected,\n isLazy,\n lazyBehavior,\n })\n\n return {\n // Puts the tabpanel in the page `Tab` sequence.\n tabIndex: 0,\n ...htmlProps,\n children: shouldRenderChildren ? children : null,\n role: \"tabpanel\",\n hidden: !isSelected,\n id,\n }\n}\n\n/**\n * Tabs hook to show an animated indicators that\n * follows the active tab.\n *\n * The way we do it is by measuring the DOM Rect (or dimensions)\n * of the active tab, and return that as CSS style for\n * the indicator.\n */\nexport function useTabIndicator(): React.CSSProperties {\n const context = useTabsContext()\n const descendants = useTabsDescendantsContext()\n\n const { selectedIndex, orientation } = context\n\n const isHorizontal = orientation === \"horizontal\"\n const isVertical = orientation === \"vertical\"\n\n // Get the clientRect of the selected tab\n const [rect, setRect] = React.useState(() => {\n if (isHorizontal) return { left: 0, width: 0 }\n if (isVertical) return { top: 0, height: 0 }\n return undefined\n })\n\n const [hasMeasured, setHasMeasured] = React.useState(false)\n\n // Update the selected tab rect when the selectedIndex changes\n useSafeLayoutEffect(() => {\n if (isUndefined(selectedIndex)) return undefined\n\n const tab = descendants.item(selectedIndex)\n if (isUndefined(tab)) return undefined\n\n // Horizontal Tab: Calculate width and left distance\n if (isHorizontal) {\n setRect({ left: tab.node.offsetLeft, width: tab.node.offsetWidth })\n }\n\n // Vertical Tab: Calculate height and top distance\n if (isVertical) {\n setRect({ top: tab.node.offsetTop, height: tab.node.offsetHeight })\n }\n\n // Prevent unwanted transition from 0 to measured rect\n // by setting the measured state in the next tick\n const id = requestAnimationFrame(() => {\n setHasMeasured(true)\n })\n\n return () => {\n if (id) {\n cancelAnimationFrame(id)\n }\n }\n }, [selectedIndex, isHorizontal, isVertical, descendants])\n\n return {\n position: \"absolute\",\n transitionProperty: \"left, right, top, bottom\",\n transitionDuration: hasMeasured ? \"200ms\" : \"0ms\",\n transitionTimingFunction: \"cubic-bezier(0, 0, 0.2, 1)\",\n ...rect,\n }\n}\n\nfunction makeTabId(id: string, index: number) {\n return `${id}--tab-${index}`\n}\n\nfunction makeTabPanelId(id: string, index: number) {\n return `${id}--tabpanel-${index}`\n}\n","import {\n chakra,\n forwardRef,\n omitThemingProps,\n StylesProvider,\n SystemStyleObject,\n ThemingProps,\n useMultiStyleConfig,\n useStyles,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { cx, omit, __DEV__ } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\nimport {\n TabsDescendantsProvider,\n TabsProvider,\n useTab,\n useTabIndicator,\n useTabList,\n UseTabListProps,\n UseTabOptions,\n useTabPanel,\n useTabPanels,\n useTabs,\n UseTabsProps,\n} from \"./use-tabs\"\n\ninterface TabsOptions {\n /**\n * If `true`, tabs will stretch to width of the tablist.\n */\n isFitted?: boolean\n /**\n * The alignment of the tabs\n */\n align?: \"start\" | \"end\" | \"center\"\n}\n\nexport interface TabsProps\n extends UseTabsProps,\n ThemingProps<\"Tabs\">,\n Omit<HTMLChakraProps<\"div\">, \"onChange\">,\n TabsOptions {\n children: React.ReactNode\n}\n\n/**\n * Tabs\n *\n * Provides context and logic for all tabs components.\n */\nexport const Tabs = forwardRef<TabsProps, \"div\">((props, ref) => {\n const styles = useMultiStyleConfig(\"Tabs\", props)\n const { children, className, ...rest } = omitThemingProps(props)\n\n const { htmlProps, descendants, ...ctx } = useTabs(rest)\n const context = React.useMemo(() => ctx, [ctx])\n\n const rootProps = omit(htmlProps as any, [\"isFitted\"])\n\n return (\n <TabsDescendantsProvider value={descendants}>\n <TabsProvider value={context}>\n <StylesProvider value={styles}>\n <chakra.div\n className={cx(\"chakra-tabs\", className)}\n ref={ref}\n {...rootProps}\n __css={styles.root}\n >\n {children}\n </chakra.div>\n </StylesProvider>\n </TabsProvider>\n </TabsDescendantsProvider>\n )\n})\n\nif (__DEV__) {\n Tabs.displayName = \"Tabs\"\n}\n\nexport interface TabProps extends UseTabOptions, HTMLChakraProps<\"button\"> {}\n\n/**\n * Tab button used to activate a specific tab panel. It renders a `button`,\n * and is responsible for automatic and manual selection modes.\n */\nexport const Tab = forwardRef<TabProps, \"button\">((props, ref) => {\n const styles = useStyles()\n const tabProps = useTab({ ...props, ref })\n\n const tabStyles: SystemStyleObject = {\n outline: \"0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...styles.tab,\n }\n\n return (\n <chakra.button\n {...tabProps}\n className={cx(\"chakra-tabs__tab\", props.className)}\n __css={tabStyles}\n />\n )\n})\n\nif (__DEV__) {\n Tab.displayName = \"Tab\"\n}\n\nexport interface TabListProps\n extends UseTabListProps,\n Omit<HTMLChakraProps<\"div\">, \"onKeyDown\" | \"ref\"> {}\n\n/**\n * TabList is used to manage a list of tab buttons. It renders a `div` by default,\n * and is responsible the keyboard interaction between tabs.\n */\nexport const TabList = forwardRef<TabListProps, \"div\">((props, ref) => {\n const tablistProps = useTabList({ ...props, ref })\n\n const styles = useStyles()\n\n const tablistStyles: SystemStyleObject = {\n display: \"flex\",\n ...styles.tablist,\n }\n\n return (\n <chakra.div\n {...tablistProps}\n className={cx(\"chakra-tabs__tablist\", props.className)}\n __css={tablistStyles}\n />\n )\n})\n\nif (__DEV__) {\n TabList.displayName = \"TabList\"\n}\n\nexport interface TabPanelProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabPanel\n * Used to render the content for a specific tab.\n */\nexport const TabPanel = forwardRef<TabPanelProps, \"div\">((props, ref) => {\n const panelProps = useTabPanel({ ...props, ref })\n const styles = useStyles()\n\n return (\n <chakra.div\n outline=\"0\"\n {...panelProps}\n className={cx(\"chakra-tabs__tab-panel\", props.className)}\n __css={styles.tabpanel}\n />\n )\n})\n\nif (__DEV__) {\n TabPanel.displayName = \"TabPanel\"\n}\n\nexport interface TabPanelsProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabPanel\n *\n * Used to manage the rendering of multiple tab panels. It uses\n * `cloneElement` to hide/show tab panels.\n *\n * It renders a `div` by default.\n */\nexport const TabPanels = forwardRef<TabPanelsProps, \"div\">((props, ref) => {\n const panelsProps = useTabPanels(props)\n const styles = useStyles()\n\n return (\n <chakra.div\n {...panelsProps}\n width=\"100%\"\n ref={ref}\n className={cx(\"chakra-tabs__tab-panels\", props.className)}\n __css={styles.tabpanels}\n />\n )\n})\n\nif (__DEV__) {\n TabPanels.displayName = \"TabPanels\"\n}\n\nexport interface TabIndicatorProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabIndicator\n *\n * Used to render an active tab indicator that animates between\n * selected tabs.\n */\nexport const TabIndicator = forwardRef<TabIndicatorProps, \"div\">(\n (props, ref) => {\n const indicatorStyle = useTabIndicator()\n const style = {\n ...props.style,\n ...indicatorStyle,\n }\n\n const styles = useStyles()\n\n return (\n <chakra.div\n ref={ref}\n {...props}\n className={cx(\"chakra-tabs__tab-indicator\", props.className)}\n style={style}\n __css={styles.indicator}\n />\n )\n },\n)\n\nif (__DEV__) {\n TabIndicator.displayName = \"TabIndicator\"\n}\n","export const SECTION_PADDING = {\n X: [4, 8, 12, 16, 20],\n Y: [4, 6, 8],\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"homeRedesign\", [\n \"page\",\n \"packageGrid\",\n // Hero Section\n \"heroHeader\",\n \"heroSubtitle\",\n // Info Section\n \"infoContainer\",\n \"infoSection\",\n \"infoSectionHeading\",\n \"infoSectionDescription\",\n \"infoSectionIcon\",\n // Featured / Recently Updated Section\n \"featuredContainer\",\n \"featuredHeader\",\n \"featuredGrid\",\n // CDK Type Section\n \"cdkTypeSection\",\n \"cdkTypeSectionHeading\",\n \"cdkTypeSectionDescription\",\n \"cdkTypeTab\",\n \"cdkTypeGrid\",\n \"cdkTypeSeeAllButton\",\n] as const);\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCard } from \"../../components/PackageCard\";\nimport testIds from \"./testIds\";\n\nexport const PackageGrid: FunctionComponent<{ packages: CatalogPackage[] }> = ({\n packages,\n}) => {\n return (\n <Grid\n data-testid={testIds.packageGrid}\n gap={4}\n mt={8}\n templateColumns={{ base: \"1fr\", lg: \"1fr 1fr\" }}\n >\n {packages.map((pkg) => (\n <PackageCard key={`${pkg.name}-${pkg.version}`} pkg={pkg} />\n ))}\n </Grid>\n );\n};\n","import {\n Button,\n Flex,\n forwardRef,\n Heading,\n Tab,\n TabList,\n TabPanelProps,\n TabPanel,\n TabPanels,\n Tabs,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { NavLink } from \"../../components/NavLink\";\nimport { CDKType, CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { useHistoryState } from \"../../hooks/useHistoryState\";\nimport { getSearchPath } from \"../../util/url\";\nimport { SECTION_PADDING } from \"./constants\";\nimport { PackageGrid } from \"./PackageGrid\";\nimport testIds from \"./testIds\";\n\ninterface PackageTabProps {\n cdkType?: CDKType;\n data: ReturnType<typeof useCatalogResults>;\n}\n\nconst PackageTab: FunctionComponent<PackageTabProps> = ({ cdkType, data }) => {\n return (\n <Tab\n data-testid={testIds.cdkTypeTab}\n data-value={cdkType}\n isDisabled={data.page.length < 1}\n >\n {cdkType ? CDKTYPE_RENDER_MAP[cdkType].name : \"All CDKs\"} (\n {data.results.length})\n </Tab>\n );\n};\n\nconst PackageTabPanel = forwardRef<PackageTabProps & TabPanelProps, \"div\">(\n ({ cdkType, data, ...props }, ref) => {\n return (\n <TabPanel data-testid={testIds.cdkTypeGrid} ref={ref} {...props} p={0}>\n <PackageGrid packages={data.page} />\n\n <Flex justify=\"center\" w=\"full\">\n <NavLink\n data-testid={testIds.cdkTypeSeeAllButton}\n onClick={() => window.scrollTo(0, 0)}\n to={getSearchPath({\n cdkType,\n sort: cdkType\n ? CatalogSearchSort.DownloadsDesc\n : CatalogSearchSort.PublishDateDesc,\n })}\n >\n <Button colorScheme=\"blue\" my={8}>\n See all {cdkType ? CDKTYPE_RENDER_MAP[cdkType].name + \" \" : \"\"}\n constructs\n </Button>\n </NavLink>\n </Flex>\n </TabPanel>\n );\n }\n);\n\nexport const CDKTypeTabs: FunctionComponent = () => {\n const anyCDKType = useCatalogResults({\n limit: 4,\n });\n const awscdk = useCatalogResults({\n cdkType: CDKType.awscdk,\n limit: 4,\n sort: CatalogSearchSort.DownloadsDesc,\n });\n const cdk8s = useCatalogResults({\n cdkType: CDKType.cdk8s,\n limit: 4,\n sort: CatalogSearchSort.DownloadsDesc,\n });\n const cdktf = useCatalogResults({\n cdkType: CDKType.cdktf,\n limit: 4,\n sort: CatalogSearchSort.DownloadsDesc,\n });\n\n const [tabIndex, setTabIndex] = useHistoryState(\"cdkTypeTab\", 0);\n\n return (\n <Flex\n bg=\"white\"\n color=\"blue.800\"\n data-testid={testIds.cdkTypeSection}\n direction=\"column\"\n px={SECTION_PADDING.X}\n py={SECTION_PADDING.Y}\n zIndex=\"0\"\n >\n <Heading\n as=\"h3\"\n data-testid={testIds.cdkTypeSectionHeading}\n fontSize=\"1.5rem\"\n fontWeight=\"semibold\"\n lineHeight=\"lg\"\n mb={3}\n >\n Find open-source community constructs and official libraries in one\n location\n </Heading>\n <Text\n data-testid={testIds.cdkTypeSectionDescription}\n lineHeight=\"md\"\n maxW=\"60ch\"\n mb={5}\n >\n Use Construct Hub to find CDKs’ libraries owned by the open source\n community and companies and organizations like Terraform, CNCF, AWS and\n more.\n </Text>\n <Tabs\n defaultIndex={tabIndex}\n onChange={(index) => setTabIndex(index)}\n variant=\"line\"\n >\n <TabList>\n <PackageTab data={anyCDKType} />\n\n <PackageTab cdkType={CDKType.awscdk} data={awscdk} />\n\n <PackageTab cdkType={CDKType.cdk8s} data={cdk8s} />\n\n <PackageTab cdkType={CDKType.cdktf} data={cdktf} />\n </TabList>\n <TabPanels minH=\"28.5rem\">\n <PackageTabPanel data={anyCDKType} />\n\n <PackageTabPanel cdkType={CDKType.awscdk} data={awscdk} />\n\n <PackageTabPanel cdkType={CDKType.cdk8s} data={cdk8s} />\n\n <PackageTabPanel cdkType={CDKType.cdktf} data={cdktf} />\n </TabPanels>\n </Tabs>\n </Flex>\n );\n};\n","import { useState } from \"react\";\nimport { useHistory } from \"react-router-dom\";\n\nexport const useHistoryState = <T>(\n key: string,\n initialValue: T\n): [T, (t: T) => void] => {\n const history = useHistory();\n const [rawState, rawSetState] = useState<T>(() => {\n const value = (history.location.state as any)?.[key];\n return value ?? initialValue;\n });\n const setState = (value: T) => {\n history.replace({\n ...history.location,\n state: {\n ...(history.location.state as any),\n [key]: value,\n },\n });\n rawSetState(value);\n };\n return [rawState, setState];\n};\n","import { Flex, Grid, Heading } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { DEFAULT_FEATURED_PACKAGES } from \"../../api/config\";\nimport { PackageCard } from \"../../components/PackageCard\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\nimport { SECTION_PADDING } from \"./constants\";\nimport testIds from \"./testIds\";\nimport { useSection } from \"./useSection\";\n\nexport const Featured: FunctionComponent = () => {\n const homePackages = useConfigValue(\"featuredPackages\");\n const [featured = { name: \"Recently Updated\", showLastUpdated: 4 }] = (\n homePackages ?? DEFAULT_FEATURED_PACKAGES\n ).sections;\n\n const section = useSection(featured);\n\n if (!section) {\n return null;\n }\n\n return (\n <Flex\n data-testid={testIds.featuredContainer}\n direction=\"column\"\n px={SECTION_PADDING.X}\n py={SECTION_PADDING.Y}\n zIndex=\"0\"\n >\n <Heading\n as=\"h3\"\n color=\"white\"\n data-testid={testIds.featuredHeader}\n fontSize=\"1.5rem\"\n fontWeight=\"semibold\"\n lineHeight=\"lg\"\n >\n {featured.name}\n </Heading>\n <Grid\n data-testid={testIds.featuredGrid}\n gap={4}\n mt={8}\n templateColumns={{ base: \"1fr\", lg: \"1fr 1fr\" }}\n >\n {section?.slice(0, 4).map((pkg) => (\n <PackageCard key={pkg.name} pkg={pkg} />\n ))}\n </Grid>\n </Flex>\n );\n};\n","import { useMemo } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { FeaturedPackagesDetail } from \"../../api/config\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { findPackage } from \"../../api/package/util\";\nimport { useCatalog } from \"../../contexts/Catalog\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\n\nexport const useSection = ({\n showLastUpdated,\n showPackages,\n}: {\n showLastUpdated?: number;\n showPackages?: FeaturedPackagesDetail[];\n}) => {\n const { loading, error } = useCatalog();\n const { results } = useCatalogResults({\n limit: 25,\n sort: CatalogSearchSort.PublishDateDesc,\n });\n\n return useMemo(() => {\n if (loading || error || !results) return [];\n\n if (showLastUpdated) {\n return results.slice(0, showLastUpdated);\n } else if (showPackages) {\n return showPackages\n .map((p) => {\n const pkg = findPackage({ packages: results }, p.name);\n if (pkg) {\n return {\n ...pkg,\n comment: p.comment,\n };\n }\n return undefined;\n })\n .filter((pkg) => pkg !== undefined) as CatalogPackage[];\n } else {\n return undefined;\n }\n }, [results, error, loading, showLastUpdated, showPackages]);\n};\n","export default function _taggedTemplateLiteral(strings, raw) {\n if (!raw) {\n raw = strings.slice(0);\n }\n\n return Object.freeze(Object.defineProperties(strings, {\n raw: {\n value: Object.freeze(raw)\n }\n }));\n}","import { Box, BoxProps, forwardRef, keyframes } from \"@chakra-ui/react\";\n\nconst gradient = \"linear-gradient(274.2deg, #143870 20.69%, #1F50A1 84.17%)\";\n\nconst animation = keyframes`\n 0% {\n background-position:0% 50%;\n }\n\n 50% {\n background-position:100% 50%;\n }\n\n 100% {\n background-position:0% 50%;\n }\n`;\n\nexport const GradientContainer = forwardRef<BoxProps, \"div\">((props, ref) => (\n <Box\n animation={`${animation} 10s linear infinite`}\n bg={gradient}\n bgSize=\"200% 200%\"\n ref={ref}\n {...props}\n />\n));\n","import { Box, Flex, Heading } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n SearchBar,\n SearchOverlay,\n SearchSuggestions,\n} from \"../../components/SearchBar\";\nimport { SECTION_PADDING } from \"./constants\";\nimport testIds from \"./testIds\";\n\nexport const Hero: FunctionComponent = () => {\n return (\n <Flex\n align=\"center\"\n color=\"white\"\n direction=\"column\"\n h=\"20rem\"\n justify=\"center\"\n px={SECTION_PADDING.X}\n py={SECTION_PADDING.Y}\n textAlign=\"center\"\n zIndex=\"1\"\n >\n <Heading as=\"h1\" data-testid={testIds.heroHeader} size=\"xl\">\n Build cloud infrastructure faster\n </Heading>\n <Heading\n as=\"h2\"\n data-testid={testIds.heroSubtitle}\n fontWeight=\"normal\"\n mt={4}\n size=\"md\"\n >\n Construct Hub is a registry for open-source cloud development kit (CDK)\n libraries.\n </Heading>\n <Box color=\"initial\" maxW=\"36rem\" mt={8} mx=\"auto\" w=\"full\">\n <SearchBar hasButton>\n <SearchOverlay />\n <SearchSuggestions />\n </SearchBar>\n </Box>\n </Flex>\n );\n};\n","import { Grid, Heading, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent, ReactNode } from \"react\";\nimport { SECTION_PADDING } from \"./constants\";\nimport testIds from \"./testIds\";\n\nexport interface InfoSectionProps {\n title: string;\n description: ReactNode;\n}\n\nexport const InfoSection: FunctionComponent<InfoSectionProps> = ({\n title,\n description,\n children,\n}) => (\n <Grid\n color=\"blue.800\"\n data-testid={testIds.infoSection}\n px={SECTION_PADDING.X}\n py={SECTION_PADDING.Y}\n templateColumns=\"1fr\"\n templateRows=\"auto 1fr auto\"\n >\n <Heading\n as=\"h3\"\n data-testid={testIds.infoSectionHeading}\n fontSize=\"1.5rem\"\n fontWeight=\"semibold\"\n lineHeight=\"lg\"\n mb={2}\n >\n {title}\n </Heading>\n <Text data-testid={testIds.infoSectionDescription} fontSize=\"lg\" mb={4}>\n {description}\n </Text>\n {children}\n </Grid>\n);\n","import { Divider, Flex, Grid, Image, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { NavLink } from \"../../components/NavLink\";\nimport { CDKType, CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\nimport {\n Language,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\nimport { InfoSection } from \"./InfoSection\";\nimport testIds from \"./testIds\";\n\nexport const Info: FunctionComponent = () => (\n <Grid\n bg=\"white\"\n data-testid={testIds.infoContainer}\n templateColumns={{ base: \"1fr\", lg: \"1fr auto 1fr\" }}\n templateRows={{ base: \"1fr auto 1fr\", lg: \"1fr\" }}\n textAlign=\"left\"\n >\n <InfoSection\n description=\"We support CDK for CloudFormation (AWS CDK), which generates CloudFormation templates, CDK for Terraform (CDKtf), which generates Terraform-friendly JSON files, and CDK for Kubernetes (CDK8s), which generates Kubernetes manifests.\"\n title=\"Supported CDKs\"\n >\n <Flex align=\"center\" justify=\"space-evenly\" pt={4} wrap=\"wrap\">\n {Object.entries(CDKTYPE_RENDER_MAP).map(\n ([cdktype, { name, imgsrc }]) => (\n <NavLink\n color=\"blue.500\"\n data-testid={testIds.infoSectionIcon}\n fontWeight=\"bold\"\n key={cdktype}\n to={getSearchPath({\n cdkType: cdktype as CDKType,\n sort: CatalogSearchSort.DownloadsDesc,\n })}\n >\n <Stack align=\"center\" spacing={2}>\n <Image aria-label={name} h={8} src={imgsrc} />\n <span>{name}</span>\n </Stack>\n </NavLink>\n )\n )}\n </Flex>\n </InfoSection>\n\n <Divider\n display={{ base: \"none\", lg: \"initial\" }}\n h=\"auto\"\n my={10}\n orientation=\"vertical\"\n />\n <Divider display={{ lg: \"none\" }} mx={10} w=\"auto\" />\n\n <InfoSection\n description=\"For each CDK library you can find helpful documentation, such as API references and code samples in Java, .NET, TypeScript and Python. Create cloud resources and define your application using loops, conditionals, GitOps, code completion, and manifest testing.\"\n title=\"Supported programming languages\"\n >\n <Flex align=\"center\" justify=\"space-evenly\" pt={4} wrap=\"wrap\">\n {Object.entries(LANGUAGE_RENDER_MAP)\n .filter(([language]) =>\n TEMP_SUPPORTED_LANGUAGES.has(language as Language)\n )\n .map(([language, { icon: Icon, name }]) => (\n <NavLink\n color=\"blue.500\"\n data-testid={testIds.infoSectionIcon}\n fontWeight=\"bold\"\n key={language}\n to={getSearchPath({\n languages: [language as Language],\n sort: CatalogSearchSort.DownloadsDesc,\n })}\n >\n <Stack align=\"center\" key={language} spacing={2}>\n <Icon aria-label={name} h={8} w={8} />\n <span>{name}</span>\n </Stack>\n </NavLink>\n ))}\n </Flex>\n </InfoSection>\n </Grid>\n);\n","import { Flex } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { DevPreviewBanner } from \"../../components/DevPreviewBanner\";\nimport { Page } from \"../../components/Page\";\nimport { CDKTypeTabs } from \"./CDKTypeTabs\";\nimport { Featured } from \"./Featured\";\nimport { GradientContainer } from \"./GradientContainer\";\nimport { Hero } from \"./Hero\";\nimport { Info } from \"./Info\";\nimport testIds from \"./testIds\";\n\nexport const Home: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Construct Hub\",\n description:\n \"Construct Hub helps developers find open-source construct libraries for use with AWS CDK, CDK8s, CDKTf and other construct-based tools.\",\n suffix: false,\n }}\n pageName=\"home\"\n >\n <GradientContainer\n as={Flex}\n data-testid={testIds.page}\n direction=\"column\"\n >\n <DevPreviewBanner />\n\n <Hero />\n\n <Info />\n\n <Featured />\n\n <CDKTypeTabs />\n </GradientContainer>\n </Page>\n );\n};\n"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","hooks/useQueryParams/useQueryParams.ts","api/package/util.ts","hooks/useLanguage/useLanguage.ts","util/css.ts","hooks/useConfigValue/useConfigValue.ts","components/Time/Time.tsx","components/PackageTag/PackageTag.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/Picture/Picture.tsx","views/NotFound/NotFound.tsx","api/package/assembly.ts","api/package/docs.ts","api/package/metadata.ts","util/sanitize-anchor.ts","views/Package/util.ts","views/Package/PackageState.tsx","views/Package/testIds.ts","views/Package/DependenciesList.tsx","icons/GithubIcon.tsx","views/Package/FeedbackLinks.tsx","components/NavTree/NavTree.tsx","views/Package/ChooseSubmodule/SearchInput.tsx","views/Package/ChooseSubmodule/SearchModal.tsx","views/Package/ChooseSubmodule/ChooseSubmodule.tsx","components/CopyButton/CopyButton.tsx","components/Code/MultiLineRenderer.tsx","components/Code/SingleLineRenderer.tsx","components/Code/Code.tsx","components/Markdown/Headings.tsx","components/Markdown/testIds.ts","components/Markdown/Markdown.tsx","components/Markdown/Text.tsx","components/Markdown/Code.tsx","components/Markdown/Hr.tsx","components/Markdown/Img.tsx","components/Markdown/List.tsx","components/Markdown/Table.tsx","views/Package/PackageReadme.tsx","views/Package/PackageDocsError.tsx","views/Package/PackageTypeDocs.tsx","views/Package/PackageDocs.tsx","components/LanguageBar/LanguageBar.tsx","views/Package/LanguageSelection/LanguageSelection.tsx","components/LicenseLink/constants.ts","components/LicenseLink/LicenseLink.tsx","views/Package/PackageHeader/ToggleButton.tsx","views/Package/PackageHeader/Details.tsx","views/Package/PackageHeader/HeaderContainer.tsx","views/Package/PackageHeader/Heading.tsx","views/Package/PackageHeader/Install.tsx","views/Package/PackageHeader/PackageHeader.tsx","views/Package/PackageLayout.tsx","views/Package/Package.tsx","views/PackageLatest/PackageLatest.tsx","views/Packages/Packages.tsx"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","useQueryParams","useLocation","useMemo","URLSearchParams","getFullPackageName","scope","getAssetsPath","version","prefix","API_PATHS","PACKAGES_PREFIX","body","sanitizeVersion","ver","sanitized","startsWith","substring","extractMajor","split","findPackage","catalog","pkg","packages","filter","p","length","sort","p1","p2","mv1","localeCompare","defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","has","getInitialLang","langFromParams","storedLang","localStorage","getItem","useLanguage","options","updateUrl","updateSaved","pathname","hash","useHistory","replace","params","get","QUERY_PARAMS","LANGUAGE","useState","language","setLanguage","set","toString","update","useCallback","val","setItem","makeGridAreas","rows","map","row","col","join","useConfigValue","key","data","useConfig","Time","forwardRef","ref","date","formatString","format","boxProps","as","dateTime","toISOString","displayName","PackageTag","isKeyword","value","label","zIndex","tagProps","prop","NavLink","to","getSearchPath","_hover","textDecoration","LanguageSupportTooltip","isSupported","langName","LANGUAGE_NAME_MAP","message","hasArrow","placement","Picture","sources","props","source","idx","media","srcSet","bgSources","optimal","fallback","NotFound","h","position","w","alt","inset","src","align","direction","justify","Link","colorScheme","fetchAssembly","a","assemblyPath","ASSEMBLY_SUFFIX","fetch","response","ok","Error","statusText","json","fetchMarkdown","submodule","docsSuffix","markdownPath","expectedContentType","contentType","headers","includes","text","fetchMetadata","sanitizedVersion","metadataPath","METADATA_SUFFIX","sanitize","input","toLowerCase","appendMenuItem","items","item","last","level","push","splitOnHeaders","md","maxLevel","regex","RegExp","reduce","accum","str","prev","getHeaderAttributes","hdr","attrs","match","exec","parsedValue","wEmoji","emoji","id","encodeURIComponent","parseMarkdownStructure","prevType","prevLevel","nameSegment","basePath","langQuery","separator","segments","apiReferenceStr","pop","readmeStr","apiReferenceSplit","readmeSplit","apiReferenceParsed","trim","baseReadmePath","readmeMenuItems","path","menuItem","menuItems","types","forEach","isHeader","undefined","readme","apiReference","PackageStateContext","createContext","usePackageState","state","useContext","PackageStateProvider","useParams","useRequest","requestMarkdown","markdownResponse","requestAssembly","assemblyResponse","requestMetadata","metadataResponse","q","SUBMODULE","languageFilename","pageTitle","pageDescription","hasError","Boolean","error","hasDocs","loading","targets","isLoadingDocs","parsedMd","Provider","assembly","markdown","metadata","createTestIds","DependenciesList","PageLoader","depEntries","Object","entries","dependencies","testIds","dependenciesList","mx","spacing","wrap","_first","ml","dependenciesLink","fontWeight","getPackagePath","GithubIcon","clipRule","d","fill","fillRule","iconProps","FeedbackLinks","repo","repository","repoLink","type","repoUrl","url","endsWith","slice","ExternalLink","color","githubLink","hasIcon","href","rightIcon","variant","borderTop","borderTopColor","feedbackLinks","base","py","reportLink","NavItemWrapper","showToggle","sharedProps","bg","overflow","pl","marginLeft","textOverflow","NavItem","onOpen","defaultIsOpen","disclosure","useDisclosure","showChildren","isOpen","nestedItems","borderRadius","icon","onClick","onToggle","size","_before","bottom","left","top","display","mr","NavTree","maxWidth","SearchInput","inputRef","onChange","onSubmit","inputValue","setInputValue","useDebounce","Form","e","target","placeholder","SearchModal","onClose","onInputChange","submodules","useRef","navigate","preventDefault","initialFocusRef","fontSize","pb","px","m","maxH","role","tabIndex","SearchItem","ChooseSubmodule","query","allSubmodules","keys","currentSubmodule","submoduleText","setFilter","getUrl","submoduleName","results","fqn","leftIcon","flexGrow","CopyButton","btnProps","useClipboard","hasCopied","onCopy","minW","MultiLineRenderer","code","tokens","getLineProps","getTokenProps","borderTopRadius","overflowX","line","i","token","SingleLineRenderer","templateColumns","maxW","Code","defaultProps","theme","nightOwlLight","border","boxShadow","className","style","Headings","elem","dataElement","DOMParser","parseFromString","ReactDOMServer","renderToStaticMarkup","querySelector","dataset","headingTitle","Children","toArray","child","headingId","backgroundColor","borderBottom","borderBottomColor","marginBottom","marginTop","paddingBottom","paddingTop","paddingX","sx","components","linkProps","Component","URL","hostname","window","location","blockquote","borderLeft","borderLeftColor","marginX","wordBreak","caption","TableCaption","inline","borderColor","em","fontStyle","h1","h2","h3","h4","h5","h6","hr","img","li","lineHeight","ol","my","pre","sup","Array","isArray","first","table","tbody","Tbody","td","Td","tfoot","Tfoot","th","Th","thead","Thead","tr","Tr","ul","padding","ghSchema","githubSchema","attributes","span","concat","rehypePlugins","rehypeRaw","rehypeSanitize","remarkPlugins","remarkGfm","remarkEmoji","GITHUB_REPO_REGEX","Markdown","repoConfig","owner","parseGitHubRepository","toAbsoluteUri","githubPrefix","githubSuffix","ReactMarkdown","uriTransformer","uri","container","transformImageUri","transformLinkUri","PackageReadme","PackageDocsError","issueLink","CONSTRUCT_HUB_REPO_URL","PackageTypeDocs","docs","typeId","usePackageTypeDocs","TOP_OFFSET","SubmoduleSelector","PackageDocs","useRouteMatch","document","scrollIntoView","scrollTo","columnGap","width","alignSelf","borderRight","borderRightColor","maxHeight","pr","overflowY","scrollMarginTop","exact","LanguageBar","targetLanguages","selectedLanguage","setSelectedLanguage","right","LANGUAGES","indexOf","isDisabled","isSelected","LangIcon","LANGUAGE_RENDER_MAP","cursor","disabled","height","languageSet","Set","LanguageSelection","changeLanguage","selectedIsValid","OS_ORG_LINK","LICENSE_LINKS","MIT","LicenseLink","license","ToggleButton","openText","closeText","buttonProps","WithLabel","tooltip","Downloads","downloads","toLocaleString","Details","stats","useStats","collapse","packageLinks","npm","username","author","publishDate","Date","linkLabel","configKey","linkText","link","getRepoUrlAndHost","licenseLink","getDetailItemsFromPackage","alwaysShow","showWithCollapse","mt","animateOpacity","in","GRID_AREAS","baseGridAreas","lgGridAreas","HeaderContainer","lg","pt","rowGap","templateAreas","templateRows","Heading","stackProps","tags","packageTags","tag","keyword","keywords","v","KEYWORD_IGNORE_LIST","cdkTypeProps","constructFramework","flexShrink","isTruncated","flex","gap","CDKType","Install","packageName","Python","python","distName","Java","groupId","java","maven","artifactId","DotNet","packageId","dotnet","getCodeSample","PackageHeader","asm","gridArea","mb","PackageLayout","setTabIndex","index","dependenciesTab","Package","PackageLatest","useCatalog","minH","buildRedirectUrl","nameRegexp","scopeRegexp","Packages"],"mappings":"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","file":"static/js/7.b1387400.chunk.js","sourcesContent":["export const pageInfo = {\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\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\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 { 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\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\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 { 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 { API_PATHS } from \"../../constants/url\";\nimport { CatalogPackage, Packages } from \"./packages\";\n\nexport const getFullPackageName = (name: string, scope?: string) => {\n return scope ? `${scope}/${name}` : name;\n};\n\nexport const getAssetsPath = (\n name: string,\n version: string,\n scope?: string\n) => {\n const prefix = `${API_PATHS.PACKAGES_PREFIX}/`;\n const body = getFullPackageName(name, scope);\n const suffix = `/v${version}`;\n return `${prefix}${body}${suffix}`;\n};\n\nexport const sanitizeVersion = (ver: string) => {\n let sanitized = ver;\n if (sanitized.startsWith(\"~\") || sanitized.startsWith(\"^\")) {\n sanitized = sanitized.substring(1);\n }\n return sanitized;\n};\n\nconst extractMajor = (ver: string) => {\n let sanitized = sanitizeVersion(ver);\n return sanitized.split(\".\")[0];\n};\n\nexport const findPackage = (\n catalog: Packages,\n pkg: string\n): CatalogPackage | undefined => {\n const packages = catalog.packages.filter((p) => p.name === pkg);\n\n if (packages.length > 1) {\n return packages.sort((p1, p2) => {\n const mv1 = extractMajor(p1.version);\n const mv2 = extractMajor(p2.version);\n return mv2.localeCompare(mv1);\n })[0];\n }\n\n return packages[0];\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","/**\n * @fileoverview CSS Related Utils\n */\n\n/**\n * Translates a series of grid row definitions into a grid area string\n * ```ts\n * const gridAreas = makeGridAreas(\n * [\"header\", \"header\", \"header\"],\n * [\"aside\", \"main\", \"main\"],\n * [\"aside\", \"footer\", \"footer\"]\n * ); // `\"header header header\" \"aside main main\" \"aside footer footer\"`\n *\n * const withBlank = makeGridAreas(\n * [\"header\", null, \"main\"]\n * ); // `\"header . main\"`\n * ```\n */\nexport const makeGridAreas = (...rows: (string | null)[][]): string => {\n return rows\n .map((row) => `\"${row.map((col) => col ?? \".\").join(\" \")}\"`)\n .join(\" \");\n};\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 { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport interface TimeOptions {\n date: Date;\n format: string;\n}\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {format(date, formatString)}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\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 isKeyword?: boolean;\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n isKeyword = false,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n const prop = isKeyword ? \"keywords\" : \"tags\";\n\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ [prop]: [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","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<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","import { Box, HTMLChakraProps, forwardRef, Image } from \"@chakra-ui/react\";\n\nexport interface PictureProps extends HTMLChakraProps<\"img\"> {\n alt: string;\n src: string;\n sources?: {\n media?: string;\n srcSet: string;\n }[];\n}\n\nexport const Picture = forwardRef<PictureProps, \"img\">(\n ({ sources, ...props }, ref) => (\n <Box as=\"picture\">\n {sources?.map((source, idx) => (\n <source key={idx} media={source.media} srcSet={source.srcSet} />\n ))}\n <Image ref={ref} {...props} />\n </Box>\n )\n);\n\nPicture.displayName = \"Picture\";\n","import { Button, Center, Flex } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Page } from \"../../components/Page\";\nimport { Picture } from \"../../components/Picture\";\n\nconst bgSources = {\n optimal: [\n { media: \"(max-width:1024px)\", srcSet: \"/assets/404-hive@50.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/404-hive@100.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/404-hive@100.png\" },\n ],\n fallback: \"/assets/404-hive@50.png\",\n};\n\nexport const NotFound: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Not Found\",\n description: \"Oops! The page you were looking for does not exist\",\n }}\n pageName=\"notFound\"\n >\n <Center h=\"100%\" position=\"relative\" w=\"100%\">\n <Picture\n alt=\"\"\n inset={0}\n position=\"absolute\"\n sources={bgSources.optimal}\n src={bgSources.fallback}\n zIndex=\"hide\"\n />\n <Flex align=\"center\" direction=\"column\" justify=\"center\">\n <Picture\n alt=\"404 Image\"\n sources={[{ srcSet: \"/assets/robot.webp\" }]}\n src=\"/assets/robot.png\"\n />\n <Button as={Link} colorScheme=\"blue\" to=\"/\">\n Take Me Home\n </Button>\n </Flex>\n </Center>\n </Page>\n );\n};\n","import * as spec from \"@jsii/spec\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\n/**\n * Fetch assembly of a specific package from the backend.\n */\nexport const fetchAssembly = async (\n name: string,\n version: string,\n scope?: string\n): Promise<spec.Assembly> => {\n const assemblyPath = `${getAssetsPath(name, version, scope)}${\n API_PATHS.ASSEMBLY_SUFFIX\n }`;\n const response = await fetch(assemblyPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching assembly for ${assemblyPath}: ${response.statusText}`\n );\n }\n return response.json();\n};\n","import { getAssetsPath } from \"./util\";\n\n/**\n * Fetch markdown docs of a specific package from the backend.\n */\nexport const fetchMarkdown = async (\n name: string,\n version: string,\n language: string,\n scope?: string,\n submodule?: string\n): Promise<string> => {\n const docsSuffix = `/docs-${submodule ? `${submodule}-` : \"\"}${language}.md`;\n\n const markdownPath = `${getAssetsPath(name, version, scope)}${docsSuffix}`;\n const response = await fetch(markdownPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching documentation for ${markdownPath}: ${response.statusText}`\n );\n }\n\n // since CloudFront returns a 200 /index.html for missing documents,\n // we assert the expected docs content type to detect these errors.\n // TODO: switch to proper 404 responses in this case (requires backend changes)\n const expectedContentType = \"text/markdown\";\n const contentType = response.headers.get(\"Content-Type\");\n\n // we check 'includes' and not 'equal' because the content type contains\n // charset as well (e.g text/markdown; charset=UTF-8)\n if (!contentType || !contentType.includes(expectedContentType)) {\n throw new Error(\n `Invalid content type: ${contentType}. Expected ${expectedContentType}\"`\n );\n }\n return response.text();\n};\n","import { CDKType } from \"../../constants/constructs\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { PackageTagConfig } from \"../config\";\nimport { getAssetsPath } from \"./util\";\n\nexport interface Metadata {\n constructFramework?: {\n name?: CDKType;\n majorVersion?: number;\n };\n date: string;\n links?: {\n npm: string;\n };\n packageLinks?: {\n [key: string]: string;\n };\n packageTags?: PackageTagConfig[];\n}\n\n/**\n * Fetch metadata of a specific package from the backend.\n */\nexport const fetchMetadata = async (\n name: string,\n version: string,\n scope?: string\n): Promise<Metadata> => {\n let sanitizedVersion = version;\n\n if (sanitizedVersion.startsWith(\"^\")) {\n sanitizedVersion = sanitizedVersion.substring(1, sanitizedVersion.length);\n }\n\n const metadataPath = `${getAssetsPath(name, version, scope)}${\n API_PATHS.METADATA_SUFFIX\n }`;\n const response = await fetch(metadataPath);\n\n if (!response.ok) {\n throw new Error(\n `Failed fetching metadata for ${metadataPath}: ${response.statusText}`\n );\n }\n\n return response.json();\n};\n","export const sanitize = (input: string): string => {\n return input\n .toLowerCase()\n .replace(/[^a-zA-Z0-9 ]/g, \"\")\n .replace(/ /g, \"-\");\n};\n","import emoji from \"node-emoji\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { sanitize } from \"../../util/sanitize-anchor\";\n\nexport interface MenuItem {\n id: string;\n path?: string;\n title: string;\n children: MenuItem[];\n level: number;\n}\n\nexport interface Types {\n [id: string]: {\n title: string;\n content: string;\n };\n}\n\n/**\n * Recursively insert menu items into appropriate parent's `children` array.\n */\nconst appendMenuItem = (items: MenuItem[], item: MenuItem): MenuItem[] => {\n const last = items[items.length - 1];\n\n if (last && last.level < item.level) {\n last.children = appendMenuItem(last.children, item);\n return items;\n }\n\n items.push(item);\n return items;\n};\n\n/**\n * Split markdown string on header lines. Accepts a `maxLevel` to only\n * parse to a specified level. Defaults to markdown maximum of `6`\n */\nconst splitOnHeaders = (md: string, maxLevel: number = 6): string[] => {\n // first matches code blocks to avoid matching any lines starting with '#'\n // inside of an escaped string.\n const regex = new RegExp(\n `(\\`{3}[\\\\s\\\\S]*?(?:\\`{3})|^#{1,${maxLevel}}[^#].*)`,\n \"gm\"\n );\n\n return (\n md\n .split(regex)\n // concatenate non-header content back together\n .reduce((accum: string[], str: string) => {\n const prev = accum[accum.length - 1];\n if (str.startsWith(\"#\") || prev?.startsWith(\"#\")) {\n return [...accum, str];\n }\n\n // Append blocks back to each other when neither are headers\n // This happens with code blocks.\n accum[accum.length - 1] += str;\n return accum;\n }, [])\n );\n};\n\n/**\n * Extract relevant data from markdown string for use as menu item. Attempts\n * to parse known data attributes of `title` and `id` while defaulting to use\n * the raw heading value as the default for both if data attributes are not\n * present.\n */\nconst getHeaderAttributes = (hdr: string): { id: string; title: string } => {\n const attrStrings = hdr.match(/(\\S+)\\s*=\\s*(\\\"?)([^\"]*)(\\2|\\s|$)/g) ?? [];\n const attrs: { [key: string]: string } = attrStrings.reduce((accum, str) => {\n const [key, value] = str.split(\"=\");\n const [_, parsedValue] = /['\"](.*?)['\"]/.exec(value) ?? [];\n\n return {\n ...accum,\n [key]: parsedValue,\n };\n }, {});\n\n // Use raw title for items that don't specify data attributes, like readme\n // headers.\n const [_, rawTitle] = /^#*\\s*([^<]+?)\\s*(?:<|$)/.exec(hdr) ?? [];\n const wEmoji = rawTitle.replace(\n /:\\+1:|:-1:|:[\\w-]+:/g,\n (match: string): string => {\n return emoji.get(match) ?? match;\n }\n );\n const title: string = attrs[\"data-heading-title\"] ?? wEmoji;\n const id = attrs[\"data-heading-id\"] ?? encodeURIComponent(sanitize(title));\n\n return { id, title };\n};\n\n/**\n * Accept's markdown document from jsii-docgen with readme and api reference\n * documentation and parses the content into a traversable map of menu items\n * and types. This allows splitting the rendering of the readme and each item\n * in the api reference.\n *\n * NOTE: currently does not support setext style headings in readme documents.\n */\nexport const parseMarkdownStructure = (\n input: string,\n {\n scope,\n language,\n name,\n version,\n }: { scope?: string; language: Language; name: string; version: string }\n): { readme: string; apiReference: Types; menuItems: MenuItem[] } => {\n const nameSegment = scope ? `${scope}/${name}` : `${name}`;\n const basePath = `/packages/${nameSegment}/v/${version}`;\n const langQuery = `?${QUERY_PARAMS.LANGUAGE}=${language}`;\n const separator =\n '# API Reference <span data-heading-title=\"API Reference\" data-heading-id=\"api-reference\"></span>';\n\n // split into readme and api reference\n const segments = input.split(separator);\n\n // Take the last chunk after the separator\n // segments.pop() always returns when length > 1;\n const apiReferenceStr = segments.length > 1 ? segments.pop()! : \"\";\n\n // Rejoin all the previous chunks in case the readme has the same Separator\n const readmeStr = segments.join(separator);\n\n //split each on headers\n const apiReferenceSplit = splitOnHeaders(apiReferenceStr, 3);\n const readmeSplit = splitOnHeaders(readmeStr);\n\n // Add back api reference title for use as menu item\n const apiReferenceParsed = [separator.trim(), ...(apiReferenceSplit ?? [])];\n\n const baseReadmePath = `${basePath}${langQuery}`;\n const readmeMenuItems = [\n {\n level: 1,\n id: \"Readme\",\n title: \"Readme\",\n path: baseReadmePath,\n children: readmeSplit.reduce((accum: MenuItem[], str: string) => {\n if (str.startsWith(\"#\")) {\n const { id, title } = getHeaderAttributes(str);\n const level = str.match(/(#)/gm)?.length ?? 1;\n const menuItem = {\n level,\n id,\n title,\n // root package path plus hash for header on readme item\n path: `${baseReadmePath}#${id}`,\n children: [],\n };\n return appendMenuItem(accum, menuItem);\n }\n return accum;\n }, []),\n },\n ];\n\n let menuItems: MenuItem[] = [...readmeMenuItems];\n const types: Types = {};\n\n const getApiPath = (id: string) => `${basePath}/api/${id}${langQuery}`;\n let prevType: { id: string; title: string };\n let prevLevel: number;\n\n apiReferenceParsed?.forEach((str) => {\n const isHeader = str.match(/(^#{1,3}[^#].*)/g);\n const level = str.match(/(#)/gm)?.length ?? 1;\n\n if (isHeader?.length) {\n const { id, title } = getHeaderAttributes(str);\n\n // root package path plus type id segment\n // only level 3 headers are types in api reference\n const path = level === 3 ? getApiPath(id) : undefined;\n const menuItem = {\n level,\n id,\n title,\n children: [],\n ...(path ? { path } : {}),\n };\n\n menuItems = appendMenuItem(menuItems, menuItem);\n prevType = { id, title };\n prevLevel = level;\n } else if (prevLevel === 3) {\n types[prevType.id] = { title: prevType.title, content: str };\n }\n });\n\n return {\n readme: readmeStr,\n apiReference: types,\n menuItems,\n };\n};\n","import type { Assembly } from \"@jsii/spec\";\nimport {\n createContext,\n FunctionComponent,\n useContext,\n useEffect,\n useMemo,\n} from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { fetchAssembly } from \"../../api/package/assembly\";\nimport { fetchMarkdown } from \"../../api/package/docs\";\nimport { fetchMetadata, Metadata } from \"../../api/package/metadata\";\nimport { Language, languageFilename } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { useRequest, UseRequestResponse } from \"../../hooks/useRequest\";\nimport { NotFound } from \"../NotFound\";\nimport { Types, MenuItem, parseMarkdownStructure } from \"./util\";\n\ninterface PathParams {\n name: string;\n scope?: string;\n version: string;\n}\n\ninterface PackageState {\n apiReference?: Types;\n assembly: UseRequestResponse<Assembly>;\n hasDocs: boolean;\n hasError: boolean;\n isLoadingDocs: boolean;\n isSupported: boolean;\n language: Language;\n markdown: UseRequestResponse<string>;\n metadata: UseRequestResponse<Metadata>;\n name: string;\n pageDescription: string;\n pageTitle: string;\n readme?: string;\n scope?: string;\n version: string;\n menuItems: MenuItem[];\n}\n\nconst PackageStateContext = createContext<PackageState | undefined>(undefined);\n\n/**\n * Consumes shared page-leve data for components on the Package page\n */\nexport const usePackageState = () => {\n const state = useContext(PackageStateContext);\n\n if (!state) {\n throw new Error(\n \"This component must be a child of a <PackageStateProvider />\"\n );\n }\n\n return state;\n};\n\n/**\n * Provides shared page-level data to components on the Package page\n */\nexport const PackageStateProvider: FunctionComponent = ({ children }) => {\n const { name, scope, version }: PathParams = useParams();\n const [requestMarkdown, markdownResponse] = useRequest(fetchMarkdown);\n const [requestAssembly, assemblyResponse] = useRequest(fetchAssembly);\n const [requestMetadata, metadataResponse] = useRequest(fetchMetadata);\n\n const q = useQueryParams();\n const [language] = useLanguage();\n const submodule = q.get(QUERY_PARAMS.SUBMODULE) ?? \"\";\n\n useEffect(() => {\n void requestMetadata(name, version, scope);\n void requestAssembly(name, version, scope);\n }, [name, requestAssembly, requestMetadata, scope, version]);\n\n useEffect(() => {\n void requestMarkdown(\n name,\n version,\n languageFilename[language],\n scope,\n submodule\n );\n }, [name, scope, version, language, submodule, requestMarkdown]);\n\n const pageTitle = `${scope ? `${scope}/${name}` : name} ${version}`;\n\n const pageDescription = assemblyResponse.data?.description ?? \"\";\n\n const hasError = Boolean(markdownResponse.error || assemblyResponse.error);\n\n const hasDocs = Boolean(\n !markdownResponse.loading &&\n !assemblyResponse.loading &&\n markdownResponse.data &&\n assemblyResponse.data\n );\n\n // This will also be true if it cannot be verified (assembly not there)\n const isSupported = Boolean(\n language === Language.TypeScript ||\n assemblyResponse.loading ||\n assemblyResponse.error ||\n assemblyResponse.data?.targets?.[language.toString()] != null\n );\n\n const isLoadingDocs = Boolean(\n !metadataResponse.loading &&\n (assemblyResponse.loading || markdownResponse.loading)\n );\n\n const parsedMd = useMemo(() => {\n if (!markdownResponse.data) return { menuItems: [] };\n\n return parseMarkdownStructure(markdownResponse.data, {\n scope,\n name,\n version,\n language,\n });\n }, [markdownResponse.data, name, scope, version, language]);\n\n // Handle missing JSON for assembly\n if (assemblyResponse.error) {\n return <NotFound />;\n }\n\n return (\n <PackageStateContext.Provider\n value={{\n assembly: assemblyResponse,\n hasDocs,\n hasError,\n isLoadingDocs,\n isSupported,\n language,\n markdown: markdownResponse,\n metadata: metadataResponse,\n name,\n pageDescription,\n pageTitle,\n scope,\n version,\n ...parsedMd,\n }}\n >\n {children}\n </PackageStateContext.Provider>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"package-page\", [\n \"page\",\n \"feedbackLinks\",\n \"reportLink\",\n \"githubLink\",\n \"dependenciesTab\",\n \"dependenciesList\",\n \"dependenciesLink\",\n] as const);\n","import { Center, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { sanitizeVersion } from \"../../api/package/util\";\nimport { NavLink } from \"../../components/NavLink\";\nimport { PageLoader } from \"../../components/PageLoader\";\nimport { getPackagePath } from \"../../util/url\";\nimport { usePackageState } from \"./PackageState\";\nimport testIds from \"./testIds\";\n\nexport const DependenciesList: FunctionComponent = () => {\n const assembly = usePackageState().assembly.data;\n\n if (!assembly) {\n return <PageLoader />;\n }\n\n const depEntries = Object.entries(assembly.dependencies ?? {});\n\n if (!depEntries.length) {\n return <Center>This library does not have any known dependencies</Center>;\n }\n\n return (\n <Stack\n data-testid={testIds.dependenciesList}\n direction=\"row\"\n justify=\"center\"\n mx=\"auto\"\n spacing={4}\n wrap=\"wrap\"\n >\n {depEntries.map(([name, version]) => (\n <NavLink\n _first={{ ml: 4 }}\n data-testid={testIds.dependenciesLink}\n fontWeight=\"semibold\"\n key={`${name}-${version}`}\n p={2}\n to={getPackagePath({ name, version: sanitizeVersion(version) })}\n >\n {name} - {version}\n </NavLink>\n ))}\n </Stack>\n );\n};\n","import { Icon } from \"@chakra-ui/react\";\n\nexport const GithubIcon: typeof Icon = (props) => (\n <Icon {...props}>\n <path\n clipRule=\"evenodd\"\n d=\"M10.2532 0C4.59124 0 0 4.59022 0 10.2532C0 14.7835 2.93785 18.6266 7.01174 19.9825C7.524 20.0776 7.71212 19.7601 7.71212 19.4893C7.71212 19.2448 7.70261 18.4371 7.6982 17.5804C4.84576 18.2006 4.24386 16.3706 4.24386 16.3706C3.77745 15.1855 3.10543 14.8704 3.10543 14.8704C2.17499 14.234 3.17555 14.2473 3.17555 14.2473C4.20498 14.3194 4.74728 15.3039 4.74728 15.3039C5.66176 16.871 7.14588 16.418 7.73097 16.1562C7.82299 15.4935 8.08871 15.041 8.38194 14.785C6.10457 14.5261 3.71038 13.6467 3.71038 9.718C3.71038 8.59859 4.11108 7.68394 4.76697 6.96573C4.66035 6.70765 4.30939 5.66481 4.86613 4.25252C4.86613 4.25252 5.72696 3.97695 7.68631 5.3035C8.50435 5.07616 9.38165 4.96189 10.2532 4.95799C11.1242 4.96189 12.002 5.07582 12.8216 5.30317C14.7785 3.97661 15.6383 4.25218 15.6383 4.25218C16.1964 5.6643 15.8455 6.70731 15.739 6.96539C16.3964 7.6836 16.7943 8.59825 16.7943 9.71766C16.7943 13.6557 14.3957 14.5227 12.1125 14.7767C12.4805 15.0949 12.8081 15.719 12.8081 16.6754C12.8081 18.0473 12.7963 19.1514 12.7963 19.4891C12.7963 19.762 12.981 20.0817 13.5005 19.981C17.5721 18.6237 20.5065 14.7818 20.5065 10.2532C20.5063 4.59056 15.9156 0.000169776 10.2532 0.000169776V0Z\"\n fill=\"#002954\"\n fillRule=\"evenodd\"\n />\n <path\n d=\"M3.88318 14.7214C3.86059 14.7724 3.78045 14.7876 3.70744 14.7528C3.63274 14.7195 3.59114 14.6501 3.61525 14.599C3.63732 14.5464 3.71763 14.5319 3.79183 14.5671C3.86654 14.6005 3.90898 14.6706 3.88301 14.7216L3.88318 14.7214ZM4.29848 15.1848C4.24975 15.2301 4.15416 15.209 4.0893 15.1372C4.02206 15.0659 4.0095 14.9703 4.05925 14.9243C4.10984 14.8791 4.20255 14.9005 4.26978 14.9719C4.33668 15.0442 4.34992 15.1389 4.29865 15.1849L4.29848 15.1848ZM4.70291 15.7751C4.64009 15.8189 4.5372 15.778 4.4737 15.6868C4.41088 15.5955 4.41088 15.486 4.4754 15.4423C4.53873 15.3985 4.64009 15.4381 4.70461 15.5284C4.76709 15.621 4.76709 15.7305 4.70291 15.775V15.7751ZM5.25659 16.3458C5.20056 16.4078 5.08069 16.3911 4.99308 16.3067C4.9036 16.224 4.87864 16.1064 4.93484 16.0446C4.99189 15.9824 5.11227 15.9998 5.20039 16.0836C5.28987 16.1661 5.31687 16.284 5.25693 16.3456L5.25659 16.3458ZM6.02064 16.677C5.99568 16.7573 5.88056 16.7939 5.76426 16.7596C5.64829 16.7244 5.5724 16.6305 5.59617 16.5494C5.61994 16.4684 5.7359 16.4305 5.85289 16.467C5.96885 16.502 6.04475 16.5954 6.02064 16.677ZM6.8599 16.7383C6.86279 16.8229 6.76431 16.8928 6.64257 16.8945C6.51982 16.8974 6.42049 16.8288 6.4193 16.7456C6.4193 16.6602 6.51574 16.5911 6.63833 16.5887C6.76007 16.5865 6.86007 16.6545 6.86007 16.7382L6.8599 16.7383ZM7.64059 16.6056C7.65519 16.6879 7.57047 16.7726 7.44941 16.7952C7.33056 16.8173 7.22019 16.766 7.20491 16.6843C7.19031 16.5998 7.27656 16.5151 7.39541 16.4932C7.51664 16.4723 7.62531 16.522 7.64059 16.6057V16.6056Z\"\n fill=\"#181616\"\n />\n </Icon>\n);\n","import { EmailIcon } from \"@chakra-ui/icons\";\nimport { Button, Link, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent, ReactNode } from \"react\";\nimport { ExternalLink } from \"../../components/ExternalLink\";\nimport { GithubIcon } from \"../../icons/GithubIcon\";\nimport { usePackageState } from \"./PackageState\";\nimport testIds from \"./testIds\";\n\nconst iconProps = {\n h: 5,\n ml: 2,\n w: 5,\n};\n\nexport const FeedbackLinks: FunctionComponent = () => {\n const state = usePackageState();\n const metadata = state.metadata.data;\n const assembly = state.assembly.data;\n\n if (!(assembly && metadata)) return null;\n\n const repo = assembly?.repository ?? {};\n\n let repoLink: ReactNode = null;\n\n if (repo.type === \"git\") {\n let repoUrl = repo.url?.endsWith(\".git\")\n ? repo.url.replace(\".git\", \"\")\n : repo.url;\n\n if (repoUrl.endsWith(\"/\")) {\n repoUrl = repoUrl.slice(0, repoUrl.length - 1);\n }\n\n repoLink = (\n <Button\n as={ExternalLink}\n color=\"black\"\n data-testid={testIds.githubLink}\n hasIcon={false}\n href={`${repoUrl}/issues`}\n rightIcon={<GithubIcon {...iconProps} />}\n variant=\"solid\"\n >\n Provide Feedback\n </Button>\n );\n }\n\n return (\n <Stack\n align=\"center\"\n borderTop=\"1px solid\"\n borderTopColor=\"blue.50\"\n color=\"blue.500\"\n data-testid={testIds.feedbackLinks}\n direction={{ base: \"column\", md: \"row\" }}\n justify=\"space-evenly\"\n mx={8}\n py={10}\n spacing={4}\n >\n <Button\n as={Link}\n colorScheme=\"blue\"\n data-testid={testIds.reportLink}\n href={`mailto:abuse@amazonaws.com?subject=${encodeURIComponent(\n `ConstructHub - Report of abusive package: ${assembly?.name}`\n )}`}\n rightIcon={<EmailIcon {...iconProps} />}\n >\n Report this package\n </Button>\n\n {repoLink}\n </Stack>\n );\n};\n","import { ChevronDownIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Box, Flex, IconButton, Text, useDisclosure } from \"@chakra-ui/react\";\nimport { FunctionComponent, useMemo, ReactNode } from \"react\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface NavItemConfig {\n children: NavItemConfig[];\n title: string;\n path?: string;\n}\n\nexport interface NavItemProps extends NavItemConfig {\n // The following props don't need to be explicitly defined - they are passed internally\n onOpen?: () => void;\n level: number;\n}\n\nexport interface NavTreeProps {\n /**\n * Items to render\n */\n items: NavItemConfig[];\n}\n\nconst iconProps = {\n color: \"gray.900\",\n h: 4,\n w: 4,\n};\n\ninterface NavItemWrapperProps {\n path?: string;\n title: string;\n showToggle: boolean;\n children: ReactNode;\n}\n\nconst NavItemWrapper: FunctionComponent<NavItemWrapperProps> = ({\n children,\n path,\n title,\n showToggle,\n}) => {\n const sharedProps = {\n _hover: { bg: \"rgba(0, 124, 253, 0.05)\" },\n overflow: \"hidden\",\n pl: 1,\n py: showToggle ? 2 : 1,\n marginLeft: showToggle ? 0 : 1,\n fontWeight: showToggle ? \"bold\" : undefined,\n textOverflow: \"ellipsis\",\n w: \"100%\",\n };\n\n return path ? (\n <NavLink title={title} to={path} {...sharedProps}>\n {children}\n </NavLink>\n ) : (\n <Text {...sharedProps}>{children}</Text>\n );\n};\n\nexport const NavItem: FunctionComponent<NavItemProps> = ({\n children,\n title,\n path,\n level,\n onOpen,\n}) => {\n const linkIsActive = false;\n const defaultIsOpen = level < 2; // only show first two levels by default\n const disclosure = useDisclosure({ onOpen, defaultIsOpen });\n\n const showToggle = (children?.length ?? 0) > 0;\n const showChildren = disclosure.isOpen && showToggle;\n\n const nestedItems = useMemo(\n () =>\n children?.map((item, idx) => {\n return (\n <NavItem\n {...item}\n key={idx}\n level={level + 1}\n onOpen={disclosure.onOpen}\n />\n );\n }),\n [children, disclosure.onOpen, level]\n );\n\n return (\n <Flex direction=\"column\">\n <Flex align=\"center\" color={linkIsActive ? \"blue.500\" : \"gray.800\"}>\n {showToggle && (\n <IconButton\n aria-label=\"expand-toggle\"\n borderRadius=\"md\"\n h={4}\n icon={\n disclosure.isOpen ? (\n <ChevronDownIcon {...iconProps} />\n ) : (\n <ChevronRightIcon {...iconProps} />\n )\n }\n ml={-1}\n onClick={disclosure.onToggle}\n size=\"xs\"\n variant=\"link\"\n w={0}\n />\n )}\n <NavItemWrapper path={path} showToggle={showToggle} title={title}>\n {title}\n </NavItemWrapper>\n </Flex>\n <Box\n _before={{\n // Creates a border without taking up any box space\n // This is important to keep items perfectly aligned\n bg: \"gray.100\",\n bottom: 0,\n content: `\"\"`,\n left: 0,\n position: \"absolute\",\n top: 0,\n w: \"1px\",\n }}\n display={showChildren ? \"initial\" : \"none\"}\n ml={2}\n mr={2}\n pl={2}\n position=\"relative\"\n >\n {nestedItems}\n </Box>\n </Flex>\n );\n};\n\nexport const NavTree: FunctionComponent<NavTreeProps> = ({ items }) => {\n return (\n <Flex direction=\"column\" maxWidth=\"100%\">\n {items.map((item, idx) => {\n return <NavItem {...item} key={idx} level={0} onOpen={undefined} />;\n })}\n </Flex>\n );\n};\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport {\n InputGroup,\n InputLeftElement,\n Input,\n forwardRef,\n} from \"@chakra-ui/react\";\nimport { FormEventHandler, useState } from \"react\";\nimport { Form } from \"../../../components/Form\";\nimport { useDebounce } from \"../../../hooks/useDebounce\";\n\nexport interface SearchInputProps {\n value: string;\n onChange: (s: string) => void;\n onSubmit: FormEventHandler<HTMLFormElement>;\n}\n\nexport const SearchInput = forwardRef<SearchInputProps, \"input\">(\n ({ value, onChange, onSubmit }, inputRef) => {\n const [inputValue, setInputValue] = useState(value);\n\n useDebounce(inputValue, { onChange });\n\n return (\n <Form data-testid=\"choose-submodule-search-form\" onSubmit={onSubmit}>\n <InputGroup>\n <InputLeftElement>\n <SearchIcon color=\"gray.400\" />\n </InputLeftElement>\n <Input\n data-testid=\"choose-submodule-search-input\"\n onChange={(e) => setInputValue(e.target.value)}\n placeholder=\"Search\"\n ref={inputRef}\n value={inputValue}\n variant=\"filled\"\n />\n </InputGroup>\n </Form>\n );\n }\n);\n\nSearchInput.displayName = \"SearchInput\";\n","import {\n Box,\n Divider,\n Modal,\n ModalHeader,\n ModalContent,\n ModalCloseButton,\n ModalBody,\n ModalOverlay,\n UnorderedList,\n} from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n useCallback,\n useRef,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { SearchItem } from \"../../../components/SearchItem\";\nimport { SearchInput } from \"./SearchInput\";\n\nexport interface SearchModalProps {\n inputValue: string;\n isOpen: boolean;\n onClose: () => void;\n onInputChange: (s: string) => void;\n submodules: { name: string; to: string }[];\n}\n\nexport const SearchModal: FunctionComponent<SearchModalProps> = ({\n inputValue,\n isOpen,\n onClose,\n onInputChange,\n submodules,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { push } = useHistory();\n\n const navigate = useCallback(\n (to: string) => {\n onClose();\n push(to);\n },\n [onClose, push]\n );\n\n const onSubmit = useCallback<FormEventHandler<HTMLFormElement>>(\n (e) => {\n e.preventDefault();\n\n if (!submodules.length) return;\n const { to } = submodules[0];\n navigate(to);\n },\n [navigate, submodules]\n );\n\n return (\n <Modal initialFocusRef={inputRef} isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent mx={4}>\n <ModalCloseButton data-testid=\"choose-submodule-modal-close\" />\n <ModalHeader\n data-testid=\"choose-submodule-modal-header\"\n fontSize=\"lg\"\n fontWeight=\"bold\"\n >\n Choose a submodule\n </ModalHeader>\n <ModalBody data-testid=\"choose-submodule-modal-body\" p={0}>\n <Box pb={4} px={4}>\n <SearchInput\n onChange={onInputChange}\n onSubmit={onSubmit}\n ref={inputRef}\n value={inputValue}\n />\n </Box>\n <Divider />\n <UnorderedList\n data-testid=\"choose-submodule-modal-results\"\n m={0}\n maxH=\"50vh\"\n overflow=\"hidden auto\"\n p={0}\n role=\"listbox\"\n tabIndex={-1}\n >\n {submodules.map(({ name, to }) => (\n <SearchItem\n data-testid=\"choose-submodule-result\"\n key={name}\n name={name}\n onClick={() => navigate(to)}\n />\n ))}\n </UnorderedList>\n </ModalBody>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n );\n};\n","import { ArrowBackIcon, ChevronDownIcon } from \"@chakra-ui/icons\";\nimport { Button, Divider, Stack, useDisclosure } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent, useCallback, useMemo, useState } from \"react\";\nimport { useHistory, useLocation } from \"react-router-dom\";\nimport { QUERY_PARAMS } from \"../../../constants/url\";\nimport { useQueryParams } from \"../../../hooks/useQueryParams\";\nimport { SearchModal } from \"./SearchModal\";\n\nexport interface ChooseSubmoduleProps {\n assembly?: Assembly;\n}\n\nexport const ChooseSubmodule: FunctionComponent<ChooseSubmoduleProps> = ({\n assembly,\n}) => {\n const { pathname } = useLocation();\n const { push } = useHistory();\n const query = useQueryParams();\n\n const allSubmodules = Object.keys(assembly?.submodules ?? {});\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n const currentSubmodule = query.get(QUERY_PARAMS.SUBMODULE);\n const submoduleText = currentSubmodule\n ? `Submodule: ${currentSubmodule}`\n : \"Choose Submodule\";\n\n const [filter, setFilter] = useState(\"\");\n\n const onGoBack = () => {\n const lang = query.get(QUERY_PARAMS.LANGUAGE);\n push(`${pathname}${lang ? `?${QUERY_PARAMS.LANGUAGE}=${lang}` : \"\"}`);\n };\n\n const getUrl = useCallback(\n (submoduleName: string) => {\n const params = new URLSearchParams(query.toString());\n params.set(\"submodule\", submoduleName);\n return `${pathname}?${params}`;\n },\n [pathname, query]\n );\n\n const submodules = useMemo(() => {\n let results = allSubmodules;\n\n if (filter) {\n results = results.filter((fqn) =>\n fqn.toLowerCase().includes(filter.toLowerCase())\n );\n }\n\n return results.map((fqn) => {\n const name = fqn.split(\".\")[1];\n return {\n name,\n to: getUrl(name),\n };\n });\n }, [allSubmodules, filter, getUrl]);\n\n if (allSubmodules.length === 0) {\n return null;\n }\n\n return (\n <Stack spacing={4} w=\"100%\">\n {currentSubmodule && (\n <>\n <Button\n borderRadius=\"none\"\n data-testid=\"choose-submodule-go-back\"\n leftIcon={<ArrowBackIcon aria-label=\"Back to construct root\" />}\n onClick={onGoBack}\n title=\"Back to construct root\"\n variant=\"link\"\n >\n {assembly?.name}\n </Button>\n <Divider />\n </>\n )}\n <Button\n borderRadius=\"none\"\n color=\"blue.500\"\n data-testid=\"choose-submodule-search-trigger\"\n flexGrow={1}\n onClick={onOpen}\n rightIcon={<ChevronDownIcon />}\n title=\"Choose Submodule\"\n variant=\"link\"\n >\n {submoduleText}\n </Button>\n <SearchModal\n inputValue={filter}\n isOpen={isOpen}\n onClose={onClose}\n onInputChange={setFilter}\n submodules={submodules}\n />\n </Stack>\n );\n};\n","import { CopyIcon, CheckIcon } from \"@chakra-ui/icons\";\nimport {\n forwardRef,\n IconButton,\n IconButtonProps,\n useClipboard,\n} from \"@chakra-ui/react\";\n\nexport interface CopyButtonProps extends Omit<IconButtonProps, \"aria-label\"> {\n // Optional since we set a default\n \"aria-label\"?: string;\n value: string;\n}\n\nexport const CopyButton = forwardRef<CopyButtonProps, \"button\">(\n ({ value, ...btnProps }, ref) => {\n const { hasCopied, onCopy } = useClipboard(value);\n\n return (\n <IconButton\n aria-label=\"Copy Button\"\n color=\"blue.500\"\n colorScheme=\"blue\"\n h={6}\n icon={hasCopied ? <CheckIcon color=\"green.300\" /> : <CopyIcon />}\n minW=\"auto\"\n ml={1}\n onClick={onCopy}\n ref={ref}\n variant=\"ghost\"\n w={6}\n {...btnProps}\n />\n );\n }\n);\n\nCopyButton.displayName = \"CopyButton\";\n","import { Box, Flex } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { CopyButton } from \"../CopyButton\";\nimport type { RendererProps } from \"./types\";\n\nexport const MultiLineRenderer: FunctionComponent<RendererProps> = ({\n code,\n tokens,\n getLineProps,\n getTokenProps,\n}) => (\n <>\n <Flex\n align=\"center\"\n bg=\"rgba(0, 124, 253, 0.15)\"\n borderTopRadius=\"md\"\n justify=\"flex-end\"\n px={2}\n py={1}\n >\n <CopyButton value={code} />\n </Flex>\n <Box overflowX=\"auto\" p={2}>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line, key: i })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token, key })} />\n ))}\n </div>\n ))}\n </Box>\n </>\n);\n","import { Box, Flex, Grid } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { CopyButton } from \"../CopyButton\";\nimport type { RendererProps } from \"./types\";\n\nexport const SingleLineRenderer: FunctionComponent<RendererProps> = ({\n code,\n tokens,\n getLineProps,\n getTokenProps,\n}) => (\n <Grid p={3} templateColumns=\"1fr min-content\" w=\"full\">\n <Box m={-3} maxW=\"full\" overflow=\"auto\" p={3}>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line, key: i })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token, key })} />\n ))}\n </div>\n ))}\n </Box>\n <Flex align=\"center\" ml={1}>\n <CopyButton value={code} />\n </Flex>\n </Grid>\n);\n","import { Box, BoxProps } from \"@chakra-ui/react\";\nimport Highlight, { defaultProps, Language } from \"prism-react-renderer\";\nimport nightOwlLight from \"prism-react-renderer/themes/nightOwlLight\";\nimport { FunctionComponent } from \"react\";\nimport { MultiLineRenderer } from \"./MultiLineRenderer\";\nimport { SingleLineRenderer } from \"./SingleLineRenderer\";\n\nexport interface CodeProps extends BoxProps {\n code: string;\n language: Language;\n}\n\nexport const Code: FunctionComponent<CodeProps> = ({\n code,\n language,\n ...boxProps\n}) => {\n return (\n <Highlight\n {...defaultProps}\n code={code}\n language={language}\n theme={nightOwlLight}\n >\n {(props) => (\n <Box\n as=\"pre\"\n border=\"base\"\n borderRadius=\"md\"\n boxShadow=\"base\"\n className={props.className}\n style={props.style}\n {...boxProps}\n >\n {props.tokens.length > 1 ? (\n <MultiLineRenderer {...props} code={code} />\n ) : (\n <SingleLineRenderer {...props} code={code} />\n )}\n </Box>\n )}\n </Highlight>\n );\n};\n","import { Heading, As } from \"@chakra-ui/react\";\nimport { Children, FunctionComponent, ReactNode } from \"react\";\nimport ReactDOMServer from \"react-dom/server\";\nimport { sanitize } from \"../../util/sanitize-anchor\";\nimport { NavLink } from \"../NavLink\";\n\ninterface HeadingResolverProps {\n level: number;\n children: ReactNode;\n}\n\nexport const Headings: FunctionComponent<HeadingResolverProps> = ({\n level,\n children,\n}) => {\n const size: string = [\"2xl\", \"xl\", \"lg\", \"md\", \"sm\", \"xs\"][level - 1];\n const elem = `h${level}` as As<any>;\n\n // Use DOMParser to look for data attribute for link ID\n const parser = new DOMParser();\n const doc = parser.parseFromString(\n ReactDOMServer.renderToStaticMarkup(children as React.ReactElement),\n \"text/html\"\n );\n\n const dataElement = doc.querySelector(\n \"span[data-heading-title][data-heading-id]\"\n ) as HTMLElement;\n const title =\n dataElement?.dataset.headingTitle ??\n Children.toArray(children)\n .reduce((accum: string, child): string => {\n if (typeof child === \"string\") {\n return `${accum}${child}`;\n }\n return accum;\n }, \"\")\n .trim();\n\n const id = dataElement?.dataset.headingId ?? sanitize(title);\n\n return (\n <>\n <Heading\n as={elem}\n backgroundColor={level === 5 ? \"gray.50\" : undefined}\n borderBottom=\"1px solid\"\n borderBottomColor=\"gray.100\"\n color=\"gray.800\"\n level={level}\n marginBottom={4}\n marginTop={level >= 4 ? \"1.5em\" : 4}\n paddingBottom={2}\n paddingTop={2}\n paddingX={level >= 4 ? 2 : undefined}\n size={size}\n >\n <NavLink\n data-heading-id={id}\n data-heading-level={level}\n data-heading-title={title}\n id={id}\n replace\n sx={{ \"> code\": { color: \"blue.800\", fontSize: \"inherit\" } }}\n to={`#${id}`}\n >\n {children}\n </NavLink>\n </Heading>\n </>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"markdown\", [\"container\"] as const);\n","import { Box } from \"@chakra-ui/react\";\nimport { Assembly } from \"@jsii/spec\";\nimport githubSchema from \"hast-util-sanitize/lib/github.json\";\nimport { FunctionComponent } from \"react\";\nimport ReactMarkdown, {\n PluggableList,\n ReactMarkdownOptions,\n} from \"react-markdown\";\nimport type { TableCellComponent } from \"react-markdown/src/ast-to-react\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport remarkEmoji from \"remark-emoji\";\nimport remarkGfm from \"remark-gfm\";\nimport { Code } from \"./Code\";\nimport { Headings } from \"./Headings\";\nimport { Hr } from \"./Hr\";\nimport { Img } from \"./Img\";\nimport { Ul, Ol, Li } from \"./List\";\nimport { Table, Thead, Tbody, Tfoot, Tr, Th, Td, TableCaption } from \"./Table\";\nimport testIds from \"./testIds\";\nimport { A, Blockquote, Em, P, Pre, Sup } from \"./Text\";\n\nconst components: ReactMarkdownOptions[\"components\"] = {\n a: A,\n blockquote: Blockquote,\n caption: TableCaption,\n code: Code,\n em: Em,\n h1: Headings,\n h2: Headings,\n h3: Headings,\n h4: Headings,\n h5: Headings,\n h6: Headings,\n hr: Hr,\n img: Img,\n li: Li,\n ol: Ol,\n p: P,\n pre: Pre,\n sup: Sup,\n table: Table,\n tbody: Tbody,\n td: Td as TableCellComponent, // The react-markdown component has a tighter signature than the one from @chakra-ui\n tfoot: Tfoot,\n th: Th as TableCellComponent, // The react-markdown component has a tighter signature than the one from @chakra-ui\n thead: Thead,\n tr: Tr,\n ul: Ul,\n};\n\n// see below comment\nconst ghSchema: typeof githubSchema & { attributes: { span?: any } } = {\n ...githubSchema,\n};\n\n// jsii-docgen adds these attributes to <span> elements embedded inside\n// headings in order to configure custom anchor ids.\n// tell rehype not to strip those out.\nghSchema.attributes.span = (ghSchema.attributes.span ?? []).concat([\n \"dataHeadingTitle\",\n \"dataHeadingId\",\n]);\n\n// Note - the default schema for rehypeSanitize is GitHub-style, which is what we need!\nconst rehypePlugins: PluggableList = [\n [rehypeRaw],\n // ALWAYS keep rehypeSanitize LAST!\n [rehypeSanitize, ghSchema],\n];\nconst remarkPlugins = [remarkGfm, remarkEmoji];\n\nconst GITHUB_REPO_REGEX =\n /^(?:(?:git@)?github\\.com:|(?:https?:\\/\\/)github\\.com\\/)([^/]+)\\/([^/]+)(?:\\.git)?$/;\n\n/**\n * Parses out a GitHub repository owner and repo name from the `repository`\n * configuration of a jsii Assembly.\n *\n * @returns the `owner` and `repo` for the configured repository, if it looks\n * like a GitHub repository URL.\n */\nconst parseGitHubRepository = ({ type, url }: Assembly[\"repository\"]) => {\n if (type !== \"git\") {\n return undefined;\n }\n // git@github.com:<owner>/<repo>.git\n // https://github.com/<owner>/<repo>.git\n const match = GITHUB_REPO_REGEX.exec(url);\n if (match == null) {\n return undefined;\n }\n\n const [, owner, repo] = match;\n return { owner, repo };\n};\n\nexport const Markdown: FunctionComponent<{\n children: string;\n repository: Assembly[\"repository\"];\n}> = ({ children, repository }) => {\n const repoConfig = parseGitHubRepository(repository);\n\n const toAbsoluteUri = (githubPrefix: string, githubSuffix = \"HEAD\") =>\n repoConfig == null\n ? ReactMarkdown.uriTransformer\n : (uri: string) => {\n const url = ReactMarkdown.uriTransformer(uri);\n\n // If this is an anchor or absolute URL, return it.\n const [first] = url;\n if (first === \"#\" || first === \"/\") {\n return url;\n }\n\n // If there is a protocol element, then return the URL as-is.\n if (url.includes(\"://\")) {\n return url;\n }\n\n const owner = repoConfig.owner;\n const repo = repoConfig.repo.replace(/\\.git$/, \"\");\n return `https://${githubPrefix}/${owner}/${repo}/${githubSuffix}/${url}`;\n };\n\n return (\n <Box data-testid={testIds.container} px={8}>\n <ReactMarkdown\n components={components}\n rehypePlugins={rehypePlugins}\n remarkPlugins={remarkPlugins}\n transformImageUri={toAbsoluteUri(\"raw.githubusercontent.com\")}\n transformLinkUri={toAbsoluteUri(\"github.com\", \"blob/HEAD\")}\n >\n {children}\n </ReactMarkdown>\n </Box>\n );\n};\n","import { Box, HTMLChakraProps, Link, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../ExternalLink\";\n\ntype AnchorComponent = FunctionComponent<HTMLChakraProps<\"a\">>;\n\nexport const A: AnchorComponent = ({ children, href, ...linkProps }) => {\n let Component: AnchorComponent = Link;\n\n try {\n if (href && href.startsWith(\"http\")) {\n const hostname = new URL(href).hostname;\n\n if (hostname !== window.location.hostname) {\n const External: AnchorComponent = (props) => (\n <ExternalLink {...props} />\n );\n\n Component = External;\n }\n }\n } catch {\n Component = Link;\n }\n\n return (\n <Component\n color=\"blue.500\"\n href={href}\n // If we are rendering an img within the link (specifically stability banners),\n // do not display the external link Icon\n sx={{ \"> img + svg\": { display: \"none\" } }}\n {...linkProps}\n >\n {children}\n </Component>\n );\n};\n\nexport const Blockquote: FunctionComponent = ({ children }) => (\n <Box\n as=\"blockquote\"\n borderLeft=\"5px solid\"\n borderLeftColor=\"gray.100\"\n marginX=\"2\"\n px=\"2\"\n wordBreak=\"break-word\"\n >\n {children}\n </Box>\n);\n\nexport const Em: FunctionComponent = ({ children }) => (\n <Box as=\"em\" fontStyle=\"normal\" fontWeight=\"bold\">\n {children}\n </Box>\n);\n\nexport const P: FunctionComponent = ({ children }) => (\n <Text lineHeight=\"1.5\" mx={2} my={4}>\n {children}\n </Text>\n);\n\nexport const Pre: FunctionComponent = ({ children }) => (\n <Box as=\"pre\">{children}</Box>\n);\n\nexport const Sup: FunctionComponent = ({ children }) => {\n let color: string | undefined = undefined;\n let text = \"\";\n\n if (Array.isArray(children)) {\n const [first] = children;\n\n if (typeof first === \"string\") {\n text = first;\n }\n }\n\n if (text === \"Required\") {\n color = \"orange.700\";\n } else if (text === \"Optional\") {\n color = \"green.700\";\n }\n\n return (\n <Box as=\"sup\" color={color} fontSize=\"xs\" ml={-1} top={-1}>\n {children}\n </Box>\n );\n};\n","import { Code as InlineCode } from \"@chakra-ui/react\";\nimport { Language } from \"prism-react-renderer\";\nimport { Children, FunctionComponent, ReactNode } from \"react\";\nimport { Code as BlockCode } from \"../Code\";\n\ninterface CodeProps {\n inline?: boolean;\n children: ReactNode;\n language?: Language;\n}\n\nexport const Code: FunctionComponent<CodeProps> = ({\n inline,\n children,\n language = \"typescript\",\n}) => {\n if (inline) {\n return (\n <InlineCode\n bg=\"gray.50\"\n border=\"1px solid\"\n borderColor=\"gray.50\"\n borderRadius=\"md\"\n marginTop=\"md\"\n mx={2}\n px={2}\n py={0}\n >\n {children}\n </InlineCode>\n );\n }\n\n const code = Children.toArray(children)\n .reduce((accum: string, child): string => {\n if (typeof child === \"string\") {\n return `${accum}${child}`;\n }\n return accum;\n }, \"\")\n .trim();\n\n return <BlockCode code={code} language={language} />;\n};\n","import { DividerProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\n// HRs are abused in API reference docs so a temporary hack is to simply filter\n// them out until we remove them from the generated docs.\nexport const Hr: FunctionComponent<DividerProps> = () => <></>;\n","import { Image, ImageProps } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nexport const Img: FunctionComponent<ImageProps> = (props) => (\n <Image display=\"inline-block\" {...props} />\n);\n","import { UnorderedList, OrderedList, ListItem } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const Ul: FunctionComponent = ({ children }) => (\n <UnorderedList marginTop={2} padding={0}>\n {children}\n </UnorderedList>\n);\n\nexport const Ol: FunctionComponent = ({ children }) => (\n <OrderedList>{children}</OrderedList>\n);\n\nexport const Li: FunctionComponent = ({ children }) => (\n <ListItem\n lineHeight=\"tall\"\n marginX={2}\n // mb={0}\n sx={{\n \"em:first-of-type\": {\n fontSize: \"small\",\n },\n \"&::marker\": {\n color: \"gray.400\",\n },\n code: {\n fontSize: \"small\",\n },\n }}\n >\n {children}\n </ListItem>\n);\n","import {\n Box,\n Table as ChakraTable,\n Thead,\n Tbody,\n Tfoot,\n Tr,\n Th,\n Td,\n TableCaption,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nconst Table: FunctionComponent = ({ children }) => (\n <Box maxW=\"100%\" overflowX=\"auto\">\n <ChakraTable variant=\"striped\">{children}</ChakraTable>\n </Box>\n);\n\nexport { Table, Tfoot, Tbody, Td, Thead, Tr, Th, TableCaption };\n","import { FunctionComponent } from \"react\";\nimport { Markdown } from \"../../components/Markdown\";\nimport { usePackageState } from \"./PackageState\";\n\nexport const PackageReadme: FunctionComponent = () => {\n const {\n isLoadingDocs,\n readme,\n assembly: { data: assembly },\n } = usePackageState();\n\n if (isLoadingDocs || !readme || !assembly) {\n return null;\n }\n\n return <Markdown repository={assembly.repository}>{readme}</Markdown>;\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../../components/ExternalLink\";\nimport { CONSTRUCT_HUB_REPO_URL } from \"../../constants/links\";\nimport { usePackageState } from \"./PackageState\";\n\nexport const PackageDocsError: FunctionComponent = () => {\n const { language } = usePackageState();\n\n const issueLink = (\n <ExternalLink href={`${CONSTRUCT_HUB_REPO_URL}/issues/new`}>\n issue\n </ExternalLink>\n );\n return (\n <Text\n align=\"center\"\n fontSize=\"xl\"\n fontStyle=\"oblique\"\n px={4}\n wordBreak=\"break-word\"\n >\n Documentation in {language} is still not ready for this package. Come back\n soon. If this issue persists, please let us know by creating an{\" \"}\n {issueLink}.\n </Text>\n );\n};\n","import { Heading } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { Markdown } from \"../../components/Markdown\";\nimport { PackageDocsError } from \"./PackageDocsError\";\nimport { usePackageState } from \"./PackageState\";\n\nconst usePackageTypeDocs = () => {\n const { typeId }: { typeId?: string } = useParams();\n const { apiReference } = usePackageState();\n\n if (typeId) {\n return apiReference?.[typeId];\n }\n return;\n};\n\nexport const PackageTypeDocs: FunctionComponent = () => {\n const {\n isLoadingDocs,\n assembly: { data: assembly },\n } = usePackageState();\n const docs = usePackageTypeDocs();\n\n if (isLoadingDocs) {\n return null;\n } else if (!docs || !assembly) {\n return <PackageDocsError />;\n }\n const { title, content } = docs;\n\n return (\n <>\n <Heading as=\"h2\" p={8} size=\"2xl\">\n {title}\n </Heading>\n <Markdown repository={assembly.repository}>{content}</Markdown>\n </>\n );\n};\n","import { Box, Flex, Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { Route, Switch, useRouteMatch, useLocation } from \"react-router-dom\";\nimport { NavTree } from \"../../components/NavTree\";\nimport { ChooseSubmodule } from \"./ChooseSubmodule\";\nimport { PackageReadme } from \"./PackageReadme\";\nimport { usePackageState } from \"./PackageState\";\nimport { PackageTypeDocs } from \"./PackageTypeDocs\";\n\n// We want the nav to be sticky, but it should account for the sticky heading as well, which is 72px\nconst TOP_OFFSET = \"4.5rem\";\n\nconst SubmoduleSelector: FunctionComponent = () => {\n const {\n assembly: { data },\n } = usePackageState();\n\n return Object.keys(data?.submodules ?? {}).length > 0 ? (\n <Flex\n borderBottom=\"1px solid\"\n borderColor=\"blue.50\"\n justify=\"center\"\n py={4}\n >\n <ChooseSubmodule assembly={data} />\n </Flex>\n ) : null;\n};\nexport const PackageDocs: FunctionComponent = () => {\n const { path } = useRouteMatch();\n const { menuItems } = usePackageState();\n\n const { hash } = useLocation();\n useEffect(() => {\n if (hash) {\n const target = document.querySelector(`${hash}`) as HTMLElement;\n target?.scrollIntoView(true);\n } else {\n window.scrollTo(0, 0);\n }\n });\n\n return (\n <Grid\n bg=\"white\"\n columnGap={4}\n h=\"100%\"\n templateColumns={{ base: \"1fr\", md: \"1fr 3fr\" }}\n width=\"100%\"\n >\n <Flex\n alignSelf=\"stretch\"\n borderRight=\"1px solid\"\n borderRightColor=\"blue.50\"\n direction=\"column\"\n display={{ base: \"none\", md: \"flex\" }}\n maxHeight={`calc(100vh - ${TOP_OFFSET})`}\n overflow=\"hidden auto\"\n pl={6}\n position=\"sticky\"\n pr={4}\n top={TOP_OFFSET}\n >\n <SubmoduleSelector />\n <Box overflowY=\"auto\" py={4}>\n <NavTree items={menuItems} />\n </Box>\n </Flex>\n <Box\n h=\"max-content\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n py={4}\n sx={{\n a: {\n scrollMarginTop: TOP_OFFSET,\n },\n }}\n >\n <Switch>\n <Route exact path={path}>\n <PackageReadme />\n </Route>\n <Route exact path={`${path}/api/:typeId`}>\n <PackageTypeDocs />\n </Route>\n </Switch>\n </Box>\n </Grid>\n );\n};\n","import { IconButton, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n TEMP_SUPPORTED_LANGUAGES,\n LANGUAGE_RENDER_MAP,\n LANGUAGES,\n} from \"../../constants/languages\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nexport interface LanguageBarProps {\n targetLanguages: readonly Language[];\n selectedLanguage: Language;\n setSelectedLanguage: (lang: Language) => void;\n}\n\nexport const LanguageBar: FunctionComponent<LanguageBarProps> = ({\n targetLanguages,\n selectedLanguage,\n setSelectedLanguage,\n}) => {\n return (\n <Stack\n align=\"center\"\n data-testid=\"language-bar\"\n direction=\"row\"\n spacing={2}\n >\n {[...targetLanguages]\n .sort(\n (left, right) => LANGUAGES.indexOf(left) - LANGUAGES.indexOf(right)\n )\n .map((language: Language) => {\n const isDisabled = !TEMP_SUPPORTED_LANGUAGES.has(language);\n const isSelected = language === selectedLanguage;\n\n const { icon: LangIcon } = LANGUAGE_RENDER_MAP[language];\n\n const onClick = () => {\n if (isSelected) return;\n setSelectedLanguage(language);\n };\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n <IconButton\n aria-label={`Select ${language} icon`}\n border={isSelected ? \"1px solid\" : \"none\"}\n borderColor=\"blue.500\"\n borderRadius=\"lg\"\n boxShadow=\"base\"\n colorScheme=\"blue\"\n cursor={isDisabled ? \"not-allowed\" : \"pointer\"}\n data-testid={`language-${language}`}\n disabled={isDisabled}\n icon={\n <LangIcon\n aria-label={`${language}-icon`}\n borderRadius=\"sm\"\n height={[4, 5, 6]}\n width={[4, 5, 6]}\n />\n }\n onClick={onClick}\n p={1}\n variant=\"outline\"\n w=\"max-content\"\n />\n </LanguageSupportTooltip>\n );\n })}\n </Stack>\n );\n};\n","import { FunctionComponent, useEffect } from \"react\";\nimport { LanguageBar } from \"../../../components/LanguageBar\";\nimport { Language, LANGUAGES } from \"../../../constants/languages\";\nimport { useLanguage } from \"../../../hooks/useLanguage\";\nimport { usePackageState } from \"../PackageState\";\n\nconst languageSet = new Set(LANGUAGES);\n\nexport const LanguageSelection: FunctionComponent = () => {\n const state = usePackageState();\n const assembly = state.assembly.data;\n const language = state.language;\n\n const [, setLanguage] = useLanguage({\n updateSaved: true,\n updateUrl: true,\n });\n\n const [, changeLanguage] = useLanguage({ updateUrl: true });\n\n const targets = [\n ...Object.keys(assembly?.targets ?? {}),\n // typescript is the source language and hence always supported.\n // (it doesn't appear in spec.targets)\n Language.TypeScript,\n ] as Language[];\n\n const selectedIsValid = targets.includes(language);\n\n useEffect(() => {\n if (!selectedIsValid) {\n changeLanguage(Language.TypeScript);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedIsValid]);\n\n const props = {\n selectedLanguage: selectedIsValid ? language : Language.TypeScript,\n setSelectedLanguage: setLanguage,\n targetLanguages: targets.filter((target) => languageSet.has(target)),\n };\n\n return <LanguageBar {...props} />;\n};\n","const OS_ORG_LINK = \"https://opensource.org/licenses\";\n\nexport const LICENSE_LINKS = {\n \"Apache-2.0\": `${OS_ORG_LINK}/apache2.0.php`,\n \"BSD-2-Clause\": `${OS_ORG_LINK}/bsd-license.php`,\n MIT: `${OS_ORG_LINK}/mit-license.php`,\n} as const;\n","import { forwardRef } from \"@chakra-ui/react\";\nimport { ExternalLink, ExternalLinkProps } from \"../ExternalLink\";\nimport { LICENSE_LINKS } from \"./constants\";\n\nexport interface LicenseLinkOptions {\n license: keyof typeof LICENSE_LINKS;\n}\n\nexport interface LicenseLinkProps\n extends ExternalLinkProps,\n LicenseLinkOptions {}\n\nexport const LicenseLink = forwardRef<LicenseLinkProps, \"a\">(\n ({ license, ...linkProps }, ref) => {\n const url = LICENSE_LINKS[license];\n\n return (\n <ExternalLink href={url} ref={ref} {...linkProps}>\n {license}\n </ExternalLink>\n );\n }\n);\n\nLicenseLink.displayName = \"LicenseLink\";\n","import { ChevronDownIcon, ChevronUpIcon } from \"@chakra-ui/icons\";\nimport { Button, ButtonProps } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\ninterface ToggleButtonProps extends ButtonProps {\n isOpen: boolean;\n openText: string;\n closeText: string;\n}\n\nexport const ToggleButton: FunctionComponent<ToggleButtonProps> = ({\n openText,\n closeText,\n isOpen,\n ...buttonProps\n}) => (\n <Button\n colorScheme=\"blue\"\n leftIcon={isOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}\n variant=\"link\"\n {...buttonProps}\n >\n {isOpen ? closeText : openText}\n </Button>\n);\n","import { DownloadIcon } from \"@chakra-ui/icons\";\nimport {\n Box,\n Collapse,\n Stack,\n StackProps,\n Text,\n Tooltip,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { Assembly } from \"@jsii/spec\";\nimport { Fragment, FunctionComponent, ReactNode } from \"react\";\nimport { PackageLinkConfig } from \"../../../api/config\";\nimport { Metadata } from \"../../../api/package/metadata\";\nimport { PackageStats } from \"../../../api/stats\";\nimport { ExternalLink } from \"../../../components/ExternalLink\";\nimport { LicenseLink, LICENSE_LINKS } from \"../../../components/LicenseLink\";\nimport { NavLink } from \"../../../components/NavLink\";\nimport { Time } from \"../../../components/Time\";\nimport { useStats } from \"../../../contexts/Stats\";\nimport { useConfigValue } from \"../../../hooks/useConfigValue\";\nimport { getRepoUrlAndHost, getSearchPath } from \"../../../util/url\";\nimport { usePackageState } from \"../PackageState\";\nimport { ToggleButton } from \"./ToggleButton\";\n\ninterface DetailsProps extends StackProps {}\n\nconst WithLabel: FunctionComponent<{ label: ReactNode; tooltip?: string }> = ({\n children,\n label,\n tooltip,\n}) => (\n <Tooltip hasArrow isDisabled={!tooltip} label={tooltip} placement=\"left\">\n <Text fontWeight=\"bold\">\n {label}{\" \"}\n <Box as=\"span\" fontWeight=\"normal\">\n {children}\n </Box>\n </Text>\n </Tooltip>\n);\n\nconst Downloads: FunctionComponent<{ downloads: number }> = ({ downloads }) => (\n <WithLabel\n label={\n <>\n <Box as=\"span\" mr={1}>\n <DownloadIcon />\n </Box>\n {downloads.toLocaleString()}\n </>\n }\n tooltip=\"Download numbers are periodically sourced from the NPM registry\"\n >\n Weekly downloads\n </WithLabel>\n);\n\nconst getDetailItemsFromPackage = ({\n assembly,\n metadata,\n name,\n packageLinks,\n stats,\n}: {\n assembly?: Assembly;\n metadata?: Metadata;\n stats?: PackageStats;\n packageLinks?: PackageLinkConfig[];\n name: string;\n}): ReactNode[] => {\n const items: ReactNode[] = [];\n\n if (assembly || metadata || stats || packageLinks) {\n const downloads: number | undefined =\n stats?.packages?.[name]?.downloads?.npm;\n\n if (downloads !== undefined) {\n items.push(<Downloads downloads={downloads} />);\n }\n\n const username = assembly?.author.name;\n const repository = assembly?.repository;\n const license = assembly?.license;\n\n if (username) {\n const author = (\n <NavLink color=\"blue.500\" to={getSearchPath({ query: username })}>\n {username}\n </NavLink>\n );\n items.push(<WithLabel label=\"Author\">{author}</WithLabel>);\n }\n\n const date = metadata?.date;\n\n if (date) {\n const publishDate = (\n <Time\n date={new Date(date)}\n fontWeight=\"normal\"\n format=\"MMMM dd, yyyy\"\n />\n );\n items.push(<WithLabel label=\"Published\">{publishDate}</WithLabel>);\n }\n\n // Prioritize custom links when available\n if (packageLinks?.length) {\n packageLinks.forEach(({ linkLabel, configKey, linkText }) => {\n const target = (metadata?.packageLinks ?? {})[configKey];\n if (target) {\n const link = (\n <ExternalLink href={target}>{linkText ?? target}</ExternalLink>\n );\n items.push(\n <WithLabel label={linkLabel}>\n {linkLabel}: {link}\n </WithLabel>\n );\n }\n });\n }\n\n if (repository) {\n const repo = getRepoUrlAndHost(repository.url);\n\n if (repo) {\n const repoLink = (\n <ExternalLink href={repo.url}>{repo.hostname}</ExternalLink>\n );\n items.push(<WithLabel label=\"Repository\">{repoLink}</WithLabel>);\n }\n }\n\n if (license && license in LICENSE_LINKS) {\n const licenseLink = (\n <LicenseLink license={license as keyof typeof LICENSE_LINKS} />\n );\n items.push(<WithLabel label=\"License\">{licenseLink}</WithLabel>);\n }\n }\n\n return items.map((item, i) => <Fragment key={i}>{item}</Fragment>);\n};\n\nexport const Details: FunctionComponent<DetailsProps> = (props) => {\n const state = usePackageState();\n const stats = useStats().data;\n const collapse = useDisclosure();\n const packageLinks = useConfigValue(\"packageLinks\");\n\n const assembly = state.assembly.data;\n const metadata = state.metadata.data;\n const name = state.scope ? `${state.scope}/${state.name}` : state.name;\n\n const items = getDetailItemsFromPackage({\n assembly,\n metadata,\n name,\n packageLinks,\n stats,\n });\n\n if (!items.length) return null;\n\n const alwaysShow = items.slice(0, 2);\n const showWithCollapse = items.slice(2, items.length);\n\n return (\n <Stack\n align=\"start\"\n color=\"gray.600\"\n fontSize=\".75rem\"\n mt={2}\n spacing={2}\n {...props}\n >\n {/* TODO: Highlight element */}\n {alwaysShow}\n {showWithCollapse.length > 0 && (\n <>\n <Collapse animateOpacity in={collapse.isOpen}>\n <Stack spacing={2}>{showWithCollapse}</Stack>\n </Collapse>\n <ToggleButton\n closeText=\"See less details\"\n fontSize=\"inherit\"\n isOpen={collapse.isOpen}\n onClick={collapse.onToggle}\n openText=\"See more details\"\n />\n </>\n )}\n </Stack>\n );\n};\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { makeGridAreas } from \"../../../util/css\";\n\nexport const GRID_AREAS = {\n HEADING: \"heading\",\n INSTALL: \"install\",\n LANGUAGES: \"languages\",\n META: \"meta\",\n};\n\nconst baseGridAreas = makeGridAreas(\n [GRID_AREAS.HEADING],\n [GRID_AREAS.META],\n [GRID_AREAS.LANGUAGES],\n [GRID_AREAS.INSTALL]\n);\n\nconst lgGridAreas = makeGridAreas(\n [GRID_AREAS.HEADING, GRID_AREAS.LANGUAGES, GRID_AREAS.INSTALL],\n [GRID_AREAS.HEADING, null, GRID_AREAS.META]\n);\n\nexport const HeaderContainer: FunctionComponent = ({ children }) => (\n <Grid\n columnGap={{ md: 6, lg: 10 }}\n pt={{ base: 3, lg: 6 }}\n px={{ base: 5, md: 6, lg: 10 }}\n rowGap={{ base: 4, lg: 0 }}\n templateAreas={{ base: baseGridAreas, lg: lgGridAreas }}\n templateColumns={{ base: \"1fr\", lg: \"1fr auto 15rem\" }}\n templateRows={{ lg: \"auto 1fr\" }}\n >\n {children}\n </Grid>\n);\n","import {\n Box,\n Flex,\n Stack,\n StackProps,\n Heading as ChakraHeading,\n Text,\n} from \"@chakra-ui/react\";\nimport { Assembly } from \"@jsii/spec\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageTagConfig } from \"../../../api/config\";\nimport { Metadata } from \"../../../api/package/metadata\";\nimport { CDKTypeIcon, CDKTypeText } from \"../../../components/CDKType\";\nimport { PackageTag } from \"../../../components/PackageTag\";\nimport { KEYWORD_IGNORE_LIST } from \"../../../constants/keywords\";\n\ninterface TagObject extends PackageTagConfig {\n isKeyword?: boolean;\n}\n\ninterface HeadingProps extends StackProps {\n assembly: Assembly;\n name: string;\n description?: string;\n metadata: Metadata;\n version: string;\n}\n\nexport const Heading: FunctionComponent<HeadingProps> = ({\n assembly,\n name,\n description,\n metadata,\n version,\n ...stackProps\n}) => {\n const tags: TagObject[] = [\n ...(metadata.packageTags ?? []).filter((tag) => Boolean(tag.keyword)),\n\n ...(assembly.keywords ?? [])\n .filter((v) => Boolean(v) && !KEYWORD_IGNORE_LIST.has(v))\n .map((label) => ({\n isKeyword: true,\n id: label,\n keyword: {\n label,\n },\n })),\n ];\n\n const cdkTypeProps = metadata.constructFramework ?? {};\n\n return (\n <Stack\n lineHeight=\"1.5\"\n maxW=\"full\"\n overflow=\"hidden\"\n spacing={2}\n {...stackProps}\n >\n <Flex align=\"center\">\n <ChakraHeading\n color=\"blue.800\"\n flexShrink={1}\n fontSize=\"1.5rem\"\n isTruncated\n >\n {name}\n </ChakraHeading>\n <Box as=\"span\" flex={1} fontSize=\"sm\" ml={4}>\n {version}\n </Box>\n </Flex>\n\n <Text fontSize=\"1rem\">{description}</Text>\n\n <Flex\n align=\"center\"\n direction=\"row\"\n pt={3}\n // Chakra doesn't yet support css gap via style props\n sx={{ gap: \"0.5rem\" }}\n wrap=\"wrap\"\n >\n <CDKTypeIcon {...cdkTypeProps} />\n <CDKTypeText\n color=\"gray.700\"\n fontSize=\".75rem\"\n fontWeight=\"semibold\"\n {...cdkTypeProps}\n />\n {tags.map(({ id, isKeyword, keyword: { label, color } = {} }) => (\n <PackageTag isKeyword={isKeyword} key={id} value={id} variant={color}>\n {label}\n </PackageTag>\n ))}\n </Flex>\n </Stack>\n );\n};\n","import {\n Box,\n Flex,\n FlexProps,\n Collapse,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport type { Language as PrismLanguage } from \"prism-react-renderer\";\nimport type { FunctionComponent } from \"react\";\nimport { Code } from \"../../../components/Code\";\nimport { Language } from \"../../../constants/languages\";\nimport { usePackageState } from \"../PackageState\";\nimport { ToggleButton } from \"./ToggleButton\";\n\nconst getCodeSample = ({\n language,\n assembly,\n}: {\n language: Language;\n assembly: Assembly;\n}): string | undefined => {\n const version = assembly.version;\n if (language === Language.TypeScript) {\n const packageName = assembly.name;\n\n return `npm install ${packageName}@${version}`;\n } else if (language === Language.Python) {\n const packageName = assembly.targets?.python?.distName;\n\n if (!packageName) {\n return undefined;\n }\n\n return `pip install ${packageName}==${version}`;\n } else if (language === Language.Java) {\n const groupId = assembly.targets?.java?.maven?.groupId;\n const artifactId = assembly.targets?.java?.maven?.artifactId;\n\n if (!groupId || !artifactId) return undefined;\n\n return [\n \"// add this to your pom.xml\",\n \"<dependency>\",\n ` <groupId>${groupId}</groupId>`,\n ` <artifactId>${artifactId}</artifactId>`,\n ` <version>${version}</version>`,\n \"</dependency>\",\n ].join(\"\\n\");\n } else if (language === Language.DotNet) {\n const packageId = assembly.targets?.dotnet?.packageId;\n if (!packageId) return undefined;\n return `dotnet add package ${packageId} --version ${version}`;\n }\n\n return undefined;\n};\n\nexport const Install: FunctionComponent<FlexProps> = (props) => {\n const {\n language,\n assembly: { data: assembly },\n } = usePackageState();\n\n const collapse = useDisclosure();\n\n if (!assembly) return null;\n\n const code = getCodeSample({ language, assembly });\n\n if (!code || !language) return null;\n\n return (\n <Flex align=\"start\" direction=\"column\" fontSize=\".75rem\" {...props}>\n {language === Language.Java ? (\n <>\n <ToggleButton\n closeText=\"Hide\"\n fontSize=\"inherit\"\n isOpen={collapse.isOpen}\n mt={2}\n onClick={collapse.onToggle}\n openText=\"Install\"\n />\n <Box maxW=\"full\" overflow=\"hidden\">\n <Collapse in={collapse.isOpen}>\n <Code\n boxShadow=\"none\"\n code={code}\n fontSize=\"inherit\"\n language={language as PrismLanguage}\n mt={2}\n />\n </Collapse>\n </Box>\n </>\n ) : (\n <Code\n boxShadow=\"none\"\n code={code}\n fontSize=\"inherit\"\n language={language as PrismLanguage}\n lineHeight=\"2\"\n />\n )}\n </Flex>\n );\n};\n","import { Divider, Flex, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { LanguageSelection } from \"../LanguageSelection\";\nimport { usePackageState } from \"../PackageState\";\nimport { Details } from \"./Details\";\nimport { HeaderContainer, GRID_AREAS } from \"./HeaderContainer\";\nimport { Heading } from \"./Heading\";\nimport { Install } from \"./Install\";\n\nexport const PackageHeader: FunctionComponent = () => {\n const { assembly, metadata, version } = usePackageState();\n\n const { data: asm } = assembly;\n const { data: meta } = metadata;\n\n return asm && meta ? (\n <HeaderContainer>\n <Heading\n assembly={asm}\n description={asm.description}\n gridArea={GRID_AREAS.HEADING}\n metadata={meta}\n name={asm.name}\n version={version}\n />\n <Flex align=\"start\" gridArea={GRID_AREAS.LANGUAGES}>\n <LanguageSelection />\n </Flex>\n\n <Flex direction=\"column\" gridArea={GRID_AREAS.META}>\n <Divider borderBottom=\"base\" display={{ md: \"none\" }} mb={2} />\n\n <Details />\n\n <Divider borderBottom=\"base\" display={{ md: \"none\" }} mt={2} />\n </Flex>\n\n <Flex align=\"start\" gridArea={GRID_AREAS.INSTALL}>\n <Install />\n </Flex>\n </HeaderContainer>\n ) : (\n <Spinner mx=\"auto\" my={10} size=\"xl\" />\n );\n};\n","import {\n Grid,\n Tab,\n TabList,\n TabPanel,\n TabPanels,\n Tabs,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent, useState, useEffect } from \"react\";\nimport { Page } from \"../../components/Page\";\nimport { DependenciesList } from \"./DependenciesList\";\nimport { FeedbackLinks } from \"./FeedbackLinks\";\nimport { PackageDocs } from \"./PackageDocs\";\nimport { PackageHeader } from \"./PackageHeader\";\nimport { usePackageState } from \"./PackageState\";\nimport testIds from \"./testIds\";\n\nexport const PackageLayout: FunctionComponent = () => {\n const { pageDescription, pageTitle } = usePackageState();\n\n const [tabIndex, setTabIndex] = useState(0);\n\n useEffect(() => {\n setTabIndex(0);\n }, [pageTitle]);\n\n return (\n <Page\n meta={{ title: pageTitle, description: pageDescription }}\n pageName=\"packageProfile\"\n >\n <Grid\n bg=\"white\"\n data-testid={testIds.page}\n maxW=\"100vw\"\n templateColumns=\"1fr\"\n templateRows=\"auto 1fr auto\"\n >\n <PackageHeader />\n\n <Tabs index={tabIndex} onChange={setTabIndex} pt={4} variant=\"line\">\n <TabList borderBottom=\"base\" mx={{ base: 0, lg: 6 }}>\n <Tab>Documentation</Tab>\n <Tab data-testid={testIds.dependenciesTab}>Dependencies</Tab>\n </TabList>\n <TabPanels maxW=\"full\">\n <TabPanel p={0}>\n <PackageDocs />\n </TabPanel>\n\n <TabPanel>\n <DependenciesList />\n </TabPanel>\n </TabPanels>\n </Tabs>\n\n <FeedbackLinks />\n </Grid>\n </Page>\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { PackageLayout } from \"./PackageLayout\";\nimport { PackageStateProvider } from \"./PackageState\";\n\nexport const Package: FunctionComponent = () => {\n return (\n <PackageStateProvider>\n <PackageLayout />\n </PackageStateProvider>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Redirect, useParams } from \"react-router-dom\";\nimport { Packages } from \"../../api/package/packages\";\nimport { getFullPackageName, findPackage } from \"../../api/package/util\";\nimport { useCatalog } from \"../../contexts/Catalog\";\nimport NotFound from \"../NotFound\";\n\ninterface RouteParams {\n name: string;\n scope?: string;\n}\n\nconst buildRedirectUrl = (catalog: Packages, name: string, scope?: string) => {\n const prefix = \"/packages/\";\n const packageName = getFullPackageName(name, scope);\n const pkg = findPackage(catalog, packageName);\n\n if (!pkg) {\n return undefined;\n }\n\n const { version } = pkg;\n const suffix = `/v/${version}`;\n return `${prefix}${packageName}${suffix}`;\n};\n\nexport const PackageLatest: FunctionComponent = () => {\n const { name, scope }: RouteParams = useParams();\n const catalog = useCatalog();\n\n if (catalog.loading || !catalog.data) {\n return (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const url = buildRedirectUrl(catalog.data, name, scope);\n\n return url ? <Redirect to={url} /> : <NotFound />;\n};\n","import type { FunctionComponent } from \"react\";\nimport { Switch, Route, useRouteMatch } from \"react-router-dom\";\nimport { NotFound } from \"../NotFound\";\nimport Package from \"../Package\";\nimport PackageLatest from \"../PackageLatest\";\n\nconst nameRegexp = \"[^@\\\\/]+\";\nconst scopeRegexp = \"@[^\\\\/]+\";\n\nexport const Packages: FunctionComponent = () => {\n const { path } = useRouteMatch();\n\n return (\n <Switch>\n <Route\n exact\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})`}\n >\n <PackageLatest />\n </Route>\n <Route\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})/v/:version`}\n >\n <Package />\n </Route>\n <Route path=\"*\">\n <NotFound />\n </Route>\n </Switch>\n );\n};\n"],"sourceRoot":""}