construct-hub 0.3.74 → 0.3.78

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. package/.jsii +19 -19
  2. package/lib/backend/transliterator/transliterator.ecs-entrypoint.bundle/index.js +5 -5
  3. package/lib/construct-hub.js +1 -1
  4. package/lib/package-sources/code-artifact.js +1 -1
  5. package/lib/package-sources/npmjs.js +1 -1
  6. package/lib/package-tag/index.js +2 -2
  7. package/lib/spdx-license.js +1 -1
  8. package/lib/webapp/home-response-function/home-response-function.d.ts +8 -0
  9. package/lib/webapp/home-response-function/home-response-function.js +24 -0
  10. package/lib/webapp/home-response-function/index.d.ts +7 -0
  11. package/lib/webapp/home-response-function/index.js +17 -0
  12. package/lib/webapp/index.js +16 -2
  13. package/lib/webapp/response-function/response-function.d.ts +0 -1
  14. package/lib/webapp/response-function/response-function.js +3 -1
  15. package/package.json +7 -7
  16. package/website/asset-manifest.json +36 -36
  17. package/website/index.html +1 -1
  18. package/website/service-worker.js +1 -1
  19. package/website/static/js/{0.74bd9492.chunk.js → 0.0ec704bd.chunk.js} +2 -2
  20. package/website/static/js/{0.74bd9492.chunk.js.map → 0.0ec704bd.chunk.js.map} +1 -1
  21. package/website/static/js/{1.37bf26c6.chunk.js → 1.4ed89d6e.chunk.js} +2 -2
  22. package/website/static/js/{1.37bf26c6.chunk.js.map → 1.4ed89d6e.chunk.js.map} +1 -1
  23. package/website/static/js/{10.fb218d2f.chunk.js → 10.bc89b47e.chunk.js} +2 -2
  24. package/website/static/js/{10.fb218d2f.chunk.js.map → 10.bc89b47e.chunk.js.map} +1 -1
  25. package/website/static/js/{11.5bd19ded.chunk.js → 11.b2210011.chunk.js} +2 -2
  26. package/website/static/js/{11.5bd19ded.chunk.js.map → 11.b2210011.chunk.js.map} +1 -1
  27. package/website/static/js/{12.eb4db465.chunk.js → 12.58276a6b.chunk.js} +2 -2
  28. package/website/static/js/{12.eb4db465.chunk.js.map → 12.58276a6b.chunk.js.map} +1 -1
  29. package/website/static/js/{13.fe9b51fc.chunk.js → 13.512f115a.chunk.js} +3 -3
  30. package/website/static/js/{13.fe9b51fc.chunk.js.LICENSE.txt → 13.512f115a.chunk.js.LICENSE.txt} +0 -0
  31. package/website/static/js/{13.fe9b51fc.chunk.js.map → 13.512f115a.chunk.js.map} +1 -1
  32. package/website/static/js/{14.33162ba8.chunk.js → 14.a485bce3.chunk.js} +2 -2
  33. package/website/static/js/{14.33162ba8.chunk.js.map → 14.a485bce3.chunk.js.map} +1 -1
  34. package/website/static/js/{4.7f5e3309.chunk.js → 4.a2e9ec2d.chunk.js} +3 -3
  35. package/website/static/js/{4.7f5e3309.chunk.js.LICENSE.txt → 4.a2e9ec2d.chunk.js.LICENSE.txt} +0 -0
  36. package/website/static/js/{4.7f5e3309.chunk.js.map → 4.a2e9ec2d.chunk.js.map} +1 -1
  37. package/website/static/js/5.17864b64.chunk.js +3 -0
  38. package/website/static/js/{5.8b38b6da.chunk.js.LICENSE.txt → 5.17864b64.chunk.js.LICENSE.txt} +0 -0
  39. package/website/static/js/{5.8b38b6da.chunk.js.map → 5.17864b64.chunk.js.map} +1 -1
  40. package/website/static/js/{6.993d90fd.chunk.js → 6.703e3c7f.chunk.js} +2 -2
  41. package/website/static/js/6.703e3c7f.chunk.js.map +1 -0
  42. package/website/static/js/7.f8f9a8b7.chunk.js +2 -0
  43. package/website/static/js/7.f8f9a8b7.chunk.js.map +1 -0
  44. package/website/static/js/8.64914ea1.chunk.js +2 -0
  45. package/website/static/js/8.64914ea1.chunk.js.map +1 -0
  46. package/website/static/js/{9.28413d73.chunk.js → 9.c88e9272.chunk.js} +2 -2
  47. package/website/static/js/{9.28413d73.chunk.js.map → 9.c88e9272.chunk.js.map} +1 -1
  48. package/website/static/js/{main.2b1ad6f6.chunk.js → main.19a82dfa.chunk.js} +2 -2
  49. package/website/static/js/main.19a82dfa.chunk.js.map +1 -0
  50. package/website/static/js/{runtime-main.ccd2f057.js → runtime-main.7452ec40.js} +2 -2
  51. package/website/static/js/{runtime-main.ccd2f057.js.map → runtime-main.7452ec40.js.map} +1 -1
  52. package/website/static/js/5.8b38b6da.chunk.js +0 -3
  53. package/website/static/js/6.993d90fd.chunk.js.map +0 -1
  54. package/website/static/js/7.183f0a63.chunk.js +0 -2
  55. package/website/static/js/7.183f0a63.chunk.js.map +0 -1
  56. package/website/static/js/8.8b7c92c5.chunk.js +0 -2
  57. package/website/static/js/8.8b7c92c5.chunk.js.map +0 -1
  58. package/website/static/js/main.2b1ad6f6.chunk.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ (this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[]).push([[7],{252:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),r=n(267),c={home:{event:{name:"Home Load"}},faq:{event:{name:"Frequently Asked Questions Load"}},packageProfile:{event:{name:"Package Profile Load"}},search:{event:{name:"Search Load"}},siteTerms:{event:{name:"Site Terms Load"}},notFound:{page:{pageType:"errorPage"},event:{name:"404 Page Load"}}},i=n(120),o=n(1),s=function(e){var t=e.children,n=e.meta,s=e.pageName,l=Object(i.b)(c[s]);Object(a.useEffect)((function(){l()}),[l]);var d=n.suffix,u=void 0===d||d,b=n.title,j=n.description,f=u?"".concat(b," - Construct Hub"):b;return Object(o.jsxs)(o.Fragment,{children:[Object(o.jsxs)(r.a,{children:[!1,Object(o.jsx)("meta",{content:"width=device-width, initial-scale=1",name:"viewport"}),Object(o.jsx)("meta",{charSet:"utf-8"}),Object(o.jsx)("title",{children:f}),Object(o.jsx)("meta",{content:f,property:"og:title"}),Object(o.jsx)("meta",{content:f,name:"twitter:title"}),Object(o.jsx)("meta",{content:"summary",name:"twitter:card"}),Object(o.jsx)("meta",{content:j,name:"description"}),Object(o.jsx)("meta",{content:j,property:"og:description"}),Object(o.jsx)("meta",{content:j,name:"twitter:description"})]}),t]})}},262:function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var a=n(0),r=n(21),c=function(){var e=Object(r.h)().search;return Object(a.useMemo)((function(){return new URLSearchParams(e)}),[e])}},263:function(e,t,n){"use strict";n.d(t,"a",(function(){return j}));var a=n(5),r=n(0),c=n(21),i=n(109),o=n(13),s=n(262),l=i.d.TypeScript,d="preferred-language",u=function(e){return null!=e&&i.e.has(e)},b=function(e){if(u(e))return e;try{var t,n=null!==(t=localStorage.getItem(d))&&void 0!==t?t:"";if(u(n))return n}catch(a){}return l},j=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.updateUrl,n=e.updateSaved,i=Object(c.h)(),l=i.pathname,j=i.hash,f=Object(c.g)(),O=f.replace,m=Object(s.a)(),h=m.get(o.b.LANGUAGE),p=Object(r.useState)((function(){return b(h)})),v=Object(a.a)(p,2),g=v[0],x=v[1];Object(r.useEffect)((function(){u(h)&&h!==g&&x(h)}),[h]),Object(r.useEffect)((function(){h!==g&&t&&(m.set(o.b.LANGUAGE,g),O({pathname:l,hash:j,search:m.toString()}))}),[g,t]);var y=Object(r.useCallback)((function(e){if(x(e),n)try{localStorage.setItem(d,e)}catch(t){}}),[n]);return Object(r.useMemo)((function(){return[g,y]}),[g,y])}},264:function(e,t,n){"use strict";n.d(t,"c",(function(){return r})),n.d(t,"b",(function(){return c})),n.d(t,"d",(function(){return i})),n.d(t,"a",(function(){return s}));var a=n(13),r=function(e,t){return t?"".concat(t,"/").concat(e):e},c=function(e,t,n){var c="".concat(a.a.PACKAGES_PREFIX,"/"),i=r(e,n),o="/v".concat(t);return"".concat(c).concat(i).concat(o)},i=function(e){var t=e;return(t.startsWith("~")||t.startsWith("^"))&&(t=t.substring(1)),t},o=function(e){return i(e).split(".")[0]},s=function(e,t){var n=e.packages.filter((function(e){return e.name===t}));return n.length>1?n.sort((function(e,t){var n=o(e.version);return o(t.version).localeCompare(n)}))[0]:n[0]}},270:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var a=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.map((function(e){return'"'.concat(e.map((function(e){return null!==e&&void 0!==e?e:"."})).join(" "),'"')})).join(" ")}},271:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var a=new Set(["aws-cdk","aws","awscdk","cdk-construct","cdk","construct","constructs"])},281:function(e,t,n){"use strict";var a;n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return J})),function(e){e.Wide="wide"}(a||(a={}));var r=n(0),c=n(6),i=n(17),o=n(371),s=n(150),l=n(243),d=n(219),u=n(270),b=n(5),j=n(600),f=n(237),O=n(208),m=n(89),h=n(263),p=n(88),v=n(71),g=n(283),x=n(59),y=Object(x.a)("packageCard",["author","description","downloads","languages","published","title","version","comment","wideContainer"]),w=n(1),k=function(e){var t=e["data-testid"],n=e.icon,a=e.label,r=e.tooltip,c=e.value;return Object(w.jsx)(f.a,{hasArrow:!0,isDisabled:!r,label:r,placement:"auto",children:Object(w.jsxs)(O.a,{"data-testid":t,fontSize:"xs",zIndex:1,children:[n,n?" ":"",Object(w.jsx)("strong",{children:a})," ",c]})})},S=function(){var e,t,n,a=Object(h.a)(),r=Object(b.a)(a,1)[0],c=Y(),i=c.author,o=c.metadata.date,s=c.version,l=c.name,d=Object(m.b)().data,u=null===d||void 0===d||null===(e=d.packages)||void 0===e||null===(t=e[l])||void 0===t||null===(n=t.downloads)||void 0===n?void 0:n.npm,f="string"===typeof i?i:i.name;return Object(w.jsxs)(w.Fragment,{children:[void 0!==u&&u>=10?Object(w.jsx)(k,{"data-testid":y.downloads,icon:Object(w.jsx)(j.a,{}),label:u.toLocaleString(),tooltip:"Download numbers are periodically sourced from the NPM registry",value:"Weekly downloads"}):Object(w.jsx)(k,{"data-testid":y.version,label:"Version",value:s}),Object(w.jsx)(k,{"data-testid":y.published,label:"Published",value:Object(w.jsx)(g.a,{date:new Date(o),fontSize:"xs",format:"MMM dd, yyyy"})}),Object(w.jsx)(k,{"data-testid":y.author,label:"Author",value:Object(w.jsx)(v.a,{color:"blue.500",to:Object(p.c)({query:f,language:r}),children:f})})]})},T=n(217),C=n(228),D=n(34),z=n(123),I=function(){var e=Object(h.a)(),t=Object(b.a)(e,1)[0],n=Y(),a=n.comment,r=n.description,c=n.metadata.constructFramework,i=n.name,s=n.version,l=null===c||void 0===c?void 0:c.name,d=null===c||void 0===c?void 0:c.majorVersion;return Object(w.jsxs)(w.Fragment,{children:[Object(w.jsx)(o.b,{as:D.b,to:Object(p.a)({name:i,version:s,language:t}),children:Object(w.jsxs)(T.a,{align:"center",children:[l&&Object(w.jsx)(f.a,{hasArrow:!0,label:Object(w.jsx)(z.b,{majorVersion:d,name:l}),placement:"top",children:Object(w.jsx)(z.a,{mr:2,name:l,zIndex:1})}),Object(w.jsx)(C.a,{as:"h3",color:"blue.800","data-testid":y.title,fontSize:"md",fontWeight:"bold",wordBreak:"break-all",children:i})]})}),Object(w.jsx)(O.a,{color:"blue.800","data-testid":y.description,fontSize:"md",lineHeight:"tall",noOfLines:4,children:r||"No description available."}),a&&Object(w.jsxs)(O.a,{"data-testid":y.comment,fontSize:"md",lineHeight:"tall",noOfLines:4,children:[Object(w.jsxs)(O.a,{as:"span",color:"blue.500",fontSize:"md",fontWeight:"bold",lineHeight:"tall",children:["Editor's note:"," "]}),a]})]})},A=n(242),N=function(e){var t=e.label,n=e.color,a=e.icon;return Object(w.jsxs)(l.a,{align:"center",direction:"row",spacing:2,children:[Object(w.jsx)(A.a,{alt:"".concat(t," icon"),src:a,w:4}),Object(w.jsx)(O.a,{color:n,fontWeight:"bold",children:t})]})},_=n(109),E=n(285),F={sm:5,md:6,lg:8},P=function(e){var t=e.isRounded,n=void 0!==t&&t,a=e.languages,r=e.name,c=e.size,i=void 0===c?"md":c,o=e.version,s=Object.keys(null!==a&&void 0!==a?a:{});return Object(w.jsx)(w.Fragment,{children:Object.entries(_.c).sort((function(e,t){var n=Object(b.a)(e,1)[0],a=Object(b.a)(t,1)[0];return _.a.indexOf(n)-_.a.indexOf(a)})).map((function(e){var t=Object(b.a)(e,2),a=t[0],c=t[1],l=a,d=l===_.d.TypeScript||s.includes(l),u=l===_.d.TypeScript||_.e.has(l);if(!d)return null;var j=c.name,f=c.icon,O=Object(w.jsx)(f,{"aria-label":"Supports ".concat(j),borderRadius:n?"50%":0,h:F[i],opacity:u?1:.2,w:F[i]});return Object(w.jsx)(E.a,{language:l,children:u?Object(w.jsx)(D.b,{"aria-label":"View package docs for ".concat(l),to:Object(p.a)({name:r,version:o,language:l}),children:O}):O},l)}))})},H=function(){var e=Y();return Object(w.jsx)(P,Object(c.a)(Object(c.a)({},e),{},{size:"sm"}))},L=n(271),W=n(284),K=function(){var e=Y(),t=e.keywords,n=void 0===t?[]:t,a=e.metadata.packageTags,r=void 0===a?[]:a,c=[].concat(Object(i.a)(r.filter((function(e){return Boolean(e.keyword)}))),Object(i.a)(n.filter((function(e){return Boolean(e)&&!L.a.has(e)})).map((function(e){return{id:e,keyword:{label:e}}}))));return Object(w.jsx)(w.Fragment,{children:c.slice(0,3).map((function(e){var t=e.id,n=e.keyword,a=(n=void 0===n?{}:n).label,r=n.color;return Object(w.jsx)(W.a,{value:t,variant:r,children:a},t)}))})},R="details",B="languages",M="tags",G="heading",U=Object(u.a)([G,G,R],[G,G,R],[M,M,B]),X=Object(u.a)([G],[B],[R]),q=function(){var e,t,n,a,r=null!==(e=null===(t=Y())||void 0===t||null===(n=t.metadata)||void 0===n||null===(a=n.packageTags)||void 0===a?void 0:a.reduce((function(e,t){return t.highlight?[].concat(Object(i.a)(e),[t.highlight]):e}),[]))&&void 0!==e?e:[];return Object(w.jsx)(o.a,{_hover:{"> article":{bg:"gray.50"}},children:Object(w.jsxs)(s.a,{as:"article",autoColumns:"1fr",autoRows:"auto",bg:"white",border:"base",borderRadius:"sm",boxShadow:"base",color:"gray.600","data-testid":y.wideContainer,gap:5,h:"100%",p:5,templateAreas:{base:X,md:U},w:"100%",children:[Object(w.jsx)(l.a,{gridArea:G,spacing:2,children:Object(w.jsx)(I,{})}),Object(w.jsx)(l.a,{direction:"row",display:{base:"none",md:"initial"},gridArea:M,maxH:6,overflow:"hidden",spacing:2,children:Object(w.jsx)(K,{})}),Object(w.jsxs)(s.a,{alignItems:"start",alignSelf:"center",autoColumns:{base:"initial",md:"1fr"},autoRows:{base:"initial",md:"auto"},fontSize:"xs",gap:{base:0,md:1},gridArea:R,templateColumns:{base:"1fr 1fr",md:"initial"},templateRows:{base:"1fr 1fr",md:"initial"},children:[r.map((function(e){return Object(w.jsx)(N,Object(c.a)({},e),e.label)})),Object(w.jsx)(S,{})]}),Object(w.jsxs)(l.a,{gridArea:B,spacing:{base:4,md:0},children:[Object(w.jsx)(d.a,{display:{md:"none"}}),Object(w.jsx)(l.a,{"data-testid":y.languages,direction:"row",spacing:2,children:Object(w.jsx)(H,{})})]})]})})},V=Object(r.createContext)(null),Y=function(){return Object(r.useContext)(V)},J=function(e){var t=e.pkg,n=e.variant,r=void 0===n?a.Wide:n;return Object(w.jsx)(V.Provider,{value:t,children:r===a.Wide&&Object(w.jsx)(q,{})})}},282:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(90),r=function(e){var t=Object(a.b)().data;return(null!==t&&void 0!==t?t:{})[e]}},283:function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var a=n(6),r=n(24),c=n(19),i=n(204),o=n(614),s=n(1),l=["date","format"],d=Object(c.a)((function(e,t){var n=e.date,c=e.format,d=Object(r.a)(e,l);return Object(s.jsx)(i.a,Object(a.a)(Object(a.a)({as:"time",dateTime:n.toISOString(),ref:t},d),{},{children:Object(o.a)(n,c)}))}));d.displayName="Time"},284:function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var a=n(6),r=n(24),c=n(601),i=n(88),o=n(71),s=n(1),l=["children","language","value","label","zIndex"],d=function(e){var t=e.children,n=e.language,d=e.value,u=e.label,b=void 0===u?d:u,j=e.zIndex,f=Object(r.a)(e,l);return Object(s.jsx)(o.a,{"aria-label":"Tag: ".concat(b),to:Object(i.c)({query:"".concat(d),language:n}),zIndex:j,children:Object(s.jsx)(c.a,Object(a.a)(Object(a.a)({_hover:{textDecoration:"underline"}},f),{},{children:Object(s.jsx)(c.b,{children:t})}))})}},285:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(237),r=n(109),c=n(1),i=function(e){var t=e.children,n=e.language,i=r.e.has(n),o=r.b[n],s=i?"Click to view documentation in ".concat(o):"Documentation support for ".concat(o," is coming soon!");return Object(c.jsx)(a.a,{hasArrow:!0,label:s,placement:"top-start",children:Object(c.jsx)("span",{children:t})})}},371:function(e,t,n){"use strict";n.d(t,"b",(function(){return l})),n.d(t,"a",(function(){return d}));var a=n(19),r=n(20),c=n(14),i=n(0);function o(){return o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},o.apply(this,arguments)}function s(e,t){if(null==e)return{};var n,a,r={},c=Object.keys(e);for(a=0;a<c.length;a++)n=c[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}var l=Object(a.a)((function(e,t){var n=e.isExternal,a=e.target,l=e.rel,d=e.className,u=s(e,["isExternal","target","rel","className"]);return i.createElement(r.a.a,o({},u,{ref:t,className:Object(c.d)("chakra-linkbox__overlay",d),rel:n?"noopener noreferrer":l,target:n?"_blank":a,__css:{position:"static","&::before":{content:"''",cursor:"inherit",display:"block",position:"absolute",top:0,left:0,zIndex:0,width:"100%",height:"100%"}}}))})),d=Object(a.a)((function(e,t){var n=e.className,a=s(e,["className"]);return i.createElement(r.a.div,o({ref:t,position:"relative"},a,{className:Object(c.d)("chakra-linkbox",n),__css:{"a[href]:not(.chakra-linkbox__overlay), abbr[title]":{position:"relative",zIndex:1}}}))}))},598:function(e,t,n){"use strict";n.d(t,"e",(function(){return R})),n.d(t,"a",(function(){return B})),n.d(t,"b",(function(){return M})),n.d(t,"c",(function(){return G})),n.d(t,"d",(function(){return U}));var a=n(19),r=n(57),c=n(35),i=n(49),o=n(20),s=n(28),l=n(14),d=n(8),u=n(0),b=n(4),j=n(5),f=n(246),O=n(238),m=n(148),h=n(116),p=n(147),v=n(118),g=n(160),x=n(158),y=n(183),w=n(29),k=n(221);function S(){return S=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},S.apply(this,arguments)}function T(e,t){if(null==e)return{};var n,a,r={},c=Object.keys(e);for(a=0;a<c.length;a++)n=c[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}var C=Object(O.a)(),D=Object(j.a)(C,4),z=D[0],I=D[1],A=D[2],N=D[3];var _=Object(v.a)({name:"TabsContext",errorMessage:"useTabsContext: `context` is undefined. Seems you forgot to wrap all tabs components within <Tabs />"}),E=Object(j.a)(_,2),F=E[0],P=E[1];function H(e,t){return e+"--tab-"+t}function L(e,t){return e+"--tabpanel-"+t}function W(){return W=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},W.apply(this,arguments)}function K(e,t){if(null==e)return{};var n,a,r={},c=Object.keys(e);for(a=0;a<c.length;a++)n=c[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}var R=Object(a.a)((function(e,t){var n=Object(r.a)("Tabs",e),a=Object(c.b)(e),d=a.children,b=a.className,f=function(e){var t=e.defaultIndex,n=e.onChange,a=e.index,r=e.isManual,c=e.isLazy,i=e.lazyBehavior,o=void 0===i?"unmount":i,s=e.orientation,l=void 0===s?"horizontal":s,d=e.direction,b=void 0===d?"ltr":d,f=T(e,["defaultIndex","onChange","index","isManual","isLazy","lazyBehavior","orientation","direction"]),O=u.useState(null!=t?t:0),p=Object(j.a)(O,2),v=p[0],g=p[1],x=Object(m.b)({defaultValue:null!=t?t:0,value:a,onChange:n}),y=Object(j.a)(x,2),w=y[0],k=y[1];u.useEffect((function(){null!=a&&g(a)}),[a]);var S=A();return{id:Object(h.b)(e.id,"tabs"),selectedIndex:w,focusedIndex:v,setSelectedIndex:k,setFocusedIndex:g,isManual:r,isLazy:c,lazyBehavior:o,orientation:l,descendants:S,direction:b,htmlProps:f}}(K(a,["children","className"])),O=f.htmlProps,p=f.descendants,v=K(f,["htmlProps","descendants"]),g=u.useMemo((function(){return v}),[v]),x=Object(s.g)(O,["isFitted"]);return u.createElement(z,{value:p},u.createElement(F,{value:g},u.createElement(i.b,{value:n},u.createElement(o.a.div,W({className:Object(l.d)("chakra-tabs",b),ref:t},x,{__css:n.root}),d))))}));d.a&&(R.displayName="Tabs");var B=Object(a.a)((function(e,t){var n=Object(i.d)(),a=function(e){var t=e.isDisabled,n=e.isFocusable,a=T(e,["isDisabled","isFocusable"]),r=P(),c=r.setSelectedIndex,i=r.isManual,o=r.id,s=r.setFocusedIndex,l=r.selectedIndex,d=N({disabled:t&&!n}),u=d.index,b=d.register,j=u===l,O=Object(f.a)(S({},a,{ref:Object(g.a)(b,e.ref),isDisabled:t,isFocusable:n,onClick:Object(w.b)(e.onClick,(function(){c(u)}))}));return S({},O,{id:H(o,u),role:"tab",tabIndex:j?0:-1,type:"button","aria-selected":j,"aria-controls":L(o,u),onFocus:t?void 0:Object(w.b)(e.onFocus,(function(){s(u),!i&&(!t||!n)&&c(u)}))})}(W({},e,{ref:t})),r=W({outline:"0",display:"flex",alignItems:"center",justifyContent:"center"},n.tab);return u.createElement(o.a.button,W({},a,{className:Object(l.d)("chakra-tabs__tab",e.className),__css:r}))}));d.a&&(B.displayName="Tab");var M=Object(a.a)((function(e,t){var n=function(e){var t=P(),n=t.focusedIndex,a=t.orientation,r=t.direction,c=I(),i=u.useCallback((function(e){var t,i=function(){var e=c.nextEnabled(n);e&&Object(y.a)(e.node)},o=function(){var e=c.prevEnabled(n);e&&Object(y.a)(e.node)},s="horizontal"===a,d="vertical"===a,u=Object(l.m)(e),j="ltr"===r?"ArrowLeft":"ArrowRight",f="ltr"===r?"ArrowRight":"ArrowLeft",O=(t={},Object(b.a)(t,j,(function(){return s&&o()})),Object(b.a)(t,f,(function(){return s&&i()})),Object(b.a)(t,"ArrowDown",(function(){return d&&i()})),Object(b.a)(t,"ArrowUp",(function(){return d&&o()})),Object(b.a)(t,"Home",(function(){var e=c.firstEnabled();e&&Object(y.a)(e.node)})),Object(b.a)(t,"End",(function(){var e=c.lastEnabled();e&&Object(y.a)(e.node)})),t)[u];O&&(e.preventDefault(),O(e))}),[c,n,a,r]);return S({},e,{role:"tablist","aria-orientation":a,onKeyDown:Object(w.b)(e.onKeyDown,i)})}(W({},e,{ref:t})),a=W({display:"flex"},Object(i.d)().tablist);return u.createElement(o.a.div,W({},n,{className:Object(l.d)("chakra-tabs__tablist",e.className),__css:a}))}));d.a&&(M.displayName="TabList");var G=Object(a.a)((function(e,t){var n=function(e){var t=e.isSelected,n=e.id,a=e.children,r=T(e,["isSelected","id","children"]),c=P(),i=c.isLazy,o=c.lazyBehavior,s=u.useRef(!1);return t&&(s.current=!0),S({tabIndex:0},r,{children:Object(k.a)({hasBeenSelected:s.current,isSelected:t,isLazy:i,lazyBehavior:o})?a:null,role:"tabpanel",hidden:!t,id:n})}(W({},e,{ref:t})),a=Object(i.d)();return u.createElement(o.a.div,W({outline:"0"},n,{className:Object(l.d)("chakra-tabs__tab-panel",e.className),__css:a.tabpanel}))}));d.a&&(G.displayName="TabPanel");var U=Object(a.a)((function(e,t){var n=function(e){var t=P(),n=t.id,a=t.selectedIndex;return S({},e,{children:Object(x.a)(e.children).map((function(e,t){return u.cloneElement(e,{isSelected:t===a,id:L(n,t),"aria-labelledby":H(n,t)})}))})}(e),a=Object(i.d)();return u.createElement(o.a.div,W({},n,{width:"100%",ref:t,className:Object(l.d)("chakra-tabs__tab-panels",e.className),__css:a.tabpanels}))}));d.a&&(U.displayName="TabPanels");var X=Object(a.a)((function(e,t){var n=function(){var e=P(),t=I(),n=e.selectedIndex,a=e.orientation,r="horizontal"===a,c="vertical"===a,i=u.useState((function(){return r?{left:0,width:0}:c?{top:0,height:0}:void 0})),o=Object(j.a)(i,2),s=o[0],l=o[1],b=u.useState(!1),f=Object(j.a)(b,2),O=f[0],m=f[1];return Object(p.a)((function(){if(!Object(d.l)(n)){var e=t.item(n);if(!Object(d.l)(e)){r&&l({left:e.node.offsetLeft,width:e.node.offsetWidth}),c&&l({top:e.node.offsetTop,height:e.node.offsetHeight});var a=requestAnimationFrame((function(){m(!0)}));return function(){a&&cancelAnimationFrame(a)}}}}),[n,r,c,t]),S({position:"absolute",transitionProperty:"left, right, top, bottom",transitionDuration:O?"200ms":"0ms",transitionTimingFunction:"cubic-bezier(0, 0, 0.2, 1)"},s)}(),a=W({},e.style,n),r=Object(i.d)();return u.createElement(o.a.div,W({ref:t},e,{className:Object(l.d)("chakra-tabs__tab-indicator",e.className),style:a,__css:r.indicator}))}));d.a&&(X.displayName="TabIndicator")},616:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return $}));var a=n(217),r=n(140),c=n(252),i=n(5),o=n(6),s=n(24),l=n(598),d=n(19),u=n(156),b=n(228),j=n(208),f=n(53),O=n(71),m=n(63),h=n(122),p=n(4),v=n(0),g=n(21),x=n(88),y={X:[4,8,12,16,20],Y:[4,6,8]},w=n(150),k=n(281),S=n(59),T=Object(S.a)("homeRedesign",["page","packageGrid","heroHeader","heroSubtitle","infoContainer","infoSection","infoSectionHeading","infoSectionDescription","infoSectionIcon","featuredContainer","featuredHeader","featuredGrid","cdkTypeSection","cdkTypeSectionHeading","cdkTypeSectionDescription","cdkTypeTab","cdkTypeGrid","cdkTypeSeeAllButton"]),C=n(1),D=function(e){var t=e.packages;return Object(C.jsx)(w.a,{"data-testid":T.packageGrid,gap:4,mt:8,templateColumns:{base:"1fr",lg:"1fr 1fr"},children:t.map((function(e){return Object(C.jsx)(k.a,{pkg:e},"".concat(e.name,"-").concat(e.version))}))})},z=["cdkType","data"],I=function(e){var t=e.cdkType,n=e.data;return Object(C.jsxs)(l.a,{"data-testid":T.cdkTypeTab,"data-value":t,isDisabled:n.page.length<1,children:[t?m.b[t].name:"All CDKs"," (",n.results.length,")"]})},A=Object(d.a)((function(e,t){var n=e.cdkType,r=e.data,c=Object(s.a)(e,z);return Object(C.jsxs)(l.c,Object(o.a)(Object(o.a)({"data-testid":T.cdkTypeGrid,ref:t},c),{},{p:0,children:[Object(C.jsx)(D,{packages:r.page}),Object(C.jsx)(a.a,{justify:"center",w:"full",children:Object(C.jsx)(O.a,{"data-testid":T.cdkTypeSeeAllButton,onClick:function(){return window.scrollTo(0,0)},to:Object(x.c)({cdkType:n,sort:n?f.a.DownloadsDesc:f.a.PublishDateDesc}),children:Object(C.jsxs)(u.a,{colorScheme:"blue",my:8,children:["See all ",n?m.b[n].name+" ":"","constructs"]})})})]}))})),N=function(){var e=Object(h.a)({limit:4}),t=Object(h.a)({cdkType:m.c.awscdk,limit:4,sort:f.a.DownloadsDesc}),n=Object(h.a)({cdkType:m.c.cdk8s,limit:4,sort:f.a.DownloadsDesc}),r=Object(h.a)({cdkType:m.c.cdktf,limit:4,sort:f.a.DownloadsDesc}),c=function(e,t){var n=Object(g.g)(),a=Object(v.useState)((function(){var a,r=null===(a=n.location.state)||void 0===a?void 0:a[e];return null!==r&&void 0!==r?r:t})),r=Object(i.a)(a,2),c=r[0],s=r[1];return[c,function(t){n.replace(Object(o.a)(Object(o.a)({},n.location),{},{state:Object(o.a)(Object(o.a)({},n.location.state),{},Object(p.a)({},e,t))})),s(t)}]}("cdkTypeTab",0),s=Object(i.a)(c,2),d=s[0],u=s[1];return Object(C.jsxs)(a.a,{bg:"white",color:"blue.800","data-testid":T.cdkTypeSection,direction:"column",px:y.X,py:y.Y,zIndex:"0",children:[Object(C.jsx)(b.a,{as:"h3","data-testid":T.cdkTypeSectionHeading,fontSize:"1.5rem",fontWeight:"semibold",lineHeight:"lg",mb:3,children:"Find open-source community constructs and official libraries in one location"}),Object(C.jsx)(j.a,{"data-testid":T.cdkTypeSectionDescription,lineHeight:"md",maxW:"60ch",mb:5,children:"Use Construct Hub to find CDKs\u2019 libraries owned by the open source community and companies and organizations like Terraform, CNCF, AWS and more."}),Object(C.jsxs)(l.e,{defaultIndex:d,isFitted:!0,onChange:function(e){return u(e)},variant:"line",children:[Object(C.jsxs)(l.b,{children:[Object(C.jsx)(I,{data:e}),Object(C.jsx)(I,{cdkType:m.c.awscdk,data:t}),Object(C.jsx)(I,{cdkType:m.c.cdk8s,data:n}),Object(C.jsx)(I,{cdkType:m.c.cdktf,data:r})]}),Object(C.jsxs)(l.d,{minH:"28.5rem",children:[Object(C.jsx)(A,{data:e}),Object(C.jsx)(A,{cdkType:m.c.awscdk,data:t}),Object(C.jsx)(A,{cdkType:m.c.cdk8s,data:n}),Object(C.jsx)(A,{cdkType:m.c.cdktf,data:r})]})]})]})},_=n(138),E=n(282),F=n(264),P=n(72),H=function(){var e=Object(E.a)("featuredPackages"),t=Object(i.a)((null!==e&&void 0!==e?e:_.a).sections,1)[0],n=void 0===t?{name:"Recently Updated",showLastUpdated:4}:t,r=function(e){var t=e.showLastUpdated,n=e.showPackages,a=Object(P.b)(),r=a.loading,c=a.error,i=Object(h.a)({limit:25,sort:f.a.PublishDateDesc}).results;return Object(v.useMemo)((function(){return r||c||!i?[]:t?i.slice(0,t):n?n.map((function(e){var t=Object(F.a)({packages:i},e.name);if(t)return Object(o.a)(Object(o.a)({},t),{},{comment:e.comment})})).filter((function(e){return void 0!==e})):void 0}),[i,c,r,t,n])}(n);return r?Object(C.jsxs)(a.a,{"data-testid":T.featuredContainer,direction:"column",px:y.X,py:y.Y,zIndex:"0",children:[Object(C.jsx)(b.a,{as:"h3",color:"white","data-testid":T.featuredHeader,fontSize:"1.5rem",fontWeight:"semibold",lineHeight:"lg",children:n.name}),Object(C.jsx)(w.a,{"data-testid":T.featuredGrid,gap:4,mt:8,templateColumns:{base:"1fr",lg:"1fr 1fr"},children:null===r||void 0===r?void 0:r.slice(0,4).map((function(e){return Object(C.jsx)(k.a,{pkg:e},e.name)}))})]}):null};var L,W,K,R=n(61),B=n(204),M=Object(R.b)(L||(W=["\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"],K||(K=W.slice(0)),L=Object.freeze(Object.defineProperties(W,{raw:{value:Object.freeze(K)}})))),G=Object(d.a)((function(e,t){return Object(C.jsx)(B.a,Object(o.a)({animation:"".concat(M," 10s linear infinite"),bg:"linear-gradient(274.2deg, #143870 20.69%, #1F50A1 84.17%)",bgSize:"200% 200%",ref:t},e))})),U=n(73),X=function(){return Object(C.jsxs)(a.a,{align:"center",color:"white",direction:"column",h:"20rem",justify:"center",px:y.X,py:y.Y,textAlign:"center",zIndex:"1",children:[Object(C.jsx)(b.a,{as:"h1","data-testid":T.heroHeader,size:"xl",children:"Build cloud infrastructure faster"}),Object(C.jsx)(b.a,{as:"h2","data-testid":T.heroSubtitle,fontWeight:"normal",mt:4,size:"md",children:"Construct Hub is a registry for open-source cloud development kit (CDK) libraries."}),Object(C.jsx)(B.a,{color:"initial",maxW:"36rem",mt:8,mx:"auto",w:"full",children:Object(C.jsxs)(U.a,{hasButton:!0,children:[Object(C.jsx)(U.b,{}),Object(C.jsx)(U.c,{})]})})]})},q=n(243),V=n(242),Y=n(219),J=n(109),Q=function(e){var t=e.title,n=e.description,a=e.children;return Object(C.jsxs)(w.a,{color:"blue.800","data-testid":T.infoSection,px:y.X,py:y.Y,templateColumns:"1fr",templateRows:"auto 1fr auto",children:[Object(C.jsx)(b.a,{as:"h3","data-testid":T.infoSectionHeading,fontSize:"1.5rem",fontWeight:"semibold",lineHeight:"lg",mb:2,children:t}),Object(C.jsx)(j.a,{"data-testid":T.infoSectionDescription,fontSize:"lg",mb:4,children:n}),a]})},Z=function(){return Object(C.jsxs)(w.a,{bg:"white","data-testid":T.infoContainer,templateColumns:{base:"1fr",lg:"1fr auto 1fr"},templateRows:{base:"1fr auto 1fr",lg:"1fr"},textAlign:"left",children:[Object(C.jsx)(Q,{description:"We support CDK for CloudFormation (AWS CDK), which generates CloudFormation templates, CDK for Terraform (CDKtf), which generates Terraform-friendly JSON files, and CDK for Kubernetes (CDK8s), which generates Kubernetes manifests.",title:"Supported CDKs",children:Object(C.jsx)(a.a,{align:"center",justify:"space-evenly",pt:4,wrap:"wrap",children:Object.entries(m.b).map((function(e){var t=Object(i.a)(e,2),n=t[0],a=t[1],r=a.name,c=a.imgsrc;return Object(C.jsx)(O.a,{color:"blue.500","data-testid":T.infoSectionIcon,fontWeight:"bold",to:Object(x.c)({cdkType:n,sort:f.a.DownloadsDesc}),children:Object(C.jsxs)(q.a,{align:"center",spacing:2,children:[Object(C.jsx)(V.a,{"aria-label":r,h:8,src:c}),Object(C.jsx)("span",{children:r})]})},n)}))})}),Object(C.jsx)(Y.a,{display:{base:"none",lg:"initial"},h:"auto",my:10,orientation:"vertical"}),Object(C.jsx)(Y.a,{display:{lg:"none"},mx:10,w:"auto"}),Object(C.jsx)(Q,{description:"For each CDK library you can find helpful documentation, such as API references and code samples in Java, .NET, TypeScript and Python. Create cloud resources and define your application using loops, conditionals, GitOps, code completion, and manifest testing.",title:"Supported programming languages",children:Object(C.jsx)(a.a,{align:"center",justify:"space-evenly",pt:4,wrap:"wrap",children:Object.entries(J.c).filter((function(e){var t=Object(i.a)(e,1)[0];return J.e.has(t)})).map((function(e){var t=Object(i.a)(e,2),n=t[0],a=t[1],r=a.icon,c=a.name;return Object(C.jsx)(O.a,{color:"blue.500","data-testid":T.infoSectionIcon,fontWeight:"bold",to:Object(x.c)({languages:[n],sort:f.a.DownloadsDesc}),children:Object(C.jsxs)(q.a,{align:"center",spacing:2,children:[Object(C.jsx)(r,{"aria-label":c,h:8,w:8}),Object(C.jsx)("span",{children:c})]},n)},n)}))})})]})},$=function(){return Object(C.jsx)(c.a,{meta:{title:"Construct Hub",description:"Construct Hub helps developers find open-source construct libraries for use with AWS CDK, CDK8s, CDKTf and other construct-based tools.",suffix:!1},pageName:"home",children:Object(C.jsxs)(G,{as:a.a,"data-testid":T.page,direction:"column",children:[Object(C.jsx)(r.a,{}),Object(C.jsx)(X,{}),Object(C.jsx)(Z,{}),Object(C.jsx)(H,{}),Object(C.jsx)(N,{})]})})}}}]);
2
+ //# sourceMappingURL=7.f8f9a8b7.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","hooks/useQueryParams/useQueryParams.ts","hooks/useLanguage/useLanguage.ts","api/package/util.ts","util/css.ts","constants/keywords.ts","components/PackageCard/constants.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","hooks/useConfigValue/useConfigValue.ts","components/Time/Time.tsx","components/PackageTag/PackageTag.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","../../../src/link-box.tsx","../../../src/use-tabs.ts","../../../src/tabs.tsx","views/Home/constants.ts","views/Home/testIds.ts","views/Home/PackageGrid.tsx","views/Home/CDKTypeTabs.tsx","hooks/useHistoryState/useHistoryState.ts","views/Home/Featured.tsx","views/Home/useSection.ts","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js","views/Home/GradientContainer.tsx","views/Home/Hero.tsx","views/Home/InfoSection.tsx","views/Home/Info.tsx","views/Home/Home.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","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","makeGridAreas","rows","map","row","col","join","KEYWORD_IGNORE_LIST","Set","PackageCardType","testIds","createTestIds","Detail","dataTestid","icon","label","tooltip","value","hasArrow","isDisabled","placement","fontSize","zIndex","Details","currentLanguage","usePackageCard","author","date","metadata","data","useStats","downloads","npm","authorName","undefined","Download","toLocaleString","published","Time","Date","format","NavLink","color","to","getSearchPath","query","Heading","comment","constructFramework","cdkType","cdkVersion","majorVersion","as","Link","getPackagePath","align","CDKType","mr","fontWeight","wordBreak","lineHeight","noOfLines","Highlight","direction","spacing","alt","src","w","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","left","right","LANGUAGES","indexOf","info","isSupportedByLibrary","includes","isSupportedByConstructHub","Icon","borderRadius","h","opacity","LanguageSupportTooltip","Languages","Tags","keywords","packageTags","tags","tag","Boolean","keyword","v","id","slice","PackageTag","variant","GRID_AREA","gridAreasMd","gridAreasMobile","WideCard","highlights","reduce","accum","highlight","_hover","bg","autoColumns","autoRows","border","boxShadow","wideContainer","gap","templateAreas","base","gridArea","display","maxH","overflow","alignItems","alignSelf","templateColumns","templateRows","PackageCardContext","createContext","useContext","PackageCard","Wide","Provider","useConfigValue","key","useConfig","forwardRef","ref","formatString","boxProps","dateTime","toISOString","displayName","tagProps","textDecoration","isSupported","langName","LANGUAGE_NAME_MAP","message","LinkOverlay","className","cx","rel","isExternal","target","__css","position","cursor","top","width","height","LinkBox","createDescendantContext","errorMessage","makeTabId","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","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","CDKTYPE_RENDER_MAP","results","PackageTabPanel","cdkTypeGrid","justify","cdkTypeSeeAllButton","window","scrollTo","CatalogSearchSort","DownloadsDesc","PublishDateDesc","colorScheme","my","CDKTypeTabs","anyCDKType","useCatalogResults","limit","awscdk","cdk8s","cdktf","initialValue","history","location","state","rawState","rawSetState","useHistoryState","setTabIndex","cdkTypeSection","px","py","cdkTypeSectionHeading","mb","cdkTypeSectionDescription","maxW","isFitted","minH","Featured","homePackages","DEFAULT_FEATURED_PACKAGES","sections","featured","showLastUpdated","section","showPackages","useCatalog","loading","error","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","imgsrc","infoSectionIcon","Home","Flex","DevPreviewBanner"],"mappings":"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","file":"static/js/7.f8f9a8b7.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","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","/**\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 * const withBlank = makeGridAreas(\n * [\"header\", null, \"main\"]\n * ); // `\"header . main\"`\n * ```\n */\nexport const makeGridAreas = (...rows: (string | null)[][]): string => {\n return rows\n .map((row) => `\"${row.map((col) => col ?? \".\").join(\" \")}\"`)\n .join(\" \");\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","export enum PackageCardType {\n Wide = \"wide\",\n}\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"packageCard\", [\n \"author\",\n \"description\",\n \"downloads\",\n \"languages\",\n \"published\",\n \"title\",\n \"version\",\n \"comment\",\n \"wideContainer\",\n] as const);\n\nexport default testIds;\n","import { DownloadIcon } from \"@chakra-ui/icons\";\nimport { Text, Tooltip } 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 tooltip?: string;\n label: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n icon,\n label,\n tooltip,\n value,\n}) => (\n <Tooltip hasArrow isDisabled={!tooltip} label={tooltip} placement=\"auto\">\n {/* zIndex required to allow tooltip to display due to card link overlay */}\n <Text data-testid={dataTestid} fontSize=\"xs\" zIndex={1}>\n {icon}\n {icon ? \" \" : \"\"}\n <strong>{label}</strong> {value}\n </Text>\n </Tooltip>\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 tooltip=\"Download numbers are periodically sourced from the NPM registry\"\n value={\"Weekly 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 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 { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { CDKTypeIcon, CDKTypeText } from \"../CDKType\";\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={<CDKTypeText majorVersion={cdkVersion} name={cdkType} />}\n placement=\"top\"\n >\n <CDKTypeIcon mr={2} name={cdkType} zIndex={1} />\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&apos;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\";\n\ninterface HighlightProps {\n label: string;\n color?: string;\n icon?: string;\n}\n\nexport const Highlight: FunctionComponent<HighlightProps> = ({\n label,\n color,\n icon,\n}: HighlightProps) => {\n return (\n <Stack align=\"center\" direction=\"row\" spacing={2}>\n <Image alt={`${label} icon`} src={icon} w={4} />\n <Text color={color} fontWeight=\"bold\">\n {label}\n </Text>\n </Stack>\n );\n};\n","import 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 { PackageTagConfig } from \"../../api/config\";\nimport { KEYWORD_IGNORE_LIST } from \"../../constants/keywords\";\nimport { PackageTag } from \"../PackageTag\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Tags: FunctionComponent = () => {\n const {\n keywords = [],\n metadata: { packageTags = [] },\n } = usePackageCard();\n\n const tags: PackageTagConfig[] = [\n ...packageTags.filter((tag) => Boolean(tag.keyword)),\n ...keywords\n .filter((v) => Boolean(v) && !KEYWORD_IGNORE_LIST.has(v))\n .map((label) => ({\n id: label,\n keyword: {\n label,\n },\n })),\n ];\n return (\n <>\n {tags.slice(0, 3).map(({ id, keyword: { label, color } = {} }) => (\n <PackageTag key={id} value={id} variant={color}>\n {label}\n </PackageTag>\n ))}\n </>\n );\n};\n","import { Grid, Stack, LinkBox, Divider } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { PackageTagConfig, PackageHighlight } from \"../../api/config\";\nimport { makeGridAreas } from \"../../util/css\";\nimport { Details } from \"./Details\";\nimport { Heading } from \"./Heading\";\nimport { Highlight } from \"./Highlight\";\nimport { Languages } from \"./Languages\";\nimport { usePackageCard } from \"./PackageCard\";\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 const highlights =\n usePackageCard()?.metadata?.packageTags?.reduce(\n (\n accum: PackageHighlight[],\n tag: PackageTagConfig\n ): PackageHighlight[] => {\n if (tag.highlight) {\n return [...accum, tag.highlight];\n }\n return accum;\n },\n []\n ) ?? [];\n\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 spacing={2}\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 {highlights.map((highlight) => (\n <Highlight key={highlight.label} {...highlight} />\n ))}\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 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 { 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","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 { 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 { 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 { 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.version}`} 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 { useHistoryState } from \"../../hooks/useHistoryState\";\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\n ? CatalogSearchSort.DownloadsDesc\n : CatalogSearchSort.PublishDateDesc,\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 const [tabIndex, setTabIndex] = useHistoryState(\"cdkTypeTab\", 0);\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 zIndex=\"0\"\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\n defaultIndex={tabIndex}\n isFitted\n onChange={(index) => setTabIndex(index)}\n variant=\"line\"\n >\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 { useState } from \"react\";\nimport { useHistory } from \"react-router-dom\";\n\nexport const useHistoryState = <T>(\n key: string,\n initialValue: T\n): [T, (t: T) => void] => {\n const history = useHistory();\n const [rawState, rawSetState] = useState<T>(() => {\n const value = (history.location.state as any)?.[key];\n return value ?? initialValue;\n });\n const setState = (value: T) => {\n history.replace({\n ...history.location,\n state: {\n ...(history.location.state as any),\n [key]: value,\n },\n });\n rawSetState(value);\n };\n return [rawState, setState];\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 zIndex=\"0\"\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 { useMemo } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { FeaturedPackagesDetail } from \"../../api/config\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { findPackage } from \"../../api/package/util\";\nimport { useCatalog } from \"../../contexts/Catalog\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\n\nexport const useSection = ({\n showLastUpdated,\n showPackages,\n}: {\n showLastUpdated?: number;\n showPackages?: FeaturedPackagesDetail[];\n}) => {\n const { loading, error } = useCatalog();\n const { results } = useCatalogResults({\n limit: 25,\n sort: CatalogSearchSort.PublishDateDesc,\n });\n\n return useMemo(() => {\n if (loading || error || !results) return [];\n\n if (showLastUpdated) {\n return results.slice(0, showLastUpdated);\n } else if (showPackages) {\n return showPackages\n .map((p) => {\n const pkg = findPackage({ packages: results }, 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 }, [results, 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 faster\n </Heading>\n <Heading\n as=\"h2\"\n data-testid={testIds.heroSubtitle}\n fontWeight=\"normal\"\n mt={4}\n size=\"md\"\n >\n Construct Hub is a registry for open-source cloud development kit (CDK)\n libraries.\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=\"auto 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={2}\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 { CatalogSearchSort } from \"../../api/catalog-search/constants\";\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=\"We support CDK for CloudFormation (AWS CDK), which generates CloudFormation templates, CDK for Terraform (CDKtf), which generates Terraform-friendly JSON files, and CDK for Kubernetes (CDK8s), which generates Kubernetes manifests.\"\n title=\"Supported CDKs\"\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 color=\"blue.500\"\n data-testid={testIds.infoSectionIcon}\n fontWeight=\"bold\"\n key={cdktype}\n to={getSearchPath({\n cdkType: cdktype as CDKType,\n sort: CatalogSearchSort.DownloadsDesc,\n })}\n >\n <Stack align=\"center\" 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=\"For each CDK library you can find helpful documentation, such as API references and code samples in Java, .NET, TypeScript and Python. Create cloud resources and define your application using loops, conditionals, GitOps, code completion, and manifest testing.\"\n title=\"Supported programming languages\"\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 color=\"blue.500\"\n data-testid={testIds.infoSectionIcon}\n fontWeight=\"bold\"\n key={language}\n to={getSearchPath({\n languages: [language as Language],\n sort: CatalogSearchSort.DownloadsDesc,\n })}\n >\n <Stack align=\"center\" 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 { DevPreviewBanner } from \"../../components/DevPreviewBanner\";\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 Home: 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 <DevPreviewBanner />\n\n <Hero />\n\n <Info />\n\n <Featured />\n\n <CDKTypeTabs />\n </GradientContainer>\n </Page>\n );\n};\n"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ (this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[]).push([[8],{252:function(e,t,a){"use strict";a.d(t,"a",(function(){return s}));var n=a(0),c=a(267),r={home:{event:{name:"Home Load"}},faq:{event:{name:"Frequently Asked Questions Load"}},packageProfile:{event:{name:"Package Profile Load"}},search:{event:{name:"Search Load"}},siteTerms:{event:{name:"Site Terms Load"}},notFound:{page:{pageType:"errorPage"},event:{name:"404 Page Load"}}},i=a(120),o=a(1),s=function(e){var t=e.children,a=e.meta,s=e.pageName,l=Object(i.b)(r[s]);Object(n.useEffect)((function(){l()}),[l]);var d=a.suffix,u=void 0===d||d,j=a.title,b=a.description,O=u?"".concat(j," - Construct Hub"):j;return Object(o.jsxs)(o.Fragment,{children:[Object(o.jsxs)(c.a,{children:[!1,Object(o.jsx)("meta",{content:"width=device-width, initial-scale=1",name:"viewport"}),Object(o.jsx)("meta",{charSet:"utf-8"}),Object(o.jsx)("title",{children:O}),Object(o.jsx)("meta",{content:O,property:"og:title"}),Object(o.jsx)("meta",{content:O,name:"twitter:title"}),Object(o.jsx)("meta",{content:"summary",name:"twitter:card"}),Object(o.jsx)("meta",{content:b,name:"description"}),Object(o.jsx)("meta",{content:b,property:"og:description"}),Object(o.jsx)("meta",{content:b,name:"twitter:description"})]}),t]})}},262:function(e,t,a){"use strict";a.d(t,"a",(function(){return r}));var n=a(0),c=a(21),r=function(){var e=Object(c.h)().search;return Object(n.useMemo)((function(){return new URLSearchParams(e)}),[e])}},263:function(e,t,a){"use strict";a.d(t,"a",(function(){return b}));var n=a(5),c=a(0),r=a(21),i=a(109),o=a(13),s=a(262),l=i.d.TypeScript,d="preferred-language",u=function(e){return null!=e&&i.e.has(e)},j=function(e){if(u(e))return e;try{var t,a=null!==(t=localStorage.getItem(d))&&void 0!==t?t:"";if(u(a))return a}catch(n){}return l},b=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.updateUrl,a=e.updateSaved,i=Object(r.h)(),l=i.pathname,b=i.hash,O=Object(r.g)(),f=O.replace,h=Object(s.a)(),g=h.get(o.b.LANGUAGE),m=Object(c.useState)((function(){return j(g)})),v=Object(n.a)(m,2),x=v[0],p=v[1];Object(c.useEffect)((function(){u(g)&&g!==x&&p(g)}),[g]),Object(c.useEffect)((function(){g!==x&&t&&(h.set(o.b.LANGUAGE,x),f({pathname:l,hash:b,search:h.toString()}))}),[x,t]);var y=Object(c.useCallback)((function(e){if(p(e),a)try{localStorage.setItem(d,e)}catch(t){}}),[a]);return Object(c.useMemo)((function(){return[x,y]}),[x,y])}},270:function(e,t,a){"use strict";a.d(t,"a",(function(){return n}));var n=function(){for(var e=arguments.length,t=new Array(e),a=0;a<e;a++)t[a]=arguments[a];return t.map((function(e){return'"'.concat(e.map((function(e){return null!==e&&void 0!==e?e:"."})).join(" "),'"')})).join(" ")}},271:function(e,t,a){"use strict";a.d(t,"a",(function(){return n}));var n=new Set(["aws-cdk","aws","awscdk","cdk-construct","cdk","construct","constructs"])},281:function(e,t,a){"use strict";var n;a.d(t,"b",(function(){return n})),a.d(t,"a",(function(){return Y})),function(e){e.Wide="wide"}(n||(n={}));var c=a(0),r=a(6),i=a(17),o=a(371),s=a(150),l=a(243),d=a(219),u=a(270),j=a(5),b=a(600),O=a(237),f=a(208),h=a(89),g=a(263),m=a(88),v=a(71),x=a(283),p=a(59),y=Object(p.a)("packageCard",["author","description","downloads","languages","published","title","version","comment","wideContainer"]),w=a(1),S=function(e){var t=e["data-testid"],a=e.icon,n=e.label,c=e.tooltip,r=e.value;return Object(w.jsx)(O.a,{hasArrow:!0,isDisabled:!c,label:c,placement:"auto",children:Object(w.jsxs)(f.a,{"data-testid":t,fontSize:"xs",zIndex:1,children:[a,a?" ":"",Object(w.jsx)("strong",{children:n})," ",r]})})},k=function(){var e,t,a,n=Object(g.a)(),c=Object(j.a)(n,1)[0],r=J(),i=r.author,o=r.metadata.date,s=r.version,l=r.name,d=Object(h.b)().data,u=null===d||void 0===d||null===(e=d.packages)||void 0===e||null===(t=e[l])||void 0===t||null===(a=t.downloads)||void 0===a?void 0:a.npm,O="string"===typeof i?i:i.name;return Object(w.jsxs)(w.Fragment,{children:[void 0!==u&&u>=10?Object(w.jsx)(S,{"data-testid":y.downloads,icon:Object(w.jsx)(b.a,{}),label:u.toLocaleString(),tooltip:"Download numbers are periodically sourced from the NPM registry",value:"Weekly downloads"}):Object(w.jsx)(S,{"data-testid":y.version,label:"Version",value:s}),Object(w.jsx)(S,{"data-testid":y.published,label:"Published",value:Object(w.jsx)(x.a,{date:new Date(o),fontSize:"xs",format:"MMM dd, yyyy"})}),Object(w.jsx)(S,{"data-testid":y.author,label:"Author",value:Object(w.jsx)(v.a,{color:"blue.500",to:Object(m.c)({query:O,language:c}),children:O})})]})},C=a(217),A=a(228),D=a(34),P=a(123),T=function(){var e=Object(g.a)(),t=Object(j.a)(e,1)[0],a=J(),n=a.comment,c=a.description,r=a.metadata.constructFramework,i=a.name,s=a.version,l=null===r||void 0===r?void 0:r.name,d=null===r||void 0===r?void 0:r.majorVersion;return Object(w.jsxs)(w.Fragment,{children:[Object(w.jsx)(o.b,{as:D.b,to:Object(m.a)({name:i,version:s,language:t}),children:Object(w.jsxs)(C.a,{align:"center",children:[l&&Object(w.jsx)(O.a,{hasArrow:!0,label:Object(w.jsx)(P.b,{majorVersion:d,name:l}),placement:"top",children:Object(w.jsx)(P.a,{mr:2,name:l,zIndex:1})}),Object(w.jsx)(A.a,{as:"h3",color:"blue.800","data-testid":y.title,fontSize:"md",fontWeight:"bold",wordBreak:"break-all",children:i})]})}),Object(w.jsx)(f.a,{color:"blue.800","data-testid":y.description,fontSize:"md",lineHeight:"tall",noOfLines:4,children:c||"No description available."}),n&&Object(w.jsxs)(f.a,{"data-testid":y.comment,fontSize:"md",lineHeight:"tall",noOfLines:4,children:[Object(w.jsxs)(f.a,{as:"span",color:"blue.500",fontSize:"md",fontWeight:"bold",lineHeight:"tall",children:["Editor's note:"," "]}),n]})]})},I=a(242),F=function(e){var t=e.label,a=e.color,n=e.icon;return Object(w.jsxs)(l.a,{align:"center",direction:"row",spacing:2,children:[Object(w.jsx)(I.a,{alt:"".concat(t," icon"),src:n,w:4}),Object(w.jsx)(f.a,{color:a,fontWeight:"bold",children:t})]})},L=a(109),R=a(285),z={sm:5,md:6,lg:8},W=function(e){var t=e.isRounded,a=void 0!==t&&t,n=e.languages,c=e.name,r=e.size,i=void 0===r?"md":r,o=e.version,s=Object.keys(null!==n&&void 0!==n?n:{});return Object(w.jsx)(w.Fragment,{children:Object.entries(L.c).sort((function(e,t){var a=Object(j.a)(e,1)[0],n=Object(j.a)(t,1)[0];return L.a.indexOf(a)-L.a.indexOf(n)})).map((function(e){var t=Object(j.a)(e,2),n=t[0],r=t[1],l=n,d=l===L.d.TypeScript||s.includes(l),u=l===L.d.TypeScript||L.e.has(l);if(!d)return null;var b=r.name,O=r.icon,f=Object(w.jsx)(O,{"aria-label":"Supports ".concat(b),borderRadius:a?"50%":0,h:z[i],opacity:u?1:.2,w:z[i]});return Object(w.jsx)(R.a,{language:l,children:u?Object(w.jsx)(D.b,{"aria-label":"View package docs for ".concat(l),to:Object(m.a)({name:c,version:o,language:l}),children:f}):f},l)}))})},M=function(){var e=J();return Object(w.jsx)(W,Object(r.a)(Object(r.a)({},e),{},{size:"sm"}))},V=a(271),E=a(284),N=function(){var e=J(),t=e.keywords,a=void 0===t?[]:t,n=e.metadata.packageTags,c=void 0===n?[]:n,r=[].concat(Object(i.a)(c.filter((function(e){return Boolean(e.keyword)}))),Object(i.a)(a.filter((function(e){return Boolean(e)&&!V.a.has(e)})).map((function(e){return{id:e,keyword:{label:e}}}))));return Object(w.jsx)(w.Fragment,{children:r.slice(0,3).map((function(e){var t=e.id,a=e.keyword,n=(a=void 0===a?{}:a).label,c=a.color;return Object(w.jsx)(E.a,{value:t,variant:c,children:n},t)}))})},U="details",K="languages",q="tags",H="heading",B=Object(u.a)([H,H,U],[H,H,U],[q,q,K]),G=Object(u.a)([H],[K],[U]),Q=function(){var e,t,a,n,c=null!==(e=null===(t=J())||void 0===t||null===(a=t.metadata)||void 0===a||null===(n=a.packageTags)||void 0===n?void 0:n.reduce((function(e,t){return t.highlight?[].concat(Object(i.a)(e),[t.highlight]):e}),[]))&&void 0!==e?e:[];return Object(w.jsx)(o.a,{_hover:{"> article":{bg:"gray.50"}},children:Object(w.jsxs)(s.a,{as:"article",autoColumns:"1fr",autoRows:"auto",bg:"white",border:"base",borderRadius:"sm",boxShadow:"base",color:"gray.600","data-testid":y.wideContainer,gap:5,h:"100%",p:5,templateAreas:{base:G,md:B},w:"100%",children:[Object(w.jsx)(l.a,{gridArea:H,spacing:2,children:Object(w.jsx)(T,{})}),Object(w.jsx)(l.a,{direction:"row",display:{base:"none",md:"initial"},gridArea:q,maxH:6,overflow:"hidden",spacing:2,children:Object(w.jsx)(N,{})}),Object(w.jsxs)(s.a,{alignItems:"start",alignSelf:"center",autoColumns:{base:"initial",md:"1fr"},autoRows:{base:"initial",md:"auto"},fontSize:"xs",gap:{base:0,md:1},gridArea:U,templateColumns:{base:"1fr 1fr",md:"initial"},templateRows:{base:"1fr 1fr",md:"initial"},children:[c.map((function(e){return Object(w.jsx)(F,Object(r.a)({},e),e.label)})),Object(w.jsx)(k,{})]}),Object(w.jsxs)(l.a,{gridArea:K,spacing:{base:4,md:0},children:[Object(w.jsx)(d.a,{display:{md:"none"}}),Object(w.jsx)(l.a,{"data-testid":y.languages,direction:"row",spacing:2,children:Object(w.jsx)(M,{})})]})]})})},_=Object(c.createContext)(null),J=function(){return Object(c.useContext)(_)},Y=function(e){var t=e.pkg,a=e.variant,c=void 0===a?n.Wide:a;return Object(w.jsx)(_.Provider,{value:t,children:c===n.Wide&&Object(w.jsx)(Q,{})})}},282:function(e,t,a){"use strict";a.d(t,"a",(function(){return c}));var n=a(90),c=function(e){var t=Object(n.b)().data;return(null!==t&&void 0!==t?t:{})[e]}},283:function(e,t,a){"use strict";a.d(t,"a",(function(){return d}));var n=a(6),c=a(24),r=a(19),i=a(204),o=a(614),s=a(1),l=["date","format"],d=Object(r.a)((function(e,t){var a=e.date,r=e.format,d=Object(c.a)(e,l);return Object(s.jsx)(i.a,Object(n.a)(Object(n.a)({as:"time",dateTime:a.toISOString(),ref:t},d),{},{children:Object(o.a)(a,r)}))}));d.displayName="Time"},284:function(e,t,a){"use strict";a.d(t,"a",(function(){return d}));var n=a(6),c=a(24),r=a(601),i=a(88),o=a(71),s=a(1),l=["children","language","value","label","zIndex"],d=function(e){var t=e.children,a=e.language,d=e.value,u=e.label,j=void 0===u?d:u,b=e.zIndex,O=Object(c.a)(e,l);return Object(s.jsx)(o.a,{"aria-label":"Tag: ".concat(j),to:Object(i.c)({query:"".concat(d),language:a}),zIndex:b,children:Object(s.jsx)(r.a,Object(n.a)(Object(n.a)({_hover:{textDecoration:"underline"}},O),{},{children:Object(s.jsx)(r.b,{children:t})}))})}},285:function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));var n=a(237),c=a(109),r=a(1),i=function(e){var t=e.children,a=e.language,i=c.e.has(a),o=c.b[a],s=i?"Click to view documentation in ".concat(o):"Documentation support for ".concat(o," is coming soon!");return Object(r.jsx)(n.a,{hasArrow:!0,label:s,placement:"top-start",children:Object(r.jsx)("span",{children:t})})}},615:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return Se}));var n,c=a(150),r=a(252),i=a(243),o=a(228),s=a(94),l=a(17),d=a(4),u=a(6),j=a(5),b=a(0),O=a(63),f=a(93),h=a(369),g=a(620),m=a(208),v=a(609),x=a(217),p=a(617),y=a(215),w=a(1),S=function(e){var t=e.name,a=e.hint;return Object(w.jsxs)(x.a,{align:"center",children:[Object(w.jsx)(o.a,{as:"h4",size:"sm",w:"max-content",children:t}),a?Object(w.jsxs)(p.a,{colorScheme:"dark",placement:"right",strategy:"fixed",children:[Object(w.jsx)(p.e,{children:Object(w.jsx)(y.a,{"aria-label":"Hint: ".concat(t),icon:Object(w.jsx)(v.a,{h:4,w:4}),ml:2,px:0,py:0,size:"sm",variant:"ghost"})}),Object(w.jsxs)(p.d,{bg:"gray.700",borderRadius:"base",color:"white",fontSize:"sm",shadow:"whiteAlpha.300",children:[Object(w.jsx)(p.b,{bg:"gray.700"}),Object(w.jsx)(p.c,{children:Object(w.jsx)(m.a,{children:a})})]})]}):null]})},k=a(59),C=Object(k.a)("searchRedesign",["page","searchDetails","nextPage","prevPage","goToPage","sortButton","sortDropdown","sortItem","filtersPanel","cdkTypeFilter","cdkVersionFilter","filterItem","languagesFilter"]),A=function(e){var t=e["data-testid"],a=e.value,n=e.onValueChange,c=e.options,r=e.name,o=e.hint;return Object(w.jsxs)(i.a,{"data-testid":t,spacing:2,children:[Object(w.jsx)(S,{hint:o,name:r}),Object(w.jsx)(h.a,{onChange:n,value:a,children:Object(w.jsx)(i.a,{children:c.map((function(e){var t=e.display,a=e.value;return Object(w.jsx)(g.a,{value:a,children:Object(w.jsx)(m.a,{color:"gray.600","data-testid":C.filterItem,"data-value":a,fontSize:"sm",isTruncated:!0,children:t})},a)}))})})]})},D=a(13),P=a(95),T=a(262),I=a(53),F=(n={},Object(d.a)(n,I.a.NameAsc,"A-Z"),Object(d.a)(n,I.a.NameDesc,"Z-A"),Object(d.a)(n,I.a.PublishDateAsc,"Oldest first"),Object(d.a)(n,I.a.PublishDateDesc,"Newest first"),Object(d.a)(n,I.a.DownloadsDesc,"Most downloads"),Object(d.a)(n,I.a.DownloadsAsc,"Least downloads"),n),L=function(e){var t=parseInt(e);return"NaN"==="".concat(t)?0:t},R=function(e){return e?decodeURIComponent(e).split(","):[]},z=Object(b.createContext)(void 0),W=function(){var e=Object(b.useContext)(z);if(!e)throw new Error("This hook must be called in a child of <SearchStateProvider />");return e},M=function(e){var t,a,n,c,r=e.children,i=Object(T.a)(),o=L(null!==(t=i.get(D.b.OFFSET))&&void 0!==t?t:"0"),s=decodeURIComponent(null!==(a=i.get(D.b.SEARCH_QUERY))&&void 0!==a?a:""),l=R(i.get(D.b.LANGUAGES)),d=R(i.get(D.b.TAGS)),u=null!==(n=i.get(D.b.SORT))&&void 0!==n?n:void 0,j=null!==(c=i.get(D.b.CDK_TYPE))&&void 0!==c?c:void 0,O=i.get(D.b.CDK_MAJOR),f=O?L(O):void 0,h=Object(P.a)({defaultCdkMajor:f,defaultCdkType:j,defaultLanguages:l,defaultQuery:s,defaultSort:u,defaultTags:d});return Object(b.useEffect)((function(){s!==h.query&&h.setQuery(s)}),[s]),Object(w.jsx)(z.Provider,{value:{limit:25,offset:o,query:s,searchAPI:h},children:r})},V=function(){var e,t=W().searchAPI,a=t.cdkType,n=t.setCdkType,c=t.cdkMajor,r=t.setCdkMajor,i=Object(f.b)(),o=Object(b.useMemo)((function(){var e=i.constructFrameworks,t=Object.entries(e).reduce((function(e,t){var a=Object(j.a)(t,2),n=a[0],c=a[1];return c.pkgCount<1?e:Object(u.a)(Object(u.a)({},e),{},Object(d.a)({},n,Object(u.a)({display:O.a[n],value:n},c)))}),{});return Object.keys(t).length?t:void 0}),[i]),s=Object(b.useMemo)((function(){var e;if(o&&a){var t=null===(e=o[a])||void 0===e?void 0:e.majorVersions;if(t)return Object(l.a)(t).sort((function(e,t){return e-t})).map((function(e){return{value:e.toString(),display:"".concat(O.a[a]," v").concat(e)}}))}}),[o,a]);if(!o)return null;return Object(w.jsxs)(w.Fragment,{children:[Object(w.jsx)(A,{"data-testid":C.cdkTypeFilter,hint:"Choose the right CDK for your IaC technology: AWS CDK for AWS CloudFormation, CDKtf for Terraform, or CDK8s for Kubernetes.",name:"CDK Type",onValueChange:function(e){var t=e;r(void 0),n(e?t:void 0)},options:[{display:"Any CDK Type",value:""}].concat(Object(l.a)(Object.values(o))),value:null!==a&&void 0!==a?a:""}),!!(s&&s.length>1)&&Object(w.jsx)(A,{"data-testid":C.cdkVersionFilter,hint:"Choose the major version of the CDK you're using to see only constructs that will work with that version.",name:"CDK Major Version",onValueChange:function(e){if(e){var t=parseInt(e,10);r(t)}else r(void 0)},options:[{display:"Any Major Version",value:""}].concat(Object(l.a)(s)),value:null!==(e=null===c||void 0===c?void 0:c.toString())&&void 0!==e?e:""})]})},E=a(109),N=a(235),U=a(237),K=function(e){var t=e["data-testid"],a=e.hint,n=e.name,c=e.options,r=e.values,o=e.onValueChange,s=function(e){return function(){o(e)}};return Object(w.jsxs)(i.a,{"data-testid":t,spacing:2,children:[Object(w.jsx)(S,{hint:a,name:n}),c.map((function(e){var t=e.disabledHint,a=e.display,n=e.isDisabled,c=e.value;return Object(w.jsx)(N.a,{isChecked:r.includes(c),isDisabled:n,onChange:s(c),children:Object(w.jsx)(U.a,{hasArrow:!0,isDisabled:!n&&!t,label:t,placement:"right",children:Object(w.jsx)(m.a,{color:"gray.600","data-testid":C.filterItem,"data-value":c,fontSize:"sm",isTruncated:!0,children:a})})},c)}))]})},q=Object.entries(E.b).map((function(e){var t=Object(j.a)(e,2),a=t[0],n=t[1];return Object(u.a)({display:n,value:a},E.e.has(a)?{isDisabled:!1}:{isDisabled:!0,disabledHint:"".concat(E.b[a]," support is coming soon!")})})).sort((function(e,t){return e.isDisabled>t.isDisabled?1:-1})),H=function(){var e=W().searchAPI,t=e.languages,a=e.setLanguages;return Object(w.jsx)(K,{"data-testid":C.languagesFilter,hint:"Choose one or more languages. Results include constructs for use with at least one of the selected languages.",name:"Programming Language",onValueChange:function(e){var n=e;a(t.includes(n)?t.filter((function(e){return e!==n})):[].concat(Object(l.a)(t),[n]))},options:q,values:t})},B=a(282),G=function(){var e,t,a=(null!==(e=null===(t=Object(B.a)("packageTags"))||void 0===t?void 0:t.filter((function(e){return Boolean(e.searchFilter)})))&&void 0!==e?e:[]).reduce((function(e,t){var a,n,c=null===(a=t.searchFilter)||void 0===a?void 0:a.groupBy;return c?Object(u.a)(Object(u.a)({},e),{},Object(d.a)({},c,[].concat(Object(l.a)(null!==(n=e[c])&&void 0!==n?n:[]),[t]))):e}),{}),n=W().searchAPI,c=n.tags,r=n.setTags,i=function(e){r(c.includes(e)?c.filter((function(t){return t!==e})):[].concat(Object(l.a)(c),[e]))};return Object(w.jsx)(w.Fragment,{children:Object.entries(a).map((function(e){var t=Object(j.a)(e,2),a=t[0],n=t[1];return Object(w.jsx)(K,{name:a,onValueChange:i,options:n.map((function(e){return{display:e.searchFilter.display,value:e.id}})),values:c},a)}))})},Q="5.75rem",_=function(){return Object(w.jsx)(s.a,{borderRadius:"none",boxShadow:"none","data-testid":C.filtersPanel,display:{base:"none",md:"flex"},maxH:"calc(100vh - ".concat(Q," - 1.25rem)"),maxW:"23rem",minW:"100%",overflow:"hidden auto",p:4,pos:"sticky",top:Q,zIndex:"docked",children:Object(w.jsxs)(i.a,{color:"blue.800",h:"max-content",spacing:6,top:4,children:[Object(w.jsx)(o.a,{as:"h3",size:"sm",children:"Filters"}),Object(w.jsx)(V,{}),Object(w.jsx)(H,{}),Object(w.jsx)(G,{})]})})},J=a(204),Y=a(21),Z=a(226),X=a(209),$=a(281),ee=Object(d.a)({},$.b.Wide,(function(e){var t=e.items;return Object(w.jsx)(i.a,{spacing:4,children:t.map((function(e){return Object(w.jsx)($.a,{pkg:e,variant:$.b.Wide},"".concat(e.name,"-").concat(e.version))}))})})),te=Object(b.memo)((function(e){var t=e.cardView,a=void 0===t?$.b.Wide:t,n=e.items;if(e.loading||!n)return Object(w.jsx)(Z.a,{children:Object(w.jsx)(X.a,{size:"xl"})});var c=ee[a];return Object(w.jsx)(c,{items:n})}));te.displayName="PackageList";var ae=a(73),ne=a(122),ce=a(88),re=a(610),ie=a(595),oe=a(34),se=function(e){var t=e["data-testid"],a=e.icon,n=e.offset,c=e.getPageUrl,r={"aria-label":"Page ".concat(n," link"),borderRadius:"md",borderColor:"blue.500",colorScheme:"blue","data-testid":t,icon:Object(w.jsx)(a,{color:"blue.500",h:5,w:5}),mx:2,h:10,w:10,variant:"outline"};return void 0!==n?Object(w.jsx)(y.a,Object(u.a)(Object(u.a)({},r),{},{as:oe.b,to:c({offset:n})})):Object(w.jsx)(y.a,Object(u.a)(Object(u.a)({},r),{},{disabled:!0}))},le=a(241),de=function(e){var t=e["data-testid"],a=e.pageLimit,n=e.offset,c=e.getPageUrl,r=Object(b.useState)((n+1).toString()),i=Object(j.a)(r,2),o=i[0],s=i[1],l=Object(Y.g)().push;Object(b.useEffect)((function(){s((n+1).toString())}),[n]);return Object(w.jsxs)(x.a,{align:"center",as:"form",mx:2,onSubmit:function(e){e.preventDefault(),l(c({offset:parseInt(o)-1}))},children:[Object(w.jsx)(le.a,{colorScheme:"blue","data-testid":t,h:10,max:a+1,min:1,name:"page",onChange:function(e){e.preventDefault(),s(e.target.value)},p:0,textAlign:"center",type:"number",value:o,w:10}),Object(w.jsxs)(m.a,{ml:2,w:"max-content",children:["of ",a+1]})]})},ue=function(e){var t=e.offset,a=e.getPageUrl,n=e.pageLimit,c=t<n?t+1:void 0,r=t>0?t-1:void 0;return Object(w.jsxs)(i.a,{align:"center",direction:"row",justify:"space-between",maxW:"18rem",mx:"auto",spacing:4,w:"full",children:[Object(w.jsx)(se,{"data-testid":C.prevPage,getPageUrl:a,icon:re.a,offset:r}),Object(w.jsx)(de,{"data-testid":C.goToPage,getPageUrl:a,offset:t,pageLimit:n}),Object(w.jsx)(se,{"data-testid":C.nextPage,getPageUrl:a,icon:ie.a,offset:c})]})},je=function(e){var t=e.children;return Object(w.jsx)(m.a,{as:"strong",color:"gray.700",children:t})},be=function(e){var t=e.limit,a=e.offset,n=e.count,c=e.filtered,r=e.query,i=t*a,o=i+t;return Object(w.jsxs)(m.a,{"data-testid":C.searchDetails,children:["Displaying"," ",Object(w.jsxs)(je,{children:[n?i+1:n," - ",o>n?n:o]})," ","of ",Object(w.jsx)(je,{children:n})," ",c?"search results":"constructs",r&&Object(w.jsxs)(w.Fragment,{children:[" for ",Object(w.jsx)(je,{children:r})]})]})},Oe=a(222),fe=a(210),he=a(156),ge=a(245),me=a(47),ve=function(){var e=W().searchAPI,t=e.sort,a=e.setSort;return Object(w.jsx)(A,{hint:"Sets the order of search results",name:"Sorted By",onValueChange:function(e){a(e||void 0)},options:[{display:"Relevance",value:""}].concat(Object(l.a)(Object.entries(F).map((function(e){var t=Object(j.a)(e,2),a=t[0];return{display:t[1],value:a}})))),value:null!==t&&void 0!==t?t:""})},xe=function(){var e=Object(fe.a)();return Object(w.jsxs)(w.Fragment,{children:[Object(w.jsx)(he.a,{colorScheme:"blue",display:{md:"none"},onClick:e.onOpen,rightIcon:Object(w.jsx)(Oe.a,{}),variant:"link",children:"Sorting and Filters"}),Object(w.jsxs)(ge.a,Object(u.a)(Object(u.a)({},e),{},{placement:"bottom",children:[Object(w.jsx)(me.h,{}),Object(w.jsxs)(ge.b,{color:"blue.800",children:[Object(w.jsx)(me.g,{children:"Sorting and Filters"}),Object(w.jsx)(me.c,{}),Object(w.jsx)(me.b,{children:Object(w.jsxs)(i.a,{color:"blue.800",pb:4,spacing:4,children:[Object(w.jsx)(ve,{}),Object(w.jsx)(V,{}),Object(w.jsx)(H,{}),Object(w.jsx)(G,{})]})})]})]}))]})},pe=a(236),ye=function(){var e=W().searchAPI,t=e.sort,a=e.setSort,n=t?F[t]:"Relevance";return Object(w.jsxs)(x.a,{align:"center",children:[Object(w.jsx)(m.a,{children:"Sorted by"}),Object(w.jsxs)(pe.a,{children:[Object(w.jsx)(pe.b,{as:he.a,color:"blue.500","data-testid":C.sortButton,ml:2,pl:2,pr:2,py:1,rightIcon:Object(w.jsx)(Oe.a,{}),variant:"link",children:n}),Object(w.jsxs)(pe.f,{"data-testid":C.sortDropdown,minW:"180",zIndex:"sticky",children:[Object(w.jsx)(pe.e,{"data-testid":C.sortItem,"data-value":"",onClick:function(){return a(void 0)},children:"Relevance"},"Relevance"),Object.entries(F).map((function(e){var t=Object(j.a)(e,2),n=t[0],c=t[1];return Object(w.jsx)(pe.e,{"data-testid":C.sortItem,"data-value":n,onClick:function(){return a(n)},children:c},n)}))]})]})]})},we=function(){var e=Object(b.useRef)(!0),t=Object(Y.g)().push,a=W(),n=a.query,c=a.searchAPI,o=a.offset,s=a.limit,l=c.languages,d=c.sort,u=c.cdkType,j=c.cdkMajor,O=c.onSearch,f=c.tags,h=Object(ne.a)({offset:o,limit:s,query:n,languages:l,cdkMajor:j,cdkType:u,sort:d,tags:f}),g=h.page,m=h.pageLimit,v=h.results,x=function(e){var t,a;return Object(ce.c)({cdkMajor:j,cdkType:u,query:null!==(t=e.q)&&void 0!==t?t:n,languages:l,sort:d,offset:null!==(a=e.offset)&&void 0!==a?a:o})};return Object(b.useEffect)((function(){v.length&&(o<0||o>m)&&t(x(o<0?{offset:0}:{offset:m}))}),[v,o,m]),Object(b.useEffect)((function(){e.current?e.current=!1:O({replace:!0})}),[d,l,u,j,f]),Object(w.jsx)(r.a,{meta:{title:n||"Search",description:n?"".concat(v.length," results for ").concat(n," at Construct Hub"):"Search reusable components for your cloud application"},pageName:"search",children:Object(w.jsxs)(i.a,{direction:"column",maxW:"100vw",pb:4,px:4,spacing:4,children:[Object(w.jsx)(ae.a,{bg:"white",onChange:c.onQueryChange,onSubmit:c.onSubmit,value:c.query}),Object(w.jsxs)(i.a,{align:{base:"start",lg:"center"},direction:{base:"column-reverse",lg:"row"},justify:{base:"initial",lg:"space-between"},spacing:4,children:[Object(w.jsx)(be,{count:v.length,filtered:!!n,limit:s,offset:o,query:n}),Object(w.jsx)(J.a,{display:{base:"none",md:"initial"},children:Object(w.jsx)(ye,{})}),Object(w.jsx)(J.a,{display:{md:"none"},children:Object(w.jsx)(xe,{})})]}),Object(w.jsx)(te,{items:g}),Object(w.jsx)(J.a,{w:"full",children:Object(w.jsx)(ue,{getPageUrl:x,offset:o,pageLimit:m})})]})})},Se=function(){return Object(w.jsx)(M,{children:Object(w.jsx)(r.a,{meta:{title:"Search - Construct Hub",description:"Search Construct Libraries for AWS CDK, CDK8s, and CDKtf"},pageName:"search",children:Object(w.jsxs)(c.a,{"data-testid":C.page,gap:4,h:"full",maxW:"100%",px:{base:0,md:6},py:6,templateColumns:{base:"1fr",md:"auto 1fr"},templateRows:"1fr",children:[Object(w.jsx)(_,{}),Object(w.jsx)(we,{})]})})})}}}]);
2
+ //# sourceMappingURL=8.64914ea1.chunk.js.map