construct-hub 0.3.159 → 0.3.160

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. package/.jsii +2 -2
  2. package/lib/construct-hub.js +1 -1
  3. package/lib/package-sources/code-artifact.js +1 -1
  4. package/lib/package-sources/npmjs.js +1 -1
  5. package/lib/package-tag/index.js +2 -2
  6. package/lib/s3/storage.js +1 -1
  7. package/lib/spdx-license.js +1 -1
  8. package/package.json +3 -3
  9. package/website/asset-manifest.json +16 -16
  10. package/website/index.html +1 -1
  11. package/website/static/js/{5.a4f881bb.chunk.js → 5.a110843d.chunk.js} +3 -3
  12. package/website/static/js/{5.a4f881bb.chunk.js.LICENSE.txt → 5.a110843d.chunk.js.LICENSE.txt} +0 -0
  13. package/website/static/js/{5.a4f881bb.chunk.js.map → 5.a110843d.chunk.js.map} +1 -1
  14. package/website/static/js/{6.18141b48.chunk.js → 6.8944c773.chunk.js} +2 -2
  15. package/website/static/js/{6.18141b48.chunk.js.map → 6.8944c773.chunk.js.map} +1 -1
  16. package/website/static/js/{7.63bdaf91.chunk.js → 7.80720b8b.chunk.js} +2 -2
  17. package/website/static/js/{7.63bdaf91.chunk.js.map → 7.80720b8b.chunk.js.map} +1 -1
  18. package/website/static/js/8.e4b13e68.chunk.js +2 -0
  19. package/website/static/js/8.e4b13e68.chunk.js.map +1 -0
  20. package/website/static/js/main.ded71e5d.chunk.js +2 -0
  21. package/website/static/js/main.ded71e5d.chunk.js.map +1 -0
  22. package/website/static/js/runtime-main.e4632d3a.js +2 -0
  23. package/website/static/js/{runtime-main.99def073.js.map → runtime-main.e4632d3a.js.map} +1 -1
  24. package/website/static/js/8.faf3cfee.chunk.js +0 -2
  25. package/website/static/js/8.faf3cfee.chunk.js.map +0 -1
  26. package/website/static/js/main.d24d1665.chunk.js +0 -2
  27. package/website/static/js/main.d24d1665.chunk.js.map +0 -1
  28. package/website/static/js/runtime-main.99def073.js +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["constants/languages.ts","icons/TSIcon.tsx","icons/PythonIcon.tsx","icons/JavaIcon.tsx","icons/GoIcon.tsx","icons/DotNetIcon.tsx","constants/keywords.ts","hooks/usePagination/usePagination.ts","hooks/useCatalogResults/useCatalogResults.ts","components/CDKType/CDKType.tsx","api/config/index.ts","api/versions/index.ts","contexts/Versions/Versions.tsx","components/Card/Card.tsx","components/Form/Form.tsx","hooks/useDebounce/useDebounce.ts","components/SearchItem/SearchItem.tsx","constants/url.ts","contexts/Analytics/util.ts","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/Header/constants.ts","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/Checkbox.ts","theme/components/Code.ts","theme/components/Divider.ts","theme/components/Radio.ts","theme/components/Tabs.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","index.tsx","register-service-worker.ts","contexts/Analytics/Analytics.tsx","contexts/Analytics/usePageView.ts","components/NavLink/NavLink.tsx","constants/constructs.ts","api/catalog-search/constants.ts","components/ExternalLink/ExternalLink.tsx","util/createTestIds.ts","constants/links.ts","util/url.ts","components/SearchBar/testIds.ts","components/SearchBar/SearchBar.tsx","components/SearchBar/SearchOverlay.tsx","components/SearchBar/SearchSuggestions.tsx","components/PageLoader/PageLoader.tsx","api/catalog-search/util.ts","api/catalog-search/catalog-search.ts","contexts/Search/Search.tsx","api/package/packages.ts","contexts/Catalog/Catalog.tsx","api/stats/index.ts","contexts/Stats/Stats.tsx","contexts/Config/Config.tsx","hooks/useCatalogSearch/useCatalogSearch.ts","contexts/ExternalLinkWarning/constants.ts","contexts/ExternalLinkWarning/ExternalLinkWarningModal.tsx","contexts/ExternalLinkWarning/ExternalLinkWarning.tsx","hooks/useSearch/useSearch.ts"],"names":["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","color","overflow","style","marker","java","golang","dotnet","KEYWORD_IGNORE_LIST","map","x","toLocaleLowerCase","takePage","items","opts","limit","start","stop","slice","useCatalogResults","cdkMajor","cdkType","keywords","query","language","languages","sort","tags","filters","useMemo","undefined","results","useSearch","data","options","pageLimit","Math","floor","length","page","usePagination","CDKTypeText","forwardRef","ref","majorVersion","alt","CDKTYPE_RENDER_MAP","h","src","imgsrc","w","badgeColorMap","CDKType","awscdk","cdk8s","cdktf","CDKTypeBadge","badgeProps","bg","alignItems","as","NavLink","borderRadius","display","maxW","px","textTransform","to","getSearchPath","DEFAULT_FEATURED_PACKAGES","sections","showLastUpdated","defaultConfig","featureFlags","packageLinks","featuredPackages","fetchConfig","a","window","configOverride","fetch","API_PATHS","CONFIG","response","ok","console","error","statusText","warn","json","catch","err","defaultVersions","packages","updated","fetchVersions","ALL_VERSIONS","VersionsContext","createContext","useVersions","useContext","VersionsProvider","children","Versions","useQuery","Provider","value","Card","border","boxShadow","p","displayName","Form","form","useDebounce","useState","debouncedValue","setDebouncedValue","delay","onChange","useEffect","handler","setTimeout","clearTimeout","SearchItem","onClick","_hover","cursor","fontSize","lineHeight","listStyleType","minH","onKeyDown","e","includes","key","preventDefault","role","sx","tabIndex","PACKAGES_PREFIX","CATALOG_SUFFIX","ASSEMBLY_SUFFIX","METADATA_SUFFIX","STATS","QUERY_PARAMS","CDK_TYPE","KEYWORDS","LANGUAGE","OFFSET","SEARCH_QUERY","SORT","SUBMODULE","CDK_MAJOR","TAGS","ROUTES","CONTRIBUTE","FAQ","HOME","PACKAGES","SEARCH","SITE_TERMS","eventName","args","join","clickEvent","params","event","type","instance","onPerfEntry","getLocalStoreWriter","URLSearchParams","location","search","get","initialize","domain","hostname","navigator","__storeWriter","AWSCShortbread","callIfDefined","method","Error","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","values","Footer","align","container","direction","justify","py","columnGap","columns","links","entries","index","base","md","borderColor","mr","orientation","ExternalLink","hasWarning","href","mx","sm","disclaimer","mt","manageCookies","fontWeight","variant","headerEvent","searchModalEvent","documentationEvent","gettingStartedEvent","HEADER_ANALYTICS","CONTRIBUTE_LINK","DOCUMENTATION","DOCUMENTATION_DROPDOWN","MENU","LINK","GETTING_STARTED","GETTING_STARTED_DROPDOWN","LOGO","MOBILE_NAV","OPEN","CLOSE","SEARCH_MODAL","NavPopover","menuProps","colorScheme","strategy","Link","isNavLink","justifyContent","NavPopoverContent","dataEvent","item","idx","title","link","linkIdx","NavPopoverTrigger","Button","rightIcon","size","DocumentationDropdown","documentationTrigger","documentationMenu","GettingStartedDropdown","gettingStartedTrigger","gettingStartedMenu","SearchModal","isOpen","onClose","trackCustomEvent","useAnalytics","useCatalogSearch","onQueryChange","onSubmit","onSearch","pb","spacing","SearchBar","HeaderSearch","searchModal","useDisclosure","exact","path","searchInput","lg","searchIcon","onOpen","linkProps","MobileNavLinksContent","flex","textAlign","itemIdx","borderBottom","pt","MobileNavLinks","allowMultiple","allowToggle","section","Title","MobileNav","placement","mobileNav","borderBottomColor","NavButton","nav","navOpen","HeaderItem","rowStart","Header","gap","gridTemplateColumns","gridTemplateRows","position","top","zIndex","colStart","justifySelf","placeItems","templateColumns","LazyRoute","Component","component","routeProps","fallback","PageLoader","Contribute","lazy","Home","NotFound","Packages","Search","SiteTerms","App","baseStyleControl","c","transitionProperty","transitionDuration","_checked","mode","_disabled","_indeterminate","_focus","_invalid","baseStyleLabel","userSelect","opacity","baseStyleIcon","Checkbox","parts","keys","baseStyle","control","label","sizes","defaultProps","theme","components","Code","variants","subtle","whiteSpace","Divider","pos","_before","content","left","Radio","baseTheme","Tabs","line","borderProp","marginProp","tablist","tab","createVariant","overrides","varBase","Tag","makeTag","config","customVariants","reduce","accum","keyword","background","transparentize","makeComponents","foundations","borders","colors","blue","bgPrimary","radii","card","shadows","makeTheme","componentsConfig","packageTags","extendTheme","initialColorMode","useSystemColorMode","Theme","useConfig","isLoading","resetCSS","queryClient","Boolean","match","QueryClient","ReactDOM","render","StrictMode","client","Analytics","Config","Catalog","Stats","ExternalLinkWarning","document","getElementById","Function","getCLS","getFID","getFCP","getLCP","getTTFB","serviceWorker","ready","registration","unregister","message","AnalyticsContext","trackPageView","dispatchAnalyticsEvent","detail","cb","AWSMA","dispatchEvent","CustomEvent","TRIGGER_EVENT","AnalyticsProvider","pathname","useLocation","prevPath","useRef","useCallback","current","listener","target","hasAttribute","getAttribute","parentElement","addEventListener","removeEventListener","usePageView","pageURL","replace","description","RouterLink","CDKTYPE_NAME_MAP","CatalogSearchSort","hasIcon","noFollow","withPrompt","useExternalLinkWarning","mb","ml","rel","scope","ids","acc","curr","CONSTRUCT_HUB_REPO_URL","gitSSHRegex","RegExp","getRepoUrlAndHost","repoUrl","sshUrl","author","repo","URL","createURL","searchParams","filter","forEach","k","v","set","toString","createURLSearchParams","getPackagePath","submodule","SearchBarState","useSearchBarState","state","hasButton","inputProps","disclosure","inputRef","searchAPI","catalog","roundedCatalogLength","placeholder","clickListener","contains","kbdListener","blur","input","focusBorderColor","onFocus","pr","borderLeftRadius","searchButton","SearchOverlay","overlay","inset","SearchSuggestions","debouncedQuery","push","useHistory","recommendations","UnorderedList","suggestionsList","right","pkg","i","constructFramework","metadata","suggestion","getStrSort","isAscending","p1","p2","localeCompare","getDateSort","d1","Date","date","getTime","d2","getDownloadsSort","downloads","SORT_FUNCTIONS","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","DownloadsAsc","DownloadsDesc","FILTER_FUNCTIONS","kw","add","has","languageSet","some","lang","tag","renderAllKeywords","allKeywords","publisherKeywords","tagKeywords","t","Array","from","INDEX_FIELDS","AUTHOR_EMAIL","boost","AUTHOR_NAME","DESCRIPTION","NAME","PACKAGE_NAME","SCOPE","TAG_NAMES","CatalogSearchAPI","catalogData","stats","constructFrameworks","catalogMap","authorName","authorEmail","npm","split","packageName","email","tagNames","lunr","tokenizer","flat","Map","this","detectConstructFrameworks","detectKeywords","separator","field","downloadBoost","log","max","dedup","refs","tokenizedQuery","token","q","term","matches","copiedResults","filterFunctions","result","isFiltered","filterFn","delete","dedupedResults","maybePkg","entry","frameworks","frameworkName","majorVersions","pkgCount","SearchContext","useSearchContext","SearchProvider","useCatalog","useStats","EMPTY_CATALOG","fetchPackages","CatalogContext","CatalogProvider","catalogQuery","initialData","defaultStats","fetchStats","StatsContext","StatsProvider","ConfigContext","ConfigProvider","configData","startsWith","flagName","defaultQuery","setQuery","defaultCdkType","setCdkType","defaultCdkMajor","setCdkMajor","defaultLanguages","setLanguages","defaultTags","setTags","defaultKeywords","setKeywords","defaultSort","setSort","PREFERS_WARN_ON_EXTERNAL_LINK_CLICK","ExternalLinkWarningModal","setShouldWarn","finalShouldWarn","setFinalShouldWarn","closeOnOverlayClick","shouldWarn","checked","hasArrow","localStorage","setItem","JSON","stringify","ExternalLinkWarningContext","ExternalLinkWarningProvider","modalOption","setModalOptions","saved","getItem","parse"],"mappings":"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","file":"static/js/main.ded71e5d.chunk.js","sourcesContent":["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","export const KEYWORD_IGNORE_LIST = new Set(\n [\n \"aws-cdk\",\n \"aws\",\n \"awscdk\",\n \"cdk-construct\",\n \"cdk\",\n \"cdktf\",\n \"cdk8s\",\n \"construct\",\n \"constructs\",\n ].map((x) => x.toLocaleLowerCase())\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 keywords?: string[];\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 keywords,\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 keywords,\n language: language ?? undefined,\n languages,\n tags,\n }),\n [cdkMajor, cdkType, keywords, 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 {\n Badge,\n BadgeProps,\n forwardRef,\n Image,\n ImageProps,\n Text,\n TextProps,\n} from \"@chakra-ui/react\";\nimport { CDKType, CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\ninterface CDKTypeIconProps extends ImageProps {\n name?: CDKType;\n majorVersion?: number;\n}\n\nexport const CDKTypeIcon = forwardRef<CDKTypeIconProps, \"img\">(\n ({ name, majorVersion, ...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\ninterface CDKTypeBadgeProps extends BadgeProps {\n name?: CDKType;\n majorVersion?: number;\n}\n\nconst badgeColorMap = {\n [CDKType.awscdk]: \"#CF4A02\",\n [CDKType.cdk8s]: \"#005797\",\n [CDKType.cdktf]: \"#5C4EE5\",\n};\n\nexport const CDKTypeBadge = forwardRef<CDKTypeBadgeProps, \"span\">(\n ({ name, majorVersion, ...badgeProps }, ref) => {\n if (!name) return null;\n\n const bg = badgeColorMap[name];\n\n return (\n <Badge\n alignItems=\"center\"\n as={NavLink}\n bg={bg}\n borderRadius=\"md\"\n color=\"white\"\n display=\"flex\"\n h=\"1.5rem\"\n maxW=\"5.5rem\"\n px={1.5}\n ref={ref}\n textTransform=\"none\"\n to={getSearchPath({ cdkType: name, cdkMajor: majorVersion })}\n {...badgeProps}\n >\n <CDKTypeText majorVersion={majorVersion} name={name} />\n </Badge>\n );\n }\n);\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\nexport interface Category {\n title: string;\n url: string;\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 categories?: Category[];\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.error(response.statusText);\n console.warn(\"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.warn(\"Invalid config response, using default values\");\n return defaultConfig;\n });\n};\n","import { API_PATHS } from \"../../constants/url\";\n\nconst NOT_FOUND = \"NOT_FOUND\";\n\n/**\n * Package versions.\n */\nexport interface PackageVersions {\n readonly updated: string;\n readonly packages: { [key: string]: string[] };\n}\n\nconst defaultVersions = { packages: {}, updated: NOT_FOUND };\n\nexport const fetchVersions = async (): Promise<PackageVersions> => {\n const response = await fetch(API_PATHS.ALL_VERSIONS);\n\n if (!response.ok) {\n console.error(response.statusText);\n console.warn(\"Could not retrieve package versions. Using empty data.\");\n return defaultVersions;\n }\n\n return response.json().catch((err) => {\n console.error(err);\n console.warn(\"Error in package versions response. Using empty data.\");\n return defaultVersions;\n });\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { useQuery, UseQueryResult } from \"react-query\";\nimport { fetchVersions, PackageVersions } from \"../../api/versions\";\n\nexport type VersionsQuery = UseQueryResult<PackageVersions, Error | undefined>;\n\nconst VersionsContext = createContext<VersionsQuery | undefined>(undefined);\n\nexport const useVersions = () => useContext(VersionsContext)!;\n\nexport const VersionsProvider: FunctionComponent = ({ children }) => {\n const Versions: VersionsQuery = useQuery(\"Versions\", fetchVersions);\n\n return (\n <VersionsContext.Provider value={Versions}>\n {children}\n </VersionsContext.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 { 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","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 ALL_VERSIONS: \"/all-versions.json\",\n} as const;\n\nexport const QUERY_PARAMS = {\n CDK_TYPE: \"cdk\",\n KEYWORDS: \"keywords\",\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 CONTRIBUTE: \"/contribute\",\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 type { ClickEventConfig } from \"./types\";\n\nexport const eventName = (...args: string[]) => args.join(\" | \");\n\nexport const clickEvent = (\n params: Omit<ClickEventConfig[\"event\"], \"type\">\n): ClickEventConfig => ({\n event: {\n ...params,\n type: \"click\",\n },\n});\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 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\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 { eventName } from \"../../contexts/Analytics\";\n\nconst headerEvent: typeof eventName = (...e) => eventName(\"Header\", ...e);\n\nconst searchModalEvent: typeof eventName = (...e) =>\n headerEvent(\"Search Modal\", ...e);\n\nconst documentationEvent: typeof eventName = (...e) =>\n headerEvent(\"Documentation\", ...e);\n\nconst gettingStartedEvent: typeof eventName = (...e) =>\n headerEvent(\"Getting Started\", ...e);\n\nexport const HEADER_ANALYTICS = {\n CONTRIBUTE_LINK: headerEvent(\"Contribute\"),\n\n DOCUMENTATION: documentationEvent(),\n\n DOCUMENTATION_DROPDOWN: {\n MENU: documentationEvent(\"Menu\"),\n LINK: documentationEvent(\"Link\"),\n },\n\n GETTING_STARTED: gettingStartedEvent(),\n\n GETTING_STARTED_DROPDOWN: {\n MENU: gettingStartedEvent(\"Menu\"),\n LINK: gettingStartedEvent(\"Link\"),\n },\n\n LOGO: headerEvent(\"Logo\"),\n\n MOBILE_NAV: {\n OPEN: headerEvent(\"Mobile Nav\", \"Open\"),\n CLOSE: headerEvent(\"Mobile Nav\", \"Close\"),\n },\n\n SEARCH: headerEvent(\"Search\"),\n\n SEARCH_MODAL: {\n CLOSE: searchModalEvent(\"Close\"),\n OPEN: searchModalEvent(\"Open\"),\n SEARCH: searchModalEvent(\"Search\"),\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 { eventName } from \"../../contexts/Analytics/util\";\nimport { ExternalLink } from \"../ExternalLink\";\nimport { NavLink } from \"../NavLink\";\nimport type { IMenuItems, ILink } from \"./types\";\n\nexport interface NavPopoverContentProps extends MenuListProps {\n \"data-event\"?: string;\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 ({ \"data-event\": dataEvent, 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\n data-event={\n dataEvent\n ? eventName(dataEvent, link.display)\n : undefined\n }\n key={`${link.display}-${linkIdx}`}\n >\n <Link {...link} />\n </MenuItem>\n ))}\n </MenuGroup>\n {idx !== items.length - 1 && <MenuDivider />}\n </Fragment>\n );\n }\n\n return (\n <MenuItem\n data-event={\n dataEvent ? eventName(dataEvent, item.display) : undefined\n }\n key={`${item.display}-${idx}`}\n >\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 { HEADER_ANALYTICS } from \"./constants\";\nimport testIds from \"./testIds\";\n\nexport const DocumentationDropdown: FunctionComponent = () => (\n <NavPopover>\n <NavPopoverTrigger\n data-event={HEADER_ANALYTICS.DOCUMENTATION_DROPDOWN.MENU}\n data-testid={testIds.documentationTrigger}\n >\n Documentation\n </NavPopoverTrigger>\n <NavPopoverContent\n data-event={HEADER_ANALYTICS.DOCUMENTATION_DROPDOWN.LINK}\n data-testid={testIds.documentationMenu}\n items={DOCUMENTATION}\n />\n </NavPopover>\n);\n","import type { FunctionComponent } from \"react\";\nimport { GETTING_STARTED } from \"../../constants/links\";\nimport {\n NavPopover,\n NavPopoverContent,\n NavPopoverTrigger,\n} from \"../NavPopover\";\nimport { HEADER_ANALYTICS } from \"./constants\";\nimport testIds from \"./testIds\";\n\nexport const GettingStartedDropdown: FunctionComponent = () => (\n <NavPopover>\n <NavPopoverTrigger\n data-event={HEADER_ANALYTICS.GETTING_STARTED_DROPDOWN.MENU}\n data-testid={testIds.gettingStartedTrigger}\n >\n Getting Started\n </NavPopoverTrigger>\n <NavPopoverContent\n data-event={HEADER_ANALYTICS.GETTING_STARTED_DROPDOWN.LINK}\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 { useAnalytics } from \"../../contexts/Analytics\";\nimport { clickEvent } from \"../../contexts/Analytics/util\";\nimport { useCatalogSearch } from \"../../hooks/useCatalogSearch\";\nimport { HEADER_ANALYTICS } from \"../Header/constants\";\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 { trackCustomEvent } = useAnalytics();\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} mx={4}>\n <ModalCloseButton\n data-event={HEADER_ANALYTICS.SEARCH_MODAL.CLOSE}\n onClick={() => {\n trackCustomEvent(\n clickEvent({ name: HEADER_ANALYTICS.SEARCH_MODAL.CLOSE })\n );\n }}\n />\n <ModalHeader>Search</ModalHeader>\n <ModalBody>\n <Stack pb={4} spacing={4}>\n <SearchBar\n data-event={HEADER_ANALYTICS.SEARCH_MODAL.SEARCH}\n onChange={onQueryChange}\n onSubmit={(e) => {\n onClose();\n onSubmit(e);\n }}\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 { HEADER_ANALYTICS } from \"./constants\";\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\", lg: \"initial\" }}\n >\n <SearchBar bg=\"gray.50\" data-event={HEADER_ANALYTICS.SEARCH}>\n <SearchOverlay />\n <SearchSuggestions />\n </SearchBar>\n </Box>\n {/* Mobile Search Trigger */}\n <Box display={{ base: \"initial\", lg: \"none\" }}>\n <IconButton\n aria-label=\"Search Icon\"\n borderRadius=\"md\"\n data-event={HEADER_ANALYTICS.SEARCH_MODAL.OPEN}\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 { useAnalytics } from \"../../contexts/Analytics\";\nimport { clickEvent, eventName } from \"../../contexts/Analytics/util\";\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 & { \"data-event\"?: string }> = ({\n \"data-event\": dataEvent,\n display,\n isNavLink,\n url,\n}) => {\n const event = dataEvent ? eventName(dataEvent, \"Link\", display) : undefined;\n\n return isNavLink ? (\n <NavLink data-event={event} to={url} {...linkProps}>\n {display}\n </NavLink>\n ) : (\n <ExternalLink\n alignItems=\"center\"\n data-event={event}\n display=\"flex\"\n hasWarning={false}\n href={url}\n justifyContent=\"space-between\"\n {...linkProps}\n >\n {display}\n </ExternalLink>\n );\n};\n\ninterface MobileNavLinksContentProps {\n dataEvent?: string;\n testId?: string;\n title: string;\n items: IMenuItems;\n}\n\nconst MobileNavLinksContent: FunctionComponent<MobileNavLinksContentProps> = ({\n title,\n items,\n testId,\n dataEvent,\n}) => {\n const { trackCustomEvent } = useAnalytics();\n return (\n <AccordionItem data-testid={testId} w=\"full\">\n <AccordionButton\n onClick={() => {\n if (dataEvent) {\n trackCustomEvent(\n clickEvent({ name: eventName(dataEvent, \"Menu\") })\n );\n }\n }}\n px={0}\n py={4}\n >\n <Box flex=\"1\" textAlign=\"left\">\n <Heading as=\"h3\" color=\"blue.800\" 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\n data-event={dataEvent}\n {...link}\n key={`${link.display}-${linkIdx}`}\n />\n ))}\n </Fragment>\n );\n }\n\n return (\n <Link\n data-event={dataEvent}\n {...item}\n key={`${item.display}-${itemIdx}`}\n />\n );\n })}\n </Flex>\n </AccordionPanel>\n </AccordionItem>\n );\n};\n\ninterface MobileNavLinksProps {\n sections: MobileNavLinksContentProps[];\n}\n\nexport const MobileNavLinks: FunctionComponent<MobileNavLinksProps> = ({\n sections,\n}) => (\n <Accordion allowMultiple allowToggle w=\"full\">\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 { HEADER_ANALYTICS } from \"./constants\";\nimport testIds from \"./testIds\";\n\nexport const Title: FunctionComponent = () => (\n <Heading as=\"h1\" color=\"blue.800\" data-testid={testIds.title} size=\"lg\">\n <Link data-event={HEADER_ANALYTICS.LOGO} to=\"/\">\n <Box as=\"span\" color=\"blue.500\" data-event={HEADER_ANALYTICS.LOGO}>\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 { ROUTES } from \"../../constants/url\";\nimport { NavLink } from \"../NavLink\";\nimport { HEADER_ANALYTICS } from \"./constants\";\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={0}>\n <MobileNavLinks\n sections={[\n {\n dataEvent: HEADER_ANALYTICS.GETTING_STARTED,\n title: \"Getting Started\",\n items: GETTING_STARTED,\n testId: testIds.gettingStartedMenu,\n },\n {\n dataEvent: HEADER_ANALYTICS.DOCUMENTATION,\n title: \"Documentation\",\n items: DOCUMENTATION,\n testId: testIds.documentationMenu,\n },\n ]}\n />\n\n <NavLink\n _hover={{ bg: \"blackAlpha.50\" }}\n borderBottom=\"1px solid\"\n borderBottomColor=\"gray.200\"\n color=\"blue.800\"\n fontSize=\"1rem\"\n fontWeight=\"bold\"\n h=\"3.25rem\"\n lineHeight=\"3.25rem\"\n to={ROUTES.CONTRIBUTE}\n w=\"full\"\n >\n Contribute\n </NavLink>\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 { useAnalytics } from \"../../contexts/Analytics\";\nimport { clickEvent } from \"../../contexts/Analytics/util\";\nimport { HEADER_ANALYTICS } from \"./constants\";\nimport { MobileNav } from \"./MobileNav\";\nimport testIds from \"./testIds\";\n\nexport const NavButton: FunctionComponent = () => {\n const { trackCustomEvent } = useAnalytics();\n const nav = useDisclosure({\n onOpen: () =>\n trackCustomEvent(clickEvent({ name: HEADER_ANALYTICS.MOBILE_NAV.OPEN })),\n onClose: () =>\n trackCustomEvent(clickEvent({ name: HEADER_ANALYTICS.MOBILE_NAV.CLOSE })),\n });\n\n return (\n <>\n <IconButton\n aria-label=\"Navigation Menu\"\n borderRadius=\"md\"\n data-testid={testIds.navOpen}\n display={{ lg: \"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 { ROUTES } from \"../../constants/url\";\nimport { NavLink } from \"../NavLink\";\nimport { HEADER_ANALYTICS } from \"./constants\";\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 lg: \"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, lg: 1 }}\n justifySelf={{ base: \"center\", lg: \"start\" }}\n >\n <Title />\n </HeaderItem>\n\n {/* Search Trigger */}\n <HeaderItem\n colStart={{ base: 3, lg: 2 }}\n justifySelf={{ base: \"end\", lg: \"stretch\" }}\n >\n <HeaderSearch />\n </HeaderItem>\n\n {/* Navigation */}\n <HeaderItem\n colStart={{ base: 1, lg: 3 }}\n justifySelf={{ base: \"start\", lg: \"end\" }}\n >\n <Grid\n display={{ base: \"none\", lg: \"grid\" }}\n gap={4}\n gridTemplateRows=\"1fr\"\n placeItems=\"center\"\n templateColumns=\"1fr 1fr auto\"\n w=\"100%\"\n >\n <Box>\n <GettingStartedDropdown />\n </Box>\n <Box>\n <DocumentationDropdown />\n </Box>\n\n <NavLink\n color=\"blue.800\"\n data-event={HEADER_ANALYTICS.CONTRIBUTE_LINK}\n fontWeight=\"500\"\n to={ROUTES.CONTRIBUTE}\n >\n Contribute\n </NavLink>\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 } from \"react-router-dom\";\nimport { Footer } from \"./components/Footer\";\nimport { Header } from \"./components/Header\";\nimport { LazyRoute } from \"./components/LazyRoute\";\nimport { ROUTES } from \"./constants/url\";\n\nconst Contribute = lazy(() => import(\"./views/Contribute\"));\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 Search = lazy(() => import(\"./views/Search\"));\nconst SiteTerms = lazy(() => import(\"./views/SiteTerms\"));\n\nexport const App: FunctionComponent = () => {\n return (\n <Grid\n as=\"main\"\n bg=\"bgPrimary\"\n gridTemplateColumns=\"1fr\"\n gridTemplateRows=\"auto 1fr auto\"\n h=\"100%\"\n maxW=\"100%\"\n minH=\"100vh\"\n >\n <Header />\n <Switch>\n <LazyRoute component={Contribute} exact path={ROUTES.CONTRIBUTE} />\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={Search} exact path={ROUTES.SEARCH} />\n <LazyRoute component={NotFound} path=\"*\" />\n </Switch>\n <Footer />\n </Grid>\n );\n};\n","import { checkboxAnatomy as parts } from \"@chakra-ui/anatomy\";\nimport {\n mode,\n PartsStyleFunction,\n PartsStyleObject,\n SystemStyleFunction,\n SystemStyleObject,\n} from \"@chakra-ui/theme-tools\";\n\nconst baseStyleControl: SystemStyleFunction = (props) => {\n const { colorScheme: c } = props;\n\n return {\n w: \"100%\",\n transitionProperty: \"box-shadow\",\n transitionDuration: \"normal\",\n border: \"2px solid\",\n borderRadius: \"sm\",\n borderColor: \"inherit\",\n color: \"white\",\n\n _checked: {\n bg: mode(`${c}.500`, `${c}.200`)(props),\n borderColor: mode(`${c}.500`, `${c}.200`)(props),\n color: mode(\"white\", \"gray.900\")(props),\n\n _hover: {\n bg: mode(`${c}.600`, `${c}.300`)(props),\n borderColor: mode(`${c}.600`, `${c}.300`)(props),\n },\n\n _disabled: {\n borderColor: mode(\"gray.200\", \"transparent\")(props),\n bg: mode(\"gray.200\", \"whiteAlpha.300\")(props),\n color: mode(\"gray.500\", \"whiteAlpha.500\")(props),\n },\n },\n\n _indeterminate: {\n bg: mode(`${c}.500`, `${c}.200`)(props),\n borderColor: mode(`${c}.500`, `${c}.200`)(props),\n color: mode(\"white\", \"gray.900\")(props),\n },\n\n _disabled: {\n bg: mode(\"gray.100\", \"whiteAlpha.100\")(props),\n borderColor: mode(\"gray.100\", \"transparent\")(props),\n },\n\n _focus: {\n boxShadow: \"outline\",\n },\n\n _invalid: {\n borderColor: mode(\"red.500\", \"red.300\")(props),\n },\n };\n};\n\nconst baseStyleLabel: SystemStyleObject = {\n userSelect: \"none\",\n _disabled: { opacity: 0.4 },\n};\n\nconst baseStyleIcon: SystemStyleObject = {\n transitionProperty: \"transform\",\n transitionDuration: \"normal\",\n};\n\nconst baseStyle: PartsStyleFunction<typeof parts> = (props) => ({\n icon: baseStyleIcon,\n control: baseStyleControl(props),\n label: baseStyleLabel,\n});\n\nconst sizes: Record<string, PartsStyleObject<typeof parts>> = {\n sm: {\n control: { h: 3, w: 3 },\n label: { fontSize: \"sm\" },\n icon: { fontSize: \"0.45rem\" },\n },\n base: {\n control: { h: 3.5, w: 3.5 },\n label: { fontSize: \"sm\" },\n icon: { fontSize: \"0.5rem\" },\n },\n md: {\n control: { w: 4, h: 4 },\n label: { fontSize: \"md\" },\n icon: { fontSize: \"0.625rem\" },\n },\n lg: {\n control: { w: 5, h: 5 },\n label: { fontSize: \"lg\" },\n icon: { fontSize: \"0.625rem\" },\n },\n};\n\nconst defaultProps = {\n size: \"base\",\n colorScheme: \"blue\",\n};\n\nexport const Checkbox = {\n parts: parts.keys,\n baseStyle,\n sizes,\n defaultProps,\n};\n","import { theme } from \"@chakra-ui/react\";\n\nconst {\n components: { Code: base },\n} = theme;\n\nexport const Code: Record<string, any> = {\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 { radioAnatomy as parts } from \"@chakra-ui/anatomy\";\nimport {\n PartsStyleFunction,\n PartsStyleObject,\n SystemStyleFunction,\n} from \"@chakra-ui/theme-tools\";\nimport { Checkbox } from \"./Checkbox\";\n\nconst baseStyleControl: SystemStyleFunction = (props) => {\n const { control = {} } = Checkbox.baseStyle(props) as any;\n\n return {\n ...control,\n borderRadius: \"full\",\n pos: \"relative\",\n _checked: {\n ...control._checked,\n _before: {\n content: `\"\"`,\n display: \"inline-block\",\n pos: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n w: \"50%\",\n h: \"50%\",\n borderRadius: \"50%\",\n bg: \"currentColor\",\n },\n },\n };\n};\n\nconst baseStyle: PartsStyleFunction<typeof parts> = (props) => ({\n label: Checkbox.baseStyle(props).label,\n control: baseStyleControl(props),\n});\n\nconst sizes: Record<string, PartsStyleObject<typeof parts>> = {\n sm: {\n control: { h: 3, w: 3 },\n label: { fontSize: \"sm\" },\n },\n base: {\n control: { h: 3.5, w: 3.5 },\n label: { fontSize: \"sm\" },\n },\n md: {\n control: { h: 4, w: 4 },\n label: { fontSize: \"md\" },\n },\n lg: {\n control: { h: 5, w: 5 },\n label: { fontSize: \"lg\" },\n },\n};\n\nconst defaultProps = {\n size: \"base\",\n colorScheme: \"blue\",\n};\n\nexport const Radio = {\n parts: parts.keys,\n baseStyle,\n sizes,\n defaultProps,\n};\n","import { tabsAnatomy as parts } from \"@chakra-ui/anatomy\";\nimport { theme } from \"@chakra-ui/react\";\nimport {\n mode,\n PartsStyleFunction,\n PartsStyleInterpolation,\n} from \"@chakra-ui/theme-tools\";\n\nconst baseTheme = theme.components.Tabs;\n\nconst variantLine: PartsStyleFunction<typeof parts> = (props) => {\n const { colorScheme: c, orientation } = props;\n const isVertical = orientation === \"vertical\";\n const borderProp =\n orientation === \"vertical\" ? \"borderStart\" : \"borderBottom\";\n const marginProp = isVertical ? \"marginStart\" : \"marginBottom\";\n\n return {\n tablist: {\n [borderProp]: \"none\",\n borderColor: \"inherit\",\n },\n tab: {\n [borderProp]: \"4px solid\",\n borderColor: \"transparent\",\n [marginProp]: \"0\",\n _selected: {\n color: mode(`${c}.500`, `${c}.300`)(props),\n borderColor: \"currentColor\",\n fontWeight: \"semibold\",\n },\n _active: {\n bg: mode(\"gray.200\", \"whiteAlpha.300\")(props),\n },\n _disabled: {\n opacity: 0.4,\n cursor: \"not-allowed\",\n },\n },\n };\n};\n\nconst variants: Record<string, PartsStyleInterpolation<typeof parts>> = {\n ...baseTheme.variants,\n line: variantLine,\n};\n\nexport const Tabs: typeof baseTheme = {\n ...baseTheme,\n variants,\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 { Checkbox } from \"./Checkbox\";\nimport { Code } from \"./Code\";\nimport { Divider } from \"./Divider\";\nimport { Radio } from \"./Radio\";\nimport { Tabs } from \"./Tabs\";\nimport { makeTag } from \"./Tag\";\n\ninterface ComponentsConfig {\n Tag: PackageTagConfig[];\n}\n\nexport const makeComponents: any = (config: ComponentsConfig) => {\n return {\n ...theme.components,\n Checkbox,\n Code,\n Divider,\n Radio,\n Tag: makeTag(config.Tag),\n Tabs,\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 { isLoading, data } = useConfig();\n return isLoading ? (\n <PageLoader />\n ) : (\n <ChakraProvider resetCSS theme={makeTheme(data!)}>\n {children}\n </ChakraProvider>\n );\n};\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { QueryClient, QueryClientProvider } from \"react-query\";\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 { VersionsProvider } from \"./contexts/Versions\";\nimport { unregister } from \"./register-service-worker\";\nimport { reportWebVitals } from \"./reportWebVitals\";\n\nconst queryClient = new QueryClient();\n\nReactDOM.render(\n <React.StrictMode>\n <QueryClientProvider client={queryClient}>\n <Router>\n <ShortbreadProvider>\n <AnalyticsProvider>\n <ConfigProvider>\n <CatalogProvider>\n <StatsProvider>\n <VersionsProvider>\n <SearchProvider>\n <Theme>\n <ExternalLinkWarningProvider>\n <App />\n </ExternalLinkWarningProvider>\n </Theme>\n </SearchProvider>\n </VersionsProvider>\n </StatsProvider>\n </CatalogProvider>\n </ConfigProvider>\n </AnalyticsProvider>\n </ShortbreadProvider>\n </Router>\n </QueryClientProvider>\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","// 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 {\n useContext,\n useCallback,\n useRef,\n createContext,\n FunctionComponent,\n useEffect,\n} from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { ClickEventConfig, PageViewConfig } from \"./types\";\nimport { clickEvent } from \"./util\";\n\nexport interface AnalyticsAPI {\n trackCustomEvent: (opts: ClickEventConfig) => void;\n trackPageView: (opts: PageViewConfig) => void;\n}\n\nconst AnalyticsContext = createContext<AnalyticsAPI>({\n trackCustomEvent: () => {},\n trackPageView: () => {},\n});\n\nconst dispatchAnalyticsEvent = (\n detail: PageViewConfig | ClickEventConfig,\n cb?: () => void\n) => {\n window?.AWSMA?.ready?.(() => {\n if (process.env.NODE_ENV === \"development\") {\n console.info(detail.event.name, detail);\n }\n document.dispatchEvent(\n new CustomEvent(window.AWSMA.TRIGGER_EVENT, { detail })\n );\n\n cb?.();\n });\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: AnalyticsAPI[\"trackPageView\"] = useCallback(\n (opts) => {\n if (prevPath.current === pathname) {\n return;\n }\n\n dispatchAnalyticsEvent(opts, () => {\n prevPath.current = pathname;\n });\n },\n [pathname]\n );\n\n // Tracks click events for elements with a `data-event` attr or elements which are nested within a data-event item\n useEffect(() => {\n const listener = (e: MouseEvent) => {\n if (e.target) {\n let eventName: string | null = null;\n let target: HTMLElement | null = e.target as HTMLElement;\n\n while (target && !eventName) {\n if (target.hasAttribute?.(\"data-event\")) {\n eventName = target.getAttribute(\"data-event\");\n } else if (target.parentElement) {\n target = target.parentElement;\n } else {\n target = null;\n }\n }\n\n if (eventName) {\n dispatchAnalyticsEvent(clickEvent({ name: eventName }));\n }\n }\n };\n\n window.addEventListener(\"click\", listener);\n\n return () => window.removeEventListener(\"click\", listener);\n }, []);\n\n return (\n <AnalyticsContext.Provider\n value={{ trackPageView, trackCustomEvent: dispatchAnalyticsEvent }}\n >\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 { 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","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-v2.png\",\n },\n [CDKType.cdk8s]: {\n name: CDKTYPE_NAME_MAP[CDKType.cdk8s],\n imgsrc: \"/assets/cdk8s-icon-v2.png\",\n },\n [CDKType.cdktf]: {\n name: CDKTYPE_NAME_MAP[CDKType.cdktf],\n imgsrc: \"/assets/cdktf-icon.png\",\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","import { ExternalLinkIcon } from \"@chakra-ui/icons\";\nimport { forwardRef, Link, LinkProps } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"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 * Show a custom icon next to the link.\n */\n rightIcon?: ReactNode;\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 rightIcon,\n ...props\n },\n ref\n ) => {\n const withPrompt = useExternalLinkWarning();\n hasIcon = hasIcon || Boolean(rightIcon);\n const icon = hasIcon\n ? rightIcon ?? <ExternalLinkIcon mb={1} ml={0} />\n : null;\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 && icon}\n </Link>\n );\n }\n);\n\nExternalLink.displayName = \"ExternalLink\";\n","type TestIds<T extends Readonly<string[]>> = {\n [key in T[number]]: string;\n};\n\n/**\n * A helper to create scoped test ids across components which can be re-used\n * in e2e and unit tests.\n */\nexport const createTestIds = <T extends Readonly<string[]>>(\n scope: string,\n ids: T\n): TestIds<T> =>\n ids.reduce<Record<string, string>>((acc, curr) => {\n acc[curr] = `${scope}-${curr}`;\n return acc;\n }, {}) as TestIds<T>;\n","import 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 display: \"Community\",\n links: [\n {\n display: \"Slack\",\n url: \"https://join.slack.com/t/cdk-dev/shared_invite/zt-xtpfmrqt-6ormYTA0hLdpMSAtTkM_2A\",\n },\n ],\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://docs.aws.amazon.com/cdk/latest/guide/best-practices.html\",\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: [{ display: \"Community Hub\", url: \"https://cdk.dev\" }],\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 keywords,\n query,\n offset,\n languages,\n sort,\n tags,\n}: {\n cdkMajor?: string | number;\n query?: string;\n offset?: string | number;\n cdkType?: CDKType;\n keywords?: string[];\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.KEYWORDS]: keywords?.length ? keywords.join(\",\") : null,\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 { 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 IconButton,\n} from \"@chakra-ui/react\";\nimport {\n useContext,\n createContext,\n FunctionComponent,\n useEffect,\n useRef,\n ChangeEventHandler,\n FormEventHandler,\n} from \"react\";\nimport { useAnalytics } from \"../../contexts/Analytics\";\nimport { clickEvent, eventName } from \"../../contexts/Analytics/util\";\nimport { useCatalogSearch } from \"../../hooks/useCatalogSearch\";\nimport { useSearch } from \"../../hooks/useSearch\";\nimport { Form } from \"../Form\";\nimport testIds from \"./testIds\";\n\nexport interface SearchBarProps\n extends Omit<InputProps, \"onChange\" | \"value\" | \"onSubmit\"> {\n \"data-event\"?: string;\n defaultQuery?: string;\n hasButton?: boolean;\n value?: string;\n onChange?: ChangeEventHandler<HTMLInputElement>;\n onSubmit?: FormEventHandler<HTMLFormElement>;\n}\n\nconst SearchBarState = createContext<\n { dataEvent?: string; 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 \"data-event\": dataEvent,\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 = useSearch();\n const { trackCustomEvent } = useAnalytics();\n\n const roundedCatalogLength = Math.floor((catalog.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={{\n dataEvent,\n query: value ?? searchAPI.query,\n isOpen: disclosure.isOpen,\n }}\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 bg=\"white\"\n boxShadow={disclosure.isOpen ? \"base\" : \"none\"}\n data-testid={testIds.input}\n focusBorderColor=\"blue.500\"\n onChange={onChange ?? searchAPI.onQueryChange}\n onFocus={() => {\n disclosure.onOpen();\n\n if (dataEvent) {\n trackCustomEvent(\n clickEvent({ name: eventName(dataEvent, \"Input\") })\n );\n }\n }}\n placeholder={placeholder}\n pr={hasButton ? { base: \"none\", md: \"9rem\" } : undefined}\n ref={inputRef}\n value={value ?? searchAPI.query}\n {...inputProps}\n />\n\n {hasButton ? (\n <InputRightElement\n display={{ base: \"none\", md: \"initial\" }}\n w=\"auto\"\n >\n <Button\n borderLeftRadius=\"0\"\n colorScheme=\"blue\"\n data-event={\n dataEvent ? eventName(dataEvent, \"Submit Button\") : undefined\n }\n data-testid={testIds.searchButton}\n fontSize=\"0.875rem\"\n type=\"submit\"\n w=\"9rem\"\n >\n Find constructs\n </Button>\n </InputRightElement>\n ) : (\n <InputRightElement>\n <IconButton\n aria-label=\"Run search\"\n data-event={\n dataEvent ? eventName(dataEvent, \"Submit Icon\") : undefined\n }\n data-testid={testIds.searchIcon}\n icon={<SearchIcon />}\n type=\"submit\"\n variant=\"ghost\"\n ></IconButton>\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 { eventName } from \"../../contexts/Analytics/util\";\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 { dataEvent, isOpen } = useSearchBarState();\n\n return (\n <Box\n bg=\"gray.700\"\n data-event={dataEvent ? eventName(dataEvent, \"Overlay\") : undefined}\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 Box,\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 { eventName } from \"../../contexts/Analytics/util\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { useDebounce } from \"../../hooks/useDebounce\";\nimport { getPackagePath } from \"../../util/url\";\nimport { Card, CardProps } from \"../Card\";\nimport { CDKTypeBadge } 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 { dataEvent, 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\n return (\n <>\n {i > 0 && <Divider mx={4} w=\"auto\" />}\n <SearchItem\n data-event={\n dataEvent\n ? eventName(dataEvent, \"Suggestion\", pkg.name)\n : undefined\n }\n data-testid={testIds.suggestion}\n key={pkg.id}\n name={\n <Stack align=\"center\" direction=\"row\" spacing={4}>\n <Box w=\"5.5rem\">\n <CDKTypeBadge w=\"min-content\" {...constructFramework} />\n </Box>\n <Text>{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 { CatalogSearchFilters, ExtendedCatalogPackage } from \".\";\nimport { KEYWORD_IGNORE_LIST } from \"../../constants/keywords\";\nimport { Language } from \"../../constants/languages\";\nimport { CatalogPackage } from \"../package/packages\";\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 getStrSort = (isAscending: boolean): SortFunction => {\n return (p1, p2) => p1.name.localeCompare(p2.name) * (isAscending ? 1 : -1);\n};\n\nconst getDateSort =\n (isAscending: boolean): SortFunction =>\n (p1, p2) => {\n const d1 = new Date(p1.metadata.date).getTime();\n const d2 = new Date(p2.metadata.date).getTime();\n\n if (d1 === d2) {\n return getStrSort(true)(p1, p2);\n }\n\n if (isAscending) {\n return d2 < d1 ? 1 : -1;\n }\n\n return d1 < d2 ? 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 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<\n 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 getKeywordsFilter: FilterFunctionBuilder<\n CatalogSearchFilters[\"keywords\"]\n> = (keywords) => {\n if (!keywords?.length) return undefined;\n\n return (pkg) => {\n const set = new Set<string>();\n\n for (const kw of pkg.keywords ?? []) {\n set.add(kw.toLocaleLowerCase());\n }\n\n for (const tag of pkg.metadata?.packageTags ?? []) {\n const label = tag.keyword?.label;\n if (label) {\n set.add(label.toLocaleLowerCase());\n }\n }\n\n for (const query of keywords) {\n if (set.has(query.toLocaleLowerCase())) {\n return true;\n }\n }\n\n return false;\n };\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 keywords: getKeywordsFilter,\n languages: getLanguagesFilter,\n tags: getTagsFilter,\n};\n\n/**\n * Returns a set of all the keywords associated with a package. This includes\n * publisher-based keywords and keywords from package tags.\n *\n * The set contains a single entry for each keyword, and all keywords are lowercased.\n *\n * Filters out all keywords that are in the ignore list.\n *\n * @param pkg The package\n * @returns The set of keywords\n */\nexport const renderAllKeywords = (pkg: CatalogPackage) => {\n const allKeywords = new Set<string>();\n const publisherKeywords = pkg.keywords ?? [];\n const tagKeywords = (pkg.metadata?.packageTags ?? [])\n .filter((t) => t.keyword)\n .map((t) => t.keyword!.label);\n\n for (const kw of [...publisherKeywords, ...tagKeywords]) {\n if (KEYWORD_IGNORE_LIST.has(kw)) {\n continue;\n }\n\n allKeywords.add(kw.toLocaleLowerCase());\n }\n\n return Array.from(allKeywords);\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, renderAllKeywords, SORT_FUNCTIONS } from \"./util\";\n\nconst INDEX_FIELDS = {\n AUTHOR_EMAIL: {\n name: \"authorEmail\",\n boost: 1,\n },\n AUTHOR_NAME: {\n name: \"authorName\",\n boost: 3,\n },\n DESCRIPTION: {\n name: \"description\",\n boost: 2,\n },\n NAME: {\n name: \"name\",\n boost: 5,\n },\n PACKAGE_NAME: {\n name: \"packageName\",\n boost: 5,\n },\n SCOPE: {\n name: \"scope\",\n boost: 5,\n },\n TAG_NAMES: {\n name: \"tagNames\",\n boost: 2,\n },\n} as const;\n\nexport interface ExtendedCatalogPackage extends CatalogPackage {\n authorEmail?: string;\n authorName?: string;\n downloads: number;\n id: string;\n packageName?: string;\n tagNames: lunr.Token[];\n scope?: 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 * 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 keywords to filter by.\n */\n keywords?: string[];\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 keywords with a key representing the keyword, and a value representing the amount of occurences\n * the keyword has in the catalog.\n */\n public readonly keywords: Map<string, number>;\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 { author, name, version } = pkg;\n const id = [name, version].join(\"@\");\n const downloads = stats.packages[name]?.downloads?.npm ?? 0;\n let [scope, packageName] = name.split(\"/\");\n\n if (!packageName) {\n packageName = scope;\n }\n\n let authorName: string | undefined;\n let authorEmail: string | undefined;\n\n if (typeof author === \"string\") {\n authorName = author;\n } else {\n if (author?.name) {\n authorName = author.name;\n }\n\n if (author?.email) {\n authorEmail = author.email;\n }\n }\n\n const keywords = renderAllKeywords(pkg);\n\n map.set(id, {\n ...pkg,\n authorName,\n authorEmail,\n keywords,\n downloads,\n id,\n packageName,\n scope,\n tagNames: keywords.map(lunr.tokenizer).flat(),\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 this.keywords = this.detectKeywords();\n\n this.index = lunr(function () {\n this.tokenizer.separator = /[\\s\\-/@]+/;\n this.ref(\"id\");\n\n for (const key in INDEX_FIELDS) {\n const field = INDEX_FIELDS[key as keyof typeof INDEX_FIELDS];\n this.field(field.name, { boost: field.boost });\n }\n\n [...catalogMap.values()].forEach((pkg) => {\n const downloadBoost = Math.log(Math.max(pkg.downloads, 1));\n this.add(pkg, { boost: downloadBoost });\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?: CatalogSearchParams): CatalogSearchResults {\n const { query, filters, sort } = params ?? {};\n\n let results = query ? this.query(query) : new Map(this.map);\n\n // TODO: Investigate if we can leverage lunr for filtering\n if (filters) {\n results = this.filter(results, filters);\n }\n\n results = this.dedup(results);\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 let tokenizedQuery = lunr.tokenizer(query);\n\n if (tokenizedQuery.length > 1) {\n // A large number of libraries include the term cdk within the title - which will lead to an\n // inflated result count. TODO: determine if there are other terms to filter out\n tokenizedQuery = tokenizedQuery.filter(\n (token) => token.toString() !== \"cdk\"\n );\n }\n\n refs = this.index.query((q) => {\n q.term(tokenizedQuery, {});\n });\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 * Performs a Search against the catalog and returns an array of all packages matching the query.\n */\n public findByName(query: string): ExtendedCatalogPackage[] {\n const results = [...this.map.values()].filter((pkg) => pkg.name === query);\n const matches = new Array<ExtendedCatalogPackage>();\n for (const pkg of results.values()) {\n if (pkg.name === query) {\n matches.push(pkg);\n }\n }\n return matches;\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, keywords, 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.keywords(keywords),\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 * De-duplicates packages that appear multiple times, keeping the\n * most recently published one.\n */\n private dedup(results: CatalogSearchResults): CatalogSearchResults {\n const dedupedResults: Map<string, ExtendedCatalogPackage> = new Map();\n\n for (const [_key, pkg] of results) {\n const maybePkg = dedupedResults.get(pkg.name);\n\n if (\n !maybePkg ||\n new Date(maybePkg.metadata.date) < new Date(pkg.metadata.date)\n ) {\n dedupedResults.set(pkg.name, pkg);\n }\n }\n\n return dedupedResults;\n }\n\n /**\n * Creates a map of keywords with values representing the occurence of the keyword within the catalog.\n */\n private detectKeywords() {\n const results = [...this.map.values()].reduce(\n (keywords: Map<string, number>, pkg: ExtendedCatalogPackage) => {\n for (const keyword of renderAllKeywords(pkg)) {\n const entry = keywords.get(keyword);\n keywords.set(keyword, (entry ?? 0) + 1);\n }\n\n return keywords;\n },\n new Map<string, number>()\n );\n\n return results;\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 catalog = useCatalog();\n const stats = useStats();\n\n const searchAPI = useMemo(() => {\n if (catalog.data?.packages === undefined || catalog.isLoading) return;\n if (stats.data === undefined || stats.isLoading) return;\n\n const instance = new CatalogSearchAPI(catalog.data.packages, stats.data);\n return instance;\n }, [catalog.data, catalog.isLoading, stats.data, stats.isLoading]);\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 { 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 major: number;\n description: string;\n author: Author | string;\n keywords?: string[];\n metadata: Metadata;\n}\n\nexport interface Packages {\n packages: CatalogPackage[];\n}\n\nconst EMPTY_CATALOG = { packages: [] };\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 console.warn(\n \"Failed to fetch package catalog. Falling back to empty package list.\"\n );\n return EMPTY_CATALOG;\n }\n\n return response.json().catch((err) => {\n console.error(err);\n console.warn(\n \"Invalid package catalog response. Falling back to empty package list.\"\n );\n return EMPTY_CATALOG;\n });\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { useQuery, UseQueryResult } from \"react-query\";\nimport { fetchPackages, Packages } from \"../../api/package/packages\";\n\nexport type CatalogQuery = UseQueryResult<Packages, Error | undefined>;\n\nconst CatalogContext = createContext<CatalogQuery | undefined>(undefined);\n\nexport const useCatalog = () => useContext(CatalogContext)!;\n\nexport const CatalogProvider: FunctionComponent = ({ children }) => {\n const catalogQuery: CatalogQuery = useQuery(\"catalog\", fetchPackages, {\n initialData: {\n packages: [],\n },\n });\n\n return (\n <CatalogContext.Provider value={catalogQuery}>\n {children}\n </CatalogContext.Provider>\n );\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(response.statusText);\n console.warn(\"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.warn(\"Error in package stats response. Using empty stats.\");\n return defaultStats;\n });\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { useQuery, UseQueryResult } from \"react-query\";\nimport { fetchStats, PackageStats } from \"../../api/stats\";\n\nexport type StatsQuery = UseQueryResult<PackageStats, Error | undefined>;\n\nconst StatsContext = createContext<StatsQuery | undefined>(undefined);\n\nexport const useStats = () => useContext(StatsContext)!;\n\nexport const StatsProvider: FunctionComponent = ({ children }) => {\n const stats: StatsQuery = useQuery(\"stats\", fetchStats);\n\n return (\n <StatsContext.Provider value={stats}>{children}</StatsContext.Provider>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { useQuery, UseQueryResult } from \"react-query\";\nimport { useLocation } from \"react-router-dom\";\nimport { fetchConfig, Config } from \"../../api/config\";\n\nexport type ConfigQuery = UseQueryResult<Config>;\n\nconst ConfigContext = createContext<ConfigQuery | undefined>(undefined);\n\nexport const useConfig = () => useContext(ConfigContext)!;\n\nexport const ConfigProvider: FunctionComponent = ({ children }) => {\n const { search } = useLocation();\n const { data, ...config }: ConfigQuery = useQuery(\"config\", fetchConfig);\n\n const configData = { ...data };\n\n // allow overriding feature flags using query params the query param name is\n // `ff-<flagName>`, for example,\n // `https://constructs.dev?ff-generalAvailability`.\n const params = new URLSearchParams(search);\n configData.featureFlags = configData.featureFlags ?? {};\n\n for (const key of params.keys()) {\n if (key.startsWith(\"ff-\")) {\n const flagName = key.slice(3);\n (configData.featureFlags as Record<string, boolean>)[flagName] = true;\n }\n }\n\n return (\n <ConfigContext.Provider\n value={{ ...config, data: configData } as ConfigQuery}\n >\n {children}\n </ConfigContext.Provider>\n );\n};\n","import {\n ChangeEventHandler,\n FormEventHandler,\n useCallback,\n useMemo,\n useState,\n Dispatch,\n SetStateAction,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { 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 defaultKeywords?: UseCatalogSearchReturn[\"keywords\"];\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 list of user-defined keywords to filter by\n */\n keywords: string[];\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 * 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 * Keywords list state setter\n */\n setKeywords: Dispatch<SetStateAction<UseCatalogSearchReturn[\"keywords\"]>>;\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 [keywords, setKeywords] = useState<UseCatalogSearchReturn[\"keywords\"]>(\n options.defaultKeywords ?? []\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 keywords,\n languages,\n query,\n sort,\n tags,\n })\n );\n },\n [replace, push, cdkType, cdkMajor, keywords, languages, query, 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 keywords,\n languages,\n onQueryChange,\n onSearch,\n onSubmit,\n query,\n setCdkMajor,\n setCdkType,\n setKeywords,\n setLanguages,\n setTags,\n setQuery,\n setSort,\n sort,\n tags,\n }),\n [\n cdkMajor,\n cdkType,\n keywords,\n languages,\n onSearch,\n onSubmit,\n query,\n sort,\n tags,\n ]\n );\n};\n","import type { MouseEventHandler } from \"react\";\n\nexport interface ExternalLinkPromptOptions {\n href?: string;\n onClick?: MouseEventHandler<HTMLAnchorElement>;\n}\n\nexport type ExternalLinkPrompt = ({\n href,\n onClick,\n}: ExternalLinkPromptOptions) => typeof onClick;\n\nexport const PREFERS_WARN_ON_EXTERNAL_LINK_CLICK =\n \"prefersWarnOnExternalLinkClick\";\n","import { ExternalLinkIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Checkbox,\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalOverlay,\n Text,\n Tooltip,\n} from \"@chakra-ui/react\";\nimport {\n ChangeEventHandler,\n FunctionComponent,\n MouseEventHandler,\n useState,\n} from \"react\";\nimport { ExternalLink } from \"../../components/ExternalLink\";\nimport {\n ExternalLinkPromptOptions,\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n} from \"./constants\";\n\nexport interface ExternalLinkWarningModalProps\n extends ExternalLinkPromptOptions {\n isOpen: boolean;\n onClose: () => void;\n setShouldWarn: (shouldWarn: boolean) => void;\n}\n\nexport const ExternalLinkWarningModal: FunctionComponent<\n 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 { 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"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ !function(e){function t(t){for(var n,c,a=t[0],i=t[1],f=t[2],p=0,s=[];p<a.length;p++)c=a[p],Object.prototype.hasOwnProperty.call(o,c)&&o[c]&&s.push(o[c][0]),o[c]=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,a=1;a<r.length;a++){var i=r[a];0!==o[i]&&(n=!1)}n&&(u.splice(t--,1),e=c(c.s=r[0]))}return e}var n={},o={3:0},u=[];function c(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,c),r.l=!0,r.exports}c.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,a=document.createElement("script");a.charset="utf-8",a.timeout=120,c.nc&&a.setAttribute("nonce",c.nc),a.src=function(e){return c.p+"static/js/"+({}[e]||e)+"."+{0:"2e120b2f",1:"9cc19f93",4:"7cdaa0a7",6:"8944c773",7:"80720b8b",8:"e4b13e68",9:"cd98fda9",10:"dc8329c6",11:"ac7ee4e8",12:"7c6d5a9b",13:"154f7765",14:"cb53c7d1",15:"45c9624b",16:"185808b7"}[e]+".chunk.js"}(e);var i=new Error;u=function(t){a.onerror=a.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:a})}),12e4);a.onerror=a.onload=u,document.head.appendChild(a)}return Promise.all(t)},c.m=e,c.c=n,c.d=function(e,t,r){c.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},c.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.t=function(e,t){if(1&t&&(e=c(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(c.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)c.d(r,n,function(t){return e[t]}.bind(null,n));return r},c.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(t,"a",t),t},c.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},c.p="/",c.oe=function(e){throw console.error(e),e};var a=this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[],i=a.push.bind(a);a.push=t,a=a.slice();for(var f=0;f<a.length;f++)t(a[f]);var l=i;r()}([]);
2
+ //# sourceMappingURL=runtime-main.e4632d3a.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.99def073.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\":\"2e120b2f\",\"1\":\"9cc19f93\",\"4\":\"7cdaa0a7\",\"6\":\"18141b48\",\"7\":\"63bdaf91\",\"8\":\"faf3cfee\",\"9\":\"cd98fda9\",\"10\":\"dc8329c6\",\"11\":\"ac7ee4e8\",\"12\":\"7c6d5a9b\",\"13\":\"154f7765\",\"14\":\"cb53c7d1\",\"15\":\"45c9624b\",\"16\":\"185808b7\"}[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.e4632d3a.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\":\"2e120b2f\",\"1\":\"9cc19f93\",\"4\":\"7cdaa0a7\",\"6\":\"8944c773\",\"7\":\"80720b8b\",\"8\":\"e4b13e68\",\"9\":\"cd98fda9\",\"10\":\"dc8329c6\",\"11\":\"ac7ee4e8\",\"12\":\"7c6d5a9b\",\"13\":\"154f7765\",\"14\":\"cb53c7d1\",\"15\":\"45c9624b\",\"16\":\"185808b7\"}[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":""}