construct-hub 0.3.74 → 0.3.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/.jsii +19 -19
  2. package/lib/backend/transliterator/transliterator.ecs-entrypoint.bundle/index.js +5 -5
  3. package/lib/construct-hub.js +1 -1
  4. package/lib/package-sources/code-artifact.js +1 -1
  5. package/lib/package-sources/npmjs.js +1 -1
  6. package/lib/package-tag/index.js +2 -2
  7. package/lib/spdx-license.js +1 -1
  8. package/lib/webapp/home-response-function/home-response-function.d.ts +8 -0
  9. package/lib/webapp/home-response-function/home-response-function.js +24 -0
  10. package/lib/webapp/home-response-function/index.d.ts +7 -0
  11. package/lib/webapp/home-response-function/index.js +17 -0
  12. package/lib/webapp/index.js +16 -2
  13. package/lib/webapp/response-function/response-function.d.ts +0 -1
  14. package/lib/webapp/response-function/response-function.js +3 -1
  15. package/package.json +7 -7
  16. package/website/asset-manifest.json +36 -36
  17. package/website/index.html +1 -1
  18. package/website/service-worker.js +1 -1
  19. package/website/static/js/{0.74bd9492.chunk.js → 0.0ec704bd.chunk.js} +2 -2
  20. package/website/static/js/{0.74bd9492.chunk.js.map → 0.0ec704bd.chunk.js.map} +1 -1
  21. package/website/static/js/{1.37bf26c6.chunk.js → 1.4ed89d6e.chunk.js} +2 -2
  22. package/website/static/js/{1.37bf26c6.chunk.js.map → 1.4ed89d6e.chunk.js.map} +1 -1
  23. package/website/static/js/{10.fb218d2f.chunk.js → 10.bc89b47e.chunk.js} +2 -2
  24. package/website/static/js/{10.fb218d2f.chunk.js.map → 10.bc89b47e.chunk.js.map} +1 -1
  25. package/website/static/js/{11.5bd19ded.chunk.js → 11.b2210011.chunk.js} +2 -2
  26. package/website/static/js/{11.5bd19ded.chunk.js.map → 11.b2210011.chunk.js.map} +1 -1
  27. package/website/static/js/{12.eb4db465.chunk.js → 12.58276a6b.chunk.js} +2 -2
  28. package/website/static/js/{12.eb4db465.chunk.js.map → 12.58276a6b.chunk.js.map} +1 -1
  29. package/website/static/js/{13.fe9b51fc.chunk.js → 13.512f115a.chunk.js} +3 -3
  30. package/website/static/js/{13.fe9b51fc.chunk.js.LICENSE.txt → 13.512f115a.chunk.js.LICENSE.txt} +0 -0
  31. package/website/static/js/{13.fe9b51fc.chunk.js.map → 13.512f115a.chunk.js.map} +1 -1
  32. package/website/static/js/{14.33162ba8.chunk.js → 14.a485bce3.chunk.js} +2 -2
  33. package/website/static/js/{14.33162ba8.chunk.js.map → 14.a485bce3.chunk.js.map} +1 -1
  34. package/website/static/js/{4.7f5e3309.chunk.js → 4.a2e9ec2d.chunk.js} +3 -3
  35. package/website/static/js/{4.7f5e3309.chunk.js.LICENSE.txt → 4.a2e9ec2d.chunk.js.LICENSE.txt} +0 -0
  36. package/website/static/js/{4.7f5e3309.chunk.js.map → 4.a2e9ec2d.chunk.js.map} +1 -1
  37. package/website/static/js/5.17864b64.chunk.js +3 -0
  38. package/website/static/js/{5.8b38b6da.chunk.js.LICENSE.txt → 5.17864b64.chunk.js.LICENSE.txt} +0 -0
  39. package/website/static/js/{5.8b38b6da.chunk.js.map → 5.17864b64.chunk.js.map} +1 -1
  40. package/website/static/js/{6.993d90fd.chunk.js → 6.703e3c7f.chunk.js} +2 -2
  41. package/website/static/js/6.703e3c7f.chunk.js.map +1 -0
  42. package/website/static/js/7.f8f9a8b7.chunk.js +2 -0
  43. package/website/static/js/7.f8f9a8b7.chunk.js.map +1 -0
  44. package/website/static/js/8.64914ea1.chunk.js +2 -0
  45. package/website/static/js/8.64914ea1.chunk.js.map +1 -0
  46. package/website/static/js/{9.28413d73.chunk.js → 9.c88e9272.chunk.js} +2 -2
  47. package/website/static/js/{9.28413d73.chunk.js.map → 9.c88e9272.chunk.js.map} +1 -1
  48. package/website/static/js/{main.2b1ad6f6.chunk.js → main.19a82dfa.chunk.js} +2 -2
  49. package/website/static/js/main.19a82dfa.chunk.js.map +1 -0
  50. package/website/static/js/{runtime-main.ccd2f057.js → runtime-main.7452ec40.js} +2 -2
  51. package/website/static/js/{runtime-main.ccd2f057.js.map → runtime-main.7452ec40.js.map} +1 -1
  52. package/website/static/js/5.8b38b6da.chunk.js +0 -3
  53. package/website/static/js/6.993d90fd.chunk.js.map +0 -1
  54. package/website/static/js/7.183f0a63.chunk.js +0 -2
  55. package/website/static/js/7.183f0a63.chunk.js.map +0 -1
  56. package/website/static/js/8.8b7c92c5.chunk.js +0 -2
  57. package/website/static/js/8.8b7c92c5.chunk.js.map +0 -1
  58. package/website/static/js/main.2b1ad6f6.chunk.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["contexts/ExternalLinkWarning/constants.ts","contexts/ExternalLinkWarning/ExternalLinkWarningModal.tsx","contexts/ExternalLinkWarning/ExternalLinkWarning.tsx","constants/languages.ts","icons/TSIcon.tsx","icons/PythonIcon.tsx","icons/JavaIcon.tsx","icons/GoIcon.tsx","icons/DotNetIcon.tsx","contexts/Analytics/Analytics.tsx","contexts/Analytics/usePageView.ts","hooks/usePagination/usePagination.ts","hooks/useCatalogResults/useCatalogResults.ts","hooks/useSearch/useSearch.ts","components/CDKType/CDKType.tsx","constants/url.ts","api/config/index.ts","components/DevPreviewBanner/DevPreviewBanner.tsx","components/Form/Form.tsx","hooks/useDebounce/useDebounce.ts","components/SearchItem/SearchItem.tsx","lib/shortbread/shortbread.ts","reportWebVitals.ts","lib/shortbread/getLocalStoreWriter.ts","contexts/Shortbread/Shortbread.tsx","components/Footer/constants.ts","components/Footer/testIds.ts","components/Footer/Footer.tsx","components/NavPopover/NavPopover.tsx","components/NavPopover/NavPopoverContent.tsx","components/NavPopover/NavPopoverTrigger.tsx","components/Header/testIds.ts","components/Header/DocumentationDropdown.tsx","components/Header/GettingStartedDropdown.tsx","components/SearchModal/testIds.ts","components/SearchModal/SearchModal.tsx","components/Header/HeaderSearch.tsx","components/Header/MobileNavLinks.tsx","components/Header/Title.tsx","components/Header/MobileNav.tsx","components/Header/NavButton.tsx","components/Header/Header.tsx","components/LazyRoute/LazyRoute.tsx","App.tsx","theme/components/Code.ts","theme/components/Divider.ts","theme/components/Tag.ts","theme/components/index.ts","theme/foundations/index.ts","theme/foundations/borders.ts","theme/foundations/colors.ts","theme/foundations/radius.ts","theme/foundations/sizes.ts","theme/foundations/shadows.ts","theme/index.ts","contexts/Theme.tsx","register-service-worker.ts","index.tsx","components/ExternalLink/ExternalLink.tsx","constants/links.ts","api/catalog-search/constants.ts","util/createTestIds.ts","constants/constructs.ts","components/NavLink/NavLink.tsx","api/package/packages.ts","contexts/Catalog/Catalog.tsx","components/SearchBar/testIds.ts","components/SearchBar/SearchBar.tsx","components/SearchBar/SearchOverlay.tsx","components/SearchBar/SearchSuggestions.tsx","components/PageLoader/PageLoader.tsx","hooks/useRequest/useRequest.ts","util/url.ts","api/stats/index.ts","contexts/Stats/Stats.tsx","contexts/Config/Config.tsx","api/catalog-search/util.ts","api/catalog-search/catalog-search.ts","contexts/Search/Search.tsx","components/Card/Card.tsx","hooks/useCatalogSearch/useCatalogSearch.ts"],"names":["PREFERS_WARN_ON_EXTERNAL_LINK_CLICK","ExternalLinkWarningModal","href","isOpen","onClick","onClose","setShouldWarn","useState","finalShouldWarn","setFinalShouldWarn","closeOnOverlayClick","color","fontSize","mb","bg","borderRadius","p","onChange","e","shouldWarn","target","checked","variant","hasArrow","label","placement","hasIcon","hasWarning","noFollow","localStorage","setItem","JSON","stringify","colorScheme","ml","rightIcon","ExternalLink","tabIndex","ExternalLinkWarningContext","createContext","useExternalLinkWarning","useContext","ExternalLinkWarningProvider","children","modalOption","setModalOptions","useDisclosure","onOpen","saved","getItem","parse","withPrompt","useCallback","preventDefault","Provider","value","Language","languageFilename","TypeScript","Python","Go","Java","DotNet","LANGUAGES","LANGUAGE_NAME_MAP","TEMP_SUPPORTED_LANGUAGES","Set","LANGUAGE_RENDER_MAP","name","typescript","icon","props","transform","viewBox","d","fill","python","version","id","offset","stopColor","gradientUnits","x1","x2","xlinkHref","y1","y2","overflow","style","marker","java","golang","dotnet","AnalyticsContext","trackPageView","AnalyticsProvider","pathname","useLocation","prevPath","useRef","opts","current","window","AWSMA","ready","document","dispatchEvent","CustomEvent","TRIGGER_EVENT","detail","usePageView","options","useMemo","page","pageURL","location","replace","event","type","description","takePage","items","limit","start","stop","slice","useCatalogResults","cdkMajor","cdkType","query","language","languages","sort","tags","results","filters","instance","useSearchContext","Error","search","values","useSearch","undefined","data","pageLimit","Math","floor","length","usePagination","CDKTypeIcon","forwardRef","ref","alt","CDKTYPE_RENDER_MAP","h","src","imgsrc","w","CDKTypeText","majorVersion","API_PATHS","PACKAGES_PREFIX","CATALOG_SUFFIX","ASSEMBLY_SUFFIX","METADATA_SUFFIX","CONFIG","STATS","QUERY_PARAMS","CDK_TYPE","LANGUAGE","OFFSET","SEARCH_QUERY","SORT","SUBMODULE","CDK_MAJOR","TAGS","ROUTES","FAQ","HOME","PACKAGES","SEARCH","SITE_TERMS","DEFAULT_FEATURED_PACKAGES","sections","showLastUpdated","defaultConfig","featureFlags","packageLinks","featuredPackages","fetchConfig","a","configOverride","fetch","response","ok","console","log","json","catch","err","error","STORAGE_KEY","DevPreviewBanner","defaultIsOpen","sessionStorage","in","Card","border","boxShadow","mt","mx","position","role","InfoOutline","left","top","textAlign","CONSTRUCT_HUB_REPO_URL","textDecoration","Close","right","size","Form","form","displayName","useDebounce","debouncedValue","setDebouncedValue","delay","useEffect","handler","setTimeout","clearTimeout","SearchItem","_hover","cursor","alignItems","display","lineHeight","listStyleType","minH","onKeyDown","includes","key","px","sx","onPerfEntry","getLocalStoreWriter","URLSearchParams","get","initialize","Promise","resolve","reject","addEventListener","domain","hostname","navigator","__storeWriter","AWSCShortbread","callIfDefined","method","access","checkForCookieConsent","customizeCookies","getConsentCookie","hasConsent","shortbread","publicAPI","ShortbreadContext","ShortbreadProvider","isReady","setIsReady","isCancelled","then","FOOTER_LINKS","SERVICE_TERMS","url","testId","PRIVACY","isExternal","LEGAL","testIds","createTestIds","Object","map","Footer","align","as","container","direction","justify","py","columnGap","columns","links","entries","index","base","md","borderColor","mr","orientation","NavLink","to","sm","disclaimer","manageCookies","fontWeight","NavPopover","menuProps","strategy","Link","isNavLink","justifyContent","NavPopoverContent","item","idx","title","link","linkIdx","NavPopoverTrigger","Button","ChevronDown","DocumentationDropdown","documentationTrigger","documentationMenu","DOCUMENTATION","GettingStartedDropdown","gettingStartedTrigger","gettingStartedMenu","GETTING_STARTED","SearchModal","useCatalogSearch","onQueryChange","onSubmit","onSearch","pb","spacing","SearchBar","HeaderSearch","searchModal","exact","path","searchInput","searchIcon","Search","linkProps","MobileNavLinksContent","flex","itemIdx","borderBottom","pt","MobileNavLinks","allowMultiple","allowToggle","defaultIndex","_","i","section","Title","MobileNav","mobileNav","NavButton","nav","navOpen","Hamburger","HeaderItem","rowStart","Header","gap","gridTemplateColumns","gridTemplateRows","maxW","zIndex","colStart","justifySelf","placeItems","LazyRoute","Component","component","routeProps","fallback","PageLoader","lazy","Home","NotFound","Packages","SearchRedesign","SiteTerms","App","showBanner","theme","components","Code","variants","subtle","whiteSpace","Divider","defaultProps","createVariant","overrides","varBase","Tag","makeTag","config","customVariants","reduce","accum","keyword","background","transparentize","baseStyle","makeComponents","foundations","borders","colors","blue","bgPrimary","radii","card","sizes","shadows","makeTheme","componentsConfig","packageTags","extendTheme","initialColorMode","useSystemColorMode","Theme","useConfig","loading","resetCSS","Boolean","match","ReactDOM","render","StrictMode","Analytics","Config","Catalog","Stats","ExternalLinkWarning","getElementById","Function","getCLS","getFID","getFCP","getLCP","getTTFB","serviceWorker","registration","unregister","message","rel","CatalogSearchSort","scope","ids","acc","curr","CDKType","CDKTYPE_NAME_MAP","awscdk","cdktf","cdk8s","RouterLink","fetchPackages","statusText","CatalogContext","useCatalog","CatalogProvider","useRequest","requestPackages","catalogResponse","SearchBarState","useSearchBarState","state","hasButton","inputProps","disclosure","inputRef","searchAPI","catalog","roundedCatalogLength","round","packages","placeholder","clickListener","contains","kbdListener","blur","removeEventListener","pos","_focus","input","onFocus","borderLeftRadius","searchButton","SearchOverlay","overlay","inset","opacity","SearchSuggestions","debouncedQuery","push","useHistory","recommendations","UnorderedList","suggestionsList","pkg","constructFramework","metadata","suggestion","getPackagePath","requestFn","initialValue","onSuccess","onError","setLoading","setData","setError","mountedRef","statefulFetch","res","gitSSHRegex","RegExp","getRepoUrlAndHost","repoUrl","sshUrl","author","repo","URL","createURL","params","searchParams","filter","forEach","k","v","set","toString","createURLSearchParams","getSearchPath","join","submodule","defaultStats","updated","fetchStats","StatsContext","useStats","StatsProvider","requestStats","statsResponse","ConfigContext","LOCAL_CONFIG","ConfigProvider","stored","configData","setConfigData","requestConfig","configResponse","getDateSort","isAscending","p1","p2","d1","Date","date","d2","getStrSort","localeCompare","getDownloadsSort","downloads","SORT_FUNCTIONS","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","DownloadsAsc","DownloadsDesc","FILTER_FUNCTIONS","languageSet","has","keys","some","lang","tag","CatalogSearchAPI","catalogData","stats","constructFrameworks","catalogMap","keywords","npm","Map","this","detectConstructFrameworks","lunr","field","split","packageName","authorName","email","authorEmail","add","refs","copiedResults","filterFunctions","result","isFiltered","filterFn","delete","frameworks","frameworkName","entry","majorVersions","pkgCount","SearchContext","SearchProvider","catalogLoading","statsData","statsLoading","defaultQuery","setQuery","defaultCdkType","setCdkType","defaultCdkMajor","setCdkMajor","defaultLanguages","setLanguages","defaultTags","setTags","defaultLanguage","setLanguage","defaultSort","setSort","onLanguageChange"],"mappings":"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","file":"static/js/main.19a82dfa.chunk.js","sourcesContent":["import type { MouseEventHandler } from \"react\";\n\nexport interface ExternalLinkPromptOptions {\n href?: string;\n onClick?: MouseEventHandler<HTMLAnchorElement>;\n}\n\nexport type ExternalLinkPrompt = ({\n href,\n onClick,\n}: ExternalLinkPromptOptions) => typeof onClick;\n\nexport const PREFERS_WARN_ON_EXTERNAL_LINK_CLICK =\n \"prefersWarnOnExternalLinkClick\";\n","import { ExternalLinkIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Checkbox,\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalOverlay,\n Text,\n Tooltip,\n} from \"@chakra-ui/react\";\nimport {\n ChangeEventHandler,\n FunctionComponent,\n MouseEventHandler,\n useState,\n} from \"react\";\nimport { ExternalLink } from \"../../components/ExternalLink\";\nimport {\n ExternalLinkPromptOptions,\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n} from \"./constants\";\n\nexport interface ExternalLinkWarningModalProps\n extends ExternalLinkPromptOptions {\n isOpen: boolean;\n onClose: () => void;\n setShouldWarn: (shouldWarn: boolean) => void;\n}\n\nexport const ExternalLinkWarningModal: FunctionComponent<ExternalLinkWarningModalProps> =\n ({ href, isOpen, onClick, onClose, setShouldWarn }) => {\n // Track a final state for showing warnings that will only be updated if a user chooses to proceed\n const [finalShouldWarn, setFinalShouldWarn] = useState(true);\n\n // Update intermediate state when preference checkmark is updated\n const onPreferenceUpdated: ChangeEventHandler<HTMLInputElement> = (e) => {\n const shouldWarn = !e.target.checked;\n setFinalShouldWarn(shouldWarn);\n };\n\n const onCancel = () => {\n // If user cancelled the navigation, reset final warning state\n setFinalShouldWarn(true);\n onClose();\n };\n\n const onProceed: MouseEventHandler<HTMLAnchorElement> = (e) => {\n // If a user decided to not show warnings in the future, update localStorage & state to reflect their decision\n if (!finalShouldWarn) {\n setShouldWarn(finalShouldWarn);\n\n try {\n localStorage.setItem(\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n JSON.stringify(finalShouldWarn)\n );\n } catch {}\n }\n\n onClick?.(e);\n onClose();\n };\n\n return (\n <Modal closeOnOverlayClick={false} isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent color=\"blue.800\">\n <ModalHeader>Confirm</ModalHeader>\n <ModalBody>\n <Text fontSize=\"lg\" mb={2}>\n This link is taking you to an external site\n </Text>\n <Text\n bg=\"gray.100\"\n borderRadius=\"sm\"\n color=\"blue.500\"\n fontSize=\"sm\"\n mb={4}\n p={1}\n >\n {href}\n </Text>\n <Checkbox onChange={onPreferenceUpdated}>\n Do not show this warning again.\n </Checkbox>\n </ModalBody>\n <ModalFooter>\n <Button onClick={onCancel} variant=\"ghost\">\n Cancel\n </Button>\n\n <Tooltip hasArrow label={href} placement=\"top\">\n <ExternalLink\n hasIcon={false}\n hasWarning={false}\n href={href}\n noFollow\n onClick={onProceed}\n >\n <Button\n colorScheme=\"blue\"\n ml={4}\n rightIcon={<ExternalLinkIcon />}\n tabIndex={0}\n variant=\"ghost\"\n >\n Proceed\n </Button>\n </ExternalLink>\n </Tooltip>\n </ModalFooter>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n );\n };\n","import { useDisclosure } from \"@chakra-ui/react\";\nimport {\n useContext,\n useState,\n createContext,\n FunctionComponent,\n MouseEventHandler,\n useCallback,\n} from \"react\";\nimport {\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n ExternalLinkPrompt,\n ExternalLinkPromptOptions,\n} from \"./constants\";\nimport { ExternalLinkWarningModal } from \"./ExternalLinkWarningModal\";\n\nconst ExternalLinkWarningContext = createContext<ExternalLinkPrompt>(\n ({ onClick }) => onClick\n);\n\nexport const useExternalLinkWarning = () =>\n useContext(ExternalLinkWarningContext);\n\nexport const ExternalLinkWarningProvider: FunctionComponent = ({\n children,\n}) => {\n const [modalOption, setModalOptions] =\n useState<ExternalLinkPromptOptions | null>(null);\n\n const { isOpen, onOpen, onClose } = useDisclosure({\n // Reset the modal options when closed\n onClose: () => {\n setModalOptions(null);\n },\n });\n\n // Determines initial state from localStorage. If no value is found, default to showing warning\n const [shouldWarn, setShouldWarn] = useState(() => {\n try {\n const saved =\n localStorage.getItem(PREFERS_WARN_ON_EXTERNAL_LINK_CLICK) ?? \"true\";\n return JSON.parse(saved);\n } catch {\n return true;\n }\n });\n\n // Takes in an href & onClick to set options for modal. If it should warn the user, it will wrap the onClick\n // With additional logic to show the modal\n const withPrompt = useCallback<ExternalLinkPrompt>(\n ({ href, onClick }) => {\n if (!shouldWarn) return onClick;\n\n const handler: MouseEventHandler<HTMLAnchorElement> = (e) => {\n setModalOptions({ href, onClick });\n e.preventDefault();\n onOpen();\n };\n\n return handler;\n },\n [onOpen, shouldWarn]\n );\n\n return (\n <ExternalLinkWarningContext.Provider value={withPrompt}>\n {children}\n <ExternalLinkWarningModal\n isOpen={isOpen}\n onClose={onClose}\n setShouldWarn={setShouldWarn}\n {...modalOption}\n />\n </ExternalLinkWarningContext.Provider>\n );\n};\n","import type { PropsOf, Icon } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { DotNetIcon } from \"../icons/DotNetIcon\";\nimport { GoIcon } from \"../icons/GoIcon\";\nimport { JavaIcon } from \"../icons/JavaIcon\";\nimport { PythonIcon } from \"../icons/PythonIcon\";\nimport { TSIcon } from \"../icons/TSIcon\";\n\nexport enum Language {\n DotNet = \"dotnet\",\n TypeScript = \"typescript\",\n Python = \"python\",\n Go = \"golang\",\n Java = \"java\",\n}\n\nexport const languageFilename = {\n [Language.TypeScript]: Language.TypeScript,\n [Language.Python]: Language.Python,\n [Language.Go]: Language.Go,\n [Language.Java]: Language.Java,\n [Language.DotNet]: \"csharp\",\n};\n\n/**\n * The sorted list of all available languages.\n */\nexport const LANGUAGES: readonly Language[] = [\n Language.TypeScript,\n Language.Python,\n Language.Java,\n Language.Go,\n Language.DotNet,\n];\n\nexport const LANGUAGE_NAME_MAP: { readonly [key in Language]: string } = {\n [Language.TypeScript]: \"TypeScript\",\n [Language.Python]: \"Python\",\n [Language.Java]: \"Java\",\n [Language.Go]: \"Go\",\n [Language.DotNet]: \".NET\",\n};\n\nexport const TEMP_SUPPORTED_LANGUAGES: ReadonlySet<Language> = new Set([\n Language.Python,\n Language.TypeScript,\n Language.Java,\n Language.DotNet,\n]);\n\nexport const LANGUAGE_RENDER_MAP: {\n readonly [key in Language]: {\n readonly name: string;\n readonly icon: FunctionComponent<PropsOf<typeof Icon>>;\n };\n} = {\n [Language.TypeScript]: {\n name: LANGUAGE_NAME_MAP.typescript,\n icon: TSIcon,\n },\n [Language.Python]: {\n name: LANGUAGE_NAME_MAP.python,\n icon: PythonIcon,\n },\n [Language.Java]: {\n name: LANGUAGE_NAME_MAP.java,\n icon: JavaIcon,\n },\n [Language.Go]: {\n name: LANGUAGE_NAME_MAP.golang,\n icon: GoIcon,\n },\n [Language.DotNet]: {\n name: LANGUAGE_NAME_MAP.dotnet,\n icon: DotNetIcon,\n },\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const TSIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 256 256\"\n >\n <path d=\"M0 128v128h256V0H0z\" fill=\"#007ACC\" />\n <path\n d=\"M56.611 128.85l-.081 10.483h33.32v94.68h23.57v-94.68h33.32v-10.28c0-5.69-.122-10.444-.284-10.566-.122-.162-20.399-.244-44.983-.203l-44.739.122-.122 10.443zM206.567 118.108c6.501 1.626 11.459 4.51 16.01 9.224 2.357 2.52 5.851 7.112 6.136 8.209.08.325-11.053 7.802-17.798 11.987-.244.163-1.22-.894-2.317-2.52-3.291-4.794-6.745-6.867-12.028-7.232-7.76-.529-12.759 3.535-12.718 10.32 0 1.992.284 3.17 1.097 4.796 1.707 3.535 4.876 5.648 14.832 9.955 18.326 7.884 26.168 13.085 31.045 20.48 5.445 8.25 6.664 21.415 2.966 31.208-4.063 10.646-14.14 17.88-28.323 20.277-4.388.772-14.79.65-19.504-.203-10.28-1.829-20.033-6.908-26.047-13.572-2.357-2.601-6.949-9.387-6.664-9.875.122-.162 1.178-.812 2.356-1.503 1.138-.65 5.446-3.13 9.509-5.486l7.355-4.267 1.544 2.276c2.154 3.291 6.867 7.802 9.712 9.305 8.167 4.308 19.383 3.698 24.909-1.26 2.357-2.153 3.332-4.388 3.332-7.68 0-2.966-.366-4.266-1.91-6.5-1.99-2.845-6.054-5.243-17.595-10.24-13.206-5.69-18.895-9.225-24.096-14.833-3.007-3.25-5.852-8.452-7.03-12.8-.975-3.616-1.22-12.678-.447-16.335 2.723-12.76 12.353-21.658 26.25-24.3 4.51-.853 14.994-.528 19.424.57z\"\n fill=\"#FFF\"\n />\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const PythonIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon {...props} version=\"1.0\" viewBox=\"0 0 110.421 109.846\">\n <defs>\n <linearGradient id=\"a\">\n <stop offset=\"0\" stopColor=\"#ffe052\" />\n <stop offset=\"1\" stopColor=\"#ffc331\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id=\"d\"\n x1=\"89.137\"\n x2=\"147.777\"\n xlinkHref=\"#a\"\n y1=\"111.921\"\n y2=\"168.101\"\n />\n <linearGradient id=\"b\">\n <stop offset=\"0\" stopColor=\"#387eb8\" />\n <stop offset=\"1\" stopColor=\"#366994\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id=\"c\"\n x1=\"55.549\"\n x2=\"110.149\"\n xlinkHref=\"#b\"\n y1=\"77.07\"\n y2=\"131.853\"\n />\n </defs>\n <g color=\"#000\">\n <path\n d=\"M99.75 67.469c-28.032 0-26.281 12.156-26.281 12.156l.031 12.594h26.75V96H62.875s-17.938-2.034-17.938 26.25 15.657 27.281 15.657 27.281h9.343v-13.125s-.503-15.656 15.407-15.656h26.531s14.906.241 14.906-14.406V82.125s2.263-14.656-27.031-14.656zM85 75.938a4.808 4.808 0 014.813 4.812A4.808 4.808 0 0185 85.563a4.808 4.808 0 01-4.813-4.813A4.808 4.808 0 0185 75.937z\"\n fill=\"url(#c)\"\n overflow=\"visible\"\n style={{ marker: \"none\" }}\n transform=\"translate(-44.938 -67.469)\"\n />\n <path\n d=\"M100.546 177.315c28.032 0 26.281-12.156 26.281-12.156l-.03-12.594h-26.75v-3.781h37.374s17.938 2.034 17.938-26.25c0-28.285-15.657-27.282-15.657-27.282h-9.343v13.125s.503 15.657-15.407 15.657h-26.53s-14.907-.241-14.907 14.406v24.219s-2.263 14.656 27.031 14.656zm14.75-8.469a4.808 4.808 0 01-4.812-4.812 4.808 4.808 0 014.812-4.813 4.808 4.808 0 014.813 4.813 4.808 4.808 0 01-4.813 4.812z\"\n fill=\"url(#d)\"\n overflow=\"visible\"\n style={{ marker: \"none\" }}\n transform=\"translate(-44.938 -67.469)\"\n />\n </g>\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const JavaIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 256 346\"\n >\n <path\n d=\"M82.554 267.473s-13.198 7.675 9.393 10.272c27.369 3.122 41.356 2.675 71.517-3.034 0 0 7.93 4.972 19.003 9.279-67.611 28.977-153.019-1.679-99.913-16.517M74.292 229.659s-14.803 10.958 7.805 13.296c29.236 3.016 52.324 3.263 92.276-4.43 0 0 5.526 5.602 14.215 8.666-81.747 23.904-172.798 1.885-114.296-17.532\"\n fill=\"#5382A1\"\n />\n <path\n d=\"M143.942 165.515c16.66 19.18-4.377 36.44-4.377 36.44s42.301-21.837 22.874-49.183c-18.144-25.5-32.059-38.172 43.268-81.858 0 0-118.238 29.53-61.765 94.6\"\n fill=\"#E76F00\"\n />\n <path\n d=\"M233.364 295.442s9.767 8.047-10.757 14.273c-39.026 11.823-162.432 15.393-196.714.471-12.323-5.36 10.787-12.8 18.056-14.362 7.581-1.644 11.914-1.337 11.914-1.337-13.705-9.655-88.583 18.957-38.034 27.15 137.853 22.356 251.292-10.066 215.535-26.195M88.9 190.48s-62.771 14.91-22.228 20.323c17.118 2.292 51.243 1.774 83.03-.89 25.978-2.19 52.063-6.85 52.063-6.85s-9.16 3.923-15.787 8.448c-63.744 16.765-186.886 8.966-151.435-8.183 29.981-14.492 54.358-12.848 54.358-12.848M201.506 253.422c64.8-33.672 34.839-66.03 13.927-61.67-5.126 1.066-7.411 1.99-7.411 1.99s1.903-2.98 5.537-4.27c41.37-14.545 73.187 42.897-13.355 65.647 0 .001 1.003-.895 1.302-1.697\"\n fill=\"#5382A1\"\n />\n <path\n d=\"M162.439.371s35.887 35.9-34.037 91.101c-56.071 44.282-12.786 69.53-.023 98.377-32.73-29.53-56.75-55.526-40.635-79.72C111.395 74.612 176.918 57.393 162.439.37\"\n fill=\"#E76F00\"\n />\n <path\n d=\"M95.268 344.665c62.199 3.982 157.712-2.209 159.974-31.64 0 0-4.348 11.158-51.404 20.018-53.088 9.99-118.564 8.824-157.399 2.421.001 0 7.95 6.58 48.83 9.201\"\n fill=\"#5382A1\"\n />\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const GoIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 512 192\"\n >\n <path\n d=\"M292.533 13.295l1.124.75c13.212 8.725 22.685 20.691 28.917 35.15 1.496 2.243.499 3.49-2.493 4.237l-5.063 1.296c-11.447 2.949-20.53 5.429-31.827 8.378l-6.443 1.678c-2.32.574-2.96.333-5.428-2.477l-.348-.399c-3.519-3.988-6.155-6.652-10.817-9.03l-.899-.443c-15.705-7.727-30.911-5.484-45.12 3.74-16.952 10.968-25.677 27.172-25.428 47.364.25 19.942 13.96 36.395 33.654 39.137 16.951 2.244 31.16-3.739 42.378-16.452 2.244-2.743 4.238-5.734 6.73-9.224h-48.11c-5.235 0-6.481-3.24-4.736-7.478l.864-2.035c3.204-7.454 8.173-18.168 11.4-24.294l.704-1.319c.862-1.494 2.612-3.513 5.977-3.513h80.224c3.603-11.415 9.449-22.201 17.246-32.407 18.198-23.931 40.135-36.396 69.8-41.63 25.427-4.488 49.359-1.995 71.046 12.713 19.694 13.461 31.909 31.66 35.15 55.59 4.237 33.654-5.485 61.075-28.668 84.508-16.453 16.702-36.645 27.172-59.829 31.908-6.73 1.247-13.461 1.496-19.942 2.244-22.685-.499-43.376-6.98-60.826-21.937-12.273-10.61-20.727-23.648-24.928-38.828a104.937 104.937 0 01-10.47 16.89c-17.949 23.683-41.381 38.39-71.046 42.38-24.43 3.24-47.115-1.497-67.058-16.454-18.447-13.96-28.917-32.407-31.66-55.34-3.24-27.173 4.737-51.603 21.19-73.041 17.7-23.184 41.132-37.891 69.8-43.126 22.999-4.16 45.037-1.595 64.936 11.464zM411.12 49.017l-.798.178c-23.183 5.235-38.14 19.942-43.624 43.375-4.488 19.444 4.985 39.138 22.934 47.115 13.71 5.983 27.421 5.235 40.633-1.496 19.694-10.22 30.413-26.175 31.66-47.613-.25-3.24-.25-5.734-.749-8.227-4.436-24.401-26.664-38.324-50.056-33.332zM116.416 94.564c.997 0 1.496.748 1.496 1.745l-.499 5.983c0 .997-.997 1.745-1.745 1.745l-54.344-.249c-.997 0-1.246-.748-.748-1.496l3.49-6.232c.499-.748 1.496-1.496 2.493-1.496h49.857zM121.9 71.63c.997 0 1.496.748 1.247 1.496l-1.995 5.983c-.249.997-1.246 1.495-2.243 1.495l-117.912.25c-.997 0-1.246-.499-.748-1.247l5.235-6.73c.499-.748 1.745-1.247 2.742-1.247H121.9zm12.963-22.934c.997 0 1.246.748.748 1.496l-4.238 6.481c-.499.748-1.745 1.496-2.493 1.496l-90.24-.25c-.998 0-1.247-.498-.749-1.246l5.235-6.73c.499-.748 1.745-1.247 2.742-1.247h88.995z\"\n fill=\"#00ACD7\"\n />\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const DotNetIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 32 32\"\n >\n <path\n d=\"M4.224 10.089v11.667h1.365v-8.438a12.58 12.58 0 00-.068-1.599h.052c.099.255.224.5.37.729l6 9.302h1.672V10.089h-1.359v8.203c-.016.573.016 1.146.083 1.714h-.031a13.986 13.986 0 00-.474-.781L5.995 10.09zm12.417 0v11.667h6.203l.005-1.281h-4.813v-4.047h4.214v-1.229h-4.214v-3.875h4.521V10.09zm7.25 0v1.234h3.354v10.432h1.365V11.323h3.391v-1.234zm-23.021 10a.86.86 0 00-.609.276.91.91 0 00-.26.641.901.901 0 001.542.641c.172-.167.271-.401.271-.641s-.099-.474-.271-.641a.876.876 0 00-.641-.276H.871z\"\n fill=\"#626262\"\n />\n </Icon>\n );\n};\n","import {\n useContext,\n useCallback,\n useRef,\n createContext,\n FunctionComponent,\n} from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { PageViewConfig } from \"./types\";\n\nexport interface AnalyticsAPI {\n trackPageView: (opts: PageViewConfig) => void;\n}\n\nconst AnalyticsContext = createContext<AnalyticsAPI>({\n trackPageView: () => {},\n});\n\nexport const useAnalytics = () => useContext(AnalyticsContext);\n\nexport const AnalyticsProvider: FunctionComponent = ({ children }) => {\n const { pathname } = useLocation();\n\n const prevPath = useRef<null | string>(null);\n\n const trackPageView = useCallback(\n (opts: PageViewConfig) => {\n if (prevPath.current === pathname) {\n return;\n }\n\n window?.AWSMA?.ready?.(() => {\n document.dispatchEvent(\n new CustomEvent(window.AWSMA.TRIGGER_EVENT, { detail: opts })\n );\n\n prevPath.current = pathname;\n });\n },\n [pathname]\n );\n\n return (\n <AnalyticsContext.Provider value={{ trackPageView }}>\n {children}\n </AnalyticsContext.Provider>\n );\n};\n","import { useCallback, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { useAnalytics } from \"./Analytics\";\nimport type { PageViewOptions, PageViewConfig } from \"./types\";\n\nexport const usePageView = (opts: PageViewOptions) => {\n const { trackPageView } = useAnalytics();\n const { pathname } = useLocation();\n\n const options: PageViewConfig = useMemo(\n () => ({\n page: {\n // This is silly but the analytics library crashes in dev if using localhost as the pageURL :/\n pageURL: window.location.href.replace(\n \"://localhost:3000\",\n \"://constructs.local.dev\"\n ),\n ...opts.page,\n },\n event: {\n type: \"pageview\",\n name: opts.event.name,\n description: opts.event.description,\n },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pathname, opts]\n );\n\n const track = useCallback(() => {\n return trackPageView(options);\n }, [trackPageView, options]);\n\n return track;\n};\n","import { useMemo } from \"react\";\n\nexport interface UsePaginationOptions {\n limit?: number;\n offset?: number;\n}\n\nconst takePage = <T extends any[]>(\n items: T,\n opts: Required<UsePaginationOptions>\n) => {\n const { limit, offset } = opts;\n const start = offset * limit;\n const stop = start + limit;\n return items.slice(start, stop);\n};\n\nexport const usePagination = <T extends any[]>(\n data: T,\n options?: UsePaginationOptions\n) => {\n const { limit = 25, offset = 0 } = options ?? {};\n const pageLimit = data ? Math.floor(data.length / limit) : 0;\n\n return useMemo(\n () => ({\n page: takePage(data, {\n limit,\n offset: offset > pageLimit ? pageLimit : offset,\n }) as T,\n pageLimit,\n }),\n [data, limit, offset, pageLimit]\n );\n};\n","import { useMemo } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { usePagination } from \"../usePagination\";\nimport { useSearch } from \"../useSearch\";\n\nexport interface UseCatalogResultsOptions {\n cdkMajor?: number;\n cdkType?: CDKType;\n limit: number;\n offset?: number;\n query?: string;\n language?: Language | null;\n languages?: Language[];\n sort?: CatalogSearchSort;\n tags?: string[];\n}\n\n/**\n * A hook to wrap `useSearch` results with pagination and parameter memoization\n * This hook depends on an upstream provider - `<SearchProvider />`, which wraps all pages.\n */\nexport const useCatalogResults = ({\n cdkMajor,\n cdkType,\n limit,\n offset = 0,\n query = \"\",\n language = null,\n languages,\n sort,\n tags,\n}: UseCatalogResultsOptions) => {\n const filters = useMemo(\n () => ({\n cdkMajor,\n cdkType,\n language: language ?? undefined,\n languages,\n tags,\n }),\n [cdkMajor, cdkType, language, languages, tags]\n );\n\n const results = useSearch({\n filters,\n query,\n sort,\n });\n\n const { page, pageLimit } = usePagination(results, {\n offset,\n limit,\n });\n\n return useMemo(\n () => ({ results, page, pageLimit }),\n [page, pageLimit, results]\n );\n};\n","import { useMemo } from \"react\";\nimport type { CatalogSearchParams } from \"../../api/catalog-search\";\nimport { useSearchContext } from \"../../contexts/Search\";\n\n/**\n * A hook which returns a list of packages returned by the CatalogSearchAPI.\n * Generally this hook will be called via `useCatalogSearchResults` which wraps this functionality with pagination\n * This hook depends on an upstream provider - `<SearchProvider />`, which wraps all pages.\n */\nexport const useSearch = ({\n query,\n filters,\n sort,\n}: CatalogSearchParams = {}) => {\n const instance = useSearchContext();\n\n if (!instance) {\n throw new Error(\n \"This hook can only be called within a descendant of a <SearchProvider />\"\n );\n }\n\n const results = useMemo(\n () => [\n ...instance\n .search({\n query,\n filters,\n sort,\n })\n .values(),\n ],\n [instance, query, filters, sort]\n );\n\n return results;\n};\n","import {\n forwardRef,\n Image,\n ImageProps,\n Text,\n TextProps,\n} from \"@chakra-ui/react\";\nimport { CDKType, CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\n\ninterface CDKTypeIconProps extends ImageProps {\n name?: CDKType;\n}\n\nexport const CDKTypeIcon = forwardRef<CDKTypeIconProps, \"img\">(\n ({ name, ...props }, ref) => {\n if (!name) return null;\n\n return (\n <Image\n alt={`${CDKTYPE_RENDER_MAP[name].name} Logo`}\n h={5}\n ref={ref}\n src={CDKTYPE_RENDER_MAP[name].imgsrc}\n w={5}\n {...props}\n />\n );\n }\n);\n\ninterface CDKTypeTextProps extends TextProps {\n name?: CDKType;\n majorVersion?: number;\n}\n\nexport const CDKTypeText = forwardRef<CDKTypeTextProps, \"p\">(\n ({ name, majorVersion, ...props }, ref) => {\n if (!name) return null;\n\n return (\n <Text ref={ref} {...props}>\n {CDKTYPE_RENDER_MAP[name].name}\n {majorVersion !== undefined ? ` v${majorVersion}` : \"\"}\n </Text>\n );\n }\n);\n","export const API_PATHS = {\n PACKAGES_PREFIX: \"/data\",\n CATALOG_SUFFIX: \"/catalog.json\",\n ASSEMBLY_SUFFIX: \"/assembly.json\",\n METADATA_SUFFIX: \"/metadata.json\",\n CONFIG: \"/config.json\",\n STATS: \"/stats.json\",\n} as const;\n\nexport const QUERY_PARAMS = {\n CDK_TYPE: \"cdk\",\n LANGUAGE: \"lang\",\n LANGUAGES: \"langs\",\n OFFSET: \"offset\",\n SEARCH_QUERY: \"q\",\n SORT: \"sort\",\n SUBMODULE: \"submodule\",\n CDK_MAJOR: \"cdkver\",\n TAGS: \"tags\",\n} as const;\n\nexport const ROUTES = {\n FAQ: \"/faq\",\n HOME: \"/\",\n PACKAGES: \"/packages\",\n SEARCH: \"/search\",\n SITE_TERMS: \"/terms\",\n};\n\ntype QueryParams = typeof QUERY_PARAMS;\n\nexport type QueryParamKey = QueryParams[keyof QueryParams];\n","import { API_PATHS } from \"../../constants/url\";\n\nexport interface PackageLinkConfig {\n linkLabel: string;\n configKey: string;\n linkText?: string;\n}\n\nexport interface PackageKeyword {\n label: string;\n color?: string;\n}\n\nexport interface PackageHighlight extends PackageKeyword {\n icon?: string;\n}\n\nexport interface PackageTagConfig {\n id: string;\n keyword?: PackageKeyword;\n highlight?: PackageHighlight;\n searchFilter?: {\n groupBy: string;\n display: string;\n };\n}\n\n/**\n * Configuration for packages to feature on the home page.\n */\nexport interface FeaturedPackages {\n /**\n * Grouped sections of packages on the homepage.\n */\n readonly sections: FeaturedPackagesSection[];\n}\n\n/**\n * Customization options for one section of the home page.\n */\nexport interface FeaturedPackagesSection {\n /**\n * The name of the section (displayed as a header).\n */\n readonly name: string;\n\n /**\n * Show the N most recently updated packages in this section.\n * Cannot be used with `showPackages`.\n */\n readonly showLastUpdated?: number;\n\n /**\n * Show an explicit list of packages.\n * Cannot be used with `showLastUpdated`.\n */\n readonly showPackages?: FeaturedPackagesDetail[];\n}\n\n/**\n * Customization options for a specific package on the home page.\n */\nexport interface FeaturedPackagesDetail {\n /**\n * The name of the package.\n */\n readonly name: string;\n\n /**\n * An additional comment to include with the package.\n */\n readonly comment?: string;\n}\n\nexport interface FeatureFlags {}\n\nexport interface Config {\n featureFlags?: FeatureFlags;\n packageLinks?: PackageLinkConfig[];\n featuredPackages?: FeaturedPackages;\n packageTags?: PackageTagConfig[];\n}\n\nexport const DEFAULT_FEATURED_PACKAGES = {\n sections: [\n {\n name: \"Recently updated\",\n showLastUpdated: 10,\n },\n ],\n};\n\nconst defaultConfig: Config = {\n featureFlags: {},\n packageLinks: [],\n featuredPackages: DEFAULT_FEATURED_PACKAGES,\n};\n\nexport const fetchConfig = async (): Promise<Config> => {\n if (window.configOverride) {\n return window.configOverride;\n }\n\n const response = await fetch(API_PATHS.CONFIG);\n\n if (!response.ok) {\n console.log(\"Failed to fetch application config, using default values\");\n return defaultConfig;\n }\n\n return response.json().catch((err) => {\n console.error(err);\n console.log(\"Invalid config response, using default values\");\n return defaultConfig;\n });\n};\n","import { CloseIcon, InfoOutlineIcon } from \"@chakra-ui/icons\";\nimport {\n Box,\n IconButton,\n Collapse,\n Text,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { CONSTRUCT_HUB_REPO_URL } from \"../../constants/links\";\nimport { Card } from \"../Card\";\nimport { ExternalLink } from \"../ExternalLink\";\n\nconst STORAGE_KEY = \"showing-dev-preview-banner\";\n\nexport const DevPreviewBanner: FunctionComponent = () => {\n const { isOpen, onClose } = useDisclosure({\n defaultIsOpen: JSON.parse(\n window.sessionStorage.getItem(STORAGE_KEY) ?? \"true\"\n ),\n onClose: () => window.sessionStorage.setItem(STORAGE_KEY, \"false\"),\n });\n\n return (\n <Box h=\"max-content\">\n <Collapse in={isOpen}>\n <Card\n aria-label=\"Preview Banner\"\n bg=\"blue.500\"\n border=\"none\"\n boxShadow=\"none\"\n color=\"white\"\n mt={4}\n mx={4}\n p={4}\n position=\"relative\"\n role=\"alertdialog\"\n >\n <InfoOutlineIcon h={5} left={4} position=\"absolute\" top={4} w={5} />\n <Text fontSize=\"md\" mx={8} textAlign=\"center\">\n This application is in Dev Preview. Some features may change. If you\n find any issues, please report them{\" \"}\n <ExternalLink\n color=\"inherit\"\n hasWarning={false}\n href={`${CONSTRUCT_HUB_REPO_URL}/issues`}\n textDecoration=\"underline\"\n >\n here\n </ExternalLink>\n </Text>\n <IconButton\n aria-label=\"Dismiss banner\"\n colorScheme=\"white\"\n icon={<CloseIcon />}\n onClick={onClose}\n position=\"absolute\"\n right={4}\n size=\"xs\"\n top={3}\n variant=\"ghost\"\n />\n </Card>\n </Collapse>\n </Box>\n );\n};\n","import { chakra, HTMLChakraProps, forwardRef } from \"@chakra-ui/react\";\n\nexport interface FormProps extends HTMLChakraProps<\"form\"> {}\n\nexport const Form = forwardRef<FormProps, \"form\">((props, ref) => (\n <chakra.form {...props} ref={ref} />\n));\n\nForm.displayName = \"Form\";\n","import { useState, useEffect } from \"react\";\n\nexport interface UseDebounceOptions<T> {\n delay?: number;\n onChange?: (val: T) => void;\n}\n\nexport const useDebounce = <T>(\n value: T,\n options: UseDebounceOptions<T> = {}\n) => {\n const [debouncedValue, setDebouncedValue] = useState(value);\n const { delay = 250, onChange } = options;\n\n useEffect(() => {\n // Update value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n onChange?.(value);\n }, delay);\n\n // Cancel timeout when value / delay changes\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay, onChange]);\n\n return debouncedValue;\n};\n","import { HTMLChakraProps, ListItem, forwardRef } from \"@chakra-ui/react\";\nimport type { KeyboardEventHandler, ReactNode } from \"react\";\n\nexport interface SearchItemProps extends HTMLChakraProps<\"li\"> {\n name: ReactNode;\n onClick: () => void;\n}\n\nexport const SearchItem = forwardRef<SearchItemProps, \"li\">(\n ({ name, onClick, ...props }, ref) => {\n const onKeyDown: KeyboardEventHandler<HTMLLIElement> = (e) => {\n if ([\"Enter\", \" \"].includes(e.key)) {\n e.preventDefault();\n onClick();\n }\n };\n\n return (\n <ListItem\n _hover={{\n cursor: \"pointer\",\n }}\n alignItems=\"center\"\n display=\"flex\"\n fontSize=\"md\"\n lineHeight=\"base\"\n listStyleType=\"none\"\n minH={8}\n onClick={onClick}\n onKeyDown={onKeyDown}\n px={4}\n ref={ref}\n role=\"option\"\n sx={{ \":hover, :focus\": { bg: \"gray.100\" } }}\n tabIndex={0}\n {...props}\n >\n {name}\n </ListItem>\n );\n }\n);\n\nSearchItem.displayName = \"SearchItem\";\n","import { getLocalStoreWriter } from \"./getLocalStoreWriter\";\n\nexport interface ShortbreadOptions {\n domain?: string;\n parent?: HTMLElement;\n language?: Navigator[\"language\"];\n __storeWriter?: (cookie: Document[\"cookie\"]) => void;\n}\n\nexport interface Shortbread {\n /**\n * Call this function to be notified when you cookie category is allowed\n */\n access: (\n name: \"essential\" | \"performance\" | \"functional\" | \"advertising\",\n onAllowed: () => void\n ) => void;\n /**\n * Call to ask the user the type of cookies they'd like to receive\n */\n checkForCookieConsent: () => void;\n /**\n * Open the Customize Cookie Dialog\n */\n customizeCookies: () => void;\n /**\n * Returns the consent cookie or undefined if not yet set\n */\n getConsentCookie: () => Document[\"cookie\"] | undefined;\n /**\n * Call this to ask if the cookie has been set\n */\n hasConsent: (cookieName: string) => boolean;\n}\n\n// We only want to manage a single instance at a time\nlet instance: Shortbread | undefined;\n\n/**\n * Call to initialize the shortbread instance. Must be called before all other methods\n */\nexport const initialize = async () => {\n return new Promise<void>((resolve, reject) => {\n // Wait until page has loaded first\n window.addEventListener(\"load\", async () => {\n try {\n const options: ShortbreadOptions = {\n domain: window.location.hostname,\n language: navigator.language,\n __storeWriter: getLocalStoreWriter(),\n };\n\n // Import the shortbread source\n const { AWSCShortbread } = await import(\"./source\");\n instance = AWSCShortbread(options);\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n });\n};\n\n// Shortbread wrappers\n\nconst callIfDefined =\n <T extends keyof Shortbread>(method: T) =>\n (...args: Parameters<Shortbread[T]>): ReturnType<Shortbread[T]> => {\n if (!instance) {\n throw new Error(\"shortbread has not been initialized\");\n }\n\n // Annotations are correct for consumers\n return (instance[method] as any)(...args);\n };\n\n/**\n * Call this function to be notified when you cookie category is allowed\n */\nexport const access = callIfDefined(\"access\");\n/**\n * Call to ask the user the type of cookies they'd like to receive\n */\nexport const checkForCookieConsent = callIfDefined(\"checkForCookieConsent\");\n/**\n * Open the Customize Cookie Dialog\n */\nexport const customizeCookies = callIfDefined(\"customizeCookies\");\n/**\n * Returns the consent cookie or undefined if not yet set\n */\nexport const getConsentCookie = callIfDefined(\"getConsentCookie\");\n/**\n * Call this to ask if the cookie has been set\n */\nexport const hasConsent = callIfDefined(\"hasConsent\");\n","import { ReportHandler } from \"web-vitals\";\n\nexport const reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import(\"web-vitals\").then(\n ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n },\n () => {}\n );\n }\n};\n","import type { ShortbreadOptions } from \"./shortbread\";\n\nconst isDev = process.env.NODE_ENV === \"development\";\n\n/**\n * This function allows for shortbread testing locally.\n * If the node env is dev and the url has a query param of sb=true,\n * it will return a __storeWriter function to pass into shortbread's options\n */\nexport const getLocalStoreWriter = (): ShortbreadOptions[\"__storeWriter\"] => {\n const search = new URLSearchParams(window.location.search);\n const shouldUseOverride = search.get(\"sb\") === \"true\";\n\n if (isDev && shouldUseOverride) {\n return (cookie) => {\n document.cookie = cookie.replace(\" secure=true;\", \"\");\n };\n }\n\n return undefined;\n};\n","import {\n createContext,\n FunctionComponent,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport * as shortbread from \"../../lib/shortbread\";\n\nconst { initialize, ...publicAPI } = shortbread;\n\nconst ShortbreadContext = createContext<Partial<typeof publicAPI>>({});\n\nexport const useShortBread = () => useContext(ShortbreadContext);\n\nexport const ShortbreadProvider: FunctionComponent = ({ children }) => {\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n let isCancelled = false;\n\n initialize()\n .then(() => {\n if (!isCancelled) {\n publicAPI.checkForCookieConsent();\n setIsReady(true);\n }\n })\n .catch((e) => {\n console.error(e);\n\n if (!isCancelled) {\n setIsReady(false);\n }\n });\n\n return () => {\n isCancelled = true;\n setIsReady(false);\n };\n }, []);\n\n return (\n <ShortbreadContext.Provider value={isReady ? publicAPI : {}}>\n {children}\n </ShortbreadContext.Provider>\n );\n};\n","import { ROUTES } from \"../../constants/url\";\n\nexport type Link = {\n display: string;\n url: string;\n testId: string;\n isExternal?: boolean;\n};\n\nexport const FOOTER_LINKS: Record<string, Link> = {\n SERVICE_TERMS: {\n display: \"AWS Service Terms\",\n url: \"https://aws.amazon.com/service-terms/\",\n testId: \"service-terms\",\n },\n PRIVACY: {\n display: \"Privacy\",\n url: \"https://aws.amazon.com/privacy/\",\n testId: \"privacy\",\n },\n SITE_TERMS: {\n display: \"Construct Hub Site Terms\",\n url: ROUTES.SITE_TERMS,\n testId: \"site-terms\",\n isExternal: false,\n },\n LEGAL: {\n display: \"Legal\",\n url: \"https://aws.amazon.com/legal/\",\n testId: \"legal\",\n },\n} as const;\n\nexport const DISCLAIMER = \"2021 Amazon Web Services, Inc. All rights reserved.\";\n","import { createTestIds } from \"../../util/createTestIds\";\nimport { FOOTER_LINKS } from \"./constants\";\n\nconst testIds = createTestIds(\"footer\", [\n \"container\",\n \"links\",\n \"disclaimer\",\n \"manageCookies\",\n ...Object.values(FOOTER_LINKS).map(({ testId }) => testId),\n] as const);\n\nexport default testIds;\n","import { Box, Button, Divider, Flex, SimpleGrid, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { useShortBread } from \"../../contexts/Shortbread\";\nimport { ExternalLink } from \"../ExternalLink\";\nimport { NavLink } from \"../NavLink\";\nimport { DISCLAIMER, FOOTER_LINKS } from \"./constants\";\nimport testIds from \"./testIds\";\n\nexport interface FooterProps {}\n\nexport const Footer: FunctionComponent<FooterProps> = () => {\n const { customizeCookies } = useShortBread();\n\n return (\n <Flex\n align=\"center\"\n as=\"footer\"\n bg=\"blue.800\"\n color=\"white\"\n data-testid={testIds.container}\n direction=\"column\"\n justify=\"center\"\n py={4}\n >\n <SimpleGrid columnGap={6} columns={[1, 2, 4]} data-testid={testIds.links}>\n {Object.entries(FOOTER_LINKS).map(\n ([key, { display, isExternal = true, testId, url }], index) => (\n <Flex\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n key={key}\n >\n {/* Single Row Divider */}\n <Box\n display={{ base: \"none\", md: index !== 0 ? \"initial\" : \"none\" }}\n h={5}\n >\n <Divider borderColor=\"white\" mr={6} orientation=\"vertical\" />\n </Box>\n {isExternal ? (\n <ExternalLink\n color=\"currentcolor\"\n data-testid={testIds[testId]}\n hasWarning={false}\n href={url}\n lineHeight={10}\n mx=\"auto\"\n >\n {display}\n </ExternalLink>\n ) : (\n <NavLink\n color=\"currentcolor\"\n data-testid={testIds[testId]}\n lineHeight={10}\n mx=\"auto\"\n to={url}\n >\n {display}\n </NavLink>\n )}\n {/* 2 Row Divider */}\n <Box\n display={{\n base: \"none\",\n sm: index < 2 ? \"initial\" : \"none\",\n md: \"none\",\n }}\n w=\"100%\"\n >\n <Divider borderColor=\"white\" />\n </Box>\n </Flex>\n )\n )}\n </SimpleGrid>\n <Text data-testid={testIds.disclaimer} fontSize=\"xs\" mt={4}>\n {DISCLAIMER}\n </Text>\n <Button\n color=\"white\"\n data-testid={testIds.manageCookies}\n fontSize=\"xs\"\n fontWeight=\"normal\"\n mt={4}\n onClick={customizeCookies}\n variant=\"link\"\n >\n Manage Cookies\n </Button>\n </Flex>\n );\n};\n","import { Menu, MenuProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface NavPopoverProps extends MenuProps {}\n\nexport const NavPopover: FunctionComponent<NavPopoverProps> = ({\n children,\n ...menuProps\n}) => {\n return (\n <Menu colorScheme=\"blue.800\" strategy=\"fixed\" {...menuProps}>\n {children}\n </Menu>\n );\n};\n","import {\n forwardRef,\n MenuDivider,\n MenuGroup,\n MenuItem,\n MenuList,\n MenuListProps,\n} from \"@chakra-ui/react\";\nimport { Fragment, FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../ExternalLink\";\nimport { NavLink } from \"../NavLink\";\nimport type { IMenuItems, ILink } from \"./types\";\n\nexport interface NavPopoverContentProps extends MenuListProps {\n items: IMenuItems;\n}\n\nconst Link: FunctionComponent<ILink> = ({ display, isNavLink, url }) =>\n isNavLink ? (\n <NavLink color=\"blue.500\" to={url} w=\"100%\">\n {display}\n </NavLink>\n ) : (\n <ExternalLink\n alignItems=\"center\"\n display=\"flex\"\n hasWarning={false}\n href={url}\n justifyContent=\"space-between\"\n w=\"100%\"\n >\n {display}\n </ExternalLink>\n );\n\nexport const NavPopoverContent = forwardRef<NavPopoverContentProps, \"div\">(\n ({ items, ...menuProps }, ref) => {\n return (\n <MenuList {...menuProps} ref={ref}>\n {items.map((item, idx) => {\n if (\"links\" in item) {\n return (\n <Fragment key={`${item.display}-${idx}`}>\n <MenuGroup align=\"left\" title={item.display}>\n {item.links.map((link, linkIdx) => (\n <MenuItem key={`${link.display}-${linkIdx}`}>\n <Link {...link} />\n </MenuItem>\n ))}\n </MenuGroup>\n {idx !== items.length - 1 && <MenuDivider />}\n </Fragment>\n );\n }\n\n return (\n <MenuItem key={`${item.display}-${idx}`}>\n <Link {...item} />\n </MenuItem>\n );\n })}\n </MenuList>\n );\n }\n);\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n MenuButton,\n MenuButtonProps,\n forwardRef,\n} from \"@chakra-ui/react\";\n\nexport const NavPopoverTrigger = forwardRef<MenuButtonProps, \"button\">(\n ({ children, ...props }, ref) => {\n return (\n <MenuButton\n as={Button}\n color=\"blue.800\"\n fontWeight=\"500\"\n ref={ref}\n rightIcon={<ChevronDownIcon h={6} w={6} />}\n size=\"md\"\n variant=\"link\"\n {...props}\n >\n {children}\n </MenuButton>\n );\n }\n);\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"header\", [\n \"container\",\n \"title\",\n \"gettingStartedTrigger\",\n \"gettingStartedMenu\",\n \"documentationTrigger\",\n \"documentationMenu\",\n \"navOpen\",\n \"navClose\",\n \"searchInput\",\n \"searchIcon\",\n \"mobileNav\",\n] as const);\n\nexport default testIds;\n","import type { FunctionComponent } from \"react\";\nimport { DOCUMENTATION } from \"../../constants/links\";\nimport {\n NavPopover,\n NavPopoverContent,\n NavPopoverTrigger,\n} from \"../NavPopover\";\nimport testIds from \"./testIds\";\n\nexport const DocumentationDropdown: FunctionComponent = () => {\n return (\n <NavPopover>\n <NavPopoverTrigger data-testid={testIds.documentationTrigger}>\n Documentation\n </NavPopoverTrigger>\n <NavPopoverContent\n data-testid={testIds.documentationMenu}\n items={DOCUMENTATION}\n />\n </NavPopover>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { GETTING_STARTED } from \"../../constants/links\";\nimport {\n NavPopover,\n NavPopoverContent,\n NavPopoverTrigger,\n} from \"../NavPopover\";\nimport testIds from \"./testIds\";\n\nexport const GettingStartedDropdown: FunctionComponent = () => (\n <NavPopover>\n <NavPopoverTrigger data-testid={testIds.gettingStartedTrigger}>\n Getting Started\n </NavPopoverTrigger>\n <NavPopoverContent\n data-testid={testIds.gettingStartedMenu}\n items={GETTING_STARTED}\n />\n </NavPopover>\n);\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"searchModal\", [\"container\"] as const);\n\nexport default testIds;\n","import {\n Modal,\n ModalBody,\n ModalCloseButton,\n ModalContent,\n ModalHeader,\n ModalOverlay,\n Portal,\n Stack,\n Button,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { useCatalogSearch } from \"../../hooks/useCatalogSearch\";\nimport { SearchBar } from \"../SearchBar\";\nimport testIds from \"./testIds\";\n\nexport interface SearchModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport const SearchModal: FunctionComponent<SearchModalProps> = ({\n isOpen,\n onClose,\n}) => {\n const { query, onQueryChange, onSubmit, onSearch } = useCatalogSearch();\n\n return (\n <Portal>\n <Modal isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent data-testid={testIds.container}>\n <ModalCloseButton />\n <ModalHeader>Search</ModalHeader>\n <ModalBody>\n <Stack pb={4} spacing={4}>\n <SearchBar\n onChange={onQueryChange}\n onSubmit={onSubmit}\n value={query}\n ></SearchBar>\n <Button colorScheme=\"blue\" onClick={() => onSearch()}>\n Find Constructs\n </Button>\n </Stack>\n </ModalBody>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n </Portal>\n );\n};\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport { Box, IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Switch, Route } from \"react-router-dom\";\nimport { ROUTES } from \"../../constants/url\";\nimport { SearchBar, SearchOverlay, SearchSuggestions } from \"../SearchBar\";\nimport { SearchModal } from \"../SearchModal\";\nimport testIds from \"./testIds\";\n\n/**\n * Renders a SearchBar at desktop resolutions and shows a search icon which opens a modal on mobile resolutions\n */\nexport const HeaderSearch: FunctionComponent = () => {\n const searchModal = useDisclosure();\n\n return (\n <Switch>\n <Route exact path={[ROUTES.HOME, ROUTES.SEARCH]} />\n <Route path=\"*\">\n {/* Desktop / Tablet Search Trigger */}\n <Box\n data-testid={testIds.searchInput}\n display={{ base: \"none\", md: \"initial\" }}\n >\n <SearchBar bg=\"gray.50\">\n <SearchOverlay />\n <SearchSuggestions />\n </SearchBar>\n </Box>\n {/* Mobile Search Trigger */}\n <Box display={{ base: \"initial\", md: \"none\" }}>\n <IconButton\n aria-label=\"Search Icon\"\n borderRadius=\"md\"\n data-testid={testIds.searchIcon}\n icon={<SearchIcon color=\"gray.600\" />}\n onClick={searchModal.onOpen}\n variant=\"ghost\"\n />\n\n <SearchModal {...searchModal} />\n </Box>\n </Route>\n </Switch>\n );\n};\n","import {\n Accordion,\n AccordionItem,\n AccordionButton,\n AccordionPanel,\n AccordionIcon,\n Box,\n Flex,\n Heading,\n} from \"@chakra-ui/react\";\nimport { Fragment, FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../ExternalLink\";\nimport { NavLink } from \"../NavLink\";\nimport type { IMenuItems, ILink } from \"../NavPopover\";\n\nconst linkProps = {\n color: \"blue.500\",\n py: 2,\n w: \"full\",\n};\n\nconst Link: FunctionComponent<ILink> = ({ display, isNavLink, url }) =>\n isNavLink ? (\n <NavLink to={url} {...linkProps}>\n {display}\n </NavLink>\n ) : (\n <ExternalLink\n alignItems=\"center\"\n display=\"flex\"\n hasWarning={false}\n href={url}\n justifyContent=\"space-between\"\n {...linkProps}\n >\n {display}\n </ExternalLink>\n );\n\ninterface MobileNavLinksContentProps {\n testId?: string;\n title: string;\n items: IMenuItems;\n}\n\nconst MobileNavLinksContent: FunctionComponent<MobileNavLinksContentProps> = ({\n title,\n items,\n testId,\n}) => (\n <AccordionItem data-testid={testId} w=\"full\">\n <AccordionButton px={0} py={4}>\n <Box flex=\"1\" textAlign=\"left\">\n <Heading as=\"h3\" size=\"sm\">\n {title}\n </Heading>\n </Box>\n\n <AccordionIcon />\n </AccordionButton>\n\n <AccordionPanel p={0} w=\"full\">\n <Flex direction=\"column\" w=\"full\">\n {items.map((item, itemIdx) => {\n if (\"links\" in item) {\n return (\n <Fragment key={`${item.display}-${itemIdx}`}>\n <Heading as=\"h4\" borderBottom=\"base\" pb={2} pt={4} size=\"xs\">\n {item.display}\n </Heading>\n\n {item.links.map((link, linkIdx) => (\n <Link {...link} key={`${link.display}-${linkIdx}`} />\n ))}\n </Fragment>\n );\n }\n\n return <Link {...item} key={`${item.display}-${itemIdx}`} />;\n })}\n </Flex>\n </AccordionPanel>\n </AccordionItem>\n);\n\ninterface MobileNavLinksProps {\n sections: MobileNavLinksContentProps[];\n}\n\nexport const MobileNavLinks: FunctionComponent<MobileNavLinksProps> = ({\n sections,\n}) => (\n <Accordion\n allowMultiple\n allowToggle\n defaultIndex={sections.map((_, i) => i)}\n w=\"full\"\n >\n {sections.map((section, idx) => (\n <MobileNavLinksContent key={`section-${idx}`} {...section} />\n ))}\n </Accordion>\n);\n","import { Box, Heading } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport testIds from \"./testIds\";\n\nexport const Title: FunctionComponent = () => (\n <Heading as=\"h1\" color=\"blue.800\" data-testid={testIds.title} size=\"lg\">\n <Link to=\"/\">\n <Box as=\"span\" color=\"blue.500\">\n Construct\n </Box>{\" \"}\n Hub\n </Link>\n </Heading>\n);\n","import {\n Drawer,\n DrawerBody,\n DrawerOverlay,\n DrawerHeader,\n DrawerContent,\n DrawerCloseButton,\n Portal,\n Stack,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { GETTING_STARTED, DOCUMENTATION } from \"../../constants/links\";\nimport { MobileNavLinks } from \"./MobileNavLinks\";\nimport testIds from \"./testIds\";\nimport { Title } from \"./Title\";\nexport interface MobileNavProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport const MobileNav: FunctionComponent<MobileNavProps> = ({\n isOpen,\n onClose,\n}) => {\n return (\n <Portal>\n <Drawer isOpen={isOpen} onClose={onClose} placement=\"left\" size=\"xs\">\n <DrawerOverlay />\n\n <DrawerContent data-testid={testIds.mobileNav}>\n <DrawerCloseButton />\n\n <DrawerHeader display=\"flex\" justifyContent=\"start\">\n <Title />\n </DrawerHeader>\n\n <DrawerBody>\n <Stack align=\"start\" justify=\"start\" spacing={4}>\n <MobileNavLinks\n sections={[\n {\n title: \"Getting Started\",\n items: GETTING_STARTED,\n testId: testIds.gettingStartedMenu,\n },\n {\n title: \"Documentation\",\n items: DOCUMENTATION,\n testId: testIds.documentationMenu,\n },\n ]}\n />\n </Stack>\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </Portal>\n );\n};\n","import { HamburgerIcon } from \"@chakra-ui/icons\";\nimport { IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { MobileNav } from \"./MobileNav\";\nimport testIds from \"./testIds\";\n\nexport const NavButton: FunctionComponent = () => {\n const nav = useDisclosure();\n\n return (\n <>\n <IconButton\n aria-label=\"Navigation Menu\"\n borderRadius=\"md\"\n data-testid={testIds.navOpen}\n display={{ md: \"none\" }}\n icon={<HamburgerIcon />}\n onClick={nav.onOpen}\n variant=\"ghost\"\n />\n <MobileNav {...nav} />\n </>\n );\n};\n","import { Box, Grid, GridItem, GridItemProps } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { DocumentationDropdown } from \"./DocumentationDropdown\";\nimport { GettingStartedDropdown } from \"./GettingStartedDropdown\";\nimport { HeaderSearch } from \"./HeaderSearch\";\nimport { NavButton } from \"./NavButton\";\nimport testIds from \"./testIds\";\nimport { Title } from \"./Title\";\n\nconst HeaderItem: FunctionComponent<GridItemProps> = (props) => (\n <GridItem align=\"center\" justify=\"center\" rowStart={1} {...props} />\n);\n\nexport const Header: FunctionComponent = () => {\n return (\n <Grid\n alignItems=\"center\"\n as=\"header\"\n bg=\"white\"\n boxShadow=\"base\"\n data-testid={testIds.container}\n gap={6}\n gridTemplateColumns={{\n base: \"1fr max-content 1fr\",\n md: \"max-content minmax(12rem, 31rem) auto\",\n }}\n gridTemplateRows=\"1fr\"\n maxW=\"100vw\"\n position=\"sticky\"\n px={4}\n py={4}\n top={0}\n w=\"100%\"\n zIndex=\"sticky\"\n >\n {/* Logo / Header */}\n <HeaderItem\n colStart={{ base: 2, md: 1 }}\n justifySelf={{ base: \"center\", md: \"start\" }}\n >\n <Title />\n </HeaderItem>\n\n {/* Search Trigger */}\n <HeaderItem\n colStart={{ base: 3, md: 2 }}\n justifySelf={{ base: \"end\", md: \"stretch\" }}\n >\n <HeaderSearch />\n </HeaderItem>\n\n {/* Navigation */}\n <HeaderItem\n colStart={{ base: 1, md: 3 }}\n justifySelf={{ base: \"start\", md: \"end\" }}\n >\n <Grid\n display={{ base: \"none\", md: \"grid\" }}\n gap={4}\n gridTemplateColumns=\"1fr 1fr\"\n gridTemplateRows=\"1fr\"\n placeItems=\"center\"\n w=\"100%\"\n >\n <Box>\n <GettingStartedDropdown />\n </Box>\n <Box>\n <DocumentationDropdown />\n </Box>\n </Grid>\n <NavButton />\n </HeaderItem>\n </Grid>\n );\n};\n","import { FunctionComponent, LazyExoticComponent, Suspense } from \"react\";\nimport { Route, RouteProps } from \"react-router-dom\";\nimport { PageLoader } from \"../PageLoader\";\n\nexport interface LazyRouteProps extends RouteProps {\n component: LazyExoticComponent<FunctionComponent>;\n}\n\n/**\n * A wrapper around the react-router-dom <Route /> which takes in a lazy loaded component\n * and wraps it with <Suspense /> and a generic <PageLoader /> fallback\n *\n * Usage:\n * ```tsx\n * import { lazy } from \"react\";\n *\n * const MyComponent = lazy(() => import(\"./path/to/MyComponent\"));\n *\n * <LazyRoute path=\"/\" component={MyComponent} />\n *\n * ```\n */\nexport const LazyRoute: FunctionComponent<LazyRouteProps> = ({\n component: Component,\n ...routeProps\n}) => (\n <Route {...routeProps}>\n <Suspense fallback={<PageLoader />}>\n <Component />\n </Suspense>\n </Route>\n);\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent, lazy } from \"react\";\nimport { Switch, useLocation } from \"react-router-dom\";\nimport { DevPreviewBanner } from \"./components/DevPreviewBanner\";\nimport { Footer } from \"./components/Footer\";\nimport { Header } from \"./components/Header\";\nimport { LazyRoute } from \"./components/LazyRoute\";\nimport { ROUTES } from \"./constants/url\";\n\nconst FAQ = lazy(() => import(\"./views/FAQ\"));\nconst Home = lazy(() => import(\"./views/Home\"));\nconst NotFound = lazy(() => import(\"./views/NotFound\"));\nconst Packages = lazy(() => import(\"./views/Packages\"));\nconst SearchRedesign = lazy(() => import(\"./views/SearchRedesign\"));\nconst SiteTerms = lazy(() => import(\"./views/SiteTerms\"));\n\nexport const App: FunctionComponent = () => {\n const { pathname } = useLocation();\n\n const showBanner = pathname !== \"/\";\n\n return (\n <Grid\n as=\"main\"\n bg=\"bgPrimary\"\n gridTemplateColumns=\"1fr\"\n gridTemplateRows=\"auto auto 1fr auto\"\n h=\"100%\"\n maxW=\"100%\"\n minH=\"100vh\"\n >\n <Header />\n {showBanner ? <DevPreviewBanner /> : <div />}\n <Switch>\n <LazyRoute component={FAQ} exact path={ROUTES.FAQ} />\n <LazyRoute component={Home} exact path={ROUTES.HOME} />\n <LazyRoute component={SiteTerms} exact path={ROUTES.SITE_TERMS} />\n <LazyRoute component={Packages} path={ROUTES.PACKAGES} />\n <LazyRoute component={SearchRedesign} exact path={ROUTES.SEARCH} />\n <LazyRoute component={NotFound} path=\"*\" />\n </Switch>\n <Footer />\n </Grid>\n );\n};\n","import { theme } from \"@chakra-ui/react\";\n\nconst {\n components: { Code: base },\n} = theme;\n\nexport const Code = {\n ...base,\n variants: {\n ...base.variants,\n \"code-block\": {\n ...base.variants.subtle,\n display: \"block\",\n whiteSpace: \"pre\",\n },\n },\n};\n","// TODO: Figure out why this does nothing\nexport const Divider = {\n defaultProps: {\n borderColor: \"rgba(0, 124, 253, 0.15)\",\n },\n};\n","import type { tagAnatomy } from \"@chakra-ui/anatomy\";\nimport { theme } from \"@chakra-ui/react\";\nimport {\n PartsStyleInterpolation,\n StyleFunctionProps,\n transparentize,\n} from \"@chakra-ui/theme-tools\";\nimport { PackageTagConfig } from \"../../api/config\";\n\nconst createVariant =\n (\n variant: PartsStyleInterpolation<typeof tagAnatomy>,\n overrides: Record<string, any>\n ) =>\n (props: StyleFunctionProps) => {\n const varBase = typeof variant === \"function\" ? variant(props) : variant;\n return {\n ...varBase,\n container: {\n ...varBase.container,\n ...overrides,\n },\n };\n };\n\nconst {\n components: { Tag: base },\n} = theme;\n\nexport const makeTag = (config: PackageTagConfig[]) => {\n const customVariants = config.reduce((accum, { keyword }) => {\n return keyword?.color\n ? {\n ...accum,\n [keyword.color]: createVariant(base.variants.subtle, {\n background: transparentize(keyword.color, 0.1),\n color: keyword.color,\n }),\n }\n : accum;\n }, {});\n return {\n ...base,\n baseStyle: {\n container: {\n fontWeight: \"normal\",\n },\n },\n variants: {\n ...base.variants,\n subtle: createVariant(base.variants.subtle, {\n background: \"#F2F2F2\",\n color: \"blue.800\",\n }),\n ...customVariants,\n },\n };\n};\n","import { theme } from \"@chakra-ui/react\";\nimport { PackageTagConfig } from \"../../api/config\";\nimport { Code } from \"./Code\";\nimport { Divider } from \"./Divider\";\nimport { makeTag } from \"./Tag\";\n\ninterface ComponentsConfig {\n Tag: PackageTagConfig[];\n}\n\nexport const makeComponents = (config: ComponentsConfig) => {\n return {\n ...theme.components,\n Code,\n Divider,\n Tag: makeTag(config.Tag),\n };\n};\n","import { borders } from \"./borders\";\nimport { colors } from \"./colors\";\nimport { radii } from \"./radius\";\nimport { shadows } from \"./shadows\";\nimport { sizes } from \"./sizes\";\n\nexport const foundations = {\n borders,\n colors,\n radii,\n sizes,\n shadows,\n};\n","export const borders = {\n base: \"1px solid rgba(0, 124, 253, 0.15)\",\n};\n","import { theme } from \"@chakra-ui/react\";\n\nexport const colors = {\n ...theme.colors,\n blue: {\n 50: \"#dcf3ff\",\n 100: \"#aed9ff\",\n 200: \"#7dbeff\",\n 300: \"#4aa4ff\",\n 400: \"#1a8aff\",\n 500: \"#0070e6\",\n 600: \"#0057b4\",\n 700: \"#003e82\",\n 800: \"#002551\",\n 900: \"#000d21\",\n },\n bgPrimary: \"#F8F8F8\",\n};\n","export const radii = {\n card: \"0.75rem\",\n};\n","// import { theme } from \"@chakra-ui/react\";\n\nexport const sizes = {\n container: {\n \"2xl\": \"120rem\",\n },\n};\n","export const shadows = {\n base: \"0px 4px 15px rgba(40, 132, 178, 0.15)\",\n};\n","import { extendTheme } from \"@chakra-ui/react\";\nimport { Config } from \"../api/config\";\nimport { makeComponents } from \"./components\";\nimport { foundations } from \"./foundations\";\n\nexport const makeTheme = (config: Config) => {\n const componentsConfig = {\n Tag: config.packageTags ?? [],\n };\n\n return extendTheme({\n ...foundations,\n components: makeComponents(componentsConfig),\n config: {\n initialColorMode: \"light\",\n useSystemColorMode: false,\n },\n });\n};\n","import { ChakraProvider } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PageLoader } from \"../components/PageLoader\";\nimport { makeTheme } from \"../theme\";\nimport { useConfig } from \"./Config\";\n\nexport const Theme: FunctionComponent = ({ children }) => {\n const { loading, data } = useConfig();\n return loading ? (\n <PageLoader />\n ) : (\n <ChakraProvider resetCSS theme={makeTheme(data!)}>\n {children}\n </ChakraProvider>\n );\n};\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://cra.link/PWA\n\n// [::1] is the IPv6 localhost address.\n// 127.0.0.0/8 are considered localhost for IPv4.\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n window.location.hostname === \"[::1]\" ||\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nconst registerValidSW = (swUrl: string, config?: Config) => {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n \"New content is available and will be used when all \" +\n \"tabs for this page are closed. See https://cra.link/PWA.\"\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log(\"Content is cached for offline use.\");\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error(\"Error during service worker registration:\", error);\n });\n};\n\nconst checkValidServiceWorker = (swUrl: string, config?: Config) => {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { \"Service-Worker\": \"script\" },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\");\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf(\"javascript\") === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n void navigator.serviceWorker.ready.then((registration) => {\n void registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n \"No internet connection found. App is running in offline mode.\"\n );\n });\n};\n\nexport const register = (config?: Config) => {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener(\"load\", () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n void navigator.serviceWorker.ready.then(() => {\n console.log(\n \"This web app is being served cache-first by a service worker. To learn more, visit https://cra.link/PWA\"\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n};\n\nexport const unregister = () => {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n void registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n};\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { BrowserRouter as Router } from \"react-router-dom\";\nimport \"./index.css\";\nimport { App } from \"./App\";\nimport { AnalyticsProvider } from \"./contexts/Analytics\";\nimport { CatalogProvider } from \"./contexts/Catalog\";\nimport { ConfigProvider } from \"./contexts/Config\";\nimport { ExternalLinkWarningProvider } from \"./contexts/ExternalLinkWarning\";\nimport { SearchProvider } from \"./contexts/Search\";\nimport { ShortbreadProvider } from \"./contexts/Shortbread\";\nimport { StatsProvider } from \"./contexts/Stats\";\nimport { Theme } from \"./contexts/Theme\";\nimport { unregister } from \"./register-service-worker\";\nimport { reportWebVitals } from \"./reportWebVitals\";\n\nReactDOM.render(\n <React.StrictMode>\n <Router>\n <ShortbreadProvider>\n <AnalyticsProvider>\n <ConfigProvider>\n <CatalogProvider>\n <StatsProvider>\n <SearchProvider>\n <Theme>\n <ExternalLinkWarningProvider>\n <App />\n </ExternalLinkWarningProvider>\n </Theme>\n </SearchProvider>\n </StatsProvider>\n </CatalogProvider>\n </ConfigProvider>\n </AnalyticsProvider>\n </ShortbreadProvider>\n </Router>\n </React.StrictMode>,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n\n// Disable any registered service workers (previously enabled for PWA functionality).\n//\n// This is disabled due to caching issues where users are not receiving\n// the latest versions of content on the first load of the website. This\n// occurs because content is being served from the service worker cache.\n//\n// This should probably not be re-enabled unless we have a mechanism\n// in place to automatically content when new versions of the website are\n// available.\nunregister();\n","import { ExternalLinkIcon } from \"@chakra-ui/icons\";\nimport { forwardRef, Link, LinkProps } from \"@chakra-ui/react\";\nimport { useExternalLinkWarning } from \"../../contexts/ExternalLinkWarning\";\n\nexport interface ExternalLinkProps extends LinkProps {\n /**\n * Shows an external link icon. `true` by default\n */\n hasIcon?: boolean;\n /**\n * Prompts the user to confirm leaving the site. `true` by default\n */\n hasWarning?: boolean;\n /**\n * Adds the nofollow annotation to the anchor's rel attribute\n */\n noFollow?: boolean;\n}\n\nexport const ExternalLink = forwardRef<ExternalLinkProps, \"a\">(\n (\n {\n children,\n hasIcon = true,\n hasWarning = true,\n href,\n onClick,\n noFollow,\n ...props\n },\n ref\n ) => {\n const withPrompt = useExternalLinkWarning();\n\n let rel = \"noopener noreferrer\";\n\n if (hasWarning || noFollow) {\n rel += \" nofollow\";\n }\n\n return (\n <Link\n color=\"blue.500\"\n href={href}\n isExternal\n onClick={hasWarning ? withPrompt({ href, onClick }) : onClick}\n ref={ref}\n rel={rel}\n {...props}\n >\n {children} {hasIcon && <ExternalLinkIcon mb={1} ml={2} />}\n </Link>\n );\n }\n);\n\nExternalLink.displayName = \"ExternalLink\";\n","import type { IMenuItems } from \"../components/NavPopover\";\n\nexport const CONSTRUCT_HUB_REPO_URL =\n \"https://github.com/cdklabs/construct-hub\";\n\nexport const GETTING_STARTED: IMenuItems = [\n { display: \"FAQ\", isNavLink: true, url: \"/faq\" },\n {\n display: \"Construct Hub on GitHub\",\n url: CONSTRUCT_HUB_REPO_URL,\n },\n {\n display: \"Issues on GitHub\",\n url: `${CONSTRUCT_HUB_REPO_URL}/issues`,\n },\n];\n\nexport const DOCUMENTATION: IMenuItems = [\n {\n display: \"AWS CDK\",\n links: [\n { display: \"Home\", url: \"https://aws.amazon.com/cdk/\" },\n {\n display: \"Getting Started\",\n url: \"https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html\",\n },\n { display: \"Workshop\", url: \"https://cdkworkshop.com/\" },\n {\n display: \"Best Practices\",\n url: \"https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk\",\n },\n ],\n },\n {\n display: \"CDK for Terraform\",\n links: [\n {\n display: \"Getting Started\",\n url: \"https://learn.hashicorp.com/tutorials/terraform/cdktf\",\n },\n {\n display: \"Tutorials\",\n url: \"https://learn.hashicorp.com/collections/terraform/cdktf\",\n },\n ],\n },\n {\n display: \"CDK for Kubernetes\",\n links: [\n { display: \"Home\", url: \"https://cdk8s.io\" },\n {\n display: \"Getting Started\",\n url: \"https://cdk8s.io/docs/latest/getting-started\",\n },\n { display: \"Documentation\", url: \"https://cdk8s.io/docs/latest\" },\n {\n display: \"API Reference\",\n url: \"https://cdk8s.io/docs/latest/reference/index.html\",\n },\n ],\n },\n {\n display: \"Community\",\n links: [\n {\n display: \"Slack\",\n url: \"https://join.slack.com/t/cdk-dev/shared_invite/zt-mso6p56d-qJp7SOTBvMaQuDrx7R2wHg\",\n },\n { display: \"Community Hub\", url: \"https://cdk.dev\" },\n ],\n },\n];\n","// These are mapped to user-readable values to keep URL Params clean for users\nexport enum CatalogSearchSort {\n NameAsc = \"asc\",\n NameDesc = \"desc\",\n PublishDateAsc = \"oldest\",\n PublishDateDesc = \"newest\",\n DownloadsAsc = \"downloadsAsc\",\n DownloadsDesc = \"downloadsDesc\",\n}\n","type TestIds<T extends Readonly<string[]>> = {\n [key in T[number]]: string;\n};\n\n/**\n * A helper to create scoped test ids across components which can be re-used\n * in e2e and unit tests.\n */\nexport const createTestIds = <T extends Readonly<string[]>>(\n scope: string,\n ids: T\n): TestIds<T> =>\n ids.reduce<Record<string, string>>((acc, curr) => {\n acc[curr] = `${scope}-${curr}`;\n return acc;\n }, {}) as TestIds<T>;\n","export enum CDKType {\n awscdk = \"aws-cdk\",\n cdktf = \"cdktf\",\n cdk8s = \"cdk8s\",\n}\n\nexport const CDKTYPE_NAME_MAP = {\n [CDKType.awscdk]: \"AWS CDK\",\n [CDKType.cdktf]: \"CDKtf\",\n [CDKType.cdk8s]: \"CDK8s\",\n};\n\nexport const CDKTYPE_RENDER_MAP = {\n [CDKType.awscdk]: {\n name: CDKTYPE_NAME_MAP[CDKType.awscdk],\n imgsrc: \"/assets/awscdk-icon.png\",\n },\n [CDKType.cdk8s]: {\n name: CDKTYPE_NAME_MAP[CDKType.cdk8s],\n imgsrc: \"/assets/cdk8s-icon.png\",\n },\n [CDKType.cdktf]: {\n name: CDKTYPE_NAME_MAP[CDKType.cdktf],\n imgsrc: \"/assets/cdktf-icon.png\",\n },\n};\n","import { Link as ChakraLink, PropsOf } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Link as RouterLink } from \"react-router-dom\";\n\nexport type NavLinkProps = PropsOf<typeof ChakraLink> &\n PropsOf<typeof RouterLink>;\n\nexport const NavLink: FunctionComponent<NavLinkProps> = (props) => {\n return <ChakraLink as={RouterLink} {...props} />;\n};\n","import { Language } from \"../../constants/languages\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { Metadata } from \"./metadata\";\n\nexport interface Author {\n readonly name: string;\n readonly email?: string;\n readonly url: string;\n}\n\nexport interface CatalogPackage {\n name: string;\n languages?: Partial<Record<Language, Record<string, unknown>>>;\n version: string;\n description: string;\n author: Author | string;\n keywords?: string[];\n metadata: Metadata;\n}\n\nexport interface Packages {\n packages: CatalogPackage[];\n}\n\n/**\n * Fetch the catalog of all packages from the backend.\n */\nexport const fetchPackages = async (): Promise<Packages> => {\n const response = await fetch(API_PATHS.CATALOG_SUFFIX);\n\n if (!response.ok) {\n console.error(response.statusText);\n throw new Error(`Failed fetching packages index: ${response.statusText}`);\n }\n\n return response.json();\n};\n","import { createContext, FunctionComponent, useContext, useEffect } from \"react\";\nimport { fetchPackages, Packages } from \"../../api/package/packages\";\nimport { useRequest, UseRequestResponse } from \"../../hooks/useRequest\";\n\nconst CatalogContext = createContext<UseRequestResponse<Packages>>({\n loading: false,\n data: undefined,\n error: undefined,\n});\n\nexport const useCatalog = () => useContext(CatalogContext);\n\nexport const CatalogProvider: FunctionComponent = ({ children }) => {\n const [requestPackages, catalogResponse] = useRequest(fetchPackages);\n\n useEffect(() => {\n void requestPackages();\n }, [requestPackages]);\n\n return (\n <CatalogContext.Provider value={catalogResponse}>\n {children}\n </CatalogContext.Provider>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"searchBar\", [\n \"input\",\n \"searchIcon\",\n \"searchButton\",\n \"overlay\",\n \"suggestionsList\",\n \"suggestion\",\n] as const);\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport {\n Input,\n InputGroup,\n InputLeftElement,\n InputProps,\n InputRightElement,\n useDisclosure,\n Button,\n} from \"@chakra-ui/react\";\nimport {\n useContext,\n createContext,\n FunctionComponent,\n useEffect,\n useRef,\n ChangeEventHandler,\n FormEventHandler,\n} from \"react\";\nimport { useCatalog } from \"../../contexts/Catalog\";\nimport { useCatalogSearch } from \"../../hooks/useCatalogSearch\";\nimport { Form } from \"../Form\";\nimport testIds from \"./testIds\";\n\nexport interface SearchBarProps\n extends Omit<InputProps, \"onChange\" | \"value\" | \"onSubmit\"> {\n defaultQuery?: string;\n hasButton?: boolean;\n value?: string;\n onChange?: ChangeEventHandler<HTMLInputElement>;\n onSubmit?: FormEventHandler<HTMLFormElement>;\n}\n\nconst SearchBarState = createContext<\n { query: string; isOpen: boolean } | undefined\n>(undefined);\n\nexport const useSearchBarState = () => {\n const state = useContext(SearchBarState);\n\n if (!state) {\n throw new Error(\"This component must be a child of a <SearchBar />\");\n }\n\n return state;\n};\n\n/**\n * Exposes a Search component that provides a default search implementation. This behavior can be overridden by defining `value`, `onChange`, and `onSubmit` props.\n * Additionally, it's behavior can be extended with `<SearchOverlay />` and `<SearchSuggestions />`\n * ```tsx\n * // Minimal use-case\n * import { SearchBar } from \"components/SearchBar\";\n * <SearchBar />\n *\n * // With extended behavior\n * import { SearchBar, SearchOverlay, SearchSuggestions } from \"components/SearchBar\";\n *\n * <SearchBar>\n * <SearchOverlay />\n * <SearchSuggestions />\n * </SearchBar>\n * ```\n */\nexport const SearchBar: FunctionComponent<SearchBarProps> = ({\n children,\n hasButton,\n onSubmit,\n value,\n onChange,\n ...inputProps\n}) => {\n const disclosure = useDisclosure();\n const inputRef = useRef<HTMLInputElement | null>(null);\n const searchAPI = useCatalogSearch();\n const catalog = useCatalog();\n\n const roundedCatalogLength =\n Math.round((catalog?.data?.packages?.length ?? 0) / 100) * 100;\n\n const placeholder = `Search ${\n roundedCatalogLength > 0 ? `${roundedCatalogLength}+ ` : \"\"\n }construct libraries`;\n\n useEffect(() => {\n // Handle closing disclosures when user clicks outside of input.\n // We cannot rely on the input's onBlur due to left & right elements (icon / button) triggering it\n const clickListener = (e: MouseEvent) => {\n if (!inputRef.current || !e.target) {\n return;\n }\n\n if (!inputRef.current.contains(e.target as Node)) {\n disclosure.onClose();\n }\n };\n\n // Closes disclosures when Esc key is pressed\n const kbdListener = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n inputRef.current?.blur?.();\n disclosure.onClose();\n }\n };\n\n window.addEventListener(\"keyup\", kbdListener);\n window.addEventListener(\"click\", clickListener);\n\n return () => {\n window.removeEventListener(\"keyup\", kbdListener);\n window.removeEventListener(\"click\", clickListener);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <SearchBarState.Provider\n value={{ query: value ?? searchAPI.query, isOpen: disclosure.isOpen }}\n >\n <Form\n color=\"initial\"\n onSubmit={onSubmit ?? searchAPI.onSubmit}\n pos=\"relative\"\n >\n <InputGroup pos=\"relative\" zIndex={disclosure.isOpen ? 3 : \"initial\"}>\n {hasButton && (\n <InputLeftElement>\n <SearchIcon data-testid={testIds.searchIcon} />\n </InputLeftElement>\n )}\n\n <Input\n _focus={{\n boxShadow: \"base\",\n borderColor: \"inherit\", // To avoid taking @chakra's border color on focus\n }}\n bg=\"white\"\n boxShadow={disclosure.isOpen ? \"base\" : \"none\"}\n data-testid={testIds.input}\n onChange={onChange ?? searchAPI.onQueryChange}\n onFocus={disclosure.onOpen}\n placeholder={placeholder}\n ref={inputRef}\n value={value ?? searchAPI.query}\n {...inputProps}\n />\n\n {hasButton ? (\n <InputRightElement\n display={{ base: \"none\", md: \"initial\" }}\n w=\"9rem\"\n >\n <Button\n borderLeftRadius=\"0\"\n colorScheme=\"blue\"\n data-testid={testIds.searchButton}\n type=\"submit\"\n >\n Find Constructs\n </Button>\n </InputRightElement>\n ) : (\n <InputRightElement>\n <SearchIcon data-testid={testIds.searchIcon} />\n </InputRightElement>\n )}\n </InputGroup>\n\n {children}\n </Form>\n </SearchBarState.Provider>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { useSearchBarState } from \"./SearchBar\";\nimport testIds from \"./testIds\";\n\n/**\n * An overlay component which can be used to extend the `<SearchBar />` presentational behavior\n * ```tsx\n * import { SearchBar, SearchOverlay } from \"components/SearchBar\";\n *\n * <SearchBar>\n * <SearchOverlay />\n * </SearchBar>\n * ```\n */\nexport const SearchOverlay = forwardRef<BoxProps, \"div\">((props, ref) => {\n const { isOpen } = useSearchBarState();\n\n return (\n <Box\n bg=\"gray.700\"\n data-testid={testIds.overlay}\n display={isOpen ? \"initial\" : \"none\"}\n inset=\"0\"\n opacity=\"0.5\"\n pos=\"fixed\"\n ref={ref}\n zIndex=\"1\"\n {...props}\n />\n );\n});\n","import {\n UnorderedList,\n ListProps,\n forwardRef,\n Divider,\n Stack,\n Text,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { useDebounce } from \"../../hooks/useDebounce\";\nimport { getPackagePath } from \"../../util/url\";\nimport { Card, CardProps } from \"../Card\";\nimport { CDKTypeIcon } from \"../CDKType\";\nimport { SearchItem } from \"../SearchItem\";\nimport { useSearchBarState } from \"./SearchBar\";\nimport testIds from \"./testIds\";\n\n/**\n * A suggestion component which can be used to extend the `<SearchBar />` behavior with a list of\n * recommended results\n * ```tsx\n * import { SearchBar, SearchSuggestions } from \"components/SearchBar\";\n *\n * <SearchBar>\n * <SearchSuggestions />\n * </SearchBar>\n * ```\n */\nexport const SearchSuggestions: FunctionComponent = forwardRef<\n CardProps & ListProps,\n \"ul\"\n>((props, ref) => {\n const { query, isOpen } = useSearchBarState();\n const debouncedQuery = useDebounce(query);\n\n const { push } = useHistory();\n\n const { page: recommendations } = useCatalogResults({\n limit: 5,\n offset: 0,\n query: debouncedQuery,\n });\n\n if (!isOpen || recommendations.length < 1 || !debouncedQuery) {\n return null;\n }\n\n return (\n <Card\n as={UnorderedList}\n data-testid={testIds.suggestionsList}\n left={0}\n ml={0}\n pos=\"absolute\"\n pt={10}\n px={0}\n ref={ref}\n right={0}\n top={0}\n zIndex={2}\n {...props}\n >\n {recommendations.map((pkg: ExtendedCatalogPackage, i) => {\n const navigate = () => push(getPackagePath(pkg));\n const constructFramework = pkg.metadata?.constructFramework ?? {};\n const hasIcon = Boolean(constructFramework.name);\n\n return (\n <>\n {i > 0 && <Divider mx={4} w=\"auto\" />}\n <SearchItem\n data-testid={testIds.suggestion}\n key={pkg.id}\n name={\n <Stack align=\"center\" direction=\"row\" spacing={4}>\n <CDKTypeIcon {...constructFramework} />\n <Text ml={hasIcon ? 0 : 9}>{pkg.name}</Text>\n </Stack>\n }\n onClick={navigate}\n py={2}\n textAlign=\"left\"\n />\n </>\n );\n })}\n </Card>\n );\n});\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const PageLoader: FunctionComponent = () => (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n);\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\n// Possible utility types for re-use\ntype PromiseFn = (...args: any[]) => Promise<any>;\ntype Awaited<T> = T extends PromiseLike<infer U> ? Awaited<U> : T;\ntype AwaitedReturn<T extends PromiseFn> = Awaited<ReturnType<T>>;\n\nexport interface UseRequestOptions<T> {\n initialValue?: T;\n onError?: (err: Error) => void;\n onSuccess?: (res: T) => void;\n}\n\nexport interface UseRequestResponse<T> {\n loading: boolean;\n error: Error | undefined;\n data: T | undefined;\n}\n\nexport type UseRequestReturn<T extends (...args: any[]) => Promise<T>> = [\n (...args: Parameters<T>) => Promise<void>,\n UseRequestResponse<AwaitedReturn<T>>\n];\n\n/**\n * Provides an API to statefully interact with promises. This hook\n * prevents state updates if promise has not resolved before component unmounts.\n * It will return a tuple with a request() function, and an object representing the state\n */\nexport const useRequest = <T extends PromiseFn>(\n requestFn: T,\n options: UseRequestOptions<AwaitedReturn<T>> = {}\n): UseRequestReturn<T> => {\n const { initialValue, onSuccess, onError } = options;\n\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<AwaitedReturn<T> | undefined>(initialValue);\n const [error, setError] = useState<Error | undefined>();\n\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const statefulFetch = useCallback(\n async (...args: Parameters<T>): Promise<void> => {\n if (!mountedRef.current) return;\n\n setLoading(true);\n setError(undefined);\n\n try {\n const res = await requestFn(...args);\n onSuccess?.(res);\n\n if (mountedRef.current) {\n setData(res);\n setLoading(false);\n }\n } catch (e: any) {\n console.error(e);\n onError?.(e);\n\n if (mountedRef.current) {\n setData(initialValue);\n setError(e);\n setLoading(false);\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onError, onSuccess]\n );\n\n return useMemo(\n () => [\n statefulFetch,\n {\n data,\n loading,\n error,\n },\n ],\n [statefulFetch, data, loading, error]\n );\n};\n","import { CatalogSearchSort } from \"../api/catalog-search/constants\";\nimport { CDKType } from \"../constants/constructs\";\nimport { Language } from \"../constants/languages\";\nimport { ROUTES, QUERY_PARAMS } from \"../constants/url\";\n\nconst gitSSHRegex = new RegExp(\n /git@github\\.com:([a-zA-Z-]+)+\\/?([a-zA-Z-]+)*(\\.git)?/\n);\n\nexport const getRepoUrlAndHost = (\n repoUrl: string\n): { url: string; hostname: string } | undefined => {\n try {\n let url = repoUrl;\n\n const sshUrl = repoUrl.match(gitSSHRegex);\n\n if (sshUrl) {\n const [, author, repo] = sshUrl;\n\n url = `https://github.com/${author}/${repo}`;\n }\n\n return {\n hostname: new URL(url).hostname,\n url,\n };\n } catch {\n // Invalid URL, return undefined as a signal that we should not display it\n return undefined;\n }\n};\n\nexport type SearchParamsObject = Record<\n string,\n string | number | undefined | null\n>;\n\nexport const createURLSearchParams = (\n params: SearchParamsObject,\n base?: string\n) => {\n const searchParams = new URLSearchParams(base);\n\n Object.entries(params)\n .filter(([, v]) => v != null)\n .forEach(([k, v]) => {\n searchParams.set(k, `${v}`);\n });\n\n return searchParams.toString();\n};\n\nexport const createURL = (base: string, params?: SearchParamsObject) => {\n let url = base;\n\n if (params) {\n const search = createURLSearchParams(params);\n\n if (search) {\n url += `?${search}`;\n }\n }\n\n return url;\n};\n\nexport const getSearchPath = ({\n cdkMajor,\n cdkType,\n query,\n offset,\n language,\n languages,\n sort,\n tags,\n}: {\n cdkMajor?: string | number;\n query?: string;\n offset?: string | number;\n cdkType?: CDKType;\n language?: Language;\n languages?: Language[];\n sort?: CatalogSearchSort;\n tags?: string[];\n}) =>\n createURL(ROUTES.SEARCH, {\n [QUERY_PARAMS.SEARCH_QUERY]: query,\n [QUERY_PARAMS.CDK_TYPE]: cdkType,\n [QUERY_PARAMS.CDK_MAJOR]: cdkMajor,\n [QUERY_PARAMS.LANGUAGE]: language,\n [QUERY_PARAMS.LANGUAGES]: languages?.length ? languages.join(\",\") : null,\n [QUERY_PARAMS.SORT]: sort,\n [QUERY_PARAMS.OFFSET]: offset ?? 0,\n [QUERY_PARAMS.TAGS]: tags?.length ? tags.join(\",\") : null,\n });\n\nexport const getPackagePath = ({\n name,\n version,\n language,\n submodule,\n}: {\n name: string;\n version: string;\n language?: Language;\n submodule?: string;\n}) =>\n createURL(`${ROUTES.PACKAGES}/${name}/v/${version}`, {\n [QUERY_PARAMS.SUBMODULE]: submodule,\n [QUERY_PARAMS.LANGUAGE]: language,\n });\n","import { API_PATHS } from \"../../constants/url\";\n\nconst NOT_FOUND = \"NOT_FOUND\";\n\n/**\n * Download stats for all packages, indexed by npm package name.\n */\nexport interface PackageStats {\n readonly updated: string;\n readonly packages: { [key: string]: PackageStatsEntry };\n}\n\n/**\n * Download stats for a single package.\n */\nexport interface PackageStatsEntry {\n readonly downloads?: { npm: number };\n}\n\nconst defaultStats = { packages: {}, updated: NOT_FOUND };\n\nexport const fetchStats = async (): Promise<PackageStats> => {\n const response = await fetch(API_PATHS.STATS);\n\n if (!response.ok) {\n console.error(\"Could not retrieve package stats. Using empty stats.\");\n return defaultStats;\n }\n\n return response.json().catch((err) => {\n console.error(err);\n console.error(\"Error in package stats response. Using empty stats.\");\n return defaultStats;\n });\n};\n","import { createContext, FunctionComponent, useContext, useEffect } from \"react\";\nimport { fetchStats, PackageStats } from \"../../api/stats\";\nimport { useRequest, UseRequestResponse } from \"../../hooks/useRequest\";\n\nconst StatsContext = createContext<UseRequestResponse<PackageStats>>({\n loading: false,\n data: undefined,\n error: undefined,\n});\n\nexport const useStats = () => useContext(StatsContext);\n\nexport const StatsProvider: FunctionComponent = ({ children }) => {\n const [requestStats, statsResponse] = useRequest(fetchStats);\n\n useEffect(() => {\n void requestStats();\n }, [requestStats]);\n\n return (\n <StatsContext.Provider value={statsResponse}>\n {children}\n </StatsContext.Provider>\n );\n};\n","import {\n createContext,\n FunctionComponent,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport { fetchConfig, Config } from \"../../api/config\";\nimport { useRequest, UseRequestResponse } from \"../../hooks/useRequest\";\n\nconst ConfigContext = createContext<UseRequestResponse<Config>>({\n loading: false,\n data: undefined,\n error: undefined,\n});\n\nconst LOCAL_CONFIG = \"construct-hub-config\";\n\nexport const useConfig = () => useContext(ConfigContext);\n\nexport const ConfigProvider: FunctionComponent = ({ children }) => {\n const [configData, setConfigData] = useState<Config | undefined>(() => {\n try {\n const stored = localStorage.getItem(LOCAL_CONFIG);\n const parsed = stored ? JSON.parse(stored) : undefined;\n return parsed;\n } catch (e) {\n console.error(e);\n }\n\n return undefined;\n });\n\n const [requestConfig, configResponse] = useRequest(fetchConfig, {\n onSuccess: (res) => {\n setConfigData(res);\n\n try {\n localStorage.setItem(LOCAL_CONFIG, JSON.stringify(res));\n } catch (e) {\n console.error(e);\n }\n },\n });\n\n useEffect(() => {\n void requestConfig();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <ConfigContext.Provider value={{ ...configResponse, data: configData }}>\n {children}\n </ConfigContext.Provider>\n );\n};\n","import { CatalogSearchFilters, ExtendedCatalogPackage } from \".\";\nimport { Language } from \"../../constants/languages\";\nimport { CatalogSearchSort } from \"./constants\";\n\ntype SortFunction = (\n p1: ExtendedCatalogPackage,\n p2: ExtendedCatalogPackage\n) => number;\n\ntype FilterFunctionBuilder<T> = (\n filter: T\n) => undefined | ((pkg: ExtendedCatalogPackage) => boolean);\n\nconst getDateSort =\n (isAscending: boolean): SortFunction =>\n (p1, p2) => {\n const d1 = new Date(p1.metadata.date);\n const d2 = new Date(p2.metadata.date);\n if (d1 === d2) {\n return 0;\n }\n\n if (isAscending) {\n return d2 < d1 ? 1 : -1;\n }\n\n return d1 < d2 ? 1 : -1;\n };\n\nconst getStrSort = (isAscending: boolean): SortFunction => {\n return (p1, p2) => p1.name.localeCompare(p2.name) * (isAscending ? 1 : -1);\n};\n\nconst getDownloadsSort = (isAscending: boolean): SortFunction => {\n return (p1, p2) => {\n if (p1.downloads !== p2.downloads) {\n return (p1.downloads - p2.downloads) * (isAscending ? 1 : -1);\n } else {\n // break ties by alphabetical\n return getStrSort(!isAscending)(p1, p2);\n }\n };\n};\n\nconst getLanguageFilter: FilterFunctionBuilder<\n CatalogSearchFilters[\"language\"]\n> = (language) => {\n if (!(language && language !== Language.TypeScript)) {\n return undefined;\n }\n\n return (pkg) => {\n return pkg.languages?.[language] !== undefined;\n };\n};\n\nconst getLanguagesFilter: FilterFunctionBuilder<\n CatalogSearchFilters[\"languages\"]\n> = (languages) => {\n const languageSet =\n (languages?.length ?? 0) > 0 ? new Set(languages) : undefined;\n\n if (!languageSet || languageSet.has(Language.TypeScript)) {\n return undefined;\n }\n\n return (pkg) => {\n const isMatched = Object.keys(pkg.languages ?? {}).some((lang) =>\n languageSet.has(lang as Language)\n );\n\n return isMatched;\n };\n};\n\nconst getCDKTypeFilter: FilterFunctionBuilder<CatalogSearchFilters[\"cdkType\"]> =\n (cdkType) => {\n if (!cdkType) return undefined;\n return (pkg) => pkg.metadata?.constructFramework?.name === cdkType;\n };\n\nconst getCDKMajorFilter: FilterFunctionBuilder<\n CatalogSearchFilters[\"cdkMajor\"]\n> = (cdkMajor) => {\n if (typeof cdkMajor !== \"number\") return undefined;\n return (pkg) => pkg.metadata?.constructFramework?.majorVersion === cdkMajor;\n};\n\nconst getTagsFilter: FilterFunctionBuilder<CatalogSearchFilters[\"tags\"]> = (\n tags\n) => {\n if (!tags || !tags.length) {\n return undefined;\n }\n\n return (pkg) => {\n return (\n pkg.metadata?.packageTags?.some((tag) => {\n return tags.includes(tag.id);\n }) ?? false\n );\n };\n};\n\nexport const SORT_FUNCTIONS: Record<CatalogSearchSort, SortFunction> = {\n [CatalogSearchSort.NameAsc]: getStrSort(true),\n [CatalogSearchSort.NameDesc]: getStrSort(false),\n [CatalogSearchSort.PublishDateAsc]: getDateSort(true),\n [CatalogSearchSort.PublishDateDesc]: getDateSort(false),\n [CatalogSearchSort.DownloadsAsc]: getDownloadsSort(true),\n [CatalogSearchSort.DownloadsDesc]: getDownloadsSort(false),\n};\n\nexport const FILTER_FUNCTIONS: {\n [key in keyof Required<CatalogSearchFilters>]: FilterFunctionBuilder<\n CatalogSearchFilters[key]\n >;\n} = {\n cdkType: getCDKTypeFilter,\n cdkMajor: getCDKMajorFilter,\n language: getLanguageFilter,\n languages: getLanguagesFilter,\n tags: getTagsFilter,\n};\n","import lunr from \"lunr\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { CatalogPackage } from \"../package/packages\";\nimport { PackageStats } from \"../stats\";\nimport { CatalogSearchSort } from \"./constants\";\nimport { FILTER_FUNCTIONS, SORT_FUNCTIONS } from \"./util\";\n\nexport interface ExtendedCatalogPackage extends CatalogPackage {\n id: string;\n downloads: number;\n\n scope?: string;\n packageName?: string;\n authorName?: string;\n authorEmail?: string;\n}\n\nexport interface CatalogConstructFrameworks {\n [CDKType.awscdk]: CatalogConstructFrameworkMeta;\n [CDKType.cdktf]: CatalogConstructFrameworkMeta;\n [CDKType.cdk8s]: CatalogConstructFrameworkMeta;\n}\nexport interface CatalogConstructFrameworkMeta {\n pkgCount: number;\n majorVersions: number[];\n}\n\nexport interface CatalogSearchFilters {\n /**\n * The CDK Output Type to filter by. This functionality is not yet deployed on any BE so the implementation on the client is not final.\n */\n cdkType?: CDKType;\n /**\n * The CDK Type's major version to filter by. This param is ignored if no major is set\n */\n cdkMajor?: number;\n /**\n * The target language to filter by. This parameter is only used\n * for backwards compatability with the current search page and should be\n * avoided moving forward\n * @deprecated = use languages[] instead\n */\n language?: Language;\n /**\n * A list of languages to filter by. Constructs that are not yet filtered out, will be\n * returned if they support any of the languages in this list.\n */\n languages?: Language[];\n /**\n * A list of tags to filter by.\n */\n tags?: string[];\n}\n\nexport type CatalogSearchResults = Map<string, ExtendedCatalogPackage>;\n\nexport interface CatalogSearchParams {\n query?: string;\n filters?: CatalogSearchFilters;\n sort?: CatalogSearchSort;\n}\n\nexport class CatalogSearchAPI {\n private readonly map: CatalogSearchResults;\n private index: lunr.Index;\n /**\n * A map of detected Construct Frameworks which provides a count of libraries for that framework and a set of major versions detected\n */\n public readonly constructFrameworks: CatalogConstructFrameworks;\n\n constructor(catalogData: CatalogPackage[], stats: PackageStats) {\n const catalogMap = catalogData\n // Packages with the \"construct-hub/hide-from-search\" keyword are shadow-banned from search results\n .filter(\n (pkg) => !pkg.keywords?.includes(\"construct-hub/hide-from-search\")\n )\n .reduce((map, pkg) => {\n const { name, version } = pkg;\n const id = [name, version].join(\"@\");\n\n const downloads = stats.packages[name]?.downloads?.npm ?? 0;\n\n map.set(id, {\n ...pkg,\n downloads,\n id,\n });\n\n return map;\n }, new Map<string, ExtendedCatalogPackage>());\n\n this.map = this.sort(catalogMap, CatalogSearchSort.PublishDateDesc);\n\n this.constructFrameworks = this.detectConstructFrameworks();\n\n this.index = lunr(function () {\n this.ref(\"id\");\n this.field(\"name\");\n this.field(\"scope\");\n this.field(\"packageName\");\n this.field(\"description\");\n this.field(\"authorName\");\n this.field(\"authorEmail\");\n\n [...catalogMap.values()].forEach((pkg) => {\n const { author, name } = pkg;\n\n const [scope, packageName] = name.split(\"/\");\n\n if (scope && packageName) {\n pkg.scope = scope;\n pkg.packageName = packageName;\n }\n\n if (typeof author === \"string\") {\n pkg.authorName = author;\n } else {\n if (author?.name) {\n pkg.authorName = author.name;\n }\n\n if (author?.email) {\n pkg.authorEmail = author.email;\n }\n }\n\n this.add(pkg);\n });\n });\n }\n\n /**\n * Performs a Search against the catalog and returns a Map with results ordered\n * by search score / relevance\n */\n public search(params?: {\n query?: string;\n filters?: CatalogSearchFilters;\n sort?: CatalogSearchSort;\n }): CatalogSearchResults {\n const { query, filters, sort } = params ?? {};\n\n let results = query ? this.query(query) : new Map(this.map);\n\n if (filters) {\n results = this.filter(results, filters);\n }\n\n if (sort) {\n results = this.sort(results, sort);\n }\n\n return results;\n }\n\n /**\n * This calls the index search method and returns a map of results ordered by relevance.\n */\n private query(query: string): CatalogSearchResults {\n let refs: lunr.Index.Result[] = [];\n\n try {\n refs = this.index.search(query);\n } catch (e) {\n console.error(e);\n }\n\n return refs.reduce((packages, { ref }) => {\n const pkg = this.map.get(ref);\n\n if (pkg) {\n packages.set(ref, pkg);\n }\n\n return packages;\n }, new Map() as CatalogSearchResults);\n }\n\n /**\n * Filters query results. Mutates the passed-in map\n */\n private filter(\n results: CatalogSearchResults,\n filters: CatalogSearchFilters\n ): CatalogSearchResults {\n const { cdkType, cdkMajor, language, languages, tags } = filters;\n const copiedResults = new Map(results);\n\n const filterFunctions = [\n FILTER_FUNCTIONS.cdkType(cdkType),\n // Ignore major version filter if no CDK Type is defined\n FILTER_FUNCTIONS.cdkMajor(cdkType ? cdkMajor : undefined),\n FILTER_FUNCTIONS.language(language),\n FILTER_FUNCTIONS.languages(languages),\n FILTER_FUNCTIONS.tags(tags),\n ].filter(Boolean) as ((pkg: ExtendedCatalogPackage) => boolean)[];\n\n copiedResults.forEach((result) => {\n let isFiltered = false;\n\n filterFunctions.forEach((filterFn) => {\n if (!isFiltered && !filterFn(result)) {\n isFiltered = true;\n }\n });\n\n if (isFiltered) {\n copiedResults.delete(result.id);\n }\n });\n\n return copiedResults;\n }\n\n /**\n * Sort filtered results\n */\n private sort(\n results: CatalogSearchResults,\n strategy: CatalogSearchSort\n ): CatalogSearchResults {\n if (strategy) {\n return new Map(\n [...results.entries()].sort(([, p1], [, p2]) =>\n SORT_FUNCTIONS[strategy](p1, p2)\n )\n );\n } else {\n return results;\n }\n }\n\n /**\n * Creates an object of found construct frameworks in the catalog map.\n * They are indexed by the name of the construct framework and record the count\n * of packages for that framework as well as a list of major versions.\n */\n private detectConstructFrameworks() {\n const results: CatalogConstructFrameworks = [...this.map.values()].reduce(\n (frameworks: CatalogConstructFrameworks, pkg: ExtendedCatalogPackage) => {\n const { metadata } = pkg;\n\n const frameworkName = metadata?.constructFramework?.name;\n const majorVersion = metadata?.constructFramework?.majorVersion;\n\n if (frameworkName) {\n const entry = frameworks[frameworkName];\n\n if (\n majorVersion !== undefined &&\n !entry.majorVersions.includes(majorVersion)\n ) {\n entry.majorVersions.push(majorVersion);\n }\n\n entry.pkgCount += 1;\n }\n\n return frameworks;\n },\n {\n [CDKType.awscdk]: {\n majorVersions: [],\n pkgCount: 0,\n },\n [CDKType.cdk8s]: {\n majorVersions: [],\n pkgCount: 0,\n },\n [CDKType.cdktf]: {\n majorVersions: [],\n pkgCount: 0,\n },\n }\n );\n\n return results;\n }\n}\n","import { createContext, FunctionComponent, useContext, useMemo } from \"react\";\nimport { CatalogSearchAPI } from \"../../api/catalog-search\";\nimport { PageLoader } from \"../../components/PageLoader\";\nimport { useCatalog } from \"../../contexts/Catalog\";\nimport { useStats } from \"../Stats\";\n\nconst SearchContext = createContext<CatalogSearchAPI | undefined>(undefined);\n\nexport const useSearchContext = () => useContext(SearchContext);\n\nexport const SearchProvider: FunctionComponent = ({ children }) => {\n const { data: catalogData, loading: catalogLoading } = useCatalog();\n const { data: statsData, loading: statsLoading } = useStats();\n\n const searchAPI = useMemo(() => {\n if (catalogData?.packages === undefined || catalogLoading) return;\n if (statsData === undefined || statsLoading) return;\n\n const instance = new CatalogSearchAPI(catalogData.packages, statsData);\n return instance;\n }, [catalogData, catalogLoading, statsData, statsLoading]);\n\n if (!searchAPI) {\n return <PageLoader />;\n }\n\n return (\n <SearchContext.Provider value={searchAPI}>\n {children}\n </SearchContext.Provider>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\n\nexport interface CardProps extends BoxProps {}\n\n/**\n * Implements a <Box /> with simple card styles.\n */\nexport const Card = forwardRef<CardProps, \"div\">((props, ref) => {\n return (\n <Box\n bg=\"white\"\n border=\"base\"\n borderRadius=\"card\"\n boxShadow=\"base\"\n p={2}\n ref={ref}\n {...props}\n />\n );\n});\n\nCard.displayName = \"Card\";\n","import {\n ChangeEventHandler,\n FormEventHandler,\n useCallback,\n useMemo,\n useState,\n Dispatch,\n SetStateAction,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\n\nexport interface UseCatalogSearchParams {\n defaultCdkMajor?: number;\n defaultCdkType?: CDKType;\n defaultQuery?: string;\n defaultLanguage?: UseCatalogSearchReturn[\"language\"];\n defaultLanguages?: UseCatalogSearchReturn[\"languages\"];\n defaultSort?: UseCatalogSearchReturn[\"sort\"];\n defaultTags?: UseCatalogSearchReturn[\"tags\"];\n}\n\ninterface NavigationParams {\n replace?: boolean;\n}\n\nexport interface UseCatalogSearchReturn {\n /**\n * The CDK Type's major version to filter by\n */\n cdkMajor?: number;\n /**\n * The CDK Type to filter by\n */\n cdkType?: CDKType;\n /**\n * The language state for this search\n */\n language?: Language;\n /**\n * The list of languages being filtered\n */\n languages: Language[];\n /**\n * The list of tags being filtered\n */\n tags: string[];\n /**\n * Updates language state\n */\n onLanguageChange: (lang?: Language) => void;\n /**\n * Input ChangeEventHandler which wraps the setQuery state setter\n */\n onQueryChange: ChangeEventHandler<HTMLInputElement>;\n /**\n * Navigates to the search query url\n */\n onSearch: (p?: NavigationParams) => void;\n /**\n * FormEventHandler to handle query submission\n */\n onSubmit: FormEventHandler<HTMLFormElement>;\n /**\n * The query state for this search\n */\n query: string;\n /**\n * CDK Major state setter\n */\n setCdkMajor: Dispatch<SetStateAction<UseCatalogSearchReturn[\"cdkMajor\"]>>;\n /**\n * CDK Type state setter\n */\n setCdkType: Dispatch<SetStateAction<UseCatalogSearchReturn[\"cdkType\"]>>;\n /**\n * Language state setter\n */\n setLanguage: Dispatch<SetStateAction<UseCatalogSearchReturn[\"language\"]>>;\n /**\n * Languages list state setter\n */\n setLanguages: Dispatch<SetStateAction<UseCatalogSearchReturn[\"languages\"]>>;\n /**\n * Tags list state setter\n */\n setTags: Dispatch<SetStateAction<UseCatalogSearchReturn[\"tags\"]>>;\n /**\n * Query state setter\n */\n setQuery: Dispatch<SetStateAction<UseCatalogSearchReturn[\"query\"]>>;\n\n setSort: Dispatch<SetStateAction<UseCatalogSearchReturn[\"sort\"]>>;\n\n sort?: CatalogSearchSort;\n}\n\n/**\n * This hook provides all of the methods required to implement the functionality\n * of a client-side catalog search component. It additionally exposes lower-level methods\n * for custom components which may want to access parts of the search API\n */\nexport const useCatalogSearch = (\n options: UseCatalogSearchParams = {}\n): UseCatalogSearchReturn => {\n const [query, setQuery] = useState(options.defaultQuery ?? \"\");\n\n const [cdkType, setCdkType] = useState<UseCatalogSearchReturn[\"cdkType\"]>(\n options.defaultCdkType\n );\n\n const [cdkMajor, setCdkMajor] = useState<UseCatalogSearchReturn[\"cdkMajor\"]>(\n options.defaultCdkMajor\n );\n\n const [languages, setLanguages] = useState<\n UseCatalogSearchReturn[\"languages\"]\n >(options.defaultLanguages ?? []);\n\n const [tags, setTags] = useState<UseCatalogSearchReturn[\"tags\"]>(\n options.defaultTags ?? []\n );\n\n const [language, setLanguage] = useState<UseCatalogSearchReturn[\"language\"]>(\n options.defaultLanguage\n );\n\n const [sort, setSort] = useState<UseCatalogSearchReturn[\"sort\"]>(\n options.defaultSort\n );\n\n const { push, replace } = useHistory();\n\n const onQueryChange: UseCatalogSearchReturn[\"onQueryChange\"] = (e) => {\n e.preventDefault();\n setQuery(e.target.value);\n };\n\n const onSearch: UseCatalogSearchReturn[\"onSearch\"] = useCallback(\n (opts) => {\n const navigate = opts?.replace ? replace : push;\n navigate(\n getSearchPath({\n cdkType,\n cdkMajor,\n language,\n languages,\n query,\n sort,\n tags,\n })\n );\n },\n [cdkType, cdkMajor, language, languages, push, query, replace, sort, tags]\n );\n\n const onSubmit: UseCatalogSearchReturn[\"onSubmit\"] = useCallback(\n (e) => {\n e?.preventDefault();\n onSearch();\n },\n [onSearch]\n );\n\n return useMemo(\n () => ({\n cdkMajor,\n cdkType,\n language,\n languages,\n onLanguageChange: setLanguage,\n onQueryChange,\n onSearch,\n onSubmit,\n query,\n setCdkMajor,\n setCdkType,\n setLanguage,\n setLanguages,\n setTags,\n setQuery,\n setSort,\n sort,\n tags,\n }),\n [\n cdkMajor,\n cdkType,\n language,\n languages,\n onSearch,\n onSubmit,\n query,\n sort,\n tags,\n ]\n );\n};\n"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- !function(e){function t(t){for(var n,a,c=t[0],i=t[1],f=t[2],p=0,s=[];p<c.length;p++)a=c[p],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(l&&l(t);s.length;)s.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,c=1;c<r.length;c++){var i=r[c];0!==o[i]&&(n=!1)}n&&(u.splice(t--,1),e=a(a.s=r[0]))}return e}var n={},o={3:0},u=[];function a(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.e=function(e){var t=[],r=o[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=o[e]=[t,n]}));t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,a.nc&&c.setAttribute("nonce",a.nc),c.src=function(e){return a.p+"static/js/"+({}[e]||e)+"."+{0:"74bd9492",1:"37bf26c6",4:"7f5e3309",6:"993d90fd",7:"183f0a63",8:"8b7c92c5",9:"28413d73",10:"fb218d2f",11:"5bd19ded",12:"eb4db465",13:"fe9b51fc",14:"33162ba8"}[e]+".chunk.js"}(e);var i=new Error;u=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=o[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),u=t&&t.target&&t.target.src;i.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",i.name="ChunkLoadError",i.type=n,i.request=u,r[1](i)}o[e]=void 0}};var f=setTimeout((function(){u({type:"timeout",target:c})}),12e4);c.onerror=c.onload=u,document.head.appendChild(c)}return Promise.all(t)},a.m=e,a.c=n,a.d=function(e,t,r){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(a.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)a.d(r,n,function(t){return e[t]}.bind(null,n));return r},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="/",a.oe=function(e){throw console.error(e),e};var c=this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[],i=c.push.bind(c);c.push=t,c=c.slice();for(var f=0;f<c.length;f++)t(c[f]);var l=i;r()}([]);
2
- //# sourceMappingURL=runtime-main.ccd2f057.js.map
1
+ !function(e){function t(t){for(var n,a,c=t[0],i=t[1],f=t[2],p=0,s=[];p<c.length;p++)a=c[p],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(l&&l(t);s.length;)s.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,c=1;c<r.length;c++){var i=r[c];0!==o[i]&&(n=!1)}n&&(u.splice(t--,1),e=a(a.s=r[0]))}return e}var n={},o={3:0},u=[];function a(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.e=function(e){var t=[],r=o[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=o[e]=[t,n]}));t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,a.nc&&c.setAttribute("nonce",a.nc),c.src=function(e){return a.p+"static/js/"+({}[e]||e)+"."+{0:"0ec704bd",1:"4ed89d6e",4:"a2e9ec2d",6:"703e3c7f",7:"f8f9a8b7",8:"64914ea1",9:"c88e9272",10:"bc89b47e",11:"b2210011",12:"58276a6b",13:"512f115a",14:"a485bce3"}[e]+".chunk.js"}(e);var i=new Error;u=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=o[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),u=t&&t.target&&t.target.src;i.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",i.name="ChunkLoadError",i.type=n,i.request=u,r[1](i)}o[e]=void 0}};var f=setTimeout((function(){u({type:"timeout",target:c})}),12e4);c.onerror=c.onload=u,document.head.appendChild(c)}return Promise.all(t)},a.m=e,a.c=n,a.d=function(e,t,r){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(a.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)a.d(r,n,function(t){return e[t]}.bind(null,n));return r},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="/",a.oe=function(e){throw console.error(e),e};var c=this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[],i=c.push.bind(c);c.push=t,c=c.slice();for(var f=0;f<c.length;f++)t(c[f]);var l=i;r()}([]);
2
+ //# sourceMappingURL=runtime-main.7452ec40.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.ccd2f057.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t3: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"static/js/\" + ({}[chunkId]||chunkId) + \".\" + {\"0\":\"74bd9492\",\"1\":\"37bf26c6\",\"4\":\"7f5e3309\",\"6\":\"993d90fd\",\"7\":\"183f0a63\",\"8\":\"8b7c92c5\",\"9\":\"28413d73\",\"10\":\"fb218d2f\",\"11\":\"5bd19ded\",\"12\":\"eb4db465\",\"13\":\"fe9b51fc\",\"14\":\"33162ba8\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonpconstruct-hub-webapp\"] = this[\"webpackJsonpconstruct-hub-webapp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.7452ec40.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t3: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"static/js/\" + ({}[chunkId]||chunkId) + \".\" + {\"0\":\"0ec704bd\",\"1\":\"4ed89d6e\",\"4\":\"a2e9ec2d\",\"6\":\"703e3c7f\",\"7\":\"f8f9a8b7\",\"8\":\"64914ea1\",\"9\":\"c88e9272\",\"10\":\"bc89b47e\",\"11\":\"b2210011\",\"12\":\"58276a6b\",\"13\":\"512f115a\",\"14\":\"a485bce3\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonpconstruct-hub-webapp\"] = this[\"webpackJsonpconstruct-hub-webapp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}