construct-hub-webapp 0.1.1448 → 0.1.1449
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/asset-manifest.json +5 -5
- package/build/index.html +1 -1
- package/build/static/css/main.efe592a7.css.map +1 -1
- package/build/static/js/323.80d18b4c.chunk.js.map +1 -1
- package/build/static/js/332.9e0695b5.chunk.js.map +1 -1
- package/build/static/js/375.30524f64.chunk.js.map +1 -1
- package/build/static/js/421.ec09e678.chunk.js +2 -0
- package/build/static/js/421.ec09e678.chunk.js.map +1 -0
- package/build/static/js/451.7c2110db.chunk.js.map +1 -1
- package/build/static/js/453.098e6dff.chunk.js.map +1 -1
- package/build/static/js/496.92802c31.chunk.js.map +1 -1
- package/build/static/js/516.34bdea00.chunk.js.map +1 -1
- package/build/static/js/591.cb922910.chunk.js.map +1 -1
- package/build/static/js/619.70bb2d55.chunk.js.map +1 -1
- package/build/static/js/685.58592b70.chunk.js.map +1 -1
- package/build/static/js/773.ea0e9610.chunk.js.map +1 -1
- package/build/static/js/8.94165f2d.chunk.js.map +1 -1
- package/build/static/js/857.3540b295.chunk.js.map +1 -1
- package/build/static/js/959.cd9d51a2.chunk.js.map +1 -1
- package/build/static/js/{main.0a58dff8.js → main.80cba683.js} +3 -3
- package/build/static/js/{main.0a58dff8.js.map → main.80cba683.js.map} +1 -1
- package/coverage/clover.xml +50 -50
- package/coverage/coverage-final.json +3 -3
- package/coverage/lcov-report/index.html +19 -19
- package/coverage/lcov-report/src/App.tsx.html +1 -1
- package/coverage/lcov-report/src/api/catalog-search/catalog-search.ts.html +1 -1
- package/coverage/lcov-report/src/api/catalog-search/constants.ts.html +1 -1
- package/coverage/lcov-report/src/api/catalog-search/index.html +1 -1
- package/coverage/lcov-report/src/api/catalog-search/index.ts.html +1 -1
- package/coverage/lcov-report/src/api/catalog-search/util.ts.html +1 -1
- package/coverage/lcov-report/src/api/config/index.html +1 -1
- package/coverage/lcov-report/src/api/config/index.ts.html +1 -1
- package/coverage/lcov-report/src/api/package/assembly.ts.html +1 -1
- package/coverage/lcov-report/src/api/package/docs.ts.html +1 -1
- package/coverage/lcov-report/src/api/package/index.html +1 -1
- package/coverage/lcov-report/src/api/package/metadata.ts.html +1 -1
- package/coverage/lcov-report/src/api/package/packages.ts.html +1 -1
- package/coverage/lcov-report/src/api/package/util.ts.html +1 -1
- package/coverage/lcov-report/src/api/stats/index.html +1 -1
- package/coverage/lcov-report/src/api/stats/index.ts.html +1 -1
- package/coverage/lcov-report/src/api/versions/index.html +1 -1
- package/coverage/lcov-report/src/api/versions/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/CDKType/CDKType.tsx.html +1 -1
- package/coverage/lcov-report/src/components/CDKType/index.html +1 -1
- package/coverage/lcov-report/src/components/CDKType/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/Card/Card.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Card/index.html +1 -1
- package/coverage/lcov-report/src/components/Card/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/Code/Code.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Code/MultiLineRenderer.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Code/SingleLineRenderer.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Code/index.html +1 -1
- package/coverage/lcov-report/src/components/Code/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/Code/types.ts.html +1 -1
- package/coverage/lcov-report/src/components/CopyButton/CopyButton.tsx.html +1 -1
- package/coverage/lcov-report/src/components/CopyButton/index.html +1 -1
- package/coverage/lcov-report/src/components/CopyButton/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/ExternalLink/ExternalLink.tsx.html +1 -1
- package/coverage/lcov-report/src/components/ExternalLink/index.html +1 -1
- package/coverage/lcov-report/src/components/ExternalLink/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/FAQ/FAQ.tsx.html +1 -1
- package/coverage/lcov-report/src/components/FAQ/FAQHeading.tsx.html +1 -1
- package/coverage/lcov-report/src/components/FAQ/FAQItem.tsx.html +1 -1
- package/coverage/lcov-report/src/components/FAQ/FAQLink.tsx.html +1 -1
- package/coverage/lcov-report/src/components/FAQ/FAQSection.tsx.html +1 -1
- package/coverage/lcov-report/src/components/FAQ/FAQSections.tsx.html +1 -1
- package/coverage/lcov-report/src/components/FAQ/index.html +1 -1
- package/coverage/lcov-report/src/components/FAQ/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/Footer/Footer.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Footer/constants.ts.html +1 -1
- package/coverage/lcov-report/src/components/Footer/index.html +1 -1
- package/coverage/lcov-report/src/components/Footer/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/Footer/testIds.ts.html +1 -1
- package/coverage/lcov-report/src/components/Form/Form.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Form/index.html +1 -1
- package/coverage/lcov-report/src/components/Form/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/Header/DocumentationDropdown.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Header/GettingStartedDropdown.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Header/Header.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Header/HeaderSearch.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Header/MobileNav.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Header/MobileNavLinks.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Header/NavButton.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Header/Title.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Header/constants.ts.html +1 -1
- package/coverage/lcov-report/src/components/Header/index.html +1 -1
- package/coverage/lcov-report/src/components/Header/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/Header/testIds.ts.html +1 -1
- package/coverage/lcov-report/src/components/Highlight/Highlight.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Highlight/index.html +1 -1
- package/coverage/lcov-report/src/components/Highlight/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/LanguageSupportTooltip/LanguageSupportTooltip.tsx.html +1 -1
- package/coverage/lcov-report/src/components/LanguageSupportTooltip/index.html +1 -1
- package/coverage/lcov-report/src/components/LanguageSupportTooltip/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/LazyRoute/LazyRoute.tsx.html +1 -1
- package/coverage/lcov-report/src/components/LazyRoute/index.html +1 -1
- package/coverage/lcov-report/src/components/LazyRoute/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/LicenseLink/LicenseLink.tsx.html +1 -1
- package/coverage/lcov-report/src/components/LicenseLink/index.html +1 -1
- package/coverage/lcov-report/src/components/LicenseLink/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/Markdown/Code.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Markdown/Headings.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Markdown/Hr.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Markdown/Img.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Markdown/List.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Markdown/Markdown.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Markdown/Table.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Markdown/Text.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Markdown/index.html +1 -1
- package/coverage/lcov-report/src/components/Markdown/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/Markdown/testIds.ts.html +1 -1
- package/coverage/lcov-report/src/components/NavLink/NavLink.tsx.html +1 -1
- package/coverage/lcov-report/src/components/NavLink/index.html +1 -1
- package/coverage/lcov-report/src/components/NavLink/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/NavPopover/NavPopover.tsx.html +1 -1
- package/coverage/lcov-report/src/components/NavPopover/NavPopoverContent.tsx.html +1 -1
- package/coverage/lcov-report/src/components/NavPopover/NavPopoverTrigger.tsx.html +1 -1
- package/coverage/lcov-report/src/components/NavPopover/index.html +1 -1
- package/coverage/lcov-report/src/components/NavPopover/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/NavPopover/types.ts.html +1 -1
- package/coverage/lcov-report/src/components/NavTree/NavItem.tsx.html +1 -1
- package/coverage/lcov-report/src/components/NavTree/NavItemWrapper.tsx.html +1 -1
- package/coverage/lcov-report/src/components/NavTree/NavTree.tsx.html +1 -1
- package/coverage/lcov-report/src/components/NavTree/index.html +1 -1
- package/coverage/lcov-report/src/components/NavTree/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/NavTree/types.ts.html +1 -1
- package/coverage/lcov-report/src/components/PackageCard/Details.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PackageCard/EditorsNote.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PackageCard/Heading.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PackageCard/Highlight.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PackageCard/Languages.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PackageCard/PackageCard.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PackageCard/Tags.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PackageCard/WideCard.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PackageCard/constants.ts.html +1 -1
- package/coverage/lcov-report/src/components/PackageCard/index.html +1 -1
- package/coverage/lcov-report/src/components/PackageCard/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/PackageCard/testIds.ts.html +1 -1
- package/coverage/lcov-report/src/components/PackageLanguages/PackageLanguages.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PackageLanguages/index.html +1 -1
- package/coverage/lcov-report/src/components/PackageLanguages/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/PackageList/PackageList.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PackageList/WideCardList.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PackageList/index.html +1 -1
- package/coverage/lcov-report/src/components/PackageList/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/PackageTag/PackageTag.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PackageTag/index.html +1 -1
- package/coverage/lcov-report/src/components/PackageTag/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/Page/Page.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Page/index.html +1 -1
- package/coverage/lcov-report/src/components/Page/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/PageLoader/PageLoader.tsx.html +1 -1
- package/coverage/lcov-report/src/components/PageLoader/index.html +1 -1
- package/coverage/lcov-report/src/components/PageLoader/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/Picture/Picture.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Picture/index.html +1 -1
- package/coverage/lcov-report/src/components/Picture/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/SearchBar/SearchBar.tsx.html +1 -1
- package/coverage/lcov-report/src/components/SearchBar/SearchOverlay.tsx.html +1 -1
- package/coverage/lcov-report/src/components/SearchBar/SearchSuggestions.tsx.html +1 -1
- package/coverage/lcov-report/src/components/SearchBar/index.html +1 -1
- package/coverage/lcov-report/src/components/SearchBar/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/SearchBar/testIds.ts.html +1 -1
- package/coverage/lcov-report/src/components/SearchItem/SearchItem.tsx.html +1 -1
- package/coverage/lcov-report/src/components/SearchItem/index.html +1 -1
- package/coverage/lcov-report/src/components/SearchItem/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/SearchModal/SearchModal.tsx.html +1 -1
- package/coverage/lcov-report/src/components/SearchModal/index.html +1 -1
- package/coverage/lcov-report/src/components/SearchModal/index.ts.html +1 -1
- package/coverage/lcov-report/src/components/SearchModal/testIds.ts.html +1 -1
- package/coverage/lcov-report/src/components/Time/Time.tsx.html +1 -1
- package/coverage/lcov-report/src/components/Time/index.html +1 -1
- package/coverage/lcov-report/src/components/Time/index.ts.html +1 -1
- package/coverage/lcov-report/src/constants/constructs.ts.html +1 -1
- package/coverage/lcov-report/src/constants/dates.ts.html +1 -1
- package/coverage/lcov-report/src/constants/index.html +1 -1
- package/coverage/lcov-report/src/constants/keywords.ts.html +1 -1
- package/coverage/lcov-report/src/constants/languages.ts.html +1 -1
- package/coverage/lcov-report/src/constants/links.ts.html +1 -1
- package/coverage/lcov-report/src/constants/pageInfo.ts.html +1 -1
- package/coverage/lcov-report/src/constants/url.ts.html +4 -4
- package/coverage/lcov-report/src/contexts/Analytics/Analytics.tsx.html +1 -1
- package/coverage/lcov-report/src/contexts/Analytics/index.html +1 -1
- package/coverage/lcov-report/src/contexts/Analytics/index.ts.html +1 -1
- package/coverage/lcov-report/src/contexts/Analytics/types.ts.html +1 -1
- package/coverage/lcov-report/src/contexts/Analytics/usePageView.ts.html +1 -1
- package/coverage/lcov-report/src/contexts/Analytics/util.ts.html +1 -1
- package/coverage/lcov-report/src/contexts/Config/Config.tsx.html +1 -1
- package/coverage/lcov-report/src/contexts/Config/index.html +1 -1
- package/coverage/lcov-report/src/contexts/Config/index.ts.html +1 -1
- package/coverage/lcov-report/src/contexts/ExternalLinkWarning/ExternalLinkWarning.tsx.html +1 -1
- package/coverage/lcov-report/src/contexts/ExternalLinkWarning/ExternalLinkWarningModal.tsx.html +1 -1
- package/coverage/lcov-report/src/contexts/ExternalLinkWarning/constants.ts.html +1 -1
- package/coverage/lcov-report/src/contexts/ExternalLinkWarning/index.html +1 -1
- package/coverage/lcov-report/src/contexts/ExternalLinkWarning/index.ts.html +1 -1
- package/coverage/lcov-report/src/contexts/Search/Search.tsx.html +1 -1
- package/coverage/lcov-report/src/contexts/Search/index.html +1 -1
- package/coverage/lcov-report/src/contexts/Search/index.ts.html +1 -1
- package/coverage/lcov-report/src/contexts/Shortbread/Shortbread.tsx.html +1 -1
- package/coverage/lcov-report/src/contexts/Shortbread/index.html +1 -1
- package/coverage/lcov-report/src/contexts/Shortbread/index.ts.html +1 -1
- package/coverage/lcov-report/src/contexts/Theme.tsx.html +1 -1
- package/coverage/lcov-report/src/contexts/index.html +1 -1
- package/coverage/lcov-report/src/hooks/useCatalog/index.html +1 -1
- package/coverage/lcov-report/src/hooks/useCatalog/index.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useCatalog/useCatalog.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useCatalogResults/index.html +1 -1
- package/coverage/lcov-report/src/hooks/useCatalogResults/index.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useCatalogResults/useCatalogResults.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useCatalogSearch/index.html +1 -1
- package/coverage/lcov-report/src/hooks/useCatalogSearch/index.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useCatalogSearch/useCatalogSearch.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useConfigValue/index.html +1 -1
- package/coverage/lcov-report/src/hooks/useConfigValue/index.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useConfigValue/useConfigValue.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useDebounce/index.html +1 -1
- package/coverage/lcov-report/src/hooks/useDebounce/index.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useDebounce/useDebounce.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useHistoryState/index.html +1 -1
- package/coverage/lcov-report/src/hooks/useHistoryState/index.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useHistoryState/useHistoryState.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useLanguage/index.html +1 -1
- package/coverage/lcov-report/src/hooks/useLanguage/index.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useLanguage/useLanguage.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/usePagination/index.html +1 -1
- package/coverage/lcov-report/src/hooks/usePagination/index.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/usePagination/usePagination.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useQueryParams/index.html +1 -1
- package/coverage/lcov-report/src/hooks/useQueryParams/index.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useQueryParams/useQueryParams.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useSearch/index.html +1 -1
- package/coverage/lcov-report/src/hooks/useSearch/index.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useSearch/useSearch.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useStats/index.html +1 -1
- package/coverage/lcov-report/src/hooks/useStats/index.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useStats/useStats.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useVersions/index.html +1 -1
- package/coverage/lcov-report/src/hooks/useVersions/index.ts.html +1 -1
- package/coverage/lcov-report/src/hooks/useVersions/useVersions.ts.html +1 -1
- package/coverage/lcov-report/src/icons/AWSIcon.tsx.html +1 -1
- package/coverage/lcov-report/src/icons/DatadogIcon.tsx.html +1 -1
- package/coverage/lcov-report/src/icons/DotNetIcon.tsx.html +1 -1
- package/coverage/lcov-report/src/icons/DukeIcon.tsx.html +1 -1
- package/coverage/lcov-report/src/icons/GithubIcon.tsx.html +1 -1
- package/coverage/lcov-report/src/icons/GoIcon.tsx.html +1 -1
- package/coverage/lcov-report/src/icons/MongoDBIcon.tsx.html +1 -1
- package/coverage/lcov-report/src/icons/PythonIcon.tsx.html +1 -1
- package/coverage/lcov-report/src/icons/TSIcon.tsx.html +1 -1
- package/coverage/lcov-report/src/icons/index.html +1 -1
- package/coverage/lcov-report/src/index.html +1 -1
- package/coverage/lcov-report/src/index.tsx.html +1 -1
- package/coverage/lcov-report/src/lib/shortbread/getLocalStoreWriter.ts.html +1 -1
- package/coverage/lcov-report/src/lib/shortbread/index.html +1 -1
- package/coverage/lcov-report/src/lib/shortbread/index.ts.html +1 -1
- package/coverage/lcov-report/src/lib/shortbread/shortbread.ts.html +1 -1
- package/coverage/lcov-report/src/lib/shortbread/source.js.html +1 -1
- package/coverage/lcov-report/src/no-op-sw.js.html +1 -1
- package/coverage/lcov-report/src/register-service-worker.ts.html +1 -1
- package/coverage/lcov-report/src/reportWebVitals.ts.html +1 -1
- package/coverage/lcov-report/src/service-worker.ts.html +1 -1
- package/coverage/lcov-report/src/theme/components/Checkbox.ts.html +1 -1
- package/coverage/lcov-report/src/theme/components/Code.ts.html +1 -1
- package/coverage/lcov-report/src/theme/components/Divider.ts.html +1 -1
- package/coverage/lcov-report/src/theme/components/Radio.ts.html +1 -1
- package/coverage/lcov-report/src/theme/components/Tabs.ts.html +1 -1
- package/coverage/lcov-report/src/theme/components/Tag.ts.html +1 -1
- package/coverage/lcov-report/src/theme/components/index.html +1 -1
- package/coverage/lcov-report/src/theme/components/index.ts.html +1 -1
- package/coverage/lcov-report/src/theme/foundations/borders.ts.html +1 -1
- package/coverage/lcov-report/src/theme/foundations/colors.ts.html +1 -1
- package/coverage/lcov-report/src/theme/foundations/index.html +1 -1
- package/coverage/lcov-report/src/theme/foundations/index.ts.html +1 -1
- package/coverage/lcov-report/src/theme/foundations/radius.ts.html +1 -1
- package/coverage/lcov-report/src/theme/foundations/shadows.ts.html +1 -1
- package/coverage/lcov-report/src/theme/foundations/sizes.ts.html +1 -1
- package/coverage/lcov-report/src/theme/index.html +1 -1
- package/coverage/lcov-report/src/theme/index.ts.html +1 -1
- package/coverage/lcov-report/src/types/config.ts.html +1 -1
- package/coverage/lcov-report/src/types/index.html +1 -1
- package/coverage/lcov-report/src/util/createTestIds.ts.html +1 -1
- package/coverage/lcov-report/src/util/css.ts.html +1 -1
- package/coverage/lcov-report/src/util/index.html +1 -1
- package/coverage/lcov-report/src/util/package.ts.html +1 -1
- package/coverage/lcov-report/src/util/sanitize-anchor.ts.html +1 -1
- package/coverage/lcov-report/src/util/url.ts.html +21 -21
- package/coverage/lcov-report/src/views/Contribute/Contribute.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Contribute/index.html +1 -1
- package/coverage/lcov-report/src/views/Contribute/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/FAQ/FAQ.tsx.html +1 -1
- package/coverage/lcov-report/src/views/FAQ/index.html +1 -1
- package/coverage/lcov-report/src/views/FAQ/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/Home/CDKTypeTabs.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Home/Categories.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Home/Featured.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Home/GradientContainer.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Home/Hero.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Home/Home.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Home/Info.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Home/InfoSection.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Home/PackageGrid.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Home/constants.ts.html +1 -1
- package/coverage/lcov-report/src/views/Home/index.html +1 -1
- package/coverage/lcov-report/src/views/Home/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/Home/testIds.ts.html +1 -1
- package/coverage/lcov-report/src/views/Home/useSection.ts.html +1 -1
- package/coverage/lcov-report/src/views/NotFound/NotFound.tsx.html +1 -1
- package/coverage/lcov-report/src/views/NotFound/index.html +1 -1
- package/coverage/lcov-report/src/views/NotFound/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/Package/ChooseSubmodule/ChooseSubmodule.tsx.html +75 -60
- package/coverage/lcov-report/src/views/Package/ChooseSubmodule/SearchInput.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/ChooseSubmodule/SearchModal.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/ChooseSubmodule/index.html +20 -20
- package/coverage/lcov-report/src/views/Package/ChooseSubmodule/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/Package/DependenciesList.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/DocsError.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/FeedbackLinks.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/LanguageBar.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/LanguageSelection.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/NavDrawer.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/Package.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageDocs.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageDocsError.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageDocsUnsupported.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageHeader/Details.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageHeader/HeaderContainer.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageHeader/Heading.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageHeader/Install.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageHeader/PackageHeader.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageHeader/SelectVersion.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageHeader/ToggleButton.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageHeader/index.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageHeader/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageLayout.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageReadme.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageState.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PackageTypeDocs.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/PrimaryDocNavigation.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/SecondaryDocNavigation.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/ShareInfo.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/StickyNavContainer.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Package/constants.ts.html +1 -1
- package/coverage/lcov-report/src/views/Package/index.html +1 -1
- package/coverage/lcov-report/src/views/Package/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/Package/testIds.ts.html +1 -1
- package/coverage/lcov-report/src/views/Package/useIntersectingHeader/index.html +1 -1
- package/coverage/lcov-report/src/views/Package/useIntersectingHeader/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/Package/useIntersectingHeader/useIntersectingHeader.ts.html +1 -1
- package/coverage/lcov-report/src/views/Package/useIntersectingHeader/util.ts.html +1 -1
- package/coverage/lcov-report/src/views/Package/useSectionItems/index.html +1 -1
- package/coverage/lcov-report/src/views/Package/useSectionItems/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/Package/useSectionItems/useSectionItems.ts.html +1 -1
- package/coverage/lcov-report/src/views/Package/useSectionItems/util.ts.html +1 -1
- package/coverage/lcov-report/src/views/Package/util.ts.html +1 -1
- package/coverage/lcov-report/src/views/PackageLatest/PackageLatest.tsx.html +1 -1
- package/coverage/lcov-report/src/views/PackageLatest/index.html +1 -1
- package/coverage/lcov-report/src/views/PackageLatest/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/Packages/Packages.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Packages/index.html +1 -1
- package/coverage/lcov-report/src/views/Packages/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/Random/Random.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Random/index.html +1 -1
- package/coverage/lcov-report/src/views/Random/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/Search/ArrowButton.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/CDKFilter.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/CheckboxFilter.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/FilterHeading.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/FilterPanel.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/GoToPage.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/KeywordsFilter.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/LanguageFilter.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/PageControls.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/RadioFilter.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/Search.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/SearchBar.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/SearchDetails.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/SearchResults.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/SortAndFilterDrawer.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/SortFilter.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/SortedBy.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/TagFilter.tsx.html +1 -1
- package/coverage/lcov-report/src/views/Search/constants.ts.html +1 -1
- package/coverage/lcov-report/src/views/Search/index.html +1 -1
- package/coverage/lcov-report/src/views/Search/index.ts.html +1 -1
- package/coverage/lcov-report/src/views/Search/testIds.ts.html +1 -1
- package/coverage/lcov-report/src/views/Search/useSearchParam.ts.html +1 -1
- package/coverage/lcov-report/src/views/Search/useUpdateSearchParam.ts.html +1 -1
- package/coverage/lcov-report/src/views/Search/util.ts.html +1 -1
- package/coverage/lcov-report/src/views/SiteTerms/SiteTerms.tsx.html +1 -1
- package/coverage/lcov-report/src/views/SiteTerms/index.html +1 -1
- package/coverage/lcov-report/src/views/SiteTerms/index.ts.html +1 -1
- package/coverage/lcov.info +71 -71
- package/package.json +5 -5
- package/build/static/js/421.ba26527a.chunk.js +0 -2
- package/build/static/js/421.ba26527a.chunk.js.map +0 -1
- /package/build/static/js/{main.0a58dff8.js.LICENSE.txt → main.80cba683.js.LICENSE.txt} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static/js/773.ea0e9610.chunk.js","mappings":"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","sources":["hooks/useLanguage/useLanguage.ts","components/PackageCard/constants.ts","components/PackageCard/testIds.ts","components/PackageCard/Details.tsx","components/PackageCard/EditorsNote.tsx","components/PackageCard/Heading.tsx","components/PackageCard/Highlight.tsx","components/PackageLanguages/PackageLanguages.tsx","components/PackageCard/Languages.tsx","components/PackageCard/Tags.tsx","components/PackageCard/WideCard.tsx","components/PackageCard/PackageCard.tsx","util/package.ts","hooks/useQueryParams/useQueryParams.ts","components/Highlight/Highlight.tsx","components/PackageTag/PackageTag.tsx","views/Search/constants.ts","views/Search/FilterHeading.tsx","views/Search/testIds.ts","views/Search/RadioFilter.tsx","views/Search/util.ts","views/Search/useSearchParam.ts","views/Search/useUpdateSearchParam.ts","views/Search/CDKFilter.tsx","views/Search/CheckboxFilter.tsx","views/Search/KeywordsFilter.tsx","views/Search/LanguageFilter.tsx","views/Search/TagFilter.tsx","views/Search/FilterPanel.tsx","views/Search/ArrowButton.tsx","views/Search/GoToPage.tsx","views/Search/PageControls.tsx","views/Search/SearchBar.tsx","views/Search/SearchDetails.tsx","views/Search/SortFilter.tsx","views/Search/SortAndFilterDrawer.tsx","views/Search/SortedBy.tsx","components/PackageList/WideCardList.tsx","components/PackageList/PackageList.tsx","views/Search/SearchResults.tsx","views/Search/Search.tsx","hooks/useConfigValue/useConfigValue.ts","constants/pageInfo.ts","components/Page/Page.tsx","components/Time/Time.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","export enum PackageCardType {\n Wide = \"wide\",\n}\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"packageCard\", [\n \"author\",\n \"description\",\n \"downloads\",\n \"languages\",\n \"published\",\n \"title\",\n \"version\",\n \"comment\",\n \"wideContainer\",\n] as const);\n\nexport default testIds;\n","import { Text, Tooltip } from \"@chakra-ui/react\";\nimport { formatDistanceToNowStrict } from \"date-fns\";\nimport { FunctionComponent, ReactChild } from \"react\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\nimport { useStats } from \"../../hooks/useStats\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\nimport { Time } from \"../Time\";\n\ninterface DetailProps {\n \"data-testid\": string;\n tooltip?: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n tooltip,\n value,\n}) => (\n <Tooltip hasArrow isDisabled={!tooltip} label={tooltip} placement=\"left\">\n {/* zIndex required to allow tooltip to display due to card link overlay */}\n <Text data-testid={dataTestid} fontSize=\"xs\" zIndex={1}>\n {value}\n </Text>\n </Tooltip>\n);\n\nexport const Details: FunctionComponent = () => {\n const {\n author,\n metadata: { date },\n name,\n } = usePackageCard();\n\n const { data } = useStats();\n const downloads: number | undefined = data?.packages?.[name]?.downloads?.npm;\n\n const authorName = typeof author === \"string\" ? author : author.name;\n const publishDate = new Date(date);\n\n return (\n <>\n {downloads !== undefined && (\n <Detail\n data-testid={testIds.downloads}\n tooltip=\"Download numbers are periodically sourced from the npm registry\"\n value={`${downloads.toLocaleString()} weekly downloads`}\n />\n )}\n <Detail\n data-testid={testIds.published}\n value={\n <Time\n date={publishDate}\n fontSize=\"xs\"\n formattedDate={formatDistanceToNowStrict(publishDate, {\n addSuffix: true,\n })}\n />\n }\n />\n <Detail\n data-testid={testIds.author}\n value={\n <>\n By{\" \"}\n <NavLink\n color=\"link\"\n to={getSearchPath({\n query: authorName,\n })}\n >\n {authorName}\n </NavLink>\n </>\n }\n />\n </>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\n\nexport const EditorsNote: FunctionComponent<{ comment?: string }> = ({\n comment,\n}) => {\n return (\n <Text\n data-testid={testIds.comment}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n <Text as=\"span\" color=\"blue.500\" fontWeight=\"bold\">\n Editor's note:{\" \"}\n </Text>\n {comment}\n </Text>\n );\n};\n","import {\n Flex,\n Heading as ChakraHeading,\n LinkOverlay,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { EditorsNote } from \"./EditorsNote\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { CDKTypeBadge } from \"../CDKType\";\n\nexport const Heading: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n const {\n dataEvent,\n description,\n comment,\n constructFrameworks,\n name,\n version,\n } = usePackageCard();\n\n return (\n <>\n <LinkOverlay\n as={Link}\n data-event={\n dataEvent ? eventName(dataEvent, \"Package Card\", name) : undefined\n }\n to={getPackagePath({\n name,\n version,\n language: currentLanguage,\n })}\n >\n <Flex align=\"center\">\n <CDKTypeBadge\n constructFrameworks={constructFrameworks}\n mr={2}\n zIndex={1}\n />\n <ChakraHeading\n as=\"h3\"\n color=\"textPrimary\"\n data-testid={testIds.title}\n fontSize=\"md\"\n fontWeight=\"bold\"\n wordBreak=\"normal\"\n >\n {name}\n </ChakraHeading>\n </Flex>\n </LinkOverlay>\n {comment ? (\n <EditorsNote comment={comment} />\n ) : (\n <Text\n color=\"textPrimary\"\n data-testid={testIds.description}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n {description || \"No description available.\"}\n </Text>\n )}\n </>\n );\n};\n","import { Box } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { usePackageCard } from \"./PackageCard\";\nimport { highlightsFrom } from \"../../util/package\";\nimport { Highlight as HighlightComponent } from \"../Highlight\";\n\nexport const Highlight: FunctionComponent = () => {\n const { packageTags = [] } = usePackageCard()?.metadata ?? {};\n const [highlight] = highlightsFrom(packageTags);\n\n if (!highlight) return null;\n\n return (\n <Box fontSize=\"xs\">\n <HighlightComponent {...highlight} />\n </Box>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Language,\n LANGUAGES,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getPackagePath } from \"../../util/url\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nconst sizes = {\n sm: 5,\n md: 6,\n lg: 8,\n};\n\nexport interface PackageLanguagesProps {\n isRounded?: boolean;\n languages?: Partial<Record<Language, unknown>>;\n name: string;\n size?: \"sm\" | \"md\" | \"lg\";\n version: string;\n}\n\nexport const PackageLanguages: FunctionComponent<PackageLanguagesProps> = ({\n isRounded = false,\n languages,\n name: packageName,\n size = \"md\",\n version,\n}) => {\n const targets = Object.keys(languages ?? {}) as Language[];\n return (\n <>\n {Object.entries(LANGUAGE_RENDER_MAP)\n // Ensure entries are always sorted in a stable way\n .sort(\n ([left], [right]) =>\n LANGUAGES.indexOf(left as Language) -\n LANGUAGES.indexOf(right as Language)\n )\n .map(([lang, info]) => {\n const language = lang as Language;\n\n const isSupportedByLibrary =\n language === Language.TypeScript || targets.includes(language);\n\n const isSupportedByConstructHub =\n language === Language.TypeScript || // TypeScript is always supported\n // Otherwise, the language must be supported by ConstructHub\n TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (!isSupportedByLibrary) return null;\n\n const { name, icon: Icon } = info;\n\n const icon = (\n <Icon\n aria-label={`Supports ${name}`}\n borderRadius={isRounded ? \"50%\" : 0}\n h={sizes[size]}\n opacity={isSupportedByConstructHub ? 1 : 0.2}\n w={sizes[size]}\n />\n );\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n {isSupportedByConstructHub ? (\n <Link\n aria-label={`View package docs for ${language}`}\n to={getPackagePath({ name: packageName, version, language })}\n >\n {icon}\n </Link>\n ) : (\n icon\n )}\n </LanguageSupportTooltip>\n );\n })}\n </>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { usePackageCard } from \"./PackageCard\";\nimport { PackageLanguages } from \"../PackageLanguages\";\n\nexport const Languages: FunctionComponent = () => {\n const pkg = usePackageCard();\n return <PackageLanguages {...pkg} size=\"sm\" />;\n};\n","import { FunctionComponent } from \"react\";\nimport { usePackageCard } from \"./PackageCard\";\nimport { tagObjectsFrom } from \"../../util/package\";\nimport { PackageTag } from \"../PackageTag\";\n\nexport const Tags: FunctionComponent = () => {\n const {\n keywords = [],\n metadata: { packageTags = [] },\n } = usePackageCard();\n\n const tags = tagObjectsFrom({\n packageTags,\n keywords,\n });\n\n return (\n <>\n {tags.slice(0, 10).map(({ id, keyword: { label, color } = {} }) => (\n <PackageTag key={id} value={id} variant={color}>\n {label}\n </PackageTag>\n ))}\n </>\n );\n};\n","import { Flex, Grid, LinkBox, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Details } from \"./Details\";\nimport { Heading } from \"./Heading\";\nimport { Highlight } from \"./Highlight\";\nimport { Languages } from \"./Languages\";\nimport { Tags } from \"./Tags\";\nimport testIds from \"./testIds\";\n\nexport const WideCard: FunctionComponent = () => {\n return (\n <LinkBox\n _hover={{\n \"> article\": {\n bg: \"hoverPrimary\",\n },\n }}\n >\n <Grid\n as=\"article\"\n bg=\"bgSecondary\"\n border=\"base\"\n borderRadius=\"sm\"\n boxShadow=\"base\"\n color=\"textPrimary\"\n data-testid={testIds.wideContainer}\n h=\"full\"\n minH=\"12.5rem\"\n templateColumns={{ base: \"1fr\", lg: \"1fr 14rem\" }}\n w=\"full\"\n >\n {/* Top / Left side of card */}\n <Flex\n direction=\"column\"\n justify=\"space-between\"\n overflow=\"hidden\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={3}>\n <Heading />\n </Stack>\n\n <Flex align=\"center\" sx={{ gap: \"0.5rem\" }} wrap=\"wrap\">\n <Tags />\n </Flex>\n </Flex>\n\n {/* Bottom / Right side of card */}\n <Flex\n align={{ base: \"end\", lg: \"initial\" }}\n borderLeft={{ lg: \"base\" }}\n borderTop={{ base: \"base\", lg: \"none\" }}\n direction={{ base: \"row\", lg: \"column\" }}\n justify=\"space-between\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={1}>\n <Highlight />\n <Stack spacing={1}>\n <Details />\n </Stack>\n </Stack>\n\n <Stack data-testid={testIds.languages} direction=\"row\" spacing={2}>\n <Languages />\n </Stack>\n </Flex>\n </Grid>\n </LinkBox>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { PackageCardType } from \"./constants\";\nimport { WideCard } from \"./WideCard\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\n\nexport interface PackageCardProps {\n \"data-event\"?: string;\n pkg: ExtendedCatalogPackage;\n variant?: PackageCardType;\n}\n\ninterface PackageCardState extends ExtendedCatalogPackage {\n comment?: string;\n dataEvent?: string;\n}\n\nconst PackageCardContext = createContext<PackageCardState | null>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n \"data-event\": dataEvent,\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={{ ...pkg, dataEvent }}>\n {variant === PackageCardType.Wide && <WideCard />}\n </PackageCardContext.Provider>\n );\n};\n","import { PackageHighlight, PackageTagConfig } from \"../api/config\";\nimport { KEYWORD_IGNORE_LIST } from \"../constants/keywords\";\n\nexport interface TagObject extends PackageTagConfig {}\n\n/**\n * Reduces package tags to only return highlight tags\n */\nexport const highlightsFrom = (packageTags?: PackageTagConfig[]) => {\n if (!packageTags || packageTags.length < 1) return [];\n\n return packageTags.reduce(\n (accum: PackageHighlight[], tag: PackageTagConfig): PackageHighlight[] => {\n if (tag.highlight) {\n return [...accum, tag.highlight];\n }\n\n return accum;\n },\n []\n );\n};\n\n/**\n * Maps packageTags to an array of TagObjects, which can be rendered by the PackageTags Component\n */\nexport const mapPackageTags = (\n packageTags?: PackageTagConfig[]\n): TagObject[] => {\n return (packageTags ?? [])\n .filter((tag) => {\n return Boolean(tag.keyword?.label);\n })\n .map((tag) => ({\n ...tag,\n id: tag.keyword?.label!,\n }));\n};\n\n/**\n * Maps keywords to an array of TagObjects, which can be rendered by the PackageTags component\n */\nexport const mapPackageKeywords = (keywords?: string[]): TagObject[] => {\n if (!keywords || keywords.length < 1) return [];\n\n return keywords\n .filter((label) => Boolean(label) && !KEYWORD_IGNORE_LIST.has(label))\n .map((label) => ({\n id: label,\n keyword: {\n label,\n },\n }));\n};\n\n/**\n * Maps packageTags and keywords to a list of TagObjects, using mapPackageTags and mapPackageKeywords\n */\nexport const tagObjectsFrom = ({\n packageTags,\n keywords,\n}: {\n packageTags?: PackageTagConfig[];\n keywords?: string[];\n}): TagObject[] => {\n const tagObjects = new Array<TagObject>();\n const tagLabels = new Set<string>();\n\n for (const tag of [\n ...mapPackageTags(packageTags),\n ...mapPackageKeywords(keywords),\n ]) {\n const label = tag.keyword!.label.toLowerCase();\n if (!tagLabels.has(label)) {\n tagObjects.push(tag);\n tagLabels.add(label);\n }\n }\n\n return tagObjects;\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { Stack, Image, Text, useColorModeValue } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\ninterface HighlightProps {\n label: string;\n color?: string;\n icon?: string;\n}\n\nexport const Highlight: FunctionComponent<HighlightProps> = ({\n label,\n color,\n icon,\n}: HighlightProps) => {\n const brightness = useColorModeValue(\"none\", \"brightness(1.75)\");\n return (\n <Stack align=\"center\" direction=\"row\" filter={brightness} spacing={2}>\n <Image alt={`${label} icon`} src={icon} w={4} />\n <Text color={color} fontWeight=\"bold\">\n {label}\n </Text>\n </Stack>\n );\n};\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ keywords: [value] })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport type { QueryParamKey } from \"../../constants/url\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nconst LIMITS = [25, 50, 75, 100];\nexport const LIMIT = LIMITS[0];\n\nexport type SearchQueryParam = Extract<QueryParamKey, \"offset\" | \"q\">;\n\nexport const SORT_RENDER_MAP = {\n [CatalogSearchSort.NameAsc]: \"A-Z\",\n [CatalogSearchSort.NameDesc]: \"Z-A\",\n [CatalogSearchSort.PublishDateAsc]: \"Oldest\",\n [CatalogSearchSort.PublishDateDesc]: \"Recently updated\",\n [CatalogSearchSort.DownloadsDesc]: \"Most downloads\",\n [CatalogSearchSort.DownloadsAsc]: \"Least downloads\",\n};\n\nconst searchEvent: typeof eventName = (...e) => eventName(\"Search\", ...e);\n\nexport const SEARCH_ANALYTICS = {\n FILTERS: searchEvent(\"Filters\"),\n RESULTS: searchEvent(\"Results\"),\n SEARCH: searchEvent(\"Search\"),\n SORT: searchEvent(\"Sort\"),\n};\n","import { QuestionIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Heading,\n Text,\n Popover,\n PopoverTrigger,\n PopoverBody,\n PopoverArrow,\n PopoverContent,\n useBreakpointValue,\n PlacementWithLogical,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport interface FilterHeadingProps {\n name: string;\n hint?: string;\n}\n\nexport const FilterHeading: FunctionComponent<FilterHeadingProps> = ({\n name,\n hint,\n}) => {\n const placement = useBreakpointValue<PlacementWithLogical>({\n base: \"auto\",\n md: \"right\",\n });\n\n return (\n <Flex align=\"center\" mb={1}>\n <Heading as=\"h3\" size=\"sm\" w=\"max-content\">\n {name}\n </Heading>\n {hint ? (\n <Popover colorScheme=\"dark\" placement={placement} strategy=\"fixed\">\n <PopoverTrigger>\n <Flex\n aria-label={`Hint: ${name}`}\n as=\"button\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Popover\")}\n ml={2}\n >\n <QuestionIcon h={3.5} w={3.5} />\n </Flex>\n </PopoverTrigger>\n <PopoverContent\n bg=\"gray.700\"\n borderRadius=\"base\"\n color=\"white\"\n fontSize=\"sm\"\n mx={{ base: \"1rem\", md: \"initial\" }}\n shadow=\"whiteAlpha.300\"\n >\n <PopoverArrow bg=\"gray.700\" />\n <PopoverBody>\n <Text>{hint}</Text>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n ) : null}\n </Flex>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"searchRedesign\", [\n \"page\",\n // Results\n \"searchDetails\",\n \"nextPage\",\n \"prevPage\",\n \"goToPage\",\n // Sorting\n \"sortButton\",\n \"sortDropdown\",\n \"sortItem\",\n // Filters Panel\n \"filtersPanel\",\n \"cdkTypeFilter\",\n \"cdkVersionFilter\",\n \"filterItem\",\n \"languagesFilter\",\n] as const);\n","import { Radio, RadioGroup, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport interface RadioFilterProps extends FilterHeadingProps {\n \"data-testid\"?: string;\n value?: string;\n onValueChange: (value: string) => void;\n options: {\n display: string;\n value: string;\n }[];\n}\n\nexport const RadioFilter: FunctionComponent<RadioFilterProps> = ({\n \"data-testid\": dataTestid,\n value: checkedValue,\n onValueChange,\n options,\n name,\n hint,\n}) => {\n return (\n <Stack data-testid={dataTestid} spacing={1}>\n <FilterHeading hint={hint} name={name} />\n <RadioGroup onChange={onValueChange} value={checkedValue}>\n <Stack spacing={1}>\n {options.map(({ display, value }) => {\n const dataEvent = eventName(\n SEARCH_ANALYTICS.FILTERS,\n name,\n \"Filter\",\n display\n );\n return (\n <Radio data-event={dataEvent} key={value} value={value}>\n <Text\n color=\"textTertiary\"\n data-event={dataEvent}\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Radio>\n );\n })}\n </Stack>\n </RadioGroup>\n </Stack>\n );\n};\n","import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\n\nexport const toNum = (val: string) => {\n const result = parseInt(val);\n\n if (`${result}` === \"NaN\") {\n return 0;\n }\n\n return result;\n};\n\nexport const parseQueryArray = <T extends string>(\n queryString: string | null\n) => {\n if (!queryString) return [];\n\n return decodeURIComponent(queryString).split(\",\") as T[];\n};\n\nconst getParamFromUrl = (key: string) => {\n if (typeof window === \"undefined\") return null;\n const queryParams = new URL(window.location.href).searchParams;\n return queryParams.get(key);\n};\n\nexport const getSearchUrlParams = () => {\n return {\n query: getParamFromUrl(QUERY_PARAMS.SEARCH_QUERY) ?? \"\",\n keywords: parseQueryArray(getParamFromUrl(QUERY_PARAMS.KEYWORDS)),\n cdkType: (getParamFromUrl(QUERY_PARAMS.CDK_TYPE) as CDKType) ?? undefined,\n cdkMajor: (() => {\n const cdkMajorParam = getParamFromUrl(QUERY_PARAMS.CDK_MAJOR);\n return cdkMajorParam ? toNum(cdkMajorParam) : undefined;\n })(),\n languages: parseQueryArray(\n getParamFromUrl(QUERY_PARAMS.LANGUAGES)\n ) as Language[],\n offset: toNum(getParamFromUrl(QUERY_PARAMS.OFFSET) ?? \"\"),\n sort:\n (getParamFromUrl(QUERY_PARAMS.SORT) as CatalogSearchSort) ?? undefined,\n tags: parseQueryArray(getParamFromUrl(QUERY_PARAMS.TAGS)),\n };\n};\n","import { useMemo } from \"react\";\nimport { parseQueryArray, toNum } from \"./util\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\nconst useSearchParam = <T = string | null>(\n key: string,\n transform?: (param: string | null) => T\n): T => {\n const queryParams = useQueryParams();\n const qp = queryParams.get(key);\n\n return useMemo(\n () => (transform ? transform(qp) : (qp as unknown as T)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [qp]\n );\n};\n\nexport const useCdkType = () => {\n const cdkType: CDKType | undefined =\n useSearchParam(QUERY_PARAMS.CDK_TYPE) ?? undefined;\n\n return cdkType;\n};\n\nexport const useCdkMajor = () => {\n const cdkMajor: number | undefined = useSearchParam(\n QUERY_PARAMS.CDK_MAJOR,\n (p) => (p ? toNum(p) : undefined)\n );\n\n return cdkMajor;\n};\n\nexport const useKeywords = () => {\n const keywords: string[] = useSearchParam(\n QUERY_PARAMS.KEYWORDS,\n parseQueryArray\n );\n\n return keywords;\n};\n\nexport const useLanguages = () => {\n const languages: Language[] = useSearchParam(\n QUERY_PARAMS.LANGUAGES,\n parseQueryArray\n ) as Language[];\n\n return languages;\n};\n\nexport const useOffset = () => {\n const offset = useSearchParam(QUERY_PARAMS.OFFSET, (o) => toNum(o ?? \"\"));\n return offset;\n};\n\nexport const useSearchQuery = () => {\n const query: string = useSearchParam(QUERY_PARAMS.SEARCH_QUERY) ?? \"\";\n return query;\n};\n\nexport const useSort = () => {\n const sort: CatalogSearchSort | undefined =\n useSearchParam(QUERY_PARAMS.SORT) ?? undefined;\n return sort;\n};\n\nexport const useTags = () => {\n const tags: string[] = useSearchParam(QUERY_PARAMS.TAGS, parseQueryArray);\n return tags;\n};\n","import { useCallback } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { getSearchUrlParams } from \"./util\";\nimport { getSearchPath } from \"../../util/url\";\n\nexport const useUpdateSearchParam = () => {\n const { push } = useHistory();\n\n return useCallback(\n (p?: Partial<Parameters<typeof getSearchPath>[0]>) => {\n const { offset, ...params } = p ?? {};\n\n push(\n getSearchPath({\n ...getSearchUrlParams(),\n ...params,\n offset: offset ?? 0,\n })\n );\n },\n [push]\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport testIds from \"./testIds\";\nimport { useCdkMajor, useCdkType } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { CatalogConstructFrameworkMeta } from \"../../api/catalog-search\";\nimport { CDKType, CDKTYPE_NAME_MAP } from \"../../constants/constructs\";\nimport { useSearchContext } from \"../../contexts/Search\";\n\ntype CDKOptions = Partial<{\n [key in CDKType]: CatalogConstructFrameworkMeta & {\n display: string;\n value: key;\n };\n}>;\n\nexport const CDKFilter: FunctionComponent = () => {\n const cdkType = useCdkType();\n const cdkMajor = useCdkMajor();\n\n const updateSearch = useUpdateSearchParam();\n\n const searchAPI = useSearchContext()!;\n\n // Options with less than one package will be omitted\n const cdkOptions = useMemo(() => {\n const cdkTypes = searchAPI.constructFrameworks;\n const options = Object.entries(cdkTypes).reduce((opts, [name, meta]) => {\n if (meta.pkgCount < 1) {\n return opts;\n }\n\n return {\n ...opts,\n [name]: {\n display: CDKTYPE_NAME_MAP[name as CDKType],\n value: name,\n ...meta,\n },\n };\n }, {});\n\n return Object.keys(options).length ? (options as CDKOptions) : undefined;\n }, [searchAPI]);\n\n const majorsOptions = useMemo(() => {\n if (!cdkOptions || !cdkType) return undefined;\n const majorVersions = cdkOptions[cdkType]?.majorVersions;\n\n if (!majorVersions) return undefined;\n\n return [...majorVersions]\n .sort((a, b) => a - b)\n .map((value) => ({\n value: value.toString(),\n display: `${CDKTYPE_NAME_MAP[cdkType]} v${value}`,\n }));\n }, [cdkOptions, cdkType]);\n\n if (!cdkOptions) {\n return null;\n }\n\n const onCdkTypeChange = (type: string) => {\n const cdk = type as CDKType;\n updateSearch({ cdkType: type ? cdk : undefined, cdkMajor: undefined });\n };\n\n const onCdkMajorChange = (major: string) => {\n let majorNum: number | undefined = undefined;\n\n if (major) {\n majorNum = parseInt(major, 10);\n }\n\n updateSearch({ cdkMajor: majorNum });\n };\n\n return (\n <>\n <RadioFilter\n data-testid={testIds.cdkTypeFilter}\n hint=\"Choose the right CDK for your IaC technology: AWS CDK for AWS CloudFormation, CDKTF for Terraform, or CDK8s for Kubernetes.\"\n name=\"CDK Type\"\n onValueChange={onCdkTypeChange}\n options={[\n { display: \"Any CDK Type\", value: \"\" },\n ...Object.values(cdkOptions),\n ]}\n value={cdkType ?? \"\"}\n />\n {/* No point in showing major versions if only a single one is available */}\n {!!(majorsOptions && majorsOptions.length > 1) && (\n <RadioFilter\n data-testid={testIds.cdkVersionFilter}\n hint=\"Choose the major version of the CDK you're using to see only constructs that will work with that version.\"\n name=\"CDK Major Version\"\n onValueChange={onCdkMajorChange}\n options={[\n { display: \"Any Major Version\", value: \"\" },\n ...majorsOptions,\n ]}\n value={cdkMajor?.toString() ?? \"\"}\n />\n )}\n </>\n );\n};\n","import { ChevronDownIcon, ChevronUpIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Button,\n Collapse,\n Checkbox,\n Stack,\n Text,\n Tooltip,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\nimport { clickEvent, eventName, useAnalytics } from \"../../contexts/Analytics\";\n\ninterface CheckboxOption {\n display: string;\n value: string;\n isDisabled?: boolean;\n disabledHint?: string;\n}\n\ninterface CheckboxItemProps extends CheckboxOption {\n onChange: () => void;\n isChecked: boolean;\n}\n\nexport interface CheckboxFilterProps extends FilterHeadingProps {\n /**\n * Test ID to select checkbox in tests\n */\n \"data-testid\"?: string;\n /**\n * Number of items that can be initially shown\n */\n initialItemCount?: number;\n /**\n * Defines checkbox items\n */\n options: CheckboxOption[];\n /**\n * Selected values\n */\n values: string[];\n /**\n * Callback triggered when an item is clicked\n */\n onValueChange: (value: string) => void;\n}\n\nconst CheckboxItem: FunctionComponent<CheckboxItemProps> = ({\n display,\n value,\n isDisabled,\n disabledHint,\n isChecked,\n onChange,\n}) => (\n <Checkbox\n isChecked={isChecked}\n isDisabled={isDisabled}\n key={value}\n onChange={onChange}\n >\n <Tooltip\n hasArrow\n isDisabled={!isDisabled && !disabledHint}\n label={disabledHint}\n placement=\"right\"\n >\n <Text\n color=\"textTertiary\"\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Tooltip>\n </Checkbox>\n);\n\nexport const CheckboxFilter: FunctionComponent<CheckboxFilterProps> = ({\n \"data-testid\": dataTestid,\n initialItemCount,\n hint,\n name,\n options,\n values: checkedValues,\n onValueChange,\n}) => {\n const collapse = useDisclosure();\n const { trackCustomEvent } = useAnalytics();\n\n const getOnChange = (item: CheckboxOption) => () => {\n trackCustomEvent(\n clickEvent({\n name: eventName(SEARCH_ANALYTICS.FILTERS, name, \"Filter\", item.display),\n })\n );\n onValueChange(item.value);\n };\n\n let alwaysShow: typeof options = options;\n let showWhenExpanded: typeof options = [];\n\n if (initialItemCount) {\n alwaysShow = options.slice(0, initialItemCount);\n showWhenExpanded = options.slice(initialItemCount, options.length);\n }\n\n const isExpandible = showWhenExpanded.length > 0;\n\n return (\n <Flex data-testid={dataTestid} direction=\"column\">\n <FilterHeading hint={hint} name={name} />\n <Stack mt={1} spacing={1}>\n {alwaysShow.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n {isExpandible && (\n <Collapse animateOpacity in={collapse.isOpen} unmountOnExit>\n <Stack spacing={1}>\n {showWhenExpanded.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n </Stack>\n </Collapse>\n )}\n </Stack>\n {isExpandible && (\n <Flex align=\"start\" mt={1}>\n <Button\n color=\"textTertiary\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Show More\")}\n fontWeight=\"normal\"\n leftIcon={collapse.isOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}\n onClick={collapse.onToggle}\n size=\"sm\"\n textAlign=\"left\"\n variant=\"link\"\n w=\"auto\"\n >\n {collapse.isOpen\n ? `Show fewer options (${alwaysShow.length})`\n : `Show more options (${showWhenExpanded.length})`}\n </Button>\n </Flex>\n )}\n </Flex>\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport testIds from \"./testIds\";\nimport { useKeywords } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { useSearchContext } from \"../../contexts/Search\";\n\nexport const KeywordsFilter: FunctionComponent = () => {\n const keywords = useKeywords();\n const keywordMap = useSearchContext()!.keywords;\n const updateSearch = useUpdateSearchParam();\n\n const onKeywordChange = (keyword: string) => {\n updateSearch({\n keywords: keywords.includes(keyword)\n ? keywords.filter((k) => k !== keyword)\n : [...keywords, keyword],\n });\n };\n\n const keywordOptions = useMemo(() => {\n const baseOptions = [...keywordMap.entries()]\n .sort(([, count1], [, count2]) => {\n return count1 < count2 ? 1 : -1;\n })\n .filter(([keyword]) => !keywords.includes(keyword))\n .map(([keyword]) => ({\n display: keyword,\n value: keyword,\n }))\n .slice(0, 25);\n\n const keywordsNotInOptions = keywords.filter(\n (k) => !baseOptions.some((opt) => opt.value === k)\n );\n\n return [\n ...keywordsNotInOptions.map((k) => ({ display: k, value: k })),\n ...baseOptions,\n ];\n }, [keywordMap, keywords]);\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Focus the results by choosing one or more keywords reflecting the kind of construct you're looking for. Keywords are provided by construct authors.\"\n initialItemCount={5}\n name=\"Keywords\"\n onValueChange={onKeywordChange}\n options={keywordOptions}\n values={keywords}\n />\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport testIds from \"./testIds\";\nimport { useLanguages } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nconst languageOptions = Object.entries(LANGUAGE_NAME_MAP)\n .map(([key, value]) => ({\n display: value,\n value: key,\n ...(TEMP_SUPPORTED_LANGUAGES.has(key as Language)\n ? { isDisabled: false }\n : {\n isDisabled: true,\n disabledHint: `${\n LANGUAGE_NAME_MAP[key as Language]\n } support is coming soon!`,\n }),\n }))\n .sort((l1, l2) => {\n // Push disabled languages to back of list\n return l1.isDisabled > l2.isDisabled ? 1 : -1;\n });\n\nexport const LanguageFilter: FunctionComponent = () => {\n const languages = useLanguages();\n\n const updateSearch = useUpdateSearchParam();\n\n const onLanguagesChange = (lang: string) => {\n const language = lang as Language;\n\n updateSearch({\n languages: languages.includes(language)\n ? languages.filter((l) => l !== language)\n : [...languages, language],\n });\n };\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Choose one or more languages. Results include constructs for use with at least one of the selected languages.\"\n name=\"Programming Language\"\n onValueChange={onLanguagesChange}\n options={languageOptions}\n values={languages}\n />\n );\n};\n","import { FunctionComponent, useCallback, useMemo } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useTags } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { PackageTagConfig, TagGroupConfig } from \"../../api/config\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\n\ninterface FilterGroup extends Partial<TagGroupConfig> {\n id: string;\n tags: PackageTagConfig[];\n}\ninterface FilterGroups {\n [group: string]: FilterGroup;\n}\n\n/**\n * Creates a plain object map of FilterGroups keyed by group id\n */\nexport const mapTagsToFilterGroups = (\n packageTags: PackageTagConfig[],\n tagGroupsMap: Map<string, TagGroupConfig>\n): FilterGroups => {\n return packageTags.reduce(\n (accum: FilterGroups, tag: PackageTagConfig): FilterGroups => {\n const groupIdOrName = tag.searchFilter?.groupBy;\n const customGroup = groupIdOrName\n ? tagGroupsMap.get(groupIdOrName)\n : undefined;\n\n if (groupIdOrName && customGroup) {\n const entry = accum[groupIdOrName];\n if (entry) {\n entry.tags = [...entry.tags, tag];\n return accum;\n }\n\n return {\n ...accum,\n [groupIdOrName]: {\n ...customGroup,\n tags: [tag],\n },\n };\n }\n\n if (groupIdOrName) {\n return {\n ...accum,\n [groupIdOrName]: {\n id: groupIdOrName,\n tags: [...(accum?.[groupIdOrName]?.tags ?? []), tag],\n },\n };\n }\n return accum;\n },\n {}\n );\n};\n\nexport const TagFilter: FunctionComponent = () => {\n const packageTags = useConfigValue(\"packageTags\");\n const packageTagGroups = useConfigValue(\"packageTagGroups\");\n\n const tagFilterGroups: FilterGroups = useMemo(() => {\n const tagGroupsMap = new Map<string, TagGroupConfig>();\n packageTagGroups?.forEach((group) => {\n tagGroupsMap.set(group.id, group);\n });\n\n const filterableTags =\n packageTags?.filter((tag) => Boolean(tag.searchFilter)) ?? [];\n\n return mapTagsToFilterGroups(filterableTags, tagGroupsMap);\n }, [packageTags, packageTagGroups]);\n\n const tags = useTags();\n const updateSearch = useUpdateSearchParam();\n\n const onTagsChange = (tag: string) => {\n updateSearch({\n tags: tags.includes(tag) ? tags.filter((t) => t !== tag) : [...tags, tag],\n });\n };\n\n const getOnRadioTagChange = useCallback(\n (groupName: string) => {\n const groupTags = new Set(\n (tagFilterGroups[groupName]?.tags ?? []).map(({ id }) => id)\n );\n\n return (tag: string) => {\n const filteredTags = tags.filter((t) => !groupTags.has(t));\n\n updateSearch({\n tags: tag ? [...filteredTags, tag] : filteredTags,\n });\n };\n },\n [tagFilterGroups, tags, updateSearch]\n );\n\n return (\n <>\n {Object.values(tagFilterGroups).map(\n ({ filterType, id, label, tooltip, tags: tagItems }) => {\n const sharedProps = {\n hint: tooltip,\n name: label ?? id,\n options: tagItems.map((tag) => {\n return {\n display: tag.searchFilter!.display,\n value: tag.id,\n };\n }),\n };\n\n if (filterType === \"radio\") {\n return (\n <RadioFilter\n {...sharedProps}\n key={id}\n onValueChange={getOnRadioTagChange(id)}\n options={[\n { display: `Any ${sharedProps.name}`, value: \"\" },\n ...sharedProps.options,\n ]}\n value={tagItems.find((t) => tags.includes(t.id))?.id ?? \"\"}\n />\n );\n }\n\n return (\n <CheckboxFilter\n {...sharedProps}\n key={id}\n onValueChange={onTagsChange}\n values={tags}\n />\n );\n }\n )}\n </>\n );\n};\n","import { Heading, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { TagFilter } from \"./TagFilter\";\nimport testIds from \"./testIds\";\nimport { Card } from \"../../components/Card\";\n\nexport interface FilterPanelProps {}\n\n// Header height + section padding\nconst TOP_OFFSET = \"5.75rem\";\n\n/**\n * The desktop Resolution Filter Panel\n */\nexport const FilterPanel: FunctionComponent<FilterPanelProps> = () => {\n return (\n <Card\n borderRadius=\"sm\"\n data-testid={testIds.filtersPanel}\n display={{ base: \"none\", md: \"flex\" }}\n maxH={`calc(100vh - ${TOP_OFFSET} - 1.25rem)`}\n maxW=\"23rem\"\n minW=\"100%\"\n overflow=\"hidden auto\"\n p={4}\n pos=\"sticky\"\n top={TOP_OFFSET}\n zIndex=\"docked\"\n >\n <Stack color=\"textPrimary\" h=\"max-content\" spacing={4} top={4}>\n <Heading as=\"h2\" size=\"sm\">\n Filters\n </Heading>\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\n </Stack>\n </Card>\n );\n};\n","import { IconButton, IconProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface ArrowButtonProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n icon: FunctionComponent<IconProps>;\n label: string;\n onClick?: () => void;\n}\n\nexport const ArrowButton: FunctionComponent<ArrowButtonProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n icon: Icon,\n label,\n onClick,\n}) => {\n const props = {\n \"aria-label\": label,\n borderRadius: \"md\",\n borderColor: \"blue.500\",\n colorScheme: \"blue\",\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n icon: <Icon color=\"blue.500\" h={5} w={5} />,\n mx: 2,\n h: 10,\n w: 10,\n variant: \"outline\",\n };\n\n return <IconButton {...props} disabled={!onClick} onClick={onClick} />;\n};\n","import { Flex, Input, Text } from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n SyntheticEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { clickEvent, useAnalytics } from \"../../contexts/Analytics\";\n\nexport interface GoToPageProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n pageLimit: number;\n offset: number;\n}\n\nexport const GoToPage: FunctionComponent<GoToPageProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n pageLimit,\n offset,\n}) => {\n const updateSearch = useUpdateSearchParam();\n const { trackCustomEvent } = useAnalytics();\n const [inputValue, setInputValue] = useState((offset + 1).toString());\n\n useEffect(() => {\n setInputValue((offset + 1).toString());\n }, [offset]);\n\n const onInputChange = (e: SyntheticEvent<HTMLInputElement>) => {\n e.preventDefault();\n setInputValue((e.target as HTMLInputElement).value);\n };\n\n const onSubmit: FormEventHandler<HTMLInputElement> = (e) => {\n e.preventDefault();\n updateSearch({ offset: parseInt(inputValue) - 1 });\n };\n\n return (\n <Flex align=\"center\" as=\"form\" mx={2} onSubmit={onSubmit}>\n <Input\n aria-label=\"Jump to page\"\n colorScheme=\"brand\"\n data-testid={dataTestid}\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n onFocus={() => {\n if (dataEvent) {\n trackCustomEvent(clickEvent({ name: dataEvent }));\n }\n }}\n p={0}\n textAlign=\"center\"\n type=\"number\"\n value={inputValue}\n w={10}\n />\n <Text ml={2} w=\"max-content\">\n of {pageLimit + 1}\n </Text>\n </Flex>\n );\n};\n","import { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ArrowButton } from \"./ArrowButton\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { GoToPage } from \"./GoToPage\";\nimport testIds from \"./testIds\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport interface PageControlsProps {\n offset: number;\n pageLimit: number;\n}\n\nexport const PageControls: FunctionComponent<PageControlsProps> = ({\n offset,\n pageLimit,\n}) => {\n const updateSearch = useUpdateSearchParam();\n const goForward =\n offset < pageLimit ? () => updateSearch({ offset: offset + 1 }) : undefined;\n const goBack =\n offset > 0 ? () => updateSearch({ offset: offset - 1 }) : undefined;\n\n return (\n <Stack\n align=\"center\"\n direction=\"row\"\n justify=\"space-between\"\n maxW=\"18rem\"\n mx=\"auto\"\n spacing={4}\n w=\"full\"\n >\n <ArrowButton\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Previous Page\")}\n data-testid={testIds.prevPage}\n icon={ChevronLeftIcon}\n label=\"Previous page button\"\n onClick={goBack}\n />\n <GoToPage\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Go to Page\")}\n data-testid={testIds.goToPage}\n offset={offset}\n pageLimit={pageLimit}\n />\n <ArrowButton\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Next Page\")}\n data-testid={testIds.nextPage}\n icon={ChevronRightIcon}\n label=\"Next page button\"\n onClick={goForward}\n />\n </Stack>\n );\n};\n","import { FunctionComponent, useState } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { useSearchQuery } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { SearchBar as SearchBarComponent } from \"../../components/SearchBar\";\n\nexport const SearchBar: FunctionComponent = () => {\n const query = useSearchQuery();\n const updateSearch = useUpdateSearchParam();\n\n const [value, setValue] = useState(query ?? \"\");\n\n return (\n <SearchBarComponent\n bg=\"bgSecondary\"\n data-event={SEARCH_ANALYTICS.SEARCH}\n onChange={(e) => setValue(e.target.value)}\n onSubmit={(e) => {\n e.preventDefault();\n\n updateSearch({\n query: value,\n sort: undefined,\n });\n }}\n value={value}\n />\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\n\nexport interface SearchDetailsProps {\n limit: number;\n offset: number;\n count: number;\n filtered: boolean;\n query?: string;\n}\n\nconst Em: FunctionComponent = ({ children }) => (\n <Text as=\"strong\" color=\"textSecondary\">\n {children}\n </Text>\n);\n\nconst Count: FunctionComponent<{\n first: number;\n count: number;\n last: number;\n}> = ({ first, count, last }) => {\n if (!first && last >= count) {\n return (\n <>\n <Em>{count}</Em> of <Em>{count}</Em>\n </>\n );\n }\n\n return (\n <>\n <Em>\n {count ? first + 1 : count} - {last > count ? count : last}\n </Em>{\" \"}\n of <Em>{count}</Em>\n </>\n );\n};\n\nexport const SearchDetails: FunctionComponent<SearchDetailsProps> = ({\n limit,\n offset,\n count,\n filtered,\n query,\n}) => {\n const first = limit * offset;\n const last = first + limit;\n const hasResults = count > 0;\n\n return (\n <Text data-testid={testIds.searchDetails}>\n {hasResults ? (\n <>\n Displaying <Count count={count} first={first} last={last} />{\" \"}\n {filtered ? \"search results\" : \"constructs\"}\n </>\n ) : (\n <>{filtered ? \"There were no search results\" : \"No constructs found\"}</>\n )}\n {query && (\n <>\n {\" for \"}\n <Em>{query}</Em>\n </>\n )}\n .{!hasResults && filtered && <> Try a different term.</>}\n </Text>\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { SORT_RENDER_MAP } from \"./constants\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useSort } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\n\nexport const SortFilter: FunctionComponent = () => {\n const sort = useSort();\n const updateSearch = useUpdateSearchParam();\n\n const onSortChange = (newSort: string) => {\n updateSearch({\n sort: newSort ? (newSort as CatalogSearchSort) : undefined,\n });\n };\n\n return (\n <RadioFilter\n hint=\"Sets the order of search results\"\n name=\"Sorted By\"\n onValueChange={onSortChange}\n options={[\n { display: \"Relevance\", value: \"\" },\n ...Object.entries(SORT_RENDER_MAP).map(([value, display]) => ({\n display,\n value,\n })),\n ]}\n value={sort ?? \"\"}\n />\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Drawer,\n Stack,\n DrawerBody,\n DrawerHeader,\n DrawerOverlay,\n DrawerContent,\n DrawerCloseButton,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { SortFilter } from \"./SortFilter\";\nimport { TagFilter } from \"./TagFilter\";\n\n/**\n * The mobile filter Drawer (Bottomsheet in iOS terminology)\n */\nexport const SortAndFilterDrawer: FunctionComponent = () => {\n const drawer = useDisclosure();\n return (\n <>\n <Button\n colorScheme=\"brand\"\n display={{ md: \"none\" }}\n onClick={drawer.onOpen}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n Sorting and Filters\n </Button>\n <Drawer {...drawer} placement=\"bottom\">\n <DrawerOverlay />\n\n <DrawerContent color=\"textPrimary\" maxH=\"full\">\n <DrawerHeader borderBottom=\"base\">Sorting and Filters</DrawerHeader>\n\n <DrawerCloseButton />\n\n <DrawerBody>\n <Stack color=\"textPrimary\" pb={4} spacing={4}>\n <SortFilter />\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\n </Stack>\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </>\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Text,\n Menu,\n MenuButton,\n MenuList,\n MenuItem,\n Button,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS, SORT_RENDER_MAP } from \"./constants\";\nimport testIds from \"./testIds\";\nimport { useSort } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport const SortedBy: FunctionComponent = () => {\n const sort = useSort();\n const updateSearch = useUpdateSearchParam();\n\n const selected = sort ? SORT_RENDER_MAP[sort] : \"Relevance\";\n\n return (\n <Flex align=\"center\">\n <Text>Sorted by</Text>\n <Menu>\n <MenuButton\n as={Button}\n color=\"link\"\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Menu\")}\n data-testid={testIds.sortButton}\n ml={2}\n pl={2} // For some reason, the px shorthand doesn't work on this Button\n pr={2}\n py={1}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n {selected}\n </MenuButton>\n <MenuList data-testid={testIds.sortDropdown} minW=\"180\" zIndex=\"sticky\">\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", \"Relevance\")}\n data-testid={testIds.sortItem}\n data-value=\"\"\n key=\"Relevance\"\n onClick={() => updateSearch({ sort: undefined })}\n >\n Relevance\n </MenuItem>\n {Object.entries(SORT_RENDER_MAP).map(([value, display]) => (\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", display)}\n data-testid={testIds.sortItem}\n data-value={value}\n key={value}\n onClick={() => updateSearch({ sort: value as CatalogSearchSort })}\n >\n {display}\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n </Flex>\n );\n};\n","import { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageListViewProps } from \"./PackageList\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\n\nexport const WideCardList: FunctionComponent<PackageListViewProps> = ({\n \"data-event\": dataEvent,\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n data-event={dataEvent}\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { WideCardList } from \"./WideCardList\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\nimport { PackageCardType } from \"../PackageCard\";\n\nconst listViews = {\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n \"data-event\"?: string;\n items: ExtendedCatalogPackage[];\n}\n\nexport interface PackageListProps extends Partial<PackageListViewProps> {\n cardView?: PackageCardType;\n loading?: boolean;\n title?: string;\n}\n\nexport const PackageList: FunctionComponent<PackageListProps> = memo(\n ({\n \"data-event\": dataEvent,\n cardView = PackageCardType.Wide,\n items,\n loading,\n }) => {\n if (loading || !items) {\n return (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const View = listViews[cardView];\n\n return <View data-event={dataEvent} items={items} />;\n }\n);\n\nPackageList.displayName = \"PackageList\";\n","import { Box, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { LIMIT, SEARCH_ANALYTICS } from \"./constants\";\nimport { PageControls } from \"./PageControls\";\nimport { SearchBar } from \"./SearchBar\";\nimport { SearchDetails } from \"./SearchDetails\";\nimport { SortAndFilterDrawer } from \"./SortAndFilterDrawer\";\nimport { SortedBy } from \"./SortedBy\";\nimport {\n useCdkType,\n useCdkMajor,\n useKeywords,\n useLanguages,\n useOffset,\n useSearchQuery,\n useSort,\n useTags,\n} from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\n\nexport const SearchResults: FunctionComponent = () => {\n const updateSearch = useUpdateSearchParam();\n\n const offset = useOffset();\n const query = useSearchQuery();\n const keywords = useKeywords();\n const languages = useLanguages();\n const cdkMajor = useCdkMajor();\n const cdkType = useCdkType();\n const sort = useSort();\n const tags = useTags();\n\n const { page, pageLimit, results } = useCatalogResults({\n offset,\n limit: LIMIT,\n query,\n keywords,\n languages,\n cdkMajor,\n cdkType,\n sort,\n tags,\n });\n\n // Resets the page number to 1 if query param offset is below 0, or to the last page if offset is higher than page count\n useEffect(() => {\n // If the query has results but the page has nothing to show...\n if (results.length && (offset < 0 || offset > pageLimit)) {\n // Handle an out of bounds offset\n if (offset < 0) {\n updateSearch({ offset: 0 });\n } else {\n // Offset is too large, just take last page\n updateSearch({ offset: pageLimit });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [results, offset, pageLimit]);\n\n // Scroll to top on page change\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [page]);\n\n return (\n <Page\n meta={{\n title: query || \"Search\",\n description: query\n ? `${results.length} results for ${query} at Construct Hub`\n : \"Search reusable components for your cloud application\",\n }}\n pageName=\"search\"\n >\n <Stack direction=\"column\" maxW=\"100vw\" pb={4} px={4} spacing={4}>\n <SearchBar />\n\n <Stack\n align={{ base: \"start\", lg: \"center\" }}\n direction={{ base: \"column-reverse\", lg: \"row\" }}\n justify={{ base: \"initial\", lg: \"space-between\" }}\n spacing={4}\n >\n <SearchDetails\n count={results.length}\n filtered={!!query}\n limit={LIMIT}\n offset={offset}\n query={query}\n />\n\n <Box display={{ base: \"none\", md: \"initial\" }}>\n <SortedBy />\n </Box>\n\n <Box display={{ md: \"none\" }}>\n <SortAndFilterDrawer />\n </Box>\n </Stack>\n\n <PackageList data-event={SEARCH_ANALYTICS.RESULTS} items={page} />\n\n <Box w=\"full\">\n <PageControls offset={offset} pageLimit={pageLimit} />\n </Box>\n </Stack>\n </Page>\n );\n};\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { FilterPanel } from \"./FilterPanel\";\nimport { SearchResults } from \"./SearchResults\";\nimport testIds from \"./testIds\";\nimport { Page } from \"../../components/Page\";\n\nexport const Search: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Search - Construct Hub\",\n description: \"Search Construct Libraries for AWS CDK, CDK8s, and CDKTF\",\n }}\n pageName=\"search\"\n >\n <Grid\n data-testid={testIds.page}\n gap={4}\n h=\"full\"\n maxW=\"100%\"\n px={{ base: 0, md: 6 }}\n py={6}\n templateColumns={{ base: \"1fr\", md: \"auto 1fr\" }}\n templateRows=\"1fr\"\n >\n {/* Filter Panel Desktop */}\n <FilterPanel />\n\n {/* Results, Info, and Controls */}\n <SearchResults />\n </Grid>\n </Page>\n );\n};\n","import type { Config } from \"../../api/config\";\nimport { useConfig } from \"../../contexts/Config\";\n\nexport const useConfigValue = <T extends keyof Config>(key: T) => {\n const { data } = useConfig();\n return (data ?? {})[key];\n};\n","export const pageInfo = {\n contribute: {\n event: {\n name: \"Contribute Load\",\n },\n },\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\n// Should be the same as the \"real\" CSP, except most things come from HTTP\n// instead of HTTPS (because it is protocol-relative, and the dev site is\n// served over plain HTTP).\nconst csp = [\n \"default-src 'self' 'unsafe-inline' http://*.awsstatic.com;\",\n \"connect-src 'self' https://*.shortbread.aws.dev http://*.shortbread.aws.dev http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"frame-src http://aws.demdex.net http://dpm.demdex.net;\",\n \"img-src 'self' https://* http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"object-src 'none';\",\n \"style-src 'self' 'unsafe-inline';\",\n].join(\" \");\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const feedUrls = useConfigValue(\"feeds\") || [];\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta content={csp} httpEquiv=\"Content-Security-Policy\" />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n {feedUrls.map(({ url, mimeType }) => (\n <link href={url} key={url} rel=\"alternate\" type={mimeType} />\n ))}\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport type TimeOptions = {\n date: Date;\n format?: string;\n formattedDate?: string;\n};\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, formattedDate, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {formattedDate ?? format(date, formatString ?? \"\")}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<\n LanguageSupportTooltipProps\n> = ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n};\n"],"names":["defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","has","useLanguage","options","arguments","length","undefined","updateUrl","updateSaved","pathname","hash","useLocation","replace","useHistory","params","useQueryParams","langFromParams","get","QUERY_PARAMS","LANGUAGE","language","setLanguage","useState","_localStorage$getItem","storedLang","localStorage","getItem","_unused","getInitialLang","useEffect","set","search","toString","update","useCallback","val","setItem","_unused2","useMemo","PackageCardType","createTestIds","Detail","_ref","dataTestid","tooltip","value","_jsx","Tooltip","hasArrow","isDisabled","label","placement","children","Text","fontSize","zIndex","Details","_data$packages","_data$packages$name","_data$packages$name$d","author","metadata","date","name","usePackageCard","data","useStats","downloads","packages","npm","authorName","publishDate","Date","_jsxs","_Fragment","testIds","concat","toLocaleString","published","Time","formattedDate","formatDistanceToNowStrict","addSuffix","NavLink","color","to","getSearchPath","query","EditorsNote","comment","lineHeight","noOfLines","as","fontWeight","Heading","currentLanguage","dataEvent","description","constructFrameworks","version","LinkOverlay","Link","eventName","getPackagePath","Flex","align","CDKTypeBadge","mr","ChakraHeading","title","wordBreak","Highlight","_usePackageCard$metad","_usePackageCard","packageTags","highlight","highlightsFrom","Box","HighlightComponent","_objectSpread","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","sort","_ref2","_ref3","left","right","LANGUAGES","indexOf","map","_ref4","info","isSupportedByLibrary","includes","isSupportedByConstructHub","icon","Icon","borderRadius","h","opacity","w","LanguageSupportTooltip","Languages","pkg","Tags","keywords","tags","tagObjectsFrom","slice","id","keyword","PackageTag","variant","WideCard","LinkBox","_hover","bg","Grid","border","boxShadow","wideContainer","minH","templateColumns","base","direction","justify","overflow","p","sx","gap","Stack","spacing","wrap","borderLeft","borderTop","PackageCardContext","createContext","useContext","PackageCard","Wide","Provider","reduce","accum","tag","mapPackageTags","filter","_tag$keyword","Boolean","_tag$keyword2","mapPackageKeywords","KEYWORD_IGNORE_LIST","tagObjects","Array","tagLabels","Set","toLowerCase","push","add","URLSearchParams","brightness","useColorModeValue","Image","alt","src","tagProps","_objectWithoutProperties","_excluded","Tag","textDecoration","TagLabel","SORT_RENDER_MAP","CatalogSearchSort","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","DownloadsDesc","DownloadsAsc","searchEvent","_len","e","_key","SEARCH_ANALYTICS","FILTERS","RESULTS","SEARCH","SORT","FilterHeading","hint","useBreakpointValue","mb","Popover","colorScheme","strategy","PopoverTrigger","ml","QuestionIcon","PopoverContent","mx","shadow","PopoverArrow","PopoverBody","RadioFilter","checkedValue","onValueChange","RadioGroup","onChange","display","Radio","filterItem","isTruncated","toNum","result","parseInt","parseQueryArray","queryString","decodeURIComponent","split","getParamFromUrl","key","window","URL","location","href","searchParams","useSearchParam","transform","qp","useCdkType","_useSearchParam","CDK_TYPE","useCdkMajor","CDK_MAJOR","useKeywords","KEYWORDS","useLanguages","useSearchQuery","_useSearchParam2","SEARCH_QUERY","useSort","_useSearchParam3","useTags","TAGS","useUpdateSearchParam","offset","getSearchUrlParams","_getParamFromUrl","_getParamFromUrl2","cdkType","cdkMajor","cdkMajorParam","OFFSET","CDKFilter","_cdkMajor$toString","updateSearch","searchAPI","useSearchContext","cdkOptions","cdkTypes","opts","meta","pkgCount","CDKTYPE_NAME_MAP","majorsOptions","_cdkOptions$cdkType","majorVersions","a","b","cdkTypeFilter","type","values","cdkVersionFilter","major","majorNum","CheckboxItem","disabledHint","isChecked","Checkbox","CheckboxFilter","initialItemCount","checkedValues","collapse","useDisclosure","trackCustomEvent","useAnalytics","getOnChange","item","clickEvent","alwaysShow","showWhenExpanded","isExpandible","mt","_createElement","Collapse","animateOpacity","in","isOpen","unmountOnExit","Button","leftIcon","ChevronUpIcon","ChevronDownIcon","onClick","onToggle","textAlign","KeywordsFilter","keywordMap","keywordOptions","baseOptions","count1","count2","k","some","opt","languagesFilter","languageOptions","LANGUAGE_NAME_MAP","l1","l2","LanguageFilter","l","TagFilter","useConfigValue","packageTagGroups","tagFilterGroups","_packageTags$filter","tagGroupsMap","Map","forEach","group","mapTagsToFilterGroups","_tag$searchFilter","groupIdOrName","searchFilter","groupBy","customGroup","entry","_accum$groupIdOrName$","_accum$groupIdOrName","onTagsChange","t","getOnRadioTagChange","groupName","_tagFilterGroups$grou","_tagFilterGroups$grou2","groupTags","filteredTags","filterType","tagItems","sharedProps","_tagItems$find$id","_tagItems$find","find","TOP_OFFSET","FilterPanel","Card","filtersPanel","maxH","maxW","minW","pos","top","ArrowButton","props","borderColor","IconButton","disabled","GoToPage","pageLimit","inputValue","setInputValue","onSubmit","preventDefault","Input","max","min","target","onFocus","PageControls","goForward","goBack","prevPage","ChevronLeftIcon","goToPage","nextPage","ChevronRightIcon","SearchBar","setValue","SearchBarComponent","Em","Count","first","count","last","SearchDetails","limit","filtered","hasResults","searchDetails","SortFilter","newSort","SortAndFilterDrawer","drawer","onOpen","rightIcon","Drawer","DrawerOverlay","DrawerContent","DrawerHeader","borderBottom","DrawerCloseButton","DrawerBody","pb","SortedBy","selected","Menu","MenuButton","sortButton","pl","pr","py","MenuList","sortDropdown","MenuItem","sortItem","listViews","items","PackageList","memo","cardView","loading","Center","Spinner","View","displayName","SearchResults","o","page","results","useCatalogResults","scrollTo","Page","pageName","px","Search","templateRows","useConfig","pageInfo","contribute","event","home","faq","packageProfile","siteTerms","notFound","pageType","join","trackPageView","usePageView","feedUrls","suffix","formattedTitle","Helmet","process","content","charSet","url","mimeType","rel","property","forwardRef","ref","format","formatString","boxProps","dateTime","toISOString","isSupported","langName","message"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"static/js/773.ea0e9610.chunk.js","mappings":"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","sources":["hooks/useLanguage/useLanguage.ts","components/PackageCard/constants.ts","components/PackageCard/testIds.ts","components/PackageCard/Details.tsx","components/PackageCard/EditorsNote.tsx","components/PackageCard/Heading.tsx","components/PackageCard/Highlight.tsx","components/PackageLanguages/PackageLanguages.tsx","components/PackageCard/Languages.tsx","components/PackageCard/Tags.tsx","components/PackageCard/WideCard.tsx","components/PackageCard/PackageCard.tsx","util/package.ts","hooks/useQueryParams/useQueryParams.ts","components/Highlight/Highlight.tsx","components/PackageTag/PackageTag.tsx","views/Search/constants.ts","views/Search/FilterHeading.tsx","views/Search/testIds.ts","views/Search/RadioFilter.tsx","views/Search/util.ts","views/Search/useSearchParam.ts","views/Search/useUpdateSearchParam.ts","views/Search/CDKFilter.tsx","views/Search/CheckboxFilter.tsx","views/Search/KeywordsFilter.tsx","views/Search/LanguageFilter.tsx","views/Search/TagFilter.tsx","views/Search/FilterPanel.tsx","views/Search/ArrowButton.tsx","views/Search/GoToPage.tsx","views/Search/PageControls.tsx","views/Search/SearchBar.tsx","views/Search/SearchDetails.tsx","views/Search/SortFilter.tsx","views/Search/SortAndFilterDrawer.tsx","views/Search/SortedBy.tsx","components/PackageList/WideCardList.tsx","components/PackageList/PackageList.tsx","views/Search/SearchResults.tsx","views/Search/Search.tsx","hooks/useConfigValue/useConfigValue.ts","constants/pageInfo.ts","components/Page/Page.tsx","components/Time/Time.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","export enum PackageCardType {\n Wide = \"wide\",\n}\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"packageCard\", [\n \"author\",\n \"description\",\n \"downloads\",\n \"languages\",\n \"published\",\n \"title\",\n \"version\",\n \"comment\",\n \"wideContainer\",\n] as const);\n\nexport default testIds;\n","import { Text, Tooltip } from \"@chakra-ui/react\";\nimport { formatDistanceToNowStrict } from \"date-fns\";\nimport { FunctionComponent, ReactChild } from \"react\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\nimport { useStats } from \"../../hooks/useStats\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\nimport { Time } from \"../Time\";\n\ninterface DetailProps {\n \"data-testid\": string;\n tooltip?: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n tooltip,\n value,\n}) => (\n <Tooltip hasArrow isDisabled={!tooltip} label={tooltip} placement=\"left\">\n {/* zIndex required to allow tooltip to display due to card link overlay */}\n <Text data-testid={dataTestid} fontSize=\"xs\" zIndex={1}>\n {value}\n </Text>\n </Tooltip>\n);\n\nexport const Details: FunctionComponent = () => {\n const {\n author,\n metadata: { date },\n name,\n } = usePackageCard();\n\n const { data } = useStats();\n const downloads: number | undefined = data?.packages?.[name]?.downloads?.npm;\n\n const authorName = typeof author === \"string\" ? author : author.name;\n const publishDate = new Date(date);\n\n return (\n <>\n {downloads !== undefined && (\n <Detail\n data-testid={testIds.downloads}\n tooltip=\"Download numbers are periodically sourced from the npm registry\"\n value={`${downloads.toLocaleString()} weekly downloads`}\n />\n )}\n <Detail\n data-testid={testIds.published}\n value={\n <Time\n date={publishDate}\n fontSize=\"xs\"\n formattedDate={formatDistanceToNowStrict(publishDate, {\n addSuffix: true,\n })}\n />\n }\n />\n <Detail\n data-testid={testIds.author}\n value={\n <>\n By{\" \"}\n <NavLink\n color=\"link\"\n to={getSearchPath({\n query: authorName,\n })}\n >\n {authorName}\n </NavLink>\n </>\n }\n />\n </>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\n\nexport const EditorsNote: FunctionComponent<{ comment?: string }> = ({\n comment,\n}) => {\n return (\n <Text\n data-testid={testIds.comment}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n <Text as=\"span\" color=\"blue.500\" fontWeight=\"bold\">\n Editor's note:{\" \"}\n </Text>\n {comment}\n </Text>\n );\n};\n","import {\n Flex,\n Heading as ChakraHeading,\n LinkOverlay,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { EditorsNote } from \"./EditorsNote\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { CDKTypeBadge } from \"../CDKType\";\n\nexport const Heading: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n const {\n dataEvent,\n description,\n comment,\n constructFrameworks,\n name,\n version,\n } = usePackageCard();\n\n return (\n <>\n <LinkOverlay\n as={Link}\n data-event={\n dataEvent ? eventName(dataEvent, \"Package Card\", name) : undefined\n }\n to={getPackagePath({\n name,\n version,\n language: currentLanguage,\n })}\n >\n <Flex align=\"center\">\n <CDKTypeBadge\n constructFrameworks={constructFrameworks}\n mr={2}\n zIndex={1}\n />\n <ChakraHeading\n as=\"h3\"\n color=\"textPrimary\"\n data-testid={testIds.title}\n fontSize=\"md\"\n fontWeight=\"bold\"\n wordBreak=\"normal\"\n >\n {name}\n </ChakraHeading>\n </Flex>\n </LinkOverlay>\n {comment ? (\n <EditorsNote comment={comment} />\n ) : (\n <Text\n color=\"textPrimary\"\n data-testid={testIds.description}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n {description || \"No description available.\"}\n </Text>\n )}\n </>\n );\n};\n","import { Box } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { usePackageCard } from \"./PackageCard\";\nimport { highlightsFrom } from \"../../util/package\";\nimport { Highlight as HighlightComponent } from \"../Highlight\";\n\nexport const Highlight: FunctionComponent = () => {\n const { packageTags = [] } = usePackageCard()?.metadata ?? {};\n const [highlight] = highlightsFrom(packageTags);\n\n if (!highlight) return null;\n\n return (\n <Box fontSize=\"xs\">\n <HighlightComponent {...highlight} />\n </Box>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Language,\n LANGUAGES,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getPackagePath } from \"../../util/url\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nconst sizes = {\n sm: 5,\n md: 6,\n lg: 8,\n};\n\nexport interface PackageLanguagesProps {\n isRounded?: boolean;\n languages?: Partial<Record<Language, unknown>>;\n name: string;\n size?: \"sm\" | \"md\" | \"lg\";\n version: string;\n}\n\nexport const PackageLanguages: FunctionComponent<PackageLanguagesProps> = ({\n isRounded = false,\n languages,\n name: packageName,\n size = \"md\",\n version,\n}) => {\n const targets = Object.keys(languages ?? {}) as Language[];\n return (\n <>\n {Object.entries(LANGUAGE_RENDER_MAP)\n // Ensure entries are always sorted in a stable way\n .sort(\n ([left], [right]) =>\n LANGUAGES.indexOf(left as Language) -\n LANGUAGES.indexOf(right as Language)\n )\n .map(([lang, info]) => {\n const language = lang as Language;\n\n const isSupportedByLibrary =\n language === Language.TypeScript || targets.includes(language);\n\n const isSupportedByConstructHub =\n language === Language.TypeScript || // TypeScript is always supported\n // Otherwise, the language must be supported by ConstructHub\n TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (!isSupportedByLibrary) return null;\n\n const { name, icon: Icon } = info;\n\n const icon = (\n <Icon\n aria-label={`Supports ${name}`}\n borderRadius={isRounded ? \"50%\" : 0}\n h={sizes[size]}\n opacity={isSupportedByConstructHub ? 1 : 0.2}\n w={sizes[size]}\n />\n );\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n {isSupportedByConstructHub ? (\n <Link\n aria-label={`View package docs for ${language}`}\n to={getPackagePath({ name: packageName, version, language })}\n >\n {icon}\n </Link>\n ) : (\n icon\n )}\n </LanguageSupportTooltip>\n );\n })}\n </>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { usePackageCard } from \"./PackageCard\";\nimport { PackageLanguages } from \"../PackageLanguages\";\n\nexport const Languages: FunctionComponent = () => {\n const pkg = usePackageCard();\n return <PackageLanguages {...pkg} size=\"sm\" />;\n};\n","import { FunctionComponent } from \"react\";\nimport { usePackageCard } from \"./PackageCard\";\nimport { tagObjectsFrom } from \"../../util/package\";\nimport { PackageTag } from \"../PackageTag\";\n\nexport const Tags: FunctionComponent = () => {\n const {\n keywords = [],\n metadata: { packageTags = [] },\n } = usePackageCard();\n\n const tags = tagObjectsFrom({\n packageTags,\n keywords,\n });\n\n return (\n <>\n {tags.slice(0, 10).map(({ id, keyword: { label, color } = {} }) => (\n <PackageTag key={id} value={id} variant={color}>\n {label}\n </PackageTag>\n ))}\n </>\n );\n};\n","import { Flex, Grid, LinkBox, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Details } from \"./Details\";\nimport { Heading } from \"./Heading\";\nimport { Highlight } from \"./Highlight\";\nimport { Languages } from \"./Languages\";\nimport { Tags } from \"./Tags\";\nimport testIds from \"./testIds\";\n\nexport const WideCard: FunctionComponent = () => {\n return (\n <LinkBox\n _hover={{\n \"> article\": {\n bg: \"hoverPrimary\",\n },\n }}\n >\n <Grid\n as=\"article\"\n bg=\"bgSecondary\"\n border=\"base\"\n borderRadius=\"sm\"\n boxShadow=\"base\"\n color=\"textPrimary\"\n data-testid={testIds.wideContainer}\n h=\"full\"\n minH=\"12.5rem\"\n templateColumns={{ base: \"1fr\", lg: \"1fr 14rem\" }}\n w=\"full\"\n >\n {/* Top / Left side of card */}\n <Flex\n direction=\"column\"\n justify=\"space-between\"\n overflow=\"hidden\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={3}>\n <Heading />\n </Stack>\n\n <Flex align=\"center\" sx={{ gap: \"0.5rem\" }} wrap=\"wrap\">\n <Tags />\n </Flex>\n </Flex>\n\n {/* Bottom / Right side of card */}\n <Flex\n align={{ base: \"end\", lg: \"initial\" }}\n borderLeft={{ lg: \"base\" }}\n borderTop={{ base: \"base\", lg: \"none\" }}\n direction={{ base: \"row\", lg: \"column\" }}\n justify=\"space-between\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={1}>\n <Highlight />\n <Stack spacing={1}>\n <Details />\n </Stack>\n </Stack>\n\n <Stack data-testid={testIds.languages} direction=\"row\" spacing={2}>\n <Languages />\n </Stack>\n </Flex>\n </Grid>\n </LinkBox>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { PackageCardType } from \"./constants\";\nimport { WideCard } from \"./WideCard\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\n\nexport interface PackageCardProps {\n \"data-event\"?: string;\n pkg: ExtendedCatalogPackage;\n variant?: PackageCardType;\n}\n\ninterface PackageCardState extends ExtendedCatalogPackage {\n comment?: string;\n dataEvent?: string;\n}\n\nconst PackageCardContext = createContext<PackageCardState | null>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n \"data-event\": dataEvent,\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={{ ...pkg, dataEvent }}>\n {variant === PackageCardType.Wide && <WideCard />}\n </PackageCardContext.Provider>\n );\n};\n","import { PackageHighlight, PackageTagConfig } from \"../api/config\";\nimport { KEYWORD_IGNORE_LIST } from \"../constants/keywords\";\n\nexport interface TagObject extends PackageTagConfig {}\n\n/**\n * Reduces package tags to only return highlight tags\n */\nexport const highlightsFrom = (packageTags?: PackageTagConfig[]) => {\n if (!packageTags || packageTags.length < 1) return [];\n\n return packageTags.reduce(\n (accum: PackageHighlight[], tag: PackageTagConfig): PackageHighlight[] => {\n if (tag.highlight) {\n return [...accum, tag.highlight];\n }\n\n return accum;\n },\n []\n );\n};\n\n/**\n * Maps packageTags to an array of TagObjects, which can be rendered by the PackageTags Component\n */\nexport const mapPackageTags = (\n packageTags?: PackageTagConfig[]\n): TagObject[] => {\n return (packageTags ?? [])\n .filter((tag) => {\n return Boolean(tag.keyword?.label);\n })\n .map((tag) => ({\n ...tag,\n id: tag.keyword?.label!,\n }));\n};\n\n/**\n * Maps keywords to an array of TagObjects, which can be rendered by the PackageTags component\n */\nexport const mapPackageKeywords = (keywords?: string[]): TagObject[] => {\n if (!keywords || keywords.length < 1) return [];\n\n return keywords\n .filter((label) => Boolean(label) && !KEYWORD_IGNORE_LIST.has(label))\n .map((label) => ({\n id: label,\n keyword: {\n label,\n },\n }));\n};\n\n/**\n * Maps packageTags and keywords to a list of TagObjects, using mapPackageTags and mapPackageKeywords\n */\nexport const tagObjectsFrom = ({\n packageTags,\n keywords,\n}: {\n packageTags?: PackageTagConfig[];\n keywords?: string[];\n}): TagObject[] => {\n const tagObjects = new Array<TagObject>();\n const tagLabels = new Set<string>();\n\n for (const tag of [\n ...mapPackageTags(packageTags),\n ...mapPackageKeywords(keywords),\n ]) {\n const label = tag.keyword!.label.toLowerCase();\n if (!tagLabels.has(label)) {\n tagObjects.push(tag);\n tagLabels.add(label);\n }\n }\n\n return tagObjects;\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { Stack, Image, Text, useColorModeValue } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\ninterface HighlightProps {\n label: string;\n color?: string;\n icon?: string;\n}\n\nexport const Highlight: FunctionComponent<HighlightProps> = ({\n label,\n color,\n icon,\n}: HighlightProps) => {\n const brightness = useColorModeValue(\"none\", \"brightness(1.75)\");\n return (\n <Stack align=\"center\" direction=\"row\" filter={brightness} spacing={2}>\n <Image alt={`${label} icon`} src={icon} w={4} />\n <Text color={color} fontWeight=\"bold\">\n {label}\n </Text>\n </Stack>\n );\n};\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ keywords: [value] })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport type { QueryParamKey } from \"../../constants/url\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nconst LIMITS = [25, 50, 75, 100];\nexport const LIMIT = LIMITS[0];\n\nexport type SearchQueryParam = Extract<QueryParamKey, \"offset\" | \"q\">;\n\nexport const SORT_RENDER_MAP = {\n [CatalogSearchSort.NameAsc]: \"A-Z\",\n [CatalogSearchSort.NameDesc]: \"Z-A\",\n [CatalogSearchSort.PublishDateAsc]: \"Oldest\",\n [CatalogSearchSort.PublishDateDesc]: \"Recently updated\",\n [CatalogSearchSort.DownloadsDesc]: \"Most downloads\",\n [CatalogSearchSort.DownloadsAsc]: \"Least downloads\",\n};\n\nconst searchEvent: typeof eventName = (...e) => eventName(\"Search\", ...e);\n\nexport const SEARCH_ANALYTICS = {\n FILTERS: searchEvent(\"Filters\"),\n RESULTS: searchEvent(\"Results\"),\n SEARCH: searchEvent(\"Search\"),\n SORT: searchEvent(\"Sort\"),\n};\n","import { QuestionIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Heading,\n Text,\n Popover,\n PopoverTrigger,\n PopoverBody,\n PopoverArrow,\n PopoverContent,\n useBreakpointValue,\n PlacementWithLogical,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport interface FilterHeadingProps {\n name: string;\n hint?: string;\n}\n\nexport const FilterHeading: FunctionComponent<FilterHeadingProps> = ({\n name,\n hint,\n}) => {\n const placement = useBreakpointValue<PlacementWithLogical>({\n base: \"auto\",\n md: \"right\",\n });\n\n return (\n <Flex align=\"center\" mb={1}>\n <Heading as=\"h3\" size=\"sm\" w=\"max-content\">\n {name}\n </Heading>\n {hint ? (\n <Popover colorScheme=\"dark\" placement={placement} strategy=\"fixed\">\n <PopoverTrigger>\n <Flex\n aria-label={`Hint: ${name}`}\n as=\"button\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Popover\")}\n ml={2}\n >\n <QuestionIcon h={3.5} w={3.5} />\n </Flex>\n </PopoverTrigger>\n <PopoverContent\n bg=\"gray.700\"\n borderRadius=\"base\"\n color=\"white\"\n fontSize=\"sm\"\n mx={{ base: \"1rem\", md: \"initial\" }}\n shadow=\"whiteAlpha.300\"\n >\n <PopoverArrow bg=\"gray.700\" />\n <PopoverBody>\n <Text>{hint}</Text>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n ) : null}\n </Flex>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"searchRedesign\", [\n \"page\",\n // Results\n \"searchDetails\",\n \"nextPage\",\n \"prevPage\",\n \"goToPage\",\n // Sorting\n \"sortButton\",\n \"sortDropdown\",\n \"sortItem\",\n // Filters Panel\n \"filtersPanel\",\n \"cdkTypeFilter\",\n \"cdkVersionFilter\",\n \"filterItem\",\n \"languagesFilter\",\n] as const);\n","import { Radio, RadioGroup, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport interface RadioFilterProps extends FilterHeadingProps {\n \"data-testid\"?: string;\n value?: string;\n onValueChange: (value: string) => void;\n options: {\n display: string;\n value: string;\n }[];\n}\n\nexport const RadioFilter: FunctionComponent<RadioFilterProps> = ({\n \"data-testid\": dataTestid,\n value: checkedValue,\n onValueChange,\n options,\n name,\n hint,\n}) => {\n return (\n <Stack data-testid={dataTestid} spacing={1}>\n <FilterHeading hint={hint} name={name} />\n <RadioGroup onChange={onValueChange} value={checkedValue}>\n <Stack spacing={1}>\n {options.map(({ display, value }) => {\n const dataEvent = eventName(\n SEARCH_ANALYTICS.FILTERS,\n name,\n \"Filter\",\n display\n );\n return (\n <Radio data-event={dataEvent} key={value} value={value}>\n <Text\n color=\"textTertiary\"\n data-event={dataEvent}\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Radio>\n );\n })}\n </Stack>\n </RadioGroup>\n </Stack>\n );\n};\n","import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\n\nexport const toNum = (val: string) => {\n const result = parseInt(val);\n\n if (`${result}` === \"NaN\") {\n return 0;\n }\n\n return result;\n};\n\nexport const parseQueryArray = <T extends string>(\n queryString: string | null\n) => {\n if (!queryString) return [];\n\n return decodeURIComponent(queryString).split(\",\") as T[];\n};\n\nconst getParamFromUrl = (key: string) => {\n if (typeof window === \"undefined\") return null;\n const queryParams = new URL(window.location.href).searchParams;\n return queryParams.get(key);\n};\n\nexport const getSearchUrlParams = () => {\n return {\n query: getParamFromUrl(QUERY_PARAMS.SEARCH_QUERY) ?? \"\",\n keywords: parseQueryArray(getParamFromUrl(QUERY_PARAMS.KEYWORDS)),\n cdkType: (getParamFromUrl(QUERY_PARAMS.CDK_TYPE) as CDKType) ?? undefined,\n cdkMajor: (() => {\n const cdkMajorParam = getParamFromUrl(QUERY_PARAMS.CDK_MAJOR);\n return cdkMajorParam ? toNum(cdkMajorParam) : undefined;\n })(),\n languages: parseQueryArray(\n getParamFromUrl(QUERY_PARAMS.LANGUAGES)\n ) as Language[],\n offset: toNum(getParamFromUrl(QUERY_PARAMS.OFFSET) ?? \"\"),\n sort:\n (getParamFromUrl(QUERY_PARAMS.SORT) as CatalogSearchSort) ?? undefined,\n tags: parseQueryArray(getParamFromUrl(QUERY_PARAMS.TAGS)),\n };\n};\n","import { useMemo } from \"react\";\nimport { parseQueryArray, toNum } from \"./util\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\nconst useSearchParam = <T = string | null>(\n key: string,\n transform?: (param: string | null) => T\n): T => {\n const queryParams = useQueryParams();\n const qp = queryParams.get(key);\n\n return useMemo(\n () => (transform ? transform(qp) : (qp as unknown as T)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [qp]\n );\n};\n\nexport const useCdkType = () => {\n const cdkType: CDKType | undefined =\n useSearchParam(QUERY_PARAMS.CDK_TYPE) ?? undefined;\n\n return cdkType;\n};\n\nexport const useCdkMajor = () => {\n const cdkMajor: number | undefined = useSearchParam(\n QUERY_PARAMS.CDK_MAJOR,\n (p) => (p ? toNum(p) : undefined)\n );\n\n return cdkMajor;\n};\n\nexport const useKeywords = () => {\n const keywords: string[] = useSearchParam(\n QUERY_PARAMS.KEYWORDS,\n parseQueryArray\n );\n\n return keywords;\n};\n\nexport const useLanguages = () => {\n const languages: Language[] = useSearchParam(\n QUERY_PARAMS.LANGUAGES,\n parseQueryArray\n ) as Language[];\n\n return languages;\n};\n\nexport const useOffset = () => {\n const offset = useSearchParam(QUERY_PARAMS.OFFSET, (o) => toNum(o ?? \"\"));\n return offset;\n};\n\nexport const useSearchQuery = () => {\n const query: string = useSearchParam(QUERY_PARAMS.SEARCH_QUERY) ?? \"\";\n return query;\n};\n\nexport const useSort = () => {\n const sort: CatalogSearchSort | undefined =\n useSearchParam(QUERY_PARAMS.SORT) ?? undefined;\n return sort;\n};\n\nexport const useTags = () => {\n const tags: string[] = useSearchParam(QUERY_PARAMS.TAGS, parseQueryArray);\n return tags;\n};\n","import { useCallback } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { getSearchUrlParams } from \"./util\";\nimport { getSearchPath } from \"../../util/url\";\n\nexport const useUpdateSearchParam = () => {\n const { push } = useHistory();\n\n return useCallback(\n (p?: Partial<Parameters<typeof getSearchPath>[0]>) => {\n const { offset, ...params } = p ?? {};\n\n push(\n getSearchPath({\n ...getSearchUrlParams(),\n ...params,\n offset: offset ?? 0,\n })\n );\n },\n [push]\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport testIds from \"./testIds\";\nimport { useCdkMajor, useCdkType } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { CatalogConstructFrameworkMeta } from \"../../api/catalog-search\";\nimport { CDKType, CDKTYPE_NAME_MAP } from \"../../constants/constructs\";\nimport { useSearchContext } from \"../../contexts/Search\";\n\ntype CDKOptions = Partial<{\n [key in CDKType]: CatalogConstructFrameworkMeta & {\n display: string;\n value: key;\n };\n}>;\n\nexport const CDKFilter: FunctionComponent = () => {\n const cdkType = useCdkType();\n const cdkMajor = useCdkMajor();\n\n const updateSearch = useUpdateSearchParam();\n\n const searchAPI = useSearchContext()!;\n\n // Options with less than one package will be omitted\n const cdkOptions = useMemo(() => {\n const cdkTypes = searchAPI.constructFrameworks;\n const options = Object.entries(cdkTypes).reduce((opts, [name, meta]) => {\n if (meta.pkgCount < 1) {\n return opts;\n }\n\n return {\n ...opts,\n [name]: {\n display: CDKTYPE_NAME_MAP[name as CDKType],\n value: name,\n ...meta,\n },\n };\n }, {});\n\n return Object.keys(options).length ? (options as CDKOptions) : undefined;\n }, [searchAPI]);\n\n const majorsOptions = useMemo(() => {\n if (!cdkOptions || !cdkType) return undefined;\n const majorVersions = cdkOptions[cdkType]?.majorVersions;\n\n if (!majorVersions) return undefined;\n\n return [...majorVersions]\n .sort((a, b) => a - b)\n .map((value) => ({\n value: value.toString(),\n display: `${CDKTYPE_NAME_MAP[cdkType]} v${value}`,\n }));\n }, [cdkOptions, cdkType]);\n\n if (!cdkOptions) {\n return null;\n }\n\n const onCdkTypeChange = (type: string) => {\n const cdk = type as CDKType;\n updateSearch({ cdkType: type ? cdk : undefined, cdkMajor: undefined });\n };\n\n const onCdkMajorChange = (major: string) => {\n let majorNum: number | undefined = undefined;\n\n if (major) {\n majorNum = parseInt(major, 10);\n }\n\n updateSearch({ cdkMajor: majorNum });\n };\n\n return (\n <>\n <RadioFilter\n data-testid={testIds.cdkTypeFilter}\n hint=\"Choose the right CDK for your IaC technology: AWS CDK for AWS CloudFormation, CDKTF for Terraform, or CDK8s for Kubernetes.\"\n name=\"CDK Type\"\n onValueChange={onCdkTypeChange}\n options={[\n { display: \"Any CDK Type\", value: \"\" },\n ...Object.values(cdkOptions),\n ]}\n value={cdkType ?? \"\"}\n />\n {/* No point in showing major versions if only a single one is available */}\n {!!(majorsOptions && majorsOptions.length > 1) && (\n <RadioFilter\n data-testid={testIds.cdkVersionFilter}\n hint=\"Choose the major version of the CDK you're using to see only constructs that will work with that version.\"\n name=\"CDK Major Version\"\n onValueChange={onCdkMajorChange}\n options={[\n { display: \"Any Major Version\", value: \"\" },\n ...majorsOptions,\n ]}\n value={cdkMajor?.toString() ?? \"\"}\n />\n )}\n </>\n );\n};\n","import { ChevronDownIcon, ChevronUpIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Button,\n Collapse,\n Checkbox,\n Stack,\n Text,\n Tooltip,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\nimport { clickEvent, eventName, useAnalytics } from \"../../contexts/Analytics\";\n\ninterface CheckboxOption {\n display: string;\n value: string;\n isDisabled?: boolean;\n disabledHint?: string;\n}\n\ninterface CheckboxItemProps extends CheckboxOption {\n onChange: () => void;\n isChecked: boolean;\n}\n\nexport interface CheckboxFilterProps extends FilterHeadingProps {\n /**\n * Test ID to select checkbox in tests\n */\n \"data-testid\"?: string;\n /**\n * Number of items that can be initially shown\n */\n initialItemCount?: number;\n /**\n * Defines checkbox items\n */\n options: CheckboxOption[];\n /**\n * Selected values\n */\n values: string[];\n /**\n * Callback triggered when an item is clicked\n */\n onValueChange: (value: string) => void;\n}\n\nconst CheckboxItem: FunctionComponent<CheckboxItemProps> = ({\n display,\n value,\n isDisabled,\n disabledHint,\n isChecked,\n onChange,\n}) => (\n <Checkbox\n isChecked={isChecked}\n isDisabled={isDisabled}\n key={value}\n onChange={onChange}\n >\n <Tooltip\n hasArrow\n isDisabled={!isDisabled && !disabledHint}\n label={disabledHint}\n placement=\"right\"\n >\n <Text\n color=\"textTertiary\"\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Tooltip>\n </Checkbox>\n);\n\nexport const CheckboxFilter: FunctionComponent<CheckboxFilterProps> = ({\n \"data-testid\": dataTestid,\n initialItemCount,\n hint,\n name,\n options,\n values: checkedValues,\n onValueChange,\n}) => {\n const collapse = useDisclosure();\n const { trackCustomEvent } = useAnalytics();\n\n const getOnChange = (item: CheckboxOption) => () => {\n trackCustomEvent(\n clickEvent({\n name: eventName(SEARCH_ANALYTICS.FILTERS, name, \"Filter\", item.display),\n })\n );\n onValueChange(item.value);\n };\n\n let alwaysShow: typeof options = options;\n let showWhenExpanded: typeof options = [];\n\n if (initialItemCount) {\n alwaysShow = options.slice(0, initialItemCount);\n showWhenExpanded = options.slice(initialItemCount, options.length);\n }\n\n const isExpandible = showWhenExpanded.length > 0;\n\n return (\n <Flex data-testid={dataTestid} direction=\"column\">\n <FilterHeading hint={hint} name={name} />\n <Stack mt={1} spacing={1}>\n {alwaysShow.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n {isExpandible && (\n <Collapse animateOpacity in={collapse.isOpen} unmountOnExit>\n <Stack spacing={1}>\n {showWhenExpanded.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n </Stack>\n </Collapse>\n )}\n </Stack>\n {isExpandible && (\n <Flex align=\"start\" mt={1}>\n <Button\n color=\"textTertiary\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Show More\")}\n fontWeight=\"normal\"\n leftIcon={collapse.isOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}\n onClick={collapse.onToggle}\n size=\"sm\"\n textAlign=\"left\"\n variant=\"link\"\n w=\"auto\"\n >\n {collapse.isOpen\n ? `Show fewer options (${alwaysShow.length})`\n : `Show more options (${showWhenExpanded.length})`}\n </Button>\n </Flex>\n )}\n </Flex>\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport testIds from \"./testIds\";\nimport { useKeywords } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { useSearchContext } from \"../../contexts/Search\";\n\nexport const KeywordsFilter: FunctionComponent = () => {\n const keywords = useKeywords();\n const keywordMap = useSearchContext()!.keywords;\n const updateSearch = useUpdateSearchParam();\n\n const onKeywordChange = (keyword: string) => {\n updateSearch({\n keywords: keywords.includes(keyword)\n ? keywords.filter((k) => k !== keyword)\n : [...keywords, keyword],\n });\n };\n\n const keywordOptions = useMemo(() => {\n const baseOptions = [...keywordMap.entries()]\n .sort(([, count1], [, count2]) => {\n return count1 < count2 ? 1 : -1;\n })\n .filter(([keyword]) => !keywords.includes(keyword))\n .map(([keyword]) => ({\n display: keyword,\n value: keyword,\n }))\n .slice(0, 25);\n\n const keywordsNotInOptions = keywords.filter(\n (k) => !baseOptions.some((opt) => opt.value === k)\n );\n\n return [\n ...keywordsNotInOptions.map((k) => ({ display: k, value: k })),\n ...baseOptions,\n ];\n }, [keywordMap, keywords]);\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Focus the results by choosing one or more keywords reflecting the kind of construct you're looking for. Keywords are provided by construct authors.\"\n initialItemCount={5}\n name=\"Keywords\"\n onValueChange={onKeywordChange}\n options={keywordOptions}\n values={keywords}\n />\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport testIds from \"./testIds\";\nimport { useLanguages } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nconst languageOptions = Object.entries(LANGUAGE_NAME_MAP)\n .map(([key, value]) => ({\n display: value,\n value: key,\n ...(TEMP_SUPPORTED_LANGUAGES.has(key as Language)\n ? { isDisabled: false }\n : {\n isDisabled: true,\n disabledHint: `${\n LANGUAGE_NAME_MAP[key as Language]\n } support is coming soon!`,\n }),\n }))\n .sort((l1, l2) => {\n // Push disabled languages to back of list\n return l1.isDisabled > l2.isDisabled ? 1 : -1;\n });\n\nexport const LanguageFilter: FunctionComponent = () => {\n const languages = useLanguages();\n\n const updateSearch = useUpdateSearchParam();\n\n const onLanguagesChange = (lang: string) => {\n const language = lang as Language;\n\n updateSearch({\n languages: languages.includes(language)\n ? languages.filter((l) => l !== language)\n : [...languages, language],\n });\n };\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Choose one or more languages. Results include constructs for use with at least one of the selected languages.\"\n name=\"Programming Language\"\n onValueChange={onLanguagesChange}\n options={languageOptions}\n values={languages}\n />\n );\n};\n","import { FunctionComponent, useCallback, useMemo } from \"react\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useTags } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { PackageTagConfig, TagGroupConfig } from \"../../api/config\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\n\ninterface FilterGroup extends Partial<TagGroupConfig> {\n id: string;\n tags: PackageTagConfig[];\n}\ninterface FilterGroups {\n [group: string]: FilterGroup;\n}\n\n/**\n * Creates a plain object map of FilterGroups keyed by group id\n */\nexport const mapTagsToFilterGroups = (\n packageTags: PackageTagConfig[],\n tagGroupsMap: Map<string, TagGroupConfig>\n): FilterGroups => {\n return packageTags.reduce(\n (accum: FilterGroups, tag: PackageTagConfig): FilterGroups => {\n const groupIdOrName = tag.searchFilter?.groupBy;\n const customGroup = groupIdOrName\n ? tagGroupsMap.get(groupIdOrName)\n : undefined;\n\n if (groupIdOrName && customGroup) {\n const entry = accum[groupIdOrName];\n if (entry) {\n entry.tags = [...entry.tags, tag];\n return accum;\n }\n\n return {\n ...accum,\n [groupIdOrName]: {\n ...customGroup,\n tags: [tag],\n },\n };\n }\n\n if (groupIdOrName) {\n return {\n ...accum,\n [groupIdOrName]: {\n id: groupIdOrName,\n tags: [...(accum?.[groupIdOrName]?.tags ?? []), tag],\n },\n };\n }\n return accum;\n },\n {}\n );\n};\n\nexport const TagFilter: FunctionComponent = () => {\n const packageTags = useConfigValue(\"packageTags\");\n const packageTagGroups = useConfigValue(\"packageTagGroups\");\n\n const tagFilterGroups: FilterGroups = useMemo(() => {\n const tagGroupsMap = new Map<string, TagGroupConfig>();\n packageTagGroups?.forEach((group) => {\n tagGroupsMap.set(group.id, group);\n });\n\n const filterableTags =\n packageTags?.filter((tag) => Boolean(tag.searchFilter)) ?? [];\n\n return mapTagsToFilterGroups(filterableTags, tagGroupsMap);\n }, [packageTags, packageTagGroups]);\n\n const tags = useTags();\n const updateSearch = useUpdateSearchParam();\n\n const onTagsChange = (tag: string) => {\n updateSearch({\n tags: tags.includes(tag) ? tags.filter((t) => t !== tag) : [...tags, tag],\n });\n };\n\n const getOnRadioTagChange = useCallback(\n (groupName: string) => {\n const groupTags = new Set(\n (tagFilterGroups[groupName]?.tags ?? []).map(({ id }) => id)\n );\n\n return (tag: string) => {\n const filteredTags = tags.filter((t) => !groupTags.has(t));\n\n updateSearch({\n tags: tag ? [...filteredTags, tag] : filteredTags,\n });\n };\n },\n [tagFilterGroups, tags, updateSearch]\n );\n\n return (\n <>\n {Object.values(tagFilterGroups).map(\n ({ filterType, id, label, tooltip, tags: tagItems }) => {\n const sharedProps = {\n hint: tooltip,\n name: label ?? id,\n options: tagItems.map((tag) => {\n return {\n display: tag.searchFilter!.display,\n value: tag.id,\n };\n }),\n };\n\n if (filterType === \"radio\") {\n return (\n <RadioFilter\n {...sharedProps}\n key={id}\n onValueChange={getOnRadioTagChange(id)}\n options={[\n { display: `Any ${sharedProps.name}`, value: \"\" },\n ...sharedProps.options,\n ]}\n value={tagItems.find((t) => tags.includes(t.id))?.id ?? \"\"}\n />\n );\n }\n\n return (\n <CheckboxFilter\n {...sharedProps}\n key={id}\n onValueChange={onTagsChange}\n values={tags}\n />\n );\n }\n )}\n </>\n );\n};\n","import { Heading, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { TagFilter } from \"./TagFilter\";\nimport testIds from \"./testIds\";\nimport { Card } from \"../../components/Card\";\n\nexport interface FilterPanelProps {}\n\n// Header height + section padding\nconst TOP_OFFSET = \"5.75rem\";\n\n/**\n * The desktop Resolution Filter Panel\n */\nexport const FilterPanel: FunctionComponent<FilterPanelProps> = () => {\n return (\n <Card\n borderRadius=\"sm\"\n data-testid={testIds.filtersPanel}\n display={{ base: \"none\", md: \"flex\" }}\n maxH={`calc(100vh - ${TOP_OFFSET} - 1.25rem)`}\n maxW=\"23rem\"\n minW=\"100%\"\n overflow=\"hidden auto\"\n p={4}\n pos=\"sticky\"\n top={TOP_OFFSET}\n zIndex=\"docked\"\n >\n <Stack color=\"textPrimary\" h=\"max-content\" spacing={4} top={4}>\n <Heading as=\"h2\" size=\"sm\">\n Filters\n </Heading>\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\n </Stack>\n </Card>\n );\n};\n","import { IconButton, IconProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface ArrowButtonProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n icon: FunctionComponent<IconProps>;\n label: string;\n onClick?: () => void;\n}\n\nexport const ArrowButton: FunctionComponent<ArrowButtonProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n icon: Icon,\n label,\n onClick,\n}) => {\n const props = {\n \"aria-label\": label,\n borderRadius: \"md\",\n borderColor: \"blue.500\",\n colorScheme: \"blue\",\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n icon: <Icon color=\"blue.500\" h={5} w={5} />,\n mx: 2,\n h: 10,\n w: 10,\n variant: \"outline\",\n };\n\n return <IconButton {...props} disabled={!onClick} onClick={onClick} />;\n};\n","import { Flex, Input, Text } from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n SyntheticEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { clickEvent, useAnalytics } from \"../../contexts/Analytics\";\n\nexport interface GoToPageProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n pageLimit: number;\n offset: number;\n}\n\nexport const GoToPage: FunctionComponent<GoToPageProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n pageLimit,\n offset,\n}) => {\n const updateSearch = useUpdateSearchParam();\n const { trackCustomEvent } = useAnalytics();\n const [inputValue, setInputValue] = useState((offset + 1).toString());\n\n useEffect(() => {\n setInputValue((offset + 1).toString());\n }, [offset]);\n\n const onInputChange = (e: SyntheticEvent<HTMLInputElement>) => {\n e.preventDefault();\n setInputValue((e.target as HTMLInputElement).value);\n };\n\n const onSubmit: FormEventHandler<HTMLInputElement> = (e) => {\n e.preventDefault();\n updateSearch({ offset: parseInt(inputValue) - 1 });\n };\n\n return (\n <Flex align=\"center\" as=\"form\" mx={2} onSubmit={onSubmit}>\n <Input\n aria-label=\"Jump to page\"\n colorScheme=\"brand\"\n data-testid={dataTestid}\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n onFocus={() => {\n if (dataEvent) {\n trackCustomEvent(clickEvent({ name: dataEvent }));\n }\n }}\n p={0}\n textAlign=\"center\"\n type=\"number\"\n value={inputValue}\n w={10}\n />\n <Text ml={2} w=\"max-content\">\n of {pageLimit + 1}\n </Text>\n </Flex>\n );\n};\n","import { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ArrowButton } from \"./ArrowButton\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { GoToPage } from \"./GoToPage\";\nimport testIds from \"./testIds\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport interface PageControlsProps {\n offset: number;\n pageLimit: number;\n}\n\nexport const PageControls: FunctionComponent<PageControlsProps> = ({\n offset,\n pageLimit,\n}) => {\n const updateSearch = useUpdateSearchParam();\n const goForward =\n offset < pageLimit ? () => updateSearch({ offset: offset + 1 }) : undefined;\n const goBack =\n offset > 0 ? () => updateSearch({ offset: offset - 1 }) : undefined;\n\n return (\n <Stack\n align=\"center\"\n direction=\"row\"\n justify=\"space-between\"\n maxW=\"18rem\"\n mx=\"auto\"\n spacing={4}\n w=\"full\"\n >\n <ArrowButton\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Previous Page\")}\n data-testid={testIds.prevPage}\n icon={ChevronLeftIcon}\n label=\"Previous page button\"\n onClick={goBack}\n />\n <GoToPage\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Go to Page\")}\n data-testid={testIds.goToPage}\n offset={offset}\n pageLimit={pageLimit}\n />\n <ArrowButton\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Next Page\")}\n data-testid={testIds.nextPage}\n icon={ChevronRightIcon}\n label=\"Next page button\"\n onClick={goForward}\n />\n </Stack>\n );\n};\n","import { FunctionComponent, useState } from \"react\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { useSearchQuery } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { SearchBar as SearchBarComponent } from \"../../components/SearchBar\";\n\nexport const SearchBar: FunctionComponent = () => {\n const query = useSearchQuery();\n const updateSearch = useUpdateSearchParam();\n\n const [value, setValue] = useState(query ?? \"\");\n\n return (\n <SearchBarComponent\n bg=\"bgSecondary\"\n data-event={SEARCH_ANALYTICS.SEARCH}\n onChange={(e) => setValue(e.target.value)}\n onSubmit={(e) => {\n e.preventDefault();\n\n updateSearch({\n query: value,\n sort: undefined,\n });\n }}\n value={value}\n />\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\n\nexport interface SearchDetailsProps {\n limit: number;\n offset: number;\n count: number;\n filtered: boolean;\n query?: string;\n}\n\nconst Em: FunctionComponent = ({ children }) => (\n <Text as=\"strong\" color=\"textSecondary\">\n {children}\n </Text>\n);\n\nconst Count: FunctionComponent<{\n first: number;\n count: number;\n last: number;\n}> = ({ first, count, last }) => {\n if (!first && last >= count) {\n return (\n <>\n <Em>{count}</Em> of <Em>{count}</Em>\n </>\n );\n }\n\n return (\n <>\n <Em>\n {count ? first + 1 : count} - {last > count ? count : last}\n </Em>{\" \"}\n of <Em>{count}</Em>\n </>\n );\n};\n\nexport const SearchDetails: FunctionComponent<SearchDetailsProps> = ({\n limit,\n offset,\n count,\n filtered,\n query,\n}) => {\n const first = limit * offset;\n const last = first + limit;\n const hasResults = count > 0;\n\n return (\n <Text data-testid={testIds.searchDetails}>\n {hasResults ? (\n <>\n Displaying <Count count={count} first={first} last={last} />{\" \"}\n {filtered ? \"search results\" : \"constructs\"}\n </>\n ) : (\n <>{filtered ? \"There were no search results\" : \"No constructs found\"}</>\n )}\n {query && (\n <>\n {\" for \"}\n <Em>{query}</Em>\n </>\n )}\n .{!hasResults && filtered && <> Try a different term.</>}\n </Text>\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { SORT_RENDER_MAP } from \"./constants\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useSort } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\n\nexport const SortFilter: FunctionComponent = () => {\n const sort = useSort();\n const updateSearch = useUpdateSearchParam();\n\n const onSortChange = (newSort: string) => {\n updateSearch({\n sort: newSort ? (newSort as CatalogSearchSort) : undefined,\n });\n };\n\n return (\n <RadioFilter\n hint=\"Sets the order of search results\"\n name=\"Sorted By\"\n onValueChange={onSortChange}\n options={[\n { display: \"Relevance\", value: \"\" },\n ...Object.entries(SORT_RENDER_MAP).map(([value, display]) => ({\n display,\n value,\n })),\n ]}\n value={sort ?? \"\"}\n />\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Drawer,\n Stack,\n DrawerBody,\n DrawerHeader,\n DrawerOverlay,\n DrawerContent,\n DrawerCloseButton,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { SortFilter } from \"./SortFilter\";\nimport { TagFilter } from \"./TagFilter\";\n\n/**\n * The mobile filter Drawer (Bottomsheet in iOS terminology)\n */\nexport const SortAndFilterDrawer: FunctionComponent = () => {\n const drawer = useDisclosure();\n return (\n <>\n <Button\n colorScheme=\"brand\"\n display={{ md: \"none\" }}\n onClick={drawer.onOpen}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n Sorting and Filters\n </Button>\n <Drawer {...drawer} placement=\"bottom\">\n <DrawerOverlay />\n\n <DrawerContent color=\"textPrimary\" maxH=\"full\">\n <DrawerHeader borderBottom=\"base\">Sorting and Filters</DrawerHeader>\n\n <DrawerCloseButton />\n\n <DrawerBody>\n <Stack color=\"textPrimary\" pb={4} spacing={4}>\n <SortFilter />\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\n </Stack>\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </>\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Text,\n Menu,\n MenuButton,\n MenuList,\n MenuItem,\n Button,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { SEARCH_ANALYTICS, SORT_RENDER_MAP } from \"./constants\";\nimport testIds from \"./testIds\";\nimport { useSort } from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nexport const SortedBy: FunctionComponent = () => {\n const sort = useSort();\n const updateSearch = useUpdateSearchParam();\n\n const selected = sort ? SORT_RENDER_MAP[sort] : \"Relevance\";\n\n return (\n <Flex align=\"center\">\n <Text>Sorted by</Text>\n <Menu>\n <MenuButton\n as={Button}\n color=\"link\"\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Menu\")}\n data-testid={testIds.sortButton}\n ml={2}\n pl={2} // For some reason, the px shorthand doesn't work on this Button\n pr={2}\n py={1}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n {selected}\n </MenuButton>\n <MenuList data-testid={testIds.sortDropdown} minW=\"180\" zIndex=\"sticky\">\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", \"Relevance\")}\n data-testid={testIds.sortItem}\n data-value=\"\"\n key=\"Relevance\"\n onClick={() => updateSearch({ sort: undefined })}\n >\n Relevance\n </MenuItem>\n {Object.entries(SORT_RENDER_MAP).map(([value, display]) => (\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", display)}\n data-testid={testIds.sortItem}\n data-value={value}\n key={value}\n onClick={() => updateSearch({ sort: value as CatalogSearchSort })}\n >\n {display}\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n </Flex>\n );\n};\n","import { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageListViewProps } from \"./PackageList\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\n\nexport const WideCardList: FunctionComponent<PackageListViewProps> = ({\n \"data-event\": dataEvent,\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n data-event={dataEvent}\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { WideCardList } from \"./WideCardList\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\nimport { PackageCardType } from \"../PackageCard\";\n\nconst listViews = {\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n \"data-event\"?: string;\n items: ExtendedCatalogPackage[];\n}\n\nexport interface PackageListProps extends Partial<PackageListViewProps> {\n cardView?: PackageCardType;\n loading?: boolean;\n title?: string;\n}\n\nexport const PackageList: FunctionComponent<PackageListProps> = memo(\n ({\n \"data-event\": dataEvent,\n cardView = PackageCardType.Wide,\n items,\n loading,\n }) => {\n if (loading || !items) {\n return (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const View = listViews[cardView];\n\n return <View data-event={dataEvent} items={items} />;\n }\n);\n\nPackageList.displayName = \"PackageList\";\n","import { Box, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { LIMIT, SEARCH_ANALYTICS } from \"./constants\";\nimport { PageControls } from \"./PageControls\";\nimport { SearchBar } from \"./SearchBar\";\nimport { SearchDetails } from \"./SearchDetails\";\nimport { SortAndFilterDrawer } from \"./SortAndFilterDrawer\";\nimport { SortedBy } from \"./SortedBy\";\nimport {\n useCdkType,\n useCdkMajor,\n useKeywords,\n useLanguages,\n useOffset,\n useSearchQuery,\n useSort,\n useTags,\n} from \"./useSearchParam\";\nimport { useUpdateSearchParam } from \"./useUpdateSearchParam\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\n\nexport const SearchResults: FunctionComponent = () => {\n const updateSearch = useUpdateSearchParam();\n\n const offset = useOffset();\n const query = useSearchQuery();\n const keywords = useKeywords();\n const languages = useLanguages();\n const cdkMajor = useCdkMajor();\n const cdkType = useCdkType();\n const sort = useSort();\n const tags = useTags();\n\n const { page, pageLimit, results } = useCatalogResults({\n offset,\n limit: LIMIT,\n query,\n keywords,\n languages,\n cdkMajor,\n cdkType,\n sort,\n tags,\n });\n\n // Resets the page number to 1 if query param offset is below 0, or to the last page if offset is higher than page count\n useEffect(() => {\n // If the query has results but the page has nothing to show...\n if (results.length && (offset < 0 || offset > pageLimit)) {\n // Handle an out of bounds offset\n if (offset < 0) {\n updateSearch({ offset: 0 });\n } else {\n // Offset is too large, just take last page\n updateSearch({ offset: pageLimit });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [results, offset, pageLimit]);\n\n // Scroll to top on page change\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [page]);\n\n return (\n <Page\n meta={{\n title: query || \"Search\",\n description: query\n ? `${results.length} results for ${query} at Construct Hub`\n : \"Search reusable components for your cloud application\",\n }}\n pageName=\"search\"\n >\n <Stack direction=\"column\" maxW=\"100vw\" pb={4} px={4} spacing={4}>\n <SearchBar />\n\n <Stack\n align={{ base: \"start\", lg: \"center\" }}\n direction={{ base: \"column-reverse\", lg: \"row\" }}\n justify={{ base: \"initial\", lg: \"space-between\" }}\n spacing={4}\n >\n <SearchDetails\n count={results.length}\n filtered={!!query}\n limit={LIMIT}\n offset={offset}\n query={query}\n />\n\n <Box display={{ base: \"none\", md: \"initial\" }}>\n <SortedBy />\n </Box>\n\n <Box display={{ md: \"none\" }}>\n <SortAndFilterDrawer />\n </Box>\n </Stack>\n\n <PackageList data-event={SEARCH_ANALYTICS.RESULTS} items={page} />\n\n <Box w=\"full\">\n <PageControls offset={offset} pageLimit={pageLimit} />\n </Box>\n </Stack>\n </Page>\n );\n};\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { FilterPanel } from \"./FilterPanel\";\nimport { SearchResults } from \"./SearchResults\";\nimport testIds from \"./testIds\";\nimport { Page } from \"../../components/Page\";\n\nexport const Search: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Search - Construct Hub\",\n description: \"Search Construct Libraries for AWS CDK, CDK8s, and CDKTF\",\n }}\n pageName=\"search\"\n >\n <Grid\n data-testid={testIds.page}\n gap={4}\n h=\"full\"\n maxW=\"100%\"\n px={{ base: 0, md: 6 }}\n py={6}\n templateColumns={{ base: \"1fr\", md: \"auto 1fr\" }}\n templateRows=\"1fr\"\n >\n {/* Filter Panel Desktop */}\n <FilterPanel />\n\n {/* Results, Info, and Controls */}\n <SearchResults />\n </Grid>\n </Page>\n );\n};\n","import type { Config } from \"../../api/config\";\nimport { useConfig } from \"../../contexts/Config\";\n\nexport const useConfigValue = <T extends keyof Config>(key: T) => {\n const { data } = useConfig();\n return (data ?? {})[key];\n};\n","export const pageInfo = {\n contribute: {\n event: {\n name: \"Contribute Load\",\n },\n },\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\n// Should be the same as the \"real\" CSP, except most things come from HTTP\n// instead of HTTPS (because it is protocol-relative, and the dev site is\n// served over plain HTTP).\nconst csp = [\n \"default-src 'self' 'unsafe-inline' http://*.awsstatic.com;\",\n \"connect-src 'self' https://*.shortbread.aws.dev http://*.shortbread.aws.dev http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"frame-src http://aws.demdex.net http://dpm.demdex.net;\",\n \"img-src 'self' https://* http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"object-src 'none';\",\n \"style-src 'self' 'unsafe-inline';\",\n].join(\" \");\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const feedUrls = useConfigValue(\"feeds\") || [];\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta content={csp} httpEquiv=\"Content-Security-Policy\" />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n {feedUrls.map(({ url, mimeType }) => (\n <link href={url} key={url} rel=\"alternate\" type={mimeType} />\n ))}\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport type TimeOptions = {\n date: Date;\n format?: string;\n formattedDate?: string;\n};\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, formattedDate, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {formattedDate ?? format(date, formatString ?? \"\")}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<\n LanguageSupportTooltipProps\n> = ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n};\n"],"names":["defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","has","useLanguage","options","arguments","length","undefined","updateUrl","updateSaved","pathname","hash","useLocation","replace","useHistory","params","useQueryParams","langFromParams","get","QUERY_PARAMS","LANGUAGE","language","setLanguage","useState","_localStorage$getItem","storedLang","localStorage","getItem","_unused","getInitialLang","useEffect","set","search","toString","update","useCallback","val","setItem","_unused2","useMemo","PackageCardType","createTestIds","Detail","_ref","dataTestid","tooltip","value","_jsx","Tooltip","hasArrow","isDisabled","label","placement","children","Text","fontSize","zIndex","Details","_data$packages","_data$packages$name","_data$packages$name$d","author","metadata","date","name","usePackageCard","data","useStats","downloads","packages","npm","authorName","publishDate","Date","_jsxs","_Fragment","testIds","concat","toLocaleString","published","Time","formattedDate","formatDistanceToNowStrict","addSuffix","NavLink","color","to","getSearchPath","query","EditorsNote","comment","lineHeight","noOfLines","as","fontWeight","Heading","currentLanguage","dataEvent","description","constructFrameworks","version","LinkOverlay","Link","eventName","getPackagePath","Flex","align","CDKTypeBadge","mr","ChakraHeading","title","wordBreak","Highlight","_usePackageCard$metad","_usePackageCard","packageTags","highlight","highlightsFrom","Box","HighlightComponent","_objectSpread","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","sort","_ref2","_ref3","left","right","LANGUAGES","indexOf","map","_ref4","info","isSupportedByLibrary","includes","isSupportedByConstructHub","icon","Icon","borderRadius","h","opacity","w","LanguageSupportTooltip","Languages","pkg","Tags","keywords","tags","tagObjectsFrom","slice","id","keyword","PackageTag","variant","WideCard","LinkBox","_hover","bg","Grid","border","boxShadow","wideContainer","minH","templateColumns","base","direction","justify","overflow","p","sx","gap","Stack","spacing","wrap","borderLeft","borderTop","PackageCardContext","createContext","useContext","PackageCard","Wide","Provider","reduce","accum","tag","mapPackageTags","filter","_tag$keyword","Boolean","_tag$keyword2","mapPackageKeywords","KEYWORD_IGNORE_LIST","tagObjects","Array","tagLabels","Set","toLowerCase","push","add","URLSearchParams","brightness","useColorModeValue","Image","alt","src","tagProps","_objectWithoutProperties","_excluded","Tag","textDecoration","TagLabel","SORT_RENDER_MAP","CatalogSearchSort","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","DownloadsDesc","DownloadsAsc","searchEvent","_len","e","_key","SEARCH_ANALYTICS","FILTERS","RESULTS","SEARCH","SORT","FilterHeading","hint","useBreakpointValue","mb","Popover","colorScheme","strategy","PopoverTrigger","ml","QuestionIcon","PopoverContent","mx","shadow","PopoverArrow","PopoverBody","RadioFilter","checkedValue","onValueChange","RadioGroup","onChange","display","Radio","filterItem","isTruncated","toNum","result","parseInt","parseQueryArray","queryString","decodeURIComponent","split","getParamFromUrl","key","window","URL","location","href","searchParams","useSearchParam","transform","qp","useCdkType","_useSearchParam","CDK_TYPE","useCdkMajor","CDK_MAJOR","useKeywords","KEYWORDS","useLanguages","useSearchQuery","_useSearchParam2","SEARCH_QUERY","useSort","_useSearchParam3","useTags","TAGS","useUpdateSearchParam","offset","getSearchUrlParams","_getParamFromUrl","_getParamFromUrl2","cdkType","cdkMajor","cdkMajorParam","OFFSET","CDKFilter","_cdkMajor$toString","updateSearch","searchAPI","useSearchContext","cdkOptions","cdkTypes","opts","meta","pkgCount","CDKTYPE_NAME_MAP","majorsOptions","_cdkOptions$cdkType","majorVersions","a","b","cdkTypeFilter","type","values","cdkVersionFilter","major","majorNum","CheckboxItem","disabledHint","isChecked","Checkbox","CheckboxFilter","initialItemCount","checkedValues","collapse","useDisclosure","trackCustomEvent","useAnalytics","getOnChange","item","clickEvent","alwaysShow","showWhenExpanded","isExpandible","mt","_createElement","Collapse","animateOpacity","in","isOpen","unmountOnExit","Button","leftIcon","ChevronUpIcon","ChevronDownIcon","onClick","onToggle","textAlign","KeywordsFilter","keywordMap","keywordOptions","baseOptions","count1","count2","k","some","opt","languagesFilter","languageOptions","LANGUAGE_NAME_MAP","l1","l2","LanguageFilter","l","TagFilter","useConfigValue","packageTagGroups","tagFilterGroups","_packageTags$filter","tagGroupsMap","Map","forEach","group","mapTagsToFilterGroups","_tag$searchFilter","groupIdOrName","searchFilter","groupBy","customGroup","entry","_accum$groupIdOrName$","_accum$groupIdOrName","onTagsChange","t","getOnRadioTagChange","groupName","_tagFilterGroups$grou","_tagFilterGroups$grou2","groupTags","filteredTags","filterType","tagItems","sharedProps","_tagItems$find$id","_tagItems$find","find","TOP_OFFSET","FilterPanel","Card","filtersPanel","maxH","maxW","minW","pos","top","ArrowButton","props","borderColor","IconButton","disabled","GoToPage","pageLimit","inputValue","setInputValue","onSubmit","preventDefault","Input","max","min","target","onFocus","PageControls","goForward","goBack","prevPage","ChevronLeftIcon","goToPage","nextPage","ChevronRightIcon","SearchBar","setValue","SearchBarComponent","Em","Count","first","count","last","SearchDetails","limit","filtered","hasResults","searchDetails","SortFilter","newSort","SortAndFilterDrawer","drawer","onOpen","rightIcon","Drawer","DrawerOverlay","DrawerContent","DrawerHeader","borderBottom","DrawerCloseButton","DrawerBody","pb","SortedBy","selected","Menu","MenuButton","sortButton","pl","pr","py","MenuList","sortDropdown","MenuItem","sortItem","listViews","items","PackageList","memo","cardView","loading","Center","Spinner","View","displayName","SearchResults","o","page","results","useCatalogResults","scrollTo","Page","pageName","px","Search","templateRows","useConfig","pageInfo","contribute","event","home","faq","packageProfile","siteTerms","notFound","pageType","join","trackPageView","usePageView","feedUrls","suffix","formattedTitle","Helmet","process","content","charSet","url","mimeType","rel","property","forwardRef","ref","format","formatString","boxProps","dateTime","toISOString","isSupported","langName","message"],"ignoreList":[],"sourceRoot":""}
|