construct-hub 0.2.50 → 0.2.51

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. package/.jsii +2 -2
  2. package/lib/construct-hub.js +1 -1
  3. package/lib/package-sources/code-artifact.js +1 -1
  4. package/lib/package-sources/npmjs.js +1 -1
  5. package/lib/package-tag/index.js +2 -2
  6. package/lib/spdx-license.js +1 -1
  7. package/package.json +2 -2
  8. package/website/asset-manifest.json +37 -37
  9. package/website/index.html +1 -1
  10. package/website/service-worker.js +1 -1
  11. package/website/service-worker.js.map +1 -1
  12. package/website/static/js/{0.476ccc35.chunk.js → 0.14ae620d.chunk.js} +2 -2
  13. package/website/static/js/{0.476ccc35.chunk.js.map → 0.14ae620d.chunk.js.map} +1 -1
  14. package/website/static/js/{1.dce521b7.chunk.js → 1.ba696ffb.chunk.js} +2 -2
  15. package/website/static/js/{1.dce521b7.chunk.js.map → 1.ba696ffb.chunk.js.map} +1 -1
  16. package/website/static/js/{10.511ed889.chunk.js → 10.48221095.chunk.js} +2 -2
  17. package/website/static/js/{10.511ed889.chunk.js.map → 10.48221095.chunk.js.map} +1 -1
  18. package/website/static/js/{11.fedfcf57.chunk.js → 11.c3c4095a.chunk.js} +2 -2
  19. package/website/static/js/{11.fedfcf57.chunk.js.map → 11.c3c4095a.chunk.js.map} +1 -1
  20. package/website/static/js/{12.f223385d.chunk.js → 12.cadd501c.chunk.js} +2 -2
  21. package/website/static/js/{12.f223385d.chunk.js.map → 12.cadd501c.chunk.js.map} +1 -1
  22. package/website/static/js/13.fe1e2da5.chunk.js +2 -0
  23. package/website/static/js/{13.97b408c9.chunk.js.map → 13.fe1e2da5.chunk.js.map} +1 -1
  24. package/website/static/js/{14.5a16949a.chunk.js → 14.0902aefd.chunk.js} +2 -2
  25. package/website/static/js/{14.5a16949a.chunk.js.map → 14.0902aefd.chunk.js.map} +1 -1
  26. package/website/static/js/{15.d29607c9.chunk.js → 15.50336305.chunk.js} +2 -2
  27. package/website/static/js/{15.d29607c9.chunk.js.map → 15.50336305.chunk.js.map} +1 -1
  28. package/website/static/js/{2.8028f8f1.chunk.js → 2.5cef3eb0.chunk.js} +2 -2
  29. package/website/static/js/{2.8028f8f1.chunk.js.map → 2.5cef3eb0.chunk.js.map} +1 -1
  30. package/website/static/js/{5.9ad3252f.chunk.js → 5.a2fc9d7c.chunk.js} +3 -3
  31. package/website/static/js/{5.9ad3252f.chunk.js.LICENSE.txt → 5.a2fc9d7c.chunk.js.LICENSE.txt} +0 -0
  32. package/website/static/js/{5.9ad3252f.chunk.js.map → 5.a2fc9d7c.chunk.js.map} +1 -1
  33. package/website/static/js/6.c49f34c2.chunk.js +3 -0
  34. package/website/static/js/{6.e67c67fc.chunk.js.LICENSE.txt → 6.c49f34c2.chunk.js.LICENSE.txt} +0 -0
  35. package/website/static/js/{6.e67c67fc.chunk.js.map → 6.c49f34c2.chunk.js.map} +1 -1
  36. package/website/static/js/{7.85487e43.chunk.js → 7.4fcbd19f.chunk.js} +2 -2
  37. package/website/static/js/{7.85487e43.chunk.js.map → 7.4fcbd19f.chunk.js.map} +1 -1
  38. package/website/static/js/8.31a21ecd.chunk.js +2 -0
  39. package/website/static/js/8.31a21ecd.chunk.js.map +1 -0
  40. package/website/static/js/9.e8c984d8.chunk.js +2 -0
  41. package/website/static/js/9.e8c984d8.chunk.js.map +1 -0
  42. package/website/static/js/main.65f1e14b.chunk.js +2 -0
  43. package/website/static/js/main.65f1e14b.chunk.js.map +1 -0
  44. package/website/static/js/{runtime-main.fc2986a7.js → runtime-main.d3c4ab29.js} +2 -2
  45. package/website/static/js/{runtime-main.fc2986a7.js.map → runtime-main.d3c4ab29.js.map} +1 -1
  46. package/website/static/js/13.97b408c9.chunk.js +0 -2
  47. package/website/static/js/6.e67c67fc.chunk.js +0 -3
  48. package/website/static/js/8.e3d4e000.chunk.js +0 -2
  49. package/website/static/js/8.e3d4e000.chunk.js.map +0 -1
  50. package/website/static/js/9.a24ba07b.chunk.js +0 -2
  51. package/website/static/js/9.a24ba07b.chunk.js.map +0 -1
  52. package/website/static/js/main.3e01d988.chunk.js +0 -2
  53. package/website/static/js/main.3e01d988.chunk.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","hooks/useQueryParams/useQueryParams.ts","hooks/useLanguage/useLanguage.ts","constants/keywords.ts","api/package/util.ts","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageTag/PackageTag.tsx","components/Time/Time.tsx","components/Picture/Picture.tsx","views/NotFound/NotFound.tsx","components/Markdown/Markdown.tsx","components/Markdown/Hr.tsx","components/Markdown/Img.tsx","components/Markdown/List.tsx","components/Markdown/Table.tsx","components/Markdown/testIds.ts","components/Markdown/Text.tsx","components/CopyButton/CopyButton.tsx","components/Code/MultiLineRenderer.tsx","components/Code/SingleLineRenderer.tsx","components/Code/Code.tsx","components/Markdown/Code.tsx","components/Markdown/Headings.tsx","util/sanitize-anchor.ts","api/package/assembly.ts","api/package/docs.ts","api/package/metadata.ts","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","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"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","useQueryParams","useLocation","useMemo","URLSearchParams","defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","has","getInitialLang","langFromParams","storedLang","localStorage","getItem","useLanguage","options","updateUrl","updateSaved","pathname","hash","useHistory","replace","params","get","QUERY_PARAMS","LANGUAGE","useState","language","setLanguage","set","toString","update","useCallback","val","setItem","KEYWORD_IGNORE_LIST","Set","getFullPackageName","scope","getAssetsPath","version","prefix","API_PATHS","PACKAGES_PREFIX","body","sanitizeVersion","ver","sanitized","startsWith","substring","extractMajor","split","findPackage","catalog","pkg","packages","filter","p","length","sort","p1","p2","mv1","localeCompare","LanguageSupportTooltip","isSupported","langName","LANGUAGE_NAME_MAP","message","hasArrow","label","placement","PackageTag","value","zIndex","tagProps","NavLink","to","getSearchPath","query","_hover","textDecoration","Time","forwardRef","ref","date","formatString","format","boxProps","as","dateTime","toISOString","displayName","Picture","sources","props","map","source","idx","media","srcSet","bgSources","optimal","fallback","NotFound","h","position","w","alt","inset","src","align","direction","justify","Link","colorScheme","components","a","A","blockquote","Blockquote","caption","TableCaption","code","Code","em","Em","h1","Headings","h2","h3","h4","h5","h6","hr","Hr","img","Img","li","Li","ol","Ol","P","pre","Pre","sup","Sup","table","Table","tbody","Tbody","td","Td","tfoot","Tfoot","th","Th","thead","Thead","tr","Tr","ul","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","Buffer","byteLength","lastIndexOf","join","testIds","container","px","sx","mb","lineHeight","transformImageUri","transformLinkUri","my","display","mr","fontStyle","fontSize","color","maxW","overflowX","variant","createTestIds","href","linkProps","Component","URL","hostname","window","location","bg","borderLeft","borderLeftColor","borderRadius","wordBreak","fontWeight","undefined","text","Array","isArray","ml","top","CopyButton","btnProps","useClipboard","hasCopied","onCopy","icon","Check","Copy","minW","onClick","MultiLineRenderer","tokens","getLineProps","getTokenProps","py","line","i","key","token","SingleLineRenderer","defaultProps","theme","nightOwlLight","border","boxShadow","className","overflow","style","inline","borderColor","Children","toArray","reduce","accum","child","trim","level","size","marginY","elem","dataElement","DOMParser","parseFromString","ReactDOMServer","renderToStaticMarkup","querySelector","dataset","headingTitle","id","headingId","toLowerCase","isH3OrLarger","mt","fetchAssembly","assemblyPath","ASSEMBLY_SUFFIX","fetch","response","ok","Error","statusText","json","fetchMarkdown","submodule","docsSuffix","markdownPath","expectedContentType","contentType","headers","fetchMetadata","sanitizedVersion","metadataPath","METADATA_SUFFIX","LanguageBar","targetLanguages","selectedLanguage","setSelectedLanguage","spacing","left","right","LANGUAGES","indexOf","isDisabled","isSelected","LangIcon","LANGUAGE_RENDER_MAP","cursor","disabled","height","width","languageSet","LanguageSelection","assembly","targets","Object","keys","target","DependencyDropdown","dependencies","depEntries","entries","Button","leftIcon","rightIcon","ChevronDown","OS_ORG_LINK","LICENSE_LINKS","MIT","LicenseLink","license","ExternalLink","Details","linksConfig","metadata","detailItems","links","username","author","authorUrl","registry","npm","items","publishDate","Date","push","forEach","displayText","packageLinks","link","getRepoUrlAndHost","repoLink","licenseLink","registryLink","slice","detail","listStyleType","OperatorArea","textAlign","base","md","encodeURIComponent","m","PackageHeader","tags","currentLanguage","maxWidth","v","Boolean","tag","iconButtonProps","iconProps","CodePopover","header","trigger","disclosure","useDisclosure","focusRef","useRef","mdBreakpoint","useToken","useMediaQuery","isMd","initialFocusRef","isLazy","Flex","pr","copy","close","Close","onClose","borderTopLeftRadius","borderTopRightRadius","CodePopoverTrigger","UseConstruct","packageName","Python","python","distName","Java","groupId","java","maven","artifactId","getCodeSample","PackageDetails","config","loading","data","Card","gap","templateColumns","templateRows","keywords","orientation","minH","NavItem","onOpen","isHashUrl","linkIsActive","defaultIsOpen","showToggle","showChildren","isOpen","LinkComponent","nestedItems","item","ChevronRight","onToggle","pl","textOverflow","whiteSpace","_before","bottom","NavTree","SearchInput","inputRef","onChange","onSubmit","inputValue","setInputValue","useDebounce","Form","Search","e","placeholder","SearchModal","onInputChange","submodules","navigate","preventDefault","mx","pb","maxH","role","tabIndex","SearchItem","ChooseSubmodule","allSubmodules","currentSubmodule","SUBMODULE","submoduleText","setFilter","getUrl","submoduleName","results","fqn","ArrowBack","flexGrow","appendItem","itemTree","HTMLElement","headingLevel","innerText","parseInt","last","TOP_OFFSET","PackageDocs","markdown","navItems","setNavItems","tree","document","querySelectorAll","scrollIntoView","columnGap","alignSelf","borderRight","borderRightColor","maxHeight","borderBottom","overflowY","scrollMarginTop","PackageDocsError","issueLink","PackageDocsUnsupported","languageName","Package","useParams","useRequest","requestMarkdown","markdownResponse","requestAssembly","assemblyResponse","requestMetadata","metadataResponse","configResponse","useConfig","q","pageTitle","pageDescription","error","hasError","hasDocs","isLoadingDocs","pt","PackageLatest","useCatalog","buildRedirectUrl","nameRegexp","scopeRegexp","Packages","path","useRouteMatch","exact"],"mappings":"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","file":"static/js/7.85487e43.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { 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","export const KEYWORD_IGNORE_LIST = new Set([\n \"aws-cdk\",\n \"aws\",\n \"awscdk\",\n \"cdk-construct\",\n \"cdk\",\n \"construct\",\n \"constructs\",\n]);\n","import { API_PATHS } from \"../../constants/url\";\nimport { CatalogPackage, Packages } from \"./packages\";\n\nexport const getFullPackageName = (name: string, scope?: string) => {\n return scope ? `${scope}/${name}` : name;\n};\n\nexport const getAssetsPath = (\n name: string,\n version: string,\n scope?: string\n) => {\n const prefix = `${API_PATHS.PACKAGES_PREFIX}/`;\n const body = getFullPackageName(name, scope);\n const suffix = `/v${version}`;\n return `${prefix}${body}${suffix}`;\n};\n\nexport const sanitizeVersion = (ver: string) => {\n let sanitized = ver;\n if (sanitized.startsWith(\"~\") || sanitized.startsWith(\"^\")) {\n sanitized = sanitized.substring(1);\n }\n return sanitized;\n};\n\nconst extractMajor = (ver: string) => {\n let sanitized = sanitizeVersion(ver);\n return sanitized.split(\".\")[0];\n};\n\nexport const findPackage = (\n catalog: Packages,\n pkg: string\n): CatalogPackage | undefined => {\n const packages = catalog.packages.filter((p) => p.name === pkg);\n\n if (packages.length > 1) {\n return packages.sort((p1, p2) => {\n const mv1 = extractMajor(p1.version);\n const mv2 = extractMajor(p2.version);\n return mv2.localeCompare(mv1);\n })[0];\n }\n\n return packages[0];\n};\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<LanguageSupportTooltipProps> =\n ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n };\n","import { 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 { Box, HTMLChakraProps, forwardRef, Image } from \"@chakra-ui/react\";\n\nexport interface PictureProps extends HTMLChakraProps<\"img\"> {\n alt: string;\n src: string;\n sources?: {\n media?: string;\n srcSet: string;\n }[];\n}\n\nexport const Picture = forwardRef<PictureProps, \"img\">(\n ({ sources, ...props }, ref) => (\n <Box as=\"picture\">\n {sources?.map((source, idx) => (\n <source key={idx} media={source.media} srcSet={source.srcSet} />\n ))}\n <Image ref={ref} {...props} />\n </Box>\n )\n);\n\nPicture.displayName = \"Picture\";\n","import { Button, Center, Flex } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Page } from \"../../components/Page\";\nimport { Picture } from \"../../components/Picture\";\n\nconst bgSources = {\n optimal: [\n { media: \"(max-width:1024px)\", srcSet: \"/assets/404-hive@50.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/404-hive@100.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/404-hive@100.png\" },\n ],\n fallback: \"/assets/404-hive@50.png\",\n};\n\nexport const NotFound: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Not Found\",\n description: \"Oops! The page you were looking for does not exist\",\n }}\n pageName=\"notFound\"\n >\n <Center h=\"100%\" position=\"relative\" w=\"100%\">\n <Picture\n alt=\"\"\n inset={0}\n position=\"absolute\"\n sources={bgSources.optimal}\n src={bgSources.fallback}\n zIndex=\"hide\"\n />\n <Flex align=\"center\" direction=\"column\" justify=\"center\">\n <Picture\n alt=\"404 Image\"\n sources={[{ srcSet: \"/assets/robot.webp\" }]}\n src=\"/assets/robot.png\"\n />\n <Button as={Link} colorScheme=\"blue\" to=\"/\">\n Take Me Home\n </Button>\n </Flex>\n </Center>\n </Page>\n );\n};\n","import { 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 testIds from \"./testIds\";\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 data-testid={testIds.container}\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 { 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 { Image, ImageProps } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nexport const Img: FunctionComponent<ImageProps> = (props) => (\n <Image display=\"inline-block\" {...props} />\n);\n","import { UnorderedList, OrderedList, ListItem } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const Ul: FunctionComponent = ({ children }) => (\n <UnorderedList>{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 {\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 { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"markdown\", [\"container\"] as const);\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 { 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 { 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","import * as spec from \"@jsii/spec\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\n/**\n * Fetch assembly of a specific package from the backend.\n */\nexport const fetchAssembly = async (\n name: string,\n version: string,\n scope?: string\n): Promise<spec.Assembly> => {\n const assemblyPath = `${getAssetsPath(name, version, scope)}${\n API_PATHS.ASSEMBLY_SUFFIX\n }`;\n const response = await fetch(assemblyPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching assembly for ${assemblyPath}: ${response.statusText}`\n );\n }\n return response.json();\n};\n","import { getAssetsPath } from \"./util\";\n\n/**\n * Fetch markdown docs of a specific package from the backend.\n */\nexport const fetchMarkdown = async (\n name: string,\n version: string,\n language: string,\n scope?: string,\n submodule?: string\n): Promise<string> => {\n const docsSuffix = `/docs-${submodule ? `${submodule}-` : \"\"}${language}.md`;\n\n const markdownPath = `${getAssetsPath(name, version, scope)}${docsSuffix}`;\n const response = await fetch(markdownPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching documentation for ${markdownPath}: ${response.statusText}`\n );\n }\n\n // since CloudFront returns a 200 /index.html for missing documents,\n // we assert the expected docs content type to detect these errors.\n // TODO: switch to proper 404 responses in this case (requires backend changes)\n const expectedContentType = \"text/markdown\";\n const contentType = response.headers.get(\"Content-Type\");\n\n // we check 'includes' and not 'equal' because the content type contains\n // charset as well (e.g text/markdown; charset=UTF-8)\n if (!contentType || !contentType.includes(expectedContentType)) {\n throw new Error(\n `Invalid content type: ${contentType}. Expected ${expectedContentType}\"`\n );\n }\n return response.text();\n};\n","import { CDKType } from \"../../constants/constructs\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\nexport interface Metadata {\n constructFramework?: {\n name?: CDKType;\n majorVersion?: number;\n };\n date: string;\n links?: {\n npm: string;\n };\n packageLinks?: {\n [key: string]: string;\n };\n}\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 { 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 { KEYWORD_IGNORE_LIST } from \"../../../../constants/keywords\";\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((v) => Boolean(v) && !KEYWORD_IGNORE_LIST.has(v))\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 } else if (language === Language.Java) {\n const groupId = assembly.targets?.java?.maven?.groupId;\n const artifactId = assembly.targets?.java?.maven?.artifactId;\n if (!groupId || !artifactId) return undefined;\n return [\n \"// add this to your pom.xml\",\n \"<dependency>\",\n ` <groupId>${groupId}</groupId>`,\n ` <artifactId>${artifactId}</artifactId>`,\n ` <version>${version}</version>`,\n \"</dependency>\",\n ].join(\"\\n\");\n }\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=\"16rem\">\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=\"16rem\">\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 { 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 = \"4.5rem\";\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, Center, Spinner, 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 const isLoadingDocs =\n !metadataResponse.loading &&\n (assemblyResponse.loading || markdownResponse.loading);\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 ) : isLoadingDocs ? (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\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, findPackage } from \"../../api/package/util\";\nimport { useCatalog } from \"../../contexts/Catalog\";\nimport NotFound from \"../NotFound\";\n\ninterface RouteParams {\n name: string;\n scope?: string;\n}\n\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 pkg = findPackage(catalog, packageName);\n\n if (!pkg) {\n return undefined;\n }\n\n const { version } = pkg;\n const suffix = `/v/${version}`;\n return `${prefix}${packageName}${suffix}`;\n};\n\nexport const PackageLatest: FunctionComponent = () => {\n const { name, scope }: RouteParams = useParams();\n const catalog = useCatalog();\n\n if (catalog.loading || !catalog.data) {\n return (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const url = buildRedirectUrl(catalog.data, name, scope);\n\n return url ? <Redirect to={url} /> : <NotFound />;\n};\n","import type { FunctionComponent } from \"react\";\nimport { Switch, Route, useRouteMatch } from \"react-router-dom\";\nimport { NotFound } from \"../NotFound\";\nimport { Package } from \"../Package\";\nimport { PackageLatest } from \"../PackageLatest\";\n\nconst nameRegexp = \"[^@\\\\/]+\";\nconst scopeRegexp = \"@[^\\\\/]+\";\n\nexport const Packages: FunctionComponent = () => {\n const { path } = useRouteMatch();\n\n return (\n <Switch>\n <Route\n exact\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})`}\n >\n <PackageLatest />\n </Route>\n <Route\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})/v/:version`}\n >\n <Package />\n </Route>\n <Route path=\"*\">\n <NotFound />\n </Route>\n </Switch>\n );\n};\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","hooks/useQueryParams/useQueryParams.ts","hooks/useLanguage/useLanguage.ts","constants/keywords.ts","api/package/util.ts","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageTag/PackageTag.tsx","components/Time/Time.tsx","components/Picture/Picture.tsx","views/NotFound/NotFound.tsx","components/Markdown/Markdown.tsx","components/Markdown/Hr.tsx","components/Markdown/Img.tsx","components/Markdown/List.tsx","components/Markdown/Table.tsx","components/Markdown/testIds.ts","components/Markdown/Text.tsx","components/CopyButton/CopyButton.tsx","components/Code/MultiLineRenderer.tsx","components/Code/SingleLineRenderer.tsx","components/Code/Code.tsx","components/Markdown/Code.tsx","components/Markdown/Headings.tsx","util/sanitize-anchor.ts","api/package/assembly.ts","api/package/docs.ts","api/package/metadata.ts","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","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"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","useQueryParams","useLocation","useMemo","URLSearchParams","defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","has","getInitialLang","langFromParams","storedLang","localStorage","getItem","useLanguage","options","updateUrl","updateSaved","pathname","hash","useHistory","replace","params","get","QUERY_PARAMS","LANGUAGE","useState","language","setLanguage","set","toString","update","useCallback","val","setItem","KEYWORD_IGNORE_LIST","Set","getFullPackageName","scope","getAssetsPath","version","prefix","API_PATHS","PACKAGES_PREFIX","body","sanitizeVersion","ver","sanitized","startsWith","substring","extractMajor","split","findPackage","catalog","pkg","packages","filter","p","length","sort","p1","p2","mv1","localeCompare","LanguageSupportTooltip","isSupported","langName","LANGUAGE_NAME_MAP","message","hasArrow","label","placement","PackageTag","value","zIndex","tagProps","NavLink","to","getSearchPath","query","_hover","textDecoration","Time","forwardRef","ref","date","formatString","format","boxProps","as","dateTime","toISOString","displayName","Picture","sources","props","map","source","idx","media","srcSet","bgSources","optimal","fallback","NotFound","h","position","w","alt","inset","src","align","direction","justify","Link","colorScheme","components","a","A","blockquote","Blockquote","caption","TableCaption","code","Code","em","Em","h1","Headings","h2","h3","h4","h5","h6","hr","Hr","img","Img","li","Li","ol","Ol","P","pre","Pre","sup","Sup","table","Table","tbody","Tbody","td","Td","tfoot","Tfoot","th","Th","thead","Thead","tr","Tr","ul","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","Buffer","byteLength","lastIndexOf","join","testIds","container","px","sx","mb","lineHeight","transformImageUri","transformLinkUri","my","display","mr","fontStyle","fontSize","color","maxW","overflowX","variant","createTestIds","href","linkProps","Component","URL","hostname","window","location","bg","borderLeft","borderLeftColor","borderRadius","wordBreak","fontWeight","undefined","text","Array","isArray","ml","top","CopyButton","btnProps","useClipboard","hasCopied","onCopy","icon","Check","Copy","minW","onClick","MultiLineRenderer","tokens","getLineProps","getTokenProps","py","line","i","key","token","SingleLineRenderer","defaultProps","theme","nightOwlLight","border","boxShadow","className","overflow","style","inline","borderColor","Children","toArray","reduce","accum","child","trim","level","size","marginY","elem","dataElement","DOMParser","parseFromString","ReactDOMServer","renderToStaticMarkup","querySelector","dataset","headingTitle","id","headingId","toLowerCase","isH3OrLarger","mt","fetchAssembly","assemblyPath","ASSEMBLY_SUFFIX","fetch","response","ok","Error","statusText","json","fetchMarkdown","submodule","docsSuffix","markdownPath","expectedContentType","contentType","headers","fetchMetadata","sanitizedVersion","metadataPath","METADATA_SUFFIX","LanguageBar","targetLanguages","selectedLanguage","setSelectedLanguage","spacing","left","right","LANGUAGES","indexOf","isDisabled","isSelected","LangIcon","LANGUAGE_RENDER_MAP","cursor","disabled","height","width","languageSet","LanguageSelection","assembly","targets","Object","keys","target","DependencyDropdown","dependencies","depEntries","entries","Button","leftIcon","rightIcon","ChevronDown","OS_ORG_LINK","LICENSE_LINKS","MIT","LicenseLink","license","ExternalLink","Details","linksConfig","metadata","detailItems","links","username","author","authorUrl","registry","npm","items","publishDate","Date","push","forEach","displayText","packageLinks","link","getRepoUrlAndHost","repoLink","licenseLink","registryLink","slice","detail","listStyleType","OperatorArea","textAlign","base","md","encodeURIComponent","m","PackageHeader","tags","currentLanguage","maxWidth","v","Boolean","tag","iconButtonProps","iconProps","CodePopover","header","trigger","disclosure","useDisclosure","focusRef","useRef","mdBreakpoint","useToken","useMediaQuery","isMd","initialFocusRef","isLazy","Flex","pr","copy","close","Close","onClose","borderTopLeftRadius","borderTopRightRadius","CodePopoverTrigger","UseConstruct","packageName","Python","python","distName","Java","groupId","java","maven","artifactId","getCodeSample","PackageDetails","config","loading","data","Card","gap","templateColumns","templateRows","keywords","orientation","minH","NavItem","onOpen","isHashUrl","linkIsActive","defaultIsOpen","showToggle","showChildren","isOpen","LinkComponent","nestedItems","item","ChevronRight","onToggle","pl","textOverflow","whiteSpace","_before","bottom","NavTree","SearchInput","inputRef","onChange","onSubmit","inputValue","setInputValue","useDebounce","Form","Search","e","placeholder","SearchModal","onInputChange","submodules","navigate","preventDefault","mx","pb","maxH","role","tabIndex","SearchItem","ChooseSubmodule","allSubmodules","currentSubmodule","SUBMODULE","submoduleText","setFilter","getUrl","submoduleName","results","fqn","ArrowBack","flexGrow","appendItem","itemTree","HTMLElement","headingLevel","innerText","parseInt","last","TOP_OFFSET","PackageDocs","markdown","navItems","setNavItems","tree","document","querySelectorAll","scrollIntoView","columnGap","alignSelf","borderRight","borderRightColor","maxHeight","borderBottom","overflowY","scrollMarginTop","PackageDocsError","issueLink","PackageDocsUnsupported","languageName","Package","useParams","useRequest","requestMarkdown","markdownResponse","requestAssembly","assemblyResponse","requestMetadata","metadataResponse","configResponse","useConfig","q","pageTitle","pageDescription","error","hasError","hasDocs","isLoadingDocs","pt","PackageLatest","useCatalog","buildRedirectUrl","nameRegexp","scopeRegexp","Packages","path","useRouteMatch","exact"],"mappings":"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","file":"static/js/7.4fcbd19f.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { 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","export const KEYWORD_IGNORE_LIST = new Set([\n \"aws-cdk\",\n \"aws\",\n \"awscdk\",\n \"cdk-construct\",\n \"cdk\",\n \"construct\",\n \"constructs\",\n]);\n","import { API_PATHS } from \"../../constants/url\";\nimport { CatalogPackage, Packages } from \"./packages\";\n\nexport const getFullPackageName = (name: string, scope?: string) => {\n return scope ? `${scope}/${name}` : name;\n};\n\nexport const getAssetsPath = (\n name: string,\n version: string,\n scope?: string\n) => {\n const prefix = `${API_PATHS.PACKAGES_PREFIX}/`;\n const body = getFullPackageName(name, scope);\n const suffix = `/v${version}`;\n return `${prefix}${body}${suffix}`;\n};\n\nexport const sanitizeVersion = (ver: string) => {\n let sanitized = ver;\n if (sanitized.startsWith(\"~\") || sanitized.startsWith(\"^\")) {\n sanitized = sanitized.substring(1);\n }\n return sanitized;\n};\n\nconst extractMajor = (ver: string) => {\n let sanitized = sanitizeVersion(ver);\n return sanitized.split(\".\")[0];\n};\n\nexport const findPackage = (\n catalog: Packages,\n pkg: string\n): CatalogPackage | undefined => {\n const packages = catalog.packages.filter((p) => p.name === pkg);\n\n if (packages.length > 1) {\n return packages.sort((p1, p2) => {\n const mv1 = extractMajor(p1.version);\n const mv2 = extractMajor(p2.version);\n return mv2.localeCompare(mv1);\n })[0];\n }\n\n return packages[0];\n};\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<LanguageSupportTooltipProps> =\n ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n };\n","import { 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 { Box, HTMLChakraProps, forwardRef, Image } from \"@chakra-ui/react\";\n\nexport interface PictureProps extends HTMLChakraProps<\"img\"> {\n alt: string;\n src: string;\n sources?: {\n media?: string;\n srcSet: string;\n }[];\n}\n\nexport const Picture = forwardRef<PictureProps, \"img\">(\n ({ sources, ...props }, ref) => (\n <Box as=\"picture\">\n {sources?.map((source, idx) => (\n <source key={idx} media={source.media} srcSet={source.srcSet} />\n ))}\n <Image ref={ref} {...props} />\n </Box>\n )\n);\n\nPicture.displayName = \"Picture\";\n","import { Button, Center, Flex } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Page } from \"../../components/Page\";\nimport { Picture } from \"../../components/Picture\";\n\nconst bgSources = {\n optimal: [\n { media: \"(max-width:1024px)\", srcSet: \"/assets/404-hive@50.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/404-hive@100.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/404-hive@100.png\" },\n ],\n fallback: \"/assets/404-hive@50.png\",\n};\n\nexport const NotFound: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Not Found\",\n description: \"Oops! The page you were looking for does not exist\",\n }}\n pageName=\"notFound\"\n >\n <Center h=\"100%\" position=\"relative\" w=\"100%\">\n <Picture\n alt=\"\"\n inset={0}\n position=\"absolute\"\n sources={bgSources.optimal}\n src={bgSources.fallback}\n zIndex=\"hide\"\n />\n <Flex align=\"center\" direction=\"column\" justify=\"center\">\n <Picture\n alt=\"404 Image\"\n sources={[{ srcSet: \"/assets/robot.webp\" }]}\n src=\"/assets/robot.png\"\n />\n <Button as={Link} colorScheme=\"blue\" to=\"/\">\n Take Me Home\n </Button>\n </Flex>\n </Center>\n </Page>\n );\n};\n","import { 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 testIds from \"./testIds\";\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 data-testid={testIds.container}\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 { 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 { Image, ImageProps } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nexport const Img: FunctionComponent<ImageProps> = (props) => (\n <Image display=\"inline-block\" {...props} />\n);\n","import { UnorderedList, OrderedList, ListItem } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const Ul: FunctionComponent = ({ children }) => (\n <UnorderedList>{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 {\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 { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"markdown\", [\"container\"] as const);\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 { 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 { 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","import * as spec from \"@jsii/spec\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\n/**\n * Fetch assembly of a specific package from the backend.\n */\nexport const fetchAssembly = async (\n name: string,\n version: string,\n scope?: string\n): Promise<spec.Assembly> => {\n const assemblyPath = `${getAssetsPath(name, version, scope)}${\n API_PATHS.ASSEMBLY_SUFFIX\n }`;\n const response = await fetch(assemblyPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching assembly for ${assemblyPath}: ${response.statusText}`\n );\n }\n return response.json();\n};\n","import { getAssetsPath } from \"./util\";\n\n/**\n * Fetch markdown docs of a specific package from the backend.\n */\nexport const fetchMarkdown = async (\n name: string,\n version: string,\n language: string,\n scope?: string,\n submodule?: string\n): Promise<string> => {\n const docsSuffix = `/docs-${submodule ? `${submodule}-` : \"\"}${language}.md`;\n\n const markdownPath = `${getAssetsPath(name, version, scope)}${docsSuffix}`;\n const response = await fetch(markdownPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching documentation for ${markdownPath}: ${response.statusText}`\n );\n }\n\n // since CloudFront returns a 200 /index.html for missing documents,\n // we assert the expected docs content type to detect these errors.\n // TODO: switch to proper 404 responses in this case (requires backend changes)\n const expectedContentType = \"text/markdown\";\n const contentType = response.headers.get(\"Content-Type\");\n\n // we check 'includes' and not 'equal' because the content type contains\n // charset as well (e.g text/markdown; charset=UTF-8)\n if (!contentType || !contentType.includes(expectedContentType)) {\n throw new Error(\n `Invalid content type: ${contentType}. Expected ${expectedContentType}\"`\n );\n }\n return response.text();\n};\n","import { CDKType } from \"../../constants/constructs\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\nexport interface Metadata {\n constructFramework?: {\n name?: CDKType;\n majorVersion?: number;\n };\n date: string;\n links?: {\n npm: string;\n };\n packageLinks?: {\n [key: string]: string;\n };\n}\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 { 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 { KEYWORD_IGNORE_LIST } from \"../../../../constants/keywords\";\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((v) => Boolean(v) && !KEYWORD_IGNORE_LIST.has(v))\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 } else if (language === Language.Java) {\n const groupId = assembly.targets?.java?.maven?.groupId;\n const artifactId = assembly.targets?.java?.maven?.artifactId;\n if (!groupId || !artifactId) return undefined;\n return [\n \"// add this to your pom.xml\",\n \"<dependency>\",\n ` <groupId>${groupId}</groupId>`,\n ` <artifactId>${artifactId}</artifactId>`,\n ` <version>${version}</version>`,\n \"</dependency>\",\n ].join(\"\\n\");\n }\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=\"16rem\">\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=\"16rem\">\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 { 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 = \"4.5rem\";\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, Center, Spinner, 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 const isLoadingDocs =\n !metadataResponse.loading &&\n (assemblyResponse.loading || markdownResponse.loading);\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 ) : isLoadingDocs ? (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\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, findPackage } from \"../../api/package/util\";\nimport { useCatalog } from \"../../contexts/Catalog\";\nimport NotFound from \"../NotFound\";\n\ninterface RouteParams {\n name: string;\n scope?: string;\n}\n\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 pkg = findPackage(catalog, packageName);\n\n if (!pkg) {\n return undefined;\n }\n\n const { version } = pkg;\n const suffix = `/v/${version}`;\n return `${prefix}${packageName}${suffix}`;\n};\n\nexport const PackageLatest: FunctionComponent = () => {\n const { name, scope }: RouteParams = useParams();\n const catalog = useCatalog();\n\n if (catalog.loading || !catalog.data) {\n return (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const url = buildRedirectUrl(catalog.data, name, scope);\n\n return url ? <Redirect to={url} /> : <NotFound />;\n};\n","import type { FunctionComponent } from \"react\";\nimport { Switch, Route, useRouteMatch } from \"react-router-dom\";\nimport { NotFound } from \"../NotFound\";\nimport { Package } from \"../Package\";\nimport { PackageLatest } from \"../PackageLatest\";\n\nconst nameRegexp = \"[^@\\\\/]+\";\nconst scopeRegexp = \"@[^\\\\/]+\";\n\nexport const Packages: FunctionComponent = () => {\n const { path } = useRouteMatch();\n\n return (\n <Switch>\n <Route\n exact\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})`}\n >\n <PackageLatest />\n </Route>\n <Route\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})/v/:version`}\n >\n <Package />\n </Route>\n <Route path=\"*\">\n <NotFound />\n </Route>\n </Switch>\n );\n};\n"],"sourceRoot":""}