construct-hub 0.1.182 → 0.1.186

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. package/.jsii +2 -2
  2. package/lib/backend/orchestration/index.js +26 -3
  3. package/lib/backend/transliterator/transliterator.bundle/index.js +2 -2
  4. package/lib/construct-hub.js +1 -1
  5. package/lib/package-sources/code-artifact.js +1 -1
  6. package/lib/package-sources/npmjs.js +1 -1
  7. package/lib/spdx-license.js +1 -1
  8. package/package.json +6 -6
  9. package/website/asset-manifest.json +34 -15
  10. package/website/index.html +1 -1
  11. package/website/service-worker.js +1 -1
  12. package/website/service-worker.js.map +1 -1
  13. package/website/static/js/0.ff9d42f8.chunk.js +2 -0
  14. package/website/static/js/0.ff9d42f8.chunk.js.map +1 -0
  15. package/website/static/js/1.a7f029fd.chunk.js +2 -0
  16. package/website/static/js/1.a7f029fd.chunk.js.map +1 -0
  17. package/website/static/js/10.32615aa0.chunk.js +2 -0
  18. package/website/static/js/10.32615aa0.chunk.js.map +1 -0
  19. package/website/static/js/11.051d89fc.chunk.js +2 -0
  20. package/website/static/js/11.051d89fc.chunk.js.map +1 -0
  21. package/website/static/js/12.e96b82dd.chunk.js +3 -0
  22. package/website/static/js/{3.fcccb6af.chunk.js.LICENSE.txt → 12.e96b82dd.chunk.js.LICENSE.txt} +0 -0
  23. package/website/static/js/12.e96b82dd.chunk.js.map +1 -0
  24. package/website/static/js/13.fb054c47.chunk.js +2 -0
  25. package/website/static/js/{4.920a8651.chunk.js.map → 13.fb054c47.chunk.js.map} +1 -1
  26. package/website/static/js/4.7cd92fab.chunk.js +3 -0
  27. package/website/static/js/4.7cd92fab.chunk.js.LICENSE.txt +40 -0
  28. package/website/static/js/4.7cd92fab.chunk.js.map +1 -0
  29. package/website/static/js/5.0da0a8ef.chunk.js +3 -0
  30. package/website/static/js/{2.200df80d.chunk.js.LICENSE.txt → 5.0da0a8ef.chunk.js.LICENSE.txt} +0 -41
  31. package/website/static/js/5.0da0a8ef.chunk.js.map +1 -0
  32. package/website/static/js/6.c0e3f99c.chunk.js +2 -0
  33. package/website/static/js/6.c0e3f99c.chunk.js.map +1 -0
  34. package/website/static/js/7.11632168.chunk.js +2 -0
  35. package/website/static/js/7.11632168.chunk.js.map +1 -0
  36. package/website/static/js/8.8af79a83.chunk.js +2 -0
  37. package/website/static/js/8.8af79a83.chunk.js.map +1 -0
  38. package/website/static/js/9.2b21526e.chunk.js +2 -0
  39. package/website/static/js/9.2b21526e.chunk.js.map +1 -0
  40. package/website/static/js/main.f1390607.chunk.js +2 -0
  41. package/website/static/js/main.f1390607.chunk.js.map +1 -0
  42. package/website/static/js/runtime-main.82c3976d.js +2 -0
  43. package/website/static/js/runtime-main.82c3976d.js.map +1 -0
  44. package/website/static/js/2.200df80d.chunk.js +0 -3
  45. package/website/static/js/2.200df80d.chunk.js.map +0 -1
  46. package/website/static/js/3.fcccb6af.chunk.js +0 -3
  47. package/website/static/js/3.fcccb6af.chunk.js.map +0 -1
  48. package/website/static/js/4.920a8651.chunk.js +0 -2
  49. package/website/static/js/main.e4cce0ad.chunk.js +0 -2
  50. package/website/static/js/main.e4cce0ad.chunk.js.map +0 -1
  51. package/website/static/js/runtime-main.a7d2400e.js +0 -2
  52. package/website/static/js/runtime-main.a7d2400e.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["util/url.ts","contexts/Analytics/Analytics.tsx","contexts/Analytics/usePageView.ts","hooks/useLanguage/useLanguage.ts","components/Card/Card.tsx","hooks/useQueryParams/useQueryParams.ts","components/CatalogSearch/testIds.ts","components/CatalogSearch/CatalogSearchInputs.tsx","components/CatalogSearch/Dropdown.tsx","components/CatalogSearch/CatalogSearch.tsx","hooks/useCatalogResults/useCatalogResults.ts","hooks/useCatalogSearch/useCatalogSearch.ts","constants/url.ts","api/config/index.ts","contexts/Config/Config.tsx","hooks/useDebounce/useDebounce.ts","components/SearchItem/SearchItem.tsx","lib/shortbread/shortbread.ts","reportWebVitals.ts","components/DevPreviewBanner/DevPreviewBanner.tsx","lib/shortbread/getLocalStoreWriter.ts","contexts/Shortbread/Shortbread.tsx","components/Footer/constants.ts","components/Footer/testIds.ts","components/Footer/Footer.tsx","constants/links.ts","components/NavPopover/NavPopover.tsx","components/NavPopover/NavPopoverContent.tsx","components/NavPopover/NavPopoverTrigger.tsx","components/Header/testIds.ts","components/Header/Documentation.tsx","components/Header/Resources.tsx","components/Header/Title.tsx","components/Header/MobileNav.tsx","components/Header/NavButton.tsx","components/SearchModal/testIds.ts","components/SearchModal/SearchModal.tsx","components/Header/SearchButton.tsx","components/Header/Header.tsx","components/PageLoader/PageLoader.tsx","components/LazyRoute/LazyRoute.tsx","App.tsx","theme/components/Code.ts","theme/components/Tag.ts","theme/components/index.ts","theme/components/Divider.ts","theme/foundations/index.ts","theme/foundations/borders.ts","theme/foundations/colors.ts","theme/foundations/radius.ts","theme/foundations/sizes.ts","theme/foundations/shadows.ts","theme/index.ts","contexts/Theme.tsx","register-service-worker.ts","index.tsx","constants/languages.ts","icons/TSIcon.tsx","icons/PythonIcon.tsx","icons/JavaIcon.tsx","icons/GoIcon.tsx","icons/DotNetIcon.tsx","components/ExternalLink/ExternalLink.tsx","util/createTestIds.ts","components/NavLink/NavLink.tsx","api/package/packages.ts","contexts/Catalog/Catalog.tsx","hooks/useRequest/useRequest.ts","components/Form/Form.tsx","contexts/ExternalLinkWarning/constants.ts","contexts/ExternalLinkWarning/ExternalLinkWarningModal.tsx","contexts/ExternalLinkWarning/ExternalLinkWarning.tsx"],"names":["gitSSHRegex","RegExp","getRepoUrlAndHost","repoUrl","url","sshUrl","match","author","repo","hostname","URL","createURL","base","params","search","searchParams","URLSearchParams","Object","entries","filter","forEach","k","v","set","toString","createURLSearchParams","getSearchPath","query","offset","language","ROUTES","SEARCH","QUERY_PARAMS","SEARCH_QUERY","LANGUAGE","OFFSET","getPackagePath","name","version","submodule","PACKAGES","SUBMODULE","AnalyticsContext","createContext","trackPageView","AnalyticsProvider","children","pathname","useLocation","prevPath","useRef","useCallback","opts","current","window","AWSMA","ready","document","dispatchEvent","CustomEvent","TRIGGER_EVENT","detail","Provider","value","usePageView","useContext","options","useMemo","page","pageURL","location","href","replace","event","type","description","defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","has","getInitialLang","langFromParams","storedLang","localStorage","getItem","useLanguage","updateUrl","updateSaved","hash","useHistory","useQueryParams","get","useState","setLanguage","useEffect","update","val","setItem","Card","forwardRef","props","ref","bg","border","borderRadius","boxShadow","p","displayName","testIds","createTestIds","languageOptions","fromEntries","LANGUAGE_NAME_MAP","key","LanguageDropdown","placeholder","items","onSelect","selected","text","strategy","as","Button","borderColor","trigger","rightIcon","ChevronDown","color","variant","menu","item","onClick","map","CatalogSearchInputs","onQueryChange","onLanguageChange","input","onChange","languageItem","languageDropdownMenu","languageDropdown","languageDropdownValue","colorScheme","submit","CatalogSearch","onSubmit","Form","form","autoRows","gap","templateColumns","sm","md","width","useCatalogResults","limit","useCatalog","data","loading","error","results","packages","filtered","keys","languages","includes","length","itemStr","JSON","stringify","toLowerCase","queryStr","sort","p1","p2","d1","Date","metadata","date","d2","pageLimit","Math","floor","displayable","startIndex","stopIndex","slice","useCatalogSearch","defaultQuery","setQuery","defaultLanguage","push","e","preventDefault","target","onSearch","API_PATHS","PACKAGES_PREFIX","CATALOG_SUFFIX","ASSEMBLY_SUFFIX","METADATA_SUFFIX","CONFIG","FAQ","HOME","SITE_TERMS","defaultConfig","fetchConfig","a","fetch","response","ok","console","log","json","catch","err","ConfigContext","undefined","useConfig","ConfigProvider","useRequest","requestConfig","configResponse","useDebounce","debouncedValue","setDebouncedValue","delay","handler","setTimeout","clearTimeout","SearchItem","alignItems","display","fontSize","h","lineHeight","listStyleType","onKeyDown","px","role","sx","tabIndex","instance","onPerfEntry","STORAGE_KEY","DevPreviewBanner","useDisclosure","defaultIsOpen","parse","sessionStorage","onClose","isOpen","in","mt","mx","position","InfoOutline","left","top","w","textAlign","ExternalLink","hasWarning","textDecoration","icon","Close","right","size","getLocalStoreWriter","initialize","Promise","resolve","reject","addEventListener","domain","navigator","__storeWriter","AWSCShortbread","callIfDefined","method","Error","access","checkForCookieConsent","customizeCookies","getConsentCookie","hasConsent","shortbread","publicAPI","ShortbreadContext","ShortbreadProvider","isReady","setIsReady","isCancelled","then","FOOTER_LINKS","SERVICE_TERMS","testId","PRIVACY","isExternal","LEGAL","values","Footer","align","container","direction","justify","py","columnGap","columns","links","index","mr","orientation","NavLink","to","disclaimer","manageCookies","fontWeight","DOCUMENTATION","isNavLink","RESOURCES","NavPopover","menuProps","Link","justifyContent","NavPopoverContent","idx","title","link","linkIdx","NavPopoverTrigger","Documentation","gettingStartedTrigger","gettingStartedMenu","Resources","resourcesTrigger","resourcesMenu","Title","MobileNav","placement","mobileNav","spacing","NavButton","nav","navOpen","Hamburger","onOpen","SearchModal","currentLanguage","onSearchSubmit","searchAPI","showResults","inputRef","initialFocusRef","pb","my","pkg","SearchButton","searchModal","some","path","searchButton","m","maxW","Search","ml","searchIcon","HeaderItem","rowStart","Header","gridTemplateColumns","gridTemplateRows","zIndex","colStart","justifySelf","placeItems","PageLoader","LazyRoute","Component","component","routeProps","fallback","lazy","Home","NotFound","Packages","SearchResults","SiteTerms","App","inset","overflow","exact","theme","components","Code","variants","subtle","whiteSpace","createVariant","overrides","varBase","Tag","baseStyle","background","official","Divider","defaultProps","foundations","borders","colors","blue","bgPrimary","radii","card","sizes","shadows","extendTheme","Theme","resetCSS","isLocalhost","Boolean","registerValidSW","swUrl","config","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","onUpdate","onSuccess","ReactDOM","render","StrictMode","Config","Analytics","ExternalLinkWarning","Catalog","getElementById","Function","getCLS","getFID","getFCP","getLCP","getTTFB","process","origin","headers","contentType","status","indexOf","unregister","reload","checkValidServiceWorker","LANGUAGES","Python","Java","Go","DotNet","Set","LANGUAGE_RENDER_MAP","typescript","transform","viewBox","d","fill","python","id","stopColor","gradientUnits","x1","x2","xlinkHref","y1","y2","style","marker","java","golang","dotnet","hasIcon","noFollow","withPrompt","useExternalLinkWarning","rel","mb","scope","ids","reduce","acc","curr","RouterLink","fetchPackages","statusText","CatalogContext","CatalogProvider","requestPackages","catalogResponse","requestFn","initialValue","onError","setLoading","setData","setError","mountedRef","statefulFetch","res","PREFERS_WARN_ON_EXTERNAL_LINK_CLICK","ExternalLinkWarningModal","setShouldWarn","finalShouldWarn","setFinalShouldWarn","closeOnOverlayClick","shouldWarn","checked","hasArrow","label","ExternalLinkWarningContext","ExternalLinkWarningProvider","modalOption","setModalOptions","saved"],"mappings":"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","file":"static/js/main.f1390607.chunk.js","sourcesContent":["import { 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 query,\n offset,\n language,\n}: {\n query?: string;\n offset?: string | number;\n language?: Language | null;\n}) =>\n createURL(ROUTES.SEARCH, {\n [QUERY_PARAMS.SEARCH_QUERY]: query,\n [QUERY_PARAMS.LANGUAGE]: language,\n [QUERY_PARAMS.OFFSET]: offset ?? 0,\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 {\n useContext,\n useCallback,\n useRef,\n createContext,\n FunctionComponent,\n} from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { PageViewConfig } from \"./types\";\n\nexport interface AnalyticsAPI {\n trackPageView: (opts: PageViewConfig) => void;\n}\n\nconst AnalyticsContext = createContext<AnalyticsAPI>({\n trackPageView: () => {},\n});\n\nexport const useAnalytics = () => useContext(AnalyticsContext);\n\nexport const AnalyticsProvider: FunctionComponent = ({ children }) => {\n const { pathname } = useLocation();\n\n const prevPath = useRef<null | string>(null);\n\n const trackPageView = useCallback(\n (opts: PageViewConfig) => {\n if (prevPath.current === pathname) {\n return;\n }\n\n window?.AWSMA?.ready?.(() => {\n document.dispatchEvent(\n new CustomEvent(window.AWSMA.TRIGGER_EVENT, { detail: opts })\n );\n\n prevPath.current = pathname;\n });\n },\n [pathname]\n );\n\n return (\n <AnalyticsContext.Provider value={{ trackPageView }}>\n {children}\n </AnalyticsContext.Provider>\n );\n};\n","import { useCallback, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { useAnalytics } from \"./Analytics\";\nimport type { PageViewOptions, PageViewConfig } from \"./types\";\n\nexport const usePageView = (opts: PageViewOptions) => {\n const { trackPageView } = useAnalytics();\n const { pathname } = useLocation();\n\n const options: PageViewConfig = useMemo(\n () => ({\n page: {\n // This is silly but the analytics library crashes in dev if using localhost as the pageURL :/\n pageURL: window.location.href.replace(\n \"://localhost:3000\",\n \"://constructs.local.dev\"\n ),\n ...opts.page,\n },\n event: {\n type: \"pageview\",\n name: opts.event.name,\n description: opts.event.description,\n },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pathname, opts]\n );\n\n const track = useCallback(() => {\n return trackPageView(options);\n }, [trackPageView, options]);\n\n return track;\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","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 { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"catalogSearch\", [\n \"form\",\n \"input\",\n \"languageDropdown\",\n \"languageDropdownMenu\",\n \"languageDropdownValue\",\n \"languageItem\",\n \"submit\",\n] as const);\n\nexport default testIds;\n","import { Button, forwardRef, Input } from \"@chakra-ui/react\";\nimport type { ChangeEventHandler, FunctionComponent } from \"react\";\nimport {\n Language,\n TEMP_SUPPORTED_LANGUAGES,\n LANGUAGE_NAME_MAP,\n} from \"../../constants/languages\";\nimport { Dropdown, DropdownProps } from \"./Dropdown\";\nimport testIds from \"./testIds\";\n\ntype LanguageItems = Partial<Record<Language, string>>;\n\nconst languageOptions = Object.fromEntries(\n Object.entries(LANGUAGE_NAME_MAP).filter(([key]) =>\n TEMP_SUPPORTED_LANGUAGES.has(key as Language)\n )\n) as LanguageItems;\n\nconst LanguageDropdown: FunctionComponent<DropdownProps<LanguageItems>> =\n Dropdown;\n\nexport interface CatalogSearchInputsProps {\n /**\n * Controls the query state value\n */\n query: string;\n /**\n * Controls the query state change event\n */\n onQueryChange: ChangeEventHandler<HTMLInputElement>;\n /**\n * Controls the language state value\n */\n language: Language | null;\n /**\n * Controls the language state change event\n */\n onLanguageChange: (language: Language | null) => void;\n}\n\nexport const CatalogSearchInputs = forwardRef<\n CatalogSearchInputsProps,\n \"input\"\n>(({ query, onQueryChange, language, onLanguageChange }, ref) => (\n <>\n <Input\n bg=\"white\"\n borderColor=\"blue.100\"\n boxShadow=\"base\"\n data-testid={testIds.input}\n name=\"query\"\n onChange={onQueryChange}\n placeholder=\"Search Constructs...\"\n ref={ref}\n value={query}\n />\n <LanguageDropdown\n items={languageOptions}\n onSelect={onLanguageChange}\n placeholder=\"Language...\"\n selected={language}\n testIds={{\n item: testIds.languageItem,\n menu: testIds.languageDropdownMenu,\n trigger: testIds.languageDropdown,\n value: testIds.languageDropdownValue,\n }}\n />\n <Button\n boxShadow=\"base\"\n colorScheme=\"blue\"\n data-testid={testIds.submit}\n type=\"submit\"\n >\n Search\n </Button>\n </>\n));\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Menu,\n MenuButton,\n MenuItem,\n MenuList,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface DropdownProps<T = Record<string, string>> {\n testIds: {\n item: string;\n menu: string;\n trigger: string;\n value: string;\n };\n placeholder: string;\n selected: T[keyof T] | null;\n onSelect: (val: keyof T | null) => void;\n items: T;\n}\n\nexport const Dropdown: FunctionComponent<DropdownProps> = ({\n placeholder,\n items,\n onSelect,\n selected,\n testIds,\n}) => {\n const text = selected ? items[selected] : placeholder;\n const options = Object.entries(items);\n\n return (\n <Menu strategy=\"fixed\">\n <MenuButton\n as={Button}\n bg=\"white\"\n borderColor=\"blue.100\"\n boxShadow=\"base\"\n data-testid={testIds.trigger}\n rightIcon={<ChevronDownIcon color=\"blue.500\" />}\n variant=\"outline\"\n >\n <Text data-testid={testIds.value}>{text}</Text>\n </MenuButton>\n <MenuList data-testid={testIds.menu}>\n <MenuItem data-testid={testIds.item} onClick={() => onSelect(null)}>\n Any\n </MenuItem>\n {options.map(([name, displayName]) => (\n <MenuItem\n data-testid={testIds.item}\n key={name}\n onClick={() => onSelect(name)}\n >\n {displayName}\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n );\n};\n","import { Grid } from \"@chakra-ui/react\";\nimport type { FormEventHandler, FunctionComponent } from \"react\";\nimport { Form } from \"../Form\";\nimport {\n CatalogSearchInputs,\n CatalogSearchInputsProps,\n} from \"./CatalogSearchInputs\";\nimport testIds from \"./testIds\";\n\nexport interface CatalogSearchProps extends CatalogSearchInputsProps {\n /**\n * Called when the catalog search form is submitted (via enter keypress or submit click)\n */\n onSubmit: FormEventHandler<HTMLFormElement>;\n}\n\nexport const CatalogSearch: FunctionComponent<CatalogSearchProps> = ({\n onSubmit,\n ...props\n}) => {\n return (\n <Form data-testid={testIds.form} onSubmit={onSubmit}>\n <Grid\n autoRows=\"1fr\"\n gap={4}\n templateColumns={{ sm: \"1fr\", md: \"3fr 1fr 1fr\" }}\n width=\"full\"\n >\n <CatalogSearchInputs {...props} />\n </Grid>\n </Form>\n );\n};\n","import { useMemo } from \"react\";\nimport { Language } from \"../../constants/languages\";\nimport { useCatalog } from \"../../contexts/Catalog\";\n\nexport interface UseCatalogResultsOptions {\n limit: number;\n offset?: number;\n query?: string;\n language?: Language | null;\n}\n\n/**\n * A hook which encapsulates logic around applying search filters\n * and determining displayable results\n */\nexport const useCatalogResults = ({\n limit,\n offset = 0,\n query = \"\",\n language = null,\n}: UseCatalogResultsOptions) => {\n const { data, loading, error } = useCatalog();\n\n const results = useMemo(() => {\n if (loading || error || !data?.packages) return [];\n\n const filtered = data.packages.filter((item) => {\n // Filter out items which do not support the current language\n if (language && language !== Language.TypeScript) {\n if (!Object.keys(item.languages).includes(language)) {\n return false;\n }\n }\n\n // Filter items which do not match the current query\n if (query.length) {\n const itemStr = JSON.stringify(item).toLowerCase();\n const queryStr = query.toLowerCase();\n\n if (!itemStr.includes(queryStr)) {\n return false;\n }\n }\n\n return true;\n });\n\n // Next sort by most recently updated. (The sort should eventually become a parameter)\n return [...filtered].sort((p1, p2) => {\n const d1 = new Date(p1.metadata.date);\n const d2 = new Date(p2.metadata.date);\n if (d1 === d2) {\n return 0;\n }\n return d1 < d2 ? 1 : -1;\n });\n }, [data?.packages, error, language, loading, query]);\n\n const pageLimit = results ? Math.floor(results.length / limit) : 0;\n\n const displayable = useMemo(() => {\n const startIndex = (offset > pageLimit ? pageLimit : offset) * limit;\n const stopIndex = startIndex + limit;\n\n return results.slice(startIndex, stopIndex);\n }, [limit, offset, pageLimit, results]);\n\n return useMemo(\n () => ({ loading, results, error, displayable, pageLimit }),\n [displayable, error, loading, pageLimit, results]\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 { Language } from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\n\nexport interface UseCatalogSearchParams {\n defaultQuery?: string;\n defaultLanguage?: Language | null;\n}\n\nexport interface UseCatalogSearchReturn {\n /**\n * The language state for this search\n */\n language: Language | null;\n /**\n * Updates language state\n */\n onLanguageChange: (lang: Language | null) => void;\n /**\n * Input ChangeEventHandler which wraps the setQuery state setter\n */\n onQueryChange: ChangeEventHandler<HTMLInputElement>;\n /**\n * Navigates to the search query url\n */\n onSearch: () => 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 * Language state setter\n */\n setLanguage: Dispatch<SetStateAction<Language | null>>;\n /**\n * Query state setter\n */\n setQuery: Dispatch<SetStateAction<string>>;\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 [language, setLanguage] = useState<Language | null>(\n options.defaultLanguage ?? null\n );\n\n const { push } = useHistory();\n\n const onQueryChange: UseCatalogSearchReturn[\"onQueryChange\"] = (e) => {\n e.preventDefault();\n setQuery(e.target.value);\n };\n\n const onSearch = useCallback(() => {\n push(getSearchPath({ language, query }));\n }, [language, push, query]);\n\n const onSubmit: UseCatalogSearchReturn[\"onSubmit\"] = useCallback(\n (e) => {\n e?.preventDefault();\n onSearch();\n },\n [onSearch]\n );\n\n return useMemo(\n () => ({\n language,\n onLanguageChange: setLanguage,\n onQueryChange,\n onSearch,\n onSubmit,\n query,\n setLanguage,\n setQuery,\n }),\n [language, onSearch, onSubmit, query]\n );\n};\n","export const API_PATHS = {\n PACKAGES_PREFIX: \"/data\",\n CATALOG_SUFFIX: \"/catalog.json\",\n ASSEMBLY_SUFFIX: \"/assembly.json\",\n METADATA_SUFFIX: \"/metadata.json\",\n CONFIG: \"/config.json\",\n} as const;\n\nexport const QUERY_PARAMS = {\n LANGUAGE: \"lang\",\n OFFSET: \"offset\",\n SEARCH_QUERY: \"q\",\n SUBMODULE: \"submodule\",\n} as const;\n\nexport const ROUTES = {\n FAQ: \"/faq\",\n HOME: \"/\",\n PACKAGES: \"/packages\",\n SEARCH: \"/search\",\n SITE_TERMS: \"/terms\",\n};\n\ntype QueryParams = typeof QUERY_PARAMS;\n\nexport type QueryParamKey = QueryParams[keyof QueryParams];\n","import { API_PATHS } from \"../../constants/url\";\n\nexport interface PackageLinksConfig {\n name: string;\n value: string;\n displayText?: string;\n}\n\nexport interface Config {\n packageLinks?: PackageLinksConfig[];\n}\n\nconst defaultConfig: Config = {};\n\nexport const fetchConfig = async (): Promise<Config> => {\n const response = await fetch(API_PATHS.CONFIG);\n\n if (!response.ok) {\n console.log(\"Failed to fetch application config, using default values\");\n return defaultConfig;\n }\n\n return response.json().catch((err) => {\n console.error(err);\n console.log(\"Invalid config response, using default values\");\n return defaultConfig;\n });\n};\n","import { createContext, FunctionComponent, useContext, useEffect } from \"react\";\nimport { fetchConfig, Config } from \"../../api/config\";\nimport { useRequest, UseRequestResponse } from \"../../hooks/useRequest\";\n\nconst ConfigContext = createContext<UseRequestResponse<Config>>({\n loading: false,\n data: undefined,\n error: undefined,\n});\n\nexport const useConfig = () => useContext(ConfigContext);\n\nexport const ConfigProvider: FunctionComponent = ({ children }) => {\n const [requestConfig, configResponse] = useRequest(fetchConfig);\n\n useEffect(() => {\n void requestConfig();\n }, [requestConfig]);\n\n return (\n <ConfigContext.Provider value={configResponse}>\n {children}\n </ConfigContext.Provider>\n );\n};\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 } from \"react\";\n\nexport interface SearchItemProps extends HTMLChakraProps<\"li\"> {\n name: string;\n onClick: () => void;\n}\n\nexport const SearchItem = forwardRef<SearchItemProps, \"li\">(\n ({ name, onClick, ...props }, ref) => {\n const onKeyDown: KeyboardEventHandler<HTMLLIElement> = (e) => {\n if (e.key === \"Enter\") {\n onClick();\n }\n };\n\n return (\n <ListItem\n alignItems=\"center\"\n display=\"flex\"\n fontSize=\"lg\"\n h={12}\n lineHeight=\"base\"\n listStyleType=\"none\"\n onClick={onClick}\n onKeyDown={onKeyDown}\n px={4}\n ref={ref}\n role=\"option\"\n sx={{ \":hover, :focus\": { bg: \"gray.100\" } }}\n tabIndex={0}\n {...props}\n >\n {name}\n </ListItem>\n );\n }\n);\n\nSearchItem.displayName = \"SearchItem\";\n","import { getLocalStoreWriter } from \"./getLocalStoreWriter\";\n\nexport interface ShortbreadOptions {\n domain?: string;\n parent?: HTMLElement;\n language?: Navigator[\"language\"];\n __storeWriter?: (cookie: Document[\"cookie\"]) => void;\n}\n\nexport interface Shortbread {\n /**\n * Call this function to be notified when you cookie category is allowed\n */\n access: (\n name: \"essential\" | \"performance\" | \"functional\" | \"advertising\",\n onAllowed: () => void\n ) => void;\n /**\n * Call to ask the user the type of cookies they'd like to receive\n */\n checkForCookieConsent: () => void;\n /**\n * Open the Customize Cookie Dialog\n */\n customizeCookies: () => void;\n /**\n * Returns the consent cookie or undefined if not yet set\n */\n getConsentCookie: () => Document[\"cookie\"] | undefined;\n /**\n * Call this to ask if the cookie has been set\n */\n hasConsent: (cookieName: string) => boolean;\n}\n\n// We only want to manage a single instance at a time\nlet instance: Shortbread | undefined;\n\n/**\n * Call to initialize the shortbread instance. Must be called before all other methods\n */\nexport const initialize = async () => {\n return new Promise<void>((resolve, reject) => {\n // Wait until page has loaded first\n window.addEventListener(\"load\", async () => {\n try {\n const options: ShortbreadOptions = {\n domain: window.location.hostname,\n language: navigator.language,\n __storeWriter: getLocalStoreWriter(),\n };\n\n // Import the shortbread source\n const { AWSCShortbread } = await import(\"./source\");\n instance = AWSCShortbread(options);\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n });\n};\n\n// Shortbread wrappers\n\nconst callIfDefined =\n <T extends keyof Shortbread>(method: T) =>\n (...args: Parameters<Shortbread[T]>): ReturnType<Shortbread[T]> => {\n if (!instance) {\n throw new Error(\"shortbread has not been initialized\");\n }\n\n // Annotations are correct for consumers\n return (instance[method] as any)(...args);\n };\n\n/**\n * Call this function to be notified when you cookie category is allowed\n */\nexport const access = callIfDefined(\"access\");\n/**\n * Call to ask the user the type of cookies they'd like to receive\n */\nexport const checkForCookieConsent = callIfDefined(\"checkForCookieConsent\");\n/**\n * Open the Customize Cookie Dialog\n */\nexport const customizeCookies = callIfDefined(\"customizeCookies\");\n/**\n * Returns the consent cookie or undefined if not yet set\n */\nexport const getConsentCookie = callIfDefined(\"getConsentCookie\");\n/**\n * Call this to ask if the cookie has been set\n */\nexport const hasConsent = callIfDefined(\"hasConsent\");\n","import { ReportHandler } from \"web-vitals\";\n\nexport const reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import(\"web-vitals\").then(\n ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n },\n () => {}\n );\n }\n};\n","import { CloseIcon, InfoOutlineIcon } from \"@chakra-ui/icons\";\nimport {\n Box,\n IconButton,\n Collapse,\n Text,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Card } from \"../Card\";\nimport { ExternalLink } from \"../ExternalLink\";\n\nconst STORAGE_KEY = \"showing-dev-preview-banner\";\n\nexport const DevPreviewBanner: FunctionComponent = () => {\n const { isOpen, onClose } = useDisclosure({\n defaultIsOpen: JSON.parse(\n window.sessionStorage.getItem(STORAGE_KEY) ?? \"true\"\n ),\n onClose: () => window.sessionStorage.setItem(STORAGE_KEY, \"false\"),\n });\n\n return (\n <Box h=\"max-content\">\n <Collapse in={isOpen}>\n <Card\n aria-label=\"Preview Banner\"\n bg=\"blue.500\"\n border=\"none\"\n boxShadow=\"none\"\n color=\"white\"\n mt={4}\n mx={4}\n p={4}\n position=\"relative\"\n role=\"alertdialog\"\n >\n <InfoOutlineIcon h={5} left={4} position=\"absolute\" top={4} w={5} />\n <Text fontSize=\"md\" mx={8} textAlign=\"center\">\n This application is in Dev Preview. Some features may change. If you\n find any issues, please report them{\" \"}\n <ExternalLink\n color=\"inherit\"\n hasWarning={false}\n href=\"https://github.com/cdklabs/construct-hub-webapp/issues\"\n textDecoration=\"underline\"\n >\n here\n </ExternalLink>\n </Text>\n <IconButton\n aria-label=\"Dismiss banner\"\n colorScheme=\"white\"\n icon={<CloseIcon />}\n onClick={onClose}\n position=\"absolute\"\n right={4}\n size=\"xs\"\n top={3}\n variant=\"ghost\"\n />\n </Card>\n </Collapse>\n </Box>\n );\n};\n","import 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: \"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 type { IMenuItems } from \"../components/NavPopover\";\n\nexport const DOCUMENTATION: IMenuItems = [\n { display: \"FAQ\", isNavLink: true, url: \"/faq\" },\n {\n display: \"Construct Hub on GitHub\",\n url: \"https://github.com/cdklabs/construct-hub\",\n },\n {\n display: \"Issues on GitHub\",\n url: \"https://github.com/cdklabs/construct-hub/issues\",\n },\n];\n\nexport const RESOURCES: IMenuItems = [\n {\n display: \"AWS CDK\",\n links: [\n { display: \"Home\", url: \"https://aws.amazon.com/cdk/\" },\n {\n display: \"Getting Started\",\n url: \"https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html\",\n },\n { display: \"Workshop\", url: \"https://cdkworkshop.com/\" },\n {\n display: \"Best Practices\",\n url: \"https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk\",\n },\n ],\n },\n {\n display: \"CDK for Terraform\",\n links: [\n {\n display: \"Getting Started\",\n url: \"https://learn.hashicorp.com/tutorials/terraform/cdktf\",\n },\n {\n display: \"Tutorials\",\n url: \"https://learn.hashicorp.com/collections/terraform/cdktf\",\n },\n ],\n },\n {\n display: \"CDK for Kubernetes\",\n links: [\n { display: \"Home\", url: \"https://cdk8s.io\" },\n {\n display: \"Getting Started\",\n url: \"https://cdk8s.io/docs/latest/getting-started\",\n },\n { display: \"Documentation\", url: \"https://cdk8s.io/docs/latest\" },\n {\n display: \"API Reference\",\n url: \"https://cdk8s.io/docs/latest/reference/index.html\",\n },\n ],\n },\n {\n display: \"Community\",\n links: [\n {\n display: \"Slack\",\n url: \"https://join.slack.com/t/cdk-dev/shared_invite/zt-mso6p56d-qJp7SOTBvMaQuDrx7R2wHg\",\n },\n { display: \"Community Hub\", url: \"https://cdk.dev\" },\n ],\n },\n];\n","import { Menu, MenuProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface NavPopoverProps extends MenuProps {}\n\nexport const NavPopover: FunctionComponent<NavPopoverProps> = ({\n children,\n ...menuProps\n}) => {\n return (\n <Menu colorScheme=\"blue.800\" strategy=\"fixed\" {...menuProps}>\n {children}\n </Menu>\n );\n};\n","import {\n forwardRef,\n MenuDivider,\n MenuGroup,\n MenuItem,\n MenuList,\n MenuListProps,\n} from \"@chakra-ui/react\";\nimport { Fragment, FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../ExternalLink\";\nimport { NavLink } from \"../NavLink\";\nimport type { IMenuItems, ILink } from \"./types\";\n\nexport interface NavPopoverContentProps extends MenuListProps {\n items: IMenuItems;\n}\n\nconst Link: FunctionComponent<ILink> = ({ display, isNavLink, url }) =>\n isNavLink ? (\n <NavLink color=\"blue.500\" to={url}>\n {display}\n </NavLink>\n ) : (\n <ExternalLink\n alignItems=\"center\"\n display=\"flex\"\n hasWarning={false}\n href={url}\n justifyContent=\"space-between\"\n w=\"100%\"\n >\n {display}\n </ExternalLink>\n );\n\nexport const NavPopoverContent = forwardRef<NavPopoverContentProps, \"div\">(\n ({ items, ...menuProps }, ref) => {\n return (\n <MenuList {...menuProps} ref={ref}>\n {items.map((item, idx) => {\n if (\"links\" in item) {\n return (\n <Fragment key={`${item.display}-${idx}`}>\n <MenuGroup align=\"left\" title={item.display}>\n {item.links.map((link, linkIdx) => (\n <MenuItem key={`${link.display}-${linkIdx}`}>\n <Link {...link} />\n </MenuItem>\n ))}\n </MenuGroup>\n {idx !== items.length - 1 && <MenuDivider />}\n </Fragment>\n );\n }\n\n return (\n <MenuItem key={`${item.display}-${idx}`}>\n <Link {...item} />\n </MenuItem>\n );\n })}\n </MenuList>\n );\n }\n);\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n MenuButton,\n MenuButtonProps,\n forwardRef,\n} from \"@chakra-ui/react\";\n\nexport const NavPopoverTrigger = forwardRef<MenuButtonProps, \"button\">(\n ({ children, ...props }, ref) => {\n return (\n <MenuButton\n as={Button}\n color=\"blue.800\"\n fontWeight=\"500\"\n ref={ref}\n rightIcon={<ChevronDownIcon h={6} w={6} />}\n size=\"md\"\n variant=\"link\"\n {...props}\n >\n {children}\n </MenuButton>\n );\n }\n);\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"header\", [\n \"container\",\n \"title\",\n \"gettingStartedTrigger\",\n \"gettingStartedMenu\",\n \"resourcesTrigger\",\n \"resourcesMenu\",\n \"navOpen\",\n \"navClose\",\n \"searchButton\",\n \"searchIcon\",\n \"mobileNav\",\n] as const);\n\nexport default testIds;\n","import type { FunctionComponent } from \"react\";\nimport { DOCUMENTATION } from \"../../constants/links\";\nimport {\n NavPopover,\n NavPopoverContent,\n NavPopoverTrigger,\n} from \"../NavPopover\";\nimport testIds from \"./testIds\";\n\nexport const Documentation: FunctionComponent = () => (\n <NavPopover>\n <NavPopoverTrigger data-testid={testIds.gettingStartedTrigger}>\n Getting Started\n </NavPopoverTrigger>\n <NavPopoverContent\n data-testid={testIds.gettingStartedMenu}\n items={DOCUMENTATION}\n />\n </NavPopover>\n);\n","import type { FunctionComponent } from \"react\";\nimport { RESOURCES } from \"../../constants/links\";\nimport {\n NavPopover,\n NavPopoverContent,\n NavPopoverTrigger,\n} from \"../NavPopover\";\nimport testIds from \"./testIds\";\n\nexport const Resources: FunctionComponent = () => {\n return (\n <NavPopover>\n <NavPopoverTrigger data-testid={testIds.resourcesTrigger}>\n Resources\n </NavPopoverTrigger>\n <NavPopoverContent\n data-testid={testIds.resourcesMenu}\n items={RESOURCES}\n />\n </NavPopover>\n );\n};\n","import { Box, Heading } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport testIds from \"./testIds\";\n\nexport const Title: FunctionComponent = () => (\n <Heading as=\"h1\" color=\"blue.800\" data-testid={testIds.title} size=\"lg\">\n <Link to=\"/\">\n <Box as=\"span\" color=\"blue.500\">\n Construct\n </Box>{\" \"}\n Hub\n </Link>\n </Heading>\n);\n","import {\n Drawer,\n DrawerBody,\n DrawerOverlay,\n DrawerHeader,\n DrawerContent,\n DrawerCloseButton,\n Portal,\n Stack,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Documentation } from \"./Documentation\";\nimport { Resources } from \"./Resources\";\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 <DrawerContent data-testid={testIds.mobileNav}>\n <DrawerCloseButton />\n <DrawerHeader display=\"flex\" justifyContent=\"center\">\n <Title />\n </DrawerHeader>\n <DrawerBody>\n <Stack align=\"start\" justify=\"start\" spacing={4}>\n <Documentation />\n <Resources />\n </Stack>\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </Portal>\n );\n};\n","import { HamburgerIcon } from \"@chakra-ui/icons\";\nimport { IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { MobileNav } from \"./MobileNav\";\nimport testIds from \"./testIds\";\n\nexport const NavButton: FunctionComponent = () => {\n const nav = useDisclosure();\n\n return (\n <>\n <IconButton\n aria-label=\"Navigation Menu\"\n borderRadius=\"md\"\n data-testid={testIds.navOpen}\n display={{ md: \"none\" }}\n icon={<HamburgerIcon />}\n onClick={nav.onOpen}\n variant=\"ghost\"\n />\n <MobileNav {...nav} />\n </>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"searchModal\", [\"container\"] as const);\n\nexport default testIds;\n","import {\n Divider,\n Heading,\n Modal,\n ModalBody,\n ModalCloseButton,\n ModalContent,\n ModalHeader,\n ModalOverlay,\n Portal,\n Stack,\n UnorderedList,\n} from \"@chakra-ui/react\";\nimport { FormEventHandler, FunctionComponent, useRef } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { QUERY_PARAMS, ROUTES } from \"../../constants/url\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { useCatalogSearch } from \"../../hooks/useCatalogSearch\";\nimport { useDebounce } from \"../../hooks/useDebounce\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { CatalogSearchInputs } from \"../CatalogSearch\";\nimport { Form } from \"../Form\";\nimport { SearchItem } from \"../SearchItem\";\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 { push } = useHistory();\n const [currentLanguage] = useLanguage();\n const { onSubmit: onSearchSubmit, ...searchAPI } = useCatalogSearch();\n const { query, language } = useDebounce({\n query: searchAPI.query,\n language: searchAPI.language,\n });\n\n const { displayable } = useCatalogResults({\n limit: 5,\n offset: 0,\n query,\n language,\n });\n\n const showResults = (query || language) && displayable.length > 0;\n const inputRef = useRef<HTMLInputElement>(null);\n\n const navigate = (to: string) => {\n onClose();\n push(to);\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n onClose();\n onSearchSubmit(e);\n };\n\n return (\n <Portal>\n <Modal initialFocusRef={inputRef} isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent data-testid={testIds.container}>\n <ModalCloseButton />\n <ModalHeader>Search modules or providers</ModalHeader>\n <ModalBody>\n <Form onSubmit={onSubmit} pb={4}>\n <Stack spacing={4}>\n <CatalogSearchInputs ref={inputRef} {...searchAPI} />\n </Stack>\n </Form>\n {showResults && (\n <>\n <Divider />\n <Heading fontSize=\"md\" my={4} textAlign=\"center\">\n Suggestions\n </Heading>\n <UnorderedList>\n {displayable.map((pkg) => (\n <SearchItem\n key={pkg.name}\n name={pkg.name}\n onClick={() =>\n navigate(\n `${ROUTES.PACKAGES}/${pkg.name}/v/${pkg.version}?${\n QUERY_PARAMS.LANGUAGE\n }=${language ?? currentLanguage}`\n )\n }\n />\n ))}\n </UnorderedList>\n </>\n )}\n </ModalBody>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n </Portal>\n );\n};\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport { Button, IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { ROUTES } from \"../../constants/url\";\nimport { SearchModal } from \"../SearchModal\";\nimport testIds from \"./testIds\";\n\nexport const SearchButton: FunctionComponent = () => {\n const searchModal = useDisclosure();\n const { pathname } = useLocation();\n\n if ([ROUTES.HOME, ROUTES.SEARCH].some((path) => path === pathname)) {\n return null;\n }\n\n return (\n <>\n {/* Desktop / Tablet Search Trigger */}\n <Button\n align=\"center\"\n color=\"gray.600\"\n colorScheme=\"gray\"\n data-testid={testIds.searchButton}\n display={{ base: \"none\", md: \"flex\" }}\n fontWeight=\"medium\"\n justifyContent=\"space-between\"\n m=\"0 auto\"\n maxW=\"500px\"\n onClick={searchModal.onOpen}\n rightIcon={<SearchIcon color=\"gray.600\" ml={4} />}\n variant=\"outline\"\n w=\"100%\"\n >\n Search Constructs...\n </Button>\n {/* Mobile Search Trigger */}\n <IconButton\n aria-label=\"Search Icon\"\n borderRadius=\"md\"\n data-testid={testIds.searchIcon}\n display={{ base: \"initial\", md: \"none\" }}\n icon={<SearchIcon color=\"gray.600\" />}\n onClick={searchModal.onOpen}\n variant=\"ghost\"\n />\n <SearchModal {...searchModal} />\n </>\n );\n};\n","import { Box, Grid, GridItem, GridItemProps } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Documentation } from \"./Documentation\";\nimport { NavButton } from \"./NavButton\";\nimport { Resources } from \"./Resources\";\nimport { SearchButton } from \"./SearchButton\";\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={4}\n gridTemplateColumns={{\n base: \"1fr 3fr 1fr\",\n md: \"minmax(200px, 2fr) minmax(200px, 3fr) 2fr\",\n }}\n gridTemplateRows=\"1fr\"\n maxW=\"100vw\"\n position=\"sticky\"\n px={4}\n py={4}\n top={0}\n w=\"100%\"\n zIndex=\"sticky\"\n >\n {/* Logo / Header */}\n <HeaderItem\n colStart={{ base: 2, md: 1 }}\n justifySelf={{ base: \"center\", md: \"start\" }}\n >\n <Title />\n </HeaderItem>\n\n {/* Search Trigger */}\n <HeaderItem\n colStart={{ base: 3, md: 2 }}\n justifySelf={{ base: \"end\", md: \"stretch\" }}\n >\n <SearchButton />\n </HeaderItem>\n\n {/* Navigation */}\n <HeaderItem\n colStart={{ base: 1, md: 3 }}\n justifySelf={{ base: \"start\", md: \"end\" }}\n >\n <Grid\n display={{ base: \"none\", md: \"grid\" }}\n gap={4}\n gridTemplateColumns=\"1fr 1fr\"\n gridTemplateRows=\"1fr\"\n placeItems=\"center\"\n w=\"100%\"\n >\n <Box>\n <Documentation />\n </Box>\n <Box>\n <Resources />\n </Box>\n </Grid>\n <NavButton />\n </HeaderItem>\n </Grid>\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 { 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 { DevPreviewBanner } from \"./components/DevPreviewBanner\";\nimport { Footer } from \"./components/Footer\";\nimport { Header } from \"./components/Header\";\nimport { LazyRoute } from \"./components/LazyRoute\";\nimport { ROUTES } from \"./constants/url\";\n\nconst FAQ = lazy(() => import(\"./views/FAQ\"));\nconst Home = lazy(() => import(\"./views/Home\"));\nconst NotFound = lazy(() => import(\"./views/NotFound\"));\nconst Packages = lazy(() => import(\"./views/Packages\"));\nconst SearchResults = lazy(() => import(\"./views/SearchResults\"));\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 auto 1fr auto\"\n h=\"100%\"\n inset={0}\n maxW=\"100vw\"\n overflow=\"hidden auto\"\n position=\"fixed\"\n >\n <Header />\n <DevPreviewBanner />\n <Switch>\n <LazyRoute component={FAQ} exact path={ROUTES.FAQ} />\n <LazyRoute component={Home} exact path={ROUTES.HOME} />\n <LazyRoute component={SiteTerms} exact path={ROUTES.SITE_TERMS} />\n <LazyRoute component={Packages} path={ROUTES.PACKAGES} />\n <LazyRoute component={SearchResults} exact path={ROUTES.SEARCH} />\n <LazyRoute component={NotFound} path=\"*\" />\n </Switch>\n <Footer />\n </Grid>\n );\n};\n","import { theme } from \"@chakra-ui/react\";\n\nconst {\n components: { Code: base },\n} = theme;\n\nexport const Code = {\n ...base,\n variants: {\n ...base.variants,\n \"code-block\": {\n ...base.variants.subtle,\n display: \"block\",\n whiteSpace: \"pre\",\n },\n },\n};\n","import type { tagAnatomy } from \"@chakra-ui/anatomy\";\nimport { theme } from \"@chakra-ui/react\";\nimport type {\n PartsStyleInterpolation,\n StyleFunctionProps,\n} from \"@chakra-ui/theme-tools\";\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 Tag = {\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 official: createVariant(base.variants.subtle, {\n background: \"rgba(33, 150, 83, 0.1)\",\n color: \"#219653\",\n }),\n },\n};\n","import { theme } from \"@chakra-ui/react\";\nimport { Code } from \"./Code\";\nimport { Divider } from \"./Divider\";\nimport { Tag } from \"./Tag\";\n\nexport const components = {\n ...theme.components,\n Code,\n Divider,\n Tag,\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 { 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\": \"1920px\",\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 { components } from \"./components\";\nimport { foundations } from \"./foundations\";\n\nexport const theme = extendTheme({\n ...foundations,\n components,\n});\n","import { ChakraProvider } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { theme } from \"../theme\";\n\nexport const Theme: FunctionComponent = ({ children }) => {\n return (\n <ChakraProvider resetCSS theme={theme}>\n {children}\n </ChakraProvider>\n );\n};\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://cra.link/PWA\n\n// [::1] is the IPv6 localhost address.\n// 127.0.0.0/8 are considered localhost for IPv4.\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n window.location.hostname === \"[::1]\" ||\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nconst registerValidSW = (swUrl: string, config?: Config) => {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n \"New content is available and will be used when all \" +\n \"tabs for this page are closed. See https://cra.link/PWA.\"\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log(\"Content is cached for offline use.\");\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error(\"Error during service worker registration:\", error);\n });\n};\n\nconst checkValidServiceWorker = (swUrl: string, config?: Config) => {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { \"Service-Worker\": \"script\" },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\");\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf(\"javascript\") === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n void navigator.serviceWorker.ready.then((registration) => {\n void registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n \"No internet connection found. App is running in offline mode.\"\n );\n });\n};\n\nexport const register = (config?: Config) => {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener(\"load\", () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n void navigator.serviceWorker.ready.then(() => {\n console.log(\n \"This web app is being served cache-first by a service worker. To learn more, visit https://cra.link/PWA\"\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n};\n\nexport const unregister = () => {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n void registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n};\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { BrowserRouter as Router } from \"react-router-dom\";\nimport \"./index.css\";\nimport { App } from \"./App\";\nimport { AnalyticsProvider } from \"./contexts/Analytics\";\nimport { CatalogProvider } from \"./contexts/Catalog\";\nimport { ConfigProvider } from \"./contexts/Config\";\nimport { ExternalLinkWarningProvider } from \"./contexts/ExternalLinkWarning\";\nimport { ShortbreadProvider } from \"./contexts/Shortbread\";\nimport { Theme } from \"./contexts/Theme\";\nimport { register } from \"./register-service-worker\";\nimport { reportWebVitals } from \"./reportWebVitals\";\n\nReactDOM.render(\n <React.StrictMode>\n <ConfigProvider>\n <ShortbreadProvider>\n <Router>\n <AnalyticsProvider>\n <Theme>\n <ExternalLinkWarningProvider>\n <CatalogProvider>\n <App />\n </CatalogProvider>\n </ExternalLinkWarningProvider>\n </Theme>\n </AnalyticsProvider>\n </Router>\n </ShortbreadProvider>\n </ConfigProvider>\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// Register service worker for PWA functionality.\nregister();\n","import type { PropsOf, Icon } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { DotNetIcon } from \"../icons/DotNetIcon\";\nimport { GoIcon } from \"../icons/GoIcon\";\nimport { JavaIcon } from \"../icons/JavaIcon\";\nimport { PythonIcon } from \"../icons/PythonIcon\";\nimport { TSIcon } from \"../icons/TSIcon\";\n\nexport enum Language {\n DotNet = \"dotnet\",\n TypeScript = \"typescript\",\n Python = \"python\",\n Go = \"golang\",\n Java = \"java\",\n}\n\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]);\n\nexport const LANGUAGE_RENDER_MAP: {\n readonly [key in Language]: {\n readonly name: string;\n readonly icon: FunctionComponent<PropsOf<typeof Icon>>;\n };\n} = {\n [Language.TypeScript]: {\n name: LANGUAGE_NAME_MAP.typescript,\n icon: TSIcon,\n },\n [Language.Python]: {\n name: LANGUAGE_NAME_MAP.python,\n icon: PythonIcon,\n },\n [Language.Java]: {\n name: LANGUAGE_NAME_MAP.java,\n icon: JavaIcon,\n },\n [Language.Go]: {\n name: LANGUAGE_NAME_MAP.golang,\n icon: GoIcon,\n },\n [Language.DotNet]: {\n name: LANGUAGE_NAME_MAP.dotnet,\n icon: DotNetIcon,\n },\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const TSIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 256 256\"\n >\n <path d=\"M0 128v128h256V0H0z\" fill=\"#007ACC\" />\n <path\n d=\"M56.611 128.85l-.081 10.483h33.32v94.68h23.57v-94.68h33.32v-10.28c0-5.69-.122-10.444-.284-10.566-.122-.162-20.399-.244-44.983-.203l-44.739.122-.122 10.443zM206.567 118.108c6.501 1.626 11.459 4.51 16.01 9.224 2.357 2.52 5.851 7.112 6.136 8.209.08.325-11.053 7.802-17.798 11.987-.244.163-1.22-.894-2.317-2.52-3.291-4.794-6.745-6.867-12.028-7.232-7.76-.529-12.759 3.535-12.718 10.32 0 1.992.284 3.17 1.097 4.796 1.707 3.535 4.876 5.648 14.832 9.955 18.326 7.884 26.168 13.085 31.045 20.48 5.445 8.25 6.664 21.415 2.966 31.208-4.063 10.646-14.14 17.88-28.323 20.277-4.388.772-14.79.65-19.504-.203-10.28-1.829-20.033-6.908-26.047-13.572-2.357-2.601-6.949-9.387-6.664-9.875.122-.162 1.178-.812 2.356-1.503 1.138-.65 5.446-3.13 9.509-5.486l7.355-4.267 1.544 2.276c2.154 3.291 6.867 7.802 9.712 9.305 8.167 4.308 19.383 3.698 24.909-1.26 2.357-2.153 3.332-4.388 3.332-7.68 0-2.966-.366-4.266-1.91-6.5-1.99-2.845-6.054-5.243-17.595-10.24-13.206-5.69-18.895-9.225-24.096-14.833-3.007-3.25-5.852-8.452-7.03-12.8-.975-3.616-1.22-12.678-.447-16.335 2.723-12.76 12.353-21.658 26.25-24.3 4.51-.853 14.994-.528 19.424.57z\"\n fill=\"#FFF\"\n />\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const PythonIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon {...props} version=\"1.0\" viewBox=\"0 0 110.421 109.846\">\n <defs>\n <linearGradient id=\"a\">\n <stop offset=\"0\" stopColor=\"#ffe052\" />\n <stop offset=\"1\" stopColor=\"#ffc331\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id=\"d\"\n x1=\"89.137\"\n x2=\"147.777\"\n xlinkHref=\"#a\"\n y1=\"111.921\"\n y2=\"168.101\"\n />\n <linearGradient id=\"b\">\n <stop offset=\"0\" stopColor=\"#387eb8\" />\n <stop offset=\"1\" stopColor=\"#366994\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id=\"c\"\n x1=\"55.549\"\n x2=\"110.149\"\n xlinkHref=\"#b\"\n y1=\"77.07\"\n y2=\"131.853\"\n />\n </defs>\n <g color=\"#000\">\n <path\n d=\"M99.75 67.469c-28.032 0-26.281 12.156-26.281 12.156l.031 12.594h26.75V96H62.875s-17.938-2.034-17.938 26.25 15.657 27.281 15.657 27.281h9.343v-13.125s-.503-15.656 15.407-15.656h26.531s14.906.241 14.906-14.406V82.125s2.263-14.656-27.031-14.656zM85 75.938a4.808 4.808 0 014.813 4.812A4.808 4.808 0 0185 85.563a4.808 4.808 0 01-4.813-4.813A4.808 4.808 0 0185 75.937z\"\n fill=\"url(#c)\"\n overflow=\"visible\"\n style={{ marker: \"none\" }}\n transform=\"translate(-44.938 -67.469)\"\n />\n <path\n d=\"M100.546 177.315c28.032 0 26.281-12.156 26.281-12.156l-.03-12.594h-26.75v-3.781h37.374s17.938 2.034 17.938-26.25c0-28.285-15.657-27.282-15.657-27.282h-9.343v13.125s.503 15.657-15.407 15.657h-26.53s-14.907-.241-14.907 14.406v24.219s-2.263 14.656 27.031 14.656zm14.75-8.469a4.808 4.808 0 01-4.812-4.812 4.808 4.808 0 014.812-4.813 4.808 4.808 0 014.813 4.813 4.808 4.808 0 01-4.813 4.812z\"\n fill=\"url(#d)\"\n overflow=\"visible\"\n style={{ marker: \"none\" }}\n transform=\"translate(-44.938 -67.469)\"\n />\n </g>\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const JavaIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 256 346\"\n >\n <path\n d=\"M82.554 267.473s-13.198 7.675 9.393 10.272c27.369 3.122 41.356 2.675 71.517-3.034 0 0 7.93 4.972 19.003 9.279-67.611 28.977-153.019-1.679-99.913-16.517M74.292 229.659s-14.803 10.958 7.805 13.296c29.236 3.016 52.324 3.263 92.276-4.43 0 0 5.526 5.602 14.215 8.666-81.747 23.904-172.798 1.885-114.296-17.532\"\n fill=\"#5382A1\"\n />\n <path\n d=\"M143.942 165.515c16.66 19.18-4.377 36.44-4.377 36.44s42.301-21.837 22.874-49.183c-18.144-25.5-32.059-38.172 43.268-81.858 0 0-118.238 29.53-61.765 94.6\"\n fill=\"#E76F00\"\n />\n <path\n d=\"M233.364 295.442s9.767 8.047-10.757 14.273c-39.026 11.823-162.432 15.393-196.714.471-12.323-5.36 10.787-12.8 18.056-14.362 7.581-1.644 11.914-1.337 11.914-1.337-13.705-9.655-88.583 18.957-38.034 27.15 137.853 22.356 251.292-10.066 215.535-26.195M88.9 190.48s-62.771 14.91-22.228 20.323c17.118 2.292 51.243 1.774 83.03-.89 25.978-2.19 52.063-6.85 52.063-6.85s-9.16 3.923-15.787 8.448c-63.744 16.765-186.886 8.966-151.435-8.183 29.981-14.492 54.358-12.848 54.358-12.848M201.506 253.422c64.8-33.672 34.839-66.03 13.927-61.67-5.126 1.066-7.411 1.99-7.411 1.99s1.903-2.98 5.537-4.27c41.37-14.545 73.187 42.897-13.355 65.647 0 .001 1.003-.895 1.302-1.697\"\n fill=\"#5382A1\"\n />\n <path\n d=\"M162.439.371s35.887 35.9-34.037 91.101c-56.071 44.282-12.786 69.53-.023 98.377-32.73-29.53-56.75-55.526-40.635-79.72C111.395 74.612 176.918 57.393 162.439.37\"\n fill=\"#E76F00\"\n />\n <path\n d=\"M95.268 344.665c62.199 3.982 157.712-2.209 159.974-31.64 0 0-4.348 11.158-51.404 20.018-53.088 9.99-118.564 8.824-157.399 2.421.001 0 7.95 6.58 48.83 9.201\"\n fill=\"#5382A1\"\n />\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const GoIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 512 192\"\n >\n <path\n d=\"M292.533 13.295l1.124.75c13.212 8.725 22.685 20.691 28.917 35.15 1.496 2.243.499 3.49-2.493 4.237l-5.063 1.296c-11.447 2.949-20.53 5.429-31.827 8.378l-6.443 1.678c-2.32.574-2.96.333-5.428-2.477l-.348-.399c-3.519-3.988-6.155-6.652-10.817-9.03l-.899-.443c-15.705-7.727-30.911-5.484-45.12 3.74-16.952 10.968-25.677 27.172-25.428 47.364.25 19.942 13.96 36.395 33.654 39.137 16.951 2.244 31.16-3.739 42.378-16.452 2.244-2.743 4.238-5.734 6.73-9.224h-48.11c-5.235 0-6.481-3.24-4.736-7.478l.864-2.035c3.204-7.454 8.173-18.168 11.4-24.294l.704-1.319c.862-1.494 2.612-3.513 5.977-3.513h80.224c3.603-11.415 9.449-22.201 17.246-32.407 18.198-23.931 40.135-36.396 69.8-41.63 25.427-4.488 49.359-1.995 71.046 12.713 19.694 13.461 31.909 31.66 35.15 55.59 4.237 33.654-5.485 61.075-28.668 84.508-16.453 16.702-36.645 27.172-59.829 31.908-6.73 1.247-13.461 1.496-19.942 2.244-22.685-.499-43.376-6.98-60.826-21.937-12.273-10.61-20.727-23.648-24.928-38.828a104.937 104.937 0 01-10.47 16.89c-17.949 23.683-41.381 38.39-71.046 42.38-24.43 3.24-47.115-1.497-67.058-16.454-18.447-13.96-28.917-32.407-31.66-55.34-3.24-27.173 4.737-51.603 21.19-73.041 17.7-23.184 41.132-37.891 69.8-43.126 22.999-4.16 45.037-1.595 64.936 11.464zM411.12 49.017l-.798.178c-23.183 5.235-38.14 19.942-43.624 43.375-4.488 19.444 4.985 39.138 22.934 47.115 13.71 5.983 27.421 5.235 40.633-1.496 19.694-10.22 30.413-26.175 31.66-47.613-.25-3.24-.25-5.734-.749-8.227-4.436-24.401-26.664-38.324-50.056-33.332zM116.416 94.564c.997 0 1.496.748 1.496 1.745l-.499 5.983c0 .997-.997 1.745-1.745 1.745l-54.344-.249c-.997 0-1.246-.748-.748-1.496l3.49-6.232c.499-.748 1.496-1.496 2.493-1.496h49.857zM121.9 71.63c.997 0 1.496.748 1.247 1.496l-1.995 5.983c-.249.997-1.246 1.495-2.243 1.495l-117.912.25c-.997 0-1.246-.499-.748-1.247l5.235-6.73c.499-.748 1.745-1.247 2.742-1.247H121.9zm12.963-22.934c.997 0 1.246.748.748 1.496l-4.238 6.481c-.499.748-1.745 1.496-2.493 1.496l-90.24-.25c-.998 0-1.247-.498-.749-1.246l5.235-6.73c.499-.748 1.745-1.247 2.742-1.247h88.995z\"\n fill=\"#00ACD7\"\n />\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const DotNetIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 32 32\"\n >\n <path\n d=\"M4.224 10.089v11.667h1.365v-8.438a12.58 12.58 0 00-.068-1.599h.052c.099.255.224.5.37.729l6 9.302h1.672V10.089h-1.359v8.203c-.016.573.016 1.146.083 1.714h-.031a13.986 13.986 0 00-.474-.781L5.995 10.09zm12.417 0v11.667h6.203l.005-1.281h-4.813v-4.047h4.214v-1.229h-4.214v-3.875h4.521V10.09zm7.25 0v1.234h3.354v10.432h1.365V11.323h3.391v-1.234zm-23.021 10a.86.86 0 00-.609.276.91.91 0 00-.26.641.901.901 0 001.542.641c.172-.167.271-.401.271-.641s-.099-.474-.271-.641a.876.876 0 00-.641-.276H.871z\"\n fill=\"#626262\"\n />\n </Icon>\n );\n};\n","import { ExternalLinkIcon } from \"@chakra-ui/icons\";\nimport { forwardRef, Link, LinkProps } from \"@chakra-ui/react\";\nimport { useExternalLinkWarning } from \"../../contexts/ExternalLinkWarning\";\n\nexport interface ExternalLinkProps extends LinkProps {\n /**\n * Shows an external link icon. `true` by default\n */\n hasIcon?: boolean;\n /**\n * Prompts the user to confirm leaving the site. `true` by default\n */\n hasWarning?: boolean;\n /**\n * Adds the nofollow annotation to the anchor's rel attribute\n */\n noFollow?: boolean;\n}\n\nexport const ExternalLink = forwardRef<ExternalLinkProps, \"a\">(\n (\n {\n children,\n hasIcon = true,\n hasWarning = true,\n href,\n onClick,\n noFollow,\n ...props\n },\n ref\n ) => {\n const withPrompt = useExternalLinkWarning();\n\n let rel = \"noopener noreferrer\";\n\n if (hasWarning || noFollow) {\n rel += \" nofollow\";\n }\n\n return (\n <Link\n color=\"blue.500\"\n href={href}\n isExternal\n onClick={hasWarning ? withPrompt({ href, onClick }) : onClick}\n ref={ref}\n rel={rel}\n {...props}\n >\n {children} {hasIcon && <ExternalLinkIcon mb={1} ml={2} />}\n </Link>\n );\n }\n);\n\nExternalLink.displayName = \"ExternalLink\";\n","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 { Link as ChakraLink, PropsOf } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Link as RouterLink } from \"react-router-dom\";\n\nexport type NavLinkProps = PropsOf<typeof ChakraLink> &\n PropsOf<typeof RouterLink>;\n\nexport const NavLink: FunctionComponent<NavLinkProps> = (props) => {\n return <ChakraLink as={RouterLink} {...props} />;\n};\n","import { Language } from \"../../constants/languages\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { Metadata } from \"./metadata\";\n\nexport interface Author {\n readonly name: string;\n readonly url: string;\n}\n\nexport interface CatalogPackage {\n name: string;\n languages: Partial<Record<Language, Record<string, unknown>>>;\n version: string;\n description: string;\n author: Author | string;\n keywords: string[];\n metadata: Metadata;\n}\n\nexport interface Packages {\n packages: CatalogPackage[];\n}\n\n/**\n * Fetch the catalog of all packages from the backend.\n */\nexport const fetchPackages = async (): Promise<Packages> => {\n const response = await fetch(API_PATHS.CATALOG_SUFFIX);\n\n if (!response.ok) {\n console.error(response.statusText);\n throw new Error(`Failed fetching packages index: ${response.statusText}`);\n }\n\n return response.json();\n};\n","import { createContext, FunctionComponent, useContext, useEffect } from \"react\";\nimport { fetchPackages, Packages } from \"../../api/package/packages\";\nimport { useRequest, UseRequestResponse } from \"../../hooks/useRequest\";\n\nconst CatalogContext = createContext<UseRequestResponse<Packages>>({\n loading: false,\n data: undefined,\n error: undefined,\n});\n\nexport const useCatalog = () => useContext(CatalogContext);\n\nexport const CatalogProvider: FunctionComponent = ({ children }) => {\n const [requestPackages, catalogResponse] = useRequest(fetchPackages);\n\n useEffect(() => {\n void requestPackages();\n }, [requestPackages]);\n\n return (\n <CatalogContext.Provider value={catalogResponse}>\n {children}\n </CatalogContext.Provider>\n );\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\n// Possible utility types for re-use\ntype PromiseFn = (...args: any[]) => Promise<any>;\ntype Awaited<T> = T extends PromiseLike<infer U> ? Awaited<U> : T;\ntype AwaitedReturn<T extends PromiseFn> = Awaited<ReturnType<T>>;\n\nexport interface UseRequestOptions<T> {\n initialValue?: T;\n onError?: (err: Error) => void;\n onSuccess?: (res: T) => void;\n}\n\nexport interface UseRequestResponse<T> {\n loading: boolean;\n error: Error | undefined;\n data: T | undefined;\n}\n\nexport type UseRequestReturn<T extends (...args: any[]) => Promise<T>> = [\n (...args: Parameters<T>) => Promise<void>,\n UseRequestResponse<AwaitedReturn<T>>\n];\n\n/**\n * Provides an API to statefully interact with promises. This hook\n * prevents state updates if promise has not resolved before component unmounts.\n * It will return a tuple with a request() function, and an object representing the state\n */\nexport const useRequest = <T extends PromiseFn>(\n requestFn: T,\n options: UseRequestOptions<AwaitedReturn<T>> = {}\n): UseRequestReturn<T> => {\n const { initialValue, onSuccess, onError } = options;\n\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<AwaitedReturn<T> | undefined>(initialValue);\n const [error, setError] = useState<Error | undefined>();\n\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const statefulFetch = useCallback(\n async (...args: Parameters<T>): Promise<void> => {\n if (!mountedRef.current) return;\n\n setLoading(true);\n setError(undefined);\n\n try {\n const res = await requestFn(...args);\n onSuccess?.(res);\n\n if (mountedRef.current) {\n setData(res);\n setLoading(false);\n }\n } catch (e: any) {\n console.error(e);\n onError?.(e);\n\n if (mountedRef.current) {\n setData(initialValue);\n setError(e);\n setLoading(false);\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onError, onSuccess]\n );\n\n return useMemo(\n () => [\n statefulFetch,\n {\n data,\n loading,\n error,\n },\n ],\n [statefulFetch, data, loading, error]\n );\n};\n","import { 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 type { MouseEventHandler } from \"react\";\n\nexport interface ExternalLinkPromptOptions {\n href?: string;\n onClick?: MouseEventHandler<HTMLAnchorElement>;\n}\n\nexport type ExternalLinkPrompt = ({\n href,\n onClick,\n}: ExternalLinkPromptOptions) => typeof onClick;\n\nexport const PREFERS_WARN_ON_EXTERNAL_LINK_CLICK =\n \"prefersWarnOnExternalLinkClick\";\n","import { ExternalLinkIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Checkbox,\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalOverlay,\n Text,\n Tooltip,\n} from \"@chakra-ui/react\";\nimport {\n ChangeEventHandler,\n FunctionComponent,\n MouseEventHandler,\n useState,\n} from \"react\";\nimport { ExternalLink } from \"../../components/ExternalLink\";\nimport {\n ExternalLinkPromptOptions,\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n} from \"./constants\";\n\nexport interface ExternalLinkWarningModalProps\n extends ExternalLinkPromptOptions {\n isOpen: boolean;\n onClose: () => void;\n setShouldWarn: (shouldWarn: boolean) => void;\n}\n\nexport const ExternalLinkWarningModal: FunctionComponent<ExternalLinkWarningModalProps> =\n ({ href, isOpen, onClick, onClose, setShouldWarn }) => {\n // Track a final state for showing warnings that will only be updated if a user chooses to proceed\n const [finalShouldWarn, setFinalShouldWarn] = useState(true);\n\n // Update intermediate state when preference checkmark is updated\n const onPreferenceUpdated: ChangeEventHandler<HTMLInputElement> = (e) => {\n const shouldWarn = !e.target.checked;\n setFinalShouldWarn(shouldWarn);\n };\n\n const onCancel = () => {\n // If user cancelled the navigation, reset final warning state\n setFinalShouldWarn(true);\n onClose();\n };\n\n const onProceed: MouseEventHandler<HTMLAnchorElement> = (e) => {\n // If a user decided to not show warnings in the future, update localStorage & state to reflect their decision\n if (!finalShouldWarn) {\n setShouldWarn(finalShouldWarn);\n\n try {\n localStorage.setItem(\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n JSON.stringify(finalShouldWarn)\n );\n } catch {}\n }\n\n onClick?.(e);\n onClose();\n };\n\n return (\n <Modal closeOnOverlayClick={false} isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent color=\"blue.800\">\n <ModalHeader>Confirm</ModalHeader>\n <ModalBody>\n <Text fontSize=\"lg\" mb={2}>\n This link is taking you to an external site\n </Text>\n <Text\n bg=\"gray.100\"\n borderRadius=\"sm\"\n color=\"blue.500\"\n fontSize=\"sm\"\n mb={4}\n p={1}\n >\n {href}\n </Text>\n <Checkbox onChange={onPreferenceUpdated}>\n Do not show this warning again.\n </Checkbox>\n </ModalBody>\n <ModalFooter>\n <Button onClick={onCancel} variant=\"ghost\">\n Cancel\n </Button>\n\n <Tooltip hasArrow label={href} placement=\"top\">\n <ExternalLink\n hasIcon={false}\n hasWarning={false}\n href={href}\n noFollow\n onClick={onProceed}\n >\n <Button\n colorScheme=\"blue\"\n ml={4}\n rightIcon={<ExternalLinkIcon />}\n tabIndex={0}\n variant=\"ghost\"\n >\n Proceed\n </Button>\n </ExternalLink>\n </Tooltip>\n </ModalFooter>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n );\n };\n","import { useDisclosure } from \"@chakra-ui/react\";\nimport {\n useContext,\n useState,\n createContext,\n FunctionComponent,\n MouseEventHandler,\n useCallback,\n} from \"react\";\nimport {\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n ExternalLinkPrompt,\n ExternalLinkPromptOptions,\n} from \"./constants\";\nimport { ExternalLinkWarningModal } from \"./ExternalLinkWarningModal\";\n\nconst ExternalLinkWarningContext = createContext<ExternalLinkPrompt>(\n ({ onClick }) => onClick\n);\n\nexport const useExternalLinkWarning = () =>\n useContext(ExternalLinkWarningContext);\n\nexport const ExternalLinkWarningProvider: FunctionComponent = ({\n children,\n}) => {\n const [modalOption, setModalOptions] =\n useState<ExternalLinkPromptOptions | null>(null);\n\n const { isOpen, onOpen, onClose } = useDisclosure({\n // Reset the modal options when closed\n onClose: () => {\n setModalOptions(null);\n },\n });\n\n // Determines initial state from localStorage. If no value is found, default to showing warning\n const [shouldWarn, setShouldWarn] = useState(() => {\n try {\n const saved =\n localStorage.getItem(PREFERS_WARN_ON_EXTERNAL_LINK_CLICK) ?? \"true\";\n return JSON.parse(saved);\n } catch {\n return true;\n }\n });\n\n // Takes in an href & onClick to set options for modal. If it should warn the user, it will wrap the onClick\n // With additional logic to show the modal\n const withPrompt = useCallback<ExternalLinkPrompt>(\n ({ href, onClick }) => {\n if (!shouldWarn) return onClick;\n\n const handler: MouseEventHandler<HTMLAnchorElement> = (e) => {\n setModalOptions({ href, onClick });\n e.preventDefault();\n onOpen();\n };\n\n return handler;\n },\n [onOpen, shouldWarn]\n );\n\n return (\n <ExternalLinkWarningContext.Provider value={withPrompt}>\n {children}\n <ExternalLinkWarningModal\n isOpen={isOpen}\n onClose={onClose}\n setShouldWarn={setShouldWarn}\n {...modalOption}\n />\n </ExternalLinkWarningContext.Provider>\n );\n};\n"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ !function(e){function t(t){for(var n,a,c=t[0],i=t[1],f=t[2],p=0,s=[];p<c.length;p++)a=c[p],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(l&&l(t);s.length;)s.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,c=1;c<r.length;c++){var i=r[c];0!==o[i]&&(n=!1)}n&&(u.splice(t--,1),e=a(a.s=r[0]))}return e}var n={},o={3:0},u=[];function a(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.e=function(e){var t=[],r=o[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=o[e]=[t,n]}));t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,a.nc&&c.setAttribute("nonce",a.nc),c.src=function(e){return a.p+"static/js/"+({}[e]||e)+"."+{0:"ff9d42f8",1:"a7f029fd",4:"7cd92fab",6:"c0e3f99c",7:"11632168",8:"8af79a83",9:"2b21526e",10:"32615aa0",11:"051d89fc",12:"e96b82dd",13:"fb054c47"}[e]+".chunk.js"}(e);var i=new Error;u=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=o[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),u=t&&t.target&&t.target.src;i.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",i.name="ChunkLoadError",i.type=n,i.request=u,r[1](i)}o[e]=void 0}};var f=setTimeout((function(){u({type:"timeout",target:c})}),12e4);c.onerror=c.onload=u,document.head.appendChild(c)}return Promise.all(t)},a.m=e,a.c=n,a.d=function(e,t,r){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(a.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)a.d(r,n,function(t){return e[t]}.bind(null,n));return r},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="/",a.oe=function(e){throw console.error(e),e};var c=this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[],i=c.push.bind(c);c.push=t,c=c.slice();for(var f=0;f<c.length;f++)t(c[f]);var l=i;r()}([]);
2
+ //# sourceMappingURL=runtime-main.82c3976d.js.map
@@ -0,0 +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.82c3976d.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\":\"ff9d42f8\",\"1\":\"a7f029fd\",\"4\":\"7cd92fab\",\"6\":\"c0e3f99c\",\"7\":\"11632168\",\"8\":\"8af79a83\",\"9\":\"2b21526e\",\"10\":\"32615aa0\",\"11\":\"051d89fc\",\"12\":\"e96b82dd\",\"13\":\"fb054c47\"}[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":""}