construct-hub-webapp 0.1.299 → 0.1.300
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/service-worker.js +1 -1
- package/build/static/js/8.691d34bd.chunk.js +2 -0
- package/build/static/js/8.691d34bd.chunk.js.map +1 -0
- package/build/static/js/{runtime-main.d3c4ab29.js → runtime-main.a6d6b3c7.js} +2 -2
- package/build/static/js/{runtime-main.d3c4ab29.js.map → runtime-main.a6d6b3c7.js.map} +1 -1
- package/cypress/integration/home.spec.ts +268 -17
- package/cypress/integration/search.spec.ts +2 -1
- package/cypress/support/commands.ts +1 -0
- package/cypress/tsconfig.json +5 -0
- package/cypress.json +6 -1
- package/package.json +1 -1
- package/build/static/js/8.31a21ecd.chunk.js +0 -2
- package/build/static/js/8.31a21ecd.chunk.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","hooks/useQueryParams/useQueryParams.ts","hooks/useLanguage/useLanguage.ts","constants/keywords.ts","api/package/util.ts","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/PackageTag/PackageTag.tsx","components/Time/Time.tsx","components/PackageCard/constants.ts","util/css.ts","components/PackageCard/testIds.ts","components/PackageCard/Details.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","../../../src/link-box.tsx","../../../src/Download.tsx","../../../src/use-tabs.ts","../../../src/tabs.tsx","views/HomeRedesign/constants.ts","views/HomeRedesign/testIds.ts","views/HomeRedesign/PackageGrid.tsx","views/HomeRedesign/CDKTypeTabs.tsx","views/HomeRedesign/Featured.tsx","hooks/useConfigValue/useConfigValue.ts","views/HomeRedesign/useSection.ts","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js","views/HomeRedesign/GradientContainer.tsx","views/HomeRedesign/Hero.tsx","views/HomeRedesign/InfoSection.tsx","views/HomeRedesign/Info.tsx","views/HomeRedesign/HomeRedesign.tsx"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","useQueryParams","useLocation","useMemo","URLSearchParams","defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","has","getInitialLang","langFromParams","storedLang","localStorage","getItem","useLanguage","options","updateUrl","updateSaved","pathname","hash","useHistory","replace","params","get","QUERY_PARAMS","LANGUAGE","useState","language","setLanguage","set","toString","update","useCallback","val","setItem","KEYWORD_IGNORE_LIST","Set","getFullPackageName","scope","getAssetsPath","version","prefix","API_PATHS","PACKAGES_PREFIX","body","sanitizeVersion","ver","sanitized","startsWith","substring","extractMajor","split","findPackage","catalog","pkg","packages","filter","p","length","sort","p1","p2","mv1","localeCompare","LanguageSupportTooltip","isSupported","langName","LANGUAGE_NAME_MAP","message","hasArrow","label","placement","PackageTag","value","zIndex","tagProps","NavLink","to","getSearchPath","query","_hover","textDecoration","Time","forwardRef","ref","date","formatString","format","boxProps","as","dateTime","toISOString","displayName","PackageCardType","makeGridAreas","rows","map","row","join","testIds","createTestIds","Detail","dataTestid","icon","fontSize","Details","currentLanguage","usePackageCard","author","metadata","data","useStats","downloads","npm","authorName","undefined","Download","toLocaleString","published","Date","color","Heading","comment","constructFramework","cdkType","cdkVersion","majorVersion","Link","getPackagePath","align","CDKTYPE_RENDER_MAP","alt","h","mr","src","imgsrc","w","fontWeight","wordBreak","lineHeight","noOfLines","HIGHLIGHT_RENDER_MAP","official","community","highQuality","Highlight","isOfficial","OFFICIAL_SCOPES","some","includes","direction","spacing","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","left","right","LANGUAGES","indexOf","info","isSupportedByLibrary","isSupportedByConstructHub","Icon","borderRadius","opacity","Languages","Tags","keywords","variant","v","Boolean","slice","tag","GRID_AREA","gridAreasMd","gridAreasMobile","WideCard","bg","autoColumns","autoRows","border","boxShadow","wideContainer","gap","templateAreas","base","gridArea","display","maxH","overflow","alignItems","alignSelf","templateColumns","templateRows","PackageCardContext","createContext","useContext","PackageCard","Wide","Provider","LinkOverlay","className","cx","rel","isExternal","target","__css","position","cursor","top","width","height","LinkBox","DownloadIcon","createIcon","d","viewBox","createDescendantContext","errorMessage","makeTabId","id","makeTabPanelId","Tabs","styles","useMultiStyleConfig","omitThemingProps","props","lazyBehavior","orientation","React","defaultIndex","useControllableState","defaultValue","onChange","index","setFocusedIndex","descendants","useTabsDescendants","useId","selectedIndex","focusedIndex","setSelectedIndex","isManual","isLazy","htmlProps","useTabs","context","rootProps","omit","root","Tab","useStyles","tabProps","isFocusable","useTabsContext","useTabsDescendant","disabled","isDisabled","register","isSelected","clickableProps","useClickable","mergeRefs","onClick","callAllHandlers","role","tabIndex","type","onFocus","useTab","tabStyles","outline","justifyContent","TabList","tablistProps","useTabsDescendantsContext","onKeyDown","nextTab","next","focus","prevTab","prev","isHorizontal","isVertical","eventKey","normalizeEventKey","ArrowStart","ArrowEnd","action","first","last","useTabList","tablistStyles","TabPanel","panelProps","hasBeenSelected","determineLazyBehavior","hidden","useTabPanel","tabpanel","TabPanels","panelsProps","getValidChildren","useTabPanels","tabpanels","TabIndicator","indicatorStyle","useSafeLayoutEffect","isUndefined","tab","setRect","offsetWidth","offsetHeight","requestAnimationFrame","setHasMeasured","cancelAnimationFrame","transitionProperty","transitionDuration","hasMeasured","transitionTimingFunction","useTabIndicator","style","indicator","SECTION_PADDING","X","Y","PackageGrid","packageGrid","mt","PackageTab","cdkTypeTab","results","PackageTabPanel","cdkTypeGrid","justify","cdkTypeSeeAllButton","window","scrollTo","CatalogSearchSort","DownloadsDesc","colorScheme","my","CDKTypeTabs","anyCDKType","useCatalogResults","limit","awscdk","CDKType","cdk8s","cdktf","cdkTypeSection","px","py","cdkTypeSectionHeading","mb","cdkTypeSectionDescription","maxW","isFitted","minH","Featured","homePackages","key","useConfig","useConfigValue","DEFAULT_FEATURED_PACKAGES","sections","featured","showLastUpdated","section","showPackages","useCatalog","loading","error","SORT_FUNCTIONS","PublishDateDesc","useSection","featuredContainer","featuredHeader","featuredGrid","strings","raw","animation","keyframes","freeze","defineProperties","GradientContainer","bgSize","Hero","textAlign","heroHeader","heroSubtitle","mx","SearchBar","hasButton","InfoSection","infoSection","infoSectionHeading","infoSectionDescription","Info","infoContainer","pt","wrap","cdktype","infoSectionIcon","HomeRedesign","Flex"],"mappings":"0LAAaA,EAAW,CACtBC,KAAM,CACJC,MAAO,CACLC,KAAM,cAGVC,IAAK,CACHF,MAAO,CACLC,KAAM,oCAGVE,eAAgB,CACdH,MAAO,CACLC,KAAM,yBAGVG,OAAQ,CACNJ,MAAO,CACLC,KAAM,gBAGVI,UAAW,CACTL,MAAO,CACLC,KAAM,oBAGVK,SAAU,CACRC,KAAM,CACJC,SAAU,aAEZR,MAAO,CACLC,KAAM,mB,gBCjBCQ,EAAqC,SAAC,GAI5C,IAHLC,EAGI,EAHJA,SACAC,EAEI,EAFJA,KACAC,EACI,EADJA,SAEMC,EAAgBC,YAAYhB,EAASc,IAE3CG,qBAAU,WACRF,MACC,CAACA,IAEJ,MAA8CF,EAAtCK,cAAR,SAAuBC,EAAuBN,EAAvBM,MAAOC,EAAgBP,EAAhBO,YACxBC,EAAiBH,EAAM,UAAMC,EAAN,oBAAgCA,EAE7D,OACE,qCACE,eAACG,EAAA,EAAD,YACGC,EAOD,sBAAMC,QAAQ,sCAAsCrB,KAAK,aACzD,sBAAMsB,QAAQ,UAEd,gCAAQJ,IACR,sBAAMG,QAASH,EAAgBK,SAAS,aACxC,sBAAMF,QAASH,EAAgBlB,KAAK,kBACpC,sBAAMqB,QAAQ,UAAUrB,KAAK,iBAE7B,sBAAMqB,QAASJ,EAAajB,KAAK,gBACjC,sBAAMqB,QAASJ,EAAaM,SAAS,mBACrC,sBAAMF,QAASJ,EAAajB,KAAK,2BAElCS,O,sFC/CMe,EAAiB,WAC5B,IAAQrB,EAAWsB,cAAXtB,OAER,OAAOuB,mBAAQ,kBAAM,IAAIC,gBAAgBxB,KAAS,CAACA,M,uHCC/CyB,EAAcC,IAASC,WAEvBC,EAAY,qBAEZC,EAAc,SAACC,GAAD,OACV,MAARA,GAAgBC,IAAyBC,IAAIF,IAEzCG,EAAiB,SAACC,GAEtB,GAAIL,EAAYK,GACd,OAAOA,EAIT,IAAK,IAAD,EACIC,EAAU,UAAIC,aAAaC,QAAQT,UAAzB,QAAuC,GACvD,GAAIC,EAAYM,GAAa,OAAOA,EACpC,UAKF,OAAOV,GAcIa,EAAc,WAAuC,IAAtCC,EAAqC,uDAAP,GAChDC,EAA2BD,EAA3BC,UAAWC,EAAgBF,EAAhBE,YACnB,EAA2BnB,cAAnBoB,EAAR,EAAQA,SAAUC,EAAlB,EAAkBA,KAClB,EAAoBC,cAAZC,EAAR,EAAQA,QACFC,EAASzB,cACTa,EAAiBY,EAAOC,IAAIC,IAAaC,UAG/C,EAAgCC,oBAAmB,kBACjDjB,EAAeC,MADjB,mBAAOiB,EAAP,KAAiBC,EAAjB,KAKAzC,qBAAU,WACJkB,EAAYK,IAAmBA,IAAmBiB,GACpDC,EAAYlB,KAGb,CAACA,IAGJvB,qBAAU,WACJuB,IAAmBiB,GAAYX,IACjCM,EAAOO,IAAIL,IAAaC,SAAUE,GAClCN,EAAQ,CAAEH,WAAUC,OAAM3C,OAAQ8C,EAAOQ,gBAG1C,CAACH,EAAUX,IAEd,IAAMe,EAASC,uBACb,SAACC,GAGC,GAFAL,EAAYK,GAERhB,EACF,IACEL,aAAasB,QAAQ9B,EAAW6B,GAChC,aAKN,CAAChB,IAGH,OAAOlB,mBAAQ,iBAAM,CAAC4B,EAAUI,KAAkB,CAACJ,EAAUI,M,iCCvF/D,kCAAO,IAAMI,EAAsB,IAAIC,IAAI,CACzC,UACA,MACA,SACA,gBACA,MACA,YACA,gB,iCCPF,oJAGaC,EAAqB,SAAChE,EAAciE,GAC/C,OAAOA,EAAK,UAAMA,EAAN,YAAejE,GAASA,GAGzBkE,EAAgB,SAC3BlE,EACAmE,EACAF,GAEA,IAAMG,EAAM,UAAMC,IAAUC,gBAAhB,KACNC,EAAOP,EAAmBhE,EAAMiE,GAChClD,EAAM,YAAQoD,GACpB,MAAM,GAAN,OAAUC,GAAV,OAAmBG,GAAnB,OAA0BxD,IAGfyD,EAAkB,SAACC,GAC9B,IAAIC,EAAYD,EAIhB,OAHIC,EAAUC,WAAW,MAAQD,EAAUC,WAAW,QACpDD,EAAYA,EAAUE,UAAU,IAE3BF,GAGHG,EAAe,SAACJ,GAEpB,OADgBD,EAAgBC,GACfK,MAAM,KAAK,IAGjBC,EAAc,SACzBC,EACAC,GAEA,IAAMC,EAAWF,EAAQE,SAASC,QAAO,SAACC,GAAD,OAAOA,EAAEpF,OAASiF,KAE3D,OAAIC,EAASG,OAAS,EACbH,EAASI,MAAK,SAACC,EAAIC,GACxB,IAAMC,EAAMZ,EAAaU,EAAGpB,SAE5B,OADYU,EAAaW,EAAGrB,SACjBuB,cAAcD,MACxB,GAGEP,EAAS,K,gGCjCLS,EACX,SAAC,GAA4B,IAA1BlF,EAAyB,EAAzBA,SAAU6C,EAAe,EAAfA,SACLsC,EAAc1D,IAAyBC,IAAImB,GAC3CuC,EAAWC,IAAkBxC,GAE7ByC,EAAUH,EAAW,yCACWC,GADX,oCAEMA,EAFN,oBAI3B,OACE,cAAC,IAAD,CAASG,UAAQ,EAACC,MAAOF,EAASG,UAAU,YAA5C,SACE,+BAAOzF,Q,yKCVF0F,EAAiD,SAAC,GAOxD,IANL1F,EAMI,EANJA,SACA6C,EAKI,EALJA,SACA8C,EAII,EAJJA,MAII,IAHJH,aAGI,MAHIG,EAGJ,EAFJC,EAEI,EAFJA,OACGC,EACC,iBACJ,OACE,cAACC,EAAA,EAAD,CACE,4BAAoBN,GACpBO,GAAIC,YAAc,CAAEC,MAAM,GAAD,OAAKN,GAAS9C,aACvC+C,OAAQA,EAHV,SAKE,cAAC,IAAD,yBACEM,OAAQ,CACNC,eAAgB,cAEdN,GAJN,aAME,cAAC,IAAD,UAAW7F,W,2ICvBNoG,EAAOC,aAClB,WAA8CC,GAAS,IAApDC,EAAmD,EAAnDA,KAAcC,EAAqC,EAA7CC,OAAyBC,EAAoB,iBACpD,OACE,cAAC,IAAD,yBAAKC,GAAG,OAAOC,SAAUL,EAAKM,cAAeP,IAAKA,GAASI,GAA3D,aACGD,YAAOF,EAAMC,SAMtBJ,EAAKU,YAAc,Q,iCCpBZ,IAAKC,E,6EAAAA,K,aAAAA,M,oDCcCC,EAAgB,WAAkC,IAAD,uBAA7BC,EAA6B,yBAA7BA,EAA6B,gBAC5D,OAAOA,EAAKC,KAAI,SAACC,GAAD,iBAAaA,EAAIC,KAAK,KAAtB,QAA+BA,KAAK,M,2ECDvCC,EAZCC,YAAc,cAAe,CAC3C,SACA,cACA,YACA,YACA,YACA,QACA,UACA,UACA,kB,OCOIC,EAAyC,SAAC,GAAD,IAC9BC,EAD8B,EAC7C,eACAC,EAF6C,EAE7CA,KACAjC,EAH6C,EAG7CA,MACAG,EAJ6C,EAI7CA,MAJ6C,OAM7C,eAAC,IAAD,CAAM,cAAa6B,EAAYE,SAAS,KAAxC,UACGD,EACAA,EAAO,IAAM,GACd,iCAASjC,IAHX,IAG4BG,MAIjBgC,EAA6B,WAAO,IAAD,MAC9C,EAA0B3F,cAAnB4F,EAAP,oBAEA,EAKIC,IAJFC,EADF,EACEA,OACYvB,EAFd,EAEEwB,SAAYxB,KACZ7C,EAHF,EAGEA,QACAnE,EAJF,EAIEA,KAGMyI,EAASC,cAATD,KACFE,EAA6B,OAAGF,QAAH,IAAGA,GAAH,UAAGA,EAAMvD,gBAAT,iBAAG,EAAiBlF,UAApB,iBAAG,EAAwB2I,iBAA3B,aAAG,EAAmCC,IAEnEC,EAA+B,kBAAXN,EAAsBA,EAASA,EAAOvI,KAEhE,OACE,0CACiB8I,IAAdH,GAA2BA,GAAa,GACvC,cAAC,EAAD,CACE,cAAab,EAAQa,UACrBT,KAAM,cAACa,EAAA,EAAD,IACN9C,MAAO0C,EAAUK,iBACjB5C,MAAO,cAGT,cAAC,EAAD,CAAQ,cAAa0B,EAAQ3D,QAAS8B,MAAM,UAAUG,MAAOjC,IAE/D,cAAC,EAAD,CACE,cAAa2D,EAAQmB,UACrBhD,MAAM,YACNG,MACE,cAACS,EAAA,EAAD,CAAMG,KAAM,IAAIkC,KAAKlC,GAAOmB,SAAS,KAAKjB,OAAO,mBAGrD,cAAC,EAAD,CACE,cAAaY,EAAQS,OACrBtC,MAAM,SACNG,MACE,cAACG,EAAA,EAAD,CACE4C,MAAM,WACN3C,GAAIC,YAAc,CAChBC,MAAOmC,EACPvF,SAAU+E,IAJd,SAOGQ,U,oDC5DAO,EAA6B,WACxC,MAA0B3G,cAAnB4F,EAAP,oBACA,EAMIC,IALFe,EADF,EACEA,QACApI,EAFF,EAEEA,YACYqI,EAHd,EAGEd,SAAYc,mBACZtJ,EAJF,EAIEA,KACAmE,EALF,EAKEA,QAGIoF,EAAO,OAAGD,QAAH,IAAGA,OAAH,EAAGA,EAAoBtJ,KAC9BwJ,EAAU,OAAGF,QAAH,IAAGA,OAAH,EAAGA,EAAoBG,aAEvC,OACE,qCACE,cAAC,IAAD,CACErC,GAAIsC,IACJlD,GAAImD,YAAe,CACjB3J,OACAmE,UACAb,SAAU+E,IALd,SAQE,eAAC,IAAD,CAAMuB,MAAM,SAAZ,UACGL,GACC,cAAC,IAAD,CACEvD,UAAQ,EACRC,MACE4D,IAAmBN,GAASvJ,WACZ8I,IAAfU,EAAA,YAAgCA,GAAe,IAElDtD,UAAU,MANZ,SAQE,cAAC,IAAD,CACE4D,IAAG,UAAKD,IAAmBN,GAASvJ,KAAjC,SACH+J,EAAG,EACHC,GAAI,EACJC,IAAKJ,IAAmBN,GAASW,OACjCC,EAAG,EACH9D,OAAQ,MAId,cAAC,IAAD,CACEe,GAAG,KACH+B,MAAM,WACN,cAAarB,EAAQ9G,MACrBmH,SAAS,KACTiC,WAAW,OACXC,UAAU,YANZ,SAQGrK,SAIP,cAAC,IAAD,CACEmJ,MAAM,WACN,cAAarB,EAAQ7G,YACrBkH,SAAS,KACTmC,WAAW,OACXC,UAAW,EALb,SAOGtJ,GAAe,8BAEjBoI,GACC,eAAC,IAAD,CACE,cAAavB,EAAQuB,QACrBlB,SAAS,KACTmC,WAAW,OACXC,UAAW,EAJb,UAME,eAAC,IAAD,CACEnD,GAAG,OACH+B,MAAM,WACNhB,SAAS,KACTiC,WAAW,OACXE,WAAW,OALb,2BAOsB,OAErBjB,SC3FLmB,EAAuB,CAC3BC,SAAU,CACRP,OAAQ,wBACRjE,MAAO,WACPkD,MAAO,WAETuB,UAAW,CACTR,OAAQ,wBACRjE,MAAO,YACPkD,MAAO,WAETwB,YAAa,CACXT,OAAQ,oBACRjE,MAAO,eACPkD,MAAO,YAKEyB,EAA+B,WAC1C,IAAQ5K,EAASsI,IAATtI,KAEF6K,EAAaC,IAAgBC,MAAK,SAAC9G,GAAD,OAAWjE,EAAKgL,SAAS/G,MAEjE,EAAiCuG,EADXK,EAAa,WAAa,aACxCX,EAAR,EAAQA,OAAQf,EAAhB,EAAgBA,MAAOlD,EAAvB,EAAuBA,MAEvB,OACE,eAAC,IAAD,CAAO2D,MAAM,SAASqB,UAAU,MAAMC,QAAS,EAA/C,UACE,cAAC,IAAD,CAAOpB,IAAG,UAAK7D,EAAL,SAAmBgE,IAAKC,EAAQC,EAAG,IAC7C,cAAC,IAAD,CAAMhB,MAAOA,EAAOiB,WAAW,OAA/B,SACGnE,Q,yBCxBHkF,EAAQ,CACZC,GAAI,EACJC,GAAI,EACJC,GAAI,GAWOC,EAA6D,SAAC,GAMpE,IAAD,IALJC,iBAKI,SAJJC,EAII,EAJJA,UACMC,EAGF,EAHJ1L,KAGI,IAFJ2L,YAEI,MAFG,KAEH,EADJxH,EACI,EADJA,QAEMyH,EAAUC,OAAOC,KAAP,OAAYL,QAAZ,IAAYA,IAAa,IACzC,OACE,mCACGI,OAAOE,QAAQC,KAEb1G,MACC,kBAAE2G,EAAF,oBAAUC,EAAV,2BACEC,IAAUC,QAAQH,GAClBE,IAAUC,QAAQF,MAErBvE,KAAI,YAAmB,IAAD,mBAAhB1F,EAAgB,KAAVoK,EAAU,KACf/I,EAAWrB,EAEXqK,EACJhJ,IAAazB,IAASC,YAAc8J,EAAQZ,SAAS1H,GAEjDiJ,EACJjJ,IAAazB,IAASC,YAEtBI,IAAyBC,IAAImB,GAE/B,IAAKgJ,EAAsB,OAAO,KAElC,IAAQtM,EAAqBqM,EAArBrM,KAAYwM,EAASH,EAAfnE,KAERA,EACJ,cAACsE,EAAD,CACE,gCAAwBxM,GACxByM,aAAcjB,EAAY,MAAQ,EAClCzB,EAAGoB,EAAMQ,GACTe,QAASH,EAA4B,EAAI,GACzCpC,EAAGgB,EAAMQ,KAIb,OACE,cAAChG,EAAA,EAAD,CAAuCrC,SAAUA,EAAjD,SACGiJ,EACC,cAAC,IAAD,CACE,6CAAqCjJ,GACrCkD,GAAImD,YAAe,CAAE3J,KAAM0L,EAAavH,UAASb,aAFnD,SAIG4E,IAGHA,GATyB5E,SChE5BqJ,EAA+B,WAC1C,IAAM1H,EAAMqD,IACZ,OAAO,cAAC,EAAD,2BAAsBrD,GAAtB,IAA2B0G,KAAK,S,0BCC5BiB,EAA0B,WACrC,MAA2BtE,IAAnBuE,EAAR,EAAQA,SAAU7M,EAAlB,EAAkBA,KAElB,OACE,oCAEI8K,IAAgBC,MAAK,SAAC9G,GAAD,OAAWjE,EAAKgL,SAAS/G,MAC5C,cAACkC,EAAA,EAAD,CAEEF,MAAM,WACN+D,GAAI,EACJ5D,MAAM,WACN0G,QAAQ,WALV,qBACM,YAQJ,MAZR,oBAaO,OAACD,QAAD,IAACA,IAAY,IACb1H,QAAO,SAAC4H,GAAD,OAAOC,QAAQD,KAAOjJ,IAAoB3B,IAAI4K,MACrDE,MAAM,EAAG,GACTtF,KAAI,SAACuF,GACJ,OACE,cAAC/G,EAAA,EAAD,CAEE6D,GAAI,EACJ5D,MAAK,WAAM8G,EAAN,KACL7G,OAAO,eAJT,SAMG6G,GALIA,WCpBfC,EACK,UADLA,EAEO,YAFPA,EAGE,OAHFA,EAIK,UAGLC,EAAc3F,EAClB,CAAC0F,EAAmBA,EAAmBA,GACvC,CAACA,EAAmBA,EAAmBA,GACvC,CAACA,EAAgBA,EAAgBA,IAG7BE,EAAkB5F,EACtB,CAAC0F,GACD,CAACA,GACD,CAACA,IAGUG,EAA8B,WACzC,OACE,cAAC,IAAD,CACE3G,OAAQ,CACN,YAAa,CACX4G,GAAI,YAHV,SAOE,eAAC,IAAD,CACEnG,GAAG,UACHoG,YAAY,MACZC,SAAS,OACTF,GAAG,QACHG,OAAO,OACPjB,aAAa,KACbkB,UAAU,OACVxE,MAAM,WACN,cAAarB,EAAQ8F,cACrBC,IAAK,EACL9D,EAAE,OACF3E,EAAG,EACH0I,cAAe,CAAEC,KAAMV,EAAiBhC,GAAI+B,GAC5CjD,EAAE,OAdJ,UAiBE,cAAC,IAAD,CAAO6D,SAAUb,EAAmBjC,QAAS,EAA7C,SACE,cAAC,EAAD,MAGF,cAAC,IAAD,CACED,UAAU,MACVgD,QAAS,CAAEF,KAAM,OAAQ1C,GAAI,WAC7B2C,SAAUb,EACVe,KAAM,EACNC,SAAS,SALX,SAOE,cAAC,EAAD,MAGF,eAAC,IAAD,CACEC,WAAW,QACXC,UAAU,SACVb,YAAa,CAAEO,KAAM,UAAW1C,GAAI,OACpCoC,SAAU,CAAEM,KAAM,UAAW1C,GAAI,QACjClD,SAAS,KACT0F,IAAK,CAAEE,KAAM,EAAG1C,GAAI,GACpB2C,SAAUb,EACVmB,gBAAiB,CAAEP,KAAM,UAAW1C,GAAI,WACxCkD,aAAc,CAAER,KAAM,UAAW1C,GAAI,WATvC,UAWE,cAAC,EAAD,IACA,cAAC,EAAD,OAGF,eAAC,IAAD,CAAO2C,SAAUb,EAAqBjC,QAAS,CAAE6C,KAAM,EAAG1C,GAAI,GAA9D,UACE,cAAC,IAAD,CAAS4C,QAAS,CAAE5C,GAAI,UACxB,cAAC,IAAD,CAAO,cAAavD,EAAQ2D,UAAWR,UAAU,MAAMC,QAAS,EAAhE,SACE,cAAC,EAAD,eC7ENsD,EAAqBC,wBAEzB,MAEWnG,EAAiB,kBAAMoG,qBAAWF,IAElCG,EAAmD,SAAC,GAG1D,IAFL1J,EAEI,EAFJA,IAEI,IADJ6H,eACI,MADMtF,EAAgBoH,KACtB,EACJ,OACE,cAACJ,EAAmBK,SAApB,CAA6BzI,MAAOnB,EAApC,SACG6H,IAAYtF,EAAgBoH,MAAQ,cAAC,EAAD,Q,8dCXpC,IAAME,EAAchI,aAAkC,cAC3D,IAAM,EAAN,EAAM,aAAN,EAAM,SAAN,EAAM,IAA2BiI,EAAjC,EAAiCA,UAAjC,iDACA,OACE,gBAAC,IAAD,UAEEhI,IAFF,EAGEgI,UAAWC,YAAG,0BAHhB,GAIEC,IAAKC,EAAa,sBAJpB,EAKEC,OAAQD,EAAa,SALvB,EAMEE,MAAO,CACLC,SADK,SAEL,YAAa,CACXhO,QADW,KAEXiO,OAFW,UAGXrB,QAHW,QAIXoB,SAJW,WAKXE,IALW,EAMXtD,KANW,EAOX5F,OAPW,EAQXmJ,MARW,OASXC,OAAQ,eAeLC,EAAU5I,aAAgC,cAC/C,IAAEiI,EAAR,EAAQA,UAAR,qBAEA,OACE,gBAAC,IAAD,OACEhI,IADF,EAEEsI,SAAS,YAFX,GAIEN,UAAWC,YAAG,iBAJhB,GAKEI,MAAO,CAEL,qDAAsD,CACpDC,SADoD,WAEpDhJ,OAAQ,W,iCC3DlB,8CAEasJ,EAAeC,YAAW,CACrCC,EADqC,+MAGrCtI,YAHqC,eAIrCuI,QAAS,e,grBCsBJ,MAKHC,cALG,mBAAM,EAAN,KAAM,EAAN,KAAM,EAAN,KAAM,EAAN,KAmJA,MAAuCtB,YAA6B,CACzEzO,KADyE,cAEzEgQ,aACE,yGAHG,mBAAM,EAAN,KAAM,EAAN,KA2RP,SAASC,EAAUC,EAAnB,GACE,OAAUA,EAAV,WAGF,SAASC,EAAeD,EAAxB,GACE,OAAUA,EAAV,gB,sVC5ZK,IAAME,EAAOtJ,aAA6B,cAC/C,IAAMuJ,EAASC,YAAoB,OAAnC,GACA,EAAyCC,YAAzC,GAAM,EAAN,EAAM,SAAYxB,EAAlB,EAAkBA,UAElB,ED+CK,SAAiByB,GACtB,IAAM,EAAN,EAAM,eAAN,EAAM,WAAN,EAAM,QAAN,EAAM,WAAN,EAAM,OAAN,IAMEC,oBANF,MAAM,UAAN,MAOEC,mBAPF,MAAM,aAAN,MAQEzF,iBARF,MAQc,MARd,0GAwBA,EAAwC0F,iBAAeC,EAAfD,EAAxC,sBAAM,EAAN,KAAM,EAAN,KAEA,EAA0CE,YAAqB,CAC7DC,aAAY,MAAEF,EAAF,EADiD,EAE7DxK,MAF6D,EAG7D2K,aAHF,mBAAM,EAAN,KAAM,EAAN,KASAJ,aAAgB,WACd,MAAIK,GACFC,OAED,CAJHN,IASA,IAAMO,EAAcC,IAOpB,MAAO,CACLjB,GAHSkB,YAAMZ,EAAD,GAAhB,QAIEa,gBACAC,eACAC,mBACAN,kBACAO,WACAC,SACAhB,eACAC,cACAQ,cACAjG,YACAyG,aC/GyCC,CAF3C,+BAEM,EAAN,EAAM,UAAaT,EAAnB,EAAmBA,YAAnB,mCACMU,EAAUjB,WAAc,kBAAdA,IAAyB,CAAzC,IAEMkB,EAAYC,YAAKJ,EAAkB,CAAzC,aAEA,OACE,mBAAyBtL,MAAO8K,GAC9B,mBAAc9K,MAAOwL,GACnB,qBAAgBxL,MAAOiK,GACrB,gBAAC,IAAD,OACEtB,UAAWC,YAAG,cADhB,GAEEjI,IAAKA,GAFP,GAIEqI,MAAOiB,EAAO0B,OARxB,SAkBE,EAAJ,IACE3B,sBASK,IAAM4B,EAAMlL,aAA+B,cAChD,IAAMuJ,EAAS4B,cACTC,ED0LD,YACL,IAAM,EAAN,EAAM,WAAcC,EAApB,EAAoBA,YAApB,oCAEA,EAMIC,IANE,EAAN,EAAM,mBAAN,EAAM,WAAN,EAAM,KAAN,EAAM,gBAKJf,EALF,EAKEA,cAGF,EAA4BgB,EAAkB,CAC5CC,SAAUC,IAAeJ,IADrB,EAAN,EAAM,MAASK,EAAf,EAAeA,SAITC,EAAazB,IAAnB,EAeM0B,EAAiBC,YAAa,EAAD,MAEjC5L,IAAK6L,YAAUJ,EAAUhC,EAFQ,KAGjC+B,aACAJ,cACAU,QAASC,YAAgBtC,EAAD,SAlBV,WACde,WAsBF,eAEErB,GAAID,EAAUC,EAFhB,GAGE6C,KAHF,MAIEC,SAAUP,EAAa,GAJzB,EAKEQ,KAPF,SAQE,gBANF,EAOE,gBAAiB9C,EAAeD,EAPlC,GAQEgD,QAASX,OAAazJ,EAAYgK,YAAgBtC,EAAD,SA3BnC,WACdS,MAEsBO,KADSe,IAA/B,IAGEhB,UCpNa4B,CAAO,EAAD,MAAapM,SAE9BqM,EAA+B,EAAH,CAChCC,QADgC,IAEhCpF,QAFgC,OAGhCG,WAHgC,SAIhCkF,eAAgB,UACbjD,EALL,KAQA,OACE,gBAAC,IAAD,eAEEtB,UAAWC,YAAG,mBAAoBwB,EAFpC,WAGEpB,MAAOgE,QAKT,EAAJ,IACEpB,qBAWK,IAAMuB,EAAUzM,aAAgC,cACrD,IAAM0M,EDyED,YACL,MAAiDpB,IAA3C,EAAN,EAAM,eAAN,EAAM,YAA6BnH,EAAnC,EAAmCA,UAE7BiG,EAAcuC,IAEdC,EAAY,eACf3T,YAA+B,MACxB4T,EAAU,WACd,IAAMC,EAAO1C,cAAb,GACA,GAAU2C,YAAMD,EAANC,OAENC,EAAU,WACd,IAAMC,EAAO7C,cAAb,GACA,GAAU2C,YAAME,EAANF,OAWNG,EAAN,eAAqBtD,EACfuD,EAAN,aAAmBvD,EAEbwD,EAAWC,YAAjB,GAEMC,EAAanJ,sBAAnB,aACMoJ,EAAWpJ,uBAAjB,YAWMqJ,GATmB,mBACvB,GAAc,kBAAMN,GAAgBF,OADb,cAEvB,GAAY,kBAAME,GAAgBL,OAFX,2BAGZ,kBAAMM,GAAcN,OAHR,yBAId,kBAAMM,GAAcH,OAJN,sBAjBR,WACf,IAAMS,EAAQrD,EAAd,eACA,GAAW2C,YAAMU,EAANV,SAeY,qBAbT,WACd,IAAMW,EAAOtD,EAAb,cACA,GAAU2C,YAAMW,EAANX,SAWa,GASzB,GAEA,IACE9T,mBACAuU,QAGJ,CAACpD,EAAaI,EAAcZ,EA3C9B,IA8CA,eAEEqC,KAFF,UAGE,mBAHF,EAIEW,UAAWZ,YAAgBtC,EAAD,eChIPiE,CAAW,EAAD,MAAa1N,SAItC2N,EAAmC,EAAH,CACpCzG,QAAS,QAHIgE,cAEf,SAKA,OACE,gBAAC,IAAD,YAEElD,UAAWC,YAAG,uBAAwBwB,EAFxC,WAGEpB,MAAOsF,QAKT,EAAJ,IACEnB,yBASK,IAAMoB,EAAW7N,aAAiC,cACvD,IAAM8N,EDuND,SAAqBpE,GAC1B,IAAM,EAAN,EAAM,aAAN,EAAM,GAAkB/P,EAAxB,EAAwBA,SAAxB,sCACA,EAAiC2R,IAA3B,EAAN,EAAM,OAAU3B,EAAhB,EAAgBA,aAEVoE,EAAkBlE,UAAxB,GAYA,OAXA,IACEkE,cAUF,GAEE7B,SAAU,GAFZ,GAIEvS,SAX2BqU,YAAsB,CACjDD,gBAAiBA,EADgC,QAEjDpC,aACAhB,SACAhB,iBAOiChQ,EAJnC,KAKEsS,KALF,WAMEgC,QANF,EAOE7E,OC9OiB8E,CAAY,EAAD,MAAajO,SACrCsJ,EAAS4B,cAEf,OACE,gBAAC,IAAD,OACEoB,QAAQ,KADV,GAGEtE,UAAWC,YAAG,yBAA0BwB,EAH1C,WAIEpB,MAAOiB,EAAO4E,eAKhB,EAAJ,IACEN,0BAaK,IAAMO,EAAYpO,aAAkC,cACzD,IAAMqO,EDkKD,YACL,IAAMvD,EAAUQ,IAEV,EAAN,EAAM,GAAMf,EAAZ,EAAYA,cAaZ,eAAmB5Q,SAXG2U,YAAiB5E,EAAvC,UAEiB,KAAkB,qBACjC,iBAAmC,CACjCiC,WAAYzB,IADqB,EAEjCd,GAAIC,EAAeD,EAFc,GAIjC,kBAAmBD,EAAUC,EAAIc,UC9KjBqE,CAApB,GACMhF,EAAS4B,cAEf,OACE,gBAAC,IAAD,YAEEzC,MAFF,OAGEzI,IAHF,EAIEgI,UAAWC,YAAG,0BAA2BwB,EAJ3C,WAKEpB,MAAOiB,EAAOiF,gBAKhB,EAAJ,IACEJ,2BAWK,IAAMK,EAAezO,aAC1B,cACE,IAAM0O,EDkMH,WACL,IAAM5D,EAAUQ,IACVlB,EAAcuC,IAEd,EAAN,EAAM,cAAiB/C,EAAvB,EAAuBA,YAEjBsD,EAAN,eAAqBtD,EACfuD,EAP+C,aAOlCvD,EAGnB,EAAwB,YAAe,WACrC,SAAyB,CAAEzE,KAAF,EAAWuD,MAAO,GAC3C,EAAuB,CAAED,IAAF,EAAUE,OAAQ,QAAzC,KAFF,mBAAM,EAAN,KAAM,EAAN,KAMA,EAAsCkB,YAhBe,GAgBrD,mBAAM,EAAN,KAAM,EAAN,KAgCA,OA7BA8E,aAAoB,WAClB,IAAIC,YAAJ,IAEA,IAAMC,EAAMzE,OAAZ,GACA,IAAIwE,YAAJ,IAGA,GACEE,EAAQ,CAAE3J,KAAM0J,OAAR,WAA6BnG,MAAOmG,OAASE,cAIvD,GACED,EAAQ,CAAErG,IAAKoG,OAAP,UAA2BlG,OAAQkG,OAASG,eAKtD,IAAM5F,EAAK6F,uBAAsB,WAC/BC,SAGF,OAAO,WACL,GACEC,6BAGH,CAAC5E,EAAe2C,EAAcC,EA3BjCwB,IA6BA,GACEpG,SADF,WAEE6G,mBAFF,2BAGEC,mBAAoBC,EAAc,QAHpC,MAIEC,yBAA0B,8BAJ5B,GClPyBC,GACjBC,EAAQ,EAAH,GACN/F,EADM,MAAX,GAKMH,EAAS4B,cAEf,OACE,gBAAC,IAAD,OACElL,IAAKA,GADP,GAGEgI,UAAWC,YAAG,6BAA8BwB,EAH9C,WAIE+F,MAJF,EAKEnH,MAAOiB,EAAOmG,gBAMlB,EAAJ,IACEjB,8B,6ECpOWkB,GAAkB,CAC7BC,EAAG,CAAC,EAAG,EAAG,GAAI,GAAI,IAClBC,EAAG,CAAC,EAAG,EAAG,I,6BCAG5O,gBAAc,eAAgB,CAC3C,OACA,cAEA,aACA,eAEA,gBACA,cACA,qBACA,yBACA,kBAEA,oBACA,iBACA,eAEA,iBACA,wBACA,4BACA,aACA,cACA,wB,QClBW6O,GAAiE,SAAC,GAExE,IADL1R,EACI,EADJA,SAEA,OACE,eAAC,KAAD,CACE,cAAa4C,GAAQ+O,YACrBhJ,IAAK,EACLiJ,GAAI,EACJxI,gBAAiB,CAAEP,KAAM,MAAOzC,GAAI,WAJtC,SAMGpG,EAASyC,KAAI,SAAC1C,GAAD,OACZ,eAAC0J,GAAA,EAAD,CAA4B1J,IAAKA,GAAfA,EAAIjF,Y,sBCWxB+W,GAAiD,SAAC,GAAuB,IAArBxN,EAAoB,EAApBA,QAASd,EAAW,EAAXA,KACjE,OACE,gBAACuJ,EAAD,CACE,cAAalK,GAAQkP,WACrB,aAAYzN,EACZgJ,WAAY9J,EAAKnI,KAAK+E,OAAS,EAHjC,UAKGkE,EAAUM,KAAmBN,GAASvJ,KAAO,WALhD,KAMGyI,EAAKwO,QAAQ5R,OANhB,QAWE6R,GAAkBpQ,aACtB,WAA8BC,GAAS,IAApCwC,EAAmC,EAAnCA,QAASd,EAA0B,EAA1BA,KAAS+H,EAAiB,kBACpC,OACE,gBAACmE,EAAD,yBAAU,cAAa7M,GAAQqP,YAAapQ,IAAKA,GAASyJ,GAA1D,IAAiEpL,EAAG,EAApE,UACE,eAAC,GAAD,CAAaF,SAAUuD,EAAKnI,OAE5B,eAAC,IAAD,CAAM8W,QAAQ,SAASjN,EAAE,OAAzB,SACE,eAAC5D,GAAA,EAAD,CACE,cAAauB,GAAQuP,oBACrBxE,QAAS,kBAAMyE,OAAOC,SAAS,EAAG,IAClC/Q,GAAIC,aAAc,CAChB8C,UACAjE,KAAMiE,EAAUiO,KAAkBC,mBAAgB3O,IALtD,SAQE,gBAAC,IAAD,CAAQ4O,YAAY,OAAOC,GAAI,EAA/B,qBACWpO,EAAUM,KAAmBN,GAASvJ,KAAO,IAAM,GAD9D,2BAWC4X,GAAiC,WAC5C,IAAMC,EAAaC,aAAkB,CACnCC,MAAO,IAEHC,EAASF,aAAkB,CAC/BvO,QAAS0O,KAAQD,OACjBD,MAAO,EACPzS,KAAMkS,KAAkBC,gBAEpBS,EAAQJ,aAAkB,CAC9BvO,QAAS0O,KAAQC,MACjBH,MAAO,EACPzS,KAAMkS,KAAkBC,gBAEpBU,EAAQL,aAAkB,CAC9BvO,QAAS0O,KAAQE,MACjBJ,MAAO,EACPzS,KAAMkS,KAAkBC,gBAG1B,OACE,gBAAC,IAAD,CACElK,GAAG,QACHpE,MAAM,WACN,cAAarB,GAAQsQ,eACrBnN,UAAU,SACVoN,GAAI5B,GAAgBC,EACpB4B,GAAI7B,GAAgBE,EANtB,UAQE,eAAC,IAAD,CACEvP,GAAG,KACH,cAAaU,GAAQyQ,sBACrBpQ,SAAS,SACTiC,WAAW,WACXE,WAAW,KACXkO,GAAI,EANN,0FAWA,eAAC,IAAD,CACE,cAAa1Q,GAAQ2Q,0BACrBnO,WAAW,KACXoO,KAAK,OACLF,GAAI,EAJN,mKAUA,gBAACpI,EAAD,CAAMuI,UAAQ,EAAC7L,QAAQ,OAAvB,UACE,gBAACyG,EAAD,WACE,eAAC,GAAD,CAAY9K,KAAMoP,IAElB,eAAC,GAAD,CAAYtO,QAAS0O,KAAQD,OAAQvP,KAAMuP,IAE3C,eAAC,GAAD,CAAYzO,QAAS0O,KAAQC,MAAOzP,KAAMyP,IAE1C,eAAC,GAAD,CAAY3O,QAAS0O,KAAQE,MAAO1P,KAAM0P,OAE5C,gBAACjD,EAAD,CAAW0D,KAAK,UAAhB,UACE,eAAC1B,GAAD,CAAiBzO,KAAMoP,IAEvB,eAACX,GAAD,CAAiB3N,QAAS0O,KAAQD,OAAQvP,KAAMuP,IAEhD,eAACd,GAAD,CAAiB3N,QAAS0O,KAAQC,MAAOzP,KAAMyP,IAE/C,eAAChB,GAAD,CAAiB3N,QAAS0O,KAAQE,MAAO1P,KAAM0P,c,+CC7H5CU,GAA8B,WACzC,IAAMC,ECPsB,SAAyBC,GACrD,IAAQtQ,EAASuQ,eAATvQ,KACR,OAAO,OAACA,QAAD,IAACA,IAAQ,IAAIsQ,GDKCE,CAAe,oBACpC,eAAsE,OACpEH,QADoE,IACpEA,IAAgBI,MAChBC,SAFF,MAAOC,OAAP,MAAkB,CAAEpZ,KAAM,mBAAoBqZ,gBAAiB,GAA/D,EAIMC,EEPkB,SAAC,GAMpB,IALLD,EAKI,EALJA,gBACAE,EAII,EAJJA,aAKA,EAAiCC,eAAzB/Q,EAAR,EAAQA,KAAMgR,EAAd,EAAcA,QAASC,EAAvB,EAAuBA,MAEvB,OAAOhY,mBAAQ,WACb,OAAI+X,GAAWC,KAAS,OAACjR,QAAD,IAACA,OAAD,EAACA,EAAMvD,UAAiB,GAE5CmU,EACK5Q,EAAKvD,SACTI,KACCqU,KAAenC,KAAkBoC,kBAKlC3M,MAAM,EAAGoM,GACHE,EACFA,EACJ5R,KAAI,SAACvC,GACJ,IAAMH,EAAMF,aAAY0D,EAAMrD,EAAEpF,MAChC,GAAIiF,EACF,OAAO,2BACFA,GADL,IAEEoE,QAASjE,EAAEiE,aAKhBlE,QAAO,SAACF,GAAD,YAAiB6D,IAAR7D,UAEnB,IAED,CAACwD,EAAMiR,EAAOD,EAASJ,EAAiBE,IF9B3BM,CAAWT,GAE3B,OAAKE,EAKH,gBAAC,IAAD,CACE,cAAaxR,GAAQgS,kBACrB7O,UAAU,SACVoN,GAAI5B,GAAgBC,EACpB4B,GAAI7B,GAAgBE,EAJtB,UAME,eAAC,IAAD,CACEvP,GAAG,KACH+B,MAAM,QACN,cAAarB,GAAQiS,eACrB5R,SAAS,SACTiC,WAAW,WACXE,WAAW,KANb,SAQG8O,EAASpZ,OAEZ,eAAC,KAAD,CACE,cAAa8H,GAAQkS,aACrBnM,IAAK,EACLiJ,GAAI,EACJxI,gBAAiB,CAAEP,KAAM,MAAOzC,GAAI,WAJtC,gBAMGgO,QANH,IAMGA,OANH,EAMGA,EAASrM,MAAM,EAAG,GAAGtF,KAAI,SAAC1C,GAAD,OACxB,eAAC0J,GAAA,EAAD,CAA4B1J,IAAKA,GAAfA,EAAIjF,cA3BrB,M,OGlBoCia,GAASC,G,mBCIlDC,GAAYC,aAAH,KDJgCH,GCIhC,0JDHRC,KACHA,GAAMD,GAAQhN,MAAM,ICET,GDCNpB,OAAOwO,OAAOxO,OAAOyO,iBAAiBL,GAAS,CACpDC,IAAK,CACH9T,MAAOyF,OAAOwO,OAAOH,UCWdK,GAAoBzT,aAA4B,SAAC0J,EAAOzJ,GAAR,OAC3D,eAAC,KAAD,aACEoT,UAAS,UAAKA,GAAL,wBACT5M,GAnBa,4DAoBbiN,OAAO,YACPzT,IAAKA,GACDyJ,O,SCdKiK,GAA0B,WACrC,OACE,gBAAC,IAAD,CACE7Q,MAAM,SACNT,MAAM,QACN8B,UAAU,SACVlB,EAAE,QACFqN,QAAQ,SACRiB,GAAI5B,GAAgBC,EACpB4B,GAAI7B,GAAgBE,EACpB+D,UAAU,SACVrU,OAAO,IATT,UAWE,eAAC,IAAD,CAASe,GAAG,KAAK,cAAaU,GAAQ6S,WAAYhP,KAAK,KAAvD,iEAGA,eAAC,IAAD,CACEvE,GAAG,KACH,cAAaU,GAAQ8S,aACrBxQ,WAAW,SACX0M,GAAI,EACJnL,KAAK,KALP,+DASA,eAAC,KAAD,CAAKxC,MAAM,UAAUuP,KAAK,QAAQ5B,GAAI,EAAG+D,GAAG,OAAO1Q,EAAE,OAArD,SACE,gBAAC2Q,GAAA,EAAD,CAAWC,WAAS,EAApB,UACE,eAAC,KAAD,IACA,eAAC,KAAD,a,wCC5BGC,GAAmD,SAAC,GAAD,IAC9Dha,EAD8D,EAC9DA,MACAC,EAF8D,EAE9DA,YACAR,EAH8D,EAG9DA,SAH8D,OAK9D,gBAAC,KAAD,CACE0I,MAAM,WACN,cAAarB,GAAQmT,YACrB5C,GAAI5B,GAAgBC,EACpB4B,GAAI7B,GAAgBE,EACpBrI,gBAAgB,MAChBC,aAAa,uCANf,UAQE,eAAC,IAAD,CACEnH,GAAG,KACH,cAAaU,GAAQoT,mBACrB/S,SAAS,SACTiC,WAAW,WACXE,WAAW,KACXkO,GAAI,EANN,SAQGxX,IAEH,eAAC,IAAD,CAAM,cAAa8G,GAAQqT,uBAAwBhT,SAAS,KAAKqQ,GAAI,EAArE,SACGvX,IAEFR,MCvBQ2a,GAA0B,kBACrC,gBAAC,KAAD,CACE7N,GAAG,QACH,cAAazF,GAAQuT,cACrB/M,gBAAiB,CAAEP,KAAM,MAAOzC,GAAI,gBACpCiD,aAAc,CAAER,KAAM,eAAgBzC,GAAI,OAC1CoP,UAAU,OALZ,UAOE,eAAC,GAAD,CACEzZ,YAAY,uPAIZD,MAAM,8EALR,SAOE,eAAC,IAAD,CAAM4I,MAAM,SAASwN,QAAQ,eAAekE,GAAI,EAAGC,KAAK,OAAxD,SACG1P,OAAOE,QAAQlC,MAAoBlC,KAClC,mCAAE6T,EAAF,YAAaxb,EAAb,EAAaA,KAAMkK,EAAnB,EAAmBA,OAAnB,OACE,eAAC3D,GAAA,EAAD,CACE,cAAauB,GAAQ2T,gBAErBjV,GAAIC,aAAc,CAAE8C,QAASiS,IAH/B,SAKE,gBAAC,KAAD,CAAO5R,MAAM,SAAST,MAAM,WAAW+B,QAAS,EAAhD,UACE,eAAC,KAAD,CAAO,aAAYlL,EAAM+J,EAAG,EAAGE,IAAKC,IACpC,gCAAOlK,QALJwb,UAaf,eAAC,KAAD,CACEvN,QAAS,CAAEF,KAAM,OAAQzC,GAAI,WAC7BvB,EAAE,OACF4N,GAAI,GACJjH,YAAY,aAEd,eAAC,KAAD,CAASzC,QAAS,CAAE3C,GAAI,QAAUuP,GAAI,GAAI1Q,EAAE,SAE5C,eAAC,GAAD,CACElJ,YAAY,+QAIZD,MAAM,uFALR,SAOE,eAAC,IAAD,CAAM4I,MAAM,SAASwN,QAAQ,eAAekE,GAAI,EAAGC,KAAK,OAAxD,SACG1P,OAAOE,QAAQC,MACb7G,QAAO,gBAAE7B,EAAF,2BACNpB,KAAyBC,IAAImB,MAE9BqE,KAAI,mCAAErE,EAAF,YAAoBkJ,EAApB,EAActE,KAAYlI,EAA1B,EAA0BA,KAA1B,OACH,eAACuG,GAAA,EAAD,CACE,cAAauB,GAAQ2T,gBAErBjV,GAAIC,aAAc,CAAEgF,UAAW,CAACnI,KAHlC,SAKE,gBAAC,KAAD,CAAOsG,MAAM,SAAST,MAAM,WAA0B+B,QAAS,EAA/D,UACE,eAACsB,EAAD,CAAM,aAAYxM,EAAM+J,EAAG,EAAGI,EAAG,IACjC,gCAAOnK,MAFmCsD,IAHvCA,cC3DNoY,GAAkC,WAC7C,OACE,eAAClb,EAAA,EAAD,CACEE,KAAM,CACJM,MAAO,gBACPC,YACE,0IACFF,QAAQ,GAEVJ,SAAS,OAPX,SASE,gBAAC4Z,GAAD,CACEnT,GAAIuU,IACJ,cAAa7T,GAAQxH,KACrB2K,UAAU,SAHZ,UAKE,eAAC,GAAD,IAEA,eAAC,GAAD,IAEA,eAAC,GAAD,IAEA,eAAC,GAAD","file":"static/js/8.691d34bd.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","export const KEYWORD_IGNORE_LIST = new Set([\n \"aws-cdk\",\n \"aws\",\n \"awscdk\",\n \"cdk-construct\",\n \"cdk\",\n \"construct\",\n \"constructs\",\n]);\n","import { API_PATHS } from \"../../constants/url\";\nimport { CatalogPackage, Packages } from \"./packages\";\n\nexport const getFullPackageName = (name: string, scope?: string) => {\n return scope ? `${scope}/${name}` : name;\n};\n\nexport const getAssetsPath = (\n name: string,\n version: string,\n scope?: string\n) => {\n const prefix = `${API_PATHS.PACKAGES_PREFIX}/`;\n const body = getFullPackageName(name, scope);\n const suffix = `/v${version}`;\n return `${prefix}${body}${suffix}`;\n};\n\nexport const sanitizeVersion = (ver: string) => {\n let sanitized = ver;\n if (sanitized.startsWith(\"~\") || sanitized.startsWith(\"^\")) {\n sanitized = sanitized.substring(1);\n }\n return sanitized;\n};\n\nconst extractMajor = (ver: string) => {\n let sanitized = sanitizeVersion(ver);\n return sanitized.split(\".\")[0];\n};\n\nexport const findPackage = (\n catalog: Packages,\n pkg: string\n): CatalogPackage | undefined => {\n const packages = catalog.packages.filter((p) => p.name === pkg);\n\n if (packages.length > 1) {\n return packages.sort((p1, p2) => {\n const mv1 = extractMajor(p1.version);\n const mv2 = extractMajor(p2.version);\n return mv2.localeCompare(mv1);\n })[0];\n }\n\n return packages[0];\n};\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<LanguageSupportTooltipProps> =\n ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n };\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Language } from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n language?: Language;\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n language,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ query: `${value}`, language })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport interface TimeOptions {\n date: Date;\n format: string;\n}\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {format(date, formatString)}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","export enum PackageCardType {\n Wide = \"wide\",\n}\n","/**\n * @fileoverview CSS Related Utils\n */\n\n/**\n * Translates a series of grid row definitions into a grid area string\n * ```ts\n * const gridAreas = makeGridAreas(\n * [\"header\", \"header\", \"header\"],\n * [\"aside\", \"main\", \"main\"],\n * [\"aside\", \"footer\", \"footer\"]\n * ); // `\"header header header\" \"aside main main\" \"aside footer footer\"`\n * ```\n */\nexport const makeGridAreas = (...rows: string[][]): string => {\n return rows.map((row) => `\"${row.join(\" \")}\"`).join(\" \");\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 { DownloadIcon } from \"@chakra-ui/icons\";\nimport { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent, ReactChild } from \"react\";\nimport { useStats } from \"../../contexts/Stats\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\nimport { Time } from \"../Time\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\ninterface DetailProps {\n \"data-testid\": string;\n icon?: ReactChild;\n label: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n icon,\n label,\n value,\n}) => (\n <Text data-testid={dataTestid} fontSize=\"xs\">\n {icon}\n {icon ? \" \" : \"\"}\n <strong>{label}</strong> {value}\n </Text>\n);\n\nexport const Details: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n\n const {\n author,\n metadata: { date },\n version,\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\n return (\n <>\n {downloads !== undefined && downloads >= 10 ? (\n <Detail\n data-testid={testIds.downloads}\n icon={<DownloadIcon />}\n label={downloads.toLocaleString()}\n value={\"Downloads\"}\n />\n ) : (\n <Detail data-testid={testIds.version} label=\"Version\" value={version} />\n )}\n <Detail\n data-testid={testIds.published}\n label=\"Published\"\n value={\n <Time date={new Date(date)} fontSize=\"xs\" format=\"MMM dd, yyyy\" />\n }\n />\n <Detail\n data-testid={testIds.author}\n label=\"Author\"\n value={\n <NavLink\n color=\"blue.500\"\n to={getSearchPath({\n query: authorName,\n language: currentLanguage,\n })}\n >\n {authorName}\n </NavLink>\n }\n />\n </>\n );\n};\n","import {\n Flex,\n Image,\n Heading as ChakraHeading,\n LinkOverlay,\n Text,\n Tooltip,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\nexport const Heading: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n const {\n comment,\n description,\n metadata: { constructFramework },\n name,\n version,\n } = usePackageCard();\n\n const cdkType = constructFramework?.name;\n const cdkVersion = constructFramework?.majorVersion;\n\n return (\n <>\n <LinkOverlay\n as={Link}\n to={getPackagePath({\n name,\n version,\n language: currentLanguage,\n })}\n >\n <Flex align=\"center\">\n {cdkType && (\n <Tooltip\n hasArrow\n label={\n CDKTYPE_RENDER_MAP[cdkType].name +\n (cdkVersion !== undefined ? ` v${cdkVersion}` : \"\")\n }\n placement=\"top\"\n >\n <Image\n alt={`${CDKTYPE_RENDER_MAP[cdkType].name} icon`}\n h={5}\n mr={2}\n src={CDKTYPE_RENDER_MAP[cdkType].imgsrc}\n w={5}\n zIndex={1}\n />\n </Tooltip>\n )}\n <ChakraHeading\n as=\"h3\"\n color=\"blue.800\"\n data-testid={testIds.title}\n fontSize=\"md\"\n fontWeight=\"bold\"\n wordBreak=\"break-all\"\n >\n {name}\n </ChakraHeading>\n </Flex>\n </LinkOverlay>\n <Text\n color=\"blue.800\"\n data-testid={testIds.description}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n {description || \"No description available.\"}\n </Text>\n {comment && (\n <Text\n data-testid={testIds.comment}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n <Text\n as=\"span\"\n color=\"blue.500\"\n fontSize=\"md\"\n fontWeight=\"bold\"\n lineHeight=\"tall\"\n >\n Editor's note:{\" \"}\n </Text>\n {comment}\n </Text>\n )}\n </>\n );\n};\n","import { Stack, Image, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { OFFICIAL_SCOPES } from \"../../constants/constructs\";\nimport { usePackageCard } from \"./PackageCard\";\n\nconst HIGHLIGHT_RENDER_MAP = {\n official: {\n imgsrc: \"/assets/construct.png\",\n label: \"Official\",\n color: \"#ED3B00\",\n },\n community: {\n imgsrc: \"/assets/community.png\",\n label: \"Community\",\n color: \"#2F50FE\",\n },\n highQuality: {\n imgsrc: \"/assets/medal.png\",\n label: \"High Quality\",\n color: \"#1F02D4\",\n },\n} as const;\n\n// TODO: We will need a similar solution to tags for determining High Quality, and likely Official\nexport const Highlight: FunctionComponent = () => {\n const { name } = usePackageCard();\n\n const isOfficial = OFFICIAL_SCOPES.some((scope) => name.includes(scope));\n const highlightType = isOfficial ? \"official\" : \"community\";\n const { imgsrc, color, label } = HIGHLIGHT_RENDER_MAP[highlightType];\n\n return (\n <Stack align=\"center\" direction=\"row\" spacing={2}>\n <Image alt={`${label} icon`} src={imgsrc} w={4} />\n <Text color={color} fontWeight=\"bold\">\n {label}\n </Text>\n </Stack>\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 { PackageLanguages } from \"../PackageLanguages\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Languages: FunctionComponent = () => {\n const pkg = usePackageCard();\n return <PackageLanguages {...pkg} size=\"sm\" />;\n};\n","import { FunctionComponent } from \"react\";\nimport { OFFICIAL_SCOPES } from \"../../constants/constructs\";\nimport { KEYWORD_IGNORE_LIST } from \"../../constants/keywords\";\nimport { PackageTag } from \"../PackageTag\";\nimport { usePackageCard } from \"./PackageCard\";\n\n// TODO: Proper tag implemenation, this is only a visual placeholder\nexport const Tags: FunctionComponent = () => {\n const { keywords, name } = usePackageCard();\n\n return (\n <>\n {[\n OFFICIAL_SCOPES.some((scope) => name.includes(scope)) ? (\n <PackageTag\n key=\"official\"\n label=\"official\"\n mr={1}\n value=\"@aws-cdk\"\n variant=\"official\"\n >\n Official\n </PackageTag>\n ) : null,\n ...(keywords ?? [])\n .filter((v) => Boolean(v) && !KEYWORD_IGNORE_LIST.has(v))\n .slice(0, 3)\n .map((tag) => {\n return (\n <PackageTag\n key={tag}\n mr={1}\n value={`\"${tag}\"`}\n zIndex=\"0 !important\"\n >\n {tag}\n </PackageTag>\n );\n }),\n ]}\n </>\n );\n};\n","import { Grid, Stack, LinkBox, Divider } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { makeGridAreas } from \"../../util/css\";\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\nconst GRID_AREA = {\n DETAILS: \"details\",\n LANGUAGES: \"languages\",\n TAGS: \"tags\",\n HEADING: \"heading\",\n};\n\nconst gridAreasMd = makeGridAreas(\n [GRID_AREA.HEADING, GRID_AREA.HEADING, GRID_AREA.DETAILS],\n [GRID_AREA.HEADING, GRID_AREA.HEADING, GRID_AREA.DETAILS],\n [GRID_AREA.TAGS, GRID_AREA.TAGS, GRID_AREA.LANGUAGES]\n);\n\nconst gridAreasMobile = makeGridAreas(\n [GRID_AREA.HEADING],\n [GRID_AREA.LANGUAGES],\n [GRID_AREA.DETAILS]\n);\n\nexport const WideCard: FunctionComponent = () => {\n return (\n <LinkBox\n _hover={{\n \"> article\": {\n bg: \"gray.50\",\n },\n }}\n >\n <Grid\n as=\"article\"\n autoColumns=\"1fr\"\n autoRows=\"auto\"\n bg=\"white\"\n border=\"base\"\n borderRadius=\"sm\"\n boxShadow=\"base\"\n color=\"gray.600\"\n data-testid={testIds.wideContainer}\n gap={5}\n h=\"100%\"\n p={5}\n templateAreas={{ base: gridAreasMobile, md: gridAreasMd }}\n w=\"100%\"\n >\n {/* Name + Desc */}\n <Stack gridArea={GRID_AREA.HEADING} spacing={2}>\n <Heading />\n </Stack>\n\n <Stack\n direction=\"row\"\n display={{ base: \"none\", md: \"initial\" }}\n gridArea={GRID_AREA.TAGS}\n maxH={6}\n overflow=\"hidden\"\n >\n <Tags />\n </Stack>\n\n <Grid\n alignItems=\"start\"\n alignSelf=\"center\"\n autoColumns={{ base: \"initial\", md: \"1fr\" }}\n autoRows={{ base: \"initial\", md: \"auto\" }}\n fontSize=\"xs\"\n gap={{ base: 0, md: 1 }}\n gridArea={GRID_AREA.DETAILS}\n templateColumns={{ base: \"1fr 1fr\", md: \"initial\" }}\n templateRows={{ base: \"1fr 1fr\", md: \"initial\" }}\n >\n <Highlight />\n <Details />\n </Grid>\n\n <Stack gridArea={GRID_AREA.LANGUAGES} spacing={{ base: 4, md: 0 }}>\n <Divider display={{ md: \"none\" }} />\n <Stack data-testid={testIds.languages} direction=\"row\" spacing={2}>\n <Languages />\n </Stack>\n </Stack>\n </Grid>\n </LinkBox>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"./constants\";\nimport { WideCard } from \"./WideCard\";\n\nexport interface PackageCardProps {\n pkg: CatalogPackage;\n variant?: PackageCardType;\n}\n\nconst PackageCardContext = createContext<\n (CatalogPackage & { comment?: string }) | null\n>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={pkg}>\n {variant === PackageCardType.Wide && <WideCard />}\n </PackageCardContext.Provider>\n );\n};\n","import { chakra, forwardRef, HTMLChakraProps } from \"@chakra-ui/system\"\nimport { cx } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\nexport interface LinkOverlayProps extends HTMLChakraProps<\"a\"> {\n /**\n * If `true`, the link will open in new tab\n */\n isExternal?: boolean\n}\n\nexport const LinkOverlay = forwardRef<LinkOverlayProps, \"a\">((props, ref) => {\n const { isExternal, target, rel, className, ...rest } = props\n return (\n <chakra.a\n {...rest}\n ref={ref}\n className={cx(\"chakra-linkbox__overlay\", className)}\n rel={isExternal ? \"noopener noreferrer\" : rel}\n target={isExternal ? \"_blank\" : target}\n __css={{\n position: \"static\",\n \"&::before\": {\n content: \"''\",\n cursor: \"inherit\",\n display: \"block\",\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 0,\n width: \"100%\",\n height: \"100%\",\n },\n }}\n />\n )\n})\n\nexport interface LinkBoxProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * `LinkBox` is used to wrap content areas within a link while ensuring semantic html\n *\n * @see Docs https://chakra-ui.com/docs/navigation/link-overlay\n * @see Resources https://www.sarasoueidan.com/blog/nested-links\n */\nexport const LinkBox = forwardRef<LinkBoxProps, \"div\">((props, ref) => {\n const { className, ...rest } = props\n\n return (\n <chakra.div\n ref={ref}\n position=\"relative\"\n {...rest}\n className={cx(\"chakra-linkbox\", className)}\n __css={{\n /* Elevate the links and abbreviations up */\n \"a[href]:not(.chakra-linkbox__overlay), abbr[title]\": {\n position: \"relative\",\n zIndex: 1,\n },\n }}\n />\n )\n})\n","import { createIcon } from \"@chakra-ui/icon\"\n\nexport const DownloadIcon = createIcon({\n d:\n \"M11.2857,6.05714 L10.08571,4.85714 L7.85714,7.14786 L7.85714,1 L6.14286,1 L6.14286,7.14786 L3.91429,4.85714 L2.71429,6.05714 L7,10.42857 L11.2857,6.05714 Z M1,11.2857 L1,13 L13,13 L13,11.2857 L1,11.2857 Z\",\n displayName: \"DownloadIcon\",\n viewBox: \"0 0 14 14\",\n})\n","import { useClickable, UseClickableProps } from \"@chakra-ui/clickable\"\nimport { createDescendantContext } from \"@chakra-ui/descendant\"\nimport {\n useControllableState,\n useId,\n useSafeLayoutEffect,\n} from \"@chakra-ui/hooks\"\nimport {\n createContext,\n EventKeyMap,\n getValidChildren,\n mergeRefs,\n} from \"@chakra-ui/react-utils\"\nimport {\n callAllHandlers,\n determineLazyBehavior,\n Dict,\n focus,\n isUndefined,\n LazyBehavior,\n normalizeEventKey,\n} from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\n/* -------------------------------------------------------------------------------------------------\n * Create context to track descendants and their indices\n * -----------------------------------------------------------------------------------------------*/\n\nexport const [\n TabsDescendantsProvider,\n useTabsDescendantsContext,\n useTabsDescendants,\n useTabsDescendant,\n] = createDescendantContext<HTMLButtonElement>()\n\n/* -------------------------------------------------------------------------------------------------\n * useTabs - The root react hook that manages all tab items\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface UseTabsProps {\n /**\n * The orientation of the tab list.\n */\n orientation?: \"vertical\" | \"horizontal\"\n /**\n * If `true`, the tabs will be manually activated and\n * display its panel by pressing Space or Enter.\n *\n * If `false`, the tabs will be automatically activated\n * and their panel is displayed when they receive focus.\n */\n isManual?: boolean\n /**\n * Callback when the index (controlled or un-controlled) changes.\n */\n onChange?: (index: number) => void\n /**\n * The index of the selected tab (in controlled mode)\n */\n index?: number\n /**\n * The initial index of the selected tab (in uncontrolled mode)\n */\n defaultIndex?: number\n /**\n * The id of the tab\n */\n id?: string\n /**\n * Performance 🚀:\n * If `true`, rendering of the tab panel's will be deferred until it is selected.\n */\n isLazy?: boolean\n /**\n * Performance 🚀:\n * The lazy behavior of tab panels' content when not active.\n * Only works when `isLazy={true}`\n *\n * - \"unmount\": The content of inactive tab panels are always unmounted.\n * - \"keepMounted\": The content of inactive tab panels is initially unmounted,\n * but stays mounted when selected.\n *\n * @default \"unmount\"\n */\n lazyBehavior?: LazyBehavior\n /**\n * The writing mode direction.\n *\n * - When in RTL, the left and right navigation is flipped\n */\n direction?: \"rtl\" | \"ltr\"\n}\n\n/**\n * Tabs hooks that provides all the states, and accessibility\n * helpers to keep all things working properly.\n *\n * Its returned object will be passed unto a Context Provider\n * so all child components can read from it.\n * There is no document link yet\n * @see Docs https://chakra-ui.com/docs/components/useTabs\n */\nexport function useTabs(props: UseTabsProps) {\n const {\n defaultIndex,\n onChange,\n index,\n isManual,\n isLazy,\n lazyBehavior = \"unmount\",\n orientation = \"horizontal\",\n direction = \"ltr\",\n ...htmlProps\n } = props\n\n /**\n * We use this to keep track of the index of the focused tab.\n *\n * Tabs can be automatically activated, this means selection follows focus.\n * When we navigate with the arrow keys, we move focus and selection to next/prev tab\n *\n * Tabs can also be manually activated, this means selection does not follow focus.\n * When we navigate with the arrow keys, we only move focus NOT selection. The user\n * will need not manually activate the tab using `Enter` or `Space`.\n *\n * This is why we need to keep track of the `focusedIndex` and `selectedIndex`\n */\n const [focusedIndex, setFocusedIndex] = React.useState(defaultIndex ?? 0)\n\n const [selectedIndex, setSelectedIndex] = useControllableState({\n defaultValue: defaultIndex ?? 0,\n value: index,\n onChange,\n })\n\n /**\n * Sync focused `index` with controlled `selectedIndex` (which is the `props.index`)\n */\n React.useEffect(() => {\n if (index != null) {\n setFocusedIndex(index)\n }\n }, [index])\n\n /**\n * Think of `useDescendants` as a register for the tab nodes.\n */\n const descendants = useTabsDescendants()\n\n /**\n * Generate a unique id or use user-provided id for the tabs widget\n */\n const id = useId(props.id, `tabs`)\n\n return {\n id,\n selectedIndex,\n focusedIndex,\n setSelectedIndex,\n setFocusedIndex,\n isManual,\n isLazy,\n lazyBehavior,\n orientation,\n descendants,\n direction,\n htmlProps,\n }\n}\n\nexport type UseTabsReturn = Omit<\n ReturnType<typeof useTabs>,\n \"htmlProps\" | \"descendants\"\n>\n\nexport const [TabsProvider, useTabsContext] = createContext<UseTabsReturn>({\n name: \"TabsContext\",\n errorMessage:\n \"useTabsContext: `context` is undefined. Seems you forgot to wrap all tabs components within <Tabs />\",\n})\n\ntype Child = React.ReactElement<any>\n\nexport interface UseTabListProps {\n children?: React.ReactNode\n onKeyDown?: React.KeyboardEventHandler\n ref?: React.Ref<any>\n}\n\n/**\n * Tabs hook to manage multiple tab buttons,\n * and ensures only one tab is selected per time.\n *\n * @param props props object for the tablist\n */\nexport function useTabList<P extends UseTabListProps>(props: P) {\n const { focusedIndex, orientation, direction } = useTabsContext()\n\n const descendants = useTabsDescendantsContext()\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n const nextTab = () => {\n const next = descendants.nextEnabled(focusedIndex)\n if (next) focus(next.node)\n }\n const prevTab = () => {\n const prev = descendants.prevEnabled(focusedIndex)\n if (prev) focus(prev.node)\n }\n const firstTab = () => {\n const first = descendants.firstEnabled()\n if (first) focus(first.node)\n }\n const lastTab = () => {\n const last = descendants.lastEnabled()\n if (last) focus(last.node)\n }\n\n const isHorizontal = orientation === \"horizontal\"\n const isVertical = orientation === \"vertical\"\n\n const eventKey = normalizeEventKey(event)\n\n const ArrowStart = direction === \"ltr\" ? \"ArrowLeft\" : \"ArrowRight\"\n const ArrowEnd = direction === \"ltr\" ? \"ArrowRight\" : \"ArrowLeft\"\n\n const keyMap: EventKeyMap = {\n [ArrowStart]: () => isHorizontal && prevTab(),\n [ArrowEnd]: () => isHorizontal && nextTab(),\n ArrowDown: () => isVertical && nextTab(),\n ArrowUp: () => isVertical && prevTab(),\n Home: firstTab,\n End: lastTab,\n }\n\n const action = keyMap[eventKey]\n\n if (action) {\n event.preventDefault()\n action(event)\n }\n },\n [descendants, focusedIndex, orientation, direction],\n )\n\n return {\n ...props,\n role: \"tablist\",\n \"aria-orientation\": orientation,\n onKeyDown: callAllHandlers(props.onKeyDown, onKeyDown),\n }\n}\n\nexport type UseTabListReturn = ReturnType<typeof useTabList>\n\nexport interface UseTabOptions {\n id?: string\n isSelected?: boolean\n panelId?: string\n /**\n * If `true`, the `Tab` won't be toggleable\n */\n isDisabled?: boolean\n}\n\nexport interface UseTabProps\n extends Omit<UseClickableProps, \"color\">,\n UseTabOptions {}\n\n/**\n * Tabs hook to manage each tab button.\n *\n * A tab can be disabled and focusable, or both,\n * hence the use of `useClickable` to handle this scenario\n */\nexport function useTab<P extends UseTabProps>(props: P) {\n const { isDisabled, isFocusable, ...htmlProps } = props\n\n const {\n setSelectedIndex,\n isManual,\n id,\n setFocusedIndex,\n selectedIndex,\n } = useTabsContext()\n\n const { index, register } = useTabsDescendant({\n disabled: isDisabled && !isFocusable,\n })\n\n const isSelected = index === selectedIndex\n\n const onClick = () => {\n setSelectedIndex(index)\n }\n\n const onFocus = () => {\n setFocusedIndex(index)\n const isDisabledButFocusable = isDisabled && isFocusable\n const shouldSelect = !isManual && !isDisabledButFocusable\n if (shouldSelect) {\n setSelectedIndex(index)\n }\n }\n\n const clickableProps = useClickable({\n ...htmlProps,\n ref: mergeRefs(register, props.ref),\n isDisabled,\n isFocusable,\n onClick: callAllHandlers(props.onClick, onClick),\n })\n\n const type: \"button\" | \"submit\" | \"reset\" = \"button\"\n\n return {\n ...clickableProps,\n id: makeTabId(id, index),\n role: \"tab\",\n tabIndex: isSelected ? 0 : -1,\n type,\n \"aria-selected\": isSelected,\n \"aria-controls\": makeTabPanelId(id, index),\n onFocus: isDisabled ? undefined : callAllHandlers(props.onFocus, onFocus),\n }\n}\n\nexport interface UseTabPanelsProps {\n children?: React.ReactNode\n}\n\n/**\n * Tabs hook for managing the visibility of multiple tab panels.\n *\n * Since only one panel can be show at a time, we use `cloneElement`\n * to inject `selected` panel to each TabPanel.\n *\n * It returns a cloned version of its children with\n * all functionality included.\n */\nexport function useTabPanels<P extends UseTabPanelsProps>(props: P) {\n const context = useTabsContext()\n\n const { id, selectedIndex } = context\n\n const validChildren = getValidChildren(props.children)\n\n const children = validChildren.map((child, index) =>\n React.cloneElement(child as Child, {\n isSelected: index === selectedIndex,\n id: makeTabPanelId(id, index),\n // Refers to the associated tab element, and also provides an accessible name to the tab panel.\n \"aria-labelledby\": makeTabId(id, index),\n }),\n )\n\n return { ...props, children }\n}\n\n/**\n * Tabs hook for managing the visible/hidden states\n * of the tab panel.\n *\n * @param props props object for the tab panel\n */\nexport function useTabPanel(props: Dict) {\n const { isSelected, id, children, ...htmlProps } = props\n const { isLazy, lazyBehavior } = useTabsContext()\n\n const hasBeenSelected = React.useRef(false)\n if (isSelected) {\n hasBeenSelected.current = true\n }\n\n const shouldRenderChildren = determineLazyBehavior({\n hasBeenSelected: hasBeenSelected.current,\n isSelected,\n isLazy,\n lazyBehavior,\n })\n\n return {\n // Puts the tabpanel in the page `Tab` sequence.\n tabIndex: 0,\n ...htmlProps,\n children: shouldRenderChildren ? children : null,\n role: \"tabpanel\",\n hidden: !isSelected,\n id,\n }\n}\n\n/**\n * Tabs hook to show an animated indicators that\n * follows the active tab.\n *\n * The way we do it is by measuring the DOM Rect (or dimensions)\n * of the active tab, and return that as CSS style for\n * the indicator.\n */\nexport function useTabIndicator(): React.CSSProperties {\n const context = useTabsContext()\n const descendants = useTabsDescendantsContext()\n\n const { selectedIndex, orientation } = context\n\n const isHorizontal = orientation === \"horizontal\"\n const isVertical = orientation === \"vertical\"\n\n // Get the clientRect of the selected tab\n const [rect, setRect] = React.useState(() => {\n if (isHorizontal) return { left: 0, width: 0 }\n if (isVertical) return { top: 0, height: 0 }\n return undefined\n })\n\n const [hasMeasured, setHasMeasured] = React.useState(false)\n\n // Update the selected tab rect when the selectedIndex changes\n useSafeLayoutEffect(() => {\n if (isUndefined(selectedIndex)) return undefined\n\n const tab = descendants.item(selectedIndex)\n if (isUndefined(tab)) return undefined\n\n // Horizontal Tab: Calculate width and left distance\n if (isHorizontal) {\n setRect({ left: tab.node.offsetLeft, width: tab.node.offsetWidth })\n }\n\n // Vertical Tab: Calculate height and top distance\n if (isVertical) {\n setRect({ top: tab.node.offsetTop, height: tab.node.offsetHeight })\n }\n\n // Prevent unwanted transition from 0 to measured rect\n // by setting the measured state in the next tick\n const id = requestAnimationFrame(() => {\n setHasMeasured(true)\n })\n\n return () => {\n if (id) {\n cancelAnimationFrame(id)\n }\n }\n }, [selectedIndex, isHorizontal, isVertical, descendants])\n\n return {\n position: \"absolute\",\n transitionProperty: \"left, right, top, bottom\",\n transitionDuration: hasMeasured ? \"200ms\" : \"0ms\",\n transitionTimingFunction: \"cubic-bezier(0, 0, 0.2, 1)\",\n ...rect,\n }\n}\n\nfunction makeTabId(id: string, index: number) {\n return `${id}--tab-${index}`\n}\n\nfunction makeTabPanelId(id: string, index: number) {\n return `${id}--tabpanel-${index}`\n}\n","import {\n chakra,\n forwardRef,\n omitThemingProps,\n StylesProvider,\n SystemStyleObject,\n ThemingProps,\n useMultiStyleConfig,\n useStyles,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { cx, omit, __DEV__ } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\nimport {\n TabsDescendantsProvider,\n TabsProvider,\n useTab,\n useTabIndicator,\n useTabList,\n UseTabListProps,\n UseTabOptions,\n useTabPanel,\n useTabPanels,\n useTabs,\n UseTabsProps,\n} from \"./use-tabs\"\n\ninterface TabsOptions {\n /**\n * If `true`, tabs will stretch to width of the tablist.\n */\n isFitted?: boolean\n /**\n * The alignment of the tabs\n */\n align?: \"start\" | \"end\" | \"center\"\n}\n\nexport interface TabsProps\n extends UseTabsProps,\n ThemingProps<\"Tabs\">,\n Omit<HTMLChakraProps<\"div\">, \"onChange\">,\n TabsOptions {\n children: React.ReactNode\n}\n\n/**\n * Tabs\n *\n * Provides context and logic for all tabs components.\n */\nexport const Tabs = forwardRef<TabsProps, \"div\">((props, ref) => {\n const styles = useMultiStyleConfig(\"Tabs\", props)\n const { children, className, ...rest } = omitThemingProps(props)\n\n const { htmlProps, descendants, ...ctx } = useTabs(rest)\n const context = React.useMemo(() => ctx, [ctx])\n\n const rootProps = omit(htmlProps as any, [\"isFitted\"])\n\n return (\n <TabsDescendantsProvider value={descendants}>\n <TabsProvider value={context}>\n <StylesProvider value={styles}>\n <chakra.div\n className={cx(\"chakra-tabs\", className)}\n ref={ref}\n {...rootProps}\n __css={styles.root}\n >\n {children}\n </chakra.div>\n </StylesProvider>\n </TabsProvider>\n </TabsDescendantsProvider>\n )\n})\n\nif (__DEV__) {\n Tabs.displayName = \"Tabs\"\n}\n\nexport interface TabProps extends UseTabOptions, HTMLChakraProps<\"button\"> {}\n\n/**\n * Tab button used to activate a specific tab panel. It renders a `button`,\n * and is responsible for automatic and manual selection modes.\n */\nexport const Tab = forwardRef<TabProps, \"button\">((props, ref) => {\n const styles = useStyles()\n const tabProps = useTab({ ...props, ref })\n\n const tabStyles: SystemStyleObject = {\n outline: \"0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...styles.tab,\n }\n\n return (\n <chakra.button\n {...tabProps}\n className={cx(\"chakra-tabs__tab\", props.className)}\n __css={tabStyles}\n />\n )\n})\n\nif (__DEV__) {\n Tab.displayName = \"Tab\"\n}\n\nexport interface TabListProps\n extends UseTabListProps,\n Omit<HTMLChakraProps<\"div\">, \"onKeyDown\" | \"ref\"> {}\n\n/**\n * TabList is used to manage a list of tab buttons. It renders a `div` by default,\n * and is responsible the keyboard interaction between tabs.\n */\nexport const TabList = forwardRef<TabListProps, \"div\">((props, ref) => {\n const tablistProps = useTabList({ ...props, ref })\n\n const styles = useStyles()\n\n const tablistStyles: SystemStyleObject = {\n display: \"flex\",\n ...styles.tablist,\n }\n\n return (\n <chakra.div\n {...tablistProps}\n className={cx(\"chakra-tabs__tablist\", props.className)}\n __css={tablistStyles}\n />\n )\n})\n\nif (__DEV__) {\n TabList.displayName = \"TabList\"\n}\n\nexport interface TabPanelProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabPanel\n * Used to render the content for a specific tab.\n */\nexport const TabPanel = forwardRef<TabPanelProps, \"div\">((props, ref) => {\n const panelProps = useTabPanel({ ...props, ref })\n const styles = useStyles()\n\n return (\n <chakra.div\n outline=\"0\"\n {...panelProps}\n className={cx(\"chakra-tabs__tab-panel\", props.className)}\n __css={styles.tabpanel}\n />\n )\n})\n\nif (__DEV__) {\n TabPanel.displayName = \"TabPanel\"\n}\n\nexport interface TabPanelsProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabPanel\n *\n * Used to manage the rendering of multiple tab panels. It uses\n * `cloneElement` to hide/show tab panels.\n *\n * It renders a `div` by default.\n */\nexport const TabPanels = forwardRef<TabPanelsProps, \"div\">((props, ref) => {\n const panelsProps = useTabPanels(props)\n const styles = useStyles()\n\n return (\n <chakra.div\n {...panelsProps}\n width=\"100%\"\n ref={ref}\n className={cx(\"chakra-tabs__tab-panels\", props.className)}\n __css={styles.tabpanels}\n />\n )\n})\n\nif (__DEV__) {\n TabPanels.displayName = \"TabPanels\"\n}\n\nexport interface TabIndicatorProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabIndicator\n *\n * Used to render an active tab indicator that animates between\n * selected tabs.\n */\nexport const TabIndicator = forwardRef<TabIndicatorProps, \"div\">(\n (props, ref) => {\n const indicatorStyle = useTabIndicator()\n const style = {\n ...props.style,\n ...indicatorStyle,\n }\n\n const styles = useStyles()\n\n return (\n <chakra.div\n ref={ref}\n {...props}\n className={cx(\"chakra-tabs__tab-indicator\", props.className)}\n style={style}\n __css={styles.indicator}\n />\n )\n },\n)\n\nif (__DEV__) {\n TabIndicator.displayName = \"TabIndicator\"\n}\n","export const SECTION_PADDING = {\n X: [4, 8, 12, 16, 20],\n Y: [4, 6, 8],\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"homeRedesign\", [\n \"page\",\n \"packageGrid\",\n // Hero Section\n \"heroHeader\",\n \"heroSubtitle\",\n // Info Section\n \"infoContainer\",\n \"infoSection\",\n \"infoSectionHeading\",\n \"infoSectionDescription\",\n \"infoSectionIcon\",\n // Featured / Recently Updated Section\n \"featuredContainer\",\n \"featuredHeader\",\n \"featuredGrid\",\n // CDK Type Section\n \"cdkTypeSection\",\n \"cdkTypeSectionHeading\",\n \"cdkTypeSectionDescription\",\n \"cdkTypeTab\",\n \"cdkTypeGrid\",\n \"cdkTypeSeeAllButton\",\n] as const);\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCard } from \"../../components/PackageCard\";\nimport testIds from \"./testIds\";\n\nexport const PackageGrid: FunctionComponent<{ packages: CatalogPackage[] }> = ({\n packages,\n}) => {\n return (\n <Grid\n data-testid={testIds.packageGrid}\n gap={4}\n mt={8}\n templateColumns={{ base: \"1fr\", lg: \"1fr 1fr\" }}\n >\n {packages.map((pkg) => (\n <PackageCard key={pkg.name} pkg={pkg} />\n ))}\n </Grid>\n );\n};\n","import {\n Button,\n Flex,\n forwardRef,\n Heading,\n Tab,\n TabList,\n TabPanelProps,\n TabPanel,\n TabPanels,\n Tabs,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { NavLink } from \"../../components/NavLink\";\nimport { CDKType, CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { getSearchPath } from \"../../util/url\";\nimport { SECTION_PADDING } from \"./constants\";\nimport { PackageGrid } from \"./PackageGrid\";\nimport testIds from \"./testIds\";\n\ninterface PackageTabProps {\n cdkType?: CDKType;\n data: ReturnType<typeof useCatalogResults>;\n}\n\nconst PackageTab: FunctionComponent<PackageTabProps> = ({ cdkType, data }) => {\n return (\n <Tab\n data-testid={testIds.cdkTypeTab}\n data-value={cdkType}\n isDisabled={data.page.length < 1}\n >\n {cdkType ? CDKTYPE_RENDER_MAP[cdkType].name : \"All CDKs\"} (\n {data.results.length})\n </Tab>\n );\n};\n\nconst PackageTabPanel = forwardRef<PackageTabProps & TabPanelProps, \"div\">(\n ({ cdkType, data, ...props }, ref) => {\n return (\n <TabPanel data-testid={testIds.cdkTypeGrid} ref={ref} {...props} p={0}>\n <PackageGrid packages={data.page} />\n\n <Flex justify=\"center\" w=\"full\">\n <NavLink\n data-testid={testIds.cdkTypeSeeAllButton}\n onClick={() => window.scrollTo(0, 0)}\n to={getSearchPath({\n cdkType,\n sort: cdkType ? CatalogSearchSort.DownloadsDesc : undefined,\n })}\n >\n <Button colorScheme=\"blue\" my={8}>\n See all {cdkType ? CDKTYPE_RENDER_MAP[cdkType].name + \" \" : \"\"}\n constructs\n </Button>\n </NavLink>\n </Flex>\n </TabPanel>\n );\n }\n);\n\nexport const CDKTypeTabs: FunctionComponent = () => {\n const anyCDKType = useCatalogResults({\n limit: 4,\n });\n const awscdk = useCatalogResults({\n cdkType: CDKType.awscdk,\n limit: 4,\n sort: CatalogSearchSort.DownloadsDesc,\n });\n const cdk8s = useCatalogResults({\n cdkType: CDKType.cdk8s,\n limit: 4,\n sort: CatalogSearchSort.DownloadsDesc,\n });\n const cdktf = useCatalogResults({\n cdkType: CDKType.cdktf,\n limit: 4,\n sort: CatalogSearchSort.DownloadsDesc,\n });\n\n return (\n <Flex\n bg=\"white\"\n color=\"blue.800\"\n data-testid={testIds.cdkTypeSection}\n direction=\"column\"\n px={SECTION_PADDING.X}\n py={SECTION_PADDING.Y}\n >\n <Heading\n as=\"h3\"\n data-testid={testIds.cdkTypeSectionHeading}\n fontSize=\"1.5rem\"\n fontWeight=\"semibold\"\n lineHeight=\"lg\"\n mb={3}\n >\n Find open-source community constructs and official libraries in one\n location\n </Heading>\n <Text\n data-testid={testIds.cdkTypeSectionDescription}\n lineHeight=\"md\"\n maxW=\"60ch\"\n mb={5}\n >\n Use Construct Hub to find CDKs’ libraries owned by the open source\n community and companies and organizations like Terraform, CNCF, AWS and\n more.\n </Text>\n <Tabs isFitted variant=\"line\">\n <TabList>\n <PackageTab data={anyCDKType} />\n\n <PackageTab cdkType={CDKType.awscdk} data={awscdk} />\n\n <PackageTab cdkType={CDKType.cdk8s} data={cdk8s} />\n\n <PackageTab cdkType={CDKType.cdktf} data={cdktf} />\n </TabList>\n <TabPanels minH=\"28.5rem\">\n <PackageTabPanel data={anyCDKType} />\n\n <PackageTabPanel cdkType={CDKType.awscdk} data={awscdk} />\n\n <PackageTabPanel cdkType={CDKType.cdk8s} data={cdk8s} />\n\n <PackageTabPanel cdkType={CDKType.cdktf} data={cdktf} />\n </TabPanels>\n </Tabs>\n </Flex>\n );\n};\n","import { Flex, Grid, Heading } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { DEFAULT_FEATURED_PACKAGES } from \"../../api/config\";\nimport { PackageCard } from \"../../components/PackageCard\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\nimport { SECTION_PADDING } from \"./constants\";\nimport testIds from \"./testIds\";\nimport { useSection } from \"./useSection\";\n\nexport const Featured: FunctionComponent = () => {\n const homePackages = useConfigValue(\"featuredPackages\");\n const [featured = { name: \"Recently Updated\", showLastUpdated: 4 }] = (\n homePackages ?? DEFAULT_FEATURED_PACKAGES\n ).sections;\n\n const section = useSection(featured);\n\n if (!section) {\n return null;\n }\n\n return (\n <Flex\n data-testid={testIds.featuredContainer}\n direction=\"column\"\n px={SECTION_PADDING.X}\n py={SECTION_PADDING.Y}\n >\n <Heading\n as=\"h3\"\n color=\"white\"\n data-testid={testIds.featuredHeader}\n fontSize=\"1.5rem\"\n fontWeight=\"semibold\"\n lineHeight=\"lg\"\n >\n {featured.name}\n </Heading>\n <Grid\n data-testid={testIds.featuredGrid}\n gap={4}\n mt={8}\n templateColumns={{ base: \"1fr\", lg: \"1fr 1fr\" }}\n >\n {section?.slice(0, 4).map((pkg) => (\n <PackageCard key={pkg.name} pkg={pkg} />\n ))}\n </Grid>\n </Flex>\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","import { useMemo } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { SORT_FUNCTIONS } from \"../../api/catalog-search/util\";\nimport { FeaturedPackagesDetail } from \"../../api/config\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { findPackage } from \"../../api/package/util\";\nimport { useCatalog } from \"../../contexts/Catalog\";\n\nexport const useSection = ({\n showLastUpdated,\n showPackages,\n}: {\n showLastUpdated?: number;\n showPackages?: FeaturedPackagesDetail[];\n}) => {\n const { data, loading, error } = useCatalog();\n\n return useMemo(() => {\n if (loading || error || !data?.packages) return [];\n\n if (showLastUpdated) {\n return data.packages\n .sort(\n SORT_FUNCTIONS[CatalogSearchSort.PublishDateDesc] as (\n p1: CatalogPackage,\n p2: CatalogPackage\n ) => number\n )\n .slice(0, showLastUpdated);\n } else if (showPackages) {\n return showPackages\n .map((p) => {\n const pkg = findPackage(data, p.name);\n if (pkg) {\n return {\n ...pkg,\n comment: p.comment,\n };\n }\n return undefined;\n })\n .filter((pkg) => pkg !== undefined) as CatalogPackage[];\n } else {\n return undefined;\n }\n }, [data, error, loading, showLastUpdated, showPackages]);\n};\n","export default function _taggedTemplateLiteral(strings, raw) {\n if (!raw) {\n raw = strings.slice(0);\n }\n\n return Object.freeze(Object.defineProperties(strings, {\n raw: {\n value: Object.freeze(raw)\n }\n }));\n}","import { Box, BoxProps, forwardRef, keyframes } from \"@chakra-ui/react\";\n\nconst gradient = \"linear-gradient(274.2deg, #143870 20.69%, #1F50A1 84.17%)\";\n\nconst animation = keyframes`\n 0% {\n background-position:0% 50%;\n }\n\n 50% {\n background-position:100% 50%;\n }\n\n 100% {\n background-position:0% 50%;\n }\n`;\n\nexport const GradientContainer = forwardRef<BoxProps, \"div\">((props, ref) => (\n <Box\n animation={`${animation} 10s linear infinite`}\n bg={gradient}\n bgSize=\"200% 200%\"\n ref={ref}\n {...props}\n />\n));\n","import { Box, Flex, Heading } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n SearchBar,\n SearchOverlay,\n SearchSuggestions,\n} from \"../../components/SearchBar\";\nimport { SECTION_PADDING } from \"./constants\";\nimport testIds from \"./testIds\";\n\nexport const Hero: FunctionComponent = () => {\n return (\n <Flex\n align=\"center\"\n color=\"white\"\n direction=\"column\"\n h=\"20rem\"\n justify=\"center\"\n px={SECTION_PADDING.X}\n py={SECTION_PADDING.Y}\n textAlign=\"center\"\n zIndex=\"1\"\n >\n <Heading as=\"h1\" data-testid={testIds.heroHeader} size=\"xl\">\n Build cloud infrastructure with reusable components\n </Heading>\n <Heading\n as=\"h2\"\n data-testid={testIds.heroSubtitle}\n fontWeight=\"normal\"\n mt={4}\n size=\"md\"\n >\n Open source registry for AWS CDK, CDKtf and CDK8s\n </Heading>\n <Box color=\"initial\" maxW=\"36rem\" mt={8} mx=\"auto\" w=\"full\">\n <SearchBar hasButton>\n <SearchOverlay />\n <SearchSuggestions />\n </SearchBar>\n </Box>\n </Flex>\n );\n};\n","import { Grid, Heading, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent, ReactNode } from \"react\";\nimport { SECTION_PADDING } from \"./constants\";\nimport testIds from \"./testIds\";\n\nexport interface InfoSectionProps {\n title: string;\n description: ReactNode;\n}\n\nexport const InfoSection: FunctionComponent<InfoSectionProps> = ({\n title,\n description,\n children,\n}) => (\n <Grid\n color=\"blue.800\"\n data-testid={testIds.infoSection}\n px={SECTION_PADDING.X}\n py={SECTION_PADDING.Y}\n templateColumns=\"1fr\"\n templateRows=\"minmax(4.5rem, min-content) 1fr auto\"\n >\n <Heading\n as=\"h3\"\n data-testid={testIds.infoSectionHeading}\n fontSize=\"1.5rem\"\n fontWeight=\"semibold\"\n lineHeight=\"lg\"\n mb={4}\n >\n {title}\n </Heading>\n <Text data-testid={testIds.infoSectionDescription} fontSize=\"lg\" mb={4}>\n {description}\n </Text>\n {children}\n </Grid>\n);\n","import { Divider, Flex, Grid, Image, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { NavLink } from \"../../components/NavLink\";\nimport { CDKType, CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\nimport {\n Language,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\nimport { InfoSection } from \"./InfoSection\";\nimport testIds from \"./testIds\";\n\nexport const Info: FunctionComponent = () => (\n <Grid\n bg=\"white\"\n data-testid={testIds.infoContainer}\n templateColumns={{ base: \"1fr\", lg: \"1fr auto 1fr\" }}\n templateRows={{ base: \"1fr auto 1fr\", lg: \"1fr\" }}\n textAlign=\"left\"\n >\n <InfoSection\n description=\"The Construct Hub is a central destination for discovering and sharing\n cloud application design patterns and reference architectures defined\n for the AWS CDK, CDK for Kubernetes (CDK8s), CDK for Terraform (CDKtf)\n and other construct-based tools.\"\n title=\"Browse 600+ reusable cloud application libraries for popular IaC frameworks\"\n >\n <Flex align=\"center\" justify=\"space-evenly\" pt={4} wrap=\"wrap\">\n {Object.entries(CDKTYPE_RENDER_MAP).map(\n ([cdktype, { name, imgsrc }]) => (\n <NavLink\n data-testid={testIds.infoSectionIcon}\n key={cdktype}\n to={getSearchPath({ cdkType: cdktype as CDKType })}\n >\n <Stack align=\"center\" color=\"blue.500\" spacing={2}>\n <Image aria-label={name} h={8} src={imgsrc} />\n <span>{name}</span>\n </Stack>\n </NavLink>\n )\n )}\n </Flex>\n </InfoSection>\n\n <Divider\n display={{ base: \"none\", lg: \"initial\" }}\n h=\"auto\"\n my={10}\n orientation=\"vertical\"\n />\n <Divider display={{ lg: \"none\" }} mx={10} w=\"auto\" />\n\n <InfoSection\n description=\"Create cloud applications faster with reusable infrastructure building\n blocks in your favorite programming language. Develop faster by\n getting helpful API reference + code samples which are automatically\n generated for Typescript, Python, .NET or Java (Go coming soon)!\"\n title=\"Build using familiar programming languages. Code samples and API reference included.\"\n >\n <Flex align=\"center\" justify=\"space-evenly\" pt={4} wrap=\"wrap\">\n {Object.entries(LANGUAGE_RENDER_MAP)\n .filter(([language]) =>\n TEMP_SUPPORTED_LANGUAGES.has(language as Language)\n )\n .map(([language, { icon: Icon, name }]) => (\n <NavLink\n data-testid={testIds.infoSectionIcon}\n key={language}\n to={getSearchPath({ languages: [language as Language] })}\n >\n <Stack align=\"center\" color=\"blue.500\" key={language} spacing={2}>\n <Icon aria-label={name} h={8} w={8} />\n <span>{name}</span>\n </Stack>\n </NavLink>\n ))}\n </Flex>\n </InfoSection>\n </Grid>\n);\n","import { Flex } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Page } from \"../../components/Page\";\nimport { CDKTypeTabs } from \"./CDKTypeTabs\";\nimport { Featured } from \"./Featured\";\nimport { GradientContainer } from \"./GradientContainer\";\nimport { Hero } from \"./Hero\";\nimport { Info } from \"./Info\";\nimport testIds from \"./testIds\";\n\nexport const HomeRedesign: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Construct Hub\",\n description:\n \"Construct Hub helps developers find open-source construct libraries for use with AWS CDK, CDK8s, CDKTf and other construct-based tools.\",\n suffix: false,\n }}\n pageName=\"home\"\n >\n <GradientContainer\n as={Flex}\n data-testid={testIds.page}\n direction=\"column\"\n >\n <Hero />\n\n <Info />\n\n <Featured />\n\n <CDKTypeTabs />\n </GradientContainer>\n </Page>\n );\n};\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e){function t(t){for(var n,a,c=t[0],i=t[1],f=t[2],p=0,s=[];p<c.length;p++)a=c[p],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(l&&l(t);s.length;)s.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,c=1;c<r.length;c++){var i=r[c];0!==o[i]&&(n=!1)}n&&(u.splice(t--,1),e=a(a.s=r[0]))}return e}var n={},o={4:0},u=[];function a(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.e=function(e){var t=[],r=o[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=o[e]=[t,n]}));t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,a.nc&&c.setAttribute("nonce",a.nc),c.src=function(e){return a.p+"static/js/"+({}[e]||e)+"."+{0:"14ae620d",1:"ba696ffb",2:"5cef3eb0",5:"a2fc9d7c",7:"4fcbd19f",8:"
|
|
2
|
-
//# sourceMappingURL=runtime-main.
|
|
1
|
+
!function(e){function t(t){for(var n,a,c=t[0],i=t[1],f=t[2],p=0,s=[];p<c.length;p++)a=c[p],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(l&&l(t);s.length;)s.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,c=1;c<r.length;c++){var i=r[c];0!==o[i]&&(n=!1)}n&&(u.splice(t--,1),e=a(a.s=r[0]))}return e}var n={},o={4:0},u=[];function a(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.e=function(e){var t=[],r=o[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=o[e]=[t,n]}));t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,a.nc&&c.setAttribute("nonce",a.nc),c.src=function(e){return a.p+"static/js/"+({}[e]||e)+"."+{0:"14ae620d",1:"ba696ffb",2:"5cef3eb0",5:"a2fc9d7c",7:"4fcbd19f",8:"691d34bd",9:"e8c984d8",10:"48221095",11:"c3c4095a",12:"cadd501c",13:"fe1e2da5",14:"0902aefd",15:"50336305",16:"2d478192",17:"ee760920"}[e]+".chunk.js"}(e);var i=new Error;u=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=o[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),u=t&&t.target&&t.target.src;i.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",i.name="ChunkLoadError",i.type=n,i.request=u,r[1](i)}o[e]=void 0}};var f=setTimeout((function(){u({type:"timeout",target:c})}),12e4);c.onerror=c.onload=u,document.head.appendChild(c)}return Promise.all(t)},a.m=e,a.c=n,a.d=function(e,t,r){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(a.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)a.d(r,n,function(t){return e[t]}.bind(null,n));return r},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="/",a.oe=function(e){throw console.error(e),e};var c=this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[],i=c.push.bind(c);c.push=t,c=c.slice();for(var f=0;f<c.length;f++)t(c[f]);var l=i;r()}([]);
|
|
2
|
+
//# sourceMappingURL=runtime-main.a6d6b3c7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.d3c4ab29.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t4: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"static/js/\" + ({}[chunkId]||chunkId) + \".\" + {\"0\":\"14ae620d\",\"1\":\"ba696ffb\",\"2\":\"5cef3eb0\",\"5\":\"a2fc9d7c\",\"7\":\"4fcbd19f\",\"8\":\"31a21ecd\",\"9\":\"e8c984d8\",\"10\":\"48221095\",\"11\":\"c3c4095a\",\"12\":\"cadd501c\",\"13\":\"fe1e2da5\",\"14\":\"0902aefd\",\"15\":\"50336305\",\"16\":\"2d478192\",\"17\":\"ee760920\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonpconstruct-hub-webapp\"] = this[\"webpackJsonpconstruct-hub-webapp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.a6d6b3c7.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t4: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"static/js/\" + ({}[chunkId]||chunkId) + \".\" + {\"0\":\"14ae620d\",\"1\":\"ba696ffb\",\"2\":\"5cef3eb0\",\"5\":\"a2fc9d7c\",\"7\":\"4fcbd19f\",\"8\":\"691d34bd\",\"9\":\"e8c984d8\",\"10\":\"48221095\",\"11\":\"c3c4095a\",\"12\":\"cadd501c\",\"13\":\"fe1e2da5\",\"14\":\"0902aefd\",\"15\":\"50336305\",\"16\":\"2d478192\",\"17\":\"ee760920\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonpconstruct-hub-webapp\"] = this[\"webpackJsonpconstruct-hub-webapp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
|
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
import { checkHeaderAndFooter } from "../support/helpers";
|
|
2
2
|
import searchBar from "components/SearchBar/testIds";
|
|
3
3
|
import homeRedesign from "views/HomeRedesign/testIds";
|
|
4
|
+
import { getSearchPath } from "util/url";
|
|
5
|
+
import { CDKType, CDKTYPE_RENDER_MAP } from "constants/constructs";
|
|
6
|
+
import {
|
|
7
|
+
Language,
|
|
8
|
+
LANGUAGE_NAME_MAP,
|
|
9
|
+
TEMP_SUPPORTED_LANGUAGES,
|
|
10
|
+
} from "constants/languages";
|
|
11
|
+
import packageCard from "components/PackageCard/testIds";
|
|
12
|
+
import { CatalogSearchSort } from "api/catalog-search/constants";
|
|
4
13
|
|
|
5
14
|
describe("Home Page", () => {
|
|
6
15
|
describe("Renders expected content", () => {
|
|
7
16
|
before(() => {
|
|
8
|
-
cy.
|
|
17
|
+
cy.visitWithConfig("/", {
|
|
18
|
+
featureFlags: { homeRedesign: false },
|
|
19
|
+
});
|
|
9
20
|
});
|
|
10
21
|
|
|
11
22
|
checkHeaderAndFooter();
|
|
@@ -34,26 +45,266 @@ describe("Home Page", () => {
|
|
|
34
45
|
});
|
|
35
46
|
|
|
36
47
|
describe("Home (Redesign / WIP)", () => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
48
|
+
describe("Hero Section", () => {
|
|
49
|
+
beforeEach(() => {
|
|
50
|
+
cy.visitWithConfig("/", {
|
|
51
|
+
featureFlags: {
|
|
52
|
+
homeRedesign: true,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("has heading and subtitle", () => {
|
|
58
|
+
cy.getByDataTest(homeRedesign.heroHeader).should("be.visible");
|
|
59
|
+
cy.getByDataTest(homeRedesign.heroSubtitle).should("be.visible");
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("has search capabilities from home page", () => {
|
|
63
|
+
cy.getByDataTest(homeRedesign.page).within(() => {
|
|
64
|
+
cy.getByDataTest(searchBar.input)
|
|
65
|
+
.should("be.visible")
|
|
66
|
+
.type("@aws-cdk", { force: true });
|
|
67
|
+
cy.getByDataTest(searchBar.overlay).should("be.visible");
|
|
68
|
+
cy.getByDataTest(searchBar.suggestionsList).should("be.visible");
|
|
69
|
+
cy.getByDataTest(searchBar.suggestion).should("have.length", 5);
|
|
70
|
+
cy.getByDataTest(searchBar.input)
|
|
71
|
+
.type("{enter}")
|
|
72
|
+
.url()
|
|
73
|
+
.should("include", "/search");
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
describe("Informational Section", () => {
|
|
79
|
+
beforeEach(() => {
|
|
80
|
+
cy.visitWithConfig("/", {
|
|
81
|
+
featureFlags: {
|
|
82
|
+
homeRedesign: true,
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("has expected sections and content", () => {
|
|
88
|
+
cy.getByDataTest(homeRedesign.infoContainer)
|
|
89
|
+
.should("be.visible")
|
|
90
|
+
.within(() => {
|
|
91
|
+
cy.getByDataTest(homeRedesign.infoSection)
|
|
92
|
+
.should("have.length", 2)
|
|
93
|
+
.each((el) => {
|
|
94
|
+
cy.wrap(el).within(() => {
|
|
95
|
+
cy.getByDataTest(homeRedesign.infoSectionHeading).should(
|
|
96
|
+
"be.visible"
|
|
97
|
+
);
|
|
98
|
+
cy.getByDataTest(homeRedesign.infoSectionDescription).should(
|
|
99
|
+
"be.visible"
|
|
100
|
+
);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("has cdkType icon links with search urls", () => {
|
|
107
|
+
cy.getByDataTest(homeRedesign.infoSection)
|
|
108
|
+
.first()
|
|
109
|
+
.within(() => {
|
|
110
|
+
cy.getByDataTest(homeRedesign.infoSectionIcon).each((el, index) => {
|
|
111
|
+
const cdkType = [CDKType.awscdk, CDKType.cdk8s, CDKType.cdktf][
|
|
112
|
+
index
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
cy.wrap(el)
|
|
116
|
+
.should("have.text", CDKTYPE_RENDER_MAP[cdkType].name)
|
|
117
|
+
.should("have.attr", "href", getSearchPath({ cdkType }))
|
|
118
|
+
.find("img")
|
|
119
|
+
.should("have.attr", "src", CDKTYPE_RENDER_MAP[cdkType].imgsrc);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("has language icon links with search urls", () => {
|
|
125
|
+
cy.getByDataTest(homeRedesign.infoSection)
|
|
126
|
+
.last()
|
|
127
|
+
.within(() => {
|
|
128
|
+
cy.getByDataTest(homeRedesign.infoSectionIcon).each((el, index) => {
|
|
129
|
+
const language = Object.keys(LANGUAGE_NAME_MAP).filter((l) =>
|
|
130
|
+
TEMP_SUPPORTED_LANGUAGES.has(l as Language)
|
|
131
|
+
)[index] as Language;
|
|
132
|
+
|
|
133
|
+
cy.wrap(el)
|
|
134
|
+
.should("have.text", LANGUAGE_NAME_MAP[language])
|
|
135
|
+
.should(
|
|
136
|
+
"have.attr",
|
|
137
|
+
"href",
|
|
138
|
+
getSearchPath({ languages: [language] })
|
|
139
|
+
);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
42
142
|
});
|
|
43
143
|
});
|
|
44
144
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
cy.
|
|
145
|
+
describe("Featured Section", () => {
|
|
146
|
+
it("has a header and 4 cards", () => {
|
|
147
|
+
cy.visitWithConfig("/", {
|
|
148
|
+
featureFlags: {
|
|
149
|
+
homeRedesign: true,
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
cy.getByDataTest(homeRedesign.featuredContainer)
|
|
48
154
|
.should("be.visible")
|
|
49
|
-
.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
155
|
+
.within(() => {
|
|
156
|
+
cy.getByDataTest(homeRedesign.featuredHeader).should("be.visible");
|
|
157
|
+
cy.getByDataTest(homeRedesign.featuredGrid)
|
|
158
|
+
.should("be.visible")
|
|
159
|
+
.within(() => {
|
|
160
|
+
cy.getByDataTest(packageCard.wideContainer).should(
|
|
161
|
+
"have.length",
|
|
162
|
+
4
|
|
163
|
+
);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it("shows recently updated if no content is featured", () => {
|
|
169
|
+
cy.visitWithConfig("/", {
|
|
170
|
+
featureFlags: {
|
|
171
|
+
homeRedesign: true,
|
|
172
|
+
},
|
|
173
|
+
featuredPackages: undefined,
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
cy.getByDataTest(homeRedesign.featuredContainer).within(() => {
|
|
177
|
+
cy.getByDataTest(homeRedesign.featuredHeader).should(
|
|
178
|
+
"have.text",
|
|
179
|
+
"Recently updated"
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it("shows featured content if config provides featured content", () => {
|
|
185
|
+
const featuredPackages = {
|
|
186
|
+
sections: [
|
|
187
|
+
{
|
|
188
|
+
name: "Featured packages",
|
|
189
|
+
showPackages: [
|
|
190
|
+
{
|
|
191
|
+
name: "@aws-cdk/aws-s3",
|
|
192
|
+
comment: "One of the most popular AWS CDK libraries!",
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
name: "@aws-cdk/aws-lambda",
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
name: "@aws-cdk/aws-iam",
|
|
199
|
+
comment:
|
|
200
|
+
"Secure your constructs with safe and manageable permission boundaries.",
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
name: "@aws-cdk/pipelines",
|
|
204
|
+
comment:
|
|
205
|
+
"The most recently released L3 construct library from the CDK team!",
|
|
206
|
+
},
|
|
207
|
+
],
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: "Recently updated",
|
|
211
|
+
showLastUpdated: 5,
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
cy.visitWithConfig("/", {
|
|
217
|
+
featureFlags: {
|
|
218
|
+
homeRedesign: true,
|
|
219
|
+
},
|
|
220
|
+
featuredPackages,
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
cy.getByDataTest(homeRedesign.featuredContainer).within(() => {
|
|
224
|
+
cy.getByDataTest(homeRedesign.featuredHeader).should(
|
|
225
|
+
"have.text",
|
|
226
|
+
"Featured packages"
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
cy.getByDataTest(packageCard.title).each((title, index) => {
|
|
230
|
+
const expectedName =
|
|
231
|
+
featuredPackages.sections[0].showPackages[index].name;
|
|
232
|
+
|
|
233
|
+
cy.wrap(title).should("have.text", expectedName);
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
describe("CDK Type Section", () => {
|
|
240
|
+
it("has heading, description, 4 tabs, 4 cards, and a see all button", () => {
|
|
241
|
+
cy.getByDataTest(homeRedesign.cdkTypeSection).within(() => {
|
|
242
|
+
cy.getByDataTest(homeRedesign.cdkTypeSectionHeading).should(
|
|
243
|
+
"be.visible"
|
|
244
|
+
);
|
|
245
|
+
cy.getByDataTest(homeRedesign.cdkTypeSectionDescription).should(
|
|
246
|
+
"be.visible"
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
cy.getByDataTest(homeRedesign.cdkTypeTab).should("have.length", 4);
|
|
250
|
+
|
|
251
|
+
cy.getByDataTest(homeRedesign.packageGrid)
|
|
252
|
+
.first()
|
|
253
|
+
.within(() => {
|
|
254
|
+
cy.getByDataTest(packageCard.wideContainer).should(
|
|
255
|
+
"have.length",
|
|
256
|
+
4
|
|
257
|
+
);
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
cy.getByDataTest(homeRedesign.cdkTypeSeeAllButton).should("be.visible");
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it("reveals different cards for respective tabs", () => {
|
|
265
|
+
cy.getByDataTest(homeRedesign.cdkTypeSection).within(() => {
|
|
266
|
+
cy.getByDataTest(homeRedesign.cdkTypeTab).each((tab, index) => {
|
|
267
|
+
const cdkType: CDKType | undefined = [
|
|
268
|
+
undefined,
|
|
269
|
+
CDKType.awscdk,
|
|
270
|
+
CDKType.cdk8s,
|
|
271
|
+
CDKType.cdktf,
|
|
272
|
+
][index];
|
|
273
|
+
|
|
274
|
+
cy.wrap(tab).click();
|
|
275
|
+
|
|
276
|
+
if (cdkType) {
|
|
277
|
+
cy.wrap(tab).should("have.attr", "data-value", cdkType);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Verify current tab's package grid is visible and others are not
|
|
281
|
+
cy.getByDataTest(homeRedesign.packageGrid).each((grid, gridIndex) => {
|
|
282
|
+
cy.wrap(grid).should(
|
|
283
|
+
index === gridIndex ? "be.visible" : "not.be.visible"
|
|
284
|
+
);
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
it("has a see all button which opens the correct search url", () => {
|
|
290
|
+
const testSeeAll = (cdkType: CDKType | undefined, index: number) => {
|
|
291
|
+
cy.getByDataTest(homeRedesign.cdkTypeTab).eq(index).click();
|
|
292
|
+
|
|
293
|
+
cy.getByDataTest(homeRedesign.cdkTypeSeeAllButton)
|
|
294
|
+
.eq(index)
|
|
295
|
+
.should(
|
|
296
|
+
"have.attr",
|
|
297
|
+
"href",
|
|
298
|
+
getSearchPath({
|
|
299
|
+
cdkType,
|
|
300
|
+
sort: cdkType ? CatalogSearchSort.DownloadsDesc : undefined,
|
|
301
|
+
})
|
|
302
|
+
);
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
[undefined, CDKType.awscdk, CDKType.cdk8s, CDKType.cdktf].forEach(
|
|
306
|
+
testSeeAll
|
|
307
|
+
);
|
|
57
308
|
});
|
|
58
309
|
});
|
|
59
310
|
});
|