construct-hub 0.2.50 → 0.2.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +2 -2
- package/lib/construct-hub.js +1 -1
- package/lib/package-sources/code-artifact.js +1 -1
- package/lib/package-sources/npmjs.js +1 -1
- package/lib/package-tag/index.js +2 -2
- package/lib/spdx-license.js +1 -1
- package/package.json +2 -2
- package/website/asset-manifest.json +37 -37
- package/website/index.html +1 -1
- package/website/service-worker.js +1 -1
- package/website/service-worker.js.map +1 -1
- package/website/static/js/{0.476ccc35.chunk.js → 0.14ae620d.chunk.js} +2 -2
- package/website/static/js/{0.476ccc35.chunk.js.map → 0.14ae620d.chunk.js.map} +1 -1
- package/website/static/js/{1.dce521b7.chunk.js → 1.ba696ffb.chunk.js} +2 -2
- package/website/static/js/{1.dce521b7.chunk.js.map → 1.ba696ffb.chunk.js.map} +1 -1
- package/website/static/js/{10.511ed889.chunk.js → 10.48221095.chunk.js} +2 -2
- package/website/static/js/{10.511ed889.chunk.js.map → 10.48221095.chunk.js.map} +1 -1
- package/website/static/js/{11.fedfcf57.chunk.js → 11.c3c4095a.chunk.js} +2 -2
- package/website/static/js/{11.fedfcf57.chunk.js.map → 11.c3c4095a.chunk.js.map} +1 -1
- package/website/static/js/{12.f223385d.chunk.js → 12.cadd501c.chunk.js} +2 -2
- package/website/static/js/{12.f223385d.chunk.js.map → 12.cadd501c.chunk.js.map} +1 -1
- package/website/static/js/13.fe1e2da5.chunk.js +2 -0
- package/website/static/js/{13.97b408c9.chunk.js.map → 13.fe1e2da5.chunk.js.map} +1 -1
- package/website/static/js/{14.5a16949a.chunk.js → 14.0902aefd.chunk.js} +2 -2
- package/website/static/js/{14.5a16949a.chunk.js.map → 14.0902aefd.chunk.js.map} +1 -1
- package/website/static/js/{15.d29607c9.chunk.js → 15.50336305.chunk.js} +2 -2
- package/website/static/js/{15.d29607c9.chunk.js.map → 15.50336305.chunk.js.map} +1 -1
- package/website/static/js/{2.8028f8f1.chunk.js → 2.5cef3eb0.chunk.js} +2 -2
- package/website/static/js/{2.8028f8f1.chunk.js.map → 2.5cef3eb0.chunk.js.map} +1 -1
- package/website/static/js/{5.9ad3252f.chunk.js → 5.a2fc9d7c.chunk.js} +3 -3
- package/website/static/js/{5.9ad3252f.chunk.js.LICENSE.txt → 5.a2fc9d7c.chunk.js.LICENSE.txt} +0 -0
- package/website/static/js/{5.9ad3252f.chunk.js.map → 5.a2fc9d7c.chunk.js.map} +1 -1
- package/website/static/js/6.c49f34c2.chunk.js +3 -0
- package/website/static/js/{6.e67c67fc.chunk.js.LICENSE.txt → 6.c49f34c2.chunk.js.LICENSE.txt} +0 -0
- package/website/static/js/{6.e67c67fc.chunk.js.map → 6.c49f34c2.chunk.js.map} +1 -1
- package/website/static/js/{7.85487e43.chunk.js → 7.4fcbd19f.chunk.js} +2 -2
- package/website/static/js/{7.85487e43.chunk.js.map → 7.4fcbd19f.chunk.js.map} +1 -1
- package/website/static/js/8.31a21ecd.chunk.js +2 -0
- package/website/static/js/8.31a21ecd.chunk.js.map +1 -0
- package/website/static/js/9.e8c984d8.chunk.js +2 -0
- package/website/static/js/9.e8c984d8.chunk.js.map +1 -0
- package/website/static/js/main.65f1e14b.chunk.js +2 -0
- package/website/static/js/main.65f1e14b.chunk.js.map +1 -0
- package/website/static/js/{runtime-main.fc2986a7.js → runtime-main.d3c4ab29.js} +2 -2
- package/website/static/js/{runtime-main.fc2986a7.js.map → runtime-main.d3c4ab29.js.map} +1 -1
- package/website/static/js/13.97b408c9.chunk.js +0 -2
- package/website/static/js/6.e67c67fc.chunk.js +0 -3
- package/website/static/js/8.e3d4e000.chunk.js +0 -2
- package/website/static/js/8.e3d4e000.chunk.js.map +0 -1
- package/website/static/js/9.a24ba07b.chunk.js +0 -2
- package/website/static/js/9.a24ba07b.chunk.js.map +0 -1
- package/website/static/js/main.3e01d988.chunk.js +0 -2
- package/website/static/js/main.3e01d988.chunk.js.map +0 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","hooks/useQueryParams/useQueryParams.ts","hooks/useLanguage/useLanguage.ts","constants/keywords.ts","api/package/util.ts","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageTag/PackageTag.tsx","components/Time/Time.tsx","components/Picture/Picture.tsx","views/NotFound/NotFound.tsx","components/Markdown/Markdown.tsx","components/Markdown/Hr.tsx","components/Markdown/Img.tsx","components/Markdown/List.tsx","components/Markdown/Table.tsx","components/Markdown/testIds.ts","components/Markdown/Text.tsx","components/CopyButton/CopyButton.tsx","components/Code/MultiLineRenderer.tsx","components/Code/SingleLineRenderer.tsx","components/Code/Code.tsx","components/Markdown/Code.tsx","components/Markdown/Headings.tsx","util/sanitize-anchor.ts","api/package/assembly.ts","api/package/docs.ts","api/package/metadata.ts","components/LanguageBar/LanguageBar.tsx","views/Package/components/LanguageSelection/LanguageSelection.tsx","views/Package/components/DependencyDropdown/DependencyDropdown.tsx","components/LicenseLink/constants.ts","components/LicenseLink/LicenseLink.tsx","views/Package/components/OperatorArea/Details.tsx","views/Package/components/OperatorArea/OperatorArea.tsx","views/Package/components/PackageHeader/PackageHeader.tsx","components/CodePopover/CodePopover.tsx","components/CodePopover/CodePopoverTrigger.tsx","views/Package/components/UseConstruct/UseConstruct.tsx","views/Package/components/PackageDetails/PackageDetails.tsx","components/NavTree/NavTree.tsx","views/Package/components/ChooseSubmodule/SearchInput.tsx","views/Package/components/ChooseSubmodule/SearchModal.tsx","views/Package/components/ChooseSubmodule/ChooseSubmodule.tsx","views/Package/components/PackageDocs/PackageDocs.tsx","views/Package/components/PackageDocsError/PackageDocsError.tsx","views/Package/components/PackageDocsUnsupported/PackageDocsUnsupported.tsx","views/Package/Package.tsx","views/PackageLatest/PackageLatest.tsx","views/Packages/Packages.tsx"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","useQueryParams","useLocation","useMemo","URLSearchParams","defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","has","getInitialLang","langFromParams","storedLang","localStorage","getItem","useLanguage","options","updateUrl","updateSaved","pathname","hash","useHistory","replace","params","get","QUERY_PARAMS","LANGUAGE","useState","language","setLanguage","set","toString","update","useCallback","val","setItem","KEYWORD_IGNORE_LIST","Set","getFullPackageName","scope","getAssetsPath","version","prefix","API_PATHS","PACKAGES_PREFIX","body","sanitizeVersion","ver","sanitized","startsWith","substring","extractMajor","split","findPackage","catalog","pkg","packages","filter","p","length","sort","p1","p2","mv1","localeCompare","LanguageSupportTooltip","isSupported","langName","LANGUAGE_NAME_MAP","message","hasArrow","label","placement","PackageTag","value","zIndex","tagProps","NavLink","to","getSearchPath","query","_hover","textDecoration","Time","forwardRef","ref","date","formatString","format","boxProps","as","dateTime","toISOString","displayName","Picture","sources","props","map","source","idx","media","srcSet","bgSources","optimal","fallback","NotFound","h","position","w","alt","inset","src","align","direction","justify","Link","colorScheme","components","a","A","blockquote","Blockquote","caption","TableCaption","code","Code","em","Em","h1","Headings","h2","h3","h4","h5","h6","hr","Hr","img","Img","li","Li","ol","Ol","P","pre","Pre","sup","Sup","table","Table","tbody","Tbody","td","Td","tfoot","Tfoot","th","Th","thead","Thead","tr","Tr","ul","Ul","ghSchema","require","attributes","span","concat","rehypePlugins","rehypeRaw","rehypeSanitize","remarkPlugins","remarkGfm","remarkEmoji","GITHUB_REPO_REGEX","Markdown","repoConfig","type","url","match","exec","owner","repo","parseGitHubRepository","repository","toAbsoluteUri","githubPrefix","githubSuffix","ReactMarkdown","uriTransformer","uri","first","includes","Buffer","byteLength","lastIndexOf","join","testIds","container","px","sx","mb","lineHeight","transformImageUri","transformLinkUri","my","display","mr","fontStyle","fontSize","color","maxW","overflowX","variant","createTestIds","href","linkProps","Component","URL","hostname","window","location","bg","borderLeft","borderLeftColor","borderRadius","wordBreak","fontWeight","undefined","text","Array","isArray","ml","top","CopyButton","btnProps","useClipboard","hasCopied","onCopy","icon","Check","Copy","minW","onClick","MultiLineRenderer","tokens","getLineProps","getTokenProps","py","line","i","key","token","SingleLineRenderer","defaultProps","theme","nightOwlLight","border","boxShadow","className","overflow","style","inline","borderColor","Children","toArray","reduce","accum","child","trim","level","size","marginY","elem","dataElement","DOMParser","parseFromString","ReactDOMServer","renderToStaticMarkup","querySelector","dataset","headingTitle","id","headingId","toLowerCase","isH3OrLarger","mt","fetchAssembly","assemblyPath","ASSEMBLY_SUFFIX","fetch","response","ok","Error","statusText","json","fetchMarkdown","submodule","docsSuffix","markdownPath","expectedContentType","contentType","headers","fetchMetadata","sanitizedVersion","metadataPath","METADATA_SUFFIX","LanguageBar","targetLanguages","selectedLanguage","setSelectedLanguage","spacing","left","right","LANGUAGES","indexOf","isDisabled","isSelected","LangIcon","LANGUAGE_RENDER_MAP","cursor","disabled","height","width","languageSet","LanguageSelection","assembly","targets","Object","keys","target","DependencyDropdown","dependencies","depEntries","entries","Button","leftIcon","rightIcon","ChevronDown","OS_ORG_LINK","LICENSE_LINKS","MIT","LicenseLink","license","ExternalLink","Details","linksConfig","metadata","detailItems","links","username","author","authorUrl","registry","npm","items","publishDate","Date","push","forEach","displayText","packageLinks","link","getRepoUrlAndHost","repoLink","licenseLink","registryLink","slice","detail","listStyleType","OperatorArea","textAlign","base","md","encodeURIComponent","m","PackageHeader","tags","currentLanguage","maxWidth","v","Boolean","tag","iconButtonProps","iconProps","CodePopover","header","trigger","disclosure","useDisclosure","focusRef","useRef","mdBreakpoint","useToken","useMediaQuery","isMd","initialFocusRef","isLazy","Flex","pr","copy","close","Close","onClose","borderTopLeftRadius","borderTopRightRadius","CodePopoverTrigger","UseConstruct","packageName","Python","python","distName","Java","groupId","java","maven","artifactId","getCodeSample","PackageDetails","config","loading","data","Card","gap","templateColumns","templateRows","keywords","orientation","minH","NavItem","onOpen","isHashUrl","linkIsActive","defaultIsOpen","showToggle","showChildren","isOpen","LinkComponent","nestedItems","item","ChevronRight","onToggle","pl","textOverflow","whiteSpace","_before","bottom","NavTree","SearchInput","inputRef","onChange","onSubmit","inputValue","setInputValue","useDebounce","Form","Search","e","placeholder","SearchModal","onInputChange","submodules","navigate","preventDefault","mx","pb","maxH","role","tabIndex","SearchItem","ChooseSubmodule","allSubmodules","currentSubmodule","SUBMODULE","submoduleText","setFilter","getUrl","submoduleName","results","fqn","ArrowBack","flexGrow","appendItem","itemTree","HTMLElement","headingLevel","innerText","parseInt","last","TOP_OFFSET","PackageDocs","markdown","navItems","setNavItems","tree","document","querySelectorAll","scrollIntoView","columnGap","alignSelf","borderRight","borderRightColor","maxHeight","borderBottom","overflowY","scrollMarginTop","PackageDocsError","issueLink","PackageDocsUnsupported","languageName","Package","useParams","useRequest","requestMarkdown","markdownResponse","requestAssembly","assemblyResponse","requestMetadata","metadataResponse","configResponse","useConfig","q","pageTitle","pageDescription","error","hasError","hasDocs","isLoadingDocs","pt","PackageLatest","useCatalog","buildRedirectUrl","nameRegexp","scopeRegexp","Packages","path","useRouteMatch","exact"],"mappings":"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","file":"static/js/7.85487e43.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","export const KEYWORD_IGNORE_LIST = new Set([\n \"aws-cdk\",\n \"aws\",\n \"awscdk\",\n \"cdk-construct\",\n \"cdk\",\n \"construct\",\n \"constructs\",\n]);\n","import { API_PATHS } from \"../../constants/url\";\nimport { CatalogPackage, Packages } from \"./packages\";\n\nexport const getFullPackageName = (name: string, scope?: string) => {\n return scope ? `${scope}/${name}` : name;\n};\n\nexport const getAssetsPath = (\n name: string,\n version: string,\n scope?: string\n) => {\n const prefix = `${API_PATHS.PACKAGES_PREFIX}/`;\n const body = getFullPackageName(name, scope);\n const suffix = `/v${version}`;\n return `${prefix}${body}${suffix}`;\n};\n\nexport const sanitizeVersion = (ver: string) => {\n let sanitized = ver;\n if (sanitized.startsWith(\"~\") || sanitized.startsWith(\"^\")) {\n sanitized = sanitized.substring(1);\n }\n return sanitized;\n};\n\nconst extractMajor = (ver: string) => {\n let sanitized = sanitizeVersion(ver);\n return sanitized.split(\".\")[0];\n};\n\nexport const findPackage = (\n catalog: Packages,\n pkg: string\n): CatalogPackage | undefined => {\n const packages = catalog.packages.filter((p) => p.name === pkg);\n\n if (packages.length > 1) {\n return packages.sort((p1, p2) => {\n const mv1 = extractMajor(p1.version);\n const mv2 = extractMajor(p2.version);\n return mv2.localeCompare(mv1);\n })[0];\n }\n\n return packages[0];\n};\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<LanguageSupportTooltipProps> =\n ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n };\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Language } from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n language?: Language;\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n language,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ query: `${value}`, language })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport interface TimeOptions {\n date: Date;\n format: string;\n}\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {format(date, formatString)}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","import { Box, HTMLChakraProps, forwardRef, Image } from \"@chakra-ui/react\";\n\nexport interface PictureProps extends HTMLChakraProps<\"img\"> {\n alt: string;\n src: string;\n sources?: {\n media?: string;\n srcSet: string;\n }[];\n}\n\nexport const Picture = forwardRef<PictureProps, \"img\">(\n ({ sources, ...props }, ref) => (\n <Box as=\"picture\">\n {sources?.map((source, idx) => (\n <source key={idx} media={source.media} srcSet={source.srcSet} />\n ))}\n <Image ref={ref} {...props} />\n </Box>\n )\n);\n\nPicture.displayName = \"Picture\";\n","import { Button, Center, Flex } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Page } from \"../../components/Page\";\nimport { Picture } from \"../../components/Picture\";\n\nconst bgSources = {\n optimal: [\n { media: \"(max-width:1024px)\", srcSet: \"/assets/404-hive@50.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/404-hive@100.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/404-hive@100.png\" },\n ],\n fallback: \"/assets/404-hive@50.png\",\n};\n\nexport const NotFound: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Not Found\",\n description: \"Oops! The page you were looking for does not exist\",\n }}\n pageName=\"notFound\"\n >\n <Center h=\"100%\" position=\"relative\" w=\"100%\">\n <Picture\n alt=\"\"\n inset={0}\n position=\"absolute\"\n sources={bgSources.optimal}\n src={bgSources.fallback}\n zIndex=\"hide\"\n />\n <Flex align=\"center\" direction=\"column\" justify=\"center\">\n <Picture\n alt=\"404 Image\"\n sources={[{ srcSet: \"/assets/robot.webp\" }]}\n src=\"/assets/robot.png\"\n />\n <Button as={Link} colorScheme=\"blue\" to=\"/\">\n Take Me Home\n </Button>\n </Flex>\n </Center>\n </Page>\n );\n};\n","import { Box } from \"@chakra-ui/react\";\nimport { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent } from \"react\";\nimport ReactMarkdown, {\n PluggableList,\n ReactMarkdownOptions,\n} from \"react-markdown\";\nimport type { TableCellComponent } from \"react-markdown/src/ast-to-react\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport remarkEmoji from \"remark-emoji\";\nimport remarkGfm from \"remark-gfm\";\nimport { Code } from \"./Code\";\nimport { Headings } from \"./Headings\";\nimport { Hr } from \"./Hr\";\nimport { Img } from \"./Img\";\nimport { Ul, Ol, Li } from \"./List\";\nimport { Table, Thead, Tbody, Tfoot, Tr, Th, Td, TableCaption } from \"./Table\";\nimport testIds from \"./testIds\";\nimport { A, Blockquote, Em, P, Pre, Sup } from \"./Text\";\n\nconst ONE_MEGABYTE = 1024 * 1024;\n\nconst components: ReactMarkdownOptions[\"components\"] = {\n a: A,\n blockquote: Blockquote,\n caption: TableCaption,\n code: Code,\n em: Em,\n h1: Headings,\n h2: Headings,\n h3: Headings,\n h4: Headings,\n h5: Headings,\n h6: Headings,\n hr: Hr,\n img: Img,\n li: Li,\n ol: Ol,\n p: P,\n pre: Pre,\n sup: Sup,\n table: Table,\n tbody: Tbody,\n td: Td as TableCellComponent, // The react-markdown component has a tighter signature than the one from @chakra-ui\n tfoot: Tfoot,\n th: Th as TableCellComponent, // The react-markdown component has a tighter signature than the one from @chakra-ui\n thead: Thead,\n tr: Tr,\n ul: Ul,\n};\n\n// see https://github.com/rehypejs/rehype-sanitize#use\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nvar ghSchema = require(\"hast-util-sanitize/lib/github\");\n\n// jsii-docgen adds these attributes to <span> elements embedded inside\n// headings in order to configure custom anchor ids.\n// tell rehype not to strip those out.\nghSchema.attributes.span = (ghSchema.attributes.span ?? []).concat([\n \"dataHeadingTitle\",\n \"dataHeadingId\",\n]);\n\n// Note - the default schema for rehypeSanitize is GitHub-style, which is what we need!\nconst rehypePlugins: PluggableList = [\n [rehypeRaw],\n // ALWAYS keep rehypeSanitize LAST!\n [rehypeSanitize, ghSchema],\n];\nconst remarkPlugins = [remarkGfm, remarkEmoji];\n\nconst GITHUB_REPO_REGEX =\n /^(?:(?:git@)?github\\.com:|(?:https?:\\/\\/)github\\.com\\/)([^/]+)\\/([^/]+)(?:\\.git)?$/;\n\n/**\n * Parses out a GitHub repository owner and repo name from the `repository`\n * configuration of a jsii Assembly.\n *\n * @returns the `owner` and `repo` for the configured repository, if it looks\n * like a GitHub repository URL.\n */\nconst parseGitHubRepository = ({ type, url }: Assembly[\"repository\"]) => {\n if (type !== \"git\") {\n return undefined;\n }\n // git@github.com:<owner>/<repo>.git\n // https://github.com/<owner>/<repo>.git\n const match = GITHUB_REPO_REGEX.exec(url);\n if (match == null) {\n return undefined;\n }\n\n const [, owner, repo] = match;\n return { owner, repo };\n};\n\nexport const Markdown: FunctionComponent<{\n children: string;\n repository: Assembly[\"repository\"];\n}> = ({ children, repository }) => {\n const repoConfig = parseGitHubRepository(repository);\n\n const toAbsoluteUri = (githubPrefix: string, githubSuffix = \"HEAD\") =>\n repoConfig == null\n ? ReactMarkdown.uriTransformer\n : (uri: string) => {\n const url = ReactMarkdown.uriTransformer(uri);\n\n // If this is an anchor or absolute URL, return it.\n const [first] = url;\n if (first === \"#\" || first === \"/\") {\n return url;\n }\n\n // If there is a protocol element, then return the URL as-is.\n if (url.includes(\"://\")) {\n return url;\n }\n\n const owner = repoConfig.owner;\n const repo = repoConfig.repo.replace(/\\.git$/, \"\");\n return `https://${githubPrefix}/${owner}/${repo}/${githubSuffix}/${url}`;\n };\n\n const byteLength = Buffer.byteLength(children);\n if (byteLength > ONE_MEGABYTE) {\n children = children.substring(0, children.lastIndexOf(\"# API Reference\"));\n children = [\n children,\n \"# API Reference\",\n \"The API Reference for this package could not be rendered.\",\n \"If this issue persists, please let us know by creating an [issue](https://github.com/cdklabs/construct-hub-webapp/issues/new)\",\n ].join(\"\\n\");\n }\n return (\n <Box\n data-testid={testIds.container}\n px={8}\n sx={{\n \"& > *\": { mb: 8 },\n \"& > p\": { lineHeight: \"taller\" },\n }}\n >\n <ReactMarkdown\n components={components}\n rehypePlugins={rehypePlugins}\n remarkPlugins={remarkPlugins}\n transformImageUri={toAbsoluteUri(\"raw.githubusercontent.com\")}\n transformLinkUri={toAbsoluteUri(\"github.com\", \"blob/HEAD\")}\n >\n {children}\n </ReactMarkdown>\n </Box>\n );\n};\n","import { Divider, DividerProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const Hr: FunctionComponent<DividerProps> = (props) => (\n <Divider my={10} {...props} />\n);\n","import { Image, ImageProps } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nexport const Img: FunctionComponent<ImageProps> = (props) => (\n <Image display=\"inline-block\" {...props} />\n);\n","import { UnorderedList, OrderedList, ListItem } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const Ul: FunctionComponent = ({ children }) => (\n <UnorderedList>{children}</UnorderedList>\n);\n\nexport const Ol: FunctionComponent = ({ children }) => (\n <OrderedList>{children}</OrderedList>\n);\n\nexport const Li: FunctionComponent = ({ children }) => (\n <ListItem\n lineHeight=\"tall\"\n mb={2}\n sx={{\n \"em:first-of-type\": {\n mr: 2,\n fontStyle: \"italic\",\n fontSize: \"small\",\n },\n \"&::marker\": {\n color: \"blue.500\",\n },\n code: {\n fontSize: \"small\",\n },\n }}\n >\n {children}\n </ListItem>\n);\n","import {\n Box,\n Table as ChakraTable,\n Thead,\n Tbody,\n Tfoot,\n Tr,\n Th,\n Td,\n TableCaption,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nconst Table: FunctionComponent = ({ children }) => (\n <Box maxW=\"100%\" overflowX=\"auto\">\n <ChakraTable variant=\"striped\">{children}</ChakraTable>\n </Box>\n);\n\nexport { Table, Tfoot, Tbody, Td, Thead, Tr, Th, TableCaption };\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"markdown\", [\"container\"] as const);\n","import { Box, HTMLChakraProps, Link, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../ExternalLink\";\n\ntype AnchorComponent = FunctionComponent<HTMLChakraProps<\"a\">>;\n\nexport const A: AnchorComponent = ({ children, href, ...linkProps }) => {\n let Component: AnchorComponent = Link;\n\n try {\n if (href && href.startsWith(\"http\")) {\n const hostname = new URL(href).hostname;\n\n if (hostname !== window.location.hostname) {\n const External: AnchorComponent = (props) => (\n <ExternalLink {...props} />\n );\n\n Component = External;\n }\n }\n } catch {\n Component = Link;\n }\n\n return (\n <Component\n color=\"blue.500\"\n href={href}\n // If we are rendering an img within the link (specifically stability banners),\n // do not display the external link Icon\n sx={{ \"> img + svg\": { display: \"none\" } }}\n {...linkProps}\n >\n {children}\n </Component>\n );\n};\n\nexport const Blockquote: FunctionComponent = ({ children }) => (\n <Box\n as=\"blockquote\"\n bg=\"gray.100\"\n borderLeft=\"5px solid\"\n borderLeftColor=\"gray.200\"\n borderRadius=\"md\"\n p={2}\n wordBreak=\"break-word\"\n >\n {children}\n </Box>\n);\n\nexport const Em: FunctionComponent = ({ children }) => (\n <Box as=\"em\" color=\"blue.500\" fontStyle=\"normal\" fontWeight=\"semibold\">\n {children}\n </Box>\n);\n\nexport const P: FunctionComponent = ({ children }) => <Text>{children}</Text>;\n\nexport const Pre: FunctionComponent = ({ children }) => (\n <Box as=\"pre\">{children}</Box>\n);\n\nexport const Sup: FunctionComponent = ({ children }) => {\n let color: string | undefined = undefined;\n let text = \"\";\n\n if (Array.isArray(children)) {\n const [first] = children;\n\n if (typeof first === \"string\") {\n text = first;\n }\n }\n\n if (text === \"Required\") {\n color = \"orange.500\";\n } else if (text === \"Optional\") {\n color = \"green.500\";\n }\n\n return (\n <Box as=\"sup\" color={color} ml={2} top={-1}>\n {children}\n </Box>\n );\n};\n","import { CopyIcon, CheckIcon } from \"@chakra-ui/icons\";\nimport {\n forwardRef,\n IconButton,\n IconButtonProps,\n useClipboard,\n} from \"@chakra-ui/react\";\n\nexport interface CopyButtonProps extends Omit<IconButtonProps, \"aria-label\"> {\n // Optional since we set a default\n \"aria-label\"?: string;\n value: string;\n}\n\nexport const CopyButton = forwardRef<CopyButtonProps, \"button\">(\n ({ value, ...btnProps }, ref) => {\n const { hasCopied, onCopy } = useClipboard(value);\n\n return (\n <IconButton\n aria-label=\"Copy Button\"\n h={6}\n icon={hasCopied ? <CheckIcon color=\"green.300\" /> : <CopyIcon />}\n minW=\"auto\"\n onClick={onCopy}\n ref={ref}\n variant=\"ghost\"\n w={6}\n {...btnProps}\n />\n );\n }\n);\n\nCopyButton.displayName = \"CopyButton\";\n","import { Box, Flex } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { CopyButton } from \"../CopyButton\";\nimport type { RendererProps } from \"./types\";\n\nexport const MultiLineRenderer: FunctionComponent<RendererProps> = ({\n code,\n tokens,\n getLineProps,\n getTokenProps,\n}) => (\n <>\n <Flex\n align=\"center\"\n bg=\"rgba(0, 124, 253, 0.15)\"\n justify=\"flex-end\"\n px={2}\n py={1}\n >\n <CopyButton _hover={{ bg: \"gray.300\" }} color=\"gray.500\" value={code} />\n </Flex>\n <Box maxW=\"100%\" overflowX=\"auto\" p={2}>\n <Box w=\"max-content\">\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line, key: i })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token, key })} />\n ))}\n </div>\n ))}\n </Box>\n </Box>\n </>\n);\n","import { Box, Flex } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { CopyButton } from \"../CopyButton\";\nimport type { RendererProps } from \"./types\";\n\nexport const SingleLineRenderer: FunctionComponent<RendererProps> = ({\n code,\n tokens,\n getLineProps,\n getTokenProps,\n}) => (\n <Flex align=\"center\" justify=\"space-between\" p={2}>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line, key: i })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token, key })} />\n ))}\n </div>\n ))}\n <Box>\n <CopyButton color=\"blue.500\" colorScheme=\"blue\" ml={4} value={code} />\n </Box>\n </Flex>\n);\n","import { Box } from \"@chakra-ui/react\";\nimport Highlight, { defaultProps, Language } from \"prism-react-renderer\";\nimport nightOwlLight from \"prism-react-renderer/themes/nightOwlLight\";\nimport { FunctionComponent } from \"react\";\nimport { MultiLineRenderer } from \"./MultiLineRenderer\";\nimport { SingleLineRenderer } from \"./SingleLineRenderer\";\n\nexport interface CodeProps {\n code: string;\n language: Language;\n}\n\nexport const Code: FunctionComponent<CodeProps> = ({ code, language }) => {\n return (\n <Highlight\n {...defaultProps}\n code={code}\n language={language}\n theme={nightOwlLight}\n >\n {(props) => (\n <Box\n as=\"pre\"\n border=\"base\"\n borderRadius=\"md\"\n boxShadow=\"base\"\n className={props.className}\n maxW=\"100%\"\n overflow=\"hidden\"\n style={props.style}\n w=\"min-content\"\n >\n {props.tokens.length > 1 ? (\n <MultiLineRenderer {...props} code={code} />\n ) : (\n <SingleLineRenderer {...props} code={code} />\n )}\n </Box>\n )}\n </Highlight>\n );\n};\n","import { Code as InlineCode } from \"@chakra-ui/react\";\nimport { Language } from \"prism-react-renderer\";\nimport { Children, FunctionComponent, ReactNode } from \"react\";\nimport { Code as BlockCode } from \"../Code\";\n\ninterface CodeProps {\n inline?: boolean;\n children: ReactNode;\n language?: Language;\n}\n\nexport const Code: FunctionComponent<CodeProps> = ({\n inline,\n children,\n language = \"typescript\",\n}) => {\n if (inline) {\n return (\n <InlineCode\n bg=\"gray.100\"\n border=\"1px solid\"\n borderColor=\"gray.100\"\n borderRadius=\"md\"\n color=\"blue.500\"\n px={2}\n py={0}\n >\n {children}\n </InlineCode>\n );\n }\n\n const code = Children.toArray(children)\n .reduce((accum: string, child): string => {\n if (typeof child === \"string\") {\n return `${accum}${child}`;\n }\n return accum;\n }, \"\")\n .trim();\n\n return <BlockCode code={code} language={language} />;\n};\n","import { Heading, As } from \"@chakra-ui/react\";\nimport { Children, FunctionComponent, ReactNode } from \"react\";\nimport ReactDOMServer from \"react-dom/server\";\nimport { sanitize } from \"../../util/sanitize-anchor\";\nimport { NavLink } from \"../NavLink\";\nimport { Hr } from \"./Hr\";\n\ninterface HeadingResolverProps {\n level: number;\n children: ReactNode;\n}\n\nexport const Headings: FunctionComponent<HeadingResolverProps> = ({\n level,\n children,\n}) => {\n const size: string = [\"2xl\", \"xl\", \"lg\", \"md\", \"sm\", \"xs\"][level - 1];\n const marginY: number = [10, 10, 10, 8, 8, 8][level - 1];\n const elem = `h${level}` as As<any>;\n\n // Use DOMParser to look for data attribute for link ID\n const parser = new DOMParser();\n const doc = parser.parseFromString(\n ReactDOMServer.renderToStaticMarkup(children as React.ReactElement),\n \"text/html\"\n );\n\n const dataElement = doc.querySelector(\n \"span[data-heading-title][data-heading-id]\"\n ) as HTMLElement;\n const title =\n dataElement?.dataset.headingTitle ??\n Children.toArray(children)\n .reduce((accum: string, child): string => {\n if (typeof child === \"string\") {\n return `${accum}${child}`;\n }\n return accum;\n }, \"\")\n .trim();\n\n const id = dataElement?.dataset.headingId ?? sanitize(title);\n\n const isH3OrLarger = level < 4;\n\n return (\n <>\n <Heading\n as={elem}\n color=\"blue.800\"\n level={level}\n mb={isH3OrLarger ? 0 : level}\n mt={marginY}\n size={size}\n >\n <NavLink\n data-heading-id={id}\n data-heading-level={level}\n data-heading-title={title}\n id={id}\n replace\n sx={{ \"> code\": { color: \"blue.800\", fontSize: \"inherit\" } }}\n to={`#${id}`}\n >\n {children}\n </NavLink>\n </Heading>\n {isH3OrLarger && (\n // If there's an adjacent HR from the source md, do a magic trick and make it disappear\n <Hr mb={marginY} mt={0} sx={{ \"& + hr\": { display: \"none\" } }} />\n )}\n </>\n );\n};\n","export const sanitize = (input: string): string => {\n return input\n .toLowerCase()\n .replace(/[^a-zA-Z0-9 ]/g, \"\")\n .replace(/ /g, \"-\");\n};\n","import * as spec from \"@jsii/spec\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\n/**\n * Fetch assembly of a specific package from the backend.\n */\nexport const fetchAssembly = async (\n name: string,\n version: string,\n scope?: string\n): Promise<spec.Assembly> => {\n const assemblyPath = `${getAssetsPath(name, version, scope)}${\n API_PATHS.ASSEMBLY_SUFFIX\n }`;\n const response = await fetch(assemblyPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching assembly for ${assemblyPath}: ${response.statusText}`\n );\n }\n return response.json();\n};\n","import { getAssetsPath } from \"./util\";\n\n/**\n * Fetch markdown docs of a specific package from the backend.\n */\nexport const fetchMarkdown = async (\n name: string,\n version: string,\n language: string,\n scope?: string,\n submodule?: string\n): Promise<string> => {\n const docsSuffix = `/docs-${submodule ? `${submodule}-` : \"\"}${language}.md`;\n\n const markdownPath = `${getAssetsPath(name, version, scope)}${docsSuffix}`;\n const response = await fetch(markdownPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching documentation for ${markdownPath}: ${response.statusText}`\n );\n }\n\n // since CloudFront returns a 200 /index.html for missing documents,\n // we assert the expected docs content type to detect these errors.\n // TODO: switch to proper 404 responses in this case (requires backend changes)\n const expectedContentType = \"text/markdown\";\n const contentType = response.headers.get(\"Content-Type\");\n\n // we check 'includes' and not 'equal' because the content type contains\n // charset as well (e.g text/markdown; charset=UTF-8)\n if (!contentType || !contentType.includes(expectedContentType)) {\n throw new Error(\n `Invalid content type: ${contentType}. Expected ${expectedContentType}\"`\n );\n }\n return response.text();\n};\n","import { CDKType } from \"../../constants/constructs\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\nexport interface Metadata {\n constructFramework?: {\n name?: CDKType;\n majorVersion?: number;\n };\n date: string;\n links?: {\n npm: string;\n };\n packageLinks?: {\n [key: string]: string;\n };\n}\n\n/**\n * Fetch metadata of a specific package from the backend.\n */\nexport const fetchMetadata = async (\n name: string,\n version: string,\n scope?: string\n): Promise<Metadata> => {\n let sanitizedVersion = version;\n\n if (sanitizedVersion.startsWith(\"^\")) {\n sanitizedVersion = sanitizedVersion.substring(1, sanitizedVersion.length);\n }\n\n const metadataPath = `${getAssetsPath(name, version, scope)}${\n API_PATHS.METADATA_SUFFIX\n }`;\n const response = await fetch(metadataPath);\n\n if (!response.ok) {\n throw new Error(\n `Failed fetching metadata for ${metadataPath}: ${response.statusText}`\n );\n }\n\n return response.json();\n};\n","import { IconButton, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n TEMP_SUPPORTED_LANGUAGES,\n LANGUAGE_RENDER_MAP,\n LANGUAGES,\n} from \"../../constants/languages\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nexport interface LanguageBarProps {\n targetLanguages: readonly Language[];\n selectedLanguage: Language;\n setSelectedLanguage: (lang: Language) => void;\n}\n\nexport const LanguageBar: FunctionComponent<LanguageBarProps> = ({\n targetLanguages,\n selectedLanguage,\n setSelectedLanguage,\n}) => {\n return (\n <Stack\n align=\"center\"\n data-testid=\"language-bar\"\n direction=\"row\"\n spacing={2}\n >\n {[...targetLanguages]\n .sort(\n (left, right) => LANGUAGES.indexOf(left) - LANGUAGES.indexOf(right)\n )\n .map((language: Language) => {\n const isDisabled = !TEMP_SUPPORTED_LANGUAGES.has(language);\n const isSelected = language === selectedLanguage;\n\n const { icon: LangIcon } = LANGUAGE_RENDER_MAP[language];\n\n const onClick = () => {\n if (isSelected) return;\n setSelectedLanguage(language);\n };\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n <IconButton\n aria-label={`Select ${language} icon`}\n border={isSelected ? \"1px solid\" : \"none\"}\n borderColor=\"blue.500\"\n borderRadius=\"lg\"\n boxShadow=\"base\"\n colorScheme=\"blue\"\n cursor={isDisabled ? \"not-allowed\" : \"pointer\"}\n data-testid={`language-${language}`}\n disabled={isDisabled}\n icon={\n <LangIcon\n aria-label={`${language}-icon`}\n borderRadius=\"sm\"\n height={[4, 5, 6]}\n width={[4, 5, 6]}\n />\n }\n onClick={onClick}\n p={1}\n variant=\"outline\"\n w=\"max-content\"\n />\n </LanguageSupportTooltip>\n );\n })}\n </Stack>\n );\n};\n","import type { Assembly } from \"@jsii/spec\";\nimport type { FunctionComponent } from \"react\";\nimport { LanguageBar } from \"../../../../components/LanguageBar\";\nimport { Language, LANGUAGES } from \"../../../../constants/languages\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\nexport interface LanguageSelectionProps {\n assembly: Assembly;\n}\n\nconst languageSet = new Set(LANGUAGES);\n\nexport const LanguageSelection: FunctionComponent<LanguageSelectionProps> = ({\n assembly,\n}) => {\n const [language, setLanguage] = useLanguage({\n updateSaved: true,\n updateUrl: true,\n });\n const targets = [\n ...Object.keys(assembly?.targets ?? {}),\n // typescript is the source language and hence always supported.\n // (it doesn't appear in spec.targets)\n Language.TypeScript,\n ] as Language[];\n\n return (\n <LanguageBar\n selectedLanguage={targets.includes(language) ? language : targets[0]}\n setSelectedLanguage={setLanguage}\n targetLanguages={targets.filter((target) => languageSet.has(target))}\n />\n );\n};\n","import { ChevronDownIcon, LinkIcon } from \"@chakra-ui/icons\";\nimport { Menu, MenuButton, Button, MenuItem, MenuList } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { sanitizeVersion } from \"../../../../api/package/util\";\nimport { NavLink } from \"../../../../components/NavLink\";\n\nexport interface DependencyDropdownProps {\n dependencies: {\n /**\n * Key is a dep name, value is a version\n */\n [key: string]: string;\n };\n}\n\nexport const DependencyDropdown: FunctionComponent<DependencyDropdownProps> = ({\n dependencies,\n}) => {\n const depEntries = Object.entries(dependencies);\n\n if (!depEntries.length) return null;\n\n return (\n <Menu>\n <MenuButton\n as={Button}\n color=\"blue.500\"\n leftIcon={<LinkIcon />}\n rightIcon={<ChevronDownIcon h={6} w={6} />}\n size=\"md\"\n variant=\"outline\"\n >\n Dependencies\n </MenuButton>\n <MenuList>\n {depEntries.map(([name, version]) => (\n <MenuItem key={`${name}/${version}`} p={0}>\n <NavLink\n h=\"100%\"\n p={2}\n to={`/packages/${name}/v/${sanitizeVersion(version)}`}\n w=\"100%\"\n >\n {`${name} - ${version}`}\n </NavLink>\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n );\n};\n","const OS_ORG_LINK = \"https://opensource.org/licenses\";\n\nexport const LICENSE_LINKS = {\n \"Apache-2.0\": `${OS_ORG_LINK}/apache2.0.php`,\n \"BSD-2-Clause\": `${OS_ORG_LINK}/bsd-license.php`,\n MIT: `${OS_ORG_LINK}/mit-license.php`,\n} as const;\n","import { forwardRef } from \"@chakra-ui/react\";\nimport { ExternalLink, ExternalLinkProps } from \"../ExternalLink\";\nimport { LICENSE_LINKS } from \"./constants\";\n\nexport interface LicenseLinkOptions {\n license: keyof typeof LICENSE_LINKS;\n}\n\nexport interface LicenseLinkProps\n extends ExternalLinkProps,\n LicenseLinkOptions {}\n\nexport const LicenseLink = forwardRef<LicenseLinkProps, \"a\">(\n ({ license, ...linkProps }, ref) => {\n const url = LICENSE_LINKS[license];\n\n return (\n <ExternalLink href={url} ref={ref} {...linkProps}>\n {license}\n </ExternalLink>\n );\n }\n);\n\nLicenseLink.displayName = \"LicenseLink\";\n","import { Box, ListItem, Text, UnorderedList } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { ReactNode, useMemo } from \"react\";\nimport type { PackageLinksConfig } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { ExternalLink } from \"../../../../components/ExternalLink\";\nimport { LicenseLink, LICENSE_LINKS } from \"../../../../components/LicenseLink\";\nimport { Time } from \"../../../../components/Time\";\nimport { getRepoUrlAndHost } from \"../../../../util/url\";\n\nexport interface DetailsProps {\n assembly?: Assembly;\n linksConfig?: PackageLinksConfig[];\n metadata: Metadata;\n}\n\nexport const Details = ({ assembly, linksConfig, metadata }: DetailsProps) => {\n const detailItems = useMemo(() => {\n if (!metadata) return [];\n\n const { date, links } = metadata;\n const username = assembly?.author.name;\n const authorUrl = assembly?.author.url;\n const repository = assembly?.repository;\n const license = assembly?.license;\n // https://www.npmjs.com/package/aws-cdk/v/1.113.0\n const registry =\n links?.npm ??\n `https://www.npmjs.com/package/${assembly?.name}/v/${assembly?.version}`;\n\n const items = [];\n\n if (date) {\n const publishDate = (\n <Time date={new Date(date)} fontWeight=\"bold\" format=\"MMMM dd, yyyy\" />\n );\n items.push(<>Published: {publishDate}</>);\n }\n\n if (username) {\n const author = authorUrl ? (\n <ExternalLink href={authorUrl}>{username}</ExternalLink>\n ) : (\n <Box as=\"strong\" fontWeight=\"bold\">\n {username}\n </Box>\n );\n items.push(<>Author: {author}</>);\n }\n\n // Prioritize custom links when available\n if (linksConfig?.length) {\n linksConfig.forEach(({ name, value, displayText }) => {\n const target = (metadata?.packageLinks ?? {})[value];\n if (target) {\n const link = (\n <ExternalLink href={target}>{displayText ?? target}</ExternalLink>\n );\n items.push(\n <>\n {name}: {link}\n </>\n );\n }\n });\n }\n\n if (repository) {\n const repo = getRepoUrlAndHost(repository.url);\n\n if (repo) {\n const repoLink = (\n <ExternalLink href={repo.url}>{repo.hostname}</ExternalLink>\n );\n items.push(<>Repository: {repoLink}</>);\n }\n }\n\n if (license && license in LICENSE_LINKS) {\n const licenseLink = (\n <LicenseLink license={license as keyof typeof LICENSE_LINKS} />\n );\n items.push(<>License: {licenseLink}</>);\n }\n\n if (registry) {\n const registryLink = (\n <ExternalLink href={registry}>\n {new URL(registry).hostname}\n </ExternalLink>\n );\n items.push(<>Registry: {registryLink}</>);\n }\n\n return items.slice(0, 5).map((detail: string | ReactNode, i: number) => (\n <ListItem key={`detail-${i}`} listStyleType=\"none\" my={1}>\n <Text color=\"gray.600\">{detail}</Text>\n </ListItem>\n ));\n }, [metadata, assembly, linksConfig]);\n return <UnorderedList ml={0}>{detailItems}</UnorderedList>;\n};\n","import { Box, Flex, Link } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent } from \"react\";\nimport { PackageLinksConfig } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { DependencyDropdown } from \"../DependencyDropdown\";\nimport { Details } from \"./Details\";\n\nexport interface OperatorAreaProps {\n assembly?: Assembly;\n linksConfig?: PackageLinksConfig[];\n metadata: Metadata;\n}\n\nexport const OperatorArea: FunctionComponent<OperatorAreaProps> = ({\n assembly,\n linksConfig,\n metadata,\n}) => {\n return (\n <Flex direction=\"column\" textAlign={{ base: \"center\", md: \"initial\" }}>\n <Link\n color=\"blue.500\"\n fontSize=\"sm\"\n href={`mailto:abuse@amazonaws.com?subject=${encodeURIComponent(\n `ConstructHub - Report of abusive package: ${assembly?.name}`\n )}`}\n m={2}\n textAlign={{ base: \"center\", md: \"right\" }}\n >\n Report this Package\n </Link>\n <Details\n assembly={assembly}\n linksConfig={linksConfig}\n metadata={metadata}\n />\n {assembly?.dependencies && (\n <Box mt={4}>\n <DependencyDropdown dependencies={assembly.dependencies} />\n </Box>\n )}\n </Flex>\n );\n};\n","import { Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { PackageTag } from \"../../../../components/PackageTag\";\nimport { KEYWORD_IGNORE_LIST } from \"../../../../constants/keywords\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\nexport interface PackageHeaderProps {\n title: string;\n description: string;\n tags: string[];\n version: string;\n}\n\nexport const PackageHeader: FunctionComponent<PackageHeaderProps> = ({\n description,\n tags,\n title,\n version,\n}) => {\n const [currentLanguage] = useLanguage();\n return (\n <Flex\n direction=\"column\"\n maxWidth=\"100%\"\n overflowX=\"hidden\"\n p={2}\n textAlign={{ base: \"center\", md: \"initial\" }}\n >\n <Stack\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n justify={{ base: \"center\", md: \"start\" }}\n mb={4}\n spacing={4}\n >\n <Heading wordBreak=\"break-word\">{title}</Heading>\n <Text color=\"blue.500\" fontSize=\"md\">\n {version}\n </Text>\n </Stack>\n\n <Text wordBreak=\"break-word\">{description}</Text>\n {!!tags.length && (\n <Flex\n direction=\"row\"\n justify={{ base: \"center\", md: \"initial\" }}\n mt={3}\n >\n {title.startsWith(\"@aws-cdk/\") ? (\n <PackageTag\n key=\"official\"\n label=\"official\"\n language={currentLanguage}\n mr={2}\n value=\"@aws-cdk\"\n variant=\"official\"\n >\n Official\n </PackageTag>\n ) : null}\n {tags\n .filter((v) => Boolean(v) && !KEYWORD_IGNORE_LIST.has(v))\n .slice(0, 3)\n .map((tag) => (\n <PackageTag\n key={tag}\n language={currentLanguage}\n mr={2}\n value={tag}\n >\n {tag}\n </PackageTag>\n ))}\n </Flex>\n )}\n </Flex>\n );\n};\n","import { CheckIcon, CloseIcon, CopyIcon } from \"@chakra-ui/icons\";\nimport {\n Code,\n Flex,\n IconButton,\n Popover,\n PopoverBody,\n PopoverContent,\n PopoverHeader,\n PopoverTrigger,\n Text,\n useClipboard,\n useDisclosure,\n useMediaQuery,\n useToken,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent, ReactNode, useRef } from \"react\";\nimport { createTestIds } from \"../../util/createTestIds\";\n\nconst iconButtonProps = {\n borderRadius: \"md\",\n color: \"white\",\n variant: \"link\",\n};\n\nconst iconProps = {\n h: 4,\n w: 4,\n};\n\nexport const testIds = createTestIds(\"code-popover\", [\n \"close\",\n \"content\",\n \"code\",\n \"copy\",\n \"header\",\n \"trigger\",\n] as const);\n\nexport interface CodePopoverProps {\n code: string;\n header: string;\n trigger: ReactNode;\n}\n\nexport const CodePopover: FunctionComponent<CodePopoverProps> = ({\n code,\n header,\n trigger,\n}) => {\n const { hasCopied, onCopy } = useClipboard(code);\n const disclosure = useDisclosure();\n const focusRef = useRef<HTMLButtonElement>(null);\n const mdBreakpoint = useToken(\"breakpoints\", \"md\");\n const [isMd] = useMediaQuery(`(min-width: ${mdBreakpoint})`);\n\n return (\n <Popover\n initialFocusRef={focusRef}\n isLazy\n placement={isMd ? \"bottom-end\" : \"bottom\"}\n {...disclosure}\n >\n <PopoverTrigger>{trigger}</PopoverTrigger>\n <PopoverContent bg=\"blue.500\" data-testid={testIds.content}>\n <PopoverHeader\n align=\"center\"\n as={Flex}\n color=\"white\"\n data-testid={testIds.header}\n justify=\"space-between\"\n pr={0}\n >\n <Text>{header}</Text>\n <Flex align=\"center\">\n <IconButton\n aria-label=\"copy-text-icon\"\n data-testid={testIds.copy}\n icon={\n hasCopied ? (\n <CheckIcon {...iconProps} color=\"green.200\" />\n ) : (\n <CopyIcon {...iconProps} />\n )\n }\n onClick={onCopy}\n ref={focusRef}\n {...iconButtonProps}\n />\n <IconButton\n aria-label=\"close-icon\"\n data-testid={testIds.close}\n icon={<CloseIcon h={3} w={3} />}\n onClick={disclosure.onClose}\n {...iconButtonProps}\n />\n </Flex>\n </PopoverHeader>\n <PopoverBody\n as={Code}\n bg=\"gray.100\"\n borderTopLeftRadius=\"0\"\n borderTopRightRadius=\"0\"\n color=\"gray.800\"\n data-testid={testIds.code}\n overflow=\"auto\"\n variant=\"code-block\"\n >\n {code}\n </PopoverBody>\n </PopoverContent>\n </Popover>\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport { Button, ButtonProps, forwardRef } from \"@chakra-ui/react\";\nimport { testIds } from \"./CodePopover\";\n\nexport interface CodePopoverTriggerProps extends ButtonProps {}\n\n/**\n * A default trigger button for the code popover\n */\nexport const CodePopoverTrigger = forwardRef<CodePopoverTriggerProps, \"button\">(\n (props, ref) => (\n <Button\n color=\"white\"\n colorScheme=\"blue\"\n data-testid={testIds.trigger}\n ref={ref}\n rightIcon={<ChevronDownIcon h={5} w={5} />}\n {...props}\n >\n {props.children}\n </Button>\n )\n);\n\nCodePopoverTrigger.displayName = \"CodePopoverTrigger\";\n","import type { Assembly } from \"@jsii/spec\";\nimport type { FunctionComponent } from \"react\";\nimport {\n CodePopover,\n CodePopoverTrigger,\n} from \"../../../../components/CodePopover\";\nimport { LANGUAGE_NAME_MAP, Language } from \"../../../../constants/languages\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\n// TODO: We'll probably want to get this from BE as we add more languages, however this should do the trick for now...\nconst getCodeSample = ({\n language,\n assembly,\n}: {\n language: Language;\n assembly: Assembly;\n}): string | undefined => {\n const version = assembly.version;\n if (language === Language.TypeScript) {\n const packageName = assembly.name;\n return `npm install ${packageName}@${version}`;\n } else if (language === Language.Python) {\n const packageName = assembly.targets?.python?.distName;\n if (!packageName) {\n return undefined;\n }\n return `pip install ${packageName}==${version}`;\n } else if (language === Language.Java) {\n const groupId = assembly.targets?.java?.maven?.groupId;\n const artifactId = assembly.targets?.java?.maven?.artifactId;\n if (!groupId || !artifactId) return undefined;\n return [\n \"// add this to your pom.xml\",\n \"<dependency>\",\n ` <groupId>${groupId}</groupId>`,\n ` <artifactId>${artifactId}</artifactId>`,\n ` <version>${version}</version>`,\n \"</dependency>\",\n ].join(\"\\n\");\n }\n\n return undefined;\n};\n\nexport interface UseConstructProps {\n assembly: Assembly;\n}\n\nexport const UseConstruct: FunctionComponent<UseConstructProps> = ({\n assembly,\n}) => {\n const [language] = useLanguage();\n\n const header = LANGUAGE_NAME_MAP[language];\n const code = getCodeSample({ language, assembly });\n\n const isDisabled = !code;\n const label = !isDisabled ? \"Install\" : \"Unsupported\";\n\n const trigger = (\n <CodePopoverTrigger disabled={isDisabled}>{label}</CodePopoverTrigger>\n );\n\n return <CodePopover code={code ?? \"\"} header={header} trigger={trigger} />;\n};\n","import { Center, Divider, Flex, Grid, Spinner, Stack } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent } from \"react\";\nimport { Config } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { Card } from \"../../../../components/Card\";\nimport type { UseRequestResponse } from \"../../../../hooks/useRequest\";\nimport { LanguageSelection } from \"../LanguageSelection\";\nimport { OperatorArea } from \"../OperatorArea\";\nimport { PackageHeader } from \"../PackageHeader\";\nimport { UseConstruct } from \"../UseConstruct\";\n\ninterface PackageDetailsProps {\n config: UseRequestResponse<Config>;\n assembly: UseRequestResponse<Assembly>;\n metadata: UseRequestResponse<Metadata>;\n version: string;\n}\n\n/**\n * Renders the header section of a package. This includes\n * the Getting Started, Operator Area, and Publisher Area sections\n */\nexport const PackageDetails: FunctionComponent<PackageDetailsProps> = ({\n assembly,\n config,\n metadata,\n version,\n}) => {\n const isLoading = assembly.loading || metadata.loading;\n\n if (isLoading || !assembly.data || !metadata.data) {\n return (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n return (\n <Flex as={Card} direction=\"column\">\n <Grid\n gap={4}\n overflow=\"hidden\"\n templateColumns={{ base: \"1fr\", md: \"3fr auto 2fr\" }}\n templateRows=\"auto\"\n >\n <PackageHeader\n description={assembly.data.description}\n tags={assembly.data.keywords ?? []}\n title={assembly.data.name}\n version={version}\n />\n <Divider\n display={{ base: \"none\", md: \"initial\" }}\n orientation=\"vertical\"\n />\n <Divider\n display={{ base: \"initial\", md: \"none\" }}\n orientation=\"horizontal\"\n />\n {config.loading ? (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\n ) : (\n <OperatorArea\n assembly={assembly.data}\n linksConfig={config.data?.packageLinks}\n metadata={metadata.data}\n />\n )}\n </Grid>\n <Stack\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n justify={{ base: \"center\", md: \"space-between\" }}\n px={2}\n py={4}\n spacing={4}\n >\n <LanguageSelection assembly={assembly.data} />\n <UseConstruct assembly={assembly.data} />\n </Stack>\n </Flex>\n );\n};\n","import { ChevronDownIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Box, Flex, Link, IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport { FunctionComponent, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface NavItemConfig {\n children?: NavItemConfig[];\n display: string;\n url: string;\n}\n\nexport interface NavItemProps extends NavItemConfig {\n // The following props don't need to be explicitly defined - they are passed internally\n onOpen?: () => void;\n}\n\nexport interface NavTreeProps {\n /**\n * Items to render\n */\n items: NavItemConfig[];\n}\n\nconst iconProps = {\n color: \"gray.900\",\n h: 4,\n w: 4,\n};\n\nexport const NavItem: FunctionComponent<NavItemProps> = ({\n children,\n display,\n url,\n onOpen,\n}) => {\n const { pathname, hash } = useLocation();\n const isHashUrl = url.startsWith(\"#\");\n const linkIsActive = isHashUrl ? hash === url : pathname === url;\n const disclosure = useDisclosure({ onOpen, defaultIsOpen: true });\n\n const showToggle = (children?.length ?? 0) > 0;\n const showChildren = disclosure.isOpen && showToggle;\n\n const LinkComponent = isHashUrl ? Link : NavLink;\n\n const nestedItems = useMemo(\n () =>\n children?.map((item, idx) => {\n return <NavItem {...item} key={idx} onOpen={disclosure.onOpen} />;\n }),\n [children, disclosure.onOpen]\n );\n\n return (\n <Flex direction=\"column\">\n <Flex align=\"center\" color={linkIsActive ? \"blue.500\" : \"gray.800\"}>\n {showToggle && (\n <IconButton\n aria-label=\"expand-toggle\"\n borderRadius=\"md\"\n h={4}\n icon={\n disclosure.isOpen ? (\n <ChevronDownIcon {...iconProps} />\n ) : (\n <ChevronRightIcon {...iconProps} />\n )\n }\n ml={-1}\n onClick={disclosure.onToggle}\n size=\"xs\"\n variant=\"link\"\n w={4}\n />\n )}\n <LinkComponent\n _hover={{ bg: \"rgba(0, 124, 253, 0.05)\" }}\n href={url}\n overflow=\"hidden\"\n pl={showToggle ? 1 : 2}\n py={1.5}\n textOverflow=\"ellipsis\"\n title={display}\n to={url}\n w=\"100%\"\n whiteSpace=\"nowrap\"\n >\n {display}\n </LinkComponent>\n </Flex>\n <Box\n _before={{\n // Creates a border without taking up any box space\n // This is important to keep items perfectly aligned\n bg: \"gray.100\",\n bottom: 0,\n content: `\"\"`,\n left: 0,\n position: \"absolute\",\n top: 0,\n w: \"1px\",\n }}\n display={showChildren ? \"initial\" : \"none\"}\n ml={2}\n pl={2}\n position=\"relative\"\n >\n {nestedItems}\n </Box>\n </Flex>\n );\n};\n\nexport const NavTree: FunctionComponent<NavTreeProps> = ({ items }) => {\n return (\n <Flex direction=\"column\" maxWidth=\"100%\">\n {items.map((item, idx) => {\n return <NavItem {...item} key={idx} onOpen={undefined} />;\n })}\n </Flex>\n );\n};\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport {\n InputGroup,\n InputLeftElement,\n Input,\n forwardRef,\n} from \"@chakra-ui/react\";\nimport { FormEventHandler, useState } from \"react\";\nimport { Form } from \"../../../../components/Form\";\nimport { useDebounce } from \"../../../../hooks/useDebounce\";\n\nexport interface SearchInputProps {\n value: string;\n onChange: (s: string) => void;\n onSubmit: FormEventHandler<HTMLFormElement>;\n}\n\nexport const SearchInput = forwardRef<SearchInputProps, \"input\">(\n ({ value, onChange, onSubmit }, inputRef) => {\n const [inputValue, setInputValue] = useState(value);\n\n useDebounce(inputValue, { onChange });\n\n return (\n <Form data-testid=\"choose-submodule-search-form\" onSubmit={onSubmit}>\n <InputGroup>\n <InputLeftElement>\n <SearchIcon color=\"gray.400\" />\n </InputLeftElement>\n <Input\n data-testid=\"choose-submodule-search-input\"\n onChange={(e) => setInputValue(e.target.value)}\n placeholder=\"Search\"\n ref={inputRef}\n value={inputValue}\n variant=\"filled\"\n />\n </InputGroup>\n </Form>\n );\n }\n);\n\nSearchInput.displayName = \"SearchInput\";\n","import {\n Box,\n Divider,\n Modal,\n ModalHeader,\n ModalContent,\n ModalCloseButton,\n ModalBody,\n ModalOverlay,\n UnorderedList,\n} from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n useCallback,\n useRef,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { SearchItem } from \"../../../../components/SearchItem\";\nimport { SearchInput } from \"./SearchInput\";\n\nexport interface SearchModalProps {\n inputValue: string;\n isOpen: boolean;\n onClose: () => void;\n onInputChange: (s: string) => void;\n submodules: { name: string; to: string }[];\n}\n\nexport const SearchModal: FunctionComponent<SearchModalProps> = ({\n inputValue,\n isOpen,\n onClose,\n onInputChange,\n submodules,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { push } = useHistory();\n\n const navigate = useCallback(\n (to: string) => {\n onClose();\n push(to);\n },\n [onClose, push]\n );\n\n const onSubmit = useCallback<FormEventHandler<HTMLFormElement>>(\n (e) => {\n e.preventDefault();\n\n if (!submodules.length) return;\n const { to } = submodules[0];\n navigate(to);\n },\n [navigate, submodules]\n );\n\n return (\n <Modal initialFocusRef={inputRef} isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent mx={4}>\n <ModalCloseButton data-testid=\"choose-submodule-modal-close\" />\n <ModalHeader\n data-testid=\"choose-submodule-modal-header\"\n fontSize=\"lg\"\n fontWeight=\"bold\"\n >\n Choose a submodule\n </ModalHeader>\n <ModalBody data-testid=\"choose-submodule-modal-body\" p={0}>\n <Box pb={4} px={4}>\n <SearchInput\n onChange={onInputChange}\n onSubmit={onSubmit}\n ref={inputRef}\n value={inputValue}\n />\n </Box>\n <Divider />\n <UnorderedList\n data-testid=\"choose-submodule-modal-results\"\n m={0}\n maxH=\"50vh\"\n overflow=\"hidden auto\"\n p={0}\n role=\"listbox\"\n tabIndex={-1}\n >\n {submodules.map(({ name, to }) => (\n <SearchItem\n data-testid=\"choose-submodule-result\"\n key={name}\n name={name}\n onClick={() => navigate(to)}\n />\n ))}\n </UnorderedList>\n </ModalBody>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n );\n};\n","import { ArrowBackIcon, ChevronDownIcon } from \"@chakra-ui/icons\";\nimport { Button, Divider, Stack, useDisclosure } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent, useCallback, useMemo, useState } from \"react\";\nimport { useHistory, useLocation } from \"react-router-dom\";\nimport { QUERY_PARAMS } from \"../../../../constants/url\";\nimport { useQueryParams } from \"../../../../hooks/useQueryParams\";\nimport { SearchModal } from \"./SearchModal\";\n\nexport interface ChooseSubmoduleProps {\n assembly?: Assembly;\n}\n\nexport const ChooseSubmodule: FunctionComponent<ChooseSubmoduleProps> = ({\n assembly,\n}) => {\n const { pathname } = useLocation();\n const { push } = useHistory();\n const query = useQueryParams();\n\n const allSubmodules = Object.keys(assembly?.submodules ?? {});\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n const currentSubmodule = query.get(QUERY_PARAMS.SUBMODULE);\n const submoduleText = currentSubmodule\n ? `Submodule: ${currentSubmodule}`\n : \"Choose Submodule\";\n\n const [filter, setFilter] = useState(\"\");\n\n const onGoBack = () => {\n const lang = query.get(QUERY_PARAMS.LANGUAGE);\n push(`${pathname}${lang ? `?${QUERY_PARAMS.LANGUAGE}=${lang}` : \"\"}`);\n };\n\n const getUrl = useCallback(\n (submoduleName: string) => {\n const params = new URLSearchParams(query.toString());\n params.set(\"submodule\", submoduleName);\n return `${pathname}?${params}`;\n },\n [pathname, query]\n );\n\n const submodules = useMemo(() => {\n let results = allSubmodules;\n\n if (filter) {\n results = results.filter((fqn) =>\n fqn.toLowerCase().includes(filter.toLowerCase())\n );\n }\n\n return results.map((fqn) => {\n const name = fqn.split(\".\")[1];\n return {\n name,\n to: getUrl(name),\n };\n });\n }, [allSubmodules, filter, getUrl]);\n\n if (allSubmodules.length === 0) {\n return null;\n }\n\n return (\n <Stack spacing={4} w=\"100%\">\n {currentSubmodule && (\n <>\n <Button\n borderRadius=\"none\"\n data-testid=\"choose-submodule-go-back\"\n leftIcon={<ArrowBackIcon aria-label=\"Back to construct root\" />}\n onClick={onGoBack}\n title=\"Back to construct root\"\n variant=\"link\"\n >\n {assembly?.name}\n </Button>\n <Divider />\n </>\n )}\n <Button\n borderRadius=\"none\"\n color=\"blue.500\"\n data-testid=\"choose-submodule-search-trigger\"\n flexGrow={1}\n onClick={onOpen}\n rightIcon={<ChevronDownIcon />}\n title=\"Choose Submodule\"\n variant=\"link\"\n >\n {submoduleText}\n </Button>\n <SearchModal\n inputValue={filter}\n isOpen={isOpen}\n onClose={onClose}\n onInputChange={setFilter}\n submodules={submodules}\n />\n </Stack>\n );\n};\n","import { Box, Flex, Grid } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { useState, useEffect, FunctionComponent, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { Markdown } from \"../../../../components/Markdown\";\nimport { NavTree, NavItemConfig } from \"../../../../components/NavTree\";\nimport { ChooseSubmodule } from \"../ChooseSubmodule\";\n\nexport interface PackageDocsProps {\n markdown: string;\n assembly: Assembly;\n}\n\ntype Item = NavItemConfig & { level: number; children: Item[] };\n\nexport const appendItem = (itemTree: Item[], item: Element): Item[] => {\n if (!(item instanceof HTMLElement)) {\n return itemTree;\n }\n\n const { headingId, headingLevel = \"100\" } = item.dataset;\n const { innerText } = item;\n const level = parseInt(headingLevel);\n\n // Don't create nav items for items with no title / url\n if (level > 3 || !innerText || !headingId) {\n return itemTree;\n }\n\n const last = itemTree[itemTree.length - 1];\n\n if (last == null || last.level >= level) {\n return [\n ...itemTree,\n {\n display: innerText,\n url: `#${headingId}`,\n level,\n children: [],\n },\n ];\n } else {\n last.children = appendItem(last.children, item);\n return itemTree;\n }\n};\n\n// We want the nav to be sticky, but it should account for the sticky heading as well, which is 72px\nconst TOP_OFFSET = \"4.5rem\";\n\nexport const PackageDocs: FunctionComponent<PackageDocsProps> = ({\n markdown: source,\n assembly,\n}) => {\n const [navItems, setNavItems] = useState<Item[]>([]);\n\n useEffect(() => {\n const tree = [\n ...document.querySelectorAll(\n `[data-heading-id][data-heading-title][data-heading-level]`\n ),\n ].reduce(appendItem, []);\n\n setNavItems(tree);\n }, [source]);\n\n const { hash } = useLocation();\n useEffect(() => {\n if (hash) {\n const target = document.querySelector(`${hash}`) as HTMLElement;\n target?.scrollIntoView(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [source]);\n\n const markdown = useMemo(\n () => <Markdown repository={assembly.repository}>{source}</Markdown>,\n [assembly.repository, source]\n );\n\n return (\n <Grid\n bg=\"white\"\n columnGap={4}\n h=\"100%\"\n templateColumns={{ base: \"1fr\", md: \"1fr 3fr\" }}\n width=\"100%\"\n >\n <Flex\n alignSelf=\"stretch\"\n borderRight=\"1px solid\"\n borderRightColor=\"blue.50\"\n direction=\"column\"\n display={{ base: \"none\", md: \"flex\" }}\n maxHeight={`calc(100vh - ${TOP_OFFSET})`}\n overflow=\"hidden auto\"\n position=\"sticky\"\n px={4}\n top={TOP_OFFSET}\n >\n {Object.keys(assembly?.submodules ?? {}).length > 0 && (\n <Flex\n borderBottom=\"1px solid\"\n borderColor=\"blue.50\"\n justify=\"center\"\n py={4}\n >\n <ChooseSubmodule assembly={assembly} />\n </Flex>\n )}\n <Box overflowY=\"auto\" py={4}>\n <NavTree items={navItems} />\n </Box>\n </Flex>\n <Box\n h=\"max-content\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n py={4}\n sx={{\n a: {\n scrollMarginTop: TOP_OFFSET,\n },\n }}\n >\n {markdown}\n </Box>\n </Grid>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../../../../components/ExternalLink\";\nimport { Language } from \"../../../../constants/languages\";\n\nexport interface PackageDocsErrorProps {\n readonly language: Language;\n}\n\nexport const PackageDocsError: FunctionComponent<PackageDocsErrorProps> = ({\n language,\n}) => {\n const issueLink = (\n <ExternalLink href=\"https://github.com/cdklabs/construct-hub-webapp/issues/new\">\n issue\n </ExternalLink>\n );\n return (\n <Text\n align=\"center\"\n fontSize=\"xl\"\n fontStyle=\"oblique\"\n px={4}\n wordBreak=\"break-word\"\n >\n Documentation in {language} is still not ready for this package. Come back\n soon. If this issue persists, please let us know by creating an{\" \"}\n {issueLink}.\n </Text>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Language, LANGUAGE_NAME_MAP } from \"../../../../constants/languages\";\n\nexport interface PackageDocsUnsupportedProps {\n readonly language: Language;\n}\n\nexport const PackageDocsUnsupported: FunctionComponent<PackageDocsUnsupportedProps> =\n ({ language }) => {\n const languageName = LANGUAGE_NAME_MAP[language];\n return (\n <Text\n align=\"center\"\n fontSize=\"xl\"\n fontStyle=\"oblique\"\n px={4}\n wordBreak=\"break-word\"\n >\n This package does not currently support {languageName}. Select one of\n the supported languages above, or ask the author to add support for{\" \"}\n {languageName} in a future release.\n </Text>\n );\n };\n","import { Box, Center, Spinner, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { fetchAssembly } from \"../../api/package/assembly\";\nimport { fetchMarkdown } from \"../../api/package/docs\";\nimport { fetchMetadata } from \"../../api/package/metadata\";\nimport { Page } from \"../../components/Page\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useConfig } from \"../../contexts/Config\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { useRequest } from \"../../hooks/useRequest\";\nimport { NotFound } from \"../NotFound\";\nimport { PackageDetails } from \"./components/PackageDetails\";\nimport { PackageDocs } from \"./components/PackageDocs\";\nimport { PackageDocsError } from \"./components/PackageDocsError\";\nimport { PackageDocsUnsupported } from \"./components/PackageDocsUnsupported/PackageDocsUnsupported\";\n\ninterface PathParams {\n name: string;\n scope?: string;\n version: string;\n}\n\nexport const Package: FunctionComponent = () => {\n const { name, scope, version }: PathParams = useParams();\n const [requestMarkdown, markdownResponse] = useRequest(fetchMarkdown);\n const [requestAssembly, assemblyResponse] = useRequest(fetchAssembly);\n const [requestMetadata, metadataResponse] = useRequest(fetchMetadata);\n const configResponse = useConfig();\n\n const q = useQueryParams();\n const [language] = useLanguage();\n const submodule = q.get(QUERY_PARAMS.SUBMODULE) ?? \"\";\n\n const pageTitle = `${scope ? `${scope}/${name}` : name} ${version}`;\n\n const pageDescription = assemblyResponse?.data?.description ?? \"\";\n\n useEffect(() => {\n void requestMetadata(name, version, scope);\n void requestAssembly(name, version, scope);\n }, [name, requestAssembly, requestMetadata, scope, version]);\n\n useEffect(() => {\n void requestMarkdown(name, version, language, scope, submodule);\n }, [name, scope, version, language, submodule, requestMarkdown]);\n\n // Handle missing JSON for assembly\n if (assemblyResponse.error) {\n return <NotFound />;\n }\n\n const hasError = markdownResponse.error || assemblyResponse.error;\n const hasDocs =\n !markdownResponse.loading &&\n !assemblyResponse.loading &&\n markdownResponse.data &&\n assemblyResponse.data;\n // This will also be true if it cannot be verified (assembly not there)\n const isSupported =\n language === Language.TypeScript ||\n assemblyResponse.loading ||\n assemblyResponse.error ||\n assemblyResponse.data?.targets?.[language.toString()] != null;\n const isLoadingDocs =\n !metadataResponse.loading &&\n (assemblyResponse.loading || markdownResponse.loading);\n\n return (\n <Page\n meta={{ title: pageTitle, description: pageDescription }}\n pageName=\"packageProfile\"\n >\n <Stack maxW=\"100vw\" pt={4} spacing={4}>\n {/* Operator Area */}\n <Box px={4}>\n <PackageDetails\n assembly={assemblyResponse}\n config={configResponse}\n metadata={metadataResponse}\n version={version}\n />\n </Box>\n {/* Readme and Api Reference Area */}\n {isSupported ? (\n hasError ? (\n <PackageDocsError language={language}></PackageDocsError>\n ) : isLoadingDocs ? (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\n ) : (\n hasDocs && (\n <PackageDocs\n assembly={assemblyResponse.data!}\n markdown={markdownResponse.data!}\n />\n )\n )\n ) : (\n <PackageDocsUnsupported language={language}></PackageDocsUnsupported>\n )}\n </Stack>\n </Page>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Redirect, useParams } from \"react-router-dom\";\nimport { Packages } from \"../../api/package/packages\";\nimport { getFullPackageName, findPackage } from \"../../api/package/util\";\nimport { useCatalog } from \"../../contexts/Catalog\";\nimport NotFound from \"../NotFound\";\n\ninterface RouteParams {\n name: string;\n scope?: string;\n}\n\nexport const buildRedirectUrl = (\n catalog: Packages,\n name: string,\n scope?: string\n) => {\n const prefix = \"/packages/\";\n const packageName = getFullPackageName(name, scope);\n const pkg = findPackage(catalog, packageName);\n\n if (!pkg) {\n return undefined;\n }\n\n const { version } = pkg;\n const suffix = `/v/${version}`;\n return `${prefix}${packageName}${suffix}`;\n};\n\nexport const PackageLatest: FunctionComponent = () => {\n const { name, scope }: RouteParams = useParams();\n const catalog = useCatalog();\n\n if (catalog.loading || !catalog.data) {\n return (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const url = buildRedirectUrl(catalog.data, name, scope);\n\n return url ? <Redirect to={url} /> : <NotFound />;\n};\n","import type { FunctionComponent } from \"react\";\nimport { Switch, Route, useRouteMatch } from \"react-router-dom\";\nimport { NotFound } from \"../NotFound\";\nimport { Package } from \"../Package\";\nimport { PackageLatest } from \"../PackageLatest\";\n\nconst nameRegexp = \"[^@\\\\/]+\";\nconst scopeRegexp = \"@[^\\\\/]+\";\n\nexport const Packages: FunctionComponent = () => {\n const { path } = useRouteMatch();\n\n return (\n <Switch>\n <Route\n exact\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})`}\n >\n <PackageLatest />\n </Route>\n <Route\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})/v/:version`}\n >\n <Package />\n </Route>\n <Route path=\"*\">\n <NotFound />\n </Route>\n </Switch>\n );\n};\n"],"sourceRoot":""}
|
1
|
+
{"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","hooks/useQueryParams/useQueryParams.ts","hooks/useLanguage/useLanguage.ts","constants/keywords.ts","api/package/util.ts","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageTag/PackageTag.tsx","components/Time/Time.tsx","components/Picture/Picture.tsx","views/NotFound/NotFound.tsx","components/Markdown/Markdown.tsx","components/Markdown/Hr.tsx","components/Markdown/Img.tsx","components/Markdown/List.tsx","components/Markdown/Table.tsx","components/Markdown/testIds.ts","components/Markdown/Text.tsx","components/CopyButton/CopyButton.tsx","components/Code/MultiLineRenderer.tsx","components/Code/SingleLineRenderer.tsx","components/Code/Code.tsx","components/Markdown/Code.tsx","components/Markdown/Headings.tsx","util/sanitize-anchor.ts","api/package/assembly.ts","api/package/docs.ts","api/package/metadata.ts","components/LanguageBar/LanguageBar.tsx","views/Package/components/LanguageSelection/LanguageSelection.tsx","views/Package/components/DependencyDropdown/DependencyDropdown.tsx","components/LicenseLink/constants.ts","components/LicenseLink/LicenseLink.tsx","views/Package/components/OperatorArea/Details.tsx","views/Package/components/OperatorArea/OperatorArea.tsx","views/Package/components/PackageHeader/PackageHeader.tsx","components/CodePopover/CodePopover.tsx","components/CodePopover/CodePopoverTrigger.tsx","views/Package/components/UseConstruct/UseConstruct.tsx","views/Package/components/PackageDetails/PackageDetails.tsx","components/NavTree/NavTree.tsx","views/Package/components/ChooseSubmodule/SearchInput.tsx","views/Package/components/ChooseSubmodule/SearchModal.tsx","views/Package/components/ChooseSubmodule/ChooseSubmodule.tsx","views/Package/components/PackageDocs/PackageDocs.tsx","views/Package/components/PackageDocsError/PackageDocsError.tsx","views/Package/components/PackageDocsUnsupported/PackageDocsUnsupported.tsx","views/Package/Package.tsx","views/PackageLatest/PackageLatest.tsx","views/Packages/Packages.tsx"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","useQueryParams","useLocation","useMemo","URLSearchParams","defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","has","getInitialLang","langFromParams","storedLang","localStorage","getItem","useLanguage","options","updateUrl","updateSaved","pathname","hash","useHistory","replace","params","get","QUERY_PARAMS","LANGUAGE","useState","language","setLanguage","set","toString","update","useCallback","val","setItem","KEYWORD_IGNORE_LIST","Set","getFullPackageName","scope","getAssetsPath","version","prefix","API_PATHS","PACKAGES_PREFIX","body","sanitizeVersion","ver","sanitized","startsWith","substring","extractMajor","split","findPackage","catalog","pkg","packages","filter","p","length","sort","p1","p2","mv1","localeCompare","LanguageSupportTooltip","isSupported","langName","LANGUAGE_NAME_MAP","message","hasArrow","label","placement","PackageTag","value","zIndex","tagProps","NavLink","to","getSearchPath","query","_hover","textDecoration","Time","forwardRef","ref","date","formatString","format","boxProps","as","dateTime","toISOString","displayName","Picture","sources","props","map","source","idx","media","srcSet","bgSources","optimal","fallback","NotFound","h","position","w","alt","inset","src","align","direction","justify","Link","colorScheme","components","a","A","blockquote","Blockquote","caption","TableCaption","code","Code","em","Em","h1","Headings","h2","h3","h4","h5","h6","hr","Hr","img","Img","li","Li","ol","Ol","P","pre","Pre","sup","Sup","table","Table","tbody","Tbody","td","Td","tfoot","Tfoot","th","Th","thead","Thead","tr","Tr","ul","Ul","ghSchema","require","attributes","span","concat","rehypePlugins","rehypeRaw","rehypeSanitize","remarkPlugins","remarkGfm","remarkEmoji","GITHUB_REPO_REGEX","Markdown","repoConfig","type","url","match","exec","owner","repo","parseGitHubRepository","repository","toAbsoluteUri","githubPrefix","githubSuffix","ReactMarkdown","uriTransformer","uri","first","includes","Buffer","byteLength","lastIndexOf","join","testIds","container","px","sx","mb","lineHeight","transformImageUri","transformLinkUri","my","display","mr","fontStyle","fontSize","color","maxW","overflowX","variant","createTestIds","href","linkProps","Component","URL","hostname","window","location","bg","borderLeft","borderLeftColor","borderRadius","wordBreak","fontWeight","undefined","text","Array","isArray","ml","top","CopyButton","btnProps","useClipboard","hasCopied","onCopy","icon","Check","Copy","minW","onClick","MultiLineRenderer","tokens","getLineProps","getTokenProps","py","line","i","key","token","SingleLineRenderer","defaultProps","theme","nightOwlLight","border","boxShadow","className","overflow","style","inline","borderColor","Children","toArray","reduce","accum","child","trim","level","size","marginY","elem","dataElement","DOMParser","parseFromString","ReactDOMServer","renderToStaticMarkup","querySelector","dataset","headingTitle","id","headingId","toLowerCase","isH3OrLarger","mt","fetchAssembly","assemblyPath","ASSEMBLY_SUFFIX","fetch","response","ok","Error","statusText","json","fetchMarkdown","submodule","docsSuffix","markdownPath","expectedContentType","contentType","headers","fetchMetadata","sanitizedVersion","metadataPath","METADATA_SUFFIX","LanguageBar","targetLanguages","selectedLanguage","setSelectedLanguage","spacing","left","right","LANGUAGES","indexOf","isDisabled","isSelected","LangIcon","LANGUAGE_RENDER_MAP","cursor","disabled","height","width","languageSet","LanguageSelection","assembly","targets","Object","keys","target","DependencyDropdown","dependencies","depEntries","entries","Button","leftIcon","rightIcon","ChevronDown","OS_ORG_LINK","LICENSE_LINKS","MIT","LicenseLink","license","ExternalLink","Details","linksConfig","metadata","detailItems","links","username","author","authorUrl","registry","npm","items","publishDate","Date","push","forEach","displayText","packageLinks","link","getRepoUrlAndHost","repoLink","licenseLink","registryLink","slice","detail","listStyleType","OperatorArea","textAlign","base","md","encodeURIComponent","m","PackageHeader","tags","currentLanguage","maxWidth","v","Boolean","tag","iconButtonProps","iconProps","CodePopover","header","trigger","disclosure","useDisclosure","focusRef","useRef","mdBreakpoint","useToken","useMediaQuery","isMd","initialFocusRef","isLazy","Flex","pr","copy","close","Close","onClose","borderTopLeftRadius","borderTopRightRadius","CodePopoverTrigger","UseConstruct","packageName","Python","python","distName","Java","groupId","java","maven","artifactId","getCodeSample","PackageDetails","config","loading","data","Card","gap","templateColumns","templateRows","keywords","orientation","minH","NavItem","onOpen","isHashUrl","linkIsActive","defaultIsOpen","showToggle","showChildren","isOpen","LinkComponent","nestedItems","item","ChevronRight","onToggle","pl","textOverflow","whiteSpace","_before","bottom","NavTree","SearchInput","inputRef","onChange","onSubmit","inputValue","setInputValue","useDebounce","Form","Search","e","placeholder","SearchModal","onInputChange","submodules","navigate","preventDefault","mx","pb","maxH","role","tabIndex","SearchItem","ChooseSubmodule","allSubmodules","currentSubmodule","SUBMODULE","submoduleText","setFilter","getUrl","submoduleName","results","fqn","ArrowBack","flexGrow","appendItem","itemTree","HTMLElement","headingLevel","innerText","parseInt","last","TOP_OFFSET","PackageDocs","markdown","navItems","setNavItems","tree","document","querySelectorAll","scrollIntoView","columnGap","alignSelf","borderRight","borderRightColor","maxHeight","borderBottom","overflowY","scrollMarginTop","PackageDocsError","issueLink","PackageDocsUnsupported","languageName","Package","useParams","useRequest","requestMarkdown","markdownResponse","requestAssembly","assemblyResponse","requestMetadata","metadataResponse","configResponse","useConfig","q","pageTitle","pageDescription","error","hasError","hasDocs","isLoadingDocs","pt","PackageLatest","useCatalog","buildRedirectUrl","nameRegexp","scopeRegexp","Packages","path","useRouteMatch","exact"],"mappings":"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","file":"static/js/7.4fcbd19f.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","export const KEYWORD_IGNORE_LIST = new Set([\n \"aws-cdk\",\n \"aws\",\n \"awscdk\",\n \"cdk-construct\",\n \"cdk\",\n \"construct\",\n \"constructs\",\n]);\n","import { API_PATHS } from \"../../constants/url\";\nimport { CatalogPackage, Packages } from \"./packages\";\n\nexport const getFullPackageName = (name: string, scope?: string) => {\n return scope ? `${scope}/${name}` : name;\n};\n\nexport const getAssetsPath = (\n name: string,\n version: string,\n scope?: string\n) => {\n const prefix = `${API_PATHS.PACKAGES_PREFIX}/`;\n const body = getFullPackageName(name, scope);\n const suffix = `/v${version}`;\n return `${prefix}${body}${suffix}`;\n};\n\nexport const sanitizeVersion = (ver: string) => {\n let sanitized = ver;\n if (sanitized.startsWith(\"~\") || sanitized.startsWith(\"^\")) {\n sanitized = sanitized.substring(1);\n }\n return sanitized;\n};\n\nconst extractMajor = (ver: string) => {\n let sanitized = sanitizeVersion(ver);\n return sanitized.split(\".\")[0];\n};\n\nexport const findPackage = (\n catalog: Packages,\n pkg: string\n): CatalogPackage | undefined => {\n const packages = catalog.packages.filter((p) => p.name === pkg);\n\n if (packages.length > 1) {\n return packages.sort((p1, p2) => {\n const mv1 = extractMajor(p1.version);\n const mv2 = extractMajor(p2.version);\n return mv2.localeCompare(mv1);\n })[0];\n }\n\n return packages[0];\n};\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<LanguageSupportTooltipProps> =\n ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n };\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Language } from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n language?: Language;\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n language,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ query: `${value}`, language })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport interface TimeOptions {\n date: Date;\n format: string;\n}\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {format(date, formatString)}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","import { Box, HTMLChakraProps, forwardRef, Image } from \"@chakra-ui/react\";\n\nexport interface PictureProps extends HTMLChakraProps<\"img\"> {\n alt: string;\n src: string;\n sources?: {\n media?: string;\n srcSet: string;\n }[];\n}\n\nexport const Picture = forwardRef<PictureProps, \"img\">(\n ({ sources, ...props }, ref) => (\n <Box as=\"picture\">\n {sources?.map((source, idx) => (\n <source key={idx} media={source.media} srcSet={source.srcSet} />\n ))}\n <Image ref={ref} {...props} />\n </Box>\n )\n);\n\nPicture.displayName = \"Picture\";\n","import { Button, Center, Flex } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Page } from \"../../components/Page\";\nimport { Picture } from \"../../components/Picture\";\n\nconst bgSources = {\n optimal: [\n { media: \"(max-width:1024px)\", srcSet: \"/assets/404-hive@50.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/404-hive@100.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/404-hive@100.png\" },\n ],\n fallback: \"/assets/404-hive@50.png\",\n};\n\nexport const NotFound: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Not Found\",\n description: \"Oops! The page you were looking for does not exist\",\n }}\n pageName=\"notFound\"\n >\n <Center h=\"100%\" position=\"relative\" w=\"100%\">\n <Picture\n alt=\"\"\n inset={0}\n position=\"absolute\"\n sources={bgSources.optimal}\n src={bgSources.fallback}\n zIndex=\"hide\"\n />\n <Flex align=\"center\" direction=\"column\" justify=\"center\">\n <Picture\n alt=\"404 Image\"\n sources={[{ srcSet: \"/assets/robot.webp\" }]}\n src=\"/assets/robot.png\"\n />\n <Button as={Link} colorScheme=\"blue\" to=\"/\">\n Take Me Home\n </Button>\n </Flex>\n </Center>\n </Page>\n );\n};\n","import { Box } from \"@chakra-ui/react\";\nimport { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent } from \"react\";\nimport ReactMarkdown, {\n PluggableList,\n ReactMarkdownOptions,\n} from \"react-markdown\";\nimport type { TableCellComponent } from \"react-markdown/src/ast-to-react\";\nimport rehypeRaw from \"rehype-raw\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport remarkEmoji from \"remark-emoji\";\nimport remarkGfm from \"remark-gfm\";\nimport { Code } from \"./Code\";\nimport { Headings } from \"./Headings\";\nimport { Hr } from \"./Hr\";\nimport { Img } from \"./Img\";\nimport { Ul, Ol, Li } from \"./List\";\nimport { Table, Thead, Tbody, Tfoot, Tr, Th, Td, TableCaption } from \"./Table\";\nimport testIds from \"./testIds\";\nimport { A, Blockquote, Em, P, Pre, Sup } from \"./Text\";\n\nconst ONE_MEGABYTE = 1024 * 1024;\n\nconst components: ReactMarkdownOptions[\"components\"] = {\n a: A,\n blockquote: Blockquote,\n caption: TableCaption,\n code: Code,\n em: Em,\n h1: Headings,\n h2: Headings,\n h3: Headings,\n h4: Headings,\n h5: Headings,\n h6: Headings,\n hr: Hr,\n img: Img,\n li: Li,\n ol: Ol,\n p: P,\n pre: Pre,\n sup: Sup,\n table: Table,\n tbody: Tbody,\n td: Td as TableCellComponent, // The react-markdown component has a tighter signature than the one from @chakra-ui\n tfoot: Tfoot,\n th: Th as TableCellComponent, // The react-markdown component has a tighter signature than the one from @chakra-ui\n thead: Thead,\n tr: Tr,\n ul: Ul,\n};\n\n// see https://github.com/rehypejs/rehype-sanitize#use\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nvar ghSchema = require(\"hast-util-sanitize/lib/github\");\n\n// jsii-docgen adds these attributes to <span> elements embedded inside\n// headings in order to configure custom anchor ids.\n// tell rehype not to strip those out.\nghSchema.attributes.span = (ghSchema.attributes.span ?? []).concat([\n \"dataHeadingTitle\",\n \"dataHeadingId\",\n]);\n\n// Note - the default schema for rehypeSanitize is GitHub-style, which is what we need!\nconst rehypePlugins: PluggableList = [\n [rehypeRaw],\n // ALWAYS keep rehypeSanitize LAST!\n [rehypeSanitize, ghSchema],\n];\nconst remarkPlugins = [remarkGfm, remarkEmoji];\n\nconst GITHUB_REPO_REGEX =\n /^(?:(?:git@)?github\\.com:|(?:https?:\\/\\/)github\\.com\\/)([^/]+)\\/([^/]+)(?:\\.git)?$/;\n\n/**\n * Parses out a GitHub repository owner and repo name from the `repository`\n * configuration of a jsii Assembly.\n *\n * @returns the `owner` and `repo` for the configured repository, if it looks\n * like a GitHub repository URL.\n */\nconst parseGitHubRepository = ({ type, url }: Assembly[\"repository\"]) => {\n if (type !== \"git\") {\n return undefined;\n }\n // git@github.com:<owner>/<repo>.git\n // https://github.com/<owner>/<repo>.git\n const match = GITHUB_REPO_REGEX.exec(url);\n if (match == null) {\n return undefined;\n }\n\n const [, owner, repo] = match;\n return { owner, repo };\n};\n\nexport const Markdown: FunctionComponent<{\n children: string;\n repository: Assembly[\"repository\"];\n}> = ({ children, repository }) => {\n const repoConfig = parseGitHubRepository(repository);\n\n const toAbsoluteUri = (githubPrefix: string, githubSuffix = \"HEAD\") =>\n repoConfig == null\n ? ReactMarkdown.uriTransformer\n : (uri: string) => {\n const url = ReactMarkdown.uriTransformer(uri);\n\n // If this is an anchor or absolute URL, return it.\n const [first] = url;\n if (first === \"#\" || first === \"/\") {\n return url;\n }\n\n // If there is a protocol element, then return the URL as-is.\n if (url.includes(\"://\")) {\n return url;\n }\n\n const owner = repoConfig.owner;\n const repo = repoConfig.repo.replace(/\\.git$/, \"\");\n return `https://${githubPrefix}/${owner}/${repo}/${githubSuffix}/${url}`;\n };\n\n const byteLength = Buffer.byteLength(children);\n if (byteLength > ONE_MEGABYTE) {\n children = children.substring(0, children.lastIndexOf(\"# API Reference\"));\n children = [\n children,\n \"# API Reference\",\n \"The API Reference for this package could not be rendered.\",\n \"If this issue persists, please let us know by creating an [issue](https://github.com/cdklabs/construct-hub-webapp/issues/new)\",\n ].join(\"\\n\");\n }\n return (\n <Box\n data-testid={testIds.container}\n px={8}\n sx={{\n \"& > *\": { mb: 8 },\n \"& > p\": { lineHeight: \"taller\" },\n }}\n >\n <ReactMarkdown\n components={components}\n rehypePlugins={rehypePlugins}\n remarkPlugins={remarkPlugins}\n transformImageUri={toAbsoluteUri(\"raw.githubusercontent.com\")}\n transformLinkUri={toAbsoluteUri(\"github.com\", \"blob/HEAD\")}\n >\n {children}\n </ReactMarkdown>\n </Box>\n );\n};\n","import { Divider, DividerProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const Hr: FunctionComponent<DividerProps> = (props) => (\n <Divider my={10} {...props} />\n);\n","import { Image, ImageProps } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nexport const Img: FunctionComponent<ImageProps> = (props) => (\n <Image display=\"inline-block\" {...props} />\n);\n","import { UnorderedList, OrderedList, ListItem } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const Ul: FunctionComponent = ({ children }) => (\n <UnorderedList>{children}</UnorderedList>\n);\n\nexport const Ol: FunctionComponent = ({ children }) => (\n <OrderedList>{children}</OrderedList>\n);\n\nexport const Li: FunctionComponent = ({ children }) => (\n <ListItem\n lineHeight=\"tall\"\n mb={2}\n sx={{\n \"em:first-of-type\": {\n mr: 2,\n fontStyle: \"italic\",\n fontSize: \"small\",\n },\n \"&::marker\": {\n color: \"blue.500\",\n },\n code: {\n fontSize: \"small\",\n },\n }}\n >\n {children}\n </ListItem>\n);\n","import {\n Box,\n Table as ChakraTable,\n Thead,\n Tbody,\n Tfoot,\n Tr,\n Th,\n Td,\n TableCaption,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nconst Table: FunctionComponent = ({ children }) => (\n <Box maxW=\"100%\" overflowX=\"auto\">\n <ChakraTable variant=\"striped\">{children}</ChakraTable>\n </Box>\n);\n\nexport { Table, Tfoot, Tbody, Td, Thead, Tr, Th, TableCaption };\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"markdown\", [\"container\"] as const);\n","import { Box, HTMLChakraProps, Link, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../ExternalLink\";\n\ntype AnchorComponent = FunctionComponent<HTMLChakraProps<\"a\">>;\n\nexport const A: AnchorComponent = ({ children, href, ...linkProps }) => {\n let Component: AnchorComponent = Link;\n\n try {\n if (href && href.startsWith(\"http\")) {\n const hostname = new URL(href).hostname;\n\n if (hostname !== window.location.hostname) {\n const External: AnchorComponent = (props) => (\n <ExternalLink {...props} />\n );\n\n Component = External;\n }\n }\n } catch {\n Component = Link;\n }\n\n return (\n <Component\n color=\"blue.500\"\n href={href}\n // If we are rendering an img within the link (specifically stability banners),\n // do not display the external link Icon\n sx={{ \"> img + svg\": { display: \"none\" } }}\n {...linkProps}\n >\n {children}\n </Component>\n );\n};\n\nexport const Blockquote: FunctionComponent = ({ children }) => (\n <Box\n as=\"blockquote\"\n bg=\"gray.100\"\n borderLeft=\"5px solid\"\n borderLeftColor=\"gray.200\"\n borderRadius=\"md\"\n p={2}\n wordBreak=\"break-word\"\n >\n {children}\n </Box>\n);\n\nexport const Em: FunctionComponent = ({ children }) => (\n <Box as=\"em\" color=\"blue.500\" fontStyle=\"normal\" fontWeight=\"semibold\">\n {children}\n </Box>\n);\n\nexport const P: FunctionComponent = ({ children }) => <Text>{children}</Text>;\n\nexport const Pre: FunctionComponent = ({ children }) => (\n <Box as=\"pre\">{children}</Box>\n);\n\nexport const Sup: FunctionComponent = ({ children }) => {\n let color: string | undefined = undefined;\n let text = \"\";\n\n if (Array.isArray(children)) {\n const [first] = children;\n\n if (typeof first === \"string\") {\n text = first;\n }\n }\n\n if (text === \"Required\") {\n color = \"orange.500\";\n } else if (text === \"Optional\") {\n color = \"green.500\";\n }\n\n return (\n <Box as=\"sup\" color={color} ml={2} top={-1}>\n {children}\n </Box>\n );\n};\n","import { CopyIcon, CheckIcon } from \"@chakra-ui/icons\";\nimport {\n forwardRef,\n IconButton,\n IconButtonProps,\n useClipboard,\n} from \"@chakra-ui/react\";\n\nexport interface CopyButtonProps extends Omit<IconButtonProps, \"aria-label\"> {\n // Optional since we set a default\n \"aria-label\"?: string;\n value: string;\n}\n\nexport const CopyButton = forwardRef<CopyButtonProps, \"button\">(\n ({ value, ...btnProps }, ref) => {\n const { hasCopied, onCopy } = useClipboard(value);\n\n return (\n <IconButton\n aria-label=\"Copy Button\"\n h={6}\n icon={hasCopied ? <CheckIcon color=\"green.300\" /> : <CopyIcon />}\n minW=\"auto\"\n onClick={onCopy}\n ref={ref}\n variant=\"ghost\"\n w={6}\n {...btnProps}\n />\n );\n }\n);\n\nCopyButton.displayName = \"CopyButton\";\n","import { Box, Flex } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { CopyButton } from \"../CopyButton\";\nimport type { RendererProps } from \"./types\";\n\nexport const MultiLineRenderer: FunctionComponent<RendererProps> = ({\n code,\n tokens,\n getLineProps,\n getTokenProps,\n}) => (\n <>\n <Flex\n align=\"center\"\n bg=\"rgba(0, 124, 253, 0.15)\"\n justify=\"flex-end\"\n px={2}\n py={1}\n >\n <CopyButton _hover={{ bg: \"gray.300\" }} color=\"gray.500\" value={code} />\n </Flex>\n <Box maxW=\"100%\" overflowX=\"auto\" p={2}>\n <Box w=\"max-content\">\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line, key: i })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token, key })} />\n ))}\n </div>\n ))}\n </Box>\n </Box>\n </>\n);\n","import { Box, Flex } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { CopyButton } from \"../CopyButton\";\nimport type { RendererProps } from \"./types\";\n\nexport const SingleLineRenderer: FunctionComponent<RendererProps> = ({\n code,\n tokens,\n getLineProps,\n getTokenProps,\n}) => (\n <Flex align=\"center\" justify=\"space-between\" p={2}>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line, key: i })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token, key })} />\n ))}\n </div>\n ))}\n <Box>\n <CopyButton color=\"blue.500\" colorScheme=\"blue\" ml={4} value={code} />\n </Box>\n </Flex>\n);\n","import { Box } from \"@chakra-ui/react\";\nimport Highlight, { defaultProps, Language } from \"prism-react-renderer\";\nimport nightOwlLight from \"prism-react-renderer/themes/nightOwlLight\";\nimport { FunctionComponent } from \"react\";\nimport { MultiLineRenderer } from \"./MultiLineRenderer\";\nimport { SingleLineRenderer } from \"./SingleLineRenderer\";\n\nexport interface CodeProps {\n code: string;\n language: Language;\n}\n\nexport const Code: FunctionComponent<CodeProps> = ({ code, language }) => {\n return (\n <Highlight\n {...defaultProps}\n code={code}\n language={language}\n theme={nightOwlLight}\n >\n {(props) => (\n <Box\n as=\"pre\"\n border=\"base\"\n borderRadius=\"md\"\n boxShadow=\"base\"\n className={props.className}\n maxW=\"100%\"\n overflow=\"hidden\"\n style={props.style}\n w=\"min-content\"\n >\n {props.tokens.length > 1 ? (\n <MultiLineRenderer {...props} code={code} />\n ) : (\n <SingleLineRenderer {...props} code={code} />\n )}\n </Box>\n )}\n </Highlight>\n );\n};\n","import { Code as InlineCode } from \"@chakra-ui/react\";\nimport { Language } from \"prism-react-renderer\";\nimport { Children, FunctionComponent, ReactNode } from \"react\";\nimport { Code as BlockCode } from \"../Code\";\n\ninterface CodeProps {\n inline?: boolean;\n children: ReactNode;\n language?: Language;\n}\n\nexport const Code: FunctionComponent<CodeProps> = ({\n inline,\n children,\n language = \"typescript\",\n}) => {\n if (inline) {\n return (\n <InlineCode\n bg=\"gray.100\"\n border=\"1px solid\"\n borderColor=\"gray.100\"\n borderRadius=\"md\"\n color=\"blue.500\"\n px={2}\n py={0}\n >\n {children}\n </InlineCode>\n );\n }\n\n const code = Children.toArray(children)\n .reduce((accum: string, child): string => {\n if (typeof child === \"string\") {\n return `${accum}${child}`;\n }\n return accum;\n }, \"\")\n .trim();\n\n return <BlockCode code={code} language={language} />;\n};\n","import { Heading, As } from \"@chakra-ui/react\";\nimport { Children, FunctionComponent, ReactNode } from \"react\";\nimport ReactDOMServer from \"react-dom/server\";\nimport { sanitize } from \"../../util/sanitize-anchor\";\nimport { NavLink } from \"../NavLink\";\nimport { Hr } from \"./Hr\";\n\ninterface HeadingResolverProps {\n level: number;\n children: ReactNode;\n}\n\nexport const Headings: FunctionComponent<HeadingResolverProps> = ({\n level,\n children,\n}) => {\n const size: string = [\"2xl\", \"xl\", \"lg\", \"md\", \"sm\", \"xs\"][level - 1];\n const marginY: number = [10, 10, 10, 8, 8, 8][level - 1];\n const elem = `h${level}` as As<any>;\n\n // Use DOMParser to look for data attribute for link ID\n const parser = new DOMParser();\n const doc = parser.parseFromString(\n ReactDOMServer.renderToStaticMarkup(children as React.ReactElement),\n \"text/html\"\n );\n\n const dataElement = doc.querySelector(\n \"span[data-heading-title][data-heading-id]\"\n ) as HTMLElement;\n const title =\n dataElement?.dataset.headingTitle ??\n Children.toArray(children)\n .reduce((accum: string, child): string => {\n if (typeof child === \"string\") {\n return `${accum}${child}`;\n }\n return accum;\n }, \"\")\n .trim();\n\n const id = dataElement?.dataset.headingId ?? sanitize(title);\n\n const isH3OrLarger = level < 4;\n\n return (\n <>\n <Heading\n as={elem}\n color=\"blue.800\"\n level={level}\n mb={isH3OrLarger ? 0 : level}\n mt={marginY}\n size={size}\n >\n <NavLink\n data-heading-id={id}\n data-heading-level={level}\n data-heading-title={title}\n id={id}\n replace\n sx={{ \"> code\": { color: \"blue.800\", fontSize: \"inherit\" } }}\n to={`#${id}`}\n >\n {children}\n </NavLink>\n </Heading>\n {isH3OrLarger && (\n // If there's an adjacent HR from the source md, do a magic trick and make it disappear\n <Hr mb={marginY} mt={0} sx={{ \"& + hr\": { display: \"none\" } }} />\n )}\n </>\n );\n};\n","export const sanitize = (input: string): string => {\n return input\n .toLowerCase()\n .replace(/[^a-zA-Z0-9 ]/g, \"\")\n .replace(/ /g, \"-\");\n};\n","import * as spec from \"@jsii/spec\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\n/**\n * Fetch assembly of a specific package from the backend.\n */\nexport const fetchAssembly = async (\n name: string,\n version: string,\n scope?: string\n): Promise<spec.Assembly> => {\n const assemblyPath = `${getAssetsPath(name, version, scope)}${\n API_PATHS.ASSEMBLY_SUFFIX\n }`;\n const response = await fetch(assemblyPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching assembly for ${assemblyPath}: ${response.statusText}`\n );\n }\n return response.json();\n};\n","import { getAssetsPath } from \"./util\";\n\n/**\n * Fetch markdown docs of a specific package from the backend.\n */\nexport const fetchMarkdown = async (\n name: string,\n version: string,\n language: string,\n scope?: string,\n submodule?: string\n): Promise<string> => {\n const docsSuffix = `/docs-${submodule ? `${submodule}-` : \"\"}${language}.md`;\n\n const markdownPath = `${getAssetsPath(name, version, scope)}${docsSuffix}`;\n const response = await fetch(markdownPath);\n if (!response.ok) {\n throw new Error(\n `Failed fetching documentation for ${markdownPath}: ${response.statusText}`\n );\n }\n\n // since CloudFront returns a 200 /index.html for missing documents,\n // we assert the expected docs content type to detect these errors.\n // TODO: switch to proper 404 responses in this case (requires backend changes)\n const expectedContentType = \"text/markdown\";\n const contentType = response.headers.get(\"Content-Type\");\n\n // we check 'includes' and not 'equal' because the content type contains\n // charset as well (e.g text/markdown; charset=UTF-8)\n if (!contentType || !contentType.includes(expectedContentType)) {\n throw new Error(\n `Invalid content type: ${contentType}. Expected ${expectedContentType}\"`\n );\n }\n return response.text();\n};\n","import { CDKType } from \"../../constants/constructs\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { getAssetsPath } from \"./util\";\n\nexport interface Metadata {\n constructFramework?: {\n name?: CDKType;\n majorVersion?: number;\n };\n date: string;\n links?: {\n npm: string;\n };\n packageLinks?: {\n [key: string]: string;\n };\n}\n\n/**\n * Fetch metadata of a specific package from the backend.\n */\nexport const fetchMetadata = async (\n name: string,\n version: string,\n scope?: string\n): Promise<Metadata> => {\n let sanitizedVersion = version;\n\n if (sanitizedVersion.startsWith(\"^\")) {\n sanitizedVersion = sanitizedVersion.substring(1, sanitizedVersion.length);\n }\n\n const metadataPath = `${getAssetsPath(name, version, scope)}${\n API_PATHS.METADATA_SUFFIX\n }`;\n const response = await fetch(metadataPath);\n\n if (!response.ok) {\n throw new Error(\n `Failed fetching metadata for ${metadataPath}: ${response.statusText}`\n );\n }\n\n return response.json();\n};\n","import { IconButton, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n TEMP_SUPPORTED_LANGUAGES,\n LANGUAGE_RENDER_MAP,\n LANGUAGES,\n} from \"../../constants/languages\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nexport interface LanguageBarProps {\n targetLanguages: readonly Language[];\n selectedLanguage: Language;\n setSelectedLanguage: (lang: Language) => void;\n}\n\nexport const LanguageBar: FunctionComponent<LanguageBarProps> = ({\n targetLanguages,\n selectedLanguage,\n setSelectedLanguage,\n}) => {\n return (\n <Stack\n align=\"center\"\n data-testid=\"language-bar\"\n direction=\"row\"\n spacing={2}\n >\n {[...targetLanguages]\n .sort(\n (left, right) => LANGUAGES.indexOf(left) - LANGUAGES.indexOf(right)\n )\n .map((language: Language) => {\n const isDisabled = !TEMP_SUPPORTED_LANGUAGES.has(language);\n const isSelected = language === selectedLanguage;\n\n const { icon: LangIcon } = LANGUAGE_RENDER_MAP[language];\n\n const onClick = () => {\n if (isSelected) return;\n setSelectedLanguage(language);\n };\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n <IconButton\n aria-label={`Select ${language} icon`}\n border={isSelected ? \"1px solid\" : \"none\"}\n borderColor=\"blue.500\"\n borderRadius=\"lg\"\n boxShadow=\"base\"\n colorScheme=\"blue\"\n cursor={isDisabled ? \"not-allowed\" : \"pointer\"}\n data-testid={`language-${language}`}\n disabled={isDisabled}\n icon={\n <LangIcon\n aria-label={`${language}-icon`}\n borderRadius=\"sm\"\n height={[4, 5, 6]}\n width={[4, 5, 6]}\n />\n }\n onClick={onClick}\n p={1}\n variant=\"outline\"\n w=\"max-content\"\n />\n </LanguageSupportTooltip>\n );\n })}\n </Stack>\n );\n};\n","import type { Assembly } from \"@jsii/spec\";\nimport type { FunctionComponent } from \"react\";\nimport { LanguageBar } from \"../../../../components/LanguageBar\";\nimport { Language, LANGUAGES } from \"../../../../constants/languages\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\nexport interface LanguageSelectionProps {\n assembly: Assembly;\n}\n\nconst languageSet = new Set(LANGUAGES);\n\nexport const LanguageSelection: FunctionComponent<LanguageSelectionProps> = ({\n assembly,\n}) => {\n const [language, setLanguage] = useLanguage({\n updateSaved: true,\n updateUrl: true,\n });\n const targets = [\n ...Object.keys(assembly?.targets ?? {}),\n // typescript is the source language and hence always supported.\n // (it doesn't appear in spec.targets)\n Language.TypeScript,\n ] as Language[];\n\n return (\n <LanguageBar\n selectedLanguage={targets.includes(language) ? language : targets[0]}\n setSelectedLanguage={setLanguage}\n targetLanguages={targets.filter((target) => languageSet.has(target))}\n />\n );\n};\n","import { ChevronDownIcon, LinkIcon } from \"@chakra-ui/icons\";\nimport { Menu, MenuButton, Button, MenuItem, MenuList } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { sanitizeVersion } from \"../../../../api/package/util\";\nimport { NavLink } from \"../../../../components/NavLink\";\n\nexport interface DependencyDropdownProps {\n dependencies: {\n /**\n * Key is a dep name, value is a version\n */\n [key: string]: string;\n };\n}\n\nexport const DependencyDropdown: FunctionComponent<DependencyDropdownProps> = ({\n dependencies,\n}) => {\n const depEntries = Object.entries(dependencies);\n\n if (!depEntries.length) return null;\n\n return (\n <Menu>\n <MenuButton\n as={Button}\n color=\"blue.500\"\n leftIcon={<LinkIcon />}\n rightIcon={<ChevronDownIcon h={6} w={6} />}\n size=\"md\"\n variant=\"outline\"\n >\n Dependencies\n </MenuButton>\n <MenuList>\n {depEntries.map(([name, version]) => (\n <MenuItem key={`${name}/${version}`} p={0}>\n <NavLink\n h=\"100%\"\n p={2}\n to={`/packages/${name}/v/${sanitizeVersion(version)}`}\n w=\"100%\"\n >\n {`${name} - ${version}`}\n </NavLink>\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n );\n};\n","const OS_ORG_LINK = \"https://opensource.org/licenses\";\n\nexport const LICENSE_LINKS = {\n \"Apache-2.0\": `${OS_ORG_LINK}/apache2.0.php`,\n \"BSD-2-Clause\": `${OS_ORG_LINK}/bsd-license.php`,\n MIT: `${OS_ORG_LINK}/mit-license.php`,\n} as const;\n","import { forwardRef } from \"@chakra-ui/react\";\nimport { ExternalLink, ExternalLinkProps } from \"../ExternalLink\";\nimport { LICENSE_LINKS } from \"./constants\";\n\nexport interface LicenseLinkOptions {\n license: keyof typeof LICENSE_LINKS;\n}\n\nexport interface LicenseLinkProps\n extends ExternalLinkProps,\n LicenseLinkOptions {}\n\nexport const LicenseLink = forwardRef<LicenseLinkProps, \"a\">(\n ({ license, ...linkProps }, ref) => {\n const url = LICENSE_LINKS[license];\n\n return (\n <ExternalLink href={url} ref={ref} {...linkProps}>\n {license}\n </ExternalLink>\n );\n }\n);\n\nLicenseLink.displayName = \"LicenseLink\";\n","import { Box, ListItem, Text, UnorderedList } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { ReactNode, useMemo } from \"react\";\nimport type { PackageLinksConfig } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { ExternalLink } from \"../../../../components/ExternalLink\";\nimport { LicenseLink, LICENSE_LINKS } from \"../../../../components/LicenseLink\";\nimport { Time } from \"../../../../components/Time\";\nimport { getRepoUrlAndHost } from \"../../../../util/url\";\n\nexport interface DetailsProps {\n assembly?: Assembly;\n linksConfig?: PackageLinksConfig[];\n metadata: Metadata;\n}\n\nexport const Details = ({ assembly, linksConfig, metadata }: DetailsProps) => {\n const detailItems = useMemo(() => {\n if (!metadata) return [];\n\n const { date, links } = metadata;\n const username = assembly?.author.name;\n const authorUrl = assembly?.author.url;\n const repository = assembly?.repository;\n const license = assembly?.license;\n // https://www.npmjs.com/package/aws-cdk/v/1.113.0\n const registry =\n links?.npm ??\n `https://www.npmjs.com/package/${assembly?.name}/v/${assembly?.version}`;\n\n const items = [];\n\n if (date) {\n const publishDate = (\n <Time date={new Date(date)} fontWeight=\"bold\" format=\"MMMM dd, yyyy\" />\n );\n items.push(<>Published: {publishDate}</>);\n }\n\n if (username) {\n const author = authorUrl ? (\n <ExternalLink href={authorUrl}>{username}</ExternalLink>\n ) : (\n <Box as=\"strong\" fontWeight=\"bold\">\n {username}\n </Box>\n );\n items.push(<>Author: {author}</>);\n }\n\n // Prioritize custom links when available\n if (linksConfig?.length) {\n linksConfig.forEach(({ name, value, displayText }) => {\n const target = (metadata?.packageLinks ?? {})[value];\n if (target) {\n const link = (\n <ExternalLink href={target}>{displayText ?? target}</ExternalLink>\n );\n items.push(\n <>\n {name}: {link}\n </>\n );\n }\n });\n }\n\n if (repository) {\n const repo = getRepoUrlAndHost(repository.url);\n\n if (repo) {\n const repoLink = (\n <ExternalLink href={repo.url}>{repo.hostname}</ExternalLink>\n );\n items.push(<>Repository: {repoLink}</>);\n }\n }\n\n if (license && license in LICENSE_LINKS) {\n const licenseLink = (\n <LicenseLink license={license as keyof typeof LICENSE_LINKS} />\n );\n items.push(<>License: {licenseLink}</>);\n }\n\n if (registry) {\n const registryLink = (\n <ExternalLink href={registry}>\n {new URL(registry).hostname}\n </ExternalLink>\n );\n items.push(<>Registry: {registryLink}</>);\n }\n\n return items.slice(0, 5).map((detail: string | ReactNode, i: number) => (\n <ListItem key={`detail-${i}`} listStyleType=\"none\" my={1}>\n <Text color=\"gray.600\">{detail}</Text>\n </ListItem>\n ));\n }, [metadata, assembly, linksConfig]);\n return <UnorderedList ml={0}>{detailItems}</UnorderedList>;\n};\n","import { Box, Flex, Link } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent } from \"react\";\nimport { PackageLinksConfig } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { DependencyDropdown } from \"../DependencyDropdown\";\nimport { Details } from \"./Details\";\n\nexport interface OperatorAreaProps {\n assembly?: Assembly;\n linksConfig?: PackageLinksConfig[];\n metadata: Metadata;\n}\n\nexport const OperatorArea: FunctionComponent<OperatorAreaProps> = ({\n assembly,\n linksConfig,\n metadata,\n}) => {\n return (\n <Flex direction=\"column\" textAlign={{ base: \"center\", md: \"initial\" }}>\n <Link\n color=\"blue.500\"\n fontSize=\"sm\"\n href={`mailto:abuse@amazonaws.com?subject=${encodeURIComponent(\n `ConstructHub - Report of abusive package: ${assembly?.name}`\n )}`}\n m={2}\n textAlign={{ base: \"center\", md: \"right\" }}\n >\n Report this Package\n </Link>\n <Details\n assembly={assembly}\n linksConfig={linksConfig}\n metadata={metadata}\n />\n {assembly?.dependencies && (\n <Box mt={4}>\n <DependencyDropdown dependencies={assembly.dependencies} />\n </Box>\n )}\n </Flex>\n );\n};\n","import { Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { PackageTag } from \"../../../../components/PackageTag\";\nimport { KEYWORD_IGNORE_LIST } from \"../../../../constants/keywords\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\nexport interface PackageHeaderProps {\n title: string;\n description: string;\n tags: string[];\n version: string;\n}\n\nexport const PackageHeader: FunctionComponent<PackageHeaderProps> = ({\n description,\n tags,\n title,\n version,\n}) => {\n const [currentLanguage] = useLanguage();\n return (\n <Flex\n direction=\"column\"\n maxWidth=\"100%\"\n overflowX=\"hidden\"\n p={2}\n textAlign={{ base: \"center\", md: \"initial\" }}\n >\n <Stack\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n justify={{ base: \"center\", md: \"start\" }}\n mb={4}\n spacing={4}\n >\n <Heading wordBreak=\"break-word\">{title}</Heading>\n <Text color=\"blue.500\" fontSize=\"md\">\n {version}\n </Text>\n </Stack>\n\n <Text wordBreak=\"break-word\">{description}</Text>\n {!!tags.length && (\n <Flex\n direction=\"row\"\n justify={{ base: \"center\", md: \"initial\" }}\n mt={3}\n >\n {title.startsWith(\"@aws-cdk/\") ? (\n <PackageTag\n key=\"official\"\n label=\"official\"\n language={currentLanguage}\n mr={2}\n value=\"@aws-cdk\"\n variant=\"official\"\n >\n Official\n </PackageTag>\n ) : null}\n {tags\n .filter((v) => Boolean(v) && !KEYWORD_IGNORE_LIST.has(v))\n .slice(0, 3)\n .map((tag) => (\n <PackageTag\n key={tag}\n language={currentLanguage}\n mr={2}\n value={tag}\n >\n {tag}\n </PackageTag>\n ))}\n </Flex>\n )}\n </Flex>\n );\n};\n","import { CheckIcon, CloseIcon, CopyIcon } from \"@chakra-ui/icons\";\nimport {\n Code,\n Flex,\n IconButton,\n Popover,\n PopoverBody,\n PopoverContent,\n PopoverHeader,\n PopoverTrigger,\n Text,\n useClipboard,\n useDisclosure,\n useMediaQuery,\n useToken,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent, ReactNode, useRef } from \"react\";\nimport { createTestIds } from \"../../util/createTestIds\";\n\nconst iconButtonProps = {\n borderRadius: \"md\",\n color: \"white\",\n variant: \"link\",\n};\n\nconst iconProps = {\n h: 4,\n w: 4,\n};\n\nexport const testIds = createTestIds(\"code-popover\", [\n \"close\",\n \"content\",\n \"code\",\n \"copy\",\n \"header\",\n \"trigger\",\n] as const);\n\nexport interface CodePopoverProps {\n code: string;\n header: string;\n trigger: ReactNode;\n}\n\nexport const CodePopover: FunctionComponent<CodePopoverProps> = ({\n code,\n header,\n trigger,\n}) => {\n const { hasCopied, onCopy } = useClipboard(code);\n const disclosure = useDisclosure();\n const focusRef = useRef<HTMLButtonElement>(null);\n const mdBreakpoint = useToken(\"breakpoints\", \"md\");\n const [isMd] = useMediaQuery(`(min-width: ${mdBreakpoint})`);\n\n return (\n <Popover\n initialFocusRef={focusRef}\n isLazy\n placement={isMd ? \"bottom-end\" : \"bottom\"}\n {...disclosure}\n >\n <PopoverTrigger>{trigger}</PopoverTrigger>\n <PopoverContent bg=\"blue.500\" data-testid={testIds.content}>\n <PopoverHeader\n align=\"center\"\n as={Flex}\n color=\"white\"\n data-testid={testIds.header}\n justify=\"space-between\"\n pr={0}\n >\n <Text>{header}</Text>\n <Flex align=\"center\">\n <IconButton\n aria-label=\"copy-text-icon\"\n data-testid={testIds.copy}\n icon={\n hasCopied ? (\n <CheckIcon {...iconProps} color=\"green.200\" />\n ) : (\n <CopyIcon {...iconProps} />\n )\n }\n onClick={onCopy}\n ref={focusRef}\n {...iconButtonProps}\n />\n <IconButton\n aria-label=\"close-icon\"\n data-testid={testIds.close}\n icon={<CloseIcon h={3} w={3} />}\n onClick={disclosure.onClose}\n {...iconButtonProps}\n />\n </Flex>\n </PopoverHeader>\n <PopoverBody\n as={Code}\n bg=\"gray.100\"\n borderTopLeftRadius=\"0\"\n borderTopRightRadius=\"0\"\n color=\"gray.800\"\n data-testid={testIds.code}\n overflow=\"auto\"\n variant=\"code-block\"\n >\n {code}\n </PopoverBody>\n </PopoverContent>\n </Popover>\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport { Button, ButtonProps, forwardRef } from \"@chakra-ui/react\";\nimport { testIds } from \"./CodePopover\";\n\nexport interface CodePopoverTriggerProps extends ButtonProps {}\n\n/**\n * A default trigger button for the code popover\n */\nexport const CodePopoverTrigger = forwardRef<CodePopoverTriggerProps, \"button\">(\n (props, ref) => (\n <Button\n color=\"white\"\n colorScheme=\"blue\"\n data-testid={testIds.trigger}\n ref={ref}\n rightIcon={<ChevronDownIcon h={5} w={5} />}\n {...props}\n >\n {props.children}\n </Button>\n )\n);\n\nCodePopoverTrigger.displayName = \"CodePopoverTrigger\";\n","import type { Assembly } from \"@jsii/spec\";\nimport type { FunctionComponent } from \"react\";\nimport {\n CodePopover,\n CodePopoverTrigger,\n} from \"../../../../components/CodePopover\";\nimport { LANGUAGE_NAME_MAP, Language } from \"../../../../constants/languages\";\nimport { useLanguage } from \"../../../../hooks/useLanguage\";\n\n// TODO: We'll probably want to get this from BE as we add more languages, however this should do the trick for now...\nconst getCodeSample = ({\n language,\n assembly,\n}: {\n language: Language;\n assembly: Assembly;\n}): string | undefined => {\n const version = assembly.version;\n if (language === Language.TypeScript) {\n const packageName = assembly.name;\n return `npm install ${packageName}@${version}`;\n } else if (language === Language.Python) {\n const packageName = assembly.targets?.python?.distName;\n if (!packageName) {\n return undefined;\n }\n return `pip install ${packageName}==${version}`;\n } else if (language === Language.Java) {\n const groupId = assembly.targets?.java?.maven?.groupId;\n const artifactId = assembly.targets?.java?.maven?.artifactId;\n if (!groupId || !artifactId) return undefined;\n return [\n \"// add this to your pom.xml\",\n \"<dependency>\",\n ` <groupId>${groupId}</groupId>`,\n ` <artifactId>${artifactId}</artifactId>`,\n ` <version>${version}</version>`,\n \"</dependency>\",\n ].join(\"\\n\");\n }\n\n return undefined;\n};\n\nexport interface UseConstructProps {\n assembly: Assembly;\n}\n\nexport const UseConstruct: FunctionComponent<UseConstructProps> = ({\n assembly,\n}) => {\n const [language] = useLanguage();\n\n const header = LANGUAGE_NAME_MAP[language];\n const code = getCodeSample({ language, assembly });\n\n const isDisabled = !code;\n const label = !isDisabled ? \"Install\" : \"Unsupported\";\n\n const trigger = (\n <CodePopoverTrigger disabled={isDisabled}>{label}</CodePopoverTrigger>\n );\n\n return <CodePopover code={code ?? \"\"} header={header} trigger={trigger} />;\n};\n","import { Center, Divider, Flex, Grid, Spinner, Stack } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent } from \"react\";\nimport { Config } from \"../../../../api/config\";\nimport type { Metadata } from \"../../../../api/package/metadata\";\nimport { Card } from \"../../../../components/Card\";\nimport type { UseRequestResponse } from \"../../../../hooks/useRequest\";\nimport { LanguageSelection } from \"../LanguageSelection\";\nimport { OperatorArea } from \"../OperatorArea\";\nimport { PackageHeader } from \"../PackageHeader\";\nimport { UseConstruct } from \"../UseConstruct\";\n\ninterface PackageDetailsProps {\n config: UseRequestResponse<Config>;\n assembly: UseRequestResponse<Assembly>;\n metadata: UseRequestResponse<Metadata>;\n version: string;\n}\n\n/**\n * Renders the header section of a package. This includes\n * the Getting Started, Operator Area, and Publisher Area sections\n */\nexport const PackageDetails: FunctionComponent<PackageDetailsProps> = ({\n assembly,\n config,\n metadata,\n version,\n}) => {\n const isLoading = assembly.loading || metadata.loading;\n\n if (isLoading || !assembly.data || !metadata.data) {\n return (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n return (\n <Flex as={Card} direction=\"column\">\n <Grid\n gap={4}\n overflow=\"hidden\"\n templateColumns={{ base: \"1fr\", md: \"3fr auto 2fr\" }}\n templateRows=\"auto\"\n >\n <PackageHeader\n description={assembly.data.description}\n tags={assembly.data.keywords ?? []}\n title={assembly.data.name}\n version={version}\n />\n <Divider\n display={{ base: \"none\", md: \"initial\" }}\n orientation=\"vertical\"\n />\n <Divider\n display={{ base: \"initial\", md: \"none\" }}\n orientation=\"horizontal\"\n />\n {config.loading ? (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\n ) : (\n <OperatorArea\n assembly={assembly.data}\n linksConfig={config.data?.packageLinks}\n metadata={metadata.data}\n />\n )}\n </Grid>\n <Stack\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n justify={{ base: \"center\", md: \"space-between\" }}\n px={2}\n py={4}\n spacing={4}\n >\n <LanguageSelection assembly={assembly.data} />\n <UseConstruct assembly={assembly.data} />\n </Stack>\n </Flex>\n );\n};\n","import { ChevronDownIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Box, Flex, Link, IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport { FunctionComponent, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface NavItemConfig {\n children?: NavItemConfig[];\n display: string;\n url: string;\n}\n\nexport interface NavItemProps extends NavItemConfig {\n // The following props don't need to be explicitly defined - they are passed internally\n onOpen?: () => void;\n}\n\nexport interface NavTreeProps {\n /**\n * Items to render\n */\n items: NavItemConfig[];\n}\n\nconst iconProps = {\n color: \"gray.900\",\n h: 4,\n w: 4,\n};\n\nexport const NavItem: FunctionComponent<NavItemProps> = ({\n children,\n display,\n url,\n onOpen,\n}) => {\n const { pathname, hash } = useLocation();\n const isHashUrl = url.startsWith(\"#\");\n const linkIsActive = isHashUrl ? hash === url : pathname === url;\n const disclosure = useDisclosure({ onOpen, defaultIsOpen: true });\n\n const showToggle = (children?.length ?? 0) > 0;\n const showChildren = disclosure.isOpen && showToggle;\n\n const LinkComponent = isHashUrl ? Link : NavLink;\n\n const nestedItems = useMemo(\n () =>\n children?.map((item, idx) => {\n return <NavItem {...item} key={idx} onOpen={disclosure.onOpen} />;\n }),\n [children, disclosure.onOpen]\n );\n\n return (\n <Flex direction=\"column\">\n <Flex align=\"center\" color={linkIsActive ? \"blue.500\" : \"gray.800\"}>\n {showToggle && (\n <IconButton\n aria-label=\"expand-toggle\"\n borderRadius=\"md\"\n h={4}\n icon={\n disclosure.isOpen ? (\n <ChevronDownIcon {...iconProps} />\n ) : (\n <ChevronRightIcon {...iconProps} />\n )\n }\n ml={-1}\n onClick={disclosure.onToggle}\n size=\"xs\"\n variant=\"link\"\n w={4}\n />\n )}\n <LinkComponent\n _hover={{ bg: \"rgba(0, 124, 253, 0.05)\" }}\n href={url}\n overflow=\"hidden\"\n pl={showToggle ? 1 : 2}\n py={1.5}\n textOverflow=\"ellipsis\"\n title={display}\n to={url}\n w=\"100%\"\n whiteSpace=\"nowrap\"\n >\n {display}\n </LinkComponent>\n </Flex>\n <Box\n _before={{\n // Creates a border without taking up any box space\n // This is important to keep items perfectly aligned\n bg: \"gray.100\",\n bottom: 0,\n content: `\"\"`,\n left: 0,\n position: \"absolute\",\n top: 0,\n w: \"1px\",\n }}\n display={showChildren ? \"initial\" : \"none\"}\n ml={2}\n pl={2}\n position=\"relative\"\n >\n {nestedItems}\n </Box>\n </Flex>\n );\n};\n\nexport const NavTree: FunctionComponent<NavTreeProps> = ({ items }) => {\n return (\n <Flex direction=\"column\" maxWidth=\"100%\">\n {items.map((item, idx) => {\n return <NavItem {...item} key={idx} onOpen={undefined} />;\n })}\n </Flex>\n );\n};\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport {\n InputGroup,\n InputLeftElement,\n Input,\n forwardRef,\n} from \"@chakra-ui/react\";\nimport { FormEventHandler, useState } from \"react\";\nimport { Form } from \"../../../../components/Form\";\nimport { useDebounce } from \"../../../../hooks/useDebounce\";\n\nexport interface SearchInputProps {\n value: string;\n onChange: (s: string) => void;\n onSubmit: FormEventHandler<HTMLFormElement>;\n}\n\nexport const SearchInput = forwardRef<SearchInputProps, \"input\">(\n ({ value, onChange, onSubmit }, inputRef) => {\n const [inputValue, setInputValue] = useState(value);\n\n useDebounce(inputValue, { onChange });\n\n return (\n <Form data-testid=\"choose-submodule-search-form\" onSubmit={onSubmit}>\n <InputGroup>\n <InputLeftElement>\n <SearchIcon color=\"gray.400\" />\n </InputLeftElement>\n <Input\n data-testid=\"choose-submodule-search-input\"\n onChange={(e) => setInputValue(e.target.value)}\n placeholder=\"Search\"\n ref={inputRef}\n value={inputValue}\n variant=\"filled\"\n />\n </InputGroup>\n </Form>\n );\n }\n);\n\nSearchInput.displayName = \"SearchInput\";\n","import {\n Box,\n Divider,\n Modal,\n ModalHeader,\n ModalContent,\n ModalCloseButton,\n ModalBody,\n ModalOverlay,\n UnorderedList,\n} from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n useCallback,\n useRef,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { SearchItem } from \"../../../../components/SearchItem\";\nimport { SearchInput } from \"./SearchInput\";\n\nexport interface SearchModalProps {\n inputValue: string;\n isOpen: boolean;\n onClose: () => void;\n onInputChange: (s: string) => void;\n submodules: { name: string; to: string }[];\n}\n\nexport const SearchModal: FunctionComponent<SearchModalProps> = ({\n inputValue,\n isOpen,\n onClose,\n onInputChange,\n submodules,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const { push } = useHistory();\n\n const navigate = useCallback(\n (to: string) => {\n onClose();\n push(to);\n },\n [onClose, push]\n );\n\n const onSubmit = useCallback<FormEventHandler<HTMLFormElement>>(\n (e) => {\n e.preventDefault();\n\n if (!submodules.length) return;\n const { to } = submodules[0];\n navigate(to);\n },\n [navigate, submodules]\n );\n\n return (\n <Modal initialFocusRef={inputRef} isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent mx={4}>\n <ModalCloseButton data-testid=\"choose-submodule-modal-close\" />\n <ModalHeader\n data-testid=\"choose-submodule-modal-header\"\n fontSize=\"lg\"\n fontWeight=\"bold\"\n >\n Choose a submodule\n </ModalHeader>\n <ModalBody data-testid=\"choose-submodule-modal-body\" p={0}>\n <Box pb={4} px={4}>\n <SearchInput\n onChange={onInputChange}\n onSubmit={onSubmit}\n ref={inputRef}\n value={inputValue}\n />\n </Box>\n <Divider />\n <UnorderedList\n data-testid=\"choose-submodule-modal-results\"\n m={0}\n maxH=\"50vh\"\n overflow=\"hidden auto\"\n p={0}\n role=\"listbox\"\n tabIndex={-1}\n >\n {submodules.map(({ name, to }) => (\n <SearchItem\n data-testid=\"choose-submodule-result\"\n key={name}\n name={name}\n onClick={() => navigate(to)}\n />\n ))}\n </UnorderedList>\n </ModalBody>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n );\n};\n","import { ArrowBackIcon, ChevronDownIcon } from \"@chakra-ui/icons\";\nimport { Button, Divider, Stack, useDisclosure } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { FunctionComponent, useCallback, useMemo, useState } from \"react\";\nimport { useHistory, useLocation } from \"react-router-dom\";\nimport { QUERY_PARAMS } from \"../../../../constants/url\";\nimport { useQueryParams } from \"../../../../hooks/useQueryParams\";\nimport { SearchModal } from \"./SearchModal\";\n\nexport interface ChooseSubmoduleProps {\n assembly?: Assembly;\n}\n\nexport const ChooseSubmodule: FunctionComponent<ChooseSubmoduleProps> = ({\n assembly,\n}) => {\n const { pathname } = useLocation();\n const { push } = useHistory();\n const query = useQueryParams();\n\n const allSubmodules = Object.keys(assembly?.submodules ?? {});\n const { isOpen, onOpen, onClose } = useDisclosure();\n\n const currentSubmodule = query.get(QUERY_PARAMS.SUBMODULE);\n const submoduleText = currentSubmodule\n ? `Submodule: ${currentSubmodule}`\n : \"Choose Submodule\";\n\n const [filter, setFilter] = useState(\"\");\n\n const onGoBack = () => {\n const lang = query.get(QUERY_PARAMS.LANGUAGE);\n push(`${pathname}${lang ? `?${QUERY_PARAMS.LANGUAGE}=${lang}` : \"\"}`);\n };\n\n const getUrl = useCallback(\n (submoduleName: string) => {\n const params = new URLSearchParams(query.toString());\n params.set(\"submodule\", submoduleName);\n return `${pathname}?${params}`;\n },\n [pathname, query]\n );\n\n const submodules = useMemo(() => {\n let results = allSubmodules;\n\n if (filter) {\n results = results.filter((fqn) =>\n fqn.toLowerCase().includes(filter.toLowerCase())\n );\n }\n\n return results.map((fqn) => {\n const name = fqn.split(\".\")[1];\n return {\n name,\n to: getUrl(name),\n };\n });\n }, [allSubmodules, filter, getUrl]);\n\n if (allSubmodules.length === 0) {\n return null;\n }\n\n return (\n <Stack spacing={4} w=\"100%\">\n {currentSubmodule && (\n <>\n <Button\n borderRadius=\"none\"\n data-testid=\"choose-submodule-go-back\"\n leftIcon={<ArrowBackIcon aria-label=\"Back to construct root\" />}\n onClick={onGoBack}\n title=\"Back to construct root\"\n variant=\"link\"\n >\n {assembly?.name}\n </Button>\n <Divider />\n </>\n )}\n <Button\n borderRadius=\"none\"\n color=\"blue.500\"\n data-testid=\"choose-submodule-search-trigger\"\n flexGrow={1}\n onClick={onOpen}\n rightIcon={<ChevronDownIcon />}\n title=\"Choose Submodule\"\n variant=\"link\"\n >\n {submoduleText}\n </Button>\n <SearchModal\n inputValue={filter}\n isOpen={isOpen}\n onClose={onClose}\n onInputChange={setFilter}\n submodules={submodules}\n />\n </Stack>\n );\n};\n","import { Box, Flex, Grid } from \"@chakra-ui/react\";\nimport type { Assembly } from \"@jsii/spec\";\nimport { useState, useEffect, FunctionComponent, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { Markdown } from \"../../../../components/Markdown\";\nimport { NavTree, NavItemConfig } from \"../../../../components/NavTree\";\nimport { ChooseSubmodule } from \"../ChooseSubmodule\";\n\nexport interface PackageDocsProps {\n markdown: string;\n assembly: Assembly;\n}\n\ntype Item = NavItemConfig & { level: number; children: Item[] };\n\nexport const appendItem = (itemTree: Item[], item: Element): Item[] => {\n if (!(item instanceof HTMLElement)) {\n return itemTree;\n }\n\n const { headingId, headingLevel = \"100\" } = item.dataset;\n const { innerText } = item;\n const level = parseInt(headingLevel);\n\n // Don't create nav items for items with no title / url\n if (level > 3 || !innerText || !headingId) {\n return itemTree;\n }\n\n const last = itemTree[itemTree.length - 1];\n\n if (last == null || last.level >= level) {\n return [\n ...itemTree,\n {\n display: innerText,\n url: `#${headingId}`,\n level,\n children: [],\n },\n ];\n } else {\n last.children = appendItem(last.children, item);\n return itemTree;\n }\n};\n\n// We want the nav to be sticky, but it should account for the sticky heading as well, which is 72px\nconst TOP_OFFSET = \"4.5rem\";\n\nexport const PackageDocs: FunctionComponent<PackageDocsProps> = ({\n markdown: source,\n assembly,\n}) => {\n const [navItems, setNavItems] = useState<Item[]>([]);\n\n useEffect(() => {\n const tree = [\n ...document.querySelectorAll(\n `[data-heading-id][data-heading-title][data-heading-level]`\n ),\n ].reduce(appendItem, []);\n\n setNavItems(tree);\n }, [source]);\n\n const { hash } = useLocation();\n useEffect(() => {\n if (hash) {\n const target = document.querySelector(`${hash}`) as HTMLElement;\n target?.scrollIntoView(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [source]);\n\n const markdown = useMemo(\n () => <Markdown repository={assembly.repository}>{source}</Markdown>,\n [assembly.repository, source]\n );\n\n return (\n <Grid\n bg=\"white\"\n columnGap={4}\n h=\"100%\"\n templateColumns={{ base: \"1fr\", md: \"1fr 3fr\" }}\n width=\"100%\"\n >\n <Flex\n alignSelf=\"stretch\"\n borderRight=\"1px solid\"\n borderRightColor=\"blue.50\"\n direction=\"column\"\n display={{ base: \"none\", md: \"flex\" }}\n maxHeight={`calc(100vh - ${TOP_OFFSET})`}\n overflow=\"hidden auto\"\n position=\"sticky\"\n px={4}\n top={TOP_OFFSET}\n >\n {Object.keys(assembly?.submodules ?? {}).length > 0 && (\n <Flex\n borderBottom=\"1px solid\"\n borderColor=\"blue.50\"\n justify=\"center\"\n py={4}\n >\n <ChooseSubmodule assembly={assembly} />\n </Flex>\n )}\n <Box overflowY=\"auto\" py={4}>\n <NavTree items={navItems} />\n </Box>\n </Flex>\n <Box\n h=\"max-content\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n py={4}\n sx={{\n a: {\n scrollMarginTop: TOP_OFFSET,\n },\n }}\n >\n {markdown}\n </Box>\n </Grid>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../../../../components/ExternalLink\";\nimport { Language } from \"../../../../constants/languages\";\n\nexport interface PackageDocsErrorProps {\n readonly language: Language;\n}\n\nexport const PackageDocsError: FunctionComponent<PackageDocsErrorProps> = ({\n language,\n}) => {\n const issueLink = (\n <ExternalLink href=\"https://github.com/cdklabs/construct-hub-webapp/issues/new\">\n issue\n </ExternalLink>\n );\n return (\n <Text\n align=\"center\"\n fontSize=\"xl\"\n fontStyle=\"oblique\"\n px={4}\n wordBreak=\"break-word\"\n >\n Documentation in {language} is still not ready for this package. Come back\n soon. If this issue persists, please let us know by creating an{\" \"}\n {issueLink}.\n </Text>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Language, LANGUAGE_NAME_MAP } from \"../../../../constants/languages\";\n\nexport interface PackageDocsUnsupportedProps {\n readonly language: Language;\n}\n\nexport const PackageDocsUnsupported: FunctionComponent<PackageDocsUnsupportedProps> =\n ({ language }) => {\n const languageName = LANGUAGE_NAME_MAP[language];\n return (\n <Text\n align=\"center\"\n fontSize=\"xl\"\n fontStyle=\"oblique\"\n px={4}\n wordBreak=\"break-word\"\n >\n This package does not currently support {languageName}. Select one of\n the supported languages above, or ask the author to add support for{\" \"}\n {languageName} in a future release.\n </Text>\n );\n };\n","import { Box, Center, Spinner, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { useParams } from \"react-router-dom\";\nimport { fetchAssembly } from \"../../api/package/assembly\";\nimport { fetchMarkdown } from \"../../api/package/docs\";\nimport { fetchMetadata } from \"../../api/package/metadata\";\nimport { Page } from \"../../components/Page\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useConfig } from \"../../contexts/Config\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { useRequest } from \"../../hooks/useRequest\";\nimport { NotFound } from \"../NotFound\";\nimport { PackageDetails } from \"./components/PackageDetails\";\nimport { PackageDocs } from \"./components/PackageDocs\";\nimport { PackageDocsError } from \"./components/PackageDocsError\";\nimport { PackageDocsUnsupported } from \"./components/PackageDocsUnsupported/PackageDocsUnsupported\";\n\ninterface PathParams {\n name: string;\n scope?: string;\n version: string;\n}\n\nexport const Package: FunctionComponent = () => {\n const { name, scope, version }: PathParams = useParams();\n const [requestMarkdown, markdownResponse] = useRequest(fetchMarkdown);\n const [requestAssembly, assemblyResponse] = useRequest(fetchAssembly);\n const [requestMetadata, metadataResponse] = useRequest(fetchMetadata);\n const configResponse = useConfig();\n\n const q = useQueryParams();\n const [language] = useLanguage();\n const submodule = q.get(QUERY_PARAMS.SUBMODULE) ?? \"\";\n\n const pageTitle = `${scope ? `${scope}/${name}` : name} ${version}`;\n\n const pageDescription = assemblyResponse?.data?.description ?? \"\";\n\n useEffect(() => {\n void requestMetadata(name, version, scope);\n void requestAssembly(name, version, scope);\n }, [name, requestAssembly, requestMetadata, scope, version]);\n\n useEffect(() => {\n void requestMarkdown(name, version, language, scope, submodule);\n }, [name, scope, version, language, submodule, requestMarkdown]);\n\n // Handle missing JSON for assembly\n if (assemblyResponse.error) {\n return <NotFound />;\n }\n\n const hasError = markdownResponse.error || assemblyResponse.error;\n const hasDocs =\n !markdownResponse.loading &&\n !assemblyResponse.loading &&\n markdownResponse.data &&\n assemblyResponse.data;\n // This will also be true if it cannot be verified (assembly not there)\n const isSupported =\n language === Language.TypeScript ||\n assemblyResponse.loading ||\n assemblyResponse.error ||\n assemblyResponse.data?.targets?.[language.toString()] != null;\n const isLoadingDocs =\n !metadataResponse.loading &&\n (assemblyResponse.loading || markdownResponse.loading);\n\n return (\n <Page\n meta={{ title: pageTitle, description: pageDescription }}\n pageName=\"packageProfile\"\n >\n <Stack maxW=\"100vw\" pt={4} spacing={4}>\n {/* Operator Area */}\n <Box px={4}>\n <PackageDetails\n assembly={assemblyResponse}\n config={configResponse}\n metadata={metadataResponse}\n version={version}\n />\n </Box>\n {/* Readme and Api Reference Area */}\n {isSupported ? (\n hasError ? (\n <PackageDocsError language={language}></PackageDocsError>\n ) : isLoadingDocs ? (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\n ) : (\n hasDocs && (\n <PackageDocs\n assembly={assemblyResponse.data!}\n markdown={markdownResponse.data!}\n />\n )\n )\n ) : (\n <PackageDocsUnsupported language={language}></PackageDocsUnsupported>\n )}\n </Stack>\n </Page>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Redirect, useParams } from \"react-router-dom\";\nimport { Packages } from \"../../api/package/packages\";\nimport { getFullPackageName, findPackage } from \"../../api/package/util\";\nimport { useCatalog } from \"../../contexts/Catalog\";\nimport NotFound from \"../NotFound\";\n\ninterface RouteParams {\n name: string;\n scope?: string;\n}\n\nexport const buildRedirectUrl = (\n catalog: Packages,\n name: string,\n scope?: string\n) => {\n const prefix = \"/packages/\";\n const packageName = getFullPackageName(name, scope);\n const pkg = findPackage(catalog, packageName);\n\n if (!pkg) {\n return undefined;\n }\n\n const { version } = pkg;\n const suffix = `/v/${version}`;\n return `${prefix}${packageName}${suffix}`;\n};\n\nexport const PackageLatest: FunctionComponent = () => {\n const { name, scope }: RouteParams = useParams();\n const catalog = useCatalog();\n\n if (catalog.loading || !catalog.data) {\n return (\n <Center minH=\"16rem\">\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const url = buildRedirectUrl(catalog.data, name, scope);\n\n return url ? <Redirect to={url} /> : <NotFound />;\n};\n","import type { FunctionComponent } from \"react\";\nimport { Switch, Route, useRouteMatch } from \"react-router-dom\";\nimport { NotFound } from \"../NotFound\";\nimport { Package } from \"../Package\";\nimport { PackageLatest } from \"../PackageLatest\";\n\nconst nameRegexp = \"[^@\\\\/]+\";\nconst scopeRegexp = \"@[^\\\\/]+\";\n\nexport const Packages: FunctionComponent = () => {\n const { path } = useRouteMatch();\n\n return (\n <Switch>\n <Route\n exact\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})`}\n >\n <PackageLatest />\n </Route>\n <Route\n path={`${path}/:scope(${scopeRegexp})?/:name(${nameRegexp})/v/:version`}\n >\n <Package />\n </Route>\n <Route path=\"*\">\n <NotFound />\n </Route>\n </Switch>\n );\n};\n"],"sourceRoot":""}
|