construct-hub 0.2.1 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. package/.jsii +2 -2
  2. package/lib/backend/transliterator/transliterator.bundle/Dockerfile +7 -3
  3. package/lib/backend/transliterator/transliterator.bundle/index.js +495 -238
  4. package/lib/construct-hub.js +1 -1
  5. package/lib/package-sources/code-artifact.js +1 -1
  6. package/lib/package-sources/npmjs.js +1 -1
  7. package/lib/spdx-license.js +1 -1
  8. package/package.json +9 -9
  9. package/website/asset-manifest.json +38 -34
  10. package/website/assets/aws-cdk.png +0 -0
  11. package/website/assets/kubernetes.png +0 -0
  12. package/website/assets/terraform.png +0 -0
  13. package/website/index.html +1 -1
  14. package/website/service-worker.js +1 -1
  15. package/website/service-worker.js.map +1 -1
  16. package/website/static/js/{0.ff9d42f8.chunk.js → 0.074504b3.chunk.js} +2 -2
  17. package/website/static/js/{0.ff9d42f8.chunk.js.map → 0.074504b3.chunk.js.map} +1 -1
  18. package/website/static/js/1.272635ed.chunk.js +2 -0
  19. package/website/static/js/{1.bd0a2241.chunk.js.map → 1.272635ed.chunk.js.map} +1 -1
  20. package/website/static/js/10.d664efc4.chunk.js +2 -0
  21. package/website/static/js/10.d664efc4.chunk.js.map +1 -0
  22. package/website/static/js/11.6f7f0c4b.chunk.js +2 -0
  23. package/website/static/js/{10.32615aa0.chunk.js.map → 11.6f7f0c4b.chunk.js.map} +1 -1
  24. package/website/static/js/12.c21a676e.chunk.js +2 -0
  25. package/website/static/js/12.c21a676e.chunk.js.map +1 -0
  26. package/website/static/js/{11.051d89fc.chunk.js → 13.8635b63a.chunk.js} +2 -2
  27. package/website/static/js/{11.051d89fc.chunk.js.map → 13.8635b63a.chunk.js.map} +1 -1
  28. package/website/static/js/{12.e96b82dd.chunk.js → 14.86414212.chunk.js} +3 -3
  29. package/website/static/js/{12.e96b82dd.chunk.js.LICENSE.txt → 14.86414212.chunk.js.LICENSE.txt} +0 -0
  30. package/website/static/js/{12.e96b82dd.chunk.js.map → 14.86414212.chunk.js.map} +1 -1
  31. package/website/static/js/{13.fb054c47.chunk.js → 15.78ca2283.chunk.js} +2 -2
  32. package/website/static/js/{13.fb054c47.chunk.js.map → 15.78ca2283.chunk.js.map} +1 -1
  33. package/website/static/js/4.53a8d553.chunk.js +3 -0
  34. package/website/static/js/{4.7cd92fab.chunk.js.LICENSE.txt → 4.53a8d553.chunk.js.LICENSE.txt} +0 -0
  35. package/website/static/js/4.53a8d553.chunk.js.map +1 -0
  36. package/website/static/js/5.5d827820.chunk.js +3 -0
  37. package/website/static/js/{5.0da0a8ef.chunk.js.LICENSE.txt → 5.5d827820.chunk.js.LICENSE.txt} +0 -0
  38. package/website/static/js/{5.0da0a8ef.chunk.js.map → 5.5d827820.chunk.js.map} +1 -1
  39. package/website/static/js/6.f37a117e.chunk.js +2 -0
  40. package/website/static/js/{6.c0e3f99c.chunk.js.map → 6.f37a117e.chunk.js.map} +1 -1
  41. package/website/static/js/{7.11632168.chunk.js → 7.a4739ebc.chunk.js} +2 -2
  42. package/website/static/js/{7.11632168.chunk.js.map → 7.a4739ebc.chunk.js.map} +1 -1
  43. package/website/static/js/{8.8af79a83.chunk.js → 8.b0c4d0d8.chunk.js} +2 -2
  44. package/website/static/js/{8.8af79a83.chunk.js.map → 8.b0c4d0d8.chunk.js.map} +1 -1
  45. package/website/static/js/9.dcbf33c2.chunk.js +2 -0
  46. package/website/static/js/9.dcbf33c2.chunk.js.map +1 -0
  47. package/website/static/js/main.e289a3fc.chunk.js +2 -0
  48. package/website/static/js/main.e289a3fc.chunk.js.map +1 -0
  49. package/website/static/js/runtime-main.fa5c7ad1.js +2 -0
  50. package/website/static/js/runtime-main.fa5c7ad1.js.map +1 -0
  51. package/website/static/js/1.bd0a2241.chunk.js +0 -2
  52. package/website/static/js/10.32615aa0.chunk.js +0 -2
  53. package/website/static/js/4.7cd92fab.chunk.js +0 -3
  54. package/website/static/js/4.7cd92fab.chunk.js.map +0 -1
  55. package/website/static/js/5.0da0a8ef.chunk.js +0 -3
  56. package/website/static/js/6.c0e3f99c.chunk.js +0 -2
  57. package/website/static/js/9.2b21526e.chunk.js +0 -2
  58. package/website/static/js/9.2b21526e.chunk.js.map +0 -1
  59. package/website/static/js/main.f1390607.chunk.js +0 -2
  60. package/website/static/js/main.f1390607.chunk.js.map +0 -1
  61. package/website/static/js/runtime-main.2f83ac68.js +0 -2
  62. package/website/static/js/runtime-main.2f83ac68.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","components/Picture/Picture.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageTag/PackageTag.tsx","components/Time/Time.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/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/util.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","Picture","forwardRef","ref","sources","props","as","map","source","idx","media","srcSet","displayName","LanguageSupportTooltip","language","TEMP_SUPPORTED_LANGUAGES","has","hasArrow","label","LANGUAGE_NAME_MAP","placement","PackageTag","value","zIndex","tagProps","NavLink","to","getSearchPath","query","_hover","textDecoration","Time","date","formatString","format","boxProps","dateTime","toISOString","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","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","replace","Buffer","byteLength","substring","lastIndexOf","join","px","sx","mb","lineHeight","transformImageUri","transformLinkUri","my","display","mr","fontStyle","fontSize","color","maxW","overflowX","variant","href","linkProps","Component","startsWith","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","length","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","getFullPackageName","scope","getAssetsPath","version","prefix","API_PATHS","PACKAGES_PREFIX","body","sanitizeVersion","ver","sanitized","fetchAssembly","assemblyPath","ASSEMBLY_SUFFIX","fetch","response","ok","Error","statusText","json","fetchMarkdown","submodule","docsSuffix","markdownPath","expectedContentType","contentType","headers","get","fetchMetadata","sanitizedVersion","metadataPath","METADATA_SUFFIX","LanguageBar","targetLanguages","selectedLanguage","setSelectedLanguage","spacing","sort","left","right","LANGUAGES","indexOf","isDisabled","isSelected","LangIcon","LANGUAGE_RENDER_MAP","cursor","disabled","height","width","languageSet","Set","LanguageSelection","assembly","useLanguage","updateSaved","updateUrl","setLanguage","targets","Object","keys","Language","TypeScript","filter","target","DependencyDropdown","dependencies","depEntries","entries","Button","leftIcon","rightIcon","ChevronDown","OS_ORG_LINK","LICENSE_LINKS","MIT","LicenseLink","license","ExternalLink","Details","linksConfig","metadata","detailItems","useMemo","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","Boolean","tag","iconButtonProps","iconProps","testIds","createTestIds","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","getCodeSample","PackageDetails","config","loading","data","Card","gap","templateColumns","templateRows","keywords","orientation","minH","NavItem","onOpen","useLocation","pathname","hash","isHashUrl","linkIsActive","defaultIsOpen","showToggle","showChildren","isOpen","LinkComponent","nestedItems","item","ChevronRight","onToggle","pl","textOverflow","whiteSpace","_before","bottom","NavTree","SearchInput","inputRef","onChange","onSubmit","useState","inputValue","setInputValue","useDebounce","Form","Search","e","placeholder","SearchModal","onInputChange","submodules","useHistory","navigate","useCallback","preventDefault","mx","pb","maxH","role","tabIndex","SearchItem","ChooseSubmodule","useQueryParams","allSubmodules","currentSubmodule","QUERY_PARAMS","SUBMODULE","submoduleText","setFilter","getUrl","submoduleName","params","URLSearchParams","toString","set","results","fqn","split","ArrowBack","lang","LANGUAGE","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","isSupported","pt","extractMajor","buildRedirectUrl","catalog","pkg","packages","p1","p2","mv1","localeCompare","findPackage","PackageLatest","useCatalog","nameRegexp","scopeRegexp","Packages","path","useRouteMatch","exact"],"mappings":"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","file":"static/js/6.c0e3f99c.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 { Box, HTMLChakraProps, forwardRef, Image } from \"@chakra-ui/react\";\n\nexport interface PictureProps extends HTMLChakraProps<\"img\"> {\n alt: string;\n src: string;\n sources?: {\n media?: string;\n srcSet: string;\n }[];\n}\n\nexport const Picture = forwardRef<PictureProps, \"img\">(\n ({ sources, ...props }, ref) => (\n <Box as=\"picture\">\n {sources?.map((source, idx) => (\n <source key={idx} media={source.media} srcSet={source.srcSet} />\n ))}\n <Image ref={ref} {...props} />\n </Box>\n )\n);\n\nPicture.displayName = \"Picture\";\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<LanguageSupportTooltipProps> =\n ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (isSupported) {\n return <>{children}</>;\n }\n\n return (\n <Tooltip\n hasArrow\n label={`Documentation support for ${LANGUAGE_NAME_MAP[language]} is coming soon!`}\n placement=\"top-start\"\n >\n <span>{children}</span>\n </Tooltip>\n );\n };\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Language } from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n language?: Language;\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n language,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ query: `${value}`, language })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport interface TimeOptions {\n date: Date;\n format: string;\n}\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {format(date, formatString)}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","import { 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 { A, Blockquote, Em, P, Pre, Sup } from \"./Text\";\n\nconst ONE_MEGABYTE = 1024 * 1024;\n\nconst components: ReactMarkdownOptions[\"components\"] = {\n a: A,\n blockquote: Blockquote,\n caption: TableCaption,\n code: Code,\n em: Em,\n h1: Headings,\n h2: Headings,\n h3: Headings,\n h4: Headings,\n h5: Headings,\n h6: Headings,\n hr: Hr,\n img: Img,\n li: Li,\n ol: Ol,\n p: P,\n pre: Pre,\n sup: Sup,\n table: Table,\n tbody: Tbody,\n td: Td as TableCellComponent, // The react-markdown component has a tighter signature than the one from @chakra-ui\n tfoot: Tfoot,\n th: Th as TableCellComponent, // The react-markdown component has a tighter signature than the one from @chakra-ui\n thead: Thead,\n tr: Tr,\n ul: Ul,\n};\n\n// see https://github.com/rehypejs/rehype-sanitize#use\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nvar ghSchema = require(\"hast-util-sanitize/lib/github\");\n\n// jsii-docgen adds these attributes to <span> elements embedded inside\n// headings in order to configure custom anchor ids.\n// tell rehype not to strip those out.\nghSchema.attributes.span = (ghSchema.attributes.span ?? []).concat([\n \"dataHeadingTitle\",\n \"dataHeadingId\",\n]);\n\n// Note - the default schema for rehypeSanitize is GitHub-style, which is what we need!\nconst rehypePlugins: PluggableList = [\n [rehypeRaw],\n // ALWAYS keep rehypeSanitize LAST!\n [rehypeSanitize, ghSchema],\n];\nconst remarkPlugins = [remarkGfm, remarkEmoji];\n\nconst GITHUB_REPO_REGEX =\n /^(?:(?:git@)?github\\.com:|(?:https?:\\/\\/)github\\.com\\/)([^/]+)\\/([^/]+)(?:\\.git)?$/;\n\n/**\n * Parses out a GitHub repository owner and repo name from the `repository`\n * configuration of a jsii Assembly.\n *\n * @returns the `owner` and `repo` for the configured repository, if it looks\n * like a GitHub repository URL.\n */\nconst parseGitHubRepository = ({ type, url }: Assembly[\"repository\"]) => {\n if (type !== \"git\") {\n return undefined;\n }\n // git@github.com:<owner>/<repo>.git\n // https://github.com/<owner>/<repo>.git\n const match = GITHUB_REPO_REGEX.exec(url);\n if (match == null) {\n return undefined;\n }\n\n const [, owner, repo] = match;\n return { owner, repo };\n};\n\nexport const Markdown: FunctionComponent<{\n children: string;\n repository: Assembly[\"repository\"];\n}> = ({ children, repository }) => {\n const repoConfig = parseGitHubRepository(repository);\n\n const toAbsoluteUri = (githubPrefix: string, githubSuffix = \"HEAD\") =>\n repoConfig == null\n ? ReactMarkdown.uriTransformer\n : (uri: string) => {\n const url = ReactMarkdown.uriTransformer(uri);\n\n // If this is an anchor or absolute URL, return it.\n const [first] = url;\n if (first === \"#\" || first === \"/\") {\n return url;\n }\n\n // If there is a protocol element, then return the URL as-is.\n if (url.includes(\"://\")) {\n return url;\n }\n\n const owner = repoConfig.owner;\n const repo = repoConfig.repo.replace(/\\.git$/, \"\");\n return `https://${githubPrefix}/${owner}/${repo}/${githubSuffix}/${url}`;\n };\n\n const byteLength = Buffer.byteLength(children);\n if (byteLength > ONE_MEGABYTE) {\n children = children.substring(0, children.lastIndexOf(\"# API Reference\"));\n children = [\n children,\n \"# API Reference\",\n \"The API Reference for this package could not be rendered.\",\n \"If this issue persists, please let us know by creating an [issue](https://github.com/cdklabs/construct-hub-webapp/issues/new)\",\n ].join(\"\\n\");\n }\n return (\n <Box\n px={8}\n sx={{\n \"& > *\": { mb: 8 },\n \"& > p\": { lineHeight: \"taller\" },\n }}\n >\n <ReactMarkdown\n components={components}\n rehypePlugins={rehypePlugins}\n remarkPlugins={remarkPlugins}\n transformImageUri={toAbsoluteUri(\"raw.githubusercontent.com\")}\n transformLinkUri={toAbsoluteUri(\"github.com\", \"blob/HEAD\")}\n >\n {children}\n </ReactMarkdown>\n </Box>\n );\n};\n","import { 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 { 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 { API_PATHS } from \"../../constants/url\";\n\nexport const getFullPackageName = (name: string, scope?: string) => {\n return scope ? `${scope}/${name}` : name;\n};\n\nexport const getAssetsPath = (\n name: string,\n version: string,\n scope?: string\n) => {\n const prefix = `${API_PATHS.PACKAGES_PREFIX}/`;\n const body = getFullPackageName(name, scope);\n const suffix = `/v${version}`;\n return `${prefix}${body}${suffix}`;\n};\n\nexport const sanitizeVersion = (ver: string) => {\n let sanitized = ver;\n if (sanitized.startsWith(\"~\") || sanitized.startsWith(\"^\")) {\n sanitized = sanitized.substring(1);\n }\n return sanitized;\n};\n","import * as spec from \"@jsii/spec\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\n/**\n * Fetch assembly of a specific package from the backend.\n */\nexport const fetchAssembly = async (\n name: string,\n version: string,\n scope?: string\n): Promise<spec.Assembly> => {\n const assemblyPath = `${getAssetsPath(name, version, scope)}${\n API_PATHS.ASSEMBLY_SUFFIX\n }`;\n const response = await fetch(assemblyPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching assembly for ${assemblyPath}: ${response.statusText}`\n );\n }\n return response.json();\n};\n","import { getAssetsPath } from \"./util\";\n\n/**\n * Fetch markdown docs of a specific package from the backend.\n */\nexport const fetchMarkdown = async (\n name: string,\n version: string,\n language: string,\n scope?: string,\n submodule?: string\n): Promise<string> => {\n const docsSuffix = `/docs-${submodule ? `${submodule}-` : \"\"}${language}.md`;\n\n const markdownPath = `${getAssetsPath(name, version, scope)}${docsSuffix}`;\n const response = await fetch(markdownPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching documentation for ${markdownPath}: ${response.statusText}`\n );\n }\n\n // since CloudFront returns a 200 /index.html for missing documents,\n // we assert the expected docs content type to detect these errors.\n // TODO: switch to proper 404 responses in this case (requires backend changes)\n const expectedContentType = \"text/markdown\";\n const contentType = response.headers.get(\"Content-Type\");\n\n // we check 'includes' and not 'equal' because the content type contains\n // charset as well (e.g text/markdown; charset=UTF-8)\n if (!contentType || !contentType.includes(expectedContentType)) {\n throw new Error(\n `Invalid content type: ${contentType}. Expected ${expectedContentType}\"`\n );\n }\n return response.text();\n};\n","import { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\nexport interface Metadata {\n date: string;\n links?: {\n npm: string;\n };\n packageLinks?: {\n [key: string]: string;\n };\n}\n\n/**\n * Fetch metadata of a specific package from the backend.\n */\nexport const fetchMetadata = async (\n name: string,\n version: string,\n scope?: string\n): Promise<Metadata> => {\n let sanitizedVersion = version;\n\n if (sanitizedVersion.startsWith(\"^\")) {\n sanitizedVersion = sanitizedVersion.substring(1, sanitizedVersion.length);\n }\n\n const metadataPath = `${getAssetsPath(name, version, scope)}${\n API_PATHS.METADATA_SUFFIX\n }`;\n const response = await fetch(metadataPath);\n\n if (!response.ok) {\n throw new Error(\n `Failed fetching metadata for ${metadataPath}: ${response.statusText}`\n );\n }\n\n return response.json();\n};\n","import { IconButton, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n TEMP_SUPPORTED_LANGUAGES,\n LANGUAGE_RENDER_MAP,\n LANGUAGES,\n} from \"../../constants/languages\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nexport interface LanguageBarProps {\n targetLanguages: readonly Language[];\n selectedLanguage: Language;\n setSelectedLanguage: (lang: Language) => void;\n}\n\nexport const LanguageBar: FunctionComponent<LanguageBarProps> = ({\n targetLanguages,\n selectedLanguage,\n setSelectedLanguage,\n}) => {\n return (\n <Stack\n align=\"center\"\n data-testid=\"language-bar\"\n direction=\"row\"\n spacing={2}\n >\n {[...targetLanguages]\n .sort(\n (left, right) => LANGUAGES.indexOf(left) - LANGUAGES.indexOf(right)\n )\n .map((language: Language) => {\n const isDisabled = !TEMP_SUPPORTED_LANGUAGES.has(language);\n const isSelected = language === selectedLanguage;\n\n const { icon: LangIcon } = LANGUAGE_RENDER_MAP[language];\n\n const onClick = () => {\n if (isSelected) return;\n setSelectedLanguage(language);\n };\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n <IconButton\n aria-label={`Select ${language} icon`}\n border={isSelected ? \"1px solid\" : \"none\"}\n borderColor=\"blue.500\"\n borderRadius=\"lg\"\n boxShadow=\"base\"\n colorScheme=\"blue\"\n cursor={isDisabled ? \"not-allowed\" : \"pointer\"}\n data-testid={`language-${language}`}\n disabled={isDisabled}\n icon={\n <LangIcon\n aria-label={`${language}-icon`}\n borderRadius=\"sm\"\n height={[4, 5, 6]}\n width={[4, 5, 6]}\n />\n }\n onClick={onClick}\n p={1}\n variant=\"outline\"\n w=\"max-content\"\n />\n </LanguageSupportTooltip>\n );\n })}\n </Stack>\n );\n};\n","import type { Assembly } from \"@jsii/spec\";\nimport type { FunctionComponent } from \"react\";\nimport { LanguageBar } from \"../../../../components/LanguageBar\";\nimport { Language, LANGUAGES } from \"../../../../constants/languages\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\nexport interface LanguageSelectionProps {\n assembly: Assembly;\n}\n\nconst languageSet = new Set(LANGUAGES);\n\nexport const LanguageSelection: FunctionComponent<LanguageSelectionProps> = ({\n assembly,\n}) => {\n const [language, setLanguage] = useLanguage({\n updateSaved: true,\n updateUrl: true,\n });\n const targets = [\n ...Object.keys(assembly?.targets ?? {}),\n // typescript is the source language and hence always supported.\n // (it doesn't appear in spec.targets)\n Language.TypeScript,\n ] as Language[];\n\n return (\n <LanguageBar\n selectedLanguage={targets.includes(language) ? language : targets[0]}\n setSelectedLanguage={setLanguage}\n targetLanguages={targets.filter((target) => languageSet.has(target))}\n />\n );\n};\n","import { ChevronDownIcon, LinkIcon } from \"@chakra-ui/icons\";\nimport { Menu, MenuButton, Button, MenuItem, MenuList } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { sanitizeVersion } from \"../../../../api/package/util\";\nimport { NavLink } from \"../../../../components/NavLink\";\n\nexport interface DependencyDropdownProps {\n dependencies: {\n /**\n * Key is a dep name, value is a version\n */\n [key: string]: string;\n };\n}\n\nexport const DependencyDropdown: FunctionComponent<DependencyDropdownProps> = ({\n dependencies,\n}) => {\n const depEntries = Object.entries(dependencies);\n\n if (!depEntries.length) return null;\n\n return (\n <Menu>\n <MenuButton\n as={Button}\n color=\"blue.500\"\n leftIcon={<LinkIcon />}\n rightIcon={<ChevronDownIcon h={6} w={6} />}\n size=\"md\"\n variant=\"outline\"\n >\n Dependencies\n </MenuButton>\n <MenuList>\n {depEntries.map(([name, version]) => (\n <MenuItem key={`${name}/${version}`} p={0}>\n <NavLink\n h=\"100%\"\n p={2}\n to={`/packages/${name}/v/${sanitizeVersion(version)}`}\n w=\"100%\"\n >\n {`${name} - ${version}`}\n </NavLink>\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n );\n};\n","const OS_ORG_LINK = \"https://opensource.org/licenses\";\n\nexport const LICENSE_LINKS = {\n \"Apache-2.0\": `${OS_ORG_LINK}/apache2.0.php`,\n \"BSD-2-Clause\": `${OS_ORG_LINK}/bsd-license.php`,\n MIT: `${OS_ORG_LINK}/mit-license.php`,\n} as const;\n","import { forwardRef } from \"@chakra-ui/react\";\nimport { ExternalLink, ExternalLinkProps } from \"../ExternalLink\";\nimport { LICENSE_LINKS } from \"./constants\";\n\nexport interface LicenseLinkOptions {\n license: keyof typeof LICENSE_LINKS;\n}\n\nexport interface LicenseLinkProps\n extends ExternalLinkProps,\n LicenseLinkOptions {}\n\nexport const LicenseLink = forwardRef<LicenseLinkProps, \"a\">(\n ({ license, ...linkProps }, ref) => {\n const url = LICENSE_LINKS[license];\n\n return (\n <ExternalLink href={url} ref={ref} {...linkProps}>\n {license}\n </ExternalLink>\n );\n }\n);\n\nLicenseLink.displayName = \"LicenseLink\";\n","import { Box, ListItem, Text, UnorderedList } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { ReactNode, useMemo } from \"react\";\nimport type { PackageLinksConfig } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { ExternalLink } from \"../../../../components/ExternalLink\";\nimport { LicenseLink, LICENSE_LINKS } from \"../../../../components/LicenseLink\";\nimport { Time } from \"../../../../components/Time\";\nimport { getRepoUrlAndHost } from \"../../../../util/url\";\n\nexport interface DetailsProps {\n assembly?: Assembly;\n linksConfig?: PackageLinksConfig[];\n metadata: Metadata;\n}\n\nexport const Details = ({ assembly, linksConfig, metadata }: DetailsProps) => {\n const detailItems = useMemo(() => {\n if (!metadata) return [];\n\n const { date, links } = metadata;\n const username = assembly?.author.name;\n const authorUrl = assembly?.author.url;\n const repository = assembly?.repository;\n const license = assembly?.license;\n // https://www.npmjs.com/package/aws-cdk/v/1.113.0\n const registry =\n links?.npm ??\n `https://www.npmjs.com/package/${assembly?.name}/v/${assembly?.version}`;\n\n const items = [];\n\n if (date) {\n const publishDate = (\n <Time date={new Date(date)} fontWeight=\"bold\" format=\"MMMM dd, yyyy\" />\n );\n items.push(<>Published: {publishDate}</>);\n }\n\n if (username) {\n const author = authorUrl ? (\n <ExternalLink href={authorUrl}>{username}</ExternalLink>\n ) : (\n <Box as=\"strong\" fontWeight=\"bold\">\n {username}\n </Box>\n );\n items.push(<>Author: {author}</>);\n }\n\n // Prioritize custom links when available\n if (linksConfig?.length) {\n linksConfig.forEach(({ name, value, displayText }) => {\n const target = (metadata?.packageLinks ?? {})[value];\n if (target) {\n const link = (\n <ExternalLink href={target}>{displayText ?? target}</ExternalLink>\n );\n items.push(\n <>\n {name}: {link}\n </>\n );\n }\n });\n }\n\n if (repository) {\n const repo = getRepoUrlAndHost(repository.url);\n\n if (repo) {\n const repoLink = (\n <ExternalLink href={repo.url}>{repo.hostname}</ExternalLink>\n );\n items.push(<>Repository: {repoLink}</>);\n }\n }\n\n if (license && license in LICENSE_LINKS) {\n const licenseLink = (\n <LicenseLink license={license as keyof typeof LICENSE_LINKS} />\n );\n items.push(<>License: {licenseLink}</>);\n }\n\n if (registry) {\n const registryLink = (\n <ExternalLink href={registry}>\n {new URL(registry).hostname}\n </ExternalLink>\n );\n items.push(<>Registry: {registryLink}</>);\n }\n\n return items.slice(0, 5).map((detail: string | ReactNode, i: number) => (\n <ListItem key={`detail-${i}`} listStyleType=\"none\" my={1}>\n <Text color=\"gray.600\">{detail}</Text>\n </ListItem>\n ));\n }, [metadata, assembly, linksConfig]);\n return <UnorderedList ml={0}>{detailItems}</UnorderedList>;\n};\n","import { Box, Flex, Link } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent } from \"react\";\nimport { PackageLinksConfig } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { DependencyDropdown } from \"../DependencyDropdown\";\nimport { Details } from \"./Details\";\n\nexport interface OperatorAreaProps {\n assembly?: Assembly;\n linksConfig?: PackageLinksConfig[];\n metadata: Metadata;\n}\n\nexport const OperatorArea: FunctionComponent<OperatorAreaProps> = ({\n assembly,\n linksConfig,\n metadata,\n}) => {\n return (\n <Flex direction=\"column\" textAlign={{ base: \"center\", md: \"initial\" }}>\n <Link\n color=\"blue.500\"\n fontSize=\"sm\"\n href={`mailto:abuse@amazonaws.com?subject=${encodeURIComponent(\n `ConstructHub - Report of abusive package: ${assembly?.name}`\n )}`}\n m={2}\n textAlign={{ base: \"center\", md: \"right\" }}\n >\n Report this Package\n </Link>\n <Details\n assembly={assembly}\n linksConfig={linksConfig}\n metadata={metadata}\n />\n {assembly?.dependencies && (\n <Box mt={4}>\n <DependencyDropdown dependencies={assembly.dependencies} />\n </Box>\n )}\n </Flex>\n );\n};\n","import { Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { PackageTag } from \"../../../../components/PackageTag\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\nexport interface PackageHeaderProps {\n title: string;\n description: string;\n tags: string[];\n version: string;\n}\n\nexport const PackageHeader: FunctionComponent<PackageHeaderProps> = ({\n description,\n tags,\n title,\n version,\n}) => {\n const [currentLanguage] = useLanguage();\n return (\n <Flex\n direction=\"column\"\n maxWidth=\"100%\"\n overflowX=\"hidden\"\n p={2}\n textAlign={{ base: \"center\", md: \"initial\" }}\n >\n <Stack\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n justify={{ base: \"center\", md: \"start\" }}\n mb={4}\n spacing={4}\n >\n <Heading wordBreak=\"break-word\">{title}</Heading>\n <Text color=\"blue.500\" fontSize=\"md\">\n {version}\n </Text>\n </Stack>\n\n <Text wordBreak=\"break-word\">{description}</Text>\n {!!tags.length && (\n <Flex\n direction=\"row\"\n justify={{ base: \"center\", md: \"initial\" }}\n mt={3}\n >\n {title.startsWith(\"@aws-cdk/\") ? (\n <PackageTag\n key=\"official\"\n label=\"official\"\n language={currentLanguage}\n mr={2}\n value=\"@aws-cdk\"\n variant=\"official\"\n >\n Official\n </PackageTag>\n ) : null}\n {tags\n .filter(Boolean)\n .slice(0, 3)\n .map((tag) => (\n <PackageTag\n key={tag}\n language={currentLanguage}\n mr={2}\n value={tag}\n >\n {tag}\n </PackageTag>\n ))}\n </Flex>\n )}\n </Flex>\n );\n};\n","import { CheckIcon, CloseIcon, CopyIcon } from \"@chakra-ui/icons\";\nimport {\n Code,\n Flex,\n IconButton,\n Popover,\n PopoverBody,\n PopoverContent,\n PopoverHeader,\n PopoverTrigger,\n Text,\n useClipboard,\n useDisclosure,\n useMediaQuery,\n useToken,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent, ReactNode, useRef } from \"react\";\nimport { createTestIds } from \"../../util/createTestIds\";\n\nconst iconButtonProps = {\n borderRadius: \"md\",\n color: \"white\",\n variant: \"link\",\n};\n\nconst iconProps = {\n h: 4,\n w: 4,\n};\n\nexport const testIds = createTestIds(\"code-popover\", [\n \"close\",\n \"content\",\n \"code\",\n \"copy\",\n \"header\",\n \"trigger\",\n] as const);\n\nexport interface CodePopoverProps {\n code: string;\n header: string;\n trigger: ReactNode;\n}\n\nexport const CodePopover: FunctionComponent<CodePopoverProps> = ({\n code,\n header,\n trigger,\n}) => {\n const { hasCopied, onCopy } = useClipboard(code);\n const disclosure = useDisclosure();\n const focusRef = useRef<HTMLButtonElement>(null);\n const mdBreakpoint = useToken(\"breakpoints\", \"md\");\n const [isMd] = useMediaQuery(`(min-width: ${mdBreakpoint})`);\n\n return (\n <Popover\n initialFocusRef={focusRef}\n isLazy\n placement={isMd ? \"bottom-end\" : \"bottom\"}\n {...disclosure}\n >\n <PopoverTrigger>{trigger}</PopoverTrigger>\n <PopoverContent bg=\"blue.500\" data-testid={testIds.content}>\n <PopoverHeader\n align=\"center\"\n as={Flex}\n color=\"white\"\n data-testid={testIds.header}\n justify=\"space-between\"\n pr={0}\n >\n <Text>{header}</Text>\n <Flex align=\"center\">\n <IconButton\n aria-label=\"copy-text-icon\"\n data-testid={testIds.copy}\n icon={\n hasCopied ? (\n <CheckIcon {...iconProps} color=\"green.200\" />\n ) : (\n <CopyIcon {...iconProps} />\n )\n }\n onClick={onCopy}\n ref={focusRef}\n {...iconButtonProps}\n />\n <IconButton\n aria-label=\"close-icon\"\n data-testid={testIds.close}\n icon={<CloseIcon h={3} w={3} />}\n onClick={disclosure.onClose}\n {...iconButtonProps}\n />\n </Flex>\n </PopoverHeader>\n <PopoverBody\n as={Code}\n bg=\"gray.100\"\n borderTopLeftRadius=\"0\"\n borderTopRightRadius=\"0\"\n color=\"gray.800\"\n data-testid={testIds.code}\n overflow=\"auto\"\n variant=\"code-block\"\n >\n {code}\n </PopoverBody>\n </PopoverContent>\n </Popover>\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport { Button, ButtonProps, forwardRef } from \"@chakra-ui/react\";\nimport { testIds } from \"./CodePopover\";\n\nexport interface CodePopoverTriggerProps extends ButtonProps {}\n\n/**\n * A default trigger button for the code popover\n */\nexport const CodePopoverTrigger = forwardRef<CodePopoverTriggerProps, \"button\">(\n (props, ref) => (\n <Button\n color=\"white\"\n colorScheme=\"blue\"\n data-testid={testIds.trigger}\n ref={ref}\n rightIcon={<ChevronDownIcon h={5} w={5} />}\n {...props}\n >\n {props.children}\n </Button>\n )\n);\n\nCodePopoverTrigger.displayName = \"CodePopoverTrigger\";\n","import type { Assembly } from \"@jsii/spec\";\nimport type { FunctionComponent } from \"react\";\nimport {\n CodePopover,\n CodePopoverTrigger,\n} from \"../../../../components/CodePopover\";\nimport { LANGUAGE_NAME_MAP, Language } from \"../../../../constants/languages\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\n// TODO: We'll probably want to get this from BE as we add more languages, however this should do the trick for now...\nconst getCodeSample = ({\n language,\n assembly,\n}: {\n language: Language;\n assembly: Assembly;\n}): string | undefined => {\n const version = assembly.version;\n if (language === Language.TypeScript) {\n const packageName = assembly.name;\n return `npm install ${packageName}@${version}`;\n } else if (language === Language.Python) {\n const packageName = assembly.targets?.python?.distName;\n if (!packageName) {\n return undefined;\n }\n return `pip install ${packageName}==${version}`;\n }\n\n return undefined;\n};\n\nexport interface UseConstructProps {\n assembly: Assembly;\n}\n\nexport const UseConstruct: FunctionComponent<UseConstructProps> = ({\n assembly,\n}) => {\n const [language] = useLanguage();\n\n const header = LANGUAGE_NAME_MAP[language];\n const code = getCodeSample({ language, assembly });\n\n const isDisabled = !code;\n const label = !isDisabled ? \"Install\" : \"Unsupported\";\n\n const trigger = (\n <CodePopoverTrigger disabled={isDisabled}>{label}</CodePopoverTrigger>\n );\n\n return <CodePopover code={code ?? \"\"} header={header} trigger={trigger} />;\n};\n","import { Center, Divider, Flex, Grid, Spinner, Stack } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent } from \"react\";\nimport { Config } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { Card } from \"../../../../components/Card\";\nimport type { UseRequestResponse } from \"../../../../hooks/useRequest\";\nimport { LanguageSelection } from \"../LanguageSelection\";\nimport { OperatorArea } from \"../OperatorArea\";\nimport { PackageHeader } from \"../PackageHeader\";\nimport { UseConstruct } from \"../UseConstruct\";\n\ninterface PackageDetailsProps {\n config: UseRequestResponse<Config>;\n assembly: UseRequestResponse<Assembly>;\n metadata: UseRequestResponse<Metadata>;\n version: string;\n}\n\n/**\n * Renders the header section of a package. This includes\n * the Getting Started, Operator Area, and Publisher Area sections\n */\nexport const PackageDetails: FunctionComponent<PackageDetailsProps> = ({\n assembly,\n config,\n metadata,\n version,\n}) => {\n const isLoading = assembly.loading || metadata.loading;\n\n if (isLoading || !assembly.data || !metadata.data) {\n return (\n <Center minH=\"200px\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n return (\n <Flex as={Card} direction=\"column\">\n <Grid\n gap={4}\n overflow=\"hidden\"\n templateColumns={{ base: \"1fr\", md: \"3fr auto 2fr\" }}\n templateRows=\"auto\"\n >\n <PackageHeader\n description={assembly.data.description}\n tags={assembly.data.keywords ?? []}\n title={assembly.data.name}\n version={version}\n />\n <Divider\n display={{ base: \"none\", md: \"initial\" }}\n orientation=\"vertical\"\n />\n <Divider\n display={{ base: \"initial\", md: \"none\" }}\n orientation=\"horizontal\"\n />\n {config.loading ? (\n <Center minH=\"200px\">\n <Spinner size=\"xl\" />\n </Center>\n ) : (\n <OperatorArea\n assembly={assembly.data}\n linksConfig={config.data?.packageLinks}\n metadata={metadata.data}\n />\n )}\n </Grid>\n <Stack\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n justify={{ base: \"center\", md: \"space-between\" }}\n px={2}\n py={4}\n spacing={4}\n >\n <LanguageSelection assembly={assembly.data} />\n <UseConstruct assembly={assembly.data} />\n </Stack>\n </Flex>\n );\n};\n","import { ChevronDownIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Box, Flex, Link, IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport { FunctionComponent, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface NavItemConfig {\n children?: NavItemConfig[];\n display: string;\n url: string;\n}\n\nexport interface NavItemProps extends NavItemConfig {\n // The following props don't need to be explicitly defined - they are passed internally\n onOpen?: () => void;\n}\n\nexport interface NavTreeProps {\n /**\n * Items to render\n */\n items: NavItemConfig[];\n}\n\nconst iconProps = {\n color: \"gray.900\",\n h: 4,\n w: 4,\n};\n\nexport const NavItem: FunctionComponent<NavItemProps> = ({\n children,\n display,\n url,\n onOpen,\n}) => {\n const { pathname, hash } = useLocation();\n const isHashUrl = url.startsWith(\"#\");\n const linkIsActive = isHashUrl ? hash === url : pathname === url;\n const disclosure = useDisclosure({ onOpen, defaultIsOpen: true });\n\n const showToggle = (children?.length ?? 0) > 0;\n const showChildren = disclosure.isOpen && showToggle;\n\n const LinkComponent = isHashUrl ? Link : NavLink;\n\n const nestedItems = useMemo(\n () =>\n children?.map((item, idx) => {\n return <NavItem {...item} key={idx} onOpen={disclosure.onOpen} />;\n }),\n [children, disclosure.onOpen]\n );\n\n return (\n <Flex direction=\"column\">\n <Flex align=\"center\" color={linkIsActive ? \"blue.500\" : \"gray.800\"}>\n {showToggle && (\n <IconButton\n aria-label=\"expand-toggle\"\n borderRadius=\"md\"\n h={4}\n icon={\n disclosure.isOpen ? (\n <ChevronDownIcon {...iconProps} />\n ) : (\n <ChevronRightIcon {...iconProps} />\n )\n }\n ml={-1}\n onClick={disclosure.onToggle}\n size=\"xs\"\n variant=\"link\"\n w={4}\n />\n )}\n <LinkComponent\n _hover={{ bg: \"rgba(0, 124, 253, 0.05)\" }}\n href={url}\n overflow=\"hidden\"\n pl={showToggle ? 1 : 2}\n py={1.5}\n textOverflow=\"ellipsis\"\n title={display}\n to={url}\n w=\"100%\"\n whiteSpace=\"nowrap\"\n >\n {display}\n </LinkComponent>\n </Flex>\n <Box\n _before={{\n // Creates a border without taking up any box space\n // This is important to keep items perfectly aligned\n bg: \"gray.100\",\n bottom: 0,\n content: `\"\"`,\n left: 0,\n position: \"absolute\",\n top: 0,\n w: \"1px\",\n }}\n display={showChildren ? \"initial\" : \"none\"}\n ml={2}\n pl={2}\n position=\"relative\"\n >\n {nestedItems}\n </Box>\n </Flex>\n );\n};\n\nexport const NavTree: FunctionComponent<NavTreeProps> = ({ items }) => {\n return (\n <Flex direction=\"column\" maxWidth=\"100%\">\n {items.map((item, idx) => {\n return <NavItem {...item} key={idx} onOpen={undefined} />;\n })}\n </Flex>\n );\n};\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport {\n InputGroup,\n InputLeftElement,\n Input,\n forwardRef,\n} from \"@chakra-ui/react\";\nimport { FormEventHandler, useState } from \"react\";\nimport { Form } from \"../../../../components/Form\";\nimport { useDebounce } from \"../../../../hooks/useDebounce\";\n\nexport interface SearchInputProps {\n value: string;\n onChange: (s: string) => void;\n onSubmit: FormEventHandler<HTMLFormElement>;\n}\n\nexport const SearchInput = forwardRef<SearchInputProps, \"input\">(\n ({ value, onChange, onSubmit }, inputRef) => {\n const [inputValue, setInputValue] = useState(value);\n\n useDebounce(inputValue, { onChange });\n\n return (\n <Form data-testid=\"choose-submodule-search-form\" onSubmit={onSubmit}>\n <InputGroup>\n <InputLeftElement>\n <SearchIcon color=\"gray.400\" />\n </InputLeftElement>\n <Input\n data-testid=\"choose-submodule-search-input\"\n onChange={(e) => setInputValue(e.target.value)}\n placeholder=\"Search\"\n ref={inputRef}\n value={inputValue}\n variant=\"filled\"\n />\n </InputGroup>\n </Form>\n );\n }\n);\n\nSearchInput.displayName = \"SearchInput\";\n","import {\n Box,\n Divider,\n Modal,\n ModalHeader,\n ModalContent,\n ModalCloseButton,\n ModalBody,\n ModalOverlay,\n UnorderedList,\n} from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n useCallback,\n useRef,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { SearchItem } from \"../../../../components/SearchItem\";\nimport { SearchInput } from \"./SearchInput\";\n\nexport interface SearchModalProps {\n inputValue: string;\n isOpen: boolean;\n onClose: () => void;\n onInputChange: (s: string) => void;\n submodules: { name: string; to: string }[];\n}\n\nexport const SearchModal: FunctionComponent<SearchModalProps> = ({\n inputValue,\n isOpen,\n onClose,\n onInputChange,\n submodules,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { push } = useHistory();\n\n const navigate = useCallback(\n (to: string) => {\n onClose();\n push(to);\n },\n [onClose, push]\n );\n\n const onSubmit = useCallback<FormEventHandler<HTMLFormElement>>(\n (e) => {\n e.preventDefault();\n\n if (!submodules.length) return;\n const { to } = submodules[0];\n navigate(to);\n },\n [navigate, submodules]\n );\n\n return (\n <Modal initialFocusRef={inputRef} isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent mx={4}>\n <ModalCloseButton data-testid=\"choose-submodule-modal-close\" />\n <ModalHeader\n data-testid=\"choose-submodule-modal-header\"\n fontSize=\"lg\"\n fontWeight=\"bold\"\n >\n Choose a submodule\n </ModalHeader>\n <ModalBody data-testid=\"choose-submodule-modal-body\" p={0}>\n <Box pb={4} px={4}>\n <SearchInput\n onChange={onInputChange}\n onSubmit={onSubmit}\n ref={inputRef}\n value={inputValue}\n />\n </Box>\n <Divider />\n <UnorderedList\n data-testid=\"choose-submodule-modal-results\"\n m={0}\n maxH=\"50vh\"\n overflow=\"hidden auto\"\n p={0}\n role=\"listbox\"\n tabIndex={-1}\n >\n {submodules.map(({ name, to }) => (\n <SearchItem\n data-testid=\"choose-submodule-result\"\n key={name}\n name={name}\n onClick={() => navigate(to)}\n />\n ))}\n </UnorderedList>\n </ModalBody>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n );\n};\n","import { ArrowBackIcon, ChevronDownIcon } from \"@chakra-ui/icons\";\nimport { Button, Divider, Stack, useDisclosure } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent, useCallback, useMemo, useState } from \"react\";\nimport { useHistory, useLocation } from \"react-router-dom\";\nimport { QUERY_PARAMS } from \"../../../../constants/url\";\nimport { useQueryParams } from \"../../../../hooks/useQueryParams\";\nimport { SearchModal } from \"./SearchModal\";\n\nexport interface ChooseSubmoduleProps {\n assembly?: Assembly;\n}\n\nexport const ChooseSubmodule: FunctionComponent<ChooseSubmoduleProps> = ({\n assembly,\n}) => {\n const { pathname } = useLocation();\n const { push } = useHistory();\n const query = useQueryParams();\n\n const allSubmodules = Object.keys(assembly?.submodules ?? {});\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n const currentSubmodule = query.get(QUERY_PARAMS.SUBMODULE);\n const submoduleText = currentSubmodule\n ? `Submodule: ${currentSubmodule}`\n : \"Choose Submodule\";\n\n const [filter, setFilter] = useState(\"\");\n\n const onGoBack = () => {\n const lang = query.get(QUERY_PARAMS.LANGUAGE);\n push(`${pathname}${lang ? `?${QUERY_PARAMS.LANGUAGE}=${lang}` : \"\"}`);\n };\n\n const getUrl = useCallback(\n (submoduleName: string) => {\n const params = new URLSearchParams(query.toString());\n params.set(\"submodule\", submoduleName);\n return `${pathname}?${params}`;\n },\n [pathname, query]\n );\n\n const submodules = useMemo(() => {\n let results = allSubmodules;\n\n if (filter) {\n results = results.filter((fqn) =>\n fqn.toLowerCase().includes(filter.toLowerCase())\n );\n }\n\n return results.map((fqn) => {\n const name = fqn.split(\".\")[1];\n return {\n name,\n to: getUrl(name),\n };\n });\n }, [allSubmodules, filter, getUrl]);\n\n if (allSubmodules.length === 0) {\n return null;\n }\n\n return (\n <Stack spacing={4} w=\"100%\">\n {currentSubmodule && (\n <>\n <Button\n borderRadius=\"none\"\n data-testid=\"choose-submodule-go-back\"\n leftIcon={<ArrowBackIcon aria-label=\"Back to construct root\" />}\n onClick={onGoBack}\n title=\"Back to construct root\"\n variant=\"link\"\n >\n {assembly?.name}\n </Button>\n <Divider />\n </>\n )}\n <Button\n borderRadius=\"none\"\n color=\"blue.500\"\n data-testid=\"choose-submodule-search-trigger\"\n flexGrow={1}\n onClick={onOpen}\n rightIcon={<ChevronDownIcon />}\n title=\"Choose Submodule\"\n variant=\"link\"\n >\n {submoduleText}\n </Button>\n <SearchModal\n inputValue={filter}\n isOpen={isOpen}\n onClose={onClose}\n onInputChange={setFilter}\n submodules={submodules}\n />\n </Stack>\n );\n};\n","import { Box, Flex, Grid } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { useState, useEffect, FunctionComponent, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { Markdown } from \"../../../../components/Markdown\";\nimport { NavTree, NavItemConfig } from \"../../../../components/NavTree\";\nimport { ChooseSubmodule } from \"../ChooseSubmodule\";\n\nexport interface PackageDocsProps {\n markdown: string;\n assembly: Assembly;\n}\n\ntype Item = NavItemConfig & { level: number; children: Item[] };\n\nexport const appendItem = (itemTree: Item[], item: Element): Item[] => {\n if (!(item instanceof HTMLElement)) {\n return itemTree;\n }\n\n const { headingId, headingLevel = \"100\" } = item.dataset;\n const { innerText } = item;\n const level = parseInt(headingLevel);\n\n // Don't create nav items for items with no title / url\n if (level > 3 || !innerText || !headingId) {\n return itemTree;\n }\n\n const last = itemTree[itemTree.length - 1];\n\n if (last == null || last.level >= level) {\n return [\n ...itemTree,\n {\n display: innerText,\n url: `#${headingId}`,\n level,\n children: [],\n },\n ];\n } else {\n last.children = appendItem(last.children, item);\n return itemTree;\n }\n};\n\n// We want the nav to be sticky, but it should account for the sticky heading as well, which is 72px\nconst TOP_OFFSET = \"72px\";\n\nexport const PackageDocs: FunctionComponent<PackageDocsProps> = ({\n markdown: source,\n assembly,\n}) => {\n const [navItems, setNavItems] = useState<Item[]>([]);\n\n useEffect(() => {\n const tree = [\n ...document.querySelectorAll(\n `[data-heading-id][data-heading-title][data-heading-level]`\n ),\n ].reduce(appendItem, []);\n\n setNavItems(tree);\n }, [source]);\n\n const { hash } = useLocation();\n useEffect(() => {\n if (hash) {\n const target = document.querySelector(`${hash}`) as HTMLElement;\n target?.scrollIntoView(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [source]);\n\n const markdown = useMemo(\n () => <Markdown repository={assembly.repository}>{source}</Markdown>,\n [assembly.repository, source]\n );\n\n return (\n <Grid\n bg=\"white\"\n columnGap={4}\n h=\"100%\"\n templateColumns={{ base: \"1fr\", md: \"1fr 3fr\" }}\n width=\"100%\"\n >\n <Flex\n alignSelf=\"stretch\"\n borderRight=\"1px solid\"\n borderRightColor=\"blue.50\"\n direction=\"column\"\n display={{ base: \"none\", md: \"flex\" }}\n maxHeight={`calc(100vh - ${TOP_OFFSET})`}\n overflow=\"hidden auto\"\n position=\"sticky\"\n px={4}\n top={TOP_OFFSET}\n >\n {Object.keys(assembly?.submodules ?? {}).length > 0 && (\n <Flex\n borderBottom=\"1px solid\"\n borderColor=\"blue.50\"\n justify=\"center\"\n py={4}\n >\n <ChooseSubmodule assembly={assembly} />\n </Flex>\n )}\n <Box overflowY=\"auto\" py={4}>\n <NavTree items={navItems} />\n </Box>\n </Flex>\n <Box\n h=\"max-content\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n py={4}\n sx={{\n a: {\n scrollMarginTop: TOP_OFFSET,\n },\n }}\n >\n {markdown}\n </Box>\n </Grid>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../../../../components/ExternalLink\";\nimport { Language } from \"../../../../constants/languages\";\n\nexport interface PackageDocsErrorProps {\n readonly language: Language;\n}\n\nexport const PackageDocsError: FunctionComponent<PackageDocsErrorProps> = ({\n language,\n}) => {\n const issueLink = (\n <ExternalLink href=\"https://github.com/cdklabs/construct-hub-webapp/issues/new\">\n issue\n </ExternalLink>\n );\n return (\n <Text\n align=\"center\"\n fontSize=\"xl\"\n fontStyle=\"oblique\"\n px={4}\n wordBreak=\"break-word\"\n >\n Documentation in {language} is still not ready for this package. Come back\n soon. If this issue persists, please let us know by creating an{\" \"}\n {issueLink}.\n </Text>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Language, LANGUAGE_NAME_MAP } from \"../../../../constants/languages\";\n\nexport interface PackageDocsUnsupportedProps {\n readonly language: Language;\n}\n\nexport const PackageDocsUnsupported: FunctionComponent<PackageDocsUnsupportedProps> =\n ({ language }) => {\n const languageName = LANGUAGE_NAME_MAP[language];\n return (\n <Text\n align=\"center\"\n fontSize=\"xl\"\n fontStyle=\"oblique\"\n px={4}\n wordBreak=\"break-word\"\n >\n This package does not currently support {languageName}. Select one of\n the supported languages above, or ask the author to add support for{\" \"}\n {languageName} in a future release.\n </Text>\n );\n };\n","import { Box, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { fetchAssembly } from \"../../api/package/assembly\";\nimport { fetchMarkdown } from \"../../api/package/docs\";\nimport { fetchMetadata } from \"../../api/package/metadata\";\nimport { Page } from \"../../components/Page\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useConfig } from \"../../contexts/Config\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { useRequest } from \"../../hooks/useRequest\";\nimport { NotFound } from \"../NotFound\";\nimport { PackageDetails } from \"./components/PackageDetails\";\nimport { PackageDocs } from \"./components/PackageDocs\";\nimport { PackageDocsError } from \"./components/PackageDocsError\";\nimport { PackageDocsUnsupported } from \"./components/PackageDocsUnsupported/PackageDocsUnsupported\";\n\ninterface PathParams {\n name: string;\n scope?: string;\n version: string;\n}\n\nexport const Package: FunctionComponent = () => {\n const { name, scope, version }: PathParams = useParams();\n const [requestMarkdown, markdownResponse] = useRequest(fetchMarkdown);\n const [requestAssembly, assemblyResponse] = useRequest(fetchAssembly);\n const [requestMetadata, metadataResponse] = useRequest(fetchMetadata);\n const configResponse = useConfig();\n\n const q = useQueryParams();\n const [language] = useLanguage();\n const submodule = q.get(QUERY_PARAMS.SUBMODULE) ?? \"\";\n\n const pageTitle = `${scope ? `${scope}/${name}` : name} ${version}`;\n\n const pageDescription = assemblyResponse?.data?.description ?? \"\";\n\n useEffect(() => {\n void requestMetadata(name, version, scope);\n void requestAssembly(name, version, scope);\n }, [name, requestAssembly, requestMetadata, scope, version]);\n\n useEffect(() => {\n void requestMarkdown(name, version, language, scope, submodule);\n }, [name, scope, version, language, submodule, requestMarkdown]);\n\n // Handle missing JSON for assembly\n if (assemblyResponse.error) {\n return <NotFound />;\n }\n\n const hasError = markdownResponse.error || assemblyResponse.error;\n const hasDocs =\n !markdownResponse.loading &&\n !assemblyResponse.loading &&\n markdownResponse.data &&\n assemblyResponse.data;\n // This will also be true if it cannot be verified (assembly not there)\n const isSupported =\n language === Language.TypeScript ||\n assemblyResponse.loading ||\n assemblyResponse.error ||\n assemblyResponse.data?.targets?.[language.toString()] != null;\n\n return (\n <Page\n meta={{ title: pageTitle, description: pageDescription }}\n pageName=\"packageProfile\"\n >\n <Stack maxW=\"100vw\" pt={4} spacing={4}>\n {/* Operator Area */}\n <Box px={4}>\n <PackageDetails\n assembly={assemblyResponse}\n config={configResponse}\n metadata={metadataResponse}\n version={version}\n />\n </Box>\n {/* Readme and Api Reference Area */}\n {isSupported ? (\n hasError ? (\n <PackageDocsError language={language}></PackageDocsError>\n ) : (\n hasDocs && (\n <PackageDocs\n assembly={assemblyResponse.data!}\n markdown={markdownResponse.data!}\n />\n )\n )\n ) : (\n <PackageDocsUnsupported language={language}></PackageDocsUnsupported>\n )}\n </Stack>\n </Page>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Redirect, useParams } from \"react-router-dom\";\nimport { Packages } from \"../../api/package/packages\";\nimport { getFullPackageName, sanitizeVersion } from \"../../api/package/util\";\nimport { useCatalog } from \"../../contexts/Catalog\";\n\ninterface RouteParams {\n name: string;\n scope?: string;\n}\n\nconst extractMajor = (ver: string) => {\n let sanitized = sanitizeVersion(ver);\n return sanitized.split(\".\")[0];\n};\n\nconst findPackage = (catalog: Packages, pkg: string) => {\n const packages = catalog.packages.filter((p) => p.name === pkg);\n\n if (packages.length === 0) {\n throw new Error(`Package ${pkg} does not exist in catalog`);\n }\n\n if (packages.length > 1) {\n return packages.sort((p1, p2) => {\n const mv1 = extractMajor(p1.version);\n const mv2 = extractMajor(p2.version);\n return mv2.localeCompare(mv1);\n })[0];\n }\n\n return packages[0];\n};\n\nexport const buildRedirectUrl = (\n catalog: Packages,\n name: string,\n scope?: string\n) => {\n const prefix = \"/packages/\";\n const packageName = getFullPackageName(name, scope);\n const version = findPackage(catalog, packageName).version;\n const suffix = `/v/${version}`;\n return `${prefix}${packageName}${suffix}`;\n};\n\nexport const PackageLatest: FunctionComponent = () => {\n const { name, scope }: RouteParams = useParams();\n const catalog = useCatalog();\n\n if (catalog.loading || !catalog.data) {\n return (\n <Center minH=\"200px\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n return <Redirect to={buildRedirectUrl(catalog.data, name, scope)} />;\n};\n","import type { FunctionComponent } from \"react\";\nimport { Switch, Route, useRouteMatch } from \"react-router-dom\";\nimport { NotFound } from \"../NotFound\";\nimport { Package } from \"../Package\";\nimport { PackageLatest } from \"../PackageLatest\";\n\nconst nameRegexp = \"[^@\\\\/]+\";\nconst scopeRegexp = \"@[^\\\\/]+\";\n\nexport const Packages: FunctionComponent = () => {\n const { path } = useRouteMatch();\n\n return (\n <Switch>\n <Route\n exact\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})`}\n >\n <PackageLatest />\n </Route>\n <Route\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})/v/:version`}\n >\n <Package />\n </Route>\n <Route path=\"*\">\n <NotFound />\n </Route>\n </Switch>\n );\n};\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","components/Picture/Picture.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageTag/PackageTag.tsx","components/Time/Time.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/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/util.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","Picture","forwardRef","ref","sources","props","as","map","source","idx","media","srcSet","displayName","LanguageSupportTooltip","language","TEMP_SUPPORTED_LANGUAGES","has","hasArrow","label","LANGUAGE_NAME_MAP","placement","PackageTag","value","zIndex","tagProps","NavLink","to","getSearchPath","query","_hover","textDecoration","Time","date","formatString","format","boxProps","dateTime","toISOString","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","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","replace","Buffer","byteLength","substring","lastIndexOf","join","px","sx","mb","lineHeight","transformImageUri","transformLinkUri","my","display","mr","fontStyle","fontSize","color","maxW","overflowX","variant","href","linkProps","Component","startsWith","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","length","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","getFullPackageName","scope","getAssetsPath","version","prefix","API_PATHS","PACKAGES_PREFIX","body","sanitizeVersion","ver","sanitized","fetchAssembly","assemblyPath","ASSEMBLY_SUFFIX","fetch","response","ok","Error","statusText","json","fetchMarkdown","submodule","docsSuffix","markdownPath","expectedContentType","contentType","headers","get","fetchMetadata","sanitizedVersion","metadataPath","METADATA_SUFFIX","LanguageBar","targetLanguages","selectedLanguage","setSelectedLanguage","spacing","sort","left","right","LANGUAGES","indexOf","isDisabled","isSelected","LangIcon","LANGUAGE_RENDER_MAP","cursor","disabled","height","width","languageSet","Set","LanguageSelection","assembly","useLanguage","updateSaved","updateUrl","setLanguage","targets","Object","keys","Language","TypeScript","filter","target","DependencyDropdown","dependencies","depEntries","entries","Button","leftIcon","rightIcon","ChevronDown","OS_ORG_LINK","LICENSE_LINKS","MIT","LicenseLink","license","ExternalLink","Details","linksConfig","metadata","detailItems","useMemo","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","Boolean","tag","iconButtonProps","iconProps","testIds","createTestIds","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","getCodeSample","PackageDetails","config","loading","data","Card","gap","templateColumns","templateRows","keywords","orientation","minH","NavItem","onOpen","useLocation","pathname","hash","isHashUrl","linkIsActive","defaultIsOpen","showToggle","showChildren","isOpen","LinkComponent","nestedItems","item","ChevronRight","onToggle","pl","textOverflow","whiteSpace","_before","bottom","NavTree","SearchInput","inputRef","onChange","onSubmit","useState","inputValue","setInputValue","useDebounce","Form","Search","e","placeholder","SearchModal","onInputChange","submodules","useHistory","navigate","useCallback","preventDefault","mx","pb","maxH","role","tabIndex","SearchItem","ChooseSubmodule","useQueryParams","allSubmodules","currentSubmodule","QUERY_PARAMS","SUBMODULE","submoduleText","setFilter","getUrl","submoduleName","params","URLSearchParams","toString","set","results","fqn","split","ArrowBack","lang","LANGUAGE","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","isSupported","pt","extractMajor","buildRedirectUrl","catalog","pkg","packages","p1","p2","mv1","localeCompare","findPackage","PackageLatest","useCatalog","nameRegexp","scopeRegexp","Packages","path","useRouteMatch","exact"],"mappings":"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","file":"static/js/6.f37a117e.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 { Box, HTMLChakraProps, forwardRef, Image } from \"@chakra-ui/react\";\n\nexport interface PictureProps extends HTMLChakraProps<\"img\"> {\n alt: string;\n src: string;\n sources?: {\n media?: string;\n srcSet: string;\n }[];\n}\n\nexport const Picture = forwardRef<PictureProps, \"img\">(\n ({ sources, ...props }, ref) => (\n <Box as=\"picture\">\n {sources?.map((source, idx) => (\n <source key={idx} media={source.media} srcSet={source.srcSet} />\n ))}\n <Image ref={ref} {...props} />\n </Box>\n )\n);\n\nPicture.displayName = \"Picture\";\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<LanguageSupportTooltipProps> =\n ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (isSupported) {\n return <>{children}</>;\n }\n\n return (\n <Tooltip\n hasArrow\n label={`Documentation support for ${LANGUAGE_NAME_MAP[language]} is coming soon!`}\n placement=\"top-start\"\n >\n <span>{children}</span>\n </Tooltip>\n );\n };\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Language } from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n language?: Language;\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n language,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ query: `${value}`, language })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport interface TimeOptions {\n date: Date;\n format: string;\n}\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {format(date, formatString)}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","import { 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 { A, Blockquote, Em, P, Pre, Sup } from \"./Text\";\n\nconst ONE_MEGABYTE = 1024 * 1024;\n\nconst components: ReactMarkdownOptions[\"components\"] = {\n a: A,\n blockquote: Blockquote,\n caption: TableCaption,\n code: Code,\n em: Em,\n h1: Headings,\n h2: Headings,\n h3: Headings,\n h4: Headings,\n h5: Headings,\n h6: Headings,\n hr: Hr,\n img: Img,\n li: Li,\n ol: Ol,\n p: P,\n pre: Pre,\n sup: Sup,\n table: Table,\n tbody: Tbody,\n td: Td as TableCellComponent, // The react-markdown component has a tighter signature than the one from @chakra-ui\n tfoot: Tfoot,\n th: Th as TableCellComponent, // The react-markdown component has a tighter signature than the one from @chakra-ui\n thead: Thead,\n tr: Tr,\n ul: Ul,\n};\n\n// see https://github.com/rehypejs/rehype-sanitize#use\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nvar ghSchema = require(\"hast-util-sanitize/lib/github\");\n\n// jsii-docgen adds these attributes to <span> elements embedded inside\n// headings in order to configure custom anchor ids.\n// tell rehype not to strip those out.\nghSchema.attributes.span = (ghSchema.attributes.span ?? []).concat([\n \"dataHeadingTitle\",\n \"dataHeadingId\",\n]);\n\n// Note - the default schema for rehypeSanitize is GitHub-style, which is what we need!\nconst rehypePlugins: PluggableList = [\n [rehypeRaw],\n // ALWAYS keep rehypeSanitize LAST!\n [rehypeSanitize, ghSchema],\n];\nconst remarkPlugins = [remarkGfm, remarkEmoji];\n\nconst GITHUB_REPO_REGEX =\n /^(?:(?:git@)?github\\.com:|(?:https?:\\/\\/)github\\.com\\/)([^/]+)\\/([^/]+)(?:\\.git)?$/;\n\n/**\n * Parses out a GitHub repository owner and repo name from the `repository`\n * configuration of a jsii Assembly.\n *\n * @returns the `owner` and `repo` for the configured repository, if it looks\n * like a GitHub repository URL.\n */\nconst parseGitHubRepository = ({ type, url }: Assembly[\"repository\"]) => {\n if (type !== \"git\") {\n return undefined;\n }\n // git@github.com:<owner>/<repo>.git\n // https://github.com/<owner>/<repo>.git\n const match = GITHUB_REPO_REGEX.exec(url);\n if (match == null) {\n return undefined;\n }\n\n const [, owner, repo] = match;\n return { owner, repo };\n};\n\nexport const Markdown: FunctionComponent<{\n children: string;\n repository: Assembly[\"repository\"];\n}> = ({ children, repository }) => {\n const repoConfig = parseGitHubRepository(repository);\n\n const toAbsoluteUri = (githubPrefix: string, githubSuffix = \"HEAD\") =>\n repoConfig == null\n ? ReactMarkdown.uriTransformer\n : (uri: string) => {\n const url = ReactMarkdown.uriTransformer(uri);\n\n // If this is an anchor or absolute URL, return it.\n const [first] = url;\n if (first === \"#\" || first === \"/\") {\n return url;\n }\n\n // If there is a protocol element, then return the URL as-is.\n if (url.includes(\"://\")) {\n return url;\n }\n\n const owner = repoConfig.owner;\n const repo = repoConfig.repo.replace(/\\.git$/, \"\");\n return `https://${githubPrefix}/${owner}/${repo}/${githubSuffix}/${url}`;\n };\n\n const byteLength = Buffer.byteLength(children);\n if (byteLength > ONE_MEGABYTE) {\n children = children.substring(0, children.lastIndexOf(\"# API Reference\"));\n children = [\n children,\n \"# API Reference\",\n \"The API Reference for this package could not be rendered.\",\n \"If this issue persists, please let us know by creating an [issue](https://github.com/cdklabs/construct-hub-webapp/issues/new)\",\n ].join(\"\\n\");\n }\n return (\n <Box\n px={8}\n sx={{\n \"& > *\": { mb: 8 },\n \"& > p\": { lineHeight: \"taller\" },\n }}\n >\n <ReactMarkdown\n components={components}\n rehypePlugins={rehypePlugins}\n remarkPlugins={remarkPlugins}\n transformImageUri={toAbsoluteUri(\"raw.githubusercontent.com\")}\n transformLinkUri={toAbsoluteUri(\"github.com\", \"blob/HEAD\")}\n >\n {children}\n </ReactMarkdown>\n </Box>\n );\n};\n","import { 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 { 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 { API_PATHS } from \"../../constants/url\";\n\nexport const getFullPackageName = (name: string, scope?: string) => {\n return scope ? `${scope}/${name}` : name;\n};\n\nexport const getAssetsPath = (\n name: string,\n version: string,\n scope?: string\n) => {\n const prefix = `${API_PATHS.PACKAGES_PREFIX}/`;\n const body = getFullPackageName(name, scope);\n const suffix = `/v${version}`;\n return `${prefix}${body}${suffix}`;\n};\n\nexport const sanitizeVersion = (ver: string) => {\n let sanitized = ver;\n if (sanitized.startsWith(\"~\") || sanitized.startsWith(\"^\")) {\n sanitized = sanitized.substring(1);\n }\n return sanitized;\n};\n","import * as spec from \"@jsii/spec\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\n/**\n * Fetch assembly of a specific package from the backend.\n */\nexport const fetchAssembly = async (\n name: string,\n version: string,\n scope?: string\n): Promise<spec.Assembly> => {\n const assemblyPath = `${getAssetsPath(name, version, scope)}${\n API_PATHS.ASSEMBLY_SUFFIX\n }`;\n const response = await fetch(assemblyPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching assembly for ${assemblyPath}: ${response.statusText}`\n );\n }\n return response.json();\n};\n","import { getAssetsPath } from \"./util\";\n\n/**\n * Fetch markdown docs of a specific package from the backend.\n */\nexport const fetchMarkdown = async (\n name: string,\n version: string,\n language: string,\n scope?: string,\n submodule?: string\n): Promise<string> => {\n const docsSuffix = `/docs-${submodule ? `${submodule}-` : \"\"}${language}.md`;\n\n const markdownPath = `${getAssetsPath(name, version, scope)}${docsSuffix}`;\n const response = await fetch(markdownPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching documentation for ${markdownPath}: ${response.statusText}`\n );\n }\n\n // since CloudFront returns a 200 /index.html for missing documents,\n // we assert the expected docs content type to detect these errors.\n // TODO: switch to proper 404 responses in this case (requires backend changes)\n const expectedContentType = \"text/markdown\";\n const contentType = response.headers.get(\"Content-Type\");\n\n // we check 'includes' and not 'equal' because the content type contains\n // charset as well (e.g text/markdown; charset=UTF-8)\n if (!contentType || !contentType.includes(expectedContentType)) {\n throw new Error(\n `Invalid content type: ${contentType}. Expected ${expectedContentType}\"`\n );\n }\n return response.text();\n};\n","import { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\nexport interface Metadata {\n date: string;\n links?: {\n npm: string;\n };\n packageLinks?: {\n [key: string]: string;\n };\n}\n\n/**\n * Fetch metadata of a specific package from the backend.\n */\nexport const fetchMetadata = async (\n name: string,\n version: string,\n scope?: string\n): Promise<Metadata> => {\n let sanitizedVersion = version;\n\n if (sanitizedVersion.startsWith(\"^\")) {\n sanitizedVersion = sanitizedVersion.substring(1, sanitizedVersion.length);\n }\n\n const metadataPath = `${getAssetsPath(name, version, scope)}${\n API_PATHS.METADATA_SUFFIX\n }`;\n const response = await fetch(metadataPath);\n\n if (!response.ok) {\n throw new Error(\n `Failed fetching metadata for ${metadataPath}: ${response.statusText}`\n );\n }\n\n return response.json();\n};\n","import { IconButton, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n TEMP_SUPPORTED_LANGUAGES,\n LANGUAGE_RENDER_MAP,\n LANGUAGES,\n} from \"../../constants/languages\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nexport interface LanguageBarProps {\n targetLanguages: readonly Language[];\n selectedLanguage: Language;\n setSelectedLanguage: (lang: Language) => void;\n}\n\nexport const LanguageBar: FunctionComponent<LanguageBarProps> = ({\n targetLanguages,\n selectedLanguage,\n setSelectedLanguage,\n}) => {\n return (\n <Stack\n align=\"center\"\n data-testid=\"language-bar\"\n direction=\"row\"\n spacing={2}\n >\n {[...targetLanguages]\n .sort(\n (left, right) => LANGUAGES.indexOf(left) - LANGUAGES.indexOf(right)\n )\n .map((language: Language) => {\n const isDisabled = !TEMP_SUPPORTED_LANGUAGES.has(language);\n const isSelected = language === selectedLanguage;\n\n const { icon: LangIcon } = LANGUAGE_RENDER_MAP[language];\n\n const onClick = () => {\n if (isSelected) return;\n setSelectedLanguage(language);\n };\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n <IconButton\n aria-label={`Select ${language} icon`}\n border={isSelected ? \"1px solid\" : \"none\"}\n borderColor=\"blue.500\"\n borderRadius=\"lg\"\n boxShadow=\"base\"\n colorScheme=\"blue\"\n cursor={isDisabled ? \"not-allowed\" : \"pointer\"}\n data-testid={`language-${language}`}\n disabled={isDisabled}\n icon={\n <LangIcon\n aria-label={`${language}-icon`}\n borderRadius=\"sm\"\n height={[4, 5, 6]}\n width={[4, 5, 6]}\n />\n }\n onClick={onClick}\n p={1}\n variant=\"outline\"\n w=\"max-content\"\n />\n </LanguageSupportTooltip>\n );\n })}\n </Stack>\n );\n};\n","import type { Assembly } from \"@jsii/spec\";\nimport type { FunctionComponent } from \"react\";\nimport { LanguageBar } from \"../../../../components/LanguageBar\";\nimport { Language, LANGUAGES } from \"../../../../constants/languages\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\nexport interface LanguageSelectionProps {\n assembly: Assembly;\n}\n\nconst languageSet = new Set(LANGUAGES);\n\nexport const LanguageSelection: FunctionComponent<LanguageSelectionProps> = ({\n assembly,\n}) => {\n const [language, setLanguage] = useLanguage({\n updateSaved: true,\n updateUrl: true,\n });\n const targets = [\n ...Object.keys(assembly?.targets ?? {}),\n // typescript is the source language and hence always supported.\n // (it doesn't appear in spec.targets)\n Language.TypeScript,\n ] as Language[];\n\n return (\n <LanguageBar\n selectedLanguage={targets.includes(language) ? language : targets[0]}\n setSelectedLanguage={setLanguage}\n targetLanguages={targets.filter((target) => languageSet.has(target))}\n />\n );\n};\n","import { ChevronDownIcon, LinkIcon } from \"@chakra-ui/icons\";\nimport { Menu, MenuButton, Button, MenuItem, MenuList } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { sanitizeVersion } from \"../../../../api/package/util\";\nimport { NavLink } from \"../../../../components/NavLink\";\n\nexport interface DependencyDropdownProps {\n dependencies: {\n /**\n * Key is a dep name, value is a version\n */\n [key: string]: string;\n };\n}\n\nexport const DependencyDropdown: FunctionComponent<DependencyDropdownProps> = ({\n dependencies,\n}) => {\n const depEntries = Object.entries(dependencies);\n\n if (!depEntries.length) return null;\n\n return (\n <Menu>\n <MenuButton\n as={Button}\n color=\"blue.500\"\n leftIcon={<LinkIcon />}\n rightIcon={<ChevronDownIcon h={6} w={6} />}\n size=\"md\"\n variant=\"outline\"\n >\n Dependencies\n </MenuButton>\n <MenuList>\n {depEntries.map(([name, version]) => (\n <MenuItem key={`${name}/${version}`} p={0}>\n <NavLink\n h=\"100%\"\n p={2}\n to={`/packages/${name}/v/${sanitizeVersion(version)}`}\n w=\"100%\"\n >\n {`${name} - ${version}`}\n </NavLink>\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n );\n};\n","const OS_ORG_LINK = \"https://opensource.org/licenses\";\n\nexport const LICENSE_LINKS = {\n \"Apache-2.0\": `${OS_ORG_LINK}/apache2.0.php`,\n \"BSD-2-Clause\": `${OS_ORG_LINK}/bsd-license.php`,\n MIT: `${OS_ORG_LINK}/mit-license.php`,\n} as const;\n","import { forwardRef } from \"@chakra-ui/react\";\nimport { ExternalLink, ExternalLinkProps } from \"../ExternalLink\";\nimport { LICENSE_LINKS } from \"./constants\";\n\nexport interface LicenseLinkOptions {\n license: keyof typeof LICENSE_LINKS;\n}\n\nexport interface LicenseLinkProps\n extends ExternalLinkProps,\n LicenseLinkOptions {}\n\nexport const LicenseLink = forwardRef<LicenseLinkProps, \"a\">(\n ({ license, ...linkProps }, ref) => {\n const url = LICENSE_LINKS[license];\n\n return (\n <ExternalLink href={url} ref={ref} {...linkProps}>\n {license}\n </ExternalLink>\n );\n }\n);\n\nLicenseLink.displayName = \"LicenseLink\";\n","import { Box, ListItem, Text, UnorderedList } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { ReactNode, useMemo } from \"react\";\nimport type { PackageLinksConfig } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { ExternalLink } from \"../../../../components/ExternalLink\";\nimport { LicenseLink, LICENSE_LINKS } from \"../../../../components/LicenseLink\";\nimport { Time } from \"../../../../components/Time\";\nimport { getRepoUrlAndHost } from \"../../../../util/url\";\n\nexport interface DetailsProps {\n assembly?: Assembly;\n linksConfig?: PackageLinksConfig[];\n metadata: Metadata;\n}\n\nexport const Details = ({ assembly, linksConfig, metadata }: DetailsProps) => {\n const detailItems = useMemo(() => {\n if (!metadata) return [];\n\n const { date, links } = metadata;\n const username = assembly?.author.name;\n const authorUrl = assembly?.author.url;\n const repository = assembly?.repository;\n const license = assembly?.license;\n // https://www.npmjs.com/package/aws-cdk/v/1.113.0\n const registry =\n links?.npm ??\n `https://www.npmjs.com/package/${assembly?.name}/v/${assembly?.version}`;\n\n const items = [];\n\n if (date) {\n const publishDate = (\n <Time date={new Date(date)} fontWeight=\"bold\" format=\"MMMM dd, yyyy\" />\n );\n items.push(<>Published: {publishDate}</>);\n }\n\n if (username) {\n const author = authorUrl ? (\n <ExternalLink href={authorUrl}>{username}</ExternalLink>\n ) : (\n <Box as=\"strong\" fontWeight=\"bold\">\n {username}\n </Box>\n );\n items.push(<>Author: {author}</>);\n }\n\n // Prioritize custom links when available\n if (linksConfig?.length) {\n linksConfig.forEach(({ name, value, displayText }) => {\n const target = (metadata?.packageLinks ?? {})[value];\n if (target) {\n const link = (\n <ExternalLink href={target}>{displayText ?? target}</ExternalLink>\n );\n items.push(\n <>\n {name}: {link}\n </>\n );\n }\n });\n }\n\n if (repository) {\n const repo = getRepoUrlAndHost(repository.url);\n\n if (repo) {\n const repoLink = (\n <ExternalLink href={repo.url}>{repo.hostname}</ExternalLink>\n );\n items.push(<>Repository: {repoLink}</>);\n }\n }\n\n if (license && license in LICENSE_LINKS) {\n const licenseLink = (\n <LicenseLink license={license as keyof typeof LICENSE_LINKS} />\n );\n items.push(<>License: {licenseLink}</>);\n }\n\n if (registry) {\n const registryLink = (\n <ExternalLink href={registry}>\n {new URL(registry).hostname}\n </ExternalLink>\n );\n items.push(<>Registry: {registryLink}</>);\n }\n\n return items.slice(0, 5).map((detail: string | ReactNode, i: number) => (\n <ListItem key={`detail-${i}`} listStyleType=\"none\" my={1}>\n <Text color=\"gray.600\">{detail}</Text>\n </ListItem>\n ));\n }, [metadata, assembly, linksConfig]);\n return <UnorderedList ml={0}>{detailItems}</UnorderedList>;\n};\n","import { Box, Flex, Link } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent } from \"react\";\nimport { PackageLinksConfig } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { DependencyDropdown } from \"../DependencyDropdown\";\nimport { Details } from \"./Details\";\n\nexport interface OperatorAreaProps {\n assembly?: Assembly;\n linksConfig?: PackageLinksConfig[];\n metadata: Metadata;\n}\n\nexport const OperatorArea: FunctionComponent<OperatorAreaProps> = ({\n assembly,\n linksConfig,\n metadata,\n}) => {\n return (\n <Flex direction=\"column\" textAlign={{ base: \"center\", md: \"initial\" }}>\n <Link\n color=\"blue.500\"\n fontSize=\"sm\"\n href={`mailto:abuse@amazonaws.com?subject=${encodeURIComponent(\n `ConstructHub - Report of abusive package: ${assembly?.name}`\n )}`}\n m={2}\n textAlign={{ base: \"center\", md: \"right\" }}\n >\n Report this Package\n </Link>\n <Details\n assembly={assembly}\n linksConfig={linksConfig}\n metadata={metadata}\n />\n {assembly?.dependencies && (\n <Box mt={4}>\n <DependencyDropdown dependencies={assembly.dependencies} />\n </Box>\n )}\n </Flex>\n );\n};\n","import { Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { PackageTag } from \"../../../../components/PackageTag\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\nexport interface PackageHeaderProps {\n title: string;\n description: string;\n tags: string[];\n version: string;\n}\n\nexport const PackageHeader: FunctionComponent<PackageHeaderProps> = ({\n description,\n tags,\n title,\n version,\n}) => {\n const [currentLanguage] = useLanguage();\n return (\n <Flex\n direction=\"column\"\n maxWidth=\"100%\"\n overflowX=\"hidden\"\n p={2}\n textAlign={{ base: \"center\", md: \"initial\" }}\n >\n <Stack\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n justify={{ base: \"center\", md: \"start\" }}\n mb={4}\n spacing={4}\n >\n <Heading wordBreak=\"break-word\">{title}</Heading>\n <Text color=\"blue.500\" fontSize=\"md\">\n {version}\n </Text>\n </Stack>\n\n <Text wordBreak=\"break-word\">{description}</Text>\n {!!tags.length && (\n <Flex\n direction=\"row\"\n justify={{ base: \"center\", md: \"initial\" }}\n mt={3}\n >\n {title.startsWith(\"@aws-cdk/\") ? (\n <PackageTag\n key=\"official\"\n label=\"official\"\n language={currentLanguage}\n mr={2}\n value=\"@aws-cdk\"\n variant=\"official\"\n >\n Official\n </PackageTag>\n ) : null}\n {tags\n .filter(Boolean)\n .slice(0, 3)\n .map((tag) => (\n <PackageTag\n key={tag}\n language={currentLanguage}\n mr={2}\n value={tag}\n >\n {tag}\n </PackageTag>\n ))}\n </Flex>\n )}\n </Flex>\n );\n};\n","import { CheckIcon, CloseIcon, CopyIcon } from \"@chakra-ui/icons\";\nimport {\n Code,\n Flex,\n IconButton,\n Popover,\n PopoverBody,\n PopoverContent,\n PopoverHeader,\n PopoverTrigger,\n Text,\n useClipboard,\n useDisclosure,\n useMediaQuery,\n useToken,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent, ReactNode, useRef } from \"react\";\nimport { createTestIds } from \"../../util/createTestIds\";\n\nconst iconButtonProps = {\n borderRadius: \"md\",\n color: \"white\",\n variant: \"link\",\n};\n\nconst iconProps = {\n h: 4,\n w: 4,\n};\n\nexport const testIds = createTestIds(\"code-popover\", [\n \"close\",\n \"content\",\n \"code\",\n \"copy\",\n \"header\",\n \"trigger\",\n] as const);\n\nexport interface CodePopoverProps {\n code: string;\n header: string;\n trigger: ReactNode;\n}\n\nexport const CodePopover: FunctionComponent<CodePopoverProps> = ({\n code,\n header,\n trigger,\n}) => {\n const { hasCopied, onCopy } = useClipboard(code);\n const disclosure = useDisclosure();\n const focusRef = useRef<HTMLButtonElement>(null);\n const mdBreakpoint = useToken(\"breakpoints\", \"md\");\n const [isMd] = useMediaQuery(`(min-width: ${mdBreakpoint})`);\n\n return (\n <Popover\n initialFocusRef={focusRef}\n isLazy\n placement={isMd ? \"bottom-end\" : \"bottom\"}\n {...disclosure}\n >\n <PopoverTrigger>{trigger}</PopoverTrigger>\n <PopoverContent bg=\"blue.500\" data-testid={testIds.content}>\n <PopoverHeader\n align=\"center\"\n as={Flex}\n color=\"white\"\n data-testid={testIds.header}\n justify=\"space-between\"\n pr={0}\n >\n <Text>{header}</Text>\n <Flex align=\"center\">\n <IconButton\n aria-label=\"copy-text-icon\"\n data-testid={testIds.copy}\n icon={\n hasCopied ? (\n <CheckIcon {...iconProps} color=\"green.200\" />\n ) : (\n <CopyIcon {...iconProps} />\n )\n }\n onClick={onCopy}\n ref={focusRef}\n {...iconButtonProps}\n />\n <IconButton\n aria-label=\"close-icon\"\n data-testid={testIds.close}\n icon={<CloseIcon h={3} w={3} />}\n onClick={disclosure.onClose}\n {...iconButtonProps}\n />\n </Flex>\n </PopoverHeader>\n <PopoverBody\n as={Code}\n bg=\"gray.100\"\n borderTopLeftRadius=\"0\"\n borderTopRightRadius=\"0\"\n color=\"gray.800\"\n data-testid={testIds.code}\n overflow=\"auto\"\n variant=\"code-block\"\n >\n {code}\n </PopoverBody>\n </PopoverContent>\n </Popover>\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport { Button, ButtonProps, forwardRef } from \"@chakra-ui/react\";\nimport { testIds } from \"./CodePopover\";\n\nexport interface CodePopoverTriggerProps extends ButtonProps {}\n\n/**\n * A default trigger button for the code popover\n */\nexport const CodePopoverTrigger = forwardRef<CodePopoverTriggerProps, \"button\">(\n (props, ref) => (\n <Button\n color=\"white\"\n colorScheme=\"blue\"\n data-testid={testIds.trigger}\n ref={ref}\n rightIcon={<ChevronDownIcon h={5} w={5} />}\n {...props}\n >\n {props.children}\n </Button>\n )\n);\n\nCodePopoverTrigger.displayName = \"CodePopoverTrigger\";\n","import type { Assembly } from \"@jsii/spec\";\nimport type { FunctionComponent } from \"react\";\nimport {\n CodePopover,\n CodePopoverTrigger,\n} from \"../../../../components/CodePopover\";\nimport { LANGUAGE_NAME_MAP, Language } from \"../../../../constants/languages\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\n// TODO: We'll probably want to get this from BE as we add more languages, however this should do the trick for now...\nconst getCodeSample = ({\n language,\n assembly,\n}: {\n language: Language;\n assembly: Assembly;\n}): string | undefined => {\n const version = assembly.version;\n if (language === Language.TypeScript) {\n const packageName = assembly.name;\n return `npm install ${packageName}@${version}`;\n } else if (language === Language.Python) {\n const packageName = assembly.targets?.python?.distName;\n if (!packageName) {\n return undefined;\n }\n return `pip install ${packageName}==${version}`;\n }\n\n return undefined;\n};\n\nexport interface UseConstructProps {\n assembly: Assembly;\n}\n\nexport const UseConstruct: FunctionComponent<UseConstructProps> = ({\n assembly,\n}) => {\n const [language] = useLanguage();\n\n const header = LANGUAGE_NAME_MAP[language];\n const code = getCodeSample({ language, assembly });\n\n const isDisabled = !code;\n const label = !isDisabled ? \"Install\" : \"Unsupported\";\n\n const trigger = (\n <CodePopoverTrigger disabled={isDisabled}>{label}</CodePopoverTrigger>\n );\n\n return <CodePopover code={code ?? \"\"} header={header} trigger={trigger} />;\n};\n","import { Center, Divider, Flex, Grid, Spinner, Stack } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent } from \"react\";\nimport { Config } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { Card } from \"../../../../components/Card\";\nimport type { UseRequestResponse } from \"../../../../hooks/useRequest\";\nimport { LanguageSelection } from \"../LanguageSelection\";\nimport { OperatorArea } from \"../OperatorArea\";\nimport { PackageHeader } from \"../PackageHeader\";\nimport { UseConstruct } from \"../UseConstruct\";\n\ninterface PackageDetailsProps {\n config: UseRequestResponse<Config>;\n assembly: UseRequestResponse<Assembly>;\n metadata: UseRequestResponse<Metadata>;\n version: string;\n}\n\n/**\n * Renders the header section of a package. This includes\n * the Getting Started, Operator Area, and Publisher Area sections\n */\nexport const PackageDetails: FunctionComponent<PackageDetailsProps> = ({\n assembly,\n config,\n metadata,\n version,\n}) => {\n const isLoading = assembly.loading || metadata.loading;\n\n if (isLoading || !assembly.data || !metadata.data) {\n return (\n <Center minH=\"200px\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n return (\n <Flex as={Card} direction=\"column\">\n <Grid\n gap={4}\n overflow=\"hidden\"\n templateColumns={{ base: \"1fr\", md: \"3fr auto 2fr\" }}\n templateRows=\"auto\"\n >\n <PackageHeader\n description={assembly.data.description}\n tags={assembly.data.keywords ?? []}\n title={assembly.data.name}\n version={version}\n />\n <Divider\n display={{ base: \"none\", md: \"initial\" }}\n orientation=\"vertical\"\n />\n <Divider\n display={{ base: \"initial\", md: \"none\" }}\n orientation=\"horizontal\"\n />\n {config.loading ? (\n <Center minH=\"200px\">\n <Spinner size=\"xl\" />\n </Center>\n ) : (\n <OperatorArea\n assembly={assembly.data}\n linksConfig={config.data?.packageLinks}\n metadata={metadata.data}\n />\n )}\n </Grid>\n <Stack\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n justify={{ base: \"center\", md: \"space-between\" }}\n px={2}\n py={4}\n spacing={4}\n >\n <LanguageSelection assembly={assembly.data} />\n <UseConstruct assembly={assembly.data} />\n </Stack>\n </Flex>\n );\n};\n","import { ChevronDownIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Box, Flex, Link, IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport { FunctionComponent, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface NavItemConfig {\n children?: NavItemConfig[];\n display: string;\n url: string;\n}\n\nexport interface NavItemProps extends NavItemConfig {\n // The following props don't need to be explicitly defined - they are passed internally\n onOpen?: () => void;\n}\n\nexport interface NavTreeProps {\n /**\n * Items to render\n */\n items: NavItemConfig[];\n}\n\nconst iconProps = {\n color: \"gray.900\",\n h: 4,\n w: 4,\n};\n\nexport const NavItem: FunctionComponent<NavItemProps> = ({\n children,\n display,\n url,\n onOpen,\n}) => {\n const { pathname, hash } = useLocation();\n const isHashUrl = url.startsWith(\"#\");\n const linkIsActive = isHashUrl ? hash === url : pathname === url;\n const disclosure = useDisclosure({ onOpen, defaultIsOpen: true });\n\n const showToggle = (children?.length ?? 0) > 0;\n const showChildren = disclosure.isOpen && showToggle;\n\n const LinkComponent = isHashUrl ? Link : NavLink;\n\n const nestedItems = useMemo(\n () =>\n children?.map((item, idx) => {\n return <NavItem {...item} key={idx} onOpen={disclosure.onOpen} />;\n }),\n [children, disclosure.onOpen]\n );\n\n return (\n <Flex direction=\"column\">\n <Flex align=\"center\" color={linkIsActive ? \"blue.500\" : \"gray.800\"}>\n {showToggle && (\n <IconButton\n aria-label=\"expand-toggle\"\n borderRadius=\"md\"\n h={4}\n icon={\n disclosure.isOpen ? (\n <ChevronDownIcon {...iconProps} />\n ) : (\n <ChevronRightIcon {...iconProps} />\n )\n }\n ml={-1}\n onClick={disclosure.onToggle}\n size=\"xs\"\n variant=\"link\"\n w={4}\n />\n )}\n <LinkComponent\n _hover={{ bg: \"rgba(0, 124, 253, 0.05)\" }}\n href={url}\n overflow=\"hidden\"\n pl={showToggle ? 1 : 2}\n py={1.5}\n textOverflow=\"ellipsis\"\n title={display}\n to={url}\n w=\"100%\"\n whiteSpace=\"nowrap\"\n >\n {display}\n </LinkComponent>\n </Flex>\n <Box\n _before={{\n // Creates a border without taking up any box space\n // This is important to keep items perfectly aligned\n bg: \"gray.100\",\n bottom: 0,\n content: `\"\"`,\n left: 0,\n position: \"absolute\",\n top: 0,\n w: \"1px\",\n }}\n display={showChildren ? \"initial\" : \"none\"}\n ml={2}\n pl={2}\n position=\"relative\"\n >\n {nestedItems}\n </Box>\n </Flex>\n );\n};\n\nexport const NavTree: FunctionComponent<NavTreeProps> = ({ items }) => {\n return (\n <Flex direction=\"column\" maxWidth=\"100%\">\n {items.map((item, idx) => {\n return <NavItem {...item} key={idx} onOpen={undefined} />;\n })}\n </Flex>\n );\n};\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport {\n InputGroup,\n InputLeftElement,\n Input,\n forwardRef,\n} from \"@chakra-ui/react\";\nimport { FormEventHandler, useState } from \"react\";\nimport { Form } from \"../../../../components/Form\";\nimport { useDebounce } from \"../../../../hooks/useDebounce\";\n\nexport interface SearchInputProps {\n value: string;\n onChange: (s: string) => void;\n onSubmit: FormEventHandler<HTMLFormElement>;\n}\n\nexport const SearchInput = forwardRef<SearchInputProps, \"input\">(\n ({ value, onChange, onSubmit }, inputRef) => {\n const [inputValue, setInputValue] = useState(value);\n\n useDebounce(inputValue, { onChange });\n\n return (\n <Form data-testid=\"choose-submodule-search-form\" onSubmit={onSubmit}>\n <InputGroup>\n <InputLeftElement>\n <SearchIcon color=\"gray.400\" />\n </InputLeftElement>\n <Input\n data-testid=\"choose-submodule-search-input\"\n onChange={(e) => setInputValue(e.target.value)}\n placeholder=\"Search\"\n ref={inputRef}\n value={inputValue}\n variant=\"filled\"\n />\n </InputGroup>\n </Form>\n );\n }\n);\n\nSearchInput.displayName = \"SearchInput\";\n","import {\n Box,\n Divider,\n Modal,\n ModalHeader,\n ModalContent,\n ModalCloseButton,\n ModalBody,\n ModalOverlay,\n UnorderedList,\n} from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n useCallback,\n useRef,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { SearchItem } from \"../../../../components/SearchItem\";\nimport { SearchInput } from \"./SearchInput\";\n\nexport interface SearchModalProps {\n inputValue: string;\n isOpen: boolean;\n onClose: () => void;\n onInputChange: (s: string) => void;\n submodules: { name: string; to: string }[];\n}\n\nexport const SearchModal: FunctionComponent<SearchModalProps> = ({\n inputValue,\n isOpen,\n onClose,\n onInputChange,\n submodules,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { push } = useHistory();\n\n const navigate = useCallback(\n (to: string) => {\n onClose();\n push(to);\n },\n [onClose, push]\n );\n\n const onSubmit = useCallback<FormEventHandler<HTMLFormElement>>(\n (e) => {\n e.preventDefault();\n\n if (!submodules.length) return;\n const { to } = submodules[0];\n navigate(to);\n },\n [navigate, submodules]\n );\n\n return (\n <Modal initialFocusRef={inputRef} isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent mx={4}>\n <ModalCloseButton data-testid=\"choose-submodule-modal-close\" />\n <ModalHeader\n data-testid=\"choose-submodule-modal-header\"\n fontSize=\"lg\"\n fontWeight=\"bold\"\n >\n Choose a submodule\n </ModalHeader>\n <ModalBody data-testid=\"choose-submodule-modal-body\" p={0}>\n <Box pb={4} px={4}>\n <SearchInput\n onChange={onInputChange}\n onSubmit={onSubmit}\n ref={inputRef}\n value={inputValue}\n />\n </Box>\n <Divider />\n <UnorderedList\n data-testid=\"choose-submodule-modal-results\"\n m={0}\n maxH=\"50vh\"\n overflow=\"hidden auto\"\n p={0}\n role=\"listbox\"\n tabIndex={-1}\n >\n {submodules.map(({ name, to }) => (\n <SearchItem\n data-testid=\"choose-submodule-result\"\n key={name}\n name={name}\n onClick={() => navigate(to)}\n />\n ))}\n </UnorderedList>\n </ModalBody>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n );\n};\n","import { ArrowBackIcon, ChevronDownIcon } from \"@chakra-ui/icons\";\nimport { Button, Divider, Stack, useDisclosure } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent, useCallback, useMemo, useState } from \"react\";\nimport { useHistory, useLocation } from \"react-router-dom\";\nimport { QUERY_PARAMS } from \"../../../../constants/url\";\nimport { useQueryParams } from \"../../../../hooks/useQueryParams\";\nimport { SearchModal } from \"./SearchModal\";\n\nexport interface ChooseSubmoduleProps {\n assembly?: Assembly;\n}\n\nexport const ChooseSubmodule: FunctionComponent<ChooseSubmoduleProps> = ({\n assembly,\n}) => {\n const { pathname } = useLocation();\n const { push } = useHistory();\n const query = useQueryParams();\n\n const allSubmodules = Object.keys(assembly?.submodules ?? {});\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n const currentSubmodule = query.get(QUERY_PARAMS.SUBMODULE);\n const submoduleText = currentSubmodule\n ? `Submodule: ${currentSubmodule}`\n : \"Choose Submodule\";\n\n const [filter, setFilter] = useState(\"\");\n\n const onGoBack = () => {\n const lang = query.get(QUERY_PARAMS.LANGUAGE);\n push(`${pathname}${lang ? `?${QUERY_PARAMS.LANGUAGE}=${lang}` : \"\"}`);\n };\n\n const getUrl = useCallback(\n (submoduleName: string) => {\n const params = new URLSearchParams(query.toString());\n params.set(\"submodule\", submoduleName);\n return `${pathname}?${params}`;\n },\n [pathname, query]\n );\n\n const submodules = useMemo(() => {\n let results = allSubmodules;\n\n if (filter) {\n results = results.filter((fqn) =>\n fqn.toLowerCase().includes(filter.toLowerCase())\n );\n }\n\n return results.map((fqn) => {\n const name = fqn.split(\".\")[1];\n return {\n name,\n to: getUrl(name),\n };\n });\n }, [allSubmodules, filter, getUrl]);\n\n if (allSubmodules.length === 0) {\n return null;\n }\n\n return (\n <Stack spacing={4} w=\"100%\">\n {currentSubmodule && (\n <>\n <Button\n borderRadius=\"none\"\n data-testid=\"choose-submodule-go-back\"\n leftIcon={<ArrowBackIcon aria-label=\"Back to construct root\" />}\n onClick={onGoBack}\n title=\"Back to construct root\"\n variant=\"link\"\n >\n {assembly?.name}\n </Button>\n <Divider />\n </>\n )}\n <Button\n borderRadius=\"none\"\n color=\"blue.500\"\n data-testid=\"choose-submodule-search-trigger\"\n flexGrow={1}\n onClick={onOpen}\n rightIcon={<ChevronDownIcon />}\n title=\"Choose Submodule\"\n variant=\"link\"\n >\n {submoduleText}\n </Button>\n <SearchModal\n inputValue={filter}\n isOpen={isOpen}\n onClose={onClose}\n onInputChange={setFilter}\n submodules={submodules}\n />\n </Stack>\n );\n};\n","import { Box, Flex, Grid } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { useState, useEffect, FunctionComponent, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { Markdown } from \"../../../../components/Markdown\";\nimport { NavTree, NavItemConfig } from \"../../../../components/NavTree\";\nimport { ChooseSubmodule } from \"../ChooseSubmodule\";\n\nexport interface PackageDocsProps {\n markdown: string;\n assembly: Assembly;\n}\n\ntype Item = NavItemConfig & { level: number; children: Item[] };\n\nexport const appendItem = (itemTree: Item[], item: Element): Item[] => {\n if (!(item instanceof HTMLElement)) {\n return itemTree;\n }\n\n const { headingId, headingLevel = \"100\" } = item.dataset;\n const { innerText } = item;\n const level = parseInt(headingLevel);\n\n // Don't create nav items for items with no title / url\n if (level > 3 || !innerText || !headingId) {\n return itemTree;\n }\n\n const last = itemTree[itemTree.length - 1];\n\n if (last == null || last.level >= level) {\n return [\n ...itemTree,\n {\n display: innerText,\n url: `#${headingId}`,\n level,\n children: [],\n },\n ];\n } else {\n last.children = appendItem(last.children, item);\n return itemTree;\n }\n};\n\n// We want the nav to be sticky, but it should account for the sticky heading as well, which is 72px\nconst TOP_OFFSET = \"72px\";\n\nexport const PackageDocs: FunctionComponent<PackageDocsProps> = ({\n markdown: source,\n assembly,\n}) => {\n const [navItems, setNavItems] = useState<Item[]>([]);\n\n useEffect(() => {\n const tree = [\n ...document.querySelectorAll(\n `[data-heading-id][data-heading-title][data-heading-level]`\n ),\n ].reduce(appendItem, []);\n\n setNavItems(tree);\n }, [source]);\n\n const { hash } = useLocation();\n useEffect(() => {\n if (hash) {\n const target = document.querySelector(`${hash}`) as HTMLElement;\n target?.scrollIntoView(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [source]);\n\n const markdown = useMemo(\n () => <Markdown repository={assembly.repository}>{source}</Markdown>,\n [assembly.repository, source]\n );\n\n return (\n <Grid\n bg=\"white\"\n columnGap={4}\n h=\"100%\"\n templateColumns={{ base: \"1fr\", md: \"1fr 3fr\" }}\n width=\"100%\"\n >\n <Flex\n alignSelf=\"stretch\"\n borderRight=\"1px solid\"\n borderRightColor=\"blue.50\"\n direction=\"column\"\n display={{ base: \"none\", md: \"flex\" }}\n maxHeight={`calc(100vh - ${TOP_OFFSET})`}\n overflow=\"hidden auto\"\n position=\"sticky\"\n px={4}\n top={TOP_OFFSET}\n >\n {Object.keys(assembly?.submodules ?? {}).length > 0 && (\n <Flex\n borderBottom=\"1px solid\"\n borderColor=\"blue.50\"\n justify=\"center\"\n py={4}\n >\n <ChooseSubmodule assembly={assembly} />\n </Flex>\n )}\n <Box overflowY=\"auto\" py={4}>\n <NavTree items={navItems} />\n </Box>\n </Flex>\n <Box\n h=\"max-content\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n py={4}\n sx={{\n a: {\n scrollMarginTop: TOP_OFFSET,\n },\n }}\n >\n {markdown}\n </Box>\n </Grid>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../../../../components/ExternalLink\";\nimport { Language } from \"../../../../constants/languages\";\n\nexport interface PackageDocsErrorProps {\n readonly language: Language;\n}\n\nexport const PackageDocsError: FunctionComponent<PackageDocsErrorProps> = ({\n language,\n}) => {\n const issueLink = (\n <ExternalLink href=\"https://github.com/cdklabs/construct-hub-webapp/issues/new\">\n issue\n </ExternalLink>\n );\n return (\n <Text\n align=\"center\"\n fontSize=\"xl\"\n fontStyle=\"oblique\"\n px={4}\n wordBreak=\"break-word\"\n >\n Documentation in {language} is still not ready for this package. Come back\n soon. If this issue persists, please let us know by creating an{\" \"}\n {issueLink}.\n </Text>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Language, LANGUAGE_NAME_MAP } from \"../../../../constants/languages\";\n\nexport interface PackageDocsUnsupportedProps {\n readonly language: Language;\n}\n\nexport const PackageDocsUnsupported: FunctionComponent<PackageDocsUnsupportedProps> =\n ({ language }) => {\n const languageName = LANGUAGE_NAME_MAP[language];\n return (\n <Text\n align=\"center\"\n fontSize=\"xl\"\n fontStyle=\"oblique\"\n px={4}\n wordBreak=\"break-word\"\n >\n This package does not currently support {languageName}. Select one of\n the supported languages above, or ask the author to add support for{\" \"}\n {languageName} in a future release.\n </Text>\n );\n };\n","import { Box, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { fetchAssembly } from \"../../api/package/assembly\";\nimport { fetchMarkdown } from \"../../api/package/docs\";\nimport { fetchMetadata } from \"../../api/package/metadata\";\nimport { Page } from \"../../components/Page\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useConfig } from \"../../contexts/Config\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { useRequest } from \"../../hooks/useRequest\";\nimport { NotFound } from \"../NotFound\";\nimport { PackageDetails } from \"./components/PackageDetails\";\nimport { PackageDocs } from \"./components/PackageDocs\";\nimport { PackageDocsError } from \"./components/PackageDocsError\";\nimport { PackageDocsUnsupported } from \"./components/PackageDocsUnsupported/PackageDocsUnsupported\";\n\ninterface PathParams {\n name: string;\n scope?: string;\n version: string;\n}\n\nexport const Package: FunctionComponent = () => {\n const { name, scope, version }: PathParams = useParams();\n const [requestMarkdown, markdownResponse] = useRequest(fetchMarkdown);\n const [requestAssembly, assemblyResponse] = useRequest(fetchAssembly);\n const [requestMetadata, metadataResponse] = useRequest(fetchMetadata);\n const configResponse = useConfig();\n\n const q = useQueryParams();\n const [language] = useLanguage();\n const submodule = q.get(QUERY_PARAMS.SUBMODULE) ?? \"\";\n\n const pageTitle = `${scope ? `${scope}/${name}` : name} ${version}`;\n\n const pageDescription = assemblyResponse?.data?.description ?? \"\";\n\n useEffect(() => {\n void requestMetadata(name, version, scope);\n void requestAssembly(name, version, scope);\n }, [name, requestAssembly, requestMetadata, scope, version]);\n\n useEffect(() => {\n void requestMarkdown(name, version, language, scope, submodule);\n }, [name, scope, version, language, submodule, requestMarkdown]);\n\n // Handle missing JSON for assembly\n if (assemblyResponse.error) {\n return <NotFound />;\n }\n\n const hasError = markdownResponse.error || assemblyResponse.error;\n const hasDocs =\n !markdownResponse.loading &&\n !assemblyResponse.loading &&\n markdownResponse.data &&\n assemblyResponse.data;\n // This will also be true if it cannot be verified (assembly not there)\n const isSupported =\n language === Language.TypeScript ||\n assemblyResponse.loading ||\n assemblyResponse.error ||\n assemblyResponse.data?.targets?.[language.toString()] != null;\n\n return (\n <Page\n meta={{ title: pageTitle, description: pageDescription }}\n pageName=\"packageProfile\"\n >\n <Stack maxW=\"100vw\" pt={4} spacing={4}>\n {/* Operator Area */}\n <Box px={4}>\n <PackageDetails\n assembly={assemblyResponse}\n config={configResponse}\n metadata={metadataResponse}\n version={version}\n />\n </Box>\n {/* Readme and Api Reference Area */}\n {isSupported ? (\n hasError ? (\n <PackageDocsError language={language}></PackageDocsError>\n ) : (\n hasDocs && (\n <PackageDocs\n assembly={assemblyResponse.data!}\n markdown={markdownResponse.data!}\n />\n )\n )\n ) : (\n <PackageDocsUnsupported language={language}></PackageDocsUnsupported>\n )}\n </Stack>\n </Page>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Redirect, useParams } from \"react-router-dom\";\nimport { Packages } from \"../../api/package/packages\";\nimport { getFullPackageName, sanitizeVersion } from \"../../api/package/util\";\nimport { useCatalog } from \"../../contexts/Catalog\";\n\ninterface RouteParams {\n name: string;\n scope?: string;\n}\n\nconst extractMajor = (ver: string) => {\n let sanitized = sanitizeVersion(ver);\n return sanitized.split(\".\")[0];\n};\n\nconst findPackage = (catalog: Packages, pkg: string) => {\n const packages = catalog.packages.filter((p) => p.name === pkg);\n\n if (packages.length === 0) {\n throw new Error(`Package ${pkg} does not exist in catalog`);\n }\n\n if (packages.length > 1) {\n return packages.sort((p1, p2) => {\n const mv1 = extractMajor(p1.version);\n const mv2 = extractMajor(p2.version);\n return mv2.localeCompare(mv1);\n })[0];\n }\n\n return packages[0];\n};\n\nexport const buildRedirectUrl = (\n catalog: Packages,\n name: string,\n scope?: string\n) => {\n const prefix = \"/packages/\";\n const packageName = getFullPackageName(name, scope);\n const version = findPackage(catalog, packageName).version;\n const suffix = `/v/${version}`;\n return `${prefix}${packageName}${suffix}`;\n};\n\nexport const PackageLatest: FunctionComponent = () => {\n const { name, scope }: RouteParams = useParams();\n const catalog = useCatalog();\n\n if (catalog.loading || !catalog.data) {\n return (\n <Center minH=\"200px\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n return <Redirect to={buildRedirectUrl(catalog.data, name, scope)} />;\n};\n","import type { FunctionComponent } from \"react\";\nimport { Switch, Route, useRouteMatch } from \"react-router-dom\";\nimport { NotFound } from \"../NotFound\";\nimport { Package } from \"../Package\";\nimport { PackageLatest } from \"../PackageLatest\";\n\nconst nameRegexp = \"[^@\\\\/]+\";\nconst scopeRegexp = \"@[^\\\\/]+\";\n\nexport const Packages: FunctionComponent = () => {\n const { path } = useRouteMatch();\n\n return (\n <Switch>\n <Route\n exact\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})`}\n >\n <PackageLatest />\n </Route>\n <Route\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})/v/:version`}\n >\n <Package />\n </Route>\n <Route path=\"*\">\n <NotFound />\n </Route>\n </Switch>\n );\n};\n"],"sourceRoot":""}