construct-hub 0.1.182 → 0.1.186

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. package/.jsii +2 -2
  2. package/lib/backend/orchestration/index.js +26 -3
  3. package/lib/backend/transliterator/transliterator.bundle/index.js +2 -2
  4. package/lib/construct-hub.js +1 -1
  5. package/lib/package-sources/code-artifact.js +1 -1
  6. package/lib/package-sources/npmjs.js +1 -1
  7. package/lib/spdx-license.js +1 -1
  8. package/package.json +6 -6
  9. package/website/asset-manifest.json +34 -15
  10. package/website/index.html +1 -1
  11. package/website/service-worker.js +1 -1
  12. package/website/service-worker.js.map +1 -1
  13. package/website/static/js/0.ff9d42f8.chunk.js +2 -0
  14. package/website/static/js/0.ff9d42f8.chunk.js.map +1 -0
  15. package/website/static/js/1.a7f029fd.chunk.js +2 -0
  16. package/website/static/js/1.a7f029fd.chunk.js.map +1 -0
  17. package/website/static/js/10.32615aa0.chunk.js +2 -0
  18. package/website/static/js/10.32615aa0.chunk.js.map +1 -0
  19. package/website/static/js/11.051d89fc.chunk.js +2 -0
  20. package/website/static/js/11.051d89fc.chunk.js.map +1 -0
  21. package/website/static/js/12.e96b82dd.chunk.js +3 -0
  22. package/website/static/js/{3.fcccb6af.chunk.js.LICENSE.txt → 12.e96b82dd.chunk.js.LICENSE.txt} +0 -0
  23. package/website/static/js/12.e96b82dd.chunk.js.map +1 -0
  24. package/website/static/js/13.fb054c47.chunk.js +2 -0
  25. package/website/static/js/{4.920a8651.chunk.js.map → 13.fb054c47.chunk.js.map} +1 -1
  26. package/website/static/js/4.7cd92fab.chunk.js +3 -0
  27. package/website/static/js/4.7cd92fab.chunk.js.LICENSE.txt +40 -0
  28. package/website/static/js/4.7cd92fab.chunk.js.map +1 -0
  29. package/website/static/js/5.0da0a8ef.chunk.js +3 -0
  30. package/website/static/js/{2.200df80d.chunk.js.LICENSE.txt → 5.0da0a8ef.chunk.js.LICENSE.txt} +0 -41
  31. package/website/static/js/5.0da0a8ef.chunk.js.map +1 -0
  32. package/website/static/js/6.c0e3f99c.chunk.js +2 -0
  33. package/website/static/js/6.c0e3f99c.chunk.js.map +1 -0
  34. package/website/static/js/7.11632168.chunk.js +2 -0
  35. package/website/static/js/7.11632168.chunk.js.map +1 -0
  36. package/website/static/js/8.8af79a83.chunk.js +2 -0
  37. package/website/static/js/8.8af79a83.chunk.js.map +1 -0
  38. package/website/static/js/9.2b21526e.chunk.js +2 -0
  39. package/website/static/js/9.2b21526e.chunk.js.map +1 -0
  40. package/website/static/js/main.f1390607.chunk.js +2 -0
  41. package/website/static/js/main.f1390607.chunk.js.map +1 -0
  42. package/website/static/js/runtime-main.82c3976d.js +2 -0
  43. package/website/static/js/runtime-main.82c3976d.js.map +1 -0
  44. package/website/static/js/2.200df80d.chunk.js +0 -3
  45. package/website/static/js/2.200df80d.chunk.js.map +0 -1
  46. package/website/static/js/3.fcccb6af.chunk.js +0 -3
  47. package/website/static/js/3.fcccb6af.chunk.js.map +0 -1
  48. package/website/static/js/4.920a8651.chunk.js +0 -2
  49. package/website/static/js/main.e4cce0ad.chunk.js +0 -2
  50. package/website/static/js/main.e4cce0ad.chunk.js.map +0 -1
  51. package/website/static/js/runtime-main.a7d2400e.js +0 -2
  52. package/website/static/js/runtime-main.a7d2400e.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["components/Markdown/Hr.tsx","contexts/ExternalLinkWarning/constants.ts","contexts/ExternalLinkWarning/ExternalLinkWarningModal.tsx","contexts/ExternalLinkWarning/ExternalLinkWarning.tsx","components/Markdown/List.tsx","components/Markdown/Markdown.tsx","components/ExternalLink/ExternalLink.tsx","components/Markdown/Img.tsx","components/CopyButton/CopyButton.tsx","components/Code/MultiLineRenderer.tsx","components/Code/SingleLineRenderer.tsx","components/Code/Code.tsx","components/Markdown/Code.tsx","components/Card/Card.tsx","lib/shortbread/shortbread.ts","constants/languages.ts","components/DevPreviewBanner/DevPreviewBanner.tsx","lib/shortbread/getLocalStoreWriter.ts","contexts/Shortbread/Shortbread.tsx","constants/url.ts","components/Footer/constants.ts","util/createTestIds.ts","components/Footer/testIds.ts","components/Footer/Footer.tsx","constants/links.ts","components/NavPopover/NavPopover.tsx","components/NavPopover/NavPopoverContent.tsx","components/NavPopover/NavPopoverTrigger.tsx","components/Header/testIds.ts","components/Header/Documentation.tsx","components/Header/Resources.tsx","components/Header/Title.tsx","components/Header/MobileNav.tsx","components/Header/NavButton.tsx","icons/TSIcon.tsx","icons/PythonIcon.tsx","icons/JavaIcon.tsx","icons/GoIcon.tsx","icons/DotNetIcon.tsx","api/package/packages.ts","hooks/useRequest/useRequest.ts","contexts/Catalog/Catalog.tsx","hooks/useCatalogResults/useCatalogResults.ts","util/url.ts","hooks/useCatalogSearch/useCatalogSearch.ts","hooks/useDebounce/useDebounce.ts","hooks/useQueryParams/useQueryParams.ts","hooks/useLanguage/useLanguage.ts","components/Form/Form.tsx","components/CatalogSearch/testIds.ts","components/CatalogSearch/CatalogSearchInputs.tsx","components/CatalogSearch/Dropdown.tsx","components/CatalogSearch/CatalogSearch.tsx","components/SearchItem/SearchItem.tsx","components/SearchModal/testIds.ts","components/SearchModal/SearchModal.tsx","components/Header/SearchButton.tsx","components/Header/Header.tsx","constants/pageInfo.ts","contexts/Analytics/Analytics.tsx","contexts/Analytics/usePageView.ts","components/Page/Page.tsx","views/FAQ/FAQItem.tsx","views/FAQ/FAQLink.tsx","views/FAQ/FAQSection.tsx","views/FAQ/FAQ.tsx","components/Picture/Picture.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageTag/PackageTag.tsx","components/Time/Time.tsx","components/CatalogCard/testIds.ts","components/CatalogCard/CatalogCardContainer.tsx","components/CatalogCard/CatalogCardSkeleton.tsx","components/CatalogCard/CatalogCard.tsx","components/Results/ResultsGrid.tsx","components/Results/ResultsSkeleton.tsx","components/Results/Results.tsx","views/Home/testIds.ts","views/Home/HomePageControls.tsx","views/Home/Home.tsx","views/NotFound/NotFound.tsx","api/package/util.ts","api/package/assembly.ts","api/package/docs.ts","api/package/metadata.ts","api/config/index.ts","contexts/Config/Config.tsx","components/LanguageBar/LanguageBar.tsx","views/Package/components/LanguageSelection/LanguageSelection.tsx","views/Package/components/DependencyDropdown/DependencyDropdown.tsx","components/LicenseLink/constants.ts","components/LicenseLink/LicenseLink.tsx","views/Package/components/OperatorArea/Details.tsx","views/Package/components/OperatorArea/OperatorArea.tsx","views/Package/components/PackageHeader/PackageHeader.tsx","components/CodePopover/CodePopover.tsx","components/CodePopover/CodePopoverTrigger.tsx","views/Package/components/UseConstruct/UseConstruct.tsx","views/Package/components/PackageDetails/PackageDetails.tsx","components/NavTree/NavTree.tsx","views/Package/components/ChooseSubmodule/SearchInput.tsx","views/Package/components/ChooseSubmodule/SearchModal.tsx","reportWebVitals.ts","views/Package/components/ChooseSubmodule/ChooseSubmodule.tsx","views/Package/components/PackageDocs/PackageDocs.tsx","views/Package/components/PackageDocsError/PackageDocsError.tsx","views/Package/components/PackageDocsUnsupported/PackageDocsUnsupported.tsx","views/Package/Package.tsx","views/PackageLatest/PackageLatest.tsx","views/Packages/Packages.tsx","views/SearchResults/components/ArrowButton.tsx","views/SearchResults/components/GoToPage.tsx","views/SearchResults/components/NextPage.tsx","views/SearchResults/components/PageControls.tsx","views/SearchResults/components/ShowingDetails.tsx","views/SearchResults/SearchResults.tsx","views/SearchResults/constants.ts","views/SiteTerms/SiteTerms.tsx","App.tsx","theme/components/Code.ts","theme/components/Tag.ts","theme/components/index.ts","theme/components/Divider.ts","theme/foundations/index.ts","theme/foundations/borders.ts","theme/foundations/colors.ts","theme/foundations/radius.ts","theme/foundations/sizes.ts","theme/foundations/shadows.ts","theme/index.ts","contexts/Theme.tsx","register-service-worker.ts","index.tsx","components/NavLink/NavLink.tsx","components/Markdown/Table.tsx","components/Markdown/Text.tsx","components/Markdown/Headings.tsx","util/sanitize-anchor.ts"],"names":["Hr","props","my","PREFERS_WARN_ON_EXTERNAL_LINK_CLICK","ExternalLinkWarningModal","href","isOpen","onClick","onClose","setShouldWarn","useState","finalShouldWarn","setFinalShouldWarn","closeOnOverlayClick","color","fontSize","mb","bg","borderRadius","p","onChange","e","shouldWarn","target","checked","variant","hasArrow","label","placement","hasIcon","hasWarning","noFollow","localStorage","setItem","JSON","stringify","colorScheme","ml","rightIcon","ExternalLink","tabIndex","ExternalLinkWarningContext","createContext","useExternalLinkWarning","useContext","ExternalLinkWarningProvider","children","modalOption","setModalOptions","useDisclosure","onOpen","saved","getItem","parse","withPrompt","useCallback","preventDefault","Provider","value","Ul","Ol","Li","lineHeight","sx","mr","fontStyle","code","components","a","A","blockquote","Blockquote","caption","TableCaption","Code","em","Em","h1","Headings","h2","h3","h4","h5","h6","hr","img","Img","li","ol","P","pre","Pre","sup","Sup","table","Table","tbody","Tbody","td","Td","tfoot","Tfoot","th","Th","thead","Thead","tr","Tr","ul","ghSchema","require","attributes","span","concat","rehypePlugins","rehypeRaw","rehypeSanitize","remarkPlugins","remarkGfm","remarkEmoji","GITHUB_REPO_REGEX","Markdown","repoConfig","type","url","match","exec","owner","repo","parseGitHubRepository","repository","toAbsoluteUri","githubPrefix","githubSuffix","ReactMarkdown","uriTransformer","uri","first","includes","replace","Buffer","byteLength","substring","lastIndexOf","join","px","transformImageUri","transformLinkUri","forwardRef","ref","rel","isExternal","displayName","display","CopyButton","btnProps","useClipboard","hasCopied","onCopy","h","icon","Check","Copy","minW","w","MultiLineRenderer","tokens","getLineProps","getTokenProps","align","justify","py","_hover","maxW","overflowX","map","line","i","key","token","SingleLineRenderer","language","defaultProps","theme","nightOwlLight","as","border","boxShadow","className","overflow","style","length","inline","borderColor","Children","toArray","reduce","accum","child","trim","Card","instance","Language","STORAGE_KEY","DevPreviewBanner","defaultIsOpen","window","sessionStorage","in","mt","mx","position","role","InfoOutline","left","top","textAlign","textDecoration","Close","right","size","getLocalStoreWriter","URLSearchParams","location","search","get","initialize","Promise","resolve","reject","addEventListener","options","domain","hostname","navigator","__storeWriter","AWSCShortbread","callIfDefined","method","Error","access","checkForCookieConsent","customizeCookies","getConsentCookie","hasConsent","shortbread","publicAPI","ShortbreadContext","ShortbreadProvider","isReady","setIsReady","useEffect","isCancelled","then","catch","console","error","API_PATHS","QUERY_PARAMS","ROUTES","FAQ","HOME","PACKAGES","SEARCH","SITE_TERMS","FOOTER_LINKS","SERVICE_TERMS","testId","PRIVACY","LEGAL","createTestIds","scope","ids","acc","curr","testIds","Object","values","Footer","container","direction","columnGap","columns","links","entries","index","base","md","orientation","NavLink","to","sm","disclaimer","manageCookies","fontWeight","DOCUMENTATION","isNavLink","RESOURCES","NavPopover","menuProps","strategy","Link","alignItems","justifyContent","NavPopoverContent","items","item","idx","title","link","linkIdx","NavPopoverTrigger","Button","ChevronDown","Documentation","gettingStartedTrigger","gettingStartedMenu","Resources","resourcesTrigger","resourcesMenu","Title","MobileNav","mobileNav","spacing","NavButton","nav","navOpen","Hamburger","LANGUAGES","TypeScript","Python","Java","Go","DotNet","LANGUAGE_NAME_MAP","TEMP_SUPPORTED_LANGUAGES","Set","LANGUAGE_RENDER_MAP","name","typescript","transform","viewBox","d","fill","python","version","id","offset","stopColor","gradientUnits","x1","x2","xlinkHref","y1","y2","marker","java","golang","dotnet","fetchPackages","fetch","response","ok","statusText","json","useRequest","requestFn","initialValue","onSuccess","onError","loading","setLoading","data","setData","setError","mountedRef","useRef","current","statefulFetch","undefined","res","useMemo","CatalogContext","useCatalog","CatalogProvider","requestPackages","catalogResponse","useCatalogResults","limit","query","results","packages","filtered","filter","keys","languages","itemStr","toLowerCase","queryStr","sort","p1","p2","d1","Date","metadata","date","d2","pageLimit","Math","floor","displayable","startIndex","stopIndex","slice","gitSSHRegex","RegExp","createURL","params","searchParams","forEach","k","v","set","toString","createURLSearchParams","getSearchPath","useCatalogSearch","defaultQuery","setQuery","defaultLanguage","setLanguage","useHistory","push","onQueryChange","onSearch","onSubmit","onLanguageChange","useDebounce","debouncedValue","setDebouncedValue","delay","handler","setTimeout","clearTimeout","useQueryParams","useLocation","defaultLang","LOCAL_KEY","isValidLang","lang","has","getInitialLang","langFromParams","storedLang","useLanguage","updateUrl","updateSaved","pathname","hash","update","val","Form","form","languageOptions","fromEntries","LanguageDropdown","placeholder","onSelect","selected","text","trigger","menu","CatalogSearchInputs","input","languageItem","languageDropdownMenu","languageDropdown","languageDropdownValue","submit","CatalogSearch","autoRows","gap","templateColumns","width","SearchItem","listStyleType","onKeyDown","SearchModal","currentLanguage","onSearchSubmit","searchAPI","showResults","inputRef","initialFocusRef","pb","pkg","SearchButton","searchModal","some","path","searchButton","m","Search","searchIcon","HeaderItem","rowStart","Header","gridTemplateColumns","gridTemplateRows","zIndex","colStart","justifySelf","placeItems","pageInfo","home","event","faq","packageProfile","siteTerms","notFound","page","pageType","AnalyticsContext","trackPageView","AnalyticsProvider","prevPath","opts","AWSMA","ready","document","dispatchEvent","CustomEvent","TRIGGER_EVENT","detail","usePageView","pageURL","description","Page","meta","pageName","suffix","formattedTitle","Helmet","process","content","charSet","property","FAQItem","question","flex","marginTop","marginBottom","FAQLink","FAQSection","heading","allowMultiple","defaultIndex","Picture","sources","source","media","srcSet","LanguageSupportTooltip","PackageTag","tagProps","Time","formatString","format","boxProps","dateTime","toISOString","CardContainer","templateRows","CatalogCardContainer","isLink","CatalogCardSkeleton","CatalogCard","publishDate","author","targets","getUrl","submodule","getPackagePath","authorName","maxH","isTruncated","Flex","tags","flexWrap","startsWith","keywords","Boolean","tag","noOfLines","Stack","indexOf","info","isSupportedByLibrary","isSupportedByConstructHub","Icon","opacity","ResultsGrid","lg","xl","ResultsSkeletonComponent","noOfItems","skeletons","ResultsSkeleton","memo","ResultsComponent","skeleton","Results","iconBtnProps","iconProps","HomePageControls","setOffset","nextDisabled","prevDisabled","getNextPage","pt","nextPageBtn","disabled","ArrowForward","prevIcon","ChevronLeft","nextIcon","ChevronRight","optimal","fallback","Home","alt","src","headings","bgSources","NotFound","inset","getFullPackageName","getAssetsPath","prefix","body","sanitizeVersion","ver","sanitized","fetchAssembly","assemblyPath","fetchMarkdown","docsSuffix","markdownPath","expectedContentType","contentType","headers","fetchMetadata","sanitizedVersion","metadataPath","defaultConfig","fetchConfig","log","err","ConfigContext","ConfigProvider","requestConfig","configResponse","LanguageBar","targetLanguages","selectedLanguage","setSelectedLanguage","isDisabled","isSelected","LangIcon","cursor","height","languageSet","LanguageSelection","assembly","DependencyDropdown","dependencies","depEntries","leftIcon","OS_ORG_LINK","LICENSE_LINKS","MIT","LicenseLink","license","linkProps","Details","linksConfig","detailItems","username","authorUrl","registry","npm","displayText","packageLinks","repoUrl","sshUrl","URL","getRepoUrlAndHost","repoLink","licenseLink","registryLink","OperatorArea","encodeURIComponent","PackageHeader","maxWidth","wordBreak","iconButtonProps","CodePopover","header","disclosure","focusRef","mdBreakpoint","useToken","useMediaQuery","isMd","isLazy","pr","copy","close","borderTopLeftRadius","borderTopRightRadius","CodePopoverTrigger","UseConstruct","packageName","distName","getCodeSample","PackageDetails","config","minH","NavItem","isHashUrl","linkIsActive","showToggle","showChildren","LinkComponent","nestedItems","onToggle","pl","textOverflow","whiteSpace","_before","bottom","NavTree","SearchInput","inputValue","setInputValue","onPerfEntry","onInputChange","submodules","navigate","ChooseSubmodule","allSubmodules","currentSubmodule","submoduleText","setFilter","submoduleName","fqn","split","ArrowBack","flexGrow","appendItem","itemTree","HTMLElement","dataset","headingId","headingLevel","innerText","level","parseInt","last","TOP_OFFSET","PackageDocs","markdown","navItems","setNavItems","tree","querySelectorAll","querySelector","scrollIntoView","alignSelf","borderRight","borderRightColor","maxHeight","borderBottom","overflowY","scrollMarginTop","PackageDocsError","issueLink","PackageDocsUnsupported","languageName","Package","useParams","requestMarkdown","markdownResponse","requestAssembly","assemblyResponse","requestMetadata","metadataResponse","q","pageTitle","pageDescription","hasError","hasDocs","isSupported","extractMajor","buildRedirectUrl","catalog","mv1","localeCompare","findPackage","PackageLatest","nameRegexp","scopeRegexp","Packages","useRouteMatch","exact","ArrowButton","getPageUrl","GoToPage","max","min","NextPage","nextPageUrl","PageControls","nextOffset","prevOffset","ChevronLeftIcon","ChevronRightIcon","ShowingDetails","count","SearchResults","queryParams","searchQuery","decodeURIComponent","languageQuery","result","toNum","SiteTerms","App","variants","subtle","createVariant","overrides","varBase","Tag","baseStyle","background","official","Divider","foundations","borders","colors","blue","bgPrimary","radii","card","sizes","shadows","extendTheme","Theme","resetCSS","isLocalhost","registerValidSW","swUrl","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","onUpdate","ReactDOM","render","StrictMode","ExternalLinkWarning","getElementById","Function","getCLS","getFID","getFCP","getLCP","getTTFB","origin","status","unregister","reload","checkValidServiceWorker","RouterLink","Component","borderLeft","borderLeftColor","Array","isArray","marginY","elem","dataElement","DOMParser","parseFromString","ReactDOMServer","renderToStaticMarkup","headingTitle","isH3OrLarger"],"mappings":"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","file":"static/js/main.e4cce0ad.chunk.js","sourcesContent":["import { Divider, DividerProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const Hr: FunctionComponent<DividerProps> = (props) => (\n <Divider my={10} {...props} />\n);\n","import type { MouseEventHandler } from \"react\";\n\nexport interface ExternalLinkPromptOptions {\n href?: string;\n onClick?: MouseEventHandler<HTMLAnchorElement>;\n}\n\nexport type ExternalLinkPrompt = ({\n href,\n onClick,\n}: ExternalLinkPromptOptions) => typeof onClick;\n\nexport const PREFERS_WARN_ON_EXTERNAL_LINK_CLICK =\n \"prefersWarnOnExternalLinkClick\";\n","import { ExternalLinkIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Checkbox,\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalOverlay,\n Text,\n Tooltip,\n} from \"@chakra-ui/react\";\nimport {\n ChangeEventHandler,\n FunctionComponent,\n MouseEventHandler,\n useState,\n} from \"react\";\nimport { ExternalLink } from \"../../components/ExternalLink\";\nimport {\n ExternalLinkPromptOptions,\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n} from \"./constants\";\n\nexport interface ExternalLinkWarningModalProps\n extends ExternalLinkPromptOptions {\n isOpen: boolean;\n onClose: () => void;\n setShouldWarn: (shouldWarn: boolean) => void;\n}\n\nexport const ExternalLinkWarningModal: FunctionComponent<ExternalLinkWarningModalProps> =\n ({ href, isOpen, onClick, onClose, setShouldWarn }) => {\n // Track a final state for showing warnings that will only be updated if a user chooses to proceed\n const [finalShouldWarn, setFinalShouldWarn] = useState(true);\n\n // Update intermediate state when preference checkmark is updated\n const onPreferenceUpdated: ChangeEventHandler<HTMLInputElement> = (e) => {\n const shouldWarn = !e.target.checked;\n setFinalShouldWarn(shouldWarn);\n };\n\n const onCancel = () => {\n // If user cancelled the navigation, reset final warning state\n setFinalShouldWarn(true);\n onClose();\n };\n\n const onProceed: MouseEventHandler<HTMLAnchorElement> = (e) => {\n // If a user decided to not show warnings in the future, update localStorage & state to reflect their decision\n if (!finalShouldWarn) {\n setShouldWarn(finalShouldWarn);\n\n try {\n localStorage.setItem(\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n JSON.stringify(finalShouldWarn)\n );\n } catch {}\n }\n\n onClick?.(e);\n onClose();\n };\n\n return (\n <Modal closeOnOverlayClick={false} isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent color=\"blue.800\">\n <ModalHeader>Confirm</ModalHeader>\n <ModalBody>\n <Text fontSize=\"lg\" mb={2}>\n This link is taking you to an external site\n </Text>\n <Text\n bg=\"gray.100\"\n borderRadius=\"sm\"\n color=\"blue.500\"\n fontSize=\"sm\"\n mb={4}\n p={1}\n >\n {href}\n </Text>\n <Checkbox onChange={onPreferenceUpdated}>\n Do not show this warning again.\n </Checkbox>\n </ModalBody>\n <ModalFooter>\n <Button onClick={onCancel} variant=\"ghost\">\n Cancel\n </Button>\n\n <Tooltip hasArrow label={href} placement=\"top\">\n <ExternalLink\n hasIcon={false}\n hasWarning={false}\n href={href}\n noFollow\n onClick={onProceed}\n >\n <Button\n colorScheme=\"blue\"\n ml={4}\n rightIcon={<ExternalLinkIcon />}\n tabIndex={0}\n variant=\"ghost\"\n >\n Proceed\n </Button>\n </ExternalLink>\n </Tooltip>\n </ModalFooter>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n );\n };\n","import { useDisclosure } from \"@chakra-ui/react\";\nimport {\n useContext,\n useState,\n createContext,\n FunctionComponent,\n MouseEventHandler,\n useCallback,\n} from \"react\";\nimport {\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n ExternalLinkPrompt,\n ExternalLinkPromptOptions,\n} from \"./constants\";\nimport { ExternalLinkWarningModal } from \"./ExternalLinkWarningModal\";\n\nconst ExternalLinkWarningContext = createContext<ExternalLinkPrompt>(\n ({ onClick }) => onClick\n);\n\nexport const useExternalLinkWarning = () =>\n useContext(ExternalLinkWarningContext);\n\nexport const ExternalLinkWarningProvider: FunctionComponent = ({\n children,\n}) => {\n const [modalOption, setModalOptions] =\n useState<ExternalLinkPromptOptions | null>(null);\n\n const { isOpen, onOpen, onClose } = useDisclosure({\n // Reset the modal options when closed\n onClose: () => {\n setModalOptions(null);\n },\n });\n\n // Determines initial state from localStorage. If no value is found, default to showing warning\n const [shouldWarn, setShouldWarn] = useState(() => {\n try {\n const saved =\n localStorage.getItem(PREFERS_WARN_ON_EXTERNAL_LINK_CLICK) ?? \"true\";\n return JSON.parse(saved);\n } catch {\n return true;\n }\n });\n\n // Takes in an href & onClick to set options for modal. If it should warn the user, it will wrap the onClick\n // With additional logic to show the modal\n const withPrompt = useCallback<ExternalLinkPrompt>(\n ({ href, onClick }) => {\n if (!shouldWarn) return onClick;\n\n const handler: MouseEventHandler<HTMLAnchorElement> = (e) => {\n setModalOptions({ href, onClick });\n e.preventDefault();\n onOpen();\n };\n\n return handler;\n },\n [onOpen, shouldWarn]\n );\n\n return (\n <ExternalLinkWarningContext.Provider value={withPrompt}>\n {children}\n <ExternalLinkWarningModal\n isOpen={isOpen}\n onClose={onClose}\n setShouldWarn={setShouldWarn}\n {...modalOption}\n />\n </ExternalLinkWarningContext.Provider>\n );\n};\n","import { UnorderedList, OrderedList, ListItem } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const Ul: FunctionComponent = ({ children }) => (\n <UnorderedList>{children}</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 mb={2}\n sx={{\n \"em:first-of-type\": {\n mr: 2,\n fontStyle: \"italic\",\n fontSize: \"small\",\n },\n \"&::marker\": {\n color: \"blue.500\",\n },\n code: {\n fontSize: \"small\",\n },\n }}\n >\n {children}\n </ListItem>\n);\n","import { Box } from \"@chakra-ui/react\";\nimport { Assembly } from \"@jsii/spec\";\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 { A, Blockquote, Em, P, Pre, Sup } from \"./Text\";\n\nconst ONE_MEGABYTE = 1024 * 1024;\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 https://github.com/rehypejs/rehype-sanitize#use\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nvar ghSchema = require(\"hast-util-sanitize/lib/github\");\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 const byteLength = Buffer.byteLength(children);\n if (byteLength > ONE_MEGABYTE) {\n children = children.substring(0, children.lastIndexOf(\"# API Reference\"));\n children = [\n children,\n \"# API Reference\",\n \"The API Reference for this package could not be rendered.\",\n \"If this issue persists, please let us know by creating an [issue](https://github.com/cdklabs/construct-hub-webapp/issues/new)\",\n ].join(\"\\n\");\n }\n return (\n <Box\n px={8}\n sx={{\n \"& > *\": { mb: 8 },\n \"& > p\": { lineHeight: \"taller\" },\n }}\n >\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 { ExternalLinkIcon } from \"@chakra-ui/icons\";\nimport { forwardRef, Link, LinkProps } from \"@chakra-ui/react\";\nimport { useExternalLinkWarning } from \"../../contexts/ExternalLinkWarning\";\n\nexport interface ExternalLinkProps extends LinkProps {\n /**\n * Shows an external link icon. `true` by default\n */\n hasIcon?: boolean;\n /**\n * Prompts the user to confirm leaving the site. `true` by default\n */\n hasWarning?: boolean;\n /**\n * Adds the nofollow annotation to the anchor's rel attribute\n */\n noFollow?: boolean;\n}\n\nexport const ExternalLink = forwardRef<ExternalLinkProps, \"a\">(\n (\n {\n children,\n hasIcon = true,\n hasWarning = true,\n href,\n onClick,\n noFollow,\n ...props\n },\n ref\n ) => {\n const withPrompt = useExternalLinkWarning();\n\n let rel = \"noopener noreferrer\";\n\n if (hasWarning || noFollow) {\n rel += \" nofollow\";\n }\n\n return (\n <Link\n color=\"blue.500\"\n href={href}\n isExternal\n onClick={hasWarning ? withPrompt({ href, onClick }) : onClick}\n ref={ref}\n rel={rel}\n {...props}\n >\n {children} {hasIcon && <ExternalLinkIcon mb={1} ml={2} />}\n </Link>\n );\n }\n);\n\nExternalLink.displayName = \"ExternalLink\";\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 { 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 h={6}\n icon={hasCopied ? <CheckIcon color=\"green.300\" /> : <CopyIcon />}\n minW=\"auto\"\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 justify=\"flex-end\"\n px={2}\n py={1}\n >\n <CopyButton _hover={{ bg: \"gray.300\" }} color=\"gray.500\" value={code} />\n </Flex>\n <Box maxW=\"100%\" overflowX=\"auto\" p={2}>\n <Box w=\"max-content\">\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 </Box>\n </>\n);\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 SingleLineRenderer: FunctionComponent<RendererProps> = ({\n code,\n tokens,\n getLineProps,\n getTokenProps,\n}) => (\n <Flex align=\"center\" justify=\"space-between\" 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 <CopyButton color=\"blue.500\" colorScheme=\"blue\" ml={4} value={code} />\n </Box>\n </Flex>\n);\n","import { Box } 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 {\n code: string;\n language: Language;\n}\n\nexport const Code: FunctionComponent<CodeProps> = ({ code, language }) => {\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 maxW=\"100%\"\n overflow=\"hidden\"\n style={props.style}\n w=\"min-content\"\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 { 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.100\"\n border=\"1px solid\"\n borderColor=\"gray.100\"\n borderRadius=\"md\"\n color=\"blue.500\"\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 { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\n\nexport interface CardProps extends BoxProps {}\n\n/**\n * Implements a <Box /> with simple card styles.\n */\nexport const Card = forwardRef<CardProps, \"div\">((props, ref) => {\n return (\n <Box\n bg=\"white\"\n border=\"base\"\n borderRadius=\"card\"\n boxShadow=\"base\"\n p={2}\n ref={ref}\n {...props}\n />\n );\n});\n\nCard.displayName = \"Card\";\n","import { getLocalStoreWriter } from \"./getLocalStoreWriter\";\n\nexport interface ShortbreadOptions {\n domain?: string;\n parent?: HTMLElement;\n language?: Navigator[\"language\"];\n __storeWriter?: (cookie: Document[\"cookie\"]) => void;\n}\n\nexport interface Shortbread {\n /**\n * Call this function to be notified when you cookie category is allowed\n */\n access: (\n name: \"essential\" | \"performance\" | \"functional\" | \"advertising\",\n onAllowed: () => void\n ) => void;\n /**\n * Call to ask the user the type of cookies they'd like to receive\n */\n checkForCookieConsent: () => void;\n /**\n * Open the Customize Cookie Dialog\n */\n customizeCookies: () => void;\n /**\n * Returns the consent cookie or undefined if not yet set\n */\n getConsentCookie: () => Document[\"cookie\"] | undefined;\n /**\n * Call this to ask if the cookie has been set\n */\n hasConsent: (cookieName: string) => boolean;\n}\n\n// We only want to manage a single instance at a time\nlet instance: Shortbread | undefined;\n\n/**\n * Call to initialize the shortbread instance. Must be called before all other methods\n */\nexport const initialize = async () => {\n return new Promise<void>((resolve, reject) => {\n // Wait until page has loaded first\n window.addEventListener(\"load\", async () => {\n try {\n const options: ShortbreadOptions = {\n domain: window.location.hostname,\n language: navigator.language,\n __storeWriter: getLocalStoreWriter(),\n };\n\n // Import the shortbread source\n const { AWSCShortbread } = await import(\"./source\");\n instance = AWSCShortbread(options);\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n });\n};\n\n// Shortbread wrappers\n\nconst callIfDefined =\n <T extends keyof Shortbread>(method: T) =>\n (...args: Parameters<Shortbread[T]>): ReturnType<Shortbread[T]> => {\n if (!instance) {\n throw new Error(\"shortbread has not been initialized\");\n }\n\n // Annotations are correct for consumers\n return (instance[method] as any)(...args);\n };\n\n/**\n * Call this function to be notified when you cookie category is allowed\n */\nexport const access = callIfDefined(\"access\");\n/**\n * Call to ask the user the type of cookies they'd like to receive\n */\nexport const checkForCookieConsent = callIfDefined(\"checkForCookieConsent\");\n/**\n * Open the Customize Cookie Dialog\n */\nexport const customizeCookies = callIfDefined(\"customizeCookies\");\n/**\n * Returns the consent cookie or undefined if not yet set\n */\nexport const getConsentCookie = callIfDefined(\"getConsentCookie\");\n/**\n * Call this to ask if the cookie has been set\n */\nexport const hasConsent = callIfDefined(\"hasConsent\");\n","import type { PropsOf, Icon } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { DotNetIcon } from \"../icons/DotNetIcon\";\nimport { GoIcon } from \"../icons/GoIcon\";\nimport { JavaIcon } from \"../icons/JavaIcon\";\nimport { PythonIcon } from \"../icons/PythonIcon\";\nimport { TSIcon } from \"../icons/TSIcon\";\n\nexport enum Language {\n DotNet = \"dotnet\",\n TypeScript = \"typescript\",\n Python = \"python\",\n Go = \"golang\",\n Java = \"java\",\n}\n\n/**\n * The sorted list of all available languages.\n */\nexport const LANGUAGES: readonly Language[] = [\n Language.TypeScript,\n Language.Python,\n Language.Java,\n Language.Go,\n Language.DotNet,\n];\n\nexport const LANGUAGE_NAME_MAP: { readonly [key in Language]: string } = {\n [Language.TypeScript]: \"TypeScript\",\n [Language.Python]: \"Python\",\n [Language.Java]: \"Java\",\n [Language.Go]: \"Go\",\n [Language.DotNet]: \".NET\",\n};\n\nexport const TEMP_SUPPORTED_LANGUAGES: ReadonlySet<Language> = new Set([\n Language.Python,\n Language.TypeScript,\n]);\n\nexport const LANGUAGE_RENDER_MAP: {\n readonly [key in Language]: {\n readonly name: string;\n readonly icon: FunctionComponent<PropsOf<typeof Icon>>;\n };\n} = {\n [Language.TypeScript]: {\n name: LANGUAGE_NAME_MAP.typescript,\n icon: TSIcon,\n },\n [Language.Python]: {\n name: LANGUAGE_NAME_MAP.python,\n icon: PythonIcon,\n },\n [Language.Java]: {\n name: LANGUAGE_NAME_MAP.java,\n icon: JavaIcon,\n },\n [Language.Go]: {\n name: LANGUAGE_NAME_MAP.golang,\n icon: GoIcon,\n },\n [Language.DotNet]: {\n name: LANGUAGE_NAME_MAP.dotnet,\n icon: DotNetIcon,\n },\n};\n","import { CloseIcon, InfoOutlineIcon } from \"@chakra-ui/icons\";\nimport {\n Box,\n IconButton,\n Collapse,\n Text,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Card } from \"../Card\";\nimport { ExternalLink } from \"../ExternalLink\";\n\nconst STORAGE_KEY = \"showing-dev-preview-banner\";\n\nexport const DevPreviewBanner: FunctionComponent = () => {\n const { isOpen, onClose } = useDisclosure({\n defaultIsOpen: JSON.parse(\n window.sessionStorage.getItem(STORAGE_KEY) ?? \"true\"\n ),\n onClose: () => window.sessionStorage.setItem(STORAGE_KEY, \"false\"),\n });\n\n return (\n <Box h=\"max-content\">\n <Collapse in={isOpen}>\n <Card\n aria-label=\"Preview Banner\"\n bg=\"blue.500\"\n border=\"none\"\n boxShadow=\"none\"\n color=\"white\"\n mt={4}\n mx={4}\n p={4}\n position=\"relative\"\n role=\"alertdialog\"\n >\n <InfoOutlineIcon h={5} left={4} position=\"absolute\" top={4} w={5} />\n <Text fontSize=\"md\" mx={8} textAlign=\"center\">\n This application is in Dev Preview. Some features may change. If you\n find any issues, please report them{\" \"}\n <ExternalLink\n color=\"inherit\"\n hasWarning={false}\n href=\"https://github.com/cdklabs/construct-hub-webapp/issues\"\n textDecoration=\"underline\"\n >\n here\n </ExternalLink>\n </Text>\n <IconButton\n aria-label=\"Dismiss banner\"\n colorScheme=\"white\"\n icon={<CloseIcon />}\n onClick={onClose}\n position=\"absolute\"\n right={4}\n size=\"xs\"\n top={3}\n variant=\"ghost\"\n />\n </Card>\n </Collapse>\n </Box>\n );\n};\n","import type { ShortbreadOptions } from \"./shortbread\";\n\nconst isDev = process.env.NODE_ENV === \"development\";\n\n/**\n * This function allows for shortbread testing locally.\n * If the node env is dev and the url has a query param of sb=true,\n * it will return a __storeWriter function to pass into shortbread's options\n */\nexport const getLocalStoreWriter = (): ShortbreadOptions[\"__storeWriter\"] => {\n const search = new URLSearchParams(window.location.search);\n const shouldUseOverride = search.get(\"sb\") === \"true\";\n\n if (isDev && shouldUseOverride) {\n return (cookie) => {\n document.cookie = cookie.replace(\" secure=true;\", \"\");\n };\n }\n\n return undefined;\n};\n","import {\n createContext,\n FunctionComponent,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport * as shortbread from \"../../lib/shortbread\";\n\nconst { initialize, ...publicAPI } = shortbread;\n\nconst ShortbreadContext = createContext<Partial<typeof publicAPI>>({});\n\nexport const useShortBread = () => useContext(ShortbreadContext);\n\nexport const ShortbreadProvider: FunctionComponent = ({ children }) => {\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n let isCancelled = false;\n\n initialize()\n .then(() => {\n if (!isCancelled) {\n publicAPI.checkForCookieConsent();\n setIsReady(true);\n }\n })\n .catch((e) => {\n console.error(e);\n\n if (!isCancelled) {\n setIsReady(false);\n }\n });\n\n return () => {\n isCancelled = true;\n setIsReady(false);\n };\n }, []);\n\n return (\n <ShortbreadContext.Provider value={isReady ? publicAPI : {}}>\n {children}\n </ShortbreadContext.Provider>\n );\n};\n","export const API_PATHS = {\n PACKAGES_PREFIX: \"/data\",\n CATALOG_SUFFIX: \"/catalog.json\",\n ASSEMBLY_SUFFIX: \"/assembly.json\",\n METADATA_SUFFIX: \"/metadata.json\",\n CONFIG: \"/config.json\",\n} as const;\n\nexport const QUERY_PARAMS = {\n LANGUAGE: \"lang\",\n OFFSET: \"offset\",\n SEARCH_QUERY: \"q\",\n SUBMODULE: \"submodule\",\n} as const;\n\nexport const ROUTES = {\n FAQ: \"/faq\",\n HOME: \"/\",\n PACKAGES: \"/packages\",\n SEARCH: \"/search\",\n SITE_TERMS: \"/terms\",\n};\n\ntype QueryParams = typeof QUERY_PARAMS;\n\nexport type QueryParamKey = QueryParams[keyof QueryParams];\n","import { ROUTES } from \"../../constants/url\";\n\nexport type Link = {\n display: string;\n url: string;\n testId: string;\n isExternal?: boolean;\n};\n\nexport const FOOTER_LINKS: Record<string, Link> = {\n SERVICE_TERMS: {\n display: \"AWS Service Terms\",\n url: \"https://aws.amazon.com/service-terms/\",\n testId: \"service-terms\",\n },\n PRIVACY: {\n display: \"Privacy\",\n url: \"https://aws.amazon.com/privacy/\",\n testId: \"privacy\",\n },\n SITE_TERMS: {\n display: \"Site Terms\",\n url: ROUTES.SITE_TERMS,\n testId: \"site-terms\",\n isExternal: false,\n },\n LEGAL: {\n display: \"Legal\",\n url: \"https://aws.amazon.com/legal/\",\n testId: \"legal\",\n },\n} as const;\n\nexport const DISCLAIMER = \"2021 Amazon Web Services, Inc. All rights reserved.\";\n","type TestIds<T extends Readonly<string[]>> = {\n [key in T[number]]: string;\n};\n\n/**\n * A helper to create scoped test ids across components which can be re-used\n * in e2e and unit tests.\n */\nexport const createTestIds = <T extends Readonly<string[]>>(\n scope: string,\n ids: T\n): TestIds<T> =>\n ids.reduce<Record<string, string>>((acc, curr) => {\n acc[curr] = `${scope}-${curr}`;\n return acc;\n }, {}) as TestIds<T>;\n","import { createTestIds } from \"../../util/createTestIds\";\nimport { FOOTER_LINKS } from \"./constants\";\n\nconst testIds = createTestIds(\"footer\", [\n \"container\",\n \"links\",\n \"disclaimer\",\n \"manageCookies\",\n ...Object.values(FOOTER_LINKS).map(({ testId }) => testId),\n] as const);\n\nexport default testIds;\n","import { Box, Button, Divider, Flex, SimpleGrid, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { useShortBread } from \"../../contexts/Shortbread\";\nimport { ExternalLink } from \"../ExternalLink\";\nimport { NavLink } from \"../NavLink\";\nimport { DISCLAIMER, FOOTER_LINKS } from \"./constants\";\nimport testIds from \"./testIds\";\n\nexport interface FooterProps {}\n\nexport const Footer: FunctionComponent<FooterProps> = () => {\n const { customizeCookies } = useShortBread();\n\n return (\n <Flex\n align=\"center\"\n as=\"footer\"\n bg=\"blue.800\"\n color=\"white\"\n data-testid={testIds.container}\n direction=\"column\"\n justify=\"center\"\n py={4}\n >\n <SimpleGrid columnGap={6} columns={[1, 2, 4]} data-testid={testIds.links}>\n {Object.entries(FOOTER_LINKS).map(\n ([key, { display, isExternal = true, testId, url }], index) => (\n <Flex\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n key={key}\n >\n {/* Single Row Divider */}\n <Box\n display={{ base: \"none\", md: index !== 0 ? \"initial\" : \"none\" }}\n h={5}\n >\n <Divider borderColor=\"white\" mr={6} orientation=\"vertical\" />\n </Box>\n {isExternal ? (\n <ExternalLink\n color=\"currentcolor\"\n data-testid={testIds[testId]}\n hasWarning={false}\n href={url}\n lineHeight={10}\n mx=\"auto\"\n >\n {display}\n </ExternalLink>\n ) : (\n <NavLink\n color=\"currentcolor\"\n data-testid={testIds[testId]}\n lineHeight={10}\n mx=\"auto\"\n to={url}\n >\n {display}\n </NavLink>\n )}\n {/* 2 Row Divider */}\n <Box\n display={{\n base: \"none\",\n sm: index < 2 ? \"initial\" : \"none\",\n md: \"none\",\n }}\n w=\"100%\"\n >\n <Divider borderColor=\"white\" />\n </Box>\n </Flex>\n )\n )}\n </SimpleGrid>\n <Text data-testid={testIds.disclaimer} fontSize=\"xs\" mt={4}>\n {DISCLAIMER}\n </Text>\n <Button\n color=\"white\"\n data-testid={testIds.manageCookies}\n fontSize=\"xs\"\n fontWeight=\"normal\"\n mt={4}\n onClick={customizeCookies}\n variant=\"link\"\n >\n Manage Cookies\n </Button>\n </Flex>\n );\n};\n","import type { IMenuItems } from \"../components/NavPopover\";\n\nexport const DOCUMENTATION: IMenuItems = [\n { display: \"FAQ\", isNavLink: true, url: \"/faq\" },\n {\n display: \"Construct Hub on GitHub\",\n url: \"https://github.com/cdklabs/construct-hub\",\n },\n {\n display: \"Issues on GitHub\",\n url: \"https://github.com/cdklabs/construct-hub/issues\",\n },\n];\n\nexport const RESOURCES: IMenuItems = [\n {\n display: \"AWS CDK\",\n links: [\n { display: \"Home\", url: \"https://aws.amazon.com/cdk/\" },\n {\n display: \"Getting Started\",\n url: \"https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html\",\n },\n { display: \"Workshop\", url: \"https://cdkworkshop.com/\" },\n {\n display: \"Best Practices\",\n url: \"https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk\",\n },\n ],\n },\n {\n display: \"CDK for Terraform\",\n links: [\n {\n display: \"Getting Started\",\n url: \"https://learn.hashicorp.com/tutorials/terraform/cdktf\",\n },\n {\n display: \"Tutorials\",\n url: \"https://learn.hashicorp.com/collections/terraform/cdktf\",\n },\n ],\n },\n {\n display: \"CDK for Kubernetes\",\n links: [\n { display: \"Home\", url: \"https://cdk8s.io\" },\n {\n display: \"Getting Started\",\n url: \"https://cdk8s.io/docs/latest/getting-started\",\n },\n { display: \"Documentation\", url: \"https://cdk8s.io/docs/latest\" },\n {\n display: \"API Reference\",\n url: \"https://cdk8s.io/docs/latest/reference/index.html\",\n },\n ],\n },\n {\n display: \"Community\",\n links: [\n {\n display: \"Slack\",\n url: \"https://join.slack.com/t/cdk-dev/shared_invite/zt-mso6p56d-qJp7SOTBvMaQuDrx7R2wHg\",\n },\n { display: \"Community Hub\", url: \"https://cdk.dev\" },\n ],\n },\n];\n","import { Menu, MenuProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface NavPopoverProps extends MenuProps {}\n\nexport const NavPopover: FunctionComponent<NavPopoverProps> = ({\n children,\n ...menuProps\n}) => {\n return (\n <Menu colorScheme=\"blue.800\" strategy=\"fixed\" {...menuProps}>\n {children}\n </Menu>\n );\n};\n","import {\n forwardRef,\n MenuDivider,\n MenuGroup,\n MenuItem,\n MenuList,\n MenuListProps,\n} from \"@chakra-ui/react\";\nimport { Fragment, FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../ExternalLink\";\nimport { NavLink } from \"../NavLink\";\nimport type { IMenuItems, ILink } from \"./types\";\n\nexport interface NavPopoverContentProps extends MenuListProps {\n items: IMenuItems;\n}\n\nconst Link: FunctionComponent<ILink> = ({ display, isNavLink, url }) =>\n isNavLink ? (\n <NavLink color=\"blue.500\" to={url}>\n {display}\n </NavLink>\n ) : (\n <ExternalLink\n alignItems=\"center\"\n display=\"flex\"\n hasWarning={false}\n href={url}\n justifyContent=\"space-between\"\n w=\"100%\"\n >\n {display}\n </ExternalLink>\n );\n\nexport const NavPopoverContent = forwardRef<NavPopoverContentProps, \"div\">(\n ({ items, ...menuProps }, ref) => {\n return (\n <MenuList {...menuProps} ref={ref}>\n {items.map((item, idx) => {\n if (\"links\" in item) {\n return (\n <Fragment key={`${item.display}-${idx}`}>\n <MenuGroup align=\"left\" title={item.display}>\n {item.links.map((link, linkIdx) => (\n <MenuItem key={`${link.display}-${linkIdx}`}>\n <Link {...link} />\n </MenuItem>\n ))}\n </MenuGroup>\n {idx !== items.length - 1 && <MenuDivider />}\n </Fragment>\n );\n }\n\n return (\n <MenuItem key={`${item.display}-${idx}`}>\n <Link {...item} />\n </MenuItem>\n );\n })}\n </MenuList>\n );\n }\n);\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n MenuButton,\n MenuButtonProps,\n forwardRef,\n} from \"@chakra-ui/react\";\n\nexport const NavPopoverTrigger = forwardRef<MenuButtonProps, \"button\">(\n ({ children, ...props }, ref) => {\n return (\n <MenuButton\n as={Button}\n color=\"blue.800\"\n fontWeight=\"500\"\n ref={ref}\n rightIcon={<ChevronDownIcon h={6} w={6} />}\n size=\"md\"\n variant=\"link\"\n {...props}\n >\n {children}\n </MenuButton>\n );\n }\n);\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"header\", [\n \"container\",\n \"title\",\n \"gettingStartedTrigger\",\n \"gettingStartedMenu\",\n \"resourcesTrigger\",\n \"resourcesMenu\",\n \"navOpen\",\n \"navClose\",\n \"searchButton\",\n \"searchIcon\",\n \"mobileNav\",\n] as const);\n\nexport default testIds;\n","import type { FunctionComponent } from \"react\";\nimport { DOCUMENTATION } from \"../../constants/links\";\nimport {\n NavPopover,\n NavPopoverContent,\n NavPopoverTrigger,\n} from \"../NavPopover\";\nimport testIds from \"./testIds\";\n\nexport const Documentation: FunctionComponent = () => (\n <NavPopover>\n <NavPopoverTrigger data-testid={testIds.gettingStartedTrigger}>\n Getting Started\n </NavPopoverTrigger>\n <NavPopoverContent\n data-testid={testIds.gettingStartedMenu}\n items={DOCUMENTATION}\n />\n </NavPopover>\n);\n","import type { FunctionComponent } from \"react\";\nimport { RESOURCES } from \"../../constants/links\";\nimport {\n NavPopover,\n NavPopoverContent,\n NavPopoverTrigger,\n} from \"../NavPopover\";\nimport testIds from \"./testIds\";\n\nexport const Resources: FunctionComponent = () => {\n return (\n <NavPopover>\n <NavPopoverTrigger data-testid={testIds.resourcesTrigger}>\n Resources\n </NavPopoverTrigger>\n <NavPopoverContent\n data-testid={testIds.resourcesMenu}\n items={RESOURCES}\n />\n </NavPopover>\n );\n};\n","import { Box, Heading } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport testIds from \"./testIds\";\n\nexport const Title: FunctionComponent = () => (\n <Heading as=\"h1\" color=\"blue.800\" data-testid={testIds.title} size=\"lg\">\n <Link to=\"/\">\n <Box as=\"span\" color=\"blue.500\">\n Construct\n </Box>{\" \"}\n Hub\n </Link>\n </Heading>\n);\n","import {\n Drawer,\n DrawerBody,\n DrawerOverlay,\n DrawerHeader,\n DrawerContent,\n DrawerCloseButton,\n Portal,\n Stack,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Documentation } from \"./Documentation\";\nimport { Resources } from \"./Resources\";\nimport testIds from \"./testIds\";\nimport { Title } from \"./Title\";\nexport interface MobileNavProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport const MobileNav: FunctionComponent<MobileNavProps> = ({\n isOpen,\n onClose,\n}) => {\n return (\n <Portal>\n <Drawer isOpen={isOpen} onClose={onClose} placement=\"left\" size=\"xs\">\n <DrawerOverlay />\n <DrawerContent data-testid={testIds.mobileNav}>\n <DrawerCloseButton />\n <DrawerHeader display=\"flex\" justifyContent=\"center\">\n <Title />\n </DrawerHeader>\n <DrawerBody>\n <Stack align=\"start\" justify=\"start\" spacing={4}>\n <Documentation />\n <Resources />\n </Stack>\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </Portal>\n );\n};\n","import { HamburgerIcon } from \"@chakra-ui/icons\";\nimport { IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { MobileNav } from \"./MobileNav\";\nimport testIds from \"./testIds\";\n\nexport const NavButton: FunctionComponent = () => {\n const nav = useDisclosure();\n\n return (\n <>\n <IconButton\n aria-label=\"Navigation Menu\"\n borderRadius=\"md\"\n data-testid={testIds.navOpen}\n display={{ md: \"none\" }}\n icon={<HamburgerIcon />}\n onClick={nav.onOpen}\n variant=\"ghost\"\n />\n <MobileNav {...nav} />\n </>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const TSIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 256 256\"\n >\n <path d=\"M0 128v128h256V0H0z\" fill=\"#007ACC\" />\n <path\n d=\"M56.611 128.85l-.081 10.483h33.32v94.68h23.57v-94.68h33.32v-10.28c0-5.69-.122-10.444-.284-10.566-.122-.162-20.399-.244-44.983-.203l-44.739.122-.122 10.443zM206.567 118.108c6.501 1.626 11.459 4.51 16.01 9.224 2.357 2.52 5.851 7.112 6.136 8.209.08.325-11.053 7.802-17.798 11.987-.244.163-1.22-.894-2.317-2.52-3.291-4.794-6.745-6.867-12.028-7.232-7.76-.529-12.759 3.535-12.718 10.32 0 1.992.284 3.17 1.097 4.796 1.707 3.535 4.876 5.648 14.832 9.955 18.326 7.884 26.168 13.085 31.045 20.48 5.445 8.25 6.664 21.415 2.966 31.208-4.063 10.646-14.14 17.88-28.323 20.277-4.388.772-14.79.65-19.504-.203-10.28-1.829-20.033-6.908-26.047-13.572-2.357-2.601-6.949-9.387-6.664-9.875.122-.162 1.178-.812 2.356-1.503 1.138-.65 5.446-3.13 9.509-5.486l7.355-4.267 1.544 2.276c2.154 3.291 6.867 7.802 9.712 9.305 8.167 4.308 19.383 3.698 24.909-1.26 2.357-2.153 3.332-4.388 3.332-7.68 0-2.966-.366-4.266-1.91-6.5-1.99-2.845-6.054-5.243-17.595-10.24-13.206-5.69-18.895-9.225-24.096-14.833-3.007-3.25-5.852-8.452-7.03-12.8-.975-3.616-1.22-12.678-.447-16.335 2.723-12.76 12.353-21.658 26.25-24.3 4.51-.853 14.994-.528 19.424.57z\"\n fill=\"#FFF\"\n />\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const PythonIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon {...props} version=\"1.0\" viewBox=\"0 0 110.421 109.846\">\n <defs>\n <linearGradient id=\"a\">\n <stop offset=\"0\" stopColor=\"#ffe052\" />\n <stop offset=\"1\" stopColor=\"#ffc331\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id=\"d\"\n x1=\"89.137\"\n x2=\"147.777\"\n xlinkHref=\"#a\"\n y1=\"111.921\"\n y2=\"168.101\"\n />\n <linearGradient id=\"b\">\n <stop offset=\"0\" stopColor=\"#387eb8\" />\n <stop offset=\"1\" stopColor=\"#366994\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id=\"c\"\n x1=\"55.549\"\n x2=\"110.149\"\n xlinkHref=\"#b\"\n y1=\"77.07\"\n y2=\"131.853\"\n />\n </defs>\n <g color=\"#000\">\n <path\n d=\"M99.75 67.469c-28.032 0-26.281 12.156-26.281 12.156l.031 12.594h26.75V96H62.875s-17.938-2.034-17.938 26.25 15.657 27.281 15.657 27.281h9.343v-13.125s-.503-15.656 15.407-15.656h26.531s14.906.241 14.906-14.406V82.125s2.263-14.656-27.031-14.656zM85 75.938a4.808 4.808 0 014.813 4.812A4.808 4.808 0 0185 85.563a4.808 4.808 0 01-4.813-4.813A4.808 4.808 0 0185 75.937z\"\n fill=\"url(#c)\"\n overflow=\"visible\"\n style={{ marker: \"none\" }}\n transform=\"translate(-44.938 -67.469)\"\n />\n <path\n d=\"M100.546 177.315c28.032 0 26.281-12.156 26.281-12.156l-.03-12.594h-26.75v-3.781h37.374s17.938 2.034 17.938-26.25c0-28.285-15.657-27.282-15.657-27.282h-9.343v13.125s.503 15.657-15.407 15.657h-26.53s-14.907-.241-14.907 14.406v24.219s-2.263 14.656 27.031 14.656zm14.75-8.469a4.808 4.808 0 01-4.812-4.812 4.808 4.808 0 014.812-4.813 4.808 4.808 0 014.813 4.813 4.808 4.808 0 01-4.813 4.812z\"\n fill=\"url(#d)\"\n overflow=\"visible\"\n style={{ marker: \"none\" }}\n transform=\"translate(-44.938 -67.469)\"\n />\n </g>\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const JavaIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 256 346\"\n >\n <path\n d=\"M82.554 267.473s-13.198 7.675 9.393 10.272c27.369 3.122 41.356 2.675 71.517-3.034 0 0 7.93 4.972 19.003 9.279-67.611 28.977-153.019-1.679-99.913-16.517M74.292 229.659s-14.803 10.958 7.805 13.296c29.236 3.016 52.324 3.263 92.276-4.43 0 0 5.526 5.602 14.215 8.666-81.747 23.904-172.798 1.885-114.296-17.532\"\n fill=\"#5382A1\"\n />\n <path\n d=\"M143.942 165.515c16.66 19.18-4.377 36.44-4.377 36.44s42.301-21.837 22.874-49.183c-18.144-25.5-32.059-38.172 43.268-81.858 0 0-118.238 29.53-61.765 94.6\"\n fill=\"#E76F00\"\n />\n <path\n d=\"M233.364 295.442s9.767 8.047-10.757 14.273c-39.026 11.823-162.432 15.393-196.714.471-12.323-5.36 10.787-12.8 18.056-14.362 7.581-1.644 11.914-1.337 11.914-1.337-13.705-9.655-88.583 18.957-38.034 27.15 137.853 22.356 251.292-10.066 215.535-26.195M88.9 190.48s-62.771 14.91-22.228 20.323c17.118 2.292 51.243 1.774 83.03-.89 25.978-2.19 52.063-6.85 52.063-6.85s-9.16 3.923-15.787 8.448c-63.744 16.765-186.886 8.966-151.435-8.183 29.981-14.492 54.358-12.848 54.358-12.848M201.506 253.422c64.8-33.672 34.839-66.03 13.927-61.67-5.126 1.066-7.411 1.99-7.411 1.99s1.903-2.98 5.537-4.27c41.37-14.545 73.187 42.897-13.355 65.647 0 .001 1.003-.895 1.302-1.697\"\n fill=\"#5382A1\"\n />\n <path\n d=\"M162.439.371s35.887 35.9-34.037 91.101c-56.071 44.282-12.786 69.53-.023 98.377-32.73-29.53-56.75-55.526-40.635-79.72C111.395 74.612 176.918 57.393 162.439.37\"\n fill=\"#E76F00\"\n />\n <path\n d=\"M95.268 344.665c62.199 3.982 157.712-2.209 159.974-31.64 0 0-4.348 11.158-51.404 20.018-53.088 9.99-118.564 8.824-157.399 2.421.001 0 7.95 6.58 48.83 9.201\"\n fill=\"#5382A1\"\n />\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const GoIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 512 192\"\n >\n <path\n d=\"M292.533 13.295l1.124.75c13.212 8.725 22.685 20.691 28.917 35.15 1.496 2.243.499 3.49-2.493 4.237l-5.063 1.296c-11.447 2.949-20.53 5.429-31.827 8.378l-6.443 1.678c-2.32.574-2.96.333-5.428-2.477l-.348-.399c-3.519-3.988-6.155-6.652-10.817-9.03l-.899-.443c-15.705-7.727-30.911-5.484-45.12 3.74-16.952 10.968-25.677 27.172-25.428 47.364.25 19.942 13.96 36.395 33.654 39.137 16.951 2.244 31.16-3.739 42.378-16.452 2.244-2.743 4.238-5.734 6.73-9.224h-48.11c-5.235 0-6.481-3.24-4.736-7.478l.864-2.035c3.204-7.454 8.173-18.168 11.4-24.294l.704-1.319c.862-1.494 2.612-3.513 5.977-3.513h80.224c3.603-11.415 9.449-22.201 17.246-32.407 18.198-23.931 40.135-36.396 69.8-41.63 25.427-4.488 49.359-1.995 71.046 12.713 19.694 13.461 31.909 31.66 35.15 55.59 4.237 33.654-5.485 61.075-28.668 84.508-16.453 16.702-36.645 27.172-59.829 31.908-6.73 1.247-13.461 1.496-19.942 2.244-22.685-.499-43.376-6.98-60.826-21.937-12.273-10.61-20.727-23.648-24.928-38.828a104.937 104.937 0 01-10.47 16.89c-17.949 23.683-41.381 38.39-71.046 42.38-24.43 3.24-47.115-1.497-67.058-16.454-18.447-13.96-28.917-32.407-31.66-55.34-3.24-27.173 4.737-51.603 21.19-73.041 17.7-23.184 41.132-37.891 69.8-43.126 22.999-4.16 45.037-1.595 64.936 11.464zM411.12 49.017l-.798.178c-23.183 5.235-38.14 19.942-43.624 43.375-4.488 19.444 4.985 39.138 22.934 47.115 13.71 5.983 27.421 5.235 40.633-1.496 19.694-10.22 30.413-26.175 31.66-47.613-.25-3.24-.25-5.734-.749-8.227-4.436-24.401-26.664-38.324-50.056-33.332zM116.416 94.564c.997 0 1.496.748 1.496 1.745l-.499 5.983c0 .997-.997 1.745-1.745 1.745l-54.344-.249c-.997 0-1.246-.748-.748-1.496l3.49-6.232c.499-.748 1.496-1.496 2.493-1.496h49.857zM121.9 71.63c.997 0 1.496.748 1.247 1.496l-1.995 5.983c-.249.997-1.246 1.495-2.243 1.495l-117.912.25c-.997 0-1.246-.499-.748-1.247l5.235-6.73c.499-.748 1.745-1.247 2.742-1.247H121.9zm12.963-22.934c.997 0 1.246.748.748 1.496l-4.238 6.481c-.499.748-1.745 1.496-2.493 1.496l-90.24-.25c-.998 0-1.247-.498-.749-1.246l5.235-6.73c.499-.748 1.745-1.247 2.742-1.247h88.995z\"\n fill=\"#00ACD7\"\n />\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const DotNetIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 32 32\"\n >\n <path\n d=\"M4.224 10.089v11.667h1.365v-8.438a12.58 12.58 0 00-.068-1.599h.052c.099.255.224.5.37.729l6 9.302h1.672V10.089h-1.359v8.203c-.016.573.016 1.146.083 1.714h-.031a13.986 13.986 0 00-.474-.781L5.995 10.09zm12.417 0v11.667h6.203l.005-1.281h-4.813v-4.047h4.214v-1.229h-4.214v-3.875h4.521V10.09zm7.25 0v1.234h3.354v10.432h1.365V11.323h3.391v-1.234zm-23.021 10a.86.86 0 00-.609.276.91.91 0 00-.26.641.901.901 0 001.542.641c.172-.167.271-.401.271-.641s-.099-.474-.271-.641a.876.876 0 00-.641-.276H.871z\"\n fill=\"#626262\"\n />\n </Icon>\n );\n};\n","import { Language } from \"../../constants/languages\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { Metadata } from \"./metadata\";\n\nexport interface Author {\n readonly name: string;\n readonly url: string;\n}\n\nexport interface CatalogPackage {\n name: string;\n languages: Partial<Record<Language, Record<string, unknown>>>;\n version: string;\n description: string;\n author: Author | string;\n keywords: string[];\n metadata: Metadata;\n}\n\nexport interface Packages {\n packages: CatalogPackage[];\n}\n\n/**\n * Fetch the catalog of all packages from the backend.\n */\nexport const fetchPackages = async (): Promise<Packages> => {\n const response = await fetch(API_PATHS.CATALOG_SUFFIX);\n\n if (!response.ok) {\n console.error(response.statusText);\n throw new Error(`Failed fetching packages index: ${response.statusText}`);\n }\n\n return response.json();\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\n// Possible utility types for re-use\ntype PromiseFn = (...args: any[]) => Promise<any>;\ntype Awaited<T> = T extends PromiseLike<infer U> ? Awaited<U> : T;\ntype AwaitedReturn<T extends PromiseFn> = Awaited<ReturnType<T>>;\n\nexport interface UseRequestOptions<T> {\n initialValue?: T;\n onError?: (err: Error) => void;\n onSuccess?: (res: T) => void;\n}\n\nexport interface UseRequestResponse<T> {\n loading: boolean;\n error: Error | undefined;\n data: T | undefined;\n}\n\nexport type UseRequestReturn<T extends (...args: any[]) => Promise<T>> = [\n (...args: Parameters<T>) => Promise<void>,\n UseRequestResponse<AwaitedReturn<T>>\n];\n\n/**\n * Provides an API to statefully interact with promises. This hook\n * prevents state updates if promise has not resolved before component unmounts.\n * It will return a tuple with a request() function, and an object representing the state\n */\nexport const useRequest = <T extends PromiseFn>(\n requestFn: T,\n options: UseRequestOptions<AwaitedReturn<T>> = {}\n): UseRequestReturn<T> => {\n const { initialValue, onSuccess, onError } = options;\n\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<AwaitedReturn<T> | undefined>(initialValue);\n const [error, setError] = useState<Error | undefined>();\n\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const statefulFetch = useCallback(\n async (...args: Parameters<T>): Promise<void> => {\n if (!mountedRef.current) return;\n\n setLoading(true);\n setError(undefined);\n\n try {\n const res = await requestFn(...args);\n onSuccess?.(res);\n\n if (mountedRef.current) {\n setData(res);\n setLoading(false);\n }\n } catch (e: any) {\n console.error(e);\n onError?.(e);\n\n if (mountedRef.current) {\n setData(initialValue);\n setError(e);\n setLoading(false);\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onError, onSuccess]\n );\n\n return useMemo(\n () => [\n statefulFetch,\n {\n data,\n loading,\n error,\n },\n ],\n [statefulFetch, data, loading, error]\n );\n};\n","import { createContext, FunctionComponent, useContext, useEffect } from \"react\";\nimport { fetchPackages, Packages } from \"../../api/package/packages\";\nimport { useRequest, UseRequestResponse } from \"../../hooks/useRequest\";\n\nconst CatalogContext = createContext<UseRequestResponse<Packages>>({\n loading: false,\n data: undefined,\n error: undefined,\n});\n\nexport const useCatalog = () => useContext(CatalogContext);\n\nexport const CatalogProvider: FunctionComponent = ({ children }) => {\n const [requestPackages, catalogResponse] = useRequest(fetchPackages);\n\n useEffect(() => {\n void requestPackages();\n }, [requestPackages]);\n\n return (\n <CatalogContext.Provider value={catalogResponse}>\n {children}\n </CatalogContext.Provider>\n );\n};\n","import { useMemo } from \"react\";\nimport { Language } from \"../../constants/languages\";\nimport { useCatalog } from \"../../contexts/Catalog\";\n\nexport interface UseCatalogResultsOptions {\n limit: number;\n offset?: number;\n query?: string;\n language?: Language | null;\n}\n\n/**\n * A hook which encapsulates logic around applying search filters\n * and determining displayable results\n */\nexport const useCatalogResults = ({\n limit,\n offset = 0,\n query = \"\",\n language = null,\n}: UseCatalogResultsOptions) => {\n const { data, loading, error } = useCatalog();\n\n const results = useMemo(() => {\n if (loading || error || !data?.packages) return [];\n\n const filtered = data.packages.filter((item) => {\n // Filter out items which do not support the current language\n if (language && language !== Language.TypeScript) {\n if (!Object.keys(item.languages).includes(language)) {\n return false;\n }\n }\n\n // Filter items which do not match the current query\n if (query.length) {\n const itemStr = JSON.stringify(item).toLowerCase();\n const queryStr = query.toLowerCase();\n\n if (!itemStr.includes(queryStr)) {\n return false;\n }\n }\n\n return true;\n });\n\n // Next sort by most recently updated. (The sort should eventually become a parameter)\n return [...filtered].sort((p1, p2) => {\n const d1 = new Date(p1.metadata.date);\n const d2 = new Date(p2.metadata.date);\n if (d1 === d2) {\n return 0;\n }\n return d1 < d2 ? 1 : -1;\n });\n }, [data?.packages, error, language, loading, query]);\n\n const pageLimit = results ? Math.floor(results.length / limit) : 0;\n\n const displayable = useMemo(() => {\n const startIndex = (offset > pageLimit ? pageLimit : offset) * limit;\n const stopIndex = startIndex + limit;\n\n return results.slice(startIndex, stopIndex);\n }, [limit, offset, pageLimit, results]);\n\n return useMemo(\n () => ({ loading, results, error, displayable, pageLimit }),\n [displayable, error, loading, pageLimit, results]\n );\n};\n","import { Language } from \"../constants/languages\";\nimport { ROUTES, QUERY_PARAMS } from \"../constants/url\";\n\nconst gitSSHRegex = new RegExp(\n /git@github\\.com:([a-zA-Z-]+)+\\/?([a-zA-Z-]+)*(\\.git)?/\n);\n\nexport const getRepoUrlAndHost = (\n repoUrl: string\n): { url: string; hostname: string } | undefined => {\n try {\n let url = repoUrl;\n\n const sshUrl = repoUrl.match(gitSSHRegex);\n\n if (sshUrl) {\n const [, author, repo] = sshUrl;\n\n url = `https://github.com/${author}/${repo}`;\n }\n\n return {\n hostname: new URL(url).hostname,\n url,\n };\n } catch {\n // Invalid URL, return undefined as a signal that we should not display it\n return undefined;\n }\n};\n\nexport type SearchParamsObject = Record<\n string,\n string | number | undefined | null\n>;\n\nexport const createURLSearchParams = (\n params: SearchParamsObject,\n base?: string\n) => {\n const searchParams = new URLSearchParams(base);\n\n Object.entries(params)\n .filter(([, v]) => v != null)\n .forEach(([k, v]) => {\n searchParams.set(k, `${v}`);\n });\n\n return searchParams.toString();\n};\n\nexport const createURL = (base: string, params?: SearchParamsObject) => {\n let url = base;\n\n if (params) {\n const search = createURLSearchParams(params);\n\n if (search) {\n url += `?${search}`;\n }\n }\n\n return url;\n};\n\nexport const getSearchPath = ({\n query,\n offset,\n language,\n}: {\n query?: string;\n offset?: string | number;\n language?: Language | null;\n}) =>\n createURL(ROUTES.SEARCH, {\n [QUERY_PARAMS.SEARCH_QUERY]: query,\n [QUERY_PARAMS.LANGUAGE]: language,\n [QUERY_PARAMS.OFFSET]: offset ?? 0,\n });\n\nexport const getPackagePath = ({\n name,\n version,\n language,\n submodule,\n}: {\n name: string;\n version: string;\n language?: Language;\n submodule?: string;\n}) =>\n createURL(`${ROUTES.PACKAGES}/${name}/v/${version}`, {\n [QUERY_PARAMS.SUBMODULE]: submodule,\n [QUERY_PARAMS.LANGUAGE]: language,\n });\n","import {\n ChangeEventHandler,\n FormEventHandler,\n useCallback,\n useMemo,\n useState,\n Dispatch,\n SetStateAction,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { Language } from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\n\nexport interface UseCatalogSearchParams {\n defaultQuery?: string;\n defaultLanguage?: Language | null;\n}\n\nexport interface UseCatalogSearchReturn {\n /**\n * The language state for this search\n */\n language: Language | null;\n /**\n * Updates language state\n */\n onLanguageChange: (lang: Language | null) => void;\n /**\n * Input ChangeEventHandler which wraps the setQuery state setter\n */\n onQueryChange: ChangeEventHandler<HTMLInputElement>;\n /**\n * Navigates to the search query url\n */\n onSearch: () => void;\n /**\n * FormEventHandler to handle query submission\n */\n onSubmit: FormEventHandler<HTMLFormElement>;\n /**\n * The query state for this search\n */\n query: string;\n /**\n * Language state setter\n */\n setLanguage: Dispatch<SetStateAction<Language | null>>;\n /**\n * Query state setter\n */\n setQuery: Dispatch<SetStateAction<string>>;\n}\n\n/**\n * This hook provides all of the methods required to implement the functionality\n * of a client-side catalog search component. It additionally exposes lower-level methods\n * for custom components which may want to access parts of the search API\n */\nexport const useCatalogSearch = (\n options: UseCatalogSearchParams = {}\n): UseCatalogSearchReturn => {\n const [query, setQuery] = useState(options.defaultQuery ?? \"\");\n\n const [language, setLanguage] = useState<Language | null>(\n options.defaultLanguage ?? null\n );\n\n const { push } = useHistory();\n\n const onQueryChange: UseCatalogSearchReturn[\"onQueryChange\"] = (e) => {\n e.preventDefault();\n setQuery(e.target.value);\n };\n\n const onSearch = useCallback(() => {\n push(getSearchPath({ language, query }));\n }, [language, push, query]);\n\n const onSubmit: UseCatalogSearchReturn[\"onSubmit\"] = useCallback(\n (e) => {\n e?.preventDefault();\n onSearch();\n },\n [onSearch]\n );\n\n return useMemo(\n () => ({\n language,\n onLanguageChange: setLanguage,\n onQueryChange,\n onSearch,\n onSubmit,\n query,\n setLanguage,\n setQuery,\n }),\n [language, onSearch, onSubmit, query]\n );\n};\n","import { useState, useEffect } from \"react\";\n\nexport interface UseDebounceOptions<T> {\n delay?: number;\n onChange?: (val: T) => void;\n}\n\nexport const useDebounce = <T>(\n value: T,\n options: UseDebounceOptions<T> = {}\n) => {\n const [debouncedValue, setDebouncedValue] = useState(value);\n const { delay = 250, onChange } = options;\n\n useEffect(() => {\n // Update value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n onChange?.(value);\n }, delay);\n\n // Cancel timeout when value / delay changes\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay, onChange]);\n\n return debouncedValue;\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 { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","import { chakra, HTMLChakraProps, forwardRef } from \"@chakra-ui/react\";\n\nexport interface FormProps extends HTMLChakraProps<\"form\"> {}\n\nexport const Form = forwardRef<FormProps, \"form\">((props, ref) => (\n <chakra.form {...props} ref={ref} />\n));\n\nForm.displayName = \"Form\";\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"catalogSearch\", [\n \"form\",\n \"input\",\n \"languageDropdown\",\n \"languageDropdownMenu\",\n \"languageDropdownValue\",\n \"languageItem\",\n \"submit\",\n] as const);\n\nexport default testIds;\n","import { Button, forwardRef, Input } from \"@chakra-ui/react\";\nimport type { ChangeEventHandler, FunctionComponent } from \"react\";\nimport {\n Language,\n TEMP_SUPPORTED_LANGUAGES,\n LANGUAGE_NAME_MAP,\n} from \"../../constants/languages\";\nimport { Dropdown, DropdownProps } from \"./Dropdown\";\nimport testIds from \"./testIds\";\n\ntype LanguageItems = Partial<Record<Language, string>>;\n\nconst languageOptions = Object.fromEntries(\n Object.entries(LANGUAGE_NAME_MAP).filter(([key]) =>\n TEMP_SUPPORTED_LANGUAGES.has(key as Language)\n )\n) as LanguageItems;\n\nconst LanguageDropdown: FunctionComponent<DropdownProps<LanguageItems>> =\n Dropdown;\n\nexport interface CatalogSearchInputsProps {\n /**\n * Controls the query state value\n */\n query: string;\n /**\n * Controls the query state change event\n */\n onQueryChange: ChangeEventHandler<HTMLInputElement>;\n /**\n * Controls the language state value\n */\n language: Language | null;\n /**\n * Controls the language state change event\n */\n onLanguageChange: (language: Language | null) => void;\n}\n\nexport const CatalogSearchInputs = forwardRef<\n CatalogSearchInputsProps,\n \"input\"\n>(({ query, onQueryChange, language, onLanguageChange }, ref) => (\n <>\n <Input\n bg=\"white\"\n borderColor=\"blue.100\"\n boxShadow=\"base\"\n data-testid={testIds.input}\n name=\"query\"\n onChange={onQueryChange}\n placeholder=\"Search Constructs...\"\n ref={ref}\n value={query}\n />\n <LanguageDropdown\n items={languageOptions}\n onSelect={onLanguageChange}\n placeholder=\"Language...\"\n selected={language}\n testIds={{\n item: testIds.languageItem,\n menu: testIds.languageDropdownMenu,\n trigger: testIds.languageDropdown,\n value: testIds.languageDropdownValue,\n }}\n />\n <Button\n boxShadow=\"base\"\n colorScheme=\"blue\"\n data-testid={testIds.submit}\n type=\"submit\"\n >\n Search\n </Button>\n </>\n));\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Menu,\n MenuButton,\n MenuItem,\n MenuList,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface DropdownProps<T = Record<string, string>> {\n testIds: {\n item: string;\n menu: string;\n trigger: string;\n value: string;\n };\n placeholder: string;\n selected: T[keyof T] | null;\n onSelect: (val: keyof T | null) => void;\n items: T;\n}\n\nexport const Dropdown: FunctionComponent<DropdownProps> = ({\n placeholder,\n items,\n onSelect,\n selected,\n testIds,\n}) => {\n const text = selected ? items[selected] : placeholder;\n const options = Object.entries(items);\n\n return (\n <Menu strategy=\"fixed\">\n <MenuButton\n as={Button}\n bg=\"white\"\n borderColor=\"blue.100\"\n boxShadow=\"base\"\n data-testid={testIds.trigger}\n rightIcon={<ChevronDownIcon color=\"blue.500\" />}\n variant=\"outline\"\n >\n <Text data-testid={testIds.value}>{text}</Text>\n </MenuButton>\n <MenuList data-testid={testIds.menu}>\n <MenuItem data-testid={testIds.item} onClick={() => onSelect(null)}>\n Any\n </MenuItem>\n {options.map(([name, displayName]) => (\n <MenuItem\n data-testid={testIds.item}\n key={name}\n onClick={() => onSelect(name)}\n >\n {displayName}\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n );\n};\n","import { Grid } from \"@chakra-ui/react\";\nimport type { FormEventHandler, FunctionComponent } from \"react\";\nimport { Form } from \"../Form\";\nimport {\n CatalogSearchInputs,\n CatalogSearchInputsProps,\n} from \"./CatalogSearchInputs\";\nimport testIds from \"./testIds\";\n\nexport interface CatalogSearchProps extends CatalogSearchInputsProps {\n /**\n * Called when the catalog search form is submitted (via enter keypress or submit click)\n */\n onSubmit: FormEventHandler<HTMLFormElement>;\n}\n\nexport const CatalogSearch: FunctionComponent<CatalogSearchProps> = ({\n onSubmit,\n ...props\n}) => {\n return (\n <Form data-testid={testIds.form} onSubmit={onSubmit}>\n <Grid\n autoRows=\"1fr\"\n gap={4}\n templateColumns={{ sm: \"1fr\", md: \"3fr 1fr 1fr\" }}\n width=\"full\"\n >\n <CatalogSearchInputs {...props} />\n </Grid>\n </Form>\n );\n};\n","import { HTMLChakraProps, ListItem, forwardRef } from \"@chakra-ui/react\";\nimport type { KeyboardEventHandler } from \"react\";\n\nexport interface SearchItemProps extends HTMLChakraProps<\"li\"> {\n name: string;\n onClick: () => void;\n}\n\nexport const SearchItem = forwardRef<SearchItemProps, \"li\">(\n ({ name, onClick, ...props }, ref) => {\n const onKeyDown: KeyboardEventHandler<HTMLLIElement> = (e) => {\n if (e.key === \"Enter\") {\n onClick();\n }\n };\n\n return (\n <ListItem\n alignItems=\"center\"\n display=\"flex\"\n fontSize=\"lg\"\n h={12}\n lineHeight=\"base\"\n listStyleType=\"none\"\n onClick={onClick}\n onKeyDown={onKeyDown}\n px={4}\n ref={ref}\n role=\"option\"\n sx={{ \":hover, :focus\": { bg: \"gray.100\" } }}\n tabIndex={0}\n {...props}\n >\n {name}\n </ListItem>\n );\n }\n);\n\nSearchItem.displayName = \"SearchItem\";\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"searchModal\", [\"container\"] as const);\n\nexport default testIds;\n","import {\n Divider,\n Heading,\n Modal,\n ModalBody,\n ModalCloseButton,\n ModalContent,\n ModalHeader,\n ModalOverlay,\n Portal,\n Stack,\n UnorderedList,\n} from \"@chakra-ui/react\";\nimport { FormEventHandler, FunctionComponent, useRef } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { QUERY_PARAMS, ROUTES } from \"../../constants/url\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { useCatalogSearch } from \"../../hooks/useCatalogSearch\";\nimport { useDebounce } from \"../../hooks/useDebounce\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { CatalogSearchInputs } from \"../CatalogSearch\";\nimport { Form } from \"../Form\";\nimport { SearchItem } from \"../SearchItem\";\nimport testIds from \"./testIds\";\n\nexport interface SearchModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport const SearchModal: FunctionComponent<SearchModalProps> = ({\n isOpen,\n onClose,\n}) => {\n const { push } = useHistory();\n const [currentLanguage] = useLanguage();\n const { onSubmit: onSearchSubmit, ...searchAPI } = useCatalogSearch();\n const { query, language } = useDebounce({\n query: searchAPI.query,\n language: searchAPI.language,\n });\n\n const { displayable } = useCatalogResults({\n limit: 5,\n offset: 0,\n query,\n language,\n });\n\n const showResults = (query || language) && displayable.length > 0;\n const inputRef = useRef<HTMLInputElement>(null);\n\n const navigate = (to: string) => {\n onClose();\n push(to);\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n onClose();\n onSearchSubmit(e);\n };\n\n return (\n <Portal>\n <Modal initialFocusRef={inputRef} isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent data-testid={testIds.container}>\n <ModalCloseButton />\n <ModalHeader>Search modules or providers</ModalHeader>\n <ModalBody>\n <Form onSubmit={onSubmit} pb={4}>\n <Stack spacing={4}>\n <CatalogSearchInputs ref={inputRef} {...searchAPI} />\n </Stack>\n </Form>\n {showResults && (\n <>\n <Divider />\n <Heading fontSize=\"md\" my={4} textAlign=\"center\">\n Suggestions\n </Heading>\n <UnorderedList>\n {displayable.map((pkg) => (\n <SearchItem\n key={pkg.name}\n name={pkg.name}\n onClick={() =>\n navigate(\n `${ROUTES.PACKAGES}/${pkg.name}/v/${pkg.version}?${\n QUERY_PARAMS.LANGUAGE\n }=${language ?? currentLanguage}`\n )\n }\n />\n ))}\n </UnorderedList>\n </>\n )}\n </ModalBody>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n </Portal>\n );\n};\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport { Button, IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { ROUTES } from \"../../constants/url\";\nimport { SearchModal } from \"../SearchModal\";\nimport testIds from \"./testIds\";\n\nexport const SearchButton: FunctionComponent = () => {\n const searchModal = useDisclosure();\n const { pathname } = useLocation();\n\n if ([ROUTES.HOME, ROUTES.SEARCH].some((path) => path === pathname)) {\n return null;\n }\n\n return (\n <>\n {/* Desktop / Tablet Search Trigger */}\n <Button\n align=\"center\"\n color=\"gray.600\"\n colorScheme=\"gray\"\n data-testid={testIds.searchButton}\n display={{ base: \"none\", md: \"flex\" }}\n fontWeight=\"medium\"\n justifyContent=\"space-between\"\n m=\"0 auto\"\n maxW=\"500px\"\n onClick={searchModal.onOpen}\n rightIcon={<SearchIcon color=\"gray.600\" ml={4} />}\n variant=\"outline\"\n w=\"100%\"\n >\n Search Constructs...\n </Button>\n {/* Mobile Search Trigger */}\n <IconButton\n aria-label=\"Search Icon\"\n borderRadius=\"md\"\n data-testid={testIds.searchIcon}\n display={{ base: \"initial\", md: \"none\" }}\n icon={<SearchIcon color=\"gray.600\" />}\n onClick={searchModal.onOpen}\n variant=\"ghost\"\n />\n <SearchModal {...searchModal} />\n </>\n );\n};\n","import { Box, Grid, GridItem, GridItemProps } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Documentation } from \"./Documentation\";\nimport { NavButton } from \"./NavButton\";\nimport { Resources } from \"./Resources\";\nimport { SearchButton } from \"./SearchButton\";\nimport testIds from \"./testIds\";\nimport { Title } from \"./Title\";\n\nconst HeaderItem: FunctionComponent<GridItemProps> = (props) => (\n <GridItem align=\"center\" justify=\"center\" rowStart={1} {...props} />\n);\n\nexport const Header: FunctionComponent = () => {\n return (\n <Grid\n alignItems=\"center\"\n as=\"header\"\n bg=\"white\"\n boxShadow=\"base\"\n data-testid={testIds.container}\n gap={4}\n gridTemplateColumns={{\n base: \"1fr 3fr 1fr\",\n md: \"minmax(200px, 2fr) minmax(200px, 3fr) 2fr\",\n }}\n gridTemplateRows=\"1fr\"\n maxW=\"100vw\"\n position=\"sticky\"\n px={4}\n py={4}\n top={0}\n w=\"100%\"\n zIndex=\"sticky\"\n >\n {/* Logo / Header */}\n <HeaderItem\n colStart={{ base: 2, md: 1 }}\n justifySelf={{ base: \"center\", md: \"start\" }}\n >\n <Title />\n </HeaderItem>\n\n {/* Search Trigger */}\n <HeaderItem\n colStart={{ base: 3, md: 2 }}\n justifySelf={{ base: \"end\", md: \"stretch\" }}\n >\n <SearchButton />\n </HeaderItem>\n\n {/* Navigation */}\n <HeaderItem\n colStart={{ base: 1, md: 3 }}\n justifySelf={{ base: \"start\", md: \"end\" }}\n >\n <Grid\n display={{ base: \"none\", md: \"grid\" }}\n gap={4}\n gridTemplateColumns=\"1fr 1fr\"\n gridTemplateRows=\"1fr\"\n placeItems=\"center\"\n w=\"100%\"\n >\n <Box>\n <Documentation />\n </Box>\n <Box>\n <Resources />\n </Box>\n </Grid>\n <NavButton />\n </HeaderItem>\n </Grid>\n );\n};\n","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 {\n useContext,\n useCallback,\n useRef,\n createContext,\n FunctionComponent,\n} from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { PageViewConfig } from \"./types\";\n\nexport interface AnalyticsAPI {\n trackPageView: (opts: PageViewConfig) => void;\n}\n\nconst AnalyticsContext = createContext<AnalyticsAPI>({\n trackPageView: () => {},\n});\n\nexport const useAnalytics = () => useContext(AnalyticsContext);\n\nexport const AnalyticsProvider: FunctionComponent = ({ children }) => {\n const { pathname } = useLocation();\n\n const prevPath = useRef<null | string>(null);\n\n const trackPageView = useCallback(\n (opts: PageViewConfig) => {\n if (prevPath.current === pathname) {\n return;\n }\n\n window?.AWSMA?.ready?.(() => {\n document.dispatchEvent(\n new CustomEvent(window.AWSMA.TRIGGER_EVENT, { detail: opts })\n );\n\n prevPath.current = pathname;\n });\n },\n [pathname]\n );\n\n return (\n <AnalyticsContext.Provider value={{ trackPageView }}>\n {children}\n </AnalyticsContext.Provider>\n );\n};\n","import { useCallback, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { useAnalytics } from \"./Analytics\";\nimport type { PageViewOptions, PageViewConfig } from \"./types\";\n\nexport const usePageView = (opts: PageViewOptions) => {\n const { trackPageView } = useAnalytics();\n const { pathname } = useLocation();\n\n const options: PageViewConfig = useMemo(\n () => ({\n page: {\n // This is silly but the analytics library crashes in dev if using localhost as the pageURL :/\n pageURL: window.location.href.replace(\n \"://localhost:3000\",\n \"://constructs.local.dev\"\n ),\n ...opts.page,\n },\n event: {\n type: \"pageview\",\n name: opts.event.name,\n description: opts.event.description,\n },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pathname, opts]\n );\n\n const track = useCallback(() => {\n return trackPageView(options);\n }, [trackPageView, options]);\n\n return track;\n};\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 {\n Heading,\n Text,\n AccordionIcon,\n AccordionButton,\n AccordionItem,\n AccordionPanel,\n Box,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent, ReactChild } from \"react\";\n\nexport interface FAQItemProps {\n question: ReactChild;\n}\n\nexport const FAQItem: FunctionComponent<FAQItemProps> = ({\n question,\n children,\n}) => (\n <AccordionItem>\n <AccordionButton>\n <Box flex=\"1\" py={2} textAlign=\"left\">\n <Heading as=\"h3\" ml={8} size=\"sm\">\n {question}\n </Heading>\n </Box>\n <AccordionIcon />\n </AccordionButton>\n <AccordionPanel px={12} py={4}>\n <Text\n color=\"gray.800\"\n fontSize=\"md\"\n sx={{ p: { marginTop: \"0\", marginBottom: \"4\" } }}\n >\n {children}\n </Text>\n </AccordionPanel>\n </AccordionItem>\n);\n","import { FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../../components/ExternalLink\";\n\nexport interface FAQLinkProps {\n href: string;\n}\n\nexport const FAQLink: FunctionComponent<FAQLinkProps> = ({\n href,\n children,\n}) => (\n <ExternalLink\n color=\"inherit\"\n hasWarning={false}\n href={href}\n textDecoration=\"underline\"\n >\n {children}\n </ExternalLink>\n);\n","import {\n AccordionIcon,\n AccordionButton,\n AccordionItem,\n AccordionPanel,\n Heading,\n Box,\n Accordion,\n} from \"@chakra-ui/react\";\n\nimport type { FunctionComponent } from \"react\";\n\nexport interface FAQSectionProps {\n heading: string;\n}\n\nexport const FAQSection: FunctionComponent<FAQSectionProps> = ({\n heading,\n children,\n}) => (\n <AccordionItem>\n <AccordionButton>\n <Box flex=\"1\" textAlign=\"left\">\n <Heading as=\"h2\" ml={4} size=\"lg\">\n {heading}\n </Heading>\n </Box>\n <AccordionIcon />\n </AccordionButton>\n <AccordionPanel p={0}>\n <Accordion allowMultiple w=\"100%\">\n {children}\n </Accordion>\n </AccordionPanel>\n </AccordionItem>\n);\n","import { Box, Heading, Accordion } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Page } from \"../../components/Page\";\nimport { FAQItem } from \"./FAQItem\";\nimport { FAQLink } from \"./FAQLink\";\nimport { FAQSection } from \"./FAQSection\";\n\nexport const FAQ: FunctionComponent = () => (\n <Page\n meta={{\n title: \"FAQ\",\n description: \"Frequently Asked Questions\",\n }}\n pageName=\"faq\"\n >\n <Box bg=\"white\" color=\"blue.800\" h=\"100%\" w=\"100%\">\n <Box bg=\"gray.50\" py={20} width=\"100%\">\n <Heading as=\"h1\" mx=\"auto\" textAlign=\"center\">\n Frequently Asked Questions\n </Heading>\n </Box>\n <Accordion allowMultiple defaultIndex={[0, 1]}>\n <FAQSection heading=\"General\">\n <FAQItem question=\"What is Construct Hub?\">\n <p>\n It is a central destination to discover and share cloud\n application design patterns and reference architectures defined\n for the AWS CDK, CDK for Kubernetes (CDK8s), CDK for Terraform\n (CDKtf) and any other construct-based tool.\n </p>\n </FAQItem>\n <FAQItem question=\"Why should I use Construct Hub?\">\n <p>\n Construct Hub is built to serve the community that uses the\n constructs programming model (CPM) and to allow them find publicly\n available constructs they can reuse. Before the Construct Hub,\n developers did not have an easy way to discover construct\n libraries created by the community since they were published\n across various package managers and without a central index.\n </p>\n <p>\n The Construct Hub is a central, trusted venue CDK developers can\n use to discover published constructs to help them build their\n applications. In the Dev Preview Construct Hub you can discover\n constructs in TypeScript and Python and read their documentation\n and improved API reference in the programming language that the\n package supports.\n </p>\n </FAQItem>\n <FAQItem question=\"How can I add my construct to the Construct Hub?\">\n <p>\n In order to add your construct to the Construct Hub, you will need\n to publish it to the{\" \"}\n <FAQLink href=\"https://www.npmjs.com/\">npmjs.com</FAQLink>{\" \"}\n registry, use a permissive license (Apache, BSD, MIT), and\n annotate it with one of the supported keywords (aws-cdk, cdk8s or\n cdktf).\n </p>\n <p>\n Additionally, since one of the main goals of the Construct Hub is\n to enable an ecosystem of constructs that can be consumed by all\n CDK languages, your library <strong>must</strong> be compiled with{\" \"}\n <FAQLink href=\"https://aws.github.io/jsii/\">JSII</FAQLink>, which\n is a TypeScript-based, which is a TypeScript-based programming\n language for creating multi-language libraries. The Construct Hub\n leverages the type information produced by the JSII compiler in\n order to render the rich multi-language API reference displayed at\n the Construct Hub.\n </p>\n <p>\n The Construct Hub monitors all updates to the npm Registry and\n will list any packages that meet the above requirements within\n 5-10 minutes. If your package does not appear in the Construct\n Hub, please file an issue on our GitHub repository.\n </p>\n <p>\n There’s some great community content about publishing construct\n libraries. Check out{\" \"}\n <FAQLink href=\"https://dev.to/aws-builders/a-beginner-s-guide-to-create-aws-cdk-construct-library-with-projen-5eh4\">\n &quot;A Beginner&apos;s Guide to Create AWS CDK Construct\n Library with projen&quot;\n </FAQLink>{\" \"}\n by <FAQLink href=\"https://hayao-k.dev/\">hayao-k</FAQLink>.\n </p>\n <p>\n If you already have a library written in TypeScript and you are\n looking for information on how to migrate to JSII, see the{\" \"}\n <FAQLink href=\"https://aws.github.io/jsii/user-guides/#library-author-guide\">\n JSII library author guide\n </FAQLink>\n .\n </p>\n </FAQItem>\n <FAQItem question=\"What is a construct?\">\n <p>\n The Constructs Programming Model (CPM) introduces the notion of{\" \"}\n <strong>constructs</strong>, which represent cloud building blocks\n that can be used to assemble complete applications of any\n complexity. AWS, enterprises, start-ups, and individual developers\n use CDK constructs to share proven architecture patterns as\n reusable code libraries, so that everyone can benefit from the\n collective wisdom of the community.\n </p>\n </FAQItem>\n <FAQItem question=\"Who owns the constructs in the Construct Hub?\">\n <p>\n The constructs are owned by the publishers of the packages.\n Constructs are user generated content that are governed by their\n own license terms which is displayed in the search results and can\n be accessed directly through the hyperlinked package page.\n </p>\n </FAQItem>\n <FAQItem question=\"Is the content served in Construct Hub meant to be consumed programmatically?\">\n <p>\n No. The content displayed in the site is user generated, with some\n display formatting. We do not advise that you consume constructs\n from the search results programmatically. Please note that\n Construct Hub is a search engine intended to surface third party\n content from a public endpoint and we provide these results for\n your convenience AS-IS in accordance with our{\" \"}\n <FAQLink href=\"https://constructs.dev/terms\">Site Terms</FAQLink>.\n </p>\n </FAQItem>\n <FAQItem question=\"Which CDK types are available on the Construct Hub?\">\n <p>\n AWS CDK, CDK for Kubernetes (CDK8s) and CDK for Terraform (CDKtf).\n </p>\n </FAQItem>\n <FAQItem question=\"What is AWS CDK?\">\n <p>\n AWS CDK is an open-source software development framework for\n defining applications on AWS and reusable abstractions using\n familiar programming languages and rich object-oriented APIs. AWS\n CDK apps synthesize intostandard CloudFormation templates which\n can be deployed to create infrastructure on AWS. For more\n information, click{\" \"}\n <FAQLink href=\"https://docs.aws.amazon.com/cdk/latest/guide/home.html\">\n here\n </FAQLink>\n .\n </p>\n </FAQItem>\n <FAQItem question=\"What is CDK8s?\">\n <p>\n CDK8s is an open-source software development framework for\n defining Kubernetes applications and reusable abstractions using\n familiar programming languages and rich object-oriented APIs.{\" \"}\n <strong>cdk8s</strong> apps synthesize into standard Kubernetes\n manifests which can be applied to any Kubernetes cluster. For more\n information, click{\" \"}\n <FAQLink href=\"https://cdk8s.io/\">here</FAQLink>.\n </p>\n </FAQItem>\n <FAQItem question=\"What is CDKtf?\">\n <p>\n The community preview of the{\" \"}\n <FAQLink href=\"https://aws.amazon.com/cdk/\">\n Cloud Development Kit\n </FAQLink>\n for Terraform allows you to define infrastructure using a familiar\n programming language such as TypeScript, Python, or Go, while\n leveraging the hundreds of providers and thousands of module\n definitions provided by Terraform and the Terraform ecosystem. For\n more information, click{\" \"}\n <FAQLink href=\"https://learn.hashicorp.com/tutorials/terraform/cdktf\">\n here\n </FAQLink>\n .\n </p>\n </FAQItem>\n <FAQItem question=\"What programming languages are supported in Dev Preview?\">\n <p>The Construct Hub Dev Preview supports Python and TypeScript.</p>\n </FAQItem>\n <FAQItem question=\"Is the support for .NET, Java and Go in the roadmap?\">\n <p>Yes.</p>\n </FAQItem>\n <FAQItem question=\"Can I view the source code of a construct?\">\n <p>\n For each package you can click the repository link that the\n publisher provided with the package. Theoretically this link\n should redirect your to the package’s repository. However, we\n noticed that sometimes the code in the repository can be more or\n less updated than the package’s code. Please take that into\n account.\n </p>\n </FAQItem>\n <FAQItem question=\"How can I install a package?\">\n <p>\n Press “Install” in the package page and you’ll see the\n installation instructions.\n </p>\n </FAQItem>\n <FAQItem question=\"How can I report a package?\">\n <p>\n You can report a package by clicking &quot;Report a package&quot;\n from the package page. For claims of copyright infringement, read\n here:{\" \"}\n <FAQLink href=\"https://aws.amazon.com/terms/#notice-and-procedure-for-making-claims-of-copyright-infringement\">\n https://aws.amazon.com/terms/#notice-and-procedure-for-making-claims-of-copyright-infringement\n </FAQLink>\n .\n </p>\n </FAQItem>\n <FAQItem question=\"How can I open a bug or send a PR for a package?\">\n <p>\n The package is owned by the publisher. To report a bug or send a\n PR, you should go to the repository link the publisher provided\n and open a ticket there\n </p>\n </FAQItem>\n <FAQItem question=\"Why isn’t my package displayed in the Construct Hub?\">\n <p>\n The Construct Hub displays only publicly available constructs that\n are JSII compatible and that were published on a public npm\n registry with an open source license. The package should be\n published on npm registry with the one of the following Keywords:\n aws-cdk, cdk8s or cdktf.\n </p>\n </FAQItem>\n <FAQItem question=\"Can I update my package after it has been displayed?\">\n <p>\n Yes. You should publish a new valid version to the public npm\n registry. We will detect the new version and display it on the\n Construct Hub.\n </p>\n </FAQItem>\n <FAQItem question=\"How does the Construct Hub relates to the Construct Catalog?\">\n <p>\n The Construct Catalog was built by the CDK community in\n collaboration with the AWS CDK team. The Construct Hub is the\n official version for the Construct Catalog.{\" \"}\n <FAQLink href=\"https://awscdk.io\">https://awscdk.io</FAQLink> now\n redirects to the Construct Hub.\n </p>\n </FAQItem>\n <FAQItem question=\"How can I participate in the Construct Hub community?\">\n <p>\n The Construct Hub is built as a public construct. Please join the{\" \"}\n <FAQLink href=\"https://github.com/cdklabs/construct-hub-webapp\">\n Construct Hub GitHub community\n </FAQLink>\n . You are also welcome to join the #construct-hub-dev channel in\n the <FAQLink href=\"https://cdk.dev/\">CDK community</FAQLink> Slack\n workspace.\n </p>\n </FAQItem>\n <FAQItem question=\"Is there a community slack channel for the CDK community?\">\n <p>\n Please join the CDK Slack channel (\n <FAQLink href=\"https://cdk.dev/\">https://cdk.dev/</FAQLink>). This\n Slack channel is managed by the CDK community for the CDK\n community.\n </p>\n </FAQItem>\n </FAQSection>\n <FAQSection heading=\"Getting Started\">\n <FAQItem question=\"Do I need a user for the Construct Hub?\">\n <p>No. The Construct Hub doesn’t require any signup.</p>\n </FAQItem>\n <FAQItem question=\"How do I get started?\">\n <p>\n Use our home page to discover publicly available packages. You may\n run a search to find packages you’re interested in and mention\n your preferred programming language. For each package you will\n find helpful information such as README and API reference for the\n supported programming languages. You will also find links and\n keywords that the publisher provided with the package and\n installation instructions.\n </p>\n </FAQItem>\n </FAQSection>\n </Accordion>\n </Box>\n </Page>\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 { 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\n if (isSupported) {\n return <>{children}</>;\n }\n\n return (\n <Tooltip\n hasArrow\n label={`Documentation support for ${LANGUAGE_NAME_MAP[language]} is coming soon!`}\n placement=\"top-start\"\n >\n <span>{children}</span>\n </Tooltip>\n );\n };\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Language } from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n language?: Language;\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n language,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ query: `${value}`, language })}\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 { 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 { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"catalogCard\", [\n \"container\",\n \"name\",\n \"version\",\n \"tags\",\n \"description\",\n \"date\",\n \"author\",\n \"languages\",\n] as const);\n\nexport default testIds;\n","import { Grid, LinkBox } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Card } from \"../Card\";\nimport testIds from \"./testIds\";\n\nconst CardContainer: FunctionComponent = ({ children }) => (\n <Card h={64} p={0} w=\"100%\">\n <Grid\n as=\"article\"\n h=\"100%\"\n overflow=\"hidden\"\n templateColumns=\"1fr\"\n templateRows=\"2fr 1fr\"\n >\n {children}\n </Grid>\n </Card>\n);\n\nexport const CatalogCardContainer: FunctionComponent<{ isLink?: boolean }> = ({\n children,\n isLink,\n}) => {\n return isLink ? (\n <LinkBox\n _hover={{\n \"> :first-child\": {\n bg: \"gray.50\",\n },\n }}\n data-testid={testIds.container}\n >\n <CardContainer>{children}</CardContainer>\n </LinkBox>\n ) : (\n <CardContainer>{children}</CardContainer>\n );\n};\n","import { Box, Divider, Skeleton, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const CatalogCardSkeleton: FunctionComponent = () => (\n <>\n <Stack p={4} spacing={4}>\n <Skeleton h={5} w=\"50%\" />\n <Stack align=\"center\" direction=\"row\" spacing={2}>\n <Skeleton h={5} w={10} />\n <Skeleton h={5} w={10} />\n <Skeleton h={5} w={10} />\n </Stack>\n <Skeleton h={3} w=\"75%\" />\n <Skeleton h={3} w=\"50%\" />\n </Stack>\n <Box>\n <Divider />\n <Stack px={4} py={2} spacing={2}>\n <Skeleton h={5} w=\"25%\" />\n <Stack align=\"center\" direction=\"row\" spacing={2}>\n <Skeleton h={5} w={10} />\n <Skeleton h={5} w={10} />\n <Skeleton h={5} w={10} />\n <Skeleton h={5} w={10} />\n </Stack>\n </Stack>\n </Box>\n </>\n);\n","import {\n Box,\n Divider,\n Flex,\n LinkBox,\n Link as UILink,\n LinkOverlay,\n Stack,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport {\n Language,\n LANGUAGES,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getPackagePath, getSearchPath } from \"../../util/url\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\nimport { PackageTag } from \"../PackageTag\";\nimport { Time } from \"../Time\";\nimport { CatalogCardContainer } from \"./CatalogCardContainer\";\nimport { CatalogCardSkeleton } from \"./CatalogCardSkeleton\";\nimport testIds from \"./testIds\";\n\nexport interface CatalogCardProps {\n /**\n * Specifies the language to link to by default\n */\n language?: Language;\n /**\n * If undefined, will render a skeleton\n */\n pkg?: CatalogPackage;\n}\n\nexport const CatalogCard: FunctionComponent<CatalogCardProps> = ({\n language: currentLanguage,\n pkg,\n}) => {\n if (!pkg) {\n return (\n <CatalogCardContainer>\n <CatalogCardSkeleton />\n </CatalogCardContainer>\n );\n }\n\n const publishDate = pkg.metadata?.date ? (\n <Time\n date={new Date(pkg.metadata.date)}\n fontSize=\"sm\"\n format=\"MMMM dd, yyyy\"\n />\n ) : null;\n\n const author = pkg.author ?? {};\n const languages = pkg.languages ?? {};\n const targets = Object.keys(languages) as Language[];\n\n const getUrl = (params?: Partial<Parameters<typeof getPackagePath>[0]>) =>\n getPackagePath({\n name: pkg.name,\n version: pkg.version,\n language: currentLanguage,\n ...params,\n });\n\n const authorName = typeof author === \"string\" ? author : author.name;\n\n return (\n <CatalogCardContainer isLink>\n <Stack maxH=\"100%\" maxW=\"100%\" overflow=\"hidden\" p={4} spacing={0}>\n {/* Name & Version */}\n <LinkOverlay as={Link} to={getUrl()}>\n <Text\n color=\"blue.800\"\n data-testid={testIds.name}\n fontWeight=\"semibold\"\n isTruncated\n >\n {pkg.name}\n\n <Text\n as=\"span\"\n color=\"blue.500\"\n data-testid={testIds.version}\n fontSize=\"xs\"\n ml={2}\n >\n {pkg.version}\n </Text>\n </Text>\n </LinkOverlay>\n\n {/* Tags */}\n <LinkBox\n as={Flex}\n data-testid={testIds.tags}\n flexWrap=\"wrap\"\n maxH={6}\n overflow=\"hidden\"\n >\n {[\n pkg.name.startsWith(\"@aws-cdk/\") ? (\n <PackageTag\n key=\"official\"\n label=\"official\"\n language={currentLanguage}\n mr={1}\n value=\"@aws-cdk\"\n variant=\"official\"\n >\n Official\n </PackageTag>\n ) : null,\n ...pkg.keywords\n .filter(Boolean)\n .slice(0, 3)\n .map((tag) => {\n return (\n <PackageTag\n key={tag}\n language={currentLanguage}\n mr={1}\n value={`\"${tag}\"`}\n zIndex=\"0 !important\"\n >\n {tag}\n </PackageTag>\n );\n }),\n ]}\n </LinkBox>\n <Text data-testid={testIds.description} fontSize=\"sm\" noOfLines={2}>\n {pkg.description}\n </Text>\n </Stack>\n\n {/* Bottom Details */}\n <Box>\n <Divider />\n <Stack maxW=\"100%\" overflow=\"hidden\" px={4} py={2} spacing={2}>\n <Text data-testid={testIds.date} fontSize=\"sm\" isTruncated>\n {publishDate}\n </Text>\n\n <UILink\n as={Link}\n color=\"blue.500\"\n data-testid={testIds.author}\n fontSize=\"sm\"\n to={getSearchPath({ query: authorName })}\n >\n {authorName}\n </UILink>\n\n {/* Language Support Icons */}\n <LinkBox\n align=\"center\"\n as={Stack}\n data-testid={testIds.languages}\n direction=\"row\"\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 ||\n 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 h={6}\n opacity={isSupportedByConstructHub ? 1 : 0.2}\n w={6}\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={getUrl({ language })}\n >\n {icon}\n </Link>\n ) : (\n icon\n )}\n </LanguageSupportTooltip>\n );\n })}\n </LinkBox>\n </Stack>\n </Box>\n </CatalogCardContainer>\n );\n};\n","import { SimpleGrid } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const ResultsGrid: FunctionComponent = ({ children }) => (\n <SimpleGrid\n columns={{\n base: 1,\n sm: 2,\n md: 3,\n lg: 4,\n xl: 5,\n \"2xl\": 6,\n }}\n spacing={6}\n >\n {children}\n </SimpleGrid>\n);\n","import { FunctionComponent, memo } from \"react\";\nimport { CatalogCard } from \"../CatalogCard\";\nimport { ResultsGrid } from \"./ResultsGrid\";\n\nexport interface ResultsSkeletonProps {\n noOfItems: number;\n}\n\nconst ResultsSkeletonComponent: FunctionComponent<ResultsSkeletonProps> = ({\n noOfItems,\n}) => {\n const skeletons = [];\n\n for (let i = 0; i < noOfItems; i += 1) {\n skeletons.push(<CatalogCard key={i} />);\n }\n\n return <ResultsGrid>{skeletons}</ResultsGrid>;\n};\n\nexport const ResultsSkeleton = memo(\n ResultsSkeletonComponent\n) as typeof ResultsSkeletonComponent;\n","import { FunctionComponent, memo } from \"react\";\nimport { Packages } from \"../../api/package/packages\";\nimport { Language } from \"../../constants/languages\";\nimport { CatalogCard } from \"../CatalogCard\";\nimport { ResultsGrid } from \"./ResultsGrid\";\nimport { ResultsSkeleton } from \"./ResultsSkeleton\";\n\nexport interface ResultsProps {\n language?: Language;\n results: Packages[\"packages\"];\n skeleton?: {\n loading: boolean;\n noOfItems: number;\n };\n}\n\nconst ResultsComponent: FunctionComponent<ResultsProps> = ({\n language,\n results,\n skeleton,\n}) => {\n if (skeleton?.loading) {\n return <ResultsSkeleton noOfItems={skeleton.noOfItems} />;\n }\n\n return (\n <ResultsGrid>\n {results.map((pkg, idx) => (\n <CatalogCard key={`${pkg.name}-${idx}`} language={language} pkg={pkg} />\n ))}\n </ResultsGrid>\n );\n};\n\nexport const Results = memo(ResultsComponent) as typeof ResultsComponent;\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"home\", [\n \"headings\",\n \"results\",\n \"nextPageBtn\",\n \"nextIcon\",\n \"prevIcon\",\n] as const);\n\nexport default testIds;\n","import {\n ArrowForwardIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"@chakra-ui/icons\";\nimport { Grid, GridItem, Button, Flex, IconButton } from \"@chakra-ui/react\";\nimport type { Dispatch, FunctionComponent, SetStateAction } from \"react\";\nimport testIds from \"./testIds\";\n\nconst iconBtnProps = {\n borderRadius: \"md\",\n borderColor: \"blue.500\",\n colorScheme: \"blue\",\n mx: 2,\n h: 10,\n w: 10,\n variant: \"outline\",\n};\n\nconst iconProps = {\n color: \"blue.500\",\n h: 5,\n w: 5,\n};\n\nexport interface HomePageControlsProps {\n offset: number;\n pageLimit: number;\n setOffset: Dispatch<SetStateAction<number>>;\n}\n\nexport const HomePageControls: FunctionComponent<HomePageControlsProps> = ({\n offset,\n pageLimit,\n setOffset,\n}) => {\n const nextDisabled = offset === pageLimit;\n const prevDisabled = offset === 0;\n\n const getNextPage = () => {\n setOffset(offset + 1);\n };\n\n const getPrevPage = () => {\n setOffset(offset - 1);\n };\n\n return (\n <Grid\n alignItems=\"center\"\n pt={6}\n templateColumns=\"repeat(3, 1fr)\"\n templateRows=\"1fr\"\n >\n <GridItem colStart={2} justifySelf=\"center\">\n <Button\n colorScheme=\"blue\"\n data-testid={testIds.nextPageBtn}\n disabled={nextDisabled}\n onClick={getNextPage}\n rightIcon={<ArrowForwardIcon color=\"white\" />}\n >\n Next Page\n </Button>\n </GridItem>\n <GridItem colStart={3} justifySelf=\"end\">\n <Flex align=\"center\" justify=\"center\" py={4}>\n <IconButton\n aria-label=\"Previous Page\"\n data-testid={testIds.prevIcon}\n disabled={prevDisabled}\n icon={<ChevronLeftIcon {...iconProps} />}\n onClick={getPrevPage}\n {...iconBtnProps}\n />\n <IconButton\n aria-label=\"Next Page\"\n data-testid={testIds.nextIcon}\n disabled={nextDisabled}\n icon={<ChevronRightIcon {...iconProps} />}\n onClick={getNextPage}\n {...iconBtnProps}\n />\n </Flex>\n </GridItem>\n </Grid>\n );\n};\n","import { Box, Stack, Heading, Skeleton } from \"@chakra-ui/react\";\nimport { FunctionComponent, useState } from \"react\";\nimport { CatalogSearch } from \"../../components/CatalogSearch\";\nimport { Page } from \"../../components/Page\";\nimport { Picture } from \"../../components/Picture\";\nimport { Results } from \"../../components/Results\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { useCatalogSearch } from \"../../hooks/useCatalogSearch\";\nimport { HomePageControls } from \"./HomePageControls\";\nimport testIds from \"./testIds\";\n\nconst sources = {\n optimal: [\n { media: \"(max-width:1024px)\", srcSet: \"/assets/hive@50.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/hive@100.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/hive@100.png\" },\n ],\n fallback: \"/assets/hive@50.png\",\n};\n\nexport const Home: FunctionComponent = () => {\n const searchAPI = useCatalogSearch();\n const [offset, setOffset] = useState(0);\n\n const { results, displayable, loading, pageLimit } = useCatalogResults({\n offset,\n limit: 20,\n query: \"\",\n language: null,\n });\n\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 <Box position=\"relative\">\n <Picture\n alt={\"\"}\n h=\"540px\"\n position=\"absolute\"\n sources={sources.optimal}\n src={sources.fallback}\n top=\"0\"\n w=\"100%\"\n zIndex=\"hide\"\n />\n {/* Hero Section */}\n <Stack\n align=\"stretch\"\n direction=\"column\"\n justify=\"center\"\n m=\"0 auto\"\n maxW=\"container.lg\"\n p={[10, 15, 20]}\n spacing={8}\n >\n <Stack\n color=\"blue.800\"\n data-testid={testIds.headings}\n spacing={4}\n textAlign=\"center\"\n >\n <Heading size=\"2xl\">\n Find reusable components for your cloud applications\n </Heading>\n <Heading as=\"h3\" size=\"md\">\n AWS CDK | CDK for Terraform | CDK For Kubernetes\n </Heading>\n <Heading as=\"h4\" mb={8} size=\"sm\">\n Search from{\" \"}\n {!results.length ? (\n <Skeleton display=\"inline-block\" h={3} w={8} />\n ) : (\n <Box as=\"span\" color=\"blue.500\">\n {results.length}\n </Box>\n )}{\" \"}\n construct libraries\n </Heading>\n </Stack>\n <CatalogSearch {...searchAPI} />\n </Stack>\n\n {/* TBD: Trending Libraries in favor of catalog results */}\n <Box p={4} pb={8}>\n <Results\n results={displayable}\n skeleton={{ loading, noOfItems: 20 }}\n />\n <HomePageControls\n offset={offset}\n pageLimit={pageLimit}\n setOffset={setOffset}\n />\n </Box>\n </Box>\n </Page>\n );\n};\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 { API_PATHS } from \"../../constants/url\";\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","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 { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\nexport interface Metadata {\n date: string;\n links?: {\n npm: string;\n };\n packageLinks?: {\n [key: string]: string;\n };\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","import { API_PATHS } from \"../../constants/url\";\n\nexport interface PackageLinksConfig {\n name: string;\n value: string;\n displayText?: string;\n}\n\nexport interface Config {\n packageLinks?: PackageLinksConfig[];\n}\n\nconst defaultConfig: Config = {};\n\nexport const fetchConfig = async (): Promise<Config> => {\n const response = await fetch(API_PATHS.CONFIG);\n\n if (!response.ok) {\n console.log(\"Failed to fetch application config, using default values\");\n return defaultConfig;\n }\n\n return response.json().catch((err) => {\n console.error(err);\n console.log(\"Invalid config response, using default values\");\n return defaultConfig;\n });\n};\n","import { createContext, FunctionComponent, useContext, useEffect } from \"react\";\nimport { fetchConfig, Config } from \"../../api/config\";\nimport { useRequest, UseRequestResponse } from \"../../hooks/useRequest\";\n\nconst ConfigContext = createContext<UseRequestResponse<Config>>({\n loading: false,\n data: undefined,\n error: undefined,\n});\n\nexport const useConfig = () => useContext(ConfigContext);\n\nexport const ConfigProvider: FunctionComponent = ({ children }) => {\n const [requestConfig, configResponse] = useRequest(fetchConfig);\n\n useEffect(() => {\n void requestConfig();\n }, [requestConfig]);\n\n return (\n <ConfigContext.Provider value={configResponse}>\n {children}\n </ConfigContext.Provider>\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 type { Assembly } from \"@jsii/spec\";\nimport type { FunctionComponent } from \"react\";\nimport { LanguageBar } from \"../../../../components/LanguageBar\";\nimport { Language, LANGUAGES } from \"../../../../constants/languages\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\nexport interface LanguageSelectionProps {\n assembly: Assembly;\n}\n\nconst languageSet = new Set(LANGUAGES);\n\nexport const LanguageSelection: FunctionComponent<LanguageSelectionProps> = ({\n assembly,\n}) => {\n const [language, setLanguage] = useLanguage({\n updateSaved: true,\n 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 return (\n <LanguageBar\n selectedLanguage={targets.includes(language) ? language : targets[0]}\n setSelectedLanguage={setLanguage}\n targetLanguages={targets.filter((target) => languageSet.has(target))}\n />\n );\n};\n","import { ChevronDownIcon, LinkIcon } from \"@chakra-ui/icons\";\nimport { Menu, MenuButton, Button, MenuItem, MenuList } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { sanitizeVersion } from \"../../../../api/package/util\";\nimport { NavLink } from \"../../../../components/NavLink\";\n\nexport interface DependencyDropdownProps {\n dependencies: {\n /**\n * Key is a dep name, value is a version\n */\n [key: string]: string;\n };\n}\n\nexport const DependencyDropdown: FunctionComponent<DependencyDropdownProps> = ({\n dependencies,\n}) => {\n const depEntries = Object.entries(dependencies);\n\n if (!depEntries.length) return null;\n\n return (\n <Menu>\n <MenuButton\n as={Button}\n color=\"blue.500\"\n leftIcon={<LinkIcon />}\n rightIcon={<ChevronDownIcon h={6} w={6} />}\n size=\"md\"\n variant=\"outline\"\n >\n Dependencies\n </MenuButton>\n <MenuList>\n {depEntries.map(([name, version]) => (\n <MenuItem key={`${name}/${version}`} p={0}>\n <NavLink\n h=\"100%\"\n p={2}\n to={`/packages/${name}/v/${sanitizeVersion(version)}`}\n w=\"100%\"\n >\n {`${name} - ${version}`}\n </NavLink>\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n );\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 { Box, ListItem, Text, UnorderedList } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { ReactNode, useMemo } from \"react\";\nimport type { PackageLinksConfig } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { ExternalLink } from \"../../../../components/ExternalLink\";\nimport { LicenseLink, LICENSE_LINKS } from \"../../../../components/LicenseLink\";\nimport { Time } from \"../../../../components/Time\";\nimport { getRepoUrlAndHost } from \"../../../../util/url\";\n\nexport interface DetailsProps {\n assembly?: Assembly;\n linksConfig?: PackageLinksConfig[];\n metadata: Metadata;\n}\n\nexport const Details = ({ assembly, linksConfig, metadata }: DetailsProps) => {\n const detailItems = useMemo(() => {\n if (!metadata) return [];\n\n const { date, links } = metadata;\n const username = assembly?.author.name;\n const authorUrl = assembly?.author.url;\n const repository = assembly?.repository;\n const license = assembly?.license;\n // https://www.npmjs.com/package/aws-cdk/v/1.113.0\n const registry =\n links?.npm ??\n `https://www.npmjs.com/package/${assembly?.name}/v/${assembly?.version}`;\n\n const items = [];\n\n if (date) {\n const publishDate = (\n <Time date={new Date(date)} fontWeight=\"bold\" format=\"MMMM dd, yyyy\" />\n );\n items.push(<>Published: {publishDate}</>);\n }\n\n if (username) {\n const author = authorUrl ? (\n <ExternalLink href={authorUrl}>{username}</ExternalLink>\n ) : (\n <Box as=\"strong\" fontWeight=\"bold\">\n {username}\n </Box>\n );\n items.push(<>Author: {author}</>);\n }\n\n // Prioritize custom links when available\n if (linksConfig?.length) {\n linksConfig.forEach(({ name, value, displayText }) => {\n const target = (metadata?.packageLinks ?? {})[value];\n if (target) {\n const link = (\n <ExternalLink href={target}>{displayText ?? target}</ExternalLink>\n );\n items.push(\n <>\n {name}: {link}\n </>\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(<>Repository: {repoLink}</>);\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(<>License: {licenseLink}</>);\n }\n\n if (registry) {\n const registryLink = (\n <ExternalLink href={registry}>\n {new URL(registry).hostname}\n </ExternalLink>\n );\n items.push(<>Registry: {registryLink}</>);\n }\n\n return items.slice(0, 5).map((detail: string | ReactNode, i: number) => (\n <ListItem key={`detail-${i}`} listStyleType=\"none\" my={1}>\n <Text color=\"gray.600\">{detail}</Text>\n </ListItem>\n ));\n }, [metadata, assembly, linksConfig]);\n return <UnorderedList ml={0}>{detailItems}</UnorderedList>;\n};\n","import { Box, Flex, Link } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent } from \"react\";\nimport { PackageLinksConfig } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { DependencyDropdown } from \"../DependencyDropdown\";\nimport { Details } from \"./Details\";\n\nexport interface OperatorAreaProps {\n assembly?: Assembly;\n linksConfig?: PackageLinksConfig[];\n metadata: Metadata;\n}\n\nexport const OperatorArea: FunctionComponent<OperatorAreaProps> = ({\n assembly,\n linksConfig,\n metadata,\n}) => {\n return (\n <Flex direction=\"column\" textAlign={{ base: \"center\", md: \"initial\" }}>\n <Link\n color=\"blue.500\"\n fontSize=\"sm\"\n href={`mailto:abuse@amazonaws.com?subject=${encodeURIComponent(\n `ConstructHub - Report of abusive package: ${assembly?.name}`\n )}`}\n m={2}\n textAlign={{ base: \"center\", md: \"right\" }}\n >\n Report this Package\n </Link>\n <Details\n assembly={assembly}\n linksConfig={linksConfig}\n metadata={metadata}\n />\n {assembly?.dependencies && (\n <Box mt={4}>\n <DependencyDropdown dependencies={assembly.dependencies} />\n </Box>\n )}\n </Flex>\n );\n};\n","import { Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { PackageTag } from \"../../../../components/PackageTag\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\nexport interface PackageHeaderProps {\n title: string;\n description: string;\n tags: string[];\n version: string;\n}\n\nexport const PackageHeader: FunctionComponent<PackageHeaderProps> = ({\n description,\n tags,\n title,\n version,\n}) => {\n const [currentLanguage] = useLanguage();\n return (\n <Flex\n direction=\"column\"\n maxWidth=\"100%\"\n overflowX=\"hidden\"\n p={2}\n textAlign={{ base: \"center\", md: \"initial\" }}\n >\n <Stack\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n justify={{ base: \"center\", md: \"start\" }}\n mb={4}\n spacing={4}\n >\n <Heading wordBreak=\"break-word\">{title}</Heading>\n <Text color=\"blue.500\" fontSize=\"md\">\n {version}\n </Text>\n </Stack>\n\n <Text wordBreak=\"break-word\">{description}</Text>\n {!!tags.length && (\n <Flex\n direction=\"row\"\n justify={{ base: \"center\", md: \"initial\" }}\n mt={3}\n >\n {title.startsWith(\"@aws-cdk/\") ? (\n <PackageTag\n key=\"official\"\n label=\"official\"\n language={currentLanguage}\n mr={2}\n value=\"@aws-cdk\"\n variant=\"official\"\n >\n Official\n </PackageTag>\n ) : null}\n {tags\n .filter(Boolean)\n .slice(0, 3)\n .map((tag) => (\n <PackageTag\n key={tag}\n language={currentLanguage}\n mr={2}\n value={tag}\n >\n {tag}\n </PackageTag>\n ))}\n </Flex>\n )}\n </Flex>\n );\n};\n","import { CheckIcon, CloseIcon, CopyIcon } from \"@chakra-ui/icons\";\nimport {\n Code,\n Flex,\n IconButton,\n Popover,\n PopoverBody,\n PopoverContent,\n PopoverHeader,\n PopoverTrigger,\n Text,\n useClipboard,\n useDisclosure,\n useMediaQuery,\n useToken,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent, ReactNode, useRef } from \"react\";\nimport { createTestIds } from \"../../util/createTestIds\";\n\nconst iconButtonProps = {\n borderRadius: \"md\",\n color: \"white\",\n variant: \"link\",\n};\n\nconst iconProps = {\n h: 4,\n w: 4,\n};\n\nexport const testIds = createTestIds(\"code-popover\", [\n \"close\",\n \"content\",\n \"code\",\n \"copy\",\n \"header\",\n \"trigger\",\n] as const);\n\nexport interface CodePopoverProps {\n code: string;\n header: string;\n trigger: ReactNode;\n}\n\nexport const CodePopover: FunctionComponent<CodePopoverProps> = ({\n code,\n header,\n trigger,\n}) => {\n const { hasCopied, onCopy } = useClipboard(code);\n const disclosure = useDisclosure();\n const focusRef = useRef<HTMLButtonElement>(null);\n const mdBreakpoint = useToken(\"breakpoints\", \"md\");\n const [isMd] = useMediaQuery(`(min-width: ${mdBreakpoint})`);\n\n return (\n <Popover\n initialFocusRef={focusRef}\n isLazy\n placement={isMd ? \"bottom-end\" : \"bottom\"}\n {...disclosure}\n >\n <PopoverTrigger>{trigger}</PopoverTrigger>\n <PopoverContent bg=\"blue.500\" data-testid={testIds.content}>\n <PopoverHeader\n align=\"center\"\n as={Flex}\n color=\"white\"\n data-testid={testIds.header}\n justify=\"space-between\"\n pr={0}\n >\n <Text>{header}</Text>\n <Flex align=\"center\">\n <IconButton\n aria-label=\"copy-text-icon\"\n data-testid={testIds.copy}\n icon={\n hasCopied ? (\n <CheckIcon {...iconProps} color=\"green.200\" />\n ) : (\n <CopyIcon {...iconProps} />\n )\n }\n onClick={onCopy}\n ref={focusRef}\n {...iconButtonProps}\n />\n <IconButton\n aria-label=\"close-icon\"\n data-testid={testIds.close}\n icon={<CloseIcon h={3} w={3} />}\n onClick={disclosure.onClose}\n {...iconButtonProps}\n />\n </Flex>\n </PopoverHeader>\n <PopoverBody\n as={Code}\n bg=\"gray.100\"\n borderTopLeftRadius=\"0\"\n borderTopRightRadius=\"0\"\n color=\"gray.800\"\n data-testid={testIds.code}\n overflow=\"auto\"\n variant=\"code-block\"\n >\n {code}\n </PopoverBody>\n </PopoverContent>\n </Popover>\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport { Button, ButtonProps, forwardRef } from \"@chakra-ui/react\";\nimport { testIds } from \"./CodePopover\";\n\nexport interface CodePopoverTriggerProps extends ButtonProps {}\n\n/**\n * A default trigger button for the code popover\n */\nexport const CodePopoverTrigger = forwardRef<CodePopoverTriggerProps, \"button\">(\n (props, ref) => (\n <Button\n color=\"white\"\n colorScheme=\"blue\"\n data-testid={testIds.trigger}\n ref={ref}\n rightIcon={<ChevronDownIcon h={5} w={5} />}\n {...props}\n >\n {props.children}\n </Button>\n )\n);\n\nCodePopoverTrigger.displayName = \"CodePopoverTrigger\";\n","import type { Assembly } from \"@jsii/spec\";\nimport type { FunctionComponent } from \"react\";\nimport {\n CodePopover,\n CodePopoverTrigger,\n} from \"../../../../components/CodePopover\";\nimport { LANGUAGE_NAME_MAP, Language } from \"../../../../constants/languages\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\n// TODO: We'll probably want to get this from BE as we add more languages, however this should do the trick for now...\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 return `npm install ${packageName}@${version}`;\n } else if (language === Language.Python) {\n const packageName = assembly.targets?.python?.distName;\n if (!packageName) {\n return undefined;\n }\n return `pip install ${packageName}==${version}`;\n }\n\n return undefined;\n};\n\nexport interface UseConstructProps {\n assembly: Assembly;\n}\n\nexport const UseConstruct: FunctionComponent<UseConstructProps> = ({\n assembly,\n}) => {\n const [language] = useLanguage();\n\n const header = LANGUAGE_NAME_MAP[language];\n const code = getCodeSample({ language, assembly });\n\n const isDisabled = !code;\n const label = !isDisabled ? \"Install\" : \"Unsupported\";\n\n const trigger = (\n <CodePopoverTrigger disabled={isDisabled}>{label}</CodePopoverTrigger>\n );\n\n return <CodePopover code={code ?? \"\"} header={header} trigger={trigger} />;\n};\n","import { Center, Divider, Flex, Grid, Spinner, Stack } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent } from \"react\";\nimport { Config } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { Card } from \"../../../../components/Card\";\nimport type { UseRequestResponse } from \"../../../../hooks/useRequest\";\nimport { LanguageSelection } from \"../LanguageSelection\";\nimport { OperatorArea } from \"../OperatorArea\";\nimport { PackageHeader } from \"../PackageHeader\";\nimport { UseConstruct } from \"../UseConstruct\";\n\ninterface PackageDetailsProps {\n config: UseRequestResponse<Config>;\n assembly: UseRequestResponse<Assembly>;\n metadata: UseRequestResponse<Metadata>;\n version: string;\n}\n\n/**\n * Renders the header section of a package. This includes\n * the Getting Started, Operator Area, and Publisher Area sections\n */\nexport const PackageDetails: FunctionComponent<PackageDetailsProps> = ({\n assembly,\n config,\n metadata,\n version,\n}) => {\n const isLoading = assembly.loading || metadata.loading;\n\n if (isLoading || !assembly.data || !metadata.data) {\n return (\n <Center minH=\"200px\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n return (\n <Flex as={Card} direction=\"column\">\n <Grid\n gap={4}\n overflow=\"hidden\"\n templateColumns={{ base: \"1fr\", md: \"3fr auto 2fr\" }}\n templateRows=\"auto\"\n >\n <PackageHeader\n description={assembly.data.description}\n tags={assembly.data.keywords ?? []}\n title={assembly.data.name}\n version={version}\n />\n <Divider\n display={{ base: \"none\", md: \"initial\" }}\n orientation=\"vertical\"\n />\n <Divider\n display={{ base: \"initial\", md: \"none\" }}\n orientation=\"horizontal\"\n />\n {config.loading ? (\n <Center minH=\"200px\">\n <Spinner size=\"xl\" />\n </Center>\n ) : (\n <OperatorArea\n assembly={assembly.data}\n linksConfig={config.data?.packageLinks}\n metadata={metadata.data}\n />\n )}\n </Grid>\n <Stack\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n justify={{ base: \"center\", md: \"space-between\" }}\n px={2}\n py={4}\n spacing={4}\n >\n <LanguageSelection assembly={assembly.data} />\n <UseConstruct assembly={assembly.data} />\n </Stack>\n </Flex>\n );\n};\n","import { ChevronDownIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Box, Flex, Link, IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport { FunctionComponent, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface NavItemConfig {\n children?: NavItemConfig[];\n display: string;\n url: 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}\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\nexport const NavItem: FunctionComponent<NavItemProps> = ({\n children,\n display,\n url,\n onOpen,\n}) => {\n const { pathname, hash } = useLocation();\n const isHashUrl = url.startsWith(\"#\");\n const linkIsActive = isHashUrl ? hash === url : pathname === url;\n const disclosure = useDisclosure({ onOpen, defaultIsOpen: true });\n\n const showToggle = (children?.length ?? 0) > 0;\n const showChildren = disclosure.isOpen && showToggle;\n\n const LinkComponent = isHashUrl ? Link : NavLink;\n\n const nestedItems = useMemo(\n () =>\n children?.map((item, idx) => {\n return <NavItem {...item} key={idx} onOpen={disclosure.onOpen} />;\n }),\n [children, disclosure.onOpen]\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={4}\n />\n )}\n <LinkComponent\n _hover={{ bg: \"rgba(0, 124, 253, 0.05)\" }}\n href={url}\n overflow=\"hidden\"\n pl={showToggle ? 1 : 2}\n py={1.5}\n textOverflow=\"ellipsis\"\n title={display}\n to={url}\n w=\"100%\"\n whiteSpace=\"nowrap\"\n >\n {display}\n </LinkComponent>\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 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} 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 { ReportHandler } from \"web-vitals\";\n\nexport const reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import(\"web-vitals\").then(\n ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n },\n () => {}\n );\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 { Box, Flex, Grid } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { useState, useEffect, FunctionComponent, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { Markdown } from \"../../../../components/Markdown\";\nimport { NavTree, NavItemConfig } from \"../../../../components/NavTree\";\nimport { ChooseSubmodule } from \"../ChooseSubmodule\";\n\nexport interface PackageDocsProps {\n markdown: string;\n assembly: Assembly;\n}\n\ntype Item = NavItemConfig & { level: number; children: Item[] };\n\nexport const appendItem = (itemTree: Item[], item: Element): Item[] => {\n if (!(item instanceof HTMLElement)) {\n return itemTree;\n }\n\n const { headingId, headingLevel = \"100\" } = item.dataset;\n const { innerText } = item;\n const level = parseInt(headingLevel);\n\n // Don't create nav items for items with no title / url\n if (level > 3 || !innerText || !headingId) {\n return itemTree;\n }\n\n const last = itemTree[itemTree.length - 1];\n\n if (last == null || last.level >= level) {\n return [\n ...itemTree,\n {\n display: innerText,\n url: `#${headingId}`,\n level,\n children: [],\n },\n ];\n } else {\n last.children = appendItem(last.children, item);\n return itemTree;\n }\n};\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 = \"72px\";\n\nexport const PackageDocs: FunctionComponent<PackageDocsProps> = ({\n markdown: source,\n assembly,\n}) => {\n const [navItems, setNavItems] = useState<Item[]>([]);\n\n useEffect(() => {\n const tree = [\n ...document.querySelectorAll(\n `[data-heading-id][data-heading-title][data-heading-level]`\n ),\n ].reduce(appendItem, []);\n\n setNavItems(tree);\n }, [source]);\n\n const { hash } = useLocation();\n useEffect(() => {\n if (hash) {\n const target = document.querySelector(`${hash}`) as HTMLElement;\n target?.scrollIntoView(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [source]);\n\n const markdown = useMemo(\n () => <Markdown repository={assembly.repository}>{source}</Markdown>,\n [assembly.repository, source]\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 position=\"sticky\"\n px={4}\n top={TOP_OFFSET}\n >\n {Object.keys(assembly?.submodules ?? {}).length > 0 && (\n <Flex\n borderBottom=\"1px solid\"\n borderColor=\"blue.50\"\n justify=\"center\"\n py={4}\n >\n <ChooseSubmodule assembly={assembly} />\n </Flex>\n )}\n <Box overflowY=\"auto\" py={4}>\n <NavTree items={navItems} />\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 {markdown}\n </Box>\n </Grid>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../../../../components/ExternalLink\";\nimport { Language } from \"../../../../constants/languages\";\n\nexport interface PackageDocsErrorProps {\n readonly language: Language;\n}\n\nexport const PackageDocsError: FunctionComponent<PackageDocsErrorProps> = ({\n language,\n}) => {\n const issueLink = (\n <ExternalLink href=\"https://github.com/cdklabs/construct-hub-webapp/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 { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Language, LANGUAGE_NAME_MAP } from \"../../../../constants/languages\";\n\nexport interface PackageDocsUnsupportedProps {\n readonly language: Language;\n}\n\nexport const PackageDocsUnsupported: FunctionComponent<PackageDocsUnsupportedProps> =\n ({ language }) => {\n const languageName = LANGUAGE_NAME_MAP[language];\n return (\n <Text\n align=\"center\"\n fontSize=\"xl\"\n fontStyle=\"oblique\"\n px={4}\n wordBreak=\"break-word\"\n >\n This package does not currently support {languageName}. Select one of\n the supported languages above, or ask the author to add support for{\" \"}\n {languageName} in a future release.\n </Text>\n );\n };\n","import { Box, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { fetchAssembly } from \"../../api/package/assembly\";\nimport { fetchMarkdown } from \"../../api/package/docs\";\nimport { fetchMetadata } from \"../../api/package/metadata\";\nimport { Page } from \"../../components/Page\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useConfig } from \"../../contexts/Config\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { useRequest } from \"../../hooks/useRequest\";\nimport { NotFound } from \"../NotFound\";\nimport { PackageDetails } from \"./components/PackageDetails\";\nimport { PackageDocs } from \"./components/PackageDocs\";\nimport { PackageDocsError } from \"./components/PackageDocsError\";\nimport { PackageDocsUnsupported } from \"./components/PackageDocsUnsupported/PackageDocsUnsupported\";\n\ninterface PathParams {\n name: string;\n scope?: string;\n version: string;\n}\n\nexport const Package: FunctionComponent = () => {\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 const configResponse = useConfig();\n\n const q = useQueryParams();\n const [language] = useLanguage();\n const submodule = q.get(QUERY_PARAMS.SUBMODULE) ?? \"\";\n\n const pageTitle = `${scope ? `${scope}/${name}` : name} ${version}`;\n\n const pageDescription = assemblyResponse?.data?.description ?? \"\";\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(name, version, language, scope, submodule);\n }, [name, scope, version, language, submodule, requestMarkdown]);\n\n // Handle missing JSON for assembly\n if (assemblyResponse.error) {\n return <NotFound />;\n }\n\n const hasError = markdownResponse.error || assemblyResponse.error;\n const hasDocs =\n !markdownResponse.loading &&\n !assemblyResponse.loading &&\n markdownResponse.data &&\n assemblyResponse.data;\n // This will also be true if it cannot be verified (assembly not there)\n const isSupported =\n language === Language.TypeScript ||\n assemblyResponse.loading ||\n assemblyResponse.error ||\n assemblyResponse.data?.targets?.[language.toString()] != null;\n\n return (\n <Page\n meta={{ title: pageTitle, description: pageDescription }}\n pageName=\"packageProfile\"\n >\n <Stack maxW=\"100vw\" pt={4} spacing={4}>\n {/* Operator Area */}\n <Box px={4}>\n <PackageDetails\n assembly={assemblyResponse}\n config={configResponse}\n metadata={metadataResponse}\n version={version}\n />\n </Box>\n {/* Readme and Api Reference Area */}\n {isSupported ? (\n hasError ? (\n <PackageDocsError language={language}></PackageDocsError>\n ) : (\n hasDocs && (\n <PackageDocs\n assembly={assemblyResponse.data!}\n markdown={markdownResponse.data!}\n />\n )\n )\n ) : (\n <PackageDocsUnsupported language={language}></PackageDocsUnsupported>\n )}\n </Stack>\n </Page>\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, sanitizeVersion } from \"../../api/package/util\";\nimport { useCatalog } from \"../../contexts/Catalog\";\n\ninterface RouteParams {\n name: string;\n scope?: string;\n}\n\nconst extractMajor = (ver: string) => {\n let sanitized = sanitizeVersion(ver);\n return sanitized.split(\".\")[0];\n};\n\nconst findPackage = (catalog: Packages, pkg: string) => {\n const packages = catalog.packages.filter((p) => p.name === pkg);\n\n if (packages.length === 0) {\n throw new Error(`Package ${pkg} does not exist in catalog`);\n }\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\nexport const buildRedirectUrl = (\n catalog: Packages,\n name: string,\n scope?: string\n) => {\n const prefix = \"/packages/\";\n const packageName = getFullPackageName(name, scope);\n const version = findPackage(catalog, packageName).version;\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=\"200px\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n return <Redirect to={buildRedirectUrl(catalog.data, name, scope)} />;\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","import { IconButton, IconProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface ArrowButtonProps {\n icon: FunctionComponent<IconProps>;\n offset?: number;\n getPageUrl: (params: { offset: number }) => string;\n}\n\nexport const ArrowButton: FunctionComponent<ArrowButtonProps> = ({\n icon: Icon,\n offset,\n getPageUrl,\n}) => {\n const label = `Page ${offset} link`;\n\n const props = {\n \"aria-label\": label,\n borderRadius: \"md\",\n borderColor: \"blue.500\",\n colorScheme: \"blue\",\n icon: <Icon color=\"blue.500\" h={5} w={5} />,\n mx: 2,\n h: 10,\n w: 10,\n variant: \"outline\",\n };\n\n if (offset !== undefined) {\n return <IconButton {...props} as={Link} to={getPageUrl({ offset })} />;\n }\n\n return <IconButton {...props} disabled />;\n};\n","import { Flex, Input, Text } from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n SyntheticEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\n\nexport interface GoToPageProps {\n pageLimit: number;\n offset: number;\n getPageUrl: (params: { offset: number }) => string;\n}\n\nexport const GoToPage: FunctionComponent<GoToPageProps> = ({\n pageLimit,\n offset,\n getPageUrl,\n}) => {\n const [inputValue, setInputValue] = useState((offset + 1).toString());\n const { push } = useHistory();\n\n useEffect(() => {\n setInputValue((offset + 1).toString());\n }, [offset]);\n\n const onInputChange = (e: SyntheticEvent<HTMLInputElement>) => {\n e.preventDefault();\n setInputValue((e.target as HTMLInputElement).value);\n };\n\n const onSubmit: FormEventHandler<HTMLInputElement> = (e) => {\n e.preventDefault();\n push(getPageUrl({ offset: parseInt(inputValue) - 1 }));\n };\n\n return (\n <Flex align=\"center\" as=\"form\" mx={2} onSubmit={onSubmit}>\n <Input\n colorScheme=\"blue\"\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n p={0}\n textAlign=\"center\"\n type=\"number\"\n value={inputValue}\n w={10}\n />\n <Text ml={2} w=\"max-content\">\n of {pageLimit + 1}\n </Text>\n </Flex>\n );\n};\n","import { ArrowForwardIcon } from \"@chakra-ui/icons\";\nimport { Button } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NextPageProps {\n nextPageUrl?: string;\n}\n\nconst btnProps = {\n children: \"Next Page\",\n colorScheme: \"blue\",\n rightIcon: <ArrowForwardIcon color=\"white\" />,\n};\n\nexport const NextPage: FunctionComponent<NextPageProps> = ({ nextPageUrl }) => {\n if (!nextPageUrl) {\n return <Button {...btnProps} disabled />;\n }\n\n return <Button {...btnProps} as={Link} to={nextPageUrl} />;\n};\n","import { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Flex, Grid, GridItem } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ArrowButton } from \"./ArrowButton\";\nimport { GoToPage } from \"./GoToPage\";\nimport { NextPage } from \"./NextPage\";\n\nexport interface PageControlsProps {\n limit: number;\n offset: number;\n pageLimit: number;\n getPageUrl: (params: { offset?: number }) => string;\n}\n\nexport const PageControls: FunctionComponent<PageControlsProps> = ({\n offset,\n pageLimit,\n getPageUrl,\n}) => {\n const nextOffset = offset < pageLimit ? offset + 1 : undefined;\n const prevOffset = offset > 0 ? offset - 1 : undefined;\n\n return (\n <Grid\n alignItems=\"center\"\n pt={4}\n templateColumns=\"repeat(3, 1fr)\"\n templateRows=\"1fr\"\n >\n <GridItem colStart={2} justifySelf=\"center\">\n <NextPage\n nextPageUrl={\n nextOffset ? getPageUrl({ offset: nextOffset }) : undefined\n }\n />\n </GridItem>\n <GridItem colStart={3} justifySelf=\"end\">\n <Flex align=\"center\" justify=\"center\" py={4}>\n <GoToPage\n getPageUrl={getPageUrl}\n offset={offset}\n pageLimit={pageLimit}\n />\n <ArrowButton\n getPageUrl={getPageUrl}\n icon={ChevronLeftIcon}\n offset={prevOffset}\n />\n <ArrowButton\n getPageUrl={getPageUrl}\n icon={ChevronRightIcon}\n offset={nextOffset}\n />\n </Flex>\n </GridItem>\n </Grid>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nexport interface ShowingDetailsProps {\n limit: number;\n offset: number;\n count: number;\n filtered: boolean;\n}\n\nconst Em: FunctionComponent = ({ children }) => (\n <Text as=\"em\" color=\"blue.500\" fontWeight=\"bold\">\n {children}\n </Text>\n);\n\nexport const ShowingDetails: FunctionComponent<ShowingDetailsProps> = ({\n limit,\n offset,\n count,\n filtered,\n}) => {\n const first = limit * offset;\n const last = first + limit;\n return (\n <Text>\n Displaying{\" \"}\n <Em>\n {count ? first + 1 : count} - {last > count ? count : last}\n </Em>{\" \"}\n of <Em>{count}</Em> {filtered ? \"search results\" : \"constructs\"}.\n </Text>\n );\n};\n","import { Box, Divider, Flex } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { CatalogSearch } from \"../../components/CatalogSearch\";\nimport { Page } from \"../../components/Page\";\nimport { Results } from \"../../components/Results\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { useCatalogSearch } from \"../../hooks/useCatalogSearch\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { getSearchPath } from \"../../util/url\";\nimport { PageControls } from \"./components/PageControls\";\nimport { ShowingDetails } from \"./components/ShowingDetails\";\nimport { LIMIT, SearchQueryParam } from \"./constants\";\n\nconst toNum = (val: string) => {\n const result = parseInt(val);\n\n if (`${result}` === \"NaN\") {\n return 0;\n }\n\n return result;\n};\n\nexport const SearchResults: FunctionComponent = () => {\n const queryParams = useQueryParams();\n\n const searchQuery = decodeURIComponent(\n queryParams.get(QUERY_PARAMS.SEARCH_QUERY) ?? \"\"\n );\n\n const languageQuery = queryParams.get(\n QUERY_PARAMS.LANGUAGE\n ) as Language | null;\n\n const searchAPI = useCatalogSearch({\n defaultQuery: searchQuery,\n defaultLanguage: languageQuery,\n });\n\n const offset = toNum(queryParams.get(QUERY_PARAMS.OFFSET) ?? \"0\");\n\n const { push } = useHistory();\n\n const { results, displayable, loading, pageLimit } = useCatalogResults({\n query: searchQuery,\n offset,\n limit: LIMIT,\n language: languageQuery,\n });\n\n const getUrl = (\n params: Partial<{ [key in SearchQueryParam]: number | string }>\n ) => {\n return getSearchPath({\n query: (params.q ?? searchQuery) as string,\n language: languageQuery,\n offset: params.offset ?? offset,\n });\n };\n\n useEffect(() => {\n // If the query has results but the page has nothing to show...\n if (!loading && results.length && (offset < 0 || offset > pageLimit)) {\n // Handle an out of bounds offset\n if (offset < 0) {\n push(getUrl({ offset: 0 }));\n } else {\n // Offset is too large, just take last page\n push(getUrl({ offset: pageLimit }));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loading, results, pageLimit, offset]);\n\n useEffect(() => {\n // Reflect changes to queryParam to search input (specifically for tag clicks)\n if (searchQuery !== searchAPI.query) {\n searchAPI.setQuery(searchQuery);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchQuery]);\n\n return (\n <Page\n meta={{\n title: searchQuery || \"Search\",\n description: searchQuery\n ? `${results.length} results for ${searchQuery} at Construct Hub`\n : \"Search reusable components for your cloud application\",\n }}\n pageName=\"search\"\n >\n <Flex direction=\"column\" maxW=\"100vw\">\n <Box p={4}>\n <CatalogSearch {...searchAPI} />\n </Box>\n <Divider />\n <Box p={4}>\n <Box pb={4}>\n <ShowingDetails\n count={results.length}\n filtered={!!searchQuery}\n limit={LIMIT}\n offset={offset}\n />\n </Box>\n <Results\n language={languageQuery ?? undefined}\n results={displayable}\n skeleton={{ loading, noOfItems: LIMIT }}\n />\n <PageControls\n getPageUrl={getUrl}\n limit={LIMIT}\n offset={offset}\n pageLimit={pageLimit}\n />\n </Box>\n </Flex>\n </Page>\n );\n};\n","import type { QueryParamKey } from \"../../constants/url\";\n\nexport const LIMITS = [25, 50, 75, 100];\nexport const LIMIT = LIMITS[0];\n\nexport type SearchQueryParam = Extract<QueryParamKey, \"offset\" | \"q\">;\n","import { Box, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../../components/ExternalLink\";\nimport { Page } from \"../../components/Page\";\n\nexport const SiteTerms: FunctionComponent = () => (\n <Page\n meta={{\n title: \"Site Terms\",\n description: \"View the Construct Hub Site Terms\",\n }}\n pageName=\"siteTerms\"\n >\n <Box bg=\"white\" h=\"100%\" py={16} w=\"100%\">\n <Box\n as=\"article\"\n color=\"gray.800\"\n fontSize=\"lg\"\n maxW={{ base: \"80%\", md: \"600px\" }}\n mx=\"auto\"\n textAlign=\"justify\"\n w=\"100%\"\n >\n <Heading as=\"h1\" color=\"blue.800\" mb={8} mx=\"auto\" size=\"lg\">\n AWS Site Terms for CDK Construct Hub\n </Heading>\n <Stack spacing={4}>\n <Text fontStyle=\"italic\">Last Updated: July 2021</Text>\n <Text>\n Welcome to the AWS CDK Construct Hub site (the “AWS Site” or\n “Construct Hub”). Except as specifically follows, the AWS CDK\n Construct Hub site shall be subject to the{\" \"}\n <ExternalLink\n hasWarning={false}\n href=\"https://aws.amazon.com/terms/\"\n >\n Site Terms\n </ExternalLink>{\" \"}\n (“AWS Site Terms”) and considered an AWS Site for purposes of\n applying the AWS Site Terms (together, the “CDK Construct Hub Site\n Terms”).\n </Text>\n <Text>\n In place of the “License and Site Access” term of the AWS Site\n Terms, the Construct Hub is provided to you under this license:{\" \"}\n <ExternalLink\n hasWarning={false}\n href=\"https://github.com/cdklabs/construct-hub-webapp/blob/main/LICENSE\"\n >\n https://github.com/cdklabs/construct-hub-webapp/blob/main/LICENSE\n </ExternalLink>\n . Some AWS Content and Third-Party Content may be provided to you\n under a separate license, such as the Apache License, Version 2.0,\n or other open source license. In the event of a conflict between the\n CDK Construct Hub Site Terms and any separate license, the separate\n license will prevail with respect to the AWS Content or Third-Party\n Content that is the subject of such separate license. This AWS Site\n is a construct registry and search site. The links to the CDK\n constructs displayed may comprise third party user generated content\n which shall, in any case, be subject to the “Disclaimer of\n Warranties and Limitation of Liability” section of the AWS Site\n Terms. Accessing a construct via its hyperlink will send you to a\n non-affiliated third party website (‘Third-Party Website”) and you\n shall be subject to the terms and conditions of that Third-Party\n Website upon entering it.\n </Text>\n </Stack>\n </Box>\n </Box>\n </Page>\n);\n","import { Grid } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Switch, Route } from \"react-router-dom\";\nimport { DevPreviewBanner } from \"./components/DevPreviewBanner\";\nimport { Footer } from \"./components/Footer\";\nimport { Header } from \"./components/Header\";\nimport { ROUTES } from \"./constants/url\";\nimport { FAQ } from \"./views/FAQ\";\nimport { Home } from \"./views/Home\";\nimport { NotFound } from \"./views/NotFound\";\nimport { Packages } from \"./views/Packages\";\nimport { SearchResults } from \"./views/SearchResults\";\nimport { SiteTerms } from \"./views/SiteTerms\";\n\nexport const App: FunctionComponent = () => {\n return (\n <Grid\n as=\"main\"\n bg=\"bgPrimary\"\n gridTemplateColumns=\"1fr\"\n gridTemplateRows=\"auto auto 1fr auto\"\n h=\"100%\"\n inset={0}\n maxW=\"100vw\"\n overflow=\"hidden auto\"\n position=\"fixed\"\n >\n <Header />\n <DevPreviewBanner />\n <Switch>\n <Route exact path={ROUTES.FAQ}>\n <FAQ />\n </Route>\n <Route exact path={ROUTES.HOME}>\n <Home />\n </Route>\n <Route exact path={ROUTES.SITE_TERMS}>\n <SiteTerms />\n </Route>\n <Route path={ROUTES.PACKAGES}>\n <Packages />\n </Route>\n <Route exact path={ROUTES.SEARCH}>\n <SearchResults />\n </Route>\n <Route path=\"*\">\n <NotFound />\n </Route>\n </Switch>\n <Footer />\n </Grid>\n );\n};\n","import { theme } from \"@chakra-ui/react\";\n\nconst {\n components: { Code: base },\n} = theme;\n\nexport const Code = {\n ...base,\n variants: {\n ...base.variants,\n \"code-block\": {\n ...base.variants.subtle,\n display: \"block\",\n whiteSpace: \"pre\",\n },\n },\n};\n","import type { tagAnatomy } from \"@chakra-ui/anatomy\";\nimport { theme } from \"@chakra-ui/react\";\nimport type {\n PartsStyleInterpolation,\n StyleFunctionProps,\n} from \"@chakra-ui/theme-tools\";\n\nconst createVariant =\n (\n variant: PartsStyleInterpolation<typeof tagAnatomy>,\n overrides: Record<string, any>\n ) =>\n (props: StyleFunctionProps) => {\n const varBase = typeof variant === \"function\" ? variant(props) : variant;\n return {\n ...varBase,\n container: {\n ...varBase.container,\n ...overrides,\n },\n };\n };\n\nconst {\n components: { Tag: base },\n} = theme;\n\nexport const Tag = {\n ...base,\n baseStyle: {\n container: {\n fontWeight: \"normal\",\n },\n },\n variants: {\n ...base.variants,\n subtle: createVariant(base.variants.subtle, {\n background: \"#F2F2F2\",\n color: \"blue.800\",\n }),\n official: createVariant(base.variants.subtle, {\n background: \"rgba(33, 150, 83, 0.1)\",\n color: \"#219653\",\n }),\n },\n};\n","import { theme } from \"@chakra-ui/react\";\nimport { Code } from \"./Code\";\nimport { Divider } from \"./Divider\";\nimport { Tag } from \"./Tag\";\n\nexport const components = {\n ...theme.components,\n Code,\n Divider,\n Tag,\n};\n","// TODO: Figure out why this does nothing\nexport const Divider = {\n defaultProps: {\n borderColor: \"rgba(0, 124, 253, 0.15)\",\n },\n};\n","import { borders } from \"./borders\";\nimport { colors } from \"./colors\";\nimport { radii } from \"./radius\";\nimport { shadows } from \"./shadows\";\nimport { sizes } from \"./sizes\";\n\nexport const foundations = {\n borders,\n colors,\n radii,\n sizes,\n shadows,\n};\n","export const borders = {\n base: \"1px solid rgba(0, 124, 253, 0.15)\",\n};\n","import { theme } from \"@chakra-ui/react\";\n\nexport const colors = {\n ...theme.colors,\n blue: {\n 50: \"#dcf3ff\",\n 100: \"#aed9ff\",\n 200: \"#7dbeff\",\n 300: \"#4aa4ff\",\n 400: \"#1a8aff\",\n 500: \"#0070e6\",\n 600: \"#0057b4\",\n 700: \"#003e82\",\n 800: \"#002551\",\n 900: \"#000d21\",\n },\n bgPrimary: \"#F8F8F8\",\n};\n","export const radii = {\n card: \"0.75rem\",\n};\n","// import { theme } from \"@chakra-ui/react\";\n\nexport const sizes = {\n container: {\n \"2xl\": \"1920px\",\n },\n};\n","export const shadows = {\n base: \"0px 4px 15px rgba(40, 132, 178, 0.15)\",\n};\n","import { extendTheme } from \"@chakra-ui/react\";\nimport { components } from \"./components\";\nimport { foundations } from \"./foundations\";\n\nexport const theme = extendTheme({\n ...foundations,\n components,\n});\n","import { ChakraProvider } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { theme } from \"../theme\";\n\nexport const Theme: FunctionComponent = ({ children }) => {\n return (\n <ChakraProvider resetCSS theme={theme}>\n {children}\n </ChakraProvider>\n );\n};\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://cra.link/PWA\n\n// [::1] is the IPv6 localhost address.\n// 127.0.0.0/8 are considered localhost for IPv4.\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n window.location.hostname === \"[::1]\" ||\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nconst registerValidSW = (swUrl: string, config?: Config) => {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n \"New content is available and will be used when all \" +\n \"tabs for this page are closed. See https://cra.link/PWA.\"\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log(\"Content is cached for offline use.\");\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error(\"Error during service worker registration:\", error);\n });\n};\n\nconst checkValidServiceWorker = (swUrl: string, config?: Config) => {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { \"Service-Worker\": \"script\" },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\");\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf(\"javascript\") === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n void navigator.serviceWorker.ready.then((registration) => {\n void registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n \"No internet connection found. App is running in offline mode.\"\n );\n });\n};\n\nexport const register = (config?: Config) => {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener(\"load\", () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n void navigator.serviceWorker.ready.then(() => {\n console.log(\n \"This web app is being served cache-first by a service worker. To learn more, visit https://cra.link/PWA\"\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n};\n\nexport const unregister = () => {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n void registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n};\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { BrowserRouter as Router } from \"react-router-dom\";\nimport \"./index.css\";\nimport { App } from \"./App\";\nimport { AnalyticsProvider } from \"./contexts/Analytics\";\nimport { CatalogProvider } from \"./contexts/Catalog\";\nimport { ConfigProvider } from \"./contexts/Config\";\nimport { ExternalLinkWarningProvider } from \"./contexts/ExternalLinkWarning\";\nimport { ShortbreadProvider } from \"./contexts/Shortbread\";\nimport { Theme } from \"./contexts/Theme\";\nimport { register } from \"./register-service-worker\";\nimport { reportWebVitals } from \"./reportWebVitals\";\n\nReactDOM.render(\n <React.StrictMode>\n <ConfigProvider>\n <ShortbreadProvider>\n <Router>\n <AnalyticsProvider>\n <Theme>\n <ExternalLinkWarningProvider>\n <CatalogProvider>\n <App />\n </CatalogProvider>\n </ExternalLinkWarningProvider>\n </Theme>\n </AnalyticsProvider>\n </Router>\n </ShortbreadProvider>\n </ConfigProvider>\n </React.StrictMode>,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n\n// Register service worker for PWA functionality.\nregister();\n","import { Link as ChakraLink, PropsOf } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Link as RouterLink } from \"react-router-dom\";\n\nexport type NavLinkProps = PropsOf<typeof ChakraLink> &\n PropsOf<typeof RouterLink>;\n\nexport const NavLink: FunctionComponent<NavLinkProps> = (props) => {\n return <ChakraLink as={RouterLink} {...props} />;\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 { 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 bg=\"gray.100\"\n borderLeft=\"5px solid\"\n borderLeftColor=\"gray.200\"\n borderRadius=\"md\"\n p={2}\n wordBreak=\"break-word\"\n >\n {children}\n </Box>\n);\n\nexport const Em: FunctionComponent = ({ children }) => (\n <Box as=\"em\" color=\"blue.500\" fontStyle=\"normal\" fontWeight=\"semibold\">\n {children}\n </Box>\n);\n\nexport const P: FunctionComponent = ({ children }) => <Text>{children}</Text>;\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.500\";\n } else if (text === \"Optional\") {\n color = \"green.500\";\n }\n\n return (\n <Box as=\"sup\" color={color} ml={2} top={-1}>\n {children}\n </Box>\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\";\nimport { Hr } from \"./Hr\";\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 marginY: number = [10, 10, 10, 8, 8, 8][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 const isH3OrLarger = level < 4;\n\n return (\n <>\n <Heading\n as={elem}\n color=\"blue.800\"\n level={level}\n mb={isH3OrLarger ? 0 : level}\n mt={marginY}\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 {isH3OrLarger && (\n // If there's an adjacent HR from the source md, do a magic trick and make it disappear\n <Hr mb={marginY} mt={0} sx={{ \"& + hr\": { display: \"none\" } }} />\n )}\n </>\n );\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"],"sourceRoot":""}