construct-hub 0.3.56 → 0.3.60

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. package/.jsii +2 -2
  2. package/lib/construct-hub.js +1 -1
  3. package/lib/package-sources/code-artifact.js +1 -1
  4. package/lib/package-sources/npmjs.js +1 -1
  5. package/lib/package-tag/index.js +2 -2
  6. package/lib/spdx-license.js +1 -1
  7. package/package.json +3 -3
  8. package/website/asset-manifest.json +27 -27
  9. package/website/assets/checkmark.svg +3 -0
  10. package/website/index.html +1 -1
  11. package/website/service-worker.js +1 -1
  12. package/website/static/js/{1.fa36c516.chunk.js → 1.ddd0fd4b.chunk.js} +2 -2
  13. package/website/static/js/{1.fa36c516.chunk.js.map → 1.ddd0fd4b.chunk.js.map} +1 -1
  14. package/website/static/js/{10.02ced27a.chunk.js → 10.b91108a6.chunk.js} +2 -2
  15. package/website/static/js/10.b91108a6.chunk.js.map +1 -0
  16. package/website/static/js/{12.ba292c49.chunk.js → 12.309ba8f7.chunk.js} +1 -1
  17. package/website/static/js/{12.ba292c49.chunk.js.map → 12.309ba8f7.chunk.js.map} +1 -1
  18. package/website/static/js/{4.d2b9c583.chunk.js → 4.e2ba75d9.chunk.js} +3 -3
  19. package/website/static/js/{4.d2b9c583.chunk.js.LICENSE.txt → 4.e2ba75d9.chunk.js.LICENSE.txt} +0 -0
  20. package/website/static/js/4.e2ba75d9.chunk.js.map +1 -0
  21. package/website/static/js/{5.a2819889.chunk.js → 5.33b63db6.chunk.js} +3 -3
  22. package/website/static/js/{5.a2819889.chunk.js.LICENSE.txt → 5.33b63db6.chunk.js.LICENSE.txt} +0 -0
  23. package/website/static/js/{5.a2819889.chunk.js.map → 5.33b63db6.chunk.js.map} +1 -1
  24. package/website/static/js/{6.7ba5b2e6.chunk.js → 6.0fcd2680.chunk.js} +2 -2
  25. package/website/static/js/{6.7ba5b2e6.chunk.js.map → 6.0fcd2680.chunk.js.map} +1 -1
  26. package/website/static/js/{7.ca8ff14b.chunk.js → 7.123067dc.chunk.js} +2 -2
  27. package/website/static/js/7.123067dc.chunk.js.map +1 -0
  28. package/website/static/js/8.703cfb42.chunk.js +2 -0
  29. package/website/static/js/8.703cfb42.chunk.js.map +1 -0
  30. package/website/static/js/9.a8fecf34.chunk.js +2 -0
  31. package/website/static/js/9.a8fecf34.chunk.js.map +1 -0
  32. package/website/static/js/main.ca806cb8.chunk.js +2 -0
  33. package/website/static/js/main.ca806cb8.chunk.js.map +1 -0
  34. package/website/static/js/{runtime-main.808c6139.js → runtime-main.9acc4988.js} +2 -2
  35. package/website/static/js/{runtime-main.808c6139.js.map → runtime-main.9acc4988.js.map} +1 -1
  36. package/website/static/js/10.02ced27a.chunk.js.map +0 -1
  37. package/website/static/js/4.d2b9c583.chunk.js.map +0 -1
  38. package/website/static/js/7.ca8ff14b.chunk.js.map +0 -1
  39. package/website/static/js/8.bd66730f.chunk.js +0 -2
  40. package/website/static/js/8.bd66730f.chunk.js.map +0 -1
  41. package/website/static/js/9.b8a2bbeb.chunk.js +0 -2
  42. package/website/static/js/9.b8a2bbeb.chunk.js.map +0 -1
  43. package/website/static/js/main.fd06cc71.chunk.js +0 -2
  44. package/website/static/js/main.fd06cc71.chunk.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ (this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[]).push([[2],{107:function(e,t,n){"use strict";n.d(t,"b",(function(){return p})),n.d(t,"a",(function(){return m}));var a=n(6),c=n(5),r=n(203),o=n(0),i="prefersWarnOnExternalLinkClick",s=n(204),u=n(46),l=n(201),d=n(226),j=n(156),b=n(229),f=n(45),O=n(1),h=function(e){var t=e.href,n=e.isOpen,a=e.onClick,r=e.onClose,h=e.setShouldWarn,v=Object(o.useState)(!0),p=Object(c.a)(v,2),m=p[0],g=p[1];return Object(O.jsx)(u.a,{closeOnOverlayClick:!1,isOpen:n,onClose:r,children:Object(O.jsx)(u.h,{children:Object(O.jsxs)(u.d,{color:"blue.800",children:[Object(O.jsx)(u.g,{children:"Confirm"}),Object(O.jsxs)(u.b,{children:[Object(O.jsx)(l.a,{fontSize:"lg",mb:2,children:"This link is taking you to an external site"}),Object(O.jsx)(l.a,{bg:"gray.100",borderRadius:"sm",color:"blue.500",fontSize:"sm",mb:4,p:1,children:t}),Object(O.jsx)(d.a,{onChange:function(e){var t=!e.target.checked;g(t)},children:"Do not show this warning again."})]}),Object(O.jsxs)(u.f,{children:[Object(O.jsx)(j.a,{onClick:function(){g(!0),r()},variant:"ghost",children:"Cancel"}),Object(O.jsx)(b.a,{hasArrow:!0,label:t,placement:"top",children:Object(O.jsx)(f.a,{hasIcon:!1,hasWarning:!1,href:t,noFollow:!0,onClick:function(e){if(!m){h(m);try{localStorage.setItem(i,JSON.stringify(m))}catch(t){}}null===a||void 0===a||a(e),r()},children:Object(O.jsx)(j.a,{colorScheme:"blue",ml:4,rightIcon:Object(O.jsx)(s.a,{}),tabIndex:0,variant:"ghost",children:"Proceed"})})})]})]})})})},v=Object(o.createContext)((function(e){return e.onClick})),p=function(){return Object(o.useContext)(v)},m=function(e){var t=e.children,n=Object(o.useState)(null),s=Object(c.a)(n,2),u=s[0],l=s[1],d=Object(r.a)({onClose:function(){l(null)}}),j=d.isOpen,b=d.onOpen,f=d.onClose,p=Object(o.useState)((function(){try{var e,t=null!==(e=localStorage.getItem(i))&&void 0!==e?e:"true";return JSON.parse(t)}catch(n){return!0}})),m=Object(c.a)(p,2),g=m[0],x=m[1],k=Object(o.useCallback)((function(e){var t=e.href,n=e.onClick;if(!g)return n;return function(e){l({href:t,onClick:n}),e.preventDefault(),b()}}),[b,g]);return Object(O.jsxs)(v.Provider,{value:k,children:[t,Object(O.jsx)(h,Object(a.a)({isOpen:j,onClose:f,setShouldWarn:x},u))]})}},110:function(e,t,n){"use strict";n.d(t,"d",(function(){return o})),n.d(t,"f",(function(){return d})),n.d(t,"a",(function(){return j})),n.d(t,"b",(function(){return b})),n.d(t,"e",(function(){return f})),n.d(t,"c",(function(){return O}));var a,c,r,o,i=n(4),s=n(6),u=n(108),l=n(1);!function(e){e.DotNet="dotnet",e.TypeScript="typescript",e.Python="python",e.Go="golang",e.Java="java"}(o||(o={}));var d=(a={},Object(i.a)(a,o.TypeScript,o.TypeScript),Object(i.a)(a,o.Python,o.Python),Object(i.a)(a,o.Go,o.Go),Object(i.a)(a,o.Java,o.Java),Object(i.a)(a,o.DotNet,"csharp"),a),j=[o.TypeScript,o.Python,o.Java,o.Go,o.DotNet],b=(c={},Object(i.a)(c,o.TypeScript,"TypeScript"),Object(i.a)(c,o.Python,"Python"),Object(i.a)(c,o.Java,"Java"),Object(i.a)(c,o.Go,"Go"),Object(i.a)(c,o.DotNet,".NET"),c),f=new Set([o.Python,o.TypeScript,o.Java,o.DotNet]),O=(r={},Object(i.a)(r,o.TypeScript,{name:b.typescript,icon:function(e){return Object(l.jsxs)(u.a,Object(s.a)(Object(s.a)({},e),{},{"aria-hidden":"true",transform:"rotate(360)",viewBox:"0 0 256 256",children:[Object(l.jsx)("path",{d:"M0 128v128h256V0H0z",fill:"#007ACC"}),Object(l.jsx)("path",{d:"M56.611 128.85l-.081 10.483h33.32v94.68h23.57v-94.68h33.32v-10.28c0-5.69-.122-10.444-.284-10.566-.122-.162-20.399-.244-44.983-.203l-44.739.122-.122 10.443zM206.567 118.108c6.501 1.626 11.459 4.51 16.01 9.224 2.357 2.52 5.851 7.112 6.136 8.209.08.325-11.053 7.802-17.798 11.987-.244.163-1.22-.894-2.317-2.52-3.291-4.794-6.745-6.867-12.028-7.232-7.76-.529-12.759 3.535-12.718 10.32 0 1.992.284 3.17 1.097 4.796 1.707 3.535 4.876 5.648 14.832 9.955 18.326 7.884 26.168 13.085 31.045 20.48 5.445 8.25 6.664 21.415 2.966 31.208-4.063 10.646-14.14 17.88-28.323 20.277-4.388.772-14.79.65-19.504-.203-10.28-1.829-20.033-6.908-26.047-13.572-2.357-2.601-6.949-9.387-6.664-9.875.122-.162 1.178-.812 2.356-1.503 1.138-.65 5.446-3.13 9.509-5.486l7.355-4.267 1.544 2.276c2.154 3.291 6.867 7.802 9.712 9.305 8.167 4.308 19.383 3.698 24.909-1.26 2.357-2.153 3.332-4.388 3.332-7.68 0-2.966-.366-4.266-1.91-6.5-1.99-2.845-6.054-5.243-17.595-10.24-13.206-5.69-18.895-9.225-24.096-14.833-3.007-3.25-5.852-8.452-7.03-12.8-.975-3.616-1.22-12.678-.447-16.335 2.723-12.76 12.353-21.658 26.25-24.3 4.51-.853 14.994-.528 19.424.57z",fill:"#FFF"})]}))}}),Object(i.a)(r,o.Python,{name:b.python,icon:function(e){return Object(l.jsxs)(u.a,Object(s.a)(Object(s.a)({},e),{},{version:"1.0",viewBox:"0 0 110.421 109.846",children:[Object(l.jsxs)("defs",{children:[Object(l.jsxs)("linearGradient",{id:"a",children:[Object(l.jsx)("stop",{offset:"0",stopColor:"#ffe052"}),Object(l.jsx)("stop",{offset:"1",stopColor:"#ffc331"})]}),Object(l.jsx)("linearGradient",{gradientUnits:"userSpaceOnUse",id:"d",x1:"89.137",x2:"147.777",xlinkHref:"#a",y1:"111.921",y2:"168.101"}),Object(l.jsxs)("linearGradient",{id:"b",children:[Object(l.jsx)("stop",{offset:"0",stopColor:"#387eb8"}),Object(l.jsx)("stop",{offset:"1",stopColor:"#366994"})]}),Object(l.jsx)("linearGradient",{gradientUnits:"userSpaceOnUse",id:"c",x1:"55.549",x2:"110.149",xlinkHref:"#b",y1:"77.07",y2:"131.853"})]}),Object(l.jsxs)("g",{color:"#000",children:[Object(l.jsx)("path",{d:"M99.75 67.469c-28.032 0-26.281 12.156-26.281 12.156l.031 12.594h26.75V96H62.875s-17.938-2.034-17.938 26.25 15.657 27.281 15.657 27.281h9.343v-13.125s-.503-15.656 15.407-15.656h26.531s14.906.241 14.906-14.406V82.125s2.263-14.656-27.031-14.656zM85 75.938a4.808 4.808 0 014.813 4.812A4.808 4.808 0 0185 85.563a4.808 4.808 0 01-4.813-4.813A4.808 4.808 0 0185 75.937z",fill:"url(#c)",overflow:"visible",style:{marker:"none"},transform:"translate(-44.938 -67.469)"}),Object(l.jsx)("path",{d:"M100.546 177.315c28.032 0 26.281-12.156 26.281-12.156l-.03-12.594h-26.75v-3.781h37.374s17.938 2.034 17.938-26.25c0-28.285-15.657-27.282-15.657-27.282h-9.343v13.125s.503 15.657-15.407 15.657h-26.53s-14.907-.241-14.907 14.406v24.219s-2.263 14.656 27.031 14.656zm14.75-8.469a4.808 4.808 0 01-4.812-4.812 4.808 4.808 0 014.812-4.813 4.808 4.808 0 014.813 4.813 4.808 4.808 0 01-4.813 4.812z",fill:"url(#d)",overflow:"visible",style:{marker:"none"},transform:"translate(-44.938 -67.469)"})]})]}))}}),Object(i.a)(r,o.Java,{name:b.java,icon:function(e){return Object(l.jsxs)(u.a,Object(s.a)(Object(s.a)({},e),{},{"aria-hidden":"true",transform:"rotate(360)",viewBox:"0 0 256 346",children:[Object(l.jsx)("path",{d:"M82.554 267.473s-13.198 7.675 9.393 10.272c27.369 3.122 41.356 2.675 71.517-3.034 0 0 7.93 4.972 19.003 9.279-67.611 28.977-153.019-1.679-99.913-16.517M74.292 229.659s-14.803 10.958 7.805 13.296c29.236 3.016 52.324 3.263 92.276-4.43 0 0 5.526 5.602 14.215 8.666-81.747 23.904-172.798 1.885-114.296-17.532",fill:"#5382A1"}),Object(l.jsx)("path",{d:"M143.942 165.515c16.66 19.18-4.377 36.44-4.377 36.44s42.301-21.837 22.874-49.183c-18.144-25.5-32.059-38.172 43.268-81.858 0 0-118.238 29.53-61.765 94.6",fill:"#E76F00"}),Object(l.jsx)("path",{d:"M233.364 295.442s9.767 8.047-10.757 14.273c-39.026 11.823-162.432 15.393-196.714.471-12.323-5.36 10.787-12.8 18.056-14.362 7.581-1.644 11.914-1.337 11.914-1.337-13.705-9.655-88.583 18.957-38.034 27.15 137.853 22.356 251.292-10.066 215.535-26.195M88.9 190.48s-62.771 14.91-22.228 20.323c17.118 2.292 51.243 1.774 83.03-.89 25.978-2.19 52.063-6.85 52.063-6.85s-9.16 3.923-15.787 8.448c-63.744 16.765-186.886 8.966-151.435-8.183 29.981-14.492 54.358-12.848 54.358-12.848M201.506 253.422c64.8-33.672 34.839-66.03 13.927-61.67-5.126 1.066-7.411 1.99-7.411 1.99s1.903-2.98 5.537-4.27c41.37-14.545 73.187 42.897-13.355 65.647 0 .001 1.003-.895 1.302-1.697",fill:"#5382A1"}),Object(l.jsx)("path",{d:"M162.439.371s35.887 35.9-34.037 91.101c-56.071 44.282-12.786 69.53-.023 98.377-32.73-29.53-56.75-55.526-40.635-79.72C111.395 74.612 176.918 57.393 162.439.37",fill:"#E76F00"}),Object(l.jsx)("path",{d:"M95.268 344.665c62.199 3.982 157.712-2.209 159.974-31.64 0 0-4.348 11.158-51.404 20.018-53.088 9.99-118.564 8.824-157.399 2.421.001 0 7.95 6.58 48.83 9.201",fill:"#5382A1"})]}))}}),Object(i.a)(r,o.Go,{name:b.golang,icon:function(e){return Object(l.jsx)(u.a,Object(s.a)(Object(s.a)({},e),{},{"aria-hidden":"true",transform:"rotate(360)",viewBox:"0 0 512 192",children:Object(l.jsx)("path",{d:"M292.533 13.295l1.124.75c13.212 8.725 22.685 20.691 28.917 35.15 1.496 2.243.499 3.49-2.493 4.237l-5.063 1.296c-11.447 2.949-20.53 5.429-31.827 8.378l-6.443 1.678c-2.32.574-2.96.333-5.428-2.477l-.348-.399c-3.519-3.988-6.155-6.652-10.817-9.03l-.899-.443c-15.705-7.727-30.911-5.484-45.12 3.74-16.952 10.968-25.677 27.172-25.428 47.364.25 19.942 13.96 36.395 33.654 39.137 16.951 2.244 31.16-3.739 42.378-16.452 2.244-2.743 4.238-5.734 6.73-9.224h-48.11c-5.235 0-6.481-3.24-4.736-7.478l.864-2.035c3.204-7.454 8.173-18.168 11.4-24.294l.704-1.319c.862-1.494 2.612-3.513 5.977-3.513h80.224c3.603-11.415 9.449-22.201 17.246-32.407 18.198-23.931 40.135-36.396 69.8-41.63 25.427-4.488 49.359-1.995 71.046 12.713 19.694 13.461 31.909 31.66 35.15 55.59 4.237 33.654-5.485 61.075-28.668 84.508-16.453 16.702-36.645 27.172-59.829 31.908-6.73 1.247-13.461 1.496-19.942 2.244-22.685-.499-43.376-6.98-60.826-21.937-12.273-10.61-20.727-23.648-24.928-38.828a104.937 104.937 0 01-10.47 16.89c-17.949 23.683-41.381 38.39-71.046 42.38-24.43 3.24-47.115-1.497-67.058-16.454-18.447-13.96-28.917-32.407-31.66-55.34-3.24-27.173 4.737-51.603 21.19-73.041 17.7-23.184 41.132-37.891 69.8-43.126 22.999-4.16 45.037-1.595 64.936 11.464zM411.12 49.017l-.798.178c-23.183 5.235-38.14 19.942-43.624 43.375-4.488 19.444 4.985 39.138 22.934 47.115 13.71 5.983 27.421 5.235 40.633-1.496 19.694-10.22 30.413-26.175 31.66-47.613-.25-3.24-.25-5.734-.749-8.227-4.436-24.401-26.664-38.324-50.056-33.332zM116.416 94.564c.997 0 1.496.748 1.496 1.745l-.499 5.983c0 .997-.997 1.745-1.745 1.745l-54.344-.249c-.997 0-1.246-.748-.748-1.496l3.49-6.232c.499-.748 1.496-1.496 2.493-1.496h49.857zM121.9 71.63c.997 0 1.496.748 1.247 1.496l-1.995 5.983c-.249.997-1.246 1.495-2.243 1.495l-117.912.25c-.997 0-1.246-.499-.748-1.247l5.235-6.73c.499-.748 1.745-1.247 2.742-1.247H121.9zm12.963-22.934c.997 0 1.246.748.748 1.496l-4.238 6.481c-.499.748-1.745 1.496-2.493 1.496l-90.24-.25c-.998 0-1.247-.498-.749-1.246l5.235-6.73c.499-.748 1.745-1.247 2.742-1.247h88.995z",fill:"#00ACD7"})}))}}),Object(i.a)(r,o.DotNet,{name:b.dotnet,icon:function(e){return Object(l.jsx)(u.a,Object(s.a)(Object(s.a)({},e),{},{"aria-hidden":"true",transform:"rotate(360)",viewBox:"0 0 32 32",children:Object(l.jsx)("path",{d:"M4.224 10.089v11.667h1.365v-8.438a12.58 12.58 0 00-.068-1.599h.052c.099.255.224.5.37.729l6 9.302h1.672V10.089h-1.359v8.203c-.016.573.016 1.146.083 1.714h-.031a13.986 13.986 0 00-.474-.781L5.995 10.09zm12.417 0v11.667h6.203l.005-1.281h-4.813v-4.047h4.214v-1.229h-4.214v-3.875h4.521V10.09zm7.25 0v1.234h3.354v10.432h1.365V11.323h3.391v-1.234zm-23.021 10a.86.86 0 00-.609.276.91.91 0 00-.26.641.901.901 0 001.542.641c.172-.167.271-.401.271-.641s-.099-.474-.271-.641a.876.876 0 00-.641-.276H.871z",fill:"#626262"})}))}}),r)},121:function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return u}));var a=n(0),c=n(21),r=n(1),o=Object(a.createContext)({trackPageView:function(){}}),i=function(e){var t=e.children,n=Object(c.h)().pathname,i=Object(a.useRef)(null),s=Object(a.useCallback)((function(e){var t,a,c;i.current!==n&&(null===(t=window)||void 0===t||null===(a=t.AWSMA)||void 0===a||null===(c=a.ready)||void 0===c||c.call(a,(function(){document.dispatchEvent(new CustomEvent(window.AWSMA.TRIGGER_EVENT,{detail:e})),i.current=n})))}),[n]);return Object(r.jsx)(o.Provider,{value:{trackPageView:s},children:t})},s=n(6),u=function(e){var t=Object(a.useContext)(o).trackPageView,n=Object(c.h)().pathname,r=Object(a.useMemo)((function(){return{page:Object(s.a)({pageURL:window.location.href.replace("://localhost:3000","://constructs.local.dev")},e.page),event:{type:"pageview",name:e.event.name,description:e.event.description}}}),[n,e]);return Object(a.useCallback)((function(){return t(r)}),[t,r])}},123:function(e,t,n){"use strict";n.d(t,"a",(function(){return j})),n.d(t,"b",(function(){return b}));var a=n(6),c=n(24),r=n(17),o=n(234),i=n(201),s=n(65),u=n(1),l=["name"],d=["name","majorVersion"],j=Object(r.a)((function(e,t){var n=e.name,r=Object(c.a)(e,l);return n?Object(u.jsx)(o.a,Object(a.a)({alt:"".concat(s.b[n].name," Logo"),h:5,ref:t,src:s.b[n].imgsrc,w:5},r)):null})),b=Object(r.a)((function(e,t){var n=e.name,r=e.majorVersion,o=Object(c.a)(e,d);return n?Object(u.jsxs)(i.a,Object(a.a)(Object(a.a)({ref:t},o),{},{children:[s.b[n].name,void 0!==r?" v".concat(r):""]})):null}))},128:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(0),c=function(e,t){var n=t.limit,a=t.offset*n,c=a+n;return e.slice(a,c)},r=n(18),o=n(93),i=function(e){var t=e.cdkMajor,n=e.cdkType,i=e.limit,s=e.offset,u=void 0===s?0:s,l=e.query,d=void 0===l?"":l,j=e.language,b=void 0===j?null:j,f=e.languages,O=e.sort,h=e.tags,v=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.query,n=e.filters,c=e.sort,i=Object(o.b)();if(!i)throw new Error("This hook can only be called within a descendant of a <SearchProvider />");return Object(a.useMemo)((function(){return Object(r.a)(i.search({query:t,filters:n,sort:c}).values())}),[i,t,n,c])}({filters:Object(a.useMemo)((function(){return{cdkMajor:t,cdkType:n,language:null!==b&&void 0!==b?b:void 0,languages:f,tags:h}}),[t,n,b,f,h]),query:d,sort:O}),p=function(e,t){var n=null!==t&&void 0!==t?t:{},r=n.limit,o=void 0===r?25:r,i=n.offset,s=void 0===i?0:i,u=e?Math.floor(e.length/o):0;return Object(a.useMemo)((function(){return{page:c(e,{limit:o,offset:s>u?u:s}),pageLimit:u}}),[e,o,s,u])}(v,{offset:u,limit:i}),m=p.page,g=p.pageLimit;return Object(a.useMemo)((function(){return{results:v,page:m,pageLimit:g}}),[m,g,v])}},13:function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return c})),n.d(t,"c",(function(){return r}));var a={PACKAGES_PREFIX:"/data",CATALOG_SUFFIX:"/catalog.json",ASSEMBLY_SUFFIX:"/assembly.json",METADATA_SUFFIX:"/metadata.json",CONFIG:"/config.json",STATS:"/stats.json"},c={CDK_TYPE:"cdk",LANGUAGE:"lang",LANGUAGES:"langs",OFFSET:"offset",SEARCH_QUERY:"q",SORT:"sort",SUBMODULE:"submodule",CDK_MAJOR:"cdkver",TAGS:"tags"},r={FAQ:"/faq",HOME:"/",PACKAGES:"/packages",SEARCH:"/search",SITE_TERMS:"/terms"}},138:function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return u}));var a=n(27),c=n.n(a),r=n(41),o=n(13),i={sections:[{name:"Recently updated",showLastUpdated:10}]},s={featureFlags:{},packageLinks:[],featuredPackages:i},u=function(){var e=Object(r.a)(c.a.mark((function e(){var t;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!window.configOverride){e.next=2;break}return e.abrupt("return",window.configOverride);case 2:return e.next=4,fetch(o.a.CONFIG);case 4:if((t=e.sent).ok){e.next=8;break}return console.log("Failed to fetch application config, using default values"),e.abrupt("return",s);case 8:return e.abrupt("return",t.json().catch((function(e){return console.error(e),console.log("Invalid config response, using default values"),s})));case 9:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}()},140:function(e,t,n){"use strict";n.d(t,"a",(function(){return O}));var a=n(207),c=n(209),r=n(203),o=n(197),i=n(206),s=n(201),u=n(208),l=n(53),d=n(94),j=n(45),b=n(1),f="showing-dev-preview-banner",O=function(){var e,t=Object(r.a)({defaultIsOpen:JSON.parse(null!==(e=window.sessionStorage.getItem(f))&&void 0!==e?e:"true"),onClose:function(){return window.sessionStorage.setItem(f,"false")}}),n=t.isOpen,O=t.onClose;return Object(b.jsx)(o.a,{h:"max-content",children:Object(b.jsx)(i.a,{in:n,children:Object(b.jsxs)(d.a,{"aria-label":"Preview Banner",bg:"blue.500",border:"none",boxShadow:"none",color:"white",mt:4,mx:4,p:4,position:"relative",role:"alertdialog",children:[Object(b.jsx)(a.a,{h:5,left:4,position:"absolute",top:4,w:5}),Object(b.jsxs)(s.a,{fontSize:"md",mx:8,textAlign:"center",children:["This application is in Dev Preview. Some features may change. If you find any issues, please report them"," ",Object(b.jsx)(j.a,{color:"inherit",hasWarning:!1,href:"".concat(l.a,"/issues"),textDecoration:"underline",children:"here"})]}),Object(b.jsx)(u.a,{"aria-label":"Dismiss banner",colorScheme:"white",icon:Object(b.jsx)(c.a,{}),onClick:O,position:"absolute",right:4,size:"xs",top:3,variant:"ghost"})]})})})}},142:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(6),c=n(17),r=n(20),o=n(1),i=Object(c.a)((function(e,t){return Object(o.jsx)(r.a.form,Object(a.a)(Object(a.a)({},e),{},{ref:t}))}));i.displayName="Form"},143:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(5),c=n(0),r=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=Object(c.useState)(e),r=Object(a.a)(n,2),o=r[0],i=r[1],s=t.delay,u=void 0===s?250:s,l=t.onChange;return Object(c.useEffect)((function(){var t=setTimeout((function(){i(e),null===l||void 0===l||l(e)}),u);return function(){clearTimeout(t)}}),[e,u,l]),o}},144:function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var a=n(6),c=n(24),r=n(17),o=n(220),i=n(1),s=["name","onClick"],u=Object(r.a)((function(e,t){var n=e.name,r=e.onClick,u=Object(c.a)(e,s);return Object(i.jsx)(o.a,Object(a.a)(Object(a.a)({_hover:{cursor:"pointer"},alignItems:"center",display:"flex",fontSize:"md",lineHeight:"base",listStyleType:"none",minH:8,onClick:r,onKeyDown:function(e){["Enter"," "].includes(e.key)&&(e.preventDefault(),r())},px:4,ref:t,role:"option",sx:{":hover, :focus":{bg:"gray.100"}},tabIndex:0},u),{},{children:n}))}));u.displayName="SearchItem"},172:function(e,t,n){},179:function(e,t,n){"use strict";n.r(t);var a={};n.r(a),n.d(a,"initialize",(function(){return S})),n.d(a,"access",(function(){return T})),n.d(a,"checkForCookieConsent",(function(){return A})),n.d(a,"customizeCookies",(function(){return M})),n.d(a,"getConsentCookie",(function(){return I})),n.d(a,"hasConsent",(function(){return F}));var c,r,o=n(0),i=n.n(o),s=n(85),u=n.n(s),l=n(33),d=(n(172),n(150)),j=n(21),b=n(140),f=n(5),O=n(210),h=n(211),v=n(197),p=n(212),m=n(201),g=n(156),x=n(24),k=n(27),y=n.n(k),w=n(41),C=function(){new URLSearchParams(window.location.search).get("sb")},S=function(){var e=Object(w.a)(y.a.mark((function e(){return y.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e,t){window.addEventListener("load",Object(w.a)(y.a.mark((function a(){var r,o,i;return y.a.wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.prev=0,r={domain:window.location.hostname,language:navigator.language,__storeWriter:C()},a.next=4,n.e(13).then(n.t.bind(null,603,7));case 4:o=a.sent,i=o.AWSCShortbread,c=i(r),e(),a.next=13;break;case 10:a.prev=10,a.t0=a.catch(0),t(a.t0);case 13:case"end":return a.stop()}}),a,null,[[0,10]])}))))})));case 1:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),E=function(e){return function(){var t;if(!c)throw new Error("shortbread has not been initialized");return(t=c)[e].apply(t,arguments)}},T=E("access"),A=E("checkForCookieConsent"),M=E("customizeCookies"),I=E("getConsentCookie"),F=E("hasConsent"),z=n(1),D=S,P=Object(x.a)(a,["initialize"]),L=Object(o.createContext)({}),G=function(e){var t=e.children,n=Object(o.useState)(!1),a=Object(f.a)(n,2),c=a[0],r=a[1];return Object(o.useEffect)((function(){var e=!1;return D().then((function(){e||(P.checkForCookieConsent(),r(!0))})).catch((function(t){console.error(t),e||r(!1)})),function(){e=!0,r(!1)}}),[]),Object(z.jsx)(L.Provider,{value:c?P:{},children:t})},N=n(45),R=n(72),H=n(13),U={SERVICE_TERMS:{display:"AWS Service Terms",url:"https://aws.amazon.com/service-terms/",testId:"service-terms"},PRIVACY:{display:"Privacy",url:"https://aws.amazon.com/privacy/",testId:"privacy"},SITE_TERMS:{display:"Construct Hub Site Terms",url:H.c.SITE_TERMS,testId:"site-terms",isExternal:!1},LEGAL:{display:"Legal",url:"https://aws.amazon.com/legal/",testId:"legal"}},W=n(18),_=n(61),B=Object(_.a)("footer",["container","links","disclaimer","manageCookies"].concat(Object(W.a)(Object.values(U).map((function(e){return e.testId}))))),V=function(){var e=Object(o.useContext)(L).customizeCookies;return Object(z.jsxs)(O.a,{align:"center",as:"footer",bg:"blue.800",color:"white","data-testid":B.container,direction:"column",justify:"center",py:4,children:[Object(z.jsx)(h.a,{columnGap:6,columns:[1,2,4],"data-testid":B.links,children:Object.entries(U).map((function(e,t){var n=Object(f.a)(e,2),a=n[0],c=n[1],r=c.display,o=c.isExternal,i=void 0===o||o,s=c.testId,u=c.url;return Object(z.jsxs)(O.a,{align:"center",direction:{base:"column",md:"row"},children:[Object(z.jsx)(v.a,{display:{base:"none",md:0!==t?"initial":"none"},h:5,children:Object(z.jsx)(p.a,{borderColor:"white",mr:6,orientation:"vertical"})}),i?Object(z.jsx)(N.a,{color:"currentcolor","data-testid":B[s],hasWarning:!1,href:u,lineHeight:10,mx:"auto",children:r}):Object(z.jsx)(R.a,{color:"currentcolor","data-testid":B[s],lineHeight:10,mx:"auto",to:u,children:r}),Object(z.jsx)(v.a,{display:{base:"none",sm:t<2?"initial":"none",md:"none"},w:"100%",children:Object(z.jsx)(p.a,{borderColor:"white"})})]},a)}))}),Object(z.jsx)(m.a,{"data-testid":B.disclaimer,fontSize:"xs",mt:4,children:"2021 Amazon Web Services, Inc. All rights reserved."}),Object(z.jsx)(g.a,{color:"white","data-testid":B.manageCookies,fontSize:"xs",fontWeight:"normal",mt:4,onClick:e,variant:"link",children:"Manage Cookies"})]})},q=n(6),J=n(53),K=n(227),Q=["children"],Y=function(e){var t=e.children,n=Object(x.a)(e,Q);return Object(z.jsx)(K.a,Object(q.a)(Object(q.a)({colorScheme:"blue.800",strategy:"fixed"},n),{},{children:t}))},X=n(17),Z=["items"],$=function(e){var t=e.display,n=e.isNavLink,a=e.url;return n?Object(z.jsx)(R.a,{color:"blue.500",to:a,w:"100%",children:t}):Object(z.jsx)(N.a,{alignItems:"center",display:"flex",hasWarning:!1,href:a,justifyContent:"space-between",w:"100%",children:t})},ee=Object(X.a)((function(e,t){var n=e.items,a=Object(x.a)(e,Z);return Object(z.jsx)(K.f,Object(q.a)(Object(q.a)({},a),{},{ref:t,children:n.map((function(e,t){return"links"in e?Object(z.jsxs)(o.Fragment,{children:[Object(z.jsx)(K.d,{align:"left",title:e.display,children:e.links.map((function(e,t){return Object(z.jsx)(K.e,{children:Object(z.jsx)($,Object(q.a)({},e))},"".concat(e.display,"-").concat(t))}))}),t!==n.length-1&&Object(z.jsx)(K.c,{})]},"".concat(e.display,"-").concat(t)):Object(z.jsx)(K.e,{children:Object(z.jsx)($,Object(q.a)({},e))},"".concat(e.display,"-").concat(t))}))}))})),te=n(215),ne=["children"],ae=Object(X.a)((function(e,t){var n=e.children,a=Object(x.a)(e,ne);return Object(z.jsx)(K.b,Object(q.a)(Object(q.a)({as:g.a,color:"blue.800",fontWeight:"500",ref:t,rightIcon:Object(z.jsx)(te.a,{h:6,w:6}),size:"md",variant:"link"},a),{},{children:n}))})),ce=Object(_.a)("header",["container","title","gettingStartedTrigger","gettingStartedMenu","documentationTrigger","documentationMenu","navOpen","navClose","searchInput","searchIcon","mobileNav"]),re=function(){return Object(z.jsxs)(Y,{children:[Object(z.jsx)(ae,{"data-testid":ce.documentationTrigger,children:"Documentation"}),Object(z.jsx)(ee,{"data-testid":ce.documentationMenu,items:J.b})]})},oe=function(){return Object(z.jsxs)(Y,{children:[Object(z.jsx)(ae,{"data-testid":ce.gettingStartedTrigger,children:"Getting Started"}),Object(z.jsx)(ee,{"data-testid":ce.gettingStartedMenu,items:J.c})]})},ie=n(218),se=n(203),ue=n(208),le=n(74),de=n(232),je=n(46),be=n(235),fe=n(95),Oe=Object(_.a)("searchModal",["container"]),he=function(e){var t=e.isOpen,n=e.onClose,a=Object(fe.a)(),c=a.query,r=a.onQueryChange,o=a.onSubmit,i=a.onSearch;return Object(z.jsx)(de.a,{children:Object(z.jsx)(je.a,{isOpen:t,onClose:n,children:Object(z.jsx)(je.h,{children:Object(z.jsxs)(je.d,{"data-testid":Oe.container,children:[Object(z.jsx)(je.c,{}),Object(z.jsx)(je.g,{children:"Search"}),Object(z.jsx)(je.b,{children:Object(z.jsxs)(be.a,{pb:4,spacing:4,children:[Object(z.jsx)(le.a,{onChange:r,onSubmit:o,value:c}),Object(z.jsx)(g.a,{colorScheme:"blue",onClick:function(){return i()},children:"Find Constructs"})]})})]})})})})},ve=function(){var e=Object(se.a)();return Object(z.jsxs)(j.d,{children:[Object(z.jsx)(j.b,{exact:!0,path:[H.c.HOME,H.c.SEARCH]}),Object(z.jsxs)(j.b,{path:"*",children:[Object(z.jsx)(v.a,{"data-testid":ce.searchInput,display:{base:"none",md:"initial"},children:Object(z.jsxs)(le.a,{bg:"gray.50",children:[Object(z.jsx)(le.b,{}),Object(z.jsx)(le.c,{})]})}),Object(z.jsxs)(v.a,{display:{base:"initial",md:"none"},children:[Object(z.jsx)(ue.a,{"aria-label":"Search Icon",borderRadius:"md","data-testid":ce.searchIcon,icon:Object(z.jsx)(ie.a,{color:"gray.600"}),onClick:e.onOpen,variant:"ghost"}),Object(z.jsx)(he,Object(q.a)({},e))]})]})]})},pe=n(222),me=n(237),ge=n(236),xe=n(221),ke={color:"blue.500",py:2,w:"full"},ye=function(e){var t=e.display,n=e.isNavLink,a=e.url;return n?Object(z.jsx)(R.a,Object(q.a)(Object(q.a)({to:a},ke),{},{children:t})):Object(z.jsx)(N.a,Object(q.a)(Object(q.a)({alignItems:"center",display:"flex",hasWarning:!1,href:a,justifyContent:"space-between"},ke),{},{children:t}))},we=function(e){var t=e.title,n=e.items,a=e.testId;return Object(z.jsxs)(ge.d,{"data-testid":a,w:"full",children:[Object(z.jsxs)(ge.b,{px:0,py:4,children:[Object(z.jsx)(v.a,{flex:"1",textAlign:"left",children:Object(z.jsx)(xe.a,{as:"h3",size:"sm",children:t})}),Object(z.jsx)(ge.c,{})]}),Object(z.jsx)(ge.e,{p:0,w:"full",children:Object(z.jsx)(O.a,{direction:"column",w:"full",children:n.map((function(e,t){return"links"in e?Object(z.jsxs)(o.Fragment,{children:[Object(z.jsx)(xe.a,{as:"h4",borderBottom:"base",pb:2,pt:4,size:"xs",children:e.display}),e.links.map((function(e,t){return Object(o.createElement)(ye,Object(q.a)(Object(q.a)({},e),{},{key:"".concat(e.display,"-").concat(t)}))}))]},"".concat(e.display,"-").concat(t)):Object(o.createElement)(ye,Object(q.a)(Object(q.a)({},e),{},{key:"".concat(e.display,"-").concat(t)}))}))})})]})},Ce=function(e){var t=e.sections;return Object(z.jsx)(ge.a,{allowMultiple:!0,allowToggle:!0,defaultIndex:t.map((function(e,t){return t})),w:"full",children:t.map((function(e,t){return Object(z.jsx)(we,Object(q.a)({},e),"section-".concat(t))}))})},Se=function(){return Object(z.jsx)(xe.a,{as:"h1",color:"blue.800","data-testid":ce.title,size:"lg",children:Object(z.jsxs)(l.b,{to:"/",children:[Object(z.jsx)(v.a,{as:"span",color:"blue.500",children:"Construct"})," ","Hub"]})})},Ee=function(e){var t=e.isOpen,n=e.onClose;return Object(z.jsx)(de.a,{children:Object(z.jsxs)(me.a,{isOpen:t,onClose:n,placement:"left",size:"xs",children:[Object(z.jsx)(je.h,{}),Object(z.jsxs)(me.b,{"data-testid":ce.mobileNav,children:[Object(z.jsx)(je.c,{}),Object(z.jsx)(je.g,{display:"flex",justifyContent:"start",children:Object(z.jsx)(Se,{})}),Object(z.jsx)(je.b,{children:Object(z.jsx)(be.a,{align:"start",justify:"start",spacing:4,children:Object(z.jsx)(Ce,{sections:[{title:"Getting Started",items:J.c,testId:ce.gettingStartedMenu},{title:"Documentation",items:J.b,testId:ce.documentationMenu}]})})})]})]})})},Te=function(){var e=Object(se.a)();return Object(z.jsxs)(z.Fragment,{children:[Object(z.jsx)(ue.a,{"aria-label":"Navigation Menu",borderRadius:"md","data-testid":ce.navOpen,display:{md:"none"},icon:Object(z.jsx)(pe.a,{}),onClick:e.onOpen,variant:"ghost"}),Object(z.jsx)(Ee,Object(q.a)({},e))]})},Ae=function(e){return Object(z.jsx)(d.b,Object(q.a)({align:"center",justify:"center",rowStart:1},e))},Me=function(){return Object(z.jsxs)(d.a,{alignItems:"center",as:"header",bg:"white",boxShadow:"base","data-testid":ce.container,gap:6,gridTemplateColumns:{base:"1fr max-content 1fr",md:"max-content minmax(12rem, 31rem) auto"},gridTemplateRows:"1fr",maxW:"100vw",position:"sticky",px:4,py:4,top:0,w:"100%",zIndex:"sticky",children:[Object(z.jsx)(Ae,{colStart:{base:2,md:1},justifySelf:{base:"center",md:"start"},children:Object(z.jsx)(Se,{})}),Object(z.jsx)(Ae,{colStart:{base:3,md:2},justifySelf:{base:"end",md:"stretch"},children:Object(z.jsx)(ve,{})}),Object(z.jsxs)(Ae,{colStart:{base:1,md:3},justifySelf:{base:"start",md:"end"},children:[Object(z.jsxs)(d.a,{display:{base:"none",md:"grid"},gap:4,gridTemplateColumns:"1fr 1fr",gridTemplateRows:"1fr",placeItems:"center",w:"100%",children:[Object(z.jsx)(v.a,{children:Object(z.jsx)(oe,{})}),Object(z.jsx)(v.a,{children:Object(z.jsx)(re,{})})]}),Object(z.jsx)(Te,{})]})]})},Ie=n(75),Fe=["component"],ze=function(e){var t=e.component,n=Object(x.a)(e,Fe);return Object(z.jsx)(j.b,Object(q.a)(Object(q.a)({},n),{},{children:Object(z.jsx)(o.Suspense,{fallback:Object(z.jsx)(Ie.a,{}),children:Object(z.jsx)(t,{})})}))},De=Object(o.lazy)((function(){return Promise.all([n.e(0),n.e(10)]).then(n.bind(null,610))})),Pe=Object(o.lazy)((function(){return Promise.all([n.e(0),n.e(1),n.e(7)]).then(n.bind(null,608))})),Le=Object(o.lazy)((function(){return Promise.all([n.e(0),n.e(11)]).then(n.bind(null,289))})),Ge=Object(o.lazy)((function(){return Promise.all([n.e(0),n.e(1),n.e(4),n.e(6)]).then(n.bind(null,605))})),Ne=Object(o.lazy)((function(){return Promise.all([n.e(0),n.e(1),n.e(9),n.e(8)]).then(n.bind(null,607))})),Re=Object(o.lazy)((function(){return Promise.all([n.e(0),n.e(12)]).then(n.bind(null,611))})),He=function(){var e="/"!==Object(j.h)().pathname;return Object(z.jsxs)(d.a,{as:"main",bg:"bgPrimary",gridTemplateColumns:"1fr",gridTemplateRows:"auto auto 1fr auto",h:"100%",maxW:"100%",minH:"100vh",children:[Object(z.jsx)(Me,{}),e?Object(z.jsx)(b.a,{}):Object(z.jsx)("div",{}),Object(z.jsxs)(j.d,{children:[Object(z.jsx)(ze,{component:De,exact:!0,path:H.c.FAQ}),Object(z.jsx)(ze,{component:Pe,exact:!0,path:H.c.HOME}),Object(z.jsx)(ze,{component:Re,exact:!0,path:H.c.SITE_TERMS}),Object(z.jsx)(ze,{component:Ge,path:H.c.PACKAGES}),Object(z.jsx)(ze,{component:Ne,exact:!0,path:H.c.SEARCH}),Object(z.jsx)(ze,{component:Le,path:"*"})]}),Object(z.jsx)(V,{})]})},Ue=n(121),We=n(73),_e=n(90),Be=n(107),Ve=n(93),qe=n(89),Je=n(228),Ke=n(223),Qe=n(103),Ye=Qe.theme.components.Code,Xe=Object(q.a)(Object(q.a)({},Ye),{},{variants:Object(q.a)(Object(q.a)({},Ye.variants),{},{"code-block":Object(q.a)(Object(q.a)({},Ye.variants.subtle),{},{display:"block",whiteSpace:"pre"})})}),Ze={defaultProps:{borderColor:"rgba(0, 124, 253, 0.15)"}},$e=n(4),et=n(225),tt=function(e,t){return function(n){var a="function"===typeof e?e(n):e;return Object(q.a)(Object(q.a)({},a),{},{container:Object(q.a)(Object(q.a)({},a.container),t)})}},nt=Qe.theme.components.Tag,at=function(e){var t=e.reduce((function(e,t){var n=t.keyword;return(null===n||void 0===n?void 0:n.color)?Object(q.a)(Object(q.a)({},e),{},Object($e.a)({},n.color,tt(nt.variants.subtle,{background:Object(et.e)(n.color,.1),color:n.color}))):e}),{});return Object(q.a)(Object(q.a)({},nt),{},{baseStyle:{container:{fontWeight:"normal"}},variants:Object(q.a)(Object(q.a)({},nt.variants),{},{subtle:tt(nt.variants.subtle,{background:"#F2F2F2",color:"blue.800"})},t)})},ct=function(e){return Object(q.a)(Object(q.a)({},Qe.theme.components),{},{Code:Xe,Divider:Ze,Tag:at(e.Tag)})},rt={borders:{base:"1px solid rgba(0, 124, 253, 0.15)"},colors:Object(q.a)(Object(q.a)({},Qe.theme.colors),{},{blue:{50:"#dcf3ff",100:"#aed9ff",200:"#7dbeff",300:"#4aa4ff",400:"#1a8aff",500:"#0070e6",600:"#0057b4",700:"#003e82",800:"#002551",900:"#000d21"},bgPrimary:"#F8F8F8"}),radii:{card:"0.75rem"},sizes:{container:{"2xl":"120rem"}},shadows:{base:"0px 4px 15px rgba(40, 132, 178, 0.15)"}},ot=function(e){var t,n={Tag:null!==(t=e.packageTags)&&void 0!==t?t:[]};return Object(Ke.a)(Object(q.a)(Object(q.a)({},rt),{},{components:ct(n)}))},it=function(e){var t=e.children,n=Object(_e.b)(),a=n.loading,c=n.data;return a?Object(z.jsx)(Ie.a,{}):Object(z.jsx)(Je.a,{resetCSS:!0,theme:ot(c),children:t})};Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));u.a.render(Object(z.jsx)(i.a.StrictMode,{children:Object(z.jsx)(l.a,{children:Object(z.jsx)(G,{children:Object(z.jsx)(Ue.a,{children:Object(z.jsx)(_e.a,{children:Object(z.jsx)(We.a,{children:Object(z.jsx)(qe.a,{children:Object(z.jsx)(Ve.a,{children:Object(z.jsx)(it,{children:Object(z.jsx)(Be.a,{children:Object(z.jsx)(He,{})})})})})})})})})})}),document.getElementById("root")),r&&r instanceof Function&&n.e(14).then(n.bind(null,604)).then((function(e){var t=e.getCLS,n=e.getFID,a=e.getFCP,c=e.getLCP,o=e.getTTFB;t(r),n(r),a(r),c(r),o(r)}),(function(){})),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))},45:function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var a=n(6),c=n(24),r=n(204),o=n(17),i=n(205),s=n(107),u=n(1),l=["children","hasIcon","hasWarning","href","onClick","noFollow"],d=Object(o.a)((function(e,t){var n=e.children,o=e.hasIcon,d=void 0===o||o,j=e.hasWarning,b=void 0===j||j,f=e.href,O=e.onClick,h=e.noFollow,v=Object(c.a)(e,l),p=Object(s.b)(),m="noopener noreferrer";return(b||h)&&(m+=" nofollow"),Object(u.jsxs)(i.a,Object(a.a)(Object(a.a)({color:"blue.500",href:f,isExternal:!0,onClick:b?p({href:f,onClick:O}):O,ref:t,rel:m},v),{},{children:[n," ",d&&Object(u.jsx)(r.a,{mb:1,ml:2})]}))}));d.displayName="ExternalLink"},53:function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return c})),n.d(t,"b",(function(){return r}));var a="https://github.com/cdklabs/construct-hub",c=[{display:"FAQ",isNavLink:!0,url:"/faq"},{display:"Construct Hub on GitHub",url:a},{display:"Issues on GitHub",url:"".concat(a,"/issues")}],r=[{display:"AWS CDK",links:[{display:"Home",url:"https://aws.amazon.com/cdk/"},{display:"Getting Started",url:"https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html"},{display:"Workshop",url:"https://cdkworkshop.com/"},{display:"Best Practices",url:"https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk"}]},{display:"CDK for Terraform",links:[{display:"Getting Started",url:"https://learn.hashicorp.com/tutorials/terraform/cdktf"},{display:"Tutorials",url:"https://learn.hashicorp.com/collections/terraform/cdktf"}]},{display:"CDK for Kubernetes",links:[{display:"Home",url:"https://cdk8s.io"},{display:"Getting Started",url:"https://cdk8s.io/docs/latest/getting-started"},{display:"Documentation",url:"https://cdk8s.io/docs/latest"},{display:"API Reference",url:"https://cdk8s.io/docs/latest/reference/index.html"}]},{display:"Community",links:[{display:"Slack",url:"https://join.slack.com/t/cdk-dev/shared_invite/zt-mso6p56d-qJp7SOTBvMaQuDrx7R2wHg"},{display:"Community Hub",url:"https://cdk.dev"}]}]},54:function(e,t,n){"use strict";var a;n.d(t,"a",(function(){return a})),function(e){e.NameAsc="asc",e.NameDesc="desc",e.PublishDateAsc="oldest",e.PublishDateDesc="newest",e.DownloadsAsc="downloadsAsc",e.DownloadsDesc="downloadsDesc"}(a||(a={}))},61:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var a=function(e,t){return t.reduce((function(t,n){return t[n]="".concat(e,"-").concat(n),t}),{})}},65:function(e,t,n){"use strict";n.d(t,"c",(function(){return r})),n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return s}));var a,c,r,o=n(4);!function(e){e.awscdk="aws-cdk",e.cdktf="cdktf",e.cdk8s="cdk8s"}(r||(r={}));var i=(a={},Object(o.a)(a,r.awscdk,"AWS CDK"),Object(o.a)(a,r.cdktf,"CDKtf"),Object(o.a)(a,r.cdk8s,"CDK8s"),a),s=(c={},Object(o.a)(c,r.awscdk,{name:i[r.awscdk],imgsrc:"/assets/awscdk-icon.png"}),Object(o.a)(c,r.cdk8s,{name:i[r.cdk8s],imgsrc:"/assets/cdk8s-icon.png"}),Object(o.a)(c,r.cdktf,{name:i[r.cdktf],imgsrc:"/assets/cdktf-icon.png"}),c)},70:function(e,t,n){"use strict";n.d(t,"b",(function(){return l})),n.d(t,"a",(function(){return d}));var a,c=n(4),r=n(110),o=n(54),i=function(e){return function(t,n){var a=new Date(t.metadata.date),c=new Date(n.metadata.date);return a===c?0:e?c<a?1:-1:a<c?1:-1}},s=function(e){return function(t,n){return t.name.localeCompare(n.name)*(e?1:-1)}},u=function(e){return function(t,n){return t.downloads!==n.downloads?(t.downloads-n.downloads)*(e?1:-1):s(!e)(t,n)}},l=(a={},Object(c.a)(a,o.a.NameAsc,s(!0)),Object(c.a)(a,o.a.NameDesc,s(!1)),Object(c.a)(a,o.a.PublishDateAsc,i(!0)),Object(c.a)(a,o.a.PublishDateDesc,i(!1)),Object(c.a)(a,o.a.DownloadsAsc,u(!0)),Object(c.a)(a,o.a.DownloadsDesc,u(!1)),a),d={cdkType:function(e){if(e)return function(t){var n,a;return(null===(n=t.metadata)||void 0===n||null===(a=n.constructFramework)||void 0===a?void 0:a.name)===e}},cdkMajor:function(e){if("number"===typeof e)return function(t){var n,a;return(null===(n=t.metadata)||void 0===n||null===(a=n.constructFramework)||void 0===a?void 0:a.majorVersion)===e}},language:function(e){if(e&&e!==r.d.TypeScript)return function(t){var n;return void 0!==(null===(n=t.languages)||void 0===n?void 0:n[e])}},languages:function(e){var t,n=(null!==(t=null===e||void 0===e?void 0:e.length)&&void 0!==t?t:0)>0?new Set(e):void 0;if(n&&!n.has(r.d.TypeScript))return function(e){var t;return Object.keys(null!==(t=e.languages)&&void 0!==t?t:{}).some((function(e){return n.has(e)}))}},tags:function(e){if(e&&e.length)return function(t){var n,a,c;return null!==(n=null===(a=t.metadata)||void 0===a||null===(c=a.packageTags)||void 0===c?void 0:c.some((function(t){return e.includes(t.id)})))&&void 0!==n&&n}}}},72:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(6),c=n(205),r=n(33),o=n(1),i=function(e){return Object(o.jsx)(c.a,Object(a.a)({as:r.b},e))}},73:function(e,t,n){"use strict";n.d(t,"b",(function(){return b})),n.d(t,"a",(function(){return f}));var a=n(5),c=n(0),r=n(27),o=n.n(r),i=n(41),s=n(13),u=function(){var e=Object(i.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(s.a.CATALOG_SUFFIX);case 2:if((t=e.sent).ok){e.next=6;break}throw console.error(t.statusText),new Error("Failed fetching packages index: ".concat(t.statusText));case 6:return e.abrupt("return",t.json());case 7:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),l=n(76),d=n(1),j=Object(c.createContext)({loading:!1,data:void 0,error:void 0}),b=function(){return Object(c.useContext)(j)},f=function(e){var t=e.children,n=Object(l.a)(u),r=Object(a.a)(n,2),o=r[0],i=r[1];return Object(c.useEffect)((function(){o()}),[o]),Object(d.jsx)(j.Provider,{value:i,children:t})}},74:function(e,t,n){"use strict";n.d(t,"a",(function(){return x})),n.d(t,"b",(function(){return w})),n.d(t,"c",(function(){return L}));var a=n(6),c=n(24),r=n(218),o=n(203),i=n(216),s=n(217),u=n(233),l=n(156),d=n(0),j=n(73),b=n(95),f=n(142),O=n(61),h=Object(O.a)("searchBar",["input","searchIcon","searchButton","overlay","suggestionsList","suggestion"]),v=n(1),p=["children","hasButton","onSubmit","value","onChange"],m=Object(d.createContext)(void 0),g=function(){var e=Object(d.useContext)(m);if(!e)throw new Error("This component must be a child of a <SearchBar />");return e},x=function(e){var t,n,O,g=e.children,x=e.hasButton,k=e.onSubmit,y=e.value,w=e.onChange,C=Object(c.a)(e,p),S=Object(o.a)(),E=Object(d.useRef)(null),T=Object(b.a)(),A=Object(j.b)(),M=100*Math.round((null!==(t=null===A||void 0===A||null===(n=A.data)||void 0===n||null===(O=n.packages)||void 0===O?void 0:O.length)&&void 0!==t?t:0)/100),I="Search ".concat(M>0?"".concat(M,"+ "):"","construct libraries");return Object(d.useEffect)((function(){var e=function(e){E.current&&e.target&&(E.current.contains(e.target)||S.onClose())},t=function(e){var t,n;"Escape"===e.key&&(null===(t=E.current)||void 0===t||null===(n=t.blur)||void 0===n||n.call(t),S.onClose())};return window.addEventListener("keyup",t),window.addEventListener("click",e),function(){window.removeEventListener("keyup",t),window.removeEventListener("click",e)}}),[]),Object(v.jsx)(m.Provider,{value:{query:null!==y&&void 0!==y?y:T.query,isOpen:S.isOpen},children:Object(v.jsxs)(f.a,{color:"initial",onSubmit:null!==k&&void 0!==k?k:T.onSubmit,pos:"relative",children:[Object(v.jsxs)(i.a,{pos:"relative",zIndex:S.isOpen?3:"initial",children:[x&&Object(v.jsx)(s.a,{children:Object(v.jsx)(r.a,{"data-testid":h.searchIcon})}),Object(v.jsx)(u.a,Object(a.a)({_focus:{boxShadow:"base",borderColor:"inherit"},bg:"white",boxShadow:S.isOpen?"base":"none","data-testid":h.input,onChange:null!==w&&void 0!==w?w:T.onQueryChange,onFocus:S.onOpen,placeholder:I,ref:E,value:null!==y&&void 0!==y?y:T.query},C)),x?Object(v.jsx)(s.b,{display:{base:"none",md:"initial"},w:"9rem",children:Object(v.jsx)(l.a,{borderLeftRadius:"0",colorScheme:"blue","data-testid":h.searchButton,type:"submit",children:"Find Constructs"})}):Object(v.jsx)(s.b,{children:Object(v.jsx)(r.a,{"data-testid":h.searchIcon})})]}),g]})})},k=n(17),y=n(197),w=Object(k.a)((function(e,t){var n=g().isOpen;return Object(v.jsx)(y.a,Object(a.a)({bg:"gray.700","data-testid":h.overlay,display:n?"initial":"none",inset:"0",opacity:"0.5",pos:"fixed",ref:t,zIndex:"1"},e))})),C=n(220),S=n(212),E=n(235),T=n(201),A=n(21),M=n(128),I=n(143),F=n(88),z=n(94),D=n(123),P=n(144),L=Object(k.a)((function(e,t){var n=g(),c=n.query,r=n.isOpen,o=Object(I.a)(c),i=Object(A.g)().push,s=Object(M.a)({limit:5,offset:0,query:o}).page;return!r||s.length<1||!o?null:Object(v.jsx)(z.a,Object(a.a)(Object(a.a)({as:C.c,"data-testid":h.suggestionsList,left:0,ml:0,pos:"absolute",pt:10,px:0,ref:t,right:0,top:0,zIndex:2},e),{},{children:s.map((function(e,t){var n,c,r=null!==(n=null===(c=e.metadata)||void 0===c?void 0:c.constructFramework)&&void 0!==n?n:{},o=Boolean(r.name);return Object(v.jsxs)(v.Fragment,{children:[t>0&&Object(v.jsx)(S.a,{mx:4,w:"auto"}),Object(v.jsx)(P.a,{"data-testid":h.suggestion,name:Object(v.jsxs)(E.a,{align:"center",direction:"row",spacing:4,children:[Object(v.jsx)(D.a,Object(a.a)({},r)),Object(v.jsx)(T.a,{ml:o?0:9,children:e.name})]}),onClick:function(){return i(Object(F.a)(e))},py:2,textAlign:"left"},e.id)]})}))}))}))},75:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var a=n(219),c=n(202),r=n(1),o=function(){return Object(r.jsx)(a.a,{children:Object(r.jsx)(c.a,{size:"xl"})})}},76:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(27),c=n.n(a),r=n(41),o=n(5),i=n(0),s=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.initialValue,a=t.onSuccess,s=t.onError,u=Object(i.useState)(!1),l=Object(o.a)(u,2),d=l[0],j=l[1],b=Object(i.useState)(n),f=Object(o.a)(b,2),O=f[0],h=f[1],v=Object(i.useState)(),p=Object(o.a)(v,2),m=p[0],g=p[1],x=Object(i.useRef)(!1);Object(i.useEffect)((function(){return x.current=!0,function(){x.current=!1}}),[]);var k=Object(i.useCallback)(Object(r.a)(c.a.mark((function t(){var r,o=arguments;return c.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(x.current){t.next=2;break}return t.abrupt("return");case 2:return j(!0),g(void 0),t.prev=4,t.next=7,e.apply(void 0,o);case 7:r=t.sent,null===a||void 0===a||a(r),x.current&&(h(r),j(!1)),t.next=17;break;case 12:t.prev=12,t.t0=t.catch(4),console.error(t.t0),null===s||void 0===s||s(t.t0),x.current&&(h(n),g(t.t0),j(!1));case 17:case"end":return t.stop()}}),t,null,[[4,12]])}))),[s,a]);return Object(i.useMemo)((function(){return[k,{data:O,loading:d,error:m}]}),[k,O,d,m])}},88:function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"c",(function(){return u})),n.d(t,"a",(function(){return l}));var a=n(4),c=n(5),r=n(13),o=new RegExp(/git@github\.com:([a-zA-Z-]+)+\/?([a-zA-Z-]+)*(\.git)?/),i=function(e){try{var t=e,n=e.match(o);if(n){var a=Object(c.a)(n,3),r=a[1],i=a[2];t="https://github.com/".concat(r,"/").concat(i)}return{hostname:new URL(t).hostname,url:t}}catch(s){return}},s=function(e,t){var n=e;if(t){var a=function(e,t){var n=new URLSearchParams(t);return Object.entries(e).filter((function(e){return null!=Object(c.a)(e,2)[1]})).forEach((function(e){var t=Object(c.a)(e,2),a=t[0],r=t[1];n.set(a,"".concat(r))})),n.toString()}(t);a&&(n+="?".concat(a))}return n},u=function(e){var t,n=e.cdkMajor,c=e.cdkType,o=e.query,i=e.offset,u=e.language,l=e.languages,d=e.sort,j=e.tags;return s(r.c.SEARCH,(t={},Object(a.a)(t,r.b.SEARCH_QUERY,o),Object(a.a)(t,r.b.CDK_TYPE,c),Object(a.a)(t,r.b.CDK_MAJOR,n),Object(a.a)(t,r.b.LANGUAGE,u),Object(a.a)(t,r.b.LANGUAGES,(null===l||void 0===l?void 0:l.length)?l.join(","):null),Object(a.a)(t,r.b.SORT,d),Object(a.a)(t,r.b.OFFSET,null!==i&&void 0!==i?i:0),Object(a.a)(t,r.b.TAGS,(null===j||void 0===j?void 0:j.length)?j.join(","):null),t))},l=function(e){var t,n=e.name,c=e.version,o=e.language,i=e.submodule;return s("".concat(r.c.PACKAGES,"/").concat(n,"/v/").concat(c),(t={},Object(a.a)(t,r.b.SUBMODULE,i),Object(a.a)(t,r.b.LANGUAGE,o),t))}},89:function(e,t,n){"use strict";n.d(t,"b",(function(){return f})),n.d(t,"a",(function(){return O}));var a=n(5),c=n(0),r=n(27),o=n.n(r),i=n(41),s=n(13),u={packages:{},updated:"NOT_FOUND"},l=function(){var e=Object(i.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch(s.a.STATS);case 2:if((t=e.sent).ok){e.next=6;break}return console.error("Could not retrieve package stats. Using empty stats."),e.abrupt("return",u);case 6:return e.abrupt("return",t.json().catch((function(e){return console.error(e),console.error("Error in package stats response. Using empty stats."),u})));case 7:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),d=n(76),j=n(1),b=Object(c.createContext)({loading:!1,data:void 0,error:void 0}),f=function(){return Object(c.useContext)(b)},O=function(e){var t=e.children,n=Object(d.a)(l),r=Object(a.a)(n,2),o=r[0],i=r[1];return Object(c.useEffect)((function(){o()}),[o]),Object(j.jsx)(b.Provider,{value:i,children:t})}},90:function(e,t,n){"use strict";n.d(t,"a",(function(){return j})),n.d(t,"b",(function(){return d}));var a=n(6),c=n(5),r=n(0),o=n(138),i=n(76),s=n(1),u=Object(r.createContext)({loading:!1,data:void 0,error:void 0}),l="construct-hub-config",d=function(){return Object(r.useContext)(u)},j=function(e){var t=e.children,n=Object(r.useState)((function(){try{var e=localStorage.getItem(l);return e?JSON.parse(e):void 0}catch(t){console.error(t)}})),d=Object(c.a)(n,2),j=d[0],b=d[1],f=Object(i.a)(o.b,{onSuccess:function(e){b(e);try{localStorage.setItem(l,JSON.stringify(e))}catch(t){console.error(t)}}}),O=Object(c.a)(f,2),h=O[0],v=O[1];return Object(r.useEffect)((function(){h()}),[]),Object(s.jsx)(u.Provider,{value:Object(a.a)(Object(a.a)({},v),{},{data:j}),children:t})}},93:function(e,t,n){"use strict";n.d(t,"b",(function(){return x})),n.d(t,"a",(function(){return k}));var a=n(0),c=n(4),r=n(5),o=n(18),i=n(6),s=n(67),u=n(77),l=n(152),d=n.n(l),j=n(65),b=n(54),f=n(70),O=function(){function e(t,n){Object(s.a)(this,e),this.map=void 0,this.index=void 0,this.constructFrameworks=void 0;var a=t.reduce((function(e,t){var a,c,r,o=t.name,s=[o,t.version].join("@"),u=null!==(a=null===(c=n.packages[o])||void 0===c||null===(r=c.downloads)||void 0===r?void 0:r.npm)&&void 0!==a?a:0;return e.set(s,Object(i.a)(Object(i.a)({},t),{},{downloads:u,id:s})),e}),new Map);this.map=this.sort(a,b.a.PublishDateDesc),this.constructFrameworks=this.detectConstructFrameworks(),this.index=d()((function(){var e=this;this.ref("id"),this.field("name"),this.field("scope"),this.field("packageName"),this.field("description"),this.field("authorName"),this.field("authorEmail"),Object(o.a)(a.values()).forEach((function(t){var n=t.author,a=t.name.split("/"),c=Object(r.a)(a,2),o=c[0],i=c[1];o&&i&&(t.scope=o,t.packageName=i),"string"===typeof n&&(t.authorName=n),(null===n||void 0===n?void 0:n.name)&&(t.authorName=n.name),(null===n||void 0===n?void 0:n.email)&&(t.authorEmail=n.email),e.add(t)}))}))}return Object(u.a)(e,[{key:"search",value:function(e){var t=null!==e&&void 0!==e?e:{},n=t.query,a=t.filters,c=t.sort,r=n?this.query(n):new Map(this.map);return a&&(r=this.filter(r,a)),c&&(r=this.sort(r,c)),r}},{key:"query",value:function(e){var t=this,n=[];try{n=this.index.search(e)}catch(a){console.error(a)}return n.reduce((function(e,n){var a=n.ref,c=t.map.get(a);return c&&e.set(a,c),e}),new Map)}},{key:"filter",value:function(e,t){var n=t.cdkType,a=t.cdkMajor,c=t.language,r=t.languages,o=t.tags,i=new Map(e),s=[f.a.cdkType(n),f.a.cdkMajor(n?a:void 0),f.a.language(c),f.a.languages(r),f.a.tags(o)].filter(Boolean);return i.forEach((function(e){var t=!1;s.forEach((function(n){t||n(e)||(t=!0)})),t&&i.delete(e.id)})),i}},{key:"sort",value:function(e,t){return t?new Map(Object(o.a)(e.entries()).sort((function(e,n){var a=Object(r.a)(e,2)[1],c=Object(r.a)(n,2)[1];return f.b[t](a,c)}))):e}},{key:"detectConstructFrameworks",value:function(){var e;return Object(o.a)(this.map.values()).reduce((function(e,t){var n,a,c=t.metadata,r=null===c||void 0===c||null===(n=c.constructFramework)||void 0===n?void 0:n.name,o=null===c||void 0===c||null===(a=c.constructFramework)||void 0===a?void 0:a.majorVersion;if(r){var i=e[r];void 0===o||i.majorVersions.includes(o)||i.majorVersions.push(o),i.pkgCount+=1}return e}),(e={},Object(c.a)(e,j.c.awscdk,{majorVersions:[],pkgCount:0}),Object(c.a)(e,j.c.cdk8s,{majorVersions:[],pkgCount:0}),Object(c.a)(e,j.c.cdktf,{majorVersions:[],pkgCount:0}),e))}}]),e}(),h=n(75),v=n(73),p=n(89),m=n(1),g=Object(a.createContext)(void 0),x=function(){return Object(a.useContext)(g)},k=function(e){var t=e.children,n=Object(v.b)(),c=n.data,r=n.loading,o=Object(p.b)(),i=o.data,s=o.loading,u=Object(a.useMemo)((function(){if(void 0!==(null===c||void 0===c?void 0:c.packages)&&!r&&(void 0!==i&&!s))return new O(c.packages,i)}),[c,r,i,s]);return u?Object(m.jsx)(g.Provider,{value:u,children:t}):Object(m.jsx)(h.a,{})}},94:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(6),c=n(17),r=n(197),o=n(1),i=Object(c.a)((function(e,t){return Object(o.jsx)(r.a,Object(a.a)({bg:"white",border:"base",borderRadius:"card",boxShadow:"base",p:2,ref:t},e))}));i.displayName="Card"},95:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(5),c=n(0),r=n(21),o=n(88),i=function(){var e,t,n,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},s=Object(c.useState)(null!==(e=i.defaultQuery)&&void 0!==e?e:""),u=Object(a.a)(s,2),l=u[0],d=u[1],j=Object(c.useState)(i.defaultCdkType),b=Object(a.a)(j,2),f=b[0],O=b[1],h=Object(c.useState)(i.defaultCdkMajor),v=Object(a.a)(h,2),p=v[0],m=v[1],g=Object(c.useState)(null!==(t=i.defaultLanguages)&&void 0!==t?t:[]),x=Object(a.a)(g,2),k=x[0],y=x[1],w=Object(c.useState)(null!==(n=i.defaultTags)&&void 0!==n?n:[]),C=Object(a.a)(w,2),S=C[0],E=C[1],T=Object(c.useState)(i.defaultLanguage),A=Object(a.a)(T,2),M=A[0],I=A[1],F=Object(c.useState)(i.defaultSort),z=Object(a.a)(F,2),D=z[0],P=z[1],L=Object(r.g)(),G=L.push,N=L.replace,R=function(e){e.preventDefault(),d(e.target.value)},H=Object(c.useCallback)((function(e){((null===e||void 0===e?void 0:e.replace)?N:G)(Object(o.c)({cdkType:f,cdkMajor:p,language:M,languages:k,query:l,sort:D,tags:S}))}),[f,p,M,k,G,l,N,D,S]),U=Object(c.useCallback)((function(e){null===e||void 0===e||e.preventDefault(),H()}),[H]);return Object(c.useMemo)((function(){return{cdkMajor:p,cdkType:f,language:M,languages:k,onLanguageChange:I,onQueryChange:R,onSearch:H,onSubmit:U,query:l,setCdkMajor:m,setCdkType:O,setLanguage:I,setLanguages:y,setTags:E,setQuery:d,setSort:P,sort:D,tags:S}}),[p,f,M,k,H,U,l,D,S])}}},[[179,3,5]]]);
2
+ //# sourceMappingURL=main.ca806cb8.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["contexts/ExternalLinkWarning/constants.ts","contexts/ExternalLinkWarning/ExternalLinkWarningModal.tsx","contexts/ExternalLinkWarning/ExternalLinkWarning.tsx","constants/languages.ts","icons/TSIcon.tsx","icons/PythonIcon.tsx","icons/JavaIcon.tsx","icons/GoIcon.tsx","icons/DotNetIcon.tsx","contexts/Analytics/Analytics.tsx","contexts/Analytics/usePageView.ts","components/CDKType/CDKType.tsx","hooks/usePagination/usePagination.ts","hooks/useCatalogResults/useCatalogResults.ts","hooks/useSearch/useSearch.ts","constants/url.ts","api/config/index.ts","components/DevPreviewBanner/DevPreviewBanner.tsx","components/Form/Form.tsx","hooks/useDebounce/useDebounce.ts","components/SearchItem/SearchItem.tsx","lib/shortbread/shortbread.ts","reportWebVitals.ts","lib/shortbread/getLocalStoreWriter.ts","contexts/Shortbread/Shortbread.tsx","components/Footer/constants.ts","components/Footer/testIds.ts","components/Footer/Footer.tsx","components/NavPopover/NavPopover.tsx","components/NavPopover/NavPopoverContent.tsx","components/NavPopover/NavPopoverTrigger.tsx","components/Header/testIds.ts","components/Header/DocumentationDropdown.tsx","components/Header/GettingStartedDropdown.tsx","components/SearchModal/testIds.ts","components/SearchModal/SearchModal.tsx","components/Header/HeaderSearch.tsx","components/Header/MobileNavLinks.tsx","components/Header/Title.tsx","components/Header/MobileNav.tsx","components/Header/NavButton.tsx","components/Header/Header.tsx","components/LazyRoute/LazyRoute.tsx","App.tsx","theme/components/Code.ts","theme/components/Divider.ts","theme/components/Tag.ts","theme/components/index.ts","theme/foundations/index.ts","theme/foundations/borders.ts","theme/foundations/colors.ts","theme/foundations/radius.ts","theme/foundations/sizes.ts","theme/foundations/shadows.ts","theme/index.ts","contexts/Theme.tsx","register-service-worker.ts","index.tsx","components/ExternalLink/ExternalLink.tsx","constants/links.ts","api/catalog-search/constants.ts","util/createTestIds.ts","constants/constructs.ts","api/catalog-search/util.ts","components/NavLink/NavLink.tsx","api/package/packages.ts","contexts/Catalog/Catalog.tsx","components/SearchBar/testIds.ts","components/SearchBar/SearchBar.tsx","components/SearchBar/SearchOverlay.tsx","components/SearchBar/SearchSuggestions.tsx","components/PageLoader/PageLoader.tsx","hooks/useRequest/useRequest.ts","util/url.ts","api/stats/index.ts","contexts/Stats/Stats.tsx","contexts/Config/Config.tsx","api/catalog-search/catalog-search.ts","contexts/Search/Search.tsx","components/Card/Card.tsx","hooks/useCatalogSearch/useCatalogSearch.ts"],"names":["PREFERS_WARN_ON_EXTERNAL_LINK_CLICK","ExternalLinkWarningModal","href","isOpen","onClick","onClose","setShouldWarn","useState","finalShouldWarn","setFinalShouldWarn","closeOnOverlayClick","color","fontSize","mb","bg","borderRadius","p","onChange","e","shouldWarn","target","checked","variant","hasArrow","label","placement","hasIcon","hasWarning","noFollow","localStorage","setItem","JSON","stringify","colorScheme","ml","rightIcon","ExternalLink","tabIndex","ExternalLinkWarningContext","createContext","useExternalLinkWarning","useContext","ExternalLinkWarningProvider","children","modalOption","setModalOptions","useDisclosure","onOpen","saved","getItem","parse","withPrompt","useCallback","preventDefault","Provider","value","Language","languageFilename","TypeScript","Python","Go","Java","DotNet","LANGUAGES","LANGUAGE_NAME_MAP","TEMP_SUPPORTED_LANGUAGES","Set","LANGUAGE_RENDER_MAP","name","typescript","icon","props","transform","viewBox","d","fill","python","version","id","offset","stopColor","gradientUnits","x1","x2","xlinkHref","y1","y2","overflow","style","marker","java","golang","dotnet","AnalyticsContext","trackPageView","AnalyticsProvider","pathname","useLocation","prevPath","useRef","opts","current","window","AWSMA","ready","document","dispatchEvent","CustomEvent","TRIGGER_EVENT","detail","usePageView","options","useMemo","page","pageURL","location","replace","event","type","description","CDKTypeIcon","forwardRef","ref","alt","CDKTYPE_RENDER_MAP","h","src","imgsrc","w","CDKTypeText","majorVersion","undefined","takePage","items","limit","start","stop","slice","useCatalogResults","cdkMajor","cdkType","query","language","languages","sort","tags","results","filters","instance","useSearchContext","Error","search","values","useSearch","data","pageLimit","Math","floor","length","usePagination","API_PATHS","PACKAGES_PREFIX","CATALOG_SUFFIX","ASSEMBLY_SUFFIX","METADATA_SUFFIX","CONFIG","STATS","QUERY_PARAMS","CDK_TYPE","LANGUAGE","OFFSET","SEARCH_QUERY","SORT","SUBMODULE","CDK_MAJOR","TAGS","ROUTES","FAQ","HOME","PACKAGES","SEARCH","SITE_TERMS","DEFAULT_FEATURED_PACKAGES","sections","showLastUpdated","defaultConfig","featureFlags","packageLinks","featuredPackages","fetchConfig","a","configOverride","fetch","response","ok","console","log","json","catch","err","error","STORAGE_KEY","DevPreviewBanner","defaultIsOpen","sessionStorage","in","Card","border","boxShadow","mt","mx","position","role","InfoOutline","left","top","textAlign","CONSTRUCT_HUB_REPO_URL","textDecoration","Close","right","size","Form","form","displayName","useDebounce","debouncedValue","setDebouncedValue","delay","useEffect","handler","setTimeout","clearTimeout","SearchItem","_hover","cursor","alignItems","display","lineHeight","listStyleType","minH","onKeyDown","includes","key","px","sx","onPerfEntry","getLocalStoreWriter","URLSearchParams","get","initialize","Promise","resolve","reject","addEventListener","domain","hostname","navigator","__storeWriter","AWSCShortbread","callIfDefined","method","access","checkForCookieConsent","customizeCookies","getConsentCookie","hasConsent","shortbread","publicAPI","ShortbreadContext","ShortbreadProvider","isReady","setIsReady","isCancelled","then","FOOTER_LINKS","SERVICE_TERMS","url","testId","PRIVACY","isExternal","LEGAL","testIds","createTestIds","Object","map","Footer","align","as","container","direction","justify","py","columnGap","columns","links","entries","index","base","md","borderColor","mr","orientation","NavLink","to","sm","disclaimer","manageCookies","fontWeight","NavPopover","menuProps","strategy","Link","isNavLink","justifyContent","NavPopoverContent","item","idx","title","link","linkIdx","NavPopoverTrigger","Button","ChevronDown","DocumentationDropdown","documentationTrigger","documentationMenu","DOCUMENTATION","GettingStartedDropdown","gettingStartedTrigger","gettingStartedMenu","GETTING_STARTED","SearchModal","useCatalogSearch","onQueryChange","onSubmit","onSearch","pb","spacing","SearchBar","HeaderSearch","searchModal","exact","path","searchInput","searchIcon","Search","linkProps","MobileNavLinksContent","flex","itemIdx","borderBottom","pt","MobileNavLinks","allowMultiple","allowToggle","defaultIndex","_","i","section","Title","MobileNav","mobileNav","NavButton","nav","navOpen","Hamburger","HeaderItem","rowStart","Header","gap","gridTemplateColumns","gridTemplateRows","maxW","zIndex","colStart","justifySelf","placeItems","LazyRoute","Component","component","routeProps","fallback","PageLoader","lazy","Home","NotFound","Packages","SearchRedesign","SiteTerms","App","showBanner","theme","components","Code","variants","subtle","whiteSpace","Divider","defaultProps","createVariant","overrides","varBase","Tag","makeTag","config","customVariants","reduce","accum","keyword","background","transparentize","baseStyle","makeComponents","foundations","borders","colors","blue","bgPrimary","radii","card","sizes","shadows","makeTheme","componentsConfig","packageTags","extendTheme","Theme","useConfig","loading","resetCSS","Boolean","match","ReactDOM","render","StrictMode","Analytics","Config","Catalog","Stats","ExternalLinkWarning","getElementById","Function","getCLS","getFID","getFCP","getLCP","getTTFB","serviceWorker","registration","unregister","message","rel","CatalogSearchSort","scope","ids","acc","curr","CDKType","CDKTYPE_NAME_MAP","awscdk","cdktf","cdk8s","getDateSort","isAscending","p1","p2","d1","Date","metadata","date","d2","getStrSort","localeCompare","getDownloadsSort","downloads","SORT_FUNCTIONS","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","DownloadsAsc","DownloadsDesc","FILTER_FUNCTIONS","pkg","constructFramework","languageSet","has","keys","some","lang","tag","RouterLink","fetchPackages","statusText","CatalogContext","useCatalog","CatalogProvider","useRequest","requestPackages","catalogResponse","SearchBarState","useSearchBarState","state","hasButton","inputProps","disclosure","inputRef","searchAPI","catalog","roundedCatalogLength","round","packages","placeholder","clickListener","contains","kbdListener","blur","removeEventListener","pos","_focus","input","onFocus","borderLeftRadius","searchButton","SearchOverlay","overlay","inset","opacity","SearchSuggestions","debouncedQuery","push","useHistory","recommendations","UnorderedList","suggestionsList","suggestion","getPackagePath","requestFn","initialValue","onSuccess","onError","setLoading","setData","setError","mountedRef","statefulFetch","res","gitSSHRegex","RegExp","getRepoUrlAndHost","repoUrl","sshUrl","author","repo","URL","createURL","params","searchParams","filter","forEach","k","v","set","toString","createURLSearchParams","getSearchPath","join","submodule","defaultStats","updated","fetchStats","StatsContext","useStats","StatsProvider","requestStats","statsResponse","ConfigContext","LOCAL_CONFIG","ConfigProvider","stored","configData","setConfigData","requestConfig","configResponse","CatalogSearchAPI","catalogData","stats","constructFrameworks","catalogMap","npm","Map","this","detectConstructFrameworks","lunr","field","split","packageName","authorName","email","authorEmail","add","refs","copiedResults","filterFunctions","result","isFiltered","filterFn","delete","frameworks","frameworkName","entry","majorVersions","pkgCount","SearchContext","SearchProvider","catalogLoading","statsData","statsLoading","defaultQuery","setQuery","defaultCdkType","setCdkType","defaultCdkMajor","setCdkMajor","defaultLanguages","setLanguages","defaultTags","setTags","defaultLanguage","setLanguage","defaultSort","setSort","onLanguageChange"],"mappings":"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","file":"static/js/main.ca806cb8.chunk.js","sourcesContent":["import type { MouseEventHandler } from \"react\";\n\nexport interface ExternalLinkPromptOptions {\n href?: string;\n onClick?: MouseEventHandler<HTMLAnchorElement>;\n}\n\nexport type ExternalLinkPrompt = ({\n href,\n onClick,\n}: ExternalLinkPromptOptions) => typeof onClick;\n\nexport const PREFERS_WARN_ON_EXTERNAL_LINK_CLICK =\n \"prefersWarnOnExternalLinkClick\";\n","import { ExternalLinkIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Checkbox,\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalOverlay,\n Text,\n Tooltip,\n} from \"@chakra-ui/react\";\nimport {\n ChangeEventHandler,\n FunctionComponent,\n MouseEventHandler,\n useState,\n} from \"react\";\nimport { ExternalLink } from \"../../components/ExternalLink\";\nimport {\n ExternalLinkPromptOptions,\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n} from \"./constants\";\n\nexport interface ExternalLinkWarningModalProps\n extends ExternalLinkPromptOptions {\n isOpen: boolean;\n onClose: () => void;\n setShouldWarn: (shouldWarn: boolean) => void;\n}\n\nexport const ExternalLinkWarningModal: FunctionComponent<ExternalLinkWarningModalProps> =\n ({ href, isOpen, onClick, onClose, setShouldWarn }) => {\n // Track a final state for showing warnings that will only be updated if a user chooses to proceed\n const [finalShouldWarn, setFinalShouldWarn] = useState(true);\n\n // Update intermediate state when preference checkmark is updated\n const onPreferenceUpdated: ChangeEventHandler<HTMLInputElement> = (e) => {\n const shouldWarn = !e.target.checked;\n setFinalShouldWarn(shouldWarn);\n };\n\n const onCancel = () => {\n // If user cancelled the navigation, reset final warning state\n setFinalShouldWarn(true);\n onClose();\n };\n\n const onProceed: MouseEventHandler<HTMLAnchorElement> = (e) => {\n // If a user decided to not show warnings in the future, update localStorage & state to reflect their decision\n if (!finalShouldWarn) {\n setShouldWarn(finalShouldWarn);\n\n try {\n localStorage.setItem(\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n JSON.stringify(finalShouldWarn)\n );\n } catch {}\n }\n\n onClick?.(e);\n onClose();\n };\n\n return (\n <Modal closeOnOverlayClick={false} isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent color=\"blue.800\">\n <ModalHeader>Confirm</ModalHeader>\n <ModalBody>\n <Text fontSize=\"lg\" mb={2}>\n This link is taking you to an external site\n </Text>\n <Text\n bg=\"gray.100\"\n borderRadius=\"sm\"\n color=\"blue.500\"\n fontSize=\"sm\"\n mb={4}\n p={1}\n >\n {href}\n </Text>\n <Checkbox onChange={onPreferenceUpdated}>\n Do not show this warning again.\n </Checkbox>\n </ModalBody>\n <ModalFooter>\n <Button onClick={onCancel} variant=\"ghost\">\n Cancel\n </Button>\n\n <Tooltip hasArrow label={href} placement=\"top\">\n <ExternalLink\n hasIcon={false}\n hasWarning={false}\n href={href}\n noFollow\n onClick={onProceed}\n >\n <Button\n colorScheme=\"blue\"\n ml={4}\n rightIcon={<ExternalLinkIcon />}\n tabIndex={0}\n variant=\"ghost\"\n >\n Proceed\n </Button>\n </ExternalLink>\n </Tooltip>\n </ModalFooter>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n );\n };\n","import { useDisclosure } from \"@chakra-ui/react\";\nimport {\n useContext,\n useState,\n createContext,\n FunctionComponent,\n MouseEventHandler,\n useCallback,\n} from \"react\";\nimport {\n PREFERS_WARN_ON_EXTERNAL_LINK_CLICK,\n ExternalLinkPrompt,\n ExternalLinkPromptOptions,\n} from \"./constants\";\nimport { ExternalLinkWarningModal } from \"./ExternalLinkWarningModal\";\n\nconst ExternalLinkWarningContext = createContext<ExternalLinkPrompt>(\n ({ onClick }) => onClick\n);\n\nexport const useExternalLinkWarning = () =>\n useContext(ExternalLinkWarningContext);\n\nexport const ExternalLinkWarningProvider: FunctionComponent = ({\n children,\n}) => {\n const [modalOption, setModalOptions] =\n useState<ExternalLinkPromptOptions | null>(null);\n\n const { isOpen, onOpen, onClose } = useDisclosure({\n // Reset the modal options when closed\n onClose: () => {\n setModalOptions(null);\n },\n });\n\n // Determines initial state from localStorage. If no value is found, default to showing warning\n const [shouldWarn, setShouldWarn] = useState(() => {\n try {\n const saved =\n localStorage.getItem(PREFERS_WARN_ON_EXTERNAL_LINK_CLICK) ?? \"true\";\n return JSON.parse(saved);\n } catch {\n return true;\n }\n });\n\n // Takes in an href & onClick to set options for modal. If it should warn the user, it will wrap the onClick\n // With additional logic to show the modal\n const withPrompt = useCallback<ExternalLinkPrompt>(\n ({ href, onClick }) => {\n if (!shouldWarn) return onClick;\n\n const handler: MouseEventHandler<HTMLAnchorElement> = (e) => {\n setModalOptions({ href, onClick });\n e.preventDefault();\n onOpen();\n };\n\n return handler;\n },\n [onOpen, shouldWarn]\n );\n\n return (\n <ExternalLinkWarningContext.Provider value={withPrompt}>\n {children}\n <ExternalLinkWarningModal\n isOpen={isOpen}\n onClose={onClose}\n setShouldWarn={setShouldWarn}\n {...modalOption}\n />\n </ExternalLinkWarningContext.Provider>\n );\n};\n","import type { PropsOf, Icon } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { DotNetIcon } from \"../icons/DotNetIcon\";\nimport { GoIcon } from \"../icons/GoIcon\";\nimport { JavaIcon } from \"../icons/JavaIcon\";\nimport { PythonIcon } from \"../icons/PythonIcon\";\nimport { TSIcon } from \"../icons/TSIcon\";\n\nexport enum Language {\n DotNet = \"dotnet\",\n TypeScript = \"typescript\",\n Python = \"python\",\n Go = \"golang\",\n Java = \"java\",\n}\n\nexport const languageFilename = {\n [Language.TypeScript]: Language.TypeScript,\n [Language.Python]: Language.Python,\n [Language.Go]: Language.Go,\n [Language.Java]: Language.Java,\n [Language.DotNet]: \"csharp\",\n};\n\n/**\n * The sorted list of all available languages.\n */\nexport const LANGUAGES: readonly Language[] = [\n Language.TypeScript,\n Language.Python,\n Language.Java,\n Language.Go,\n Language.DotNet,\n];\n\nexport const LANGUAGE_NAME_MAP: { readonly [key in Language]: string } = {\n [Language.TypeScript]: \"TypeScript\",\n [Language.Python]: \"Python\",\n [Language.Java]: \"Java\",\n [Language.Go]: \"Go\",\n [Language.DotNet]: \".NET\",\n};\n\nexport const TEMP_SUPPORTED_LANGUAGES: ReadonlySet<Language> = new Set([\n Language.Python,\n Language.TypeScript,\n Language.Java,\n Language.DotNet,\n]);\n\nexport const LANGUAGE_RENDER_MAP: {\n readonly [key in Language]: {\n readonly name: string;\n readonly icon: FunctionComponent<PropsOf<typeof Icon>>;\n };\n} = {\n [Language.TypeScript]: {\n name: LANGUAGE_NAME_MAP.typescript,\n icon: TSIcon,\n },\n [Language.Python]: {\n name: LANGUAGE_NAME_MAP.python,\n icon: PythonIcon,\n },\n [Language.Java]: {\n name: LANGUAGE_NAME_MAP.java,\n icon: JavaIcon,\n },\n [Language.Go]: {\n name: LANGUAGE_NAME_MAP.golang,\n icon: GoIcon,\n },\n [Language.DotNet]: {\n name: LANGUAGE_NAME_MAP.dotnet,\n icon: DotNetIcon,\n },\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const TSIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 256 256\"\n >\n <path d=\"M0 128v128h256V0H0z\" fill=\"#007ACC\" />\n <path\n d=\"M56.611 128.85l-.081 10.483h33.32v94.68h23.57v-94.68h33.32v-10.28c0-5.69-.122-10.444-.284-10.566-.122-.162-20.399-.244-44.983-.203l-44.739.122-.122 10.443zM206.567 118.108c6.501 1.626 11.459 4.51 16.01 9.224 2.357 2.52 5.851 7.112 6.136 8.209.08.325-11.053 7.802-17.798 11.987-.244.163-1.22-.894-2.317-2.52-3.291-4.794-6.745-6.867-12.028-7.232-7.76-.529-12.759 3.535-12.718 10.32 0 1.992.284 3.17 1.097 4.796 1.707 3.535 4.876 5.648 14.832 9.955 18.326 7.884 26.168 13.085 31.045 20.48 5.445 8.25 6.664 21.415 2.966 31.208-4.063 10.646-14.14 17.88-28.323 20.277-4.388.772-14.79.65-19.504-.203-10.28-1.829-20.033-6.908-26.047-13.572-2.357-2.601-6.949-9.387-6.664-9.875.122-.162 1.178-.812 2.356-1.503 1.138-.65 5.446-3.13 9.509-5.486l7.355-4.267 1.544 2.276c2.154 3.291 6.867 7.802 9.712 9.305 8.167 4.308 19.383 3.698 24.909-1.26 2.357-2.153 3.332-4.388 3.332-7.68 0-2.966-.366-4.266-1.91-6.5-1.99-2.845-6.054-5.243-17.595-10.24-13.206-5.69-18.895-9.225-24.096-14.833-3.007-3.25-5.852-8.452-7.03-12.8-.975-3.616-1.22-12.678-.447-16.335 2.723-12.76 12.353-21.658 26.25-24.3 4.51-.853 14.994-.528 19.424.57z\"\n fill=\"#FFF\"\n />\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const PythonIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon {...props} version=\"1.0\" viewBox=\"0 0 110.421 109.846\">\n <defs>\n <linearGradient id=\"a\">\n <stop offset=\"0\" stopColor=\"#ffe052\" />\n <stop offset=\"1\" stopColor=\"#ffc331\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id=\"d\"\n x1=\"89.137\"\n x2=\"147.777\"\n xlinkHref=\"#a\"\n y1=\"111.921\"\n y2=\"168.101\"\n />\n <linearGradient id=\"b\">\n <stop offset=\"0\" stopColor=\"#387eb8\" />\n <stop offset=\"1\" stopColor=\"#366994\" />\n </linearGradient>\n <linearGradient\n gradientUnits=\"userSpaceOnUse\"\n id=\"c\"\n x1=\"55.549\"\n x2=\"110.149\"\n xlinkHref=\"#b\"\n y1=\"77.07\"\n y2=\"131.853\"\n />\n </defs>\n <g color=\"#000\">\n <path\n d=\"M99.75 67.469c-28.032 0-26.281 12.156-26.281 12.156l.031 12.594h26.75V96H62.875s-17.938-2.034-17.938 26.25 15.657 27.281 15.657 27.281h9.343v-13.125s-.503-15.656 15.407-15.656h26.531s14.906.241 14.906-14.406V82.125s2.263-14.656-27.031-14.656zM85 75.938a4.808 4.808 0 014.813 4.812A4.808 4.808 0 0185 85.563a4.808 4.808 0 01-4.813-4.813A4.808 4.808 0 0185 75.937z\"\n fill=\"url(#c)\"\n overflow=\"visible\"\n style={{ marker: \"none\" }}\n transform=\"translate(-44.938 -67.469)\"\n />\n <path\n d=\"M100.546 177.315c28.032 0 26.281-12.156 26.281-12.156l-.03-12.594h-26.75v-3.781h37.374s17.938 2.034 17.938-26.25c0-28.285-15.657-27.282-15.657-27.282h-9.343v13.125s.503 15.657-15.407 15.657h-26.53s-14.907-.241-14.907 14.406v24.219s-2.263 14.656 27.031 14.656zm14.75-8.469a4.808 4.808 0 01-4.812-4.812 4.808 4.808 0 014.812-4.813 4.808 4.808 0 014.813 4.813 4.808 4.808 0 01-4.813 4.812z\"\n fill=\"url(#d)\"\n overflow=\"visible\"\n style={{ marker: \"none\" }}\n transform=\"translate(-44.938 -67.469)\"\n />\n </g>\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const JavaIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 256 346\"\n >\n <path\n d=\"M82.554 267.473s-13.198 7.675 9.393 10.272c27.369 3.122 41.356 2.675 71.517-3.034 0 0 7.93 4.972 19.003 9.279-67.611 28.977-153.019-1.679-99.913-16.517M74.292 229.659s-14.803 10.958 7.805 13.296c29.236 3.016 52.324 3.263 92.276-4.43 0 0 5.526 5.602 14.215 8.666-81.747 23.904-172.798 1.885-114.296-17.532\"\n fill=\"#5382A1\"\n />\n <path\n d=\"M143.942 165.515c16.66 19.18-4.377 36.44-4.377 36.44s42.301-21.837 22.874-49.183c-18.144-25.5-32.059-38.172 43.268-81.858 0 0-118.238 29.53-61.765 94.6\"\n fill=\"#E76F00\"\n />\n <path\n d=\"M233.364 295.442s9.767 8.047-10.757 14.273c-39.026 11.823-162.432 15.393-196.714.471-12.323-5.36 10.787-12.8 18.056-14.362 7.581-1.644 11.914-1.337 11.914-1.337-13.705-9.655-88.583 18.957-38.034 27.15 137.853 22.356 251.292-10.066 215.535-26.195M88.9 190.48s-62.771 14.91-22.228 20.323c17.118 2.292 51.243 1.774 83.03-.89 25.978-2.19 52.063-6.85 52.063-6.85s-9.16 3.923-15.787 8.448c-63.744 16.765-186.886 8.966-151.435-8.183 29.981-14.492 54.358-12.848 54.358-12.848M201.506 253.422c64.8-33.672 34.839-66.03 13.927-61.67-5.126 1.066-7.411 1.99-7.411 1.99s1.903-2.98 5.537-4.27c41.37-14.545 73.187 42.897-13.355 65.647 0 .001 1.003-.895 1.302-1.697\"\n fill=\"#5382A1\"\n />\n <path\n d=\"M162.439.371s35.887 35.9-34.037 91.101c-56.071 44.282-12.786 69.53-.023 98.377-32.73-29.53-56.75-55.526-40.635-79.72C111.395 74.612 176.918 57.393 162.439.37\"\n fill=\"#E76F00\"\n />\n <path\n d=\"M95.268 344.665c62.199 3.982 157.712-2.209 159.974-31.64 0 0-4.348 11.158-51.404 20.018-53.088 9.99-118.564 8.824-157.399 2.421.001 0 7.95 6.58 48.83 9.201\"\n fill=\"#5382A1\"\n />\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const GoIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 512 192\"\n >\n <path\n d=\"M292.533 13.295l1.124.75c13.212 8.725 22.685 20.691 28.917 35.15 1.496 2.243.499 3.49-2.493 4.237l-5.063 1.296c-11.447 2.949-20.53 5.429-31.827 8.378l-6.443 1.678c-2.32.574-2.96.333-5.428-2.477l-.348-.399c-3.519-3.988-6.155-6.652-10.817-9.03l-.899-.443c-15.705-7.727-30.911-5.484-45.12 3.74-16.952 10.968-25.677 27.172-25.428 47.364.25 19.942 13.96 36.395 33.654 39.137 16.951 2.244 31.16-3.739 42.378-16.452 2.244-2.743 4.238-5.734 6.73-9.224h-48.11c-5.235 0-6.481-3.24-4.736-7.478l.864-2.035c3.204-7.454 8.173-18.168 11.4-24.294l.704-1.319c.862-1.494 2.612-3.513 5.977-3.513h80.224c3.603-11.415 9.449-22.201 17.246-32.407 18.198-23.931 40.135-36.396 69.8-41.63 25.427-4.488 49.359-1.995 71.046 12.713 19.694 13.461 31.909 31.66 35.15 55.59 4.237 33.654-5.485 61.075-28.668 84.508-16.453 16.702-36.645 27.172-59.829 31.908-6.73 1.247-13.461 1.496-19.942 2.244-22.685-.499-43.376-6.98-60.826-21.937-12.273-10.61-20.727-23.648-24.928-38.828a104.937 104.937 0 01-10.47 16.89c-17.949 23.683-41.381 38.39-71.046 42.38-24.43 3.24-47.115-1.497-67.058-16.454-18.447-13.96-28.917-32.407-31.66-55.34-3.24-27.173 4.737-51.603 21.19-73.041 17.7-23.184 41.132-37.891 69.8-43.126 22.999-4.16 45.037-1.595 64.936 11.464zM411.12 49.017l-.798.178c-23.183 5.235-38.14 19.942-43.624 43.375-4.488 19.444 4.985 39.138 22.934 47.115 13.71 5.983 27.421 5.235 40.633-1.496 19.694-10.22 30.413-26.175 31.66-47.613-.25-3.24-.25-5.734-.749-8.227-4.436-24.401-26.664-38.324-50.056-33.332zM116.416 94.564c.997 0 1.496.748 1.496 1.745l-.499 5.983c0 .997-.997 1.745-1.745 1.745l-54.344-.249c-.997 0-1.246-.748-.748-1.496l3.49-6.232c.499-.748 1.496-1.496 2.493-1.496h49.857zM121.9 71.63c.997 0 1.496.748 1.247 1.496l-1.995 5.983c-.249.997-1.246 1.495-2.243 1.495l-117.912.25c-.997 0-1.246-.499-.748-1.247l5.235-6.73c.499-.748 1.745-1.247 2.742-1.247H121.9zm12.963-22.934c.997 0 1.246.748.748 1.496l-4.238 6.481c-.499.748-1.745 1.496-2.493 1.496l-90.24-.25c-.998 0-1.247-.498-.749-1.246l5.235-6.73c.499-.748 1.745-1.247 2.742-1.247h88.995z\"\n fill=\"#00ACD7\"\n />\n </Icon>\n );\n};\n","import { Icon, PropsOf } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const DotNetIcon: FunctionComponent<PropsOf<typeof Icon>> = (props) => {\n return (\n <Icon\n {...props}\n aria-hidden=\"true\"\n transform=\"rotate(360)\"\n viewBox=\"0 0 32 32\"\n >\n <path\n d=\"M4.224 10.089v11.667h1.365v-8.438a12.58 12.58 0 00-.068-1.599h.052c.099.255.224.5.37.729l6 9.302h1.672V10.089h-1.359v8.203c-.016.573.016 1.146.083 1.714h-.031a13.986 13.986 0 00-.474-.781L5.995 10.09zm12.417 0v11.667h6.203l.005-1.281h-4.813v-4.047h4.214v-1.229h-4.214v-3.875h4.521V10.09zm7.25 0v1.234h3.354v10.432h1.365V11.323h3.391v-1.234zm-23.021 10a.86.86 0 00-.609.276.91.91 0 00-.26.641.901.901 0 001.542.641c.172-.167.271-.401.271-.641s-.099-.474-.271-.641a.876.876 0 00-.641-.276H.871z\"\n fill=\"#626262\"\n />\n </Icon>\n );\n};\n","import {\n useContext,\n useCallback,\n useRef,\n createContext,\n FunctionComponent,\n} from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { PageViewConfig } from \"./types\";\n\nexport interface AnalyticsAPI {\n trackPageView: (opts: PageViewConfig) => void;\n}\n\nconst AnalyticsContext = createContext<AnalyticsAPI>({\n trackPageView: () => {},\n});\n\nexport const useAnalytics = () => useContext(AnalyticsContext);\n\nexport const AnalyticsProvider: FunctionComponent = ({ children }) => {\n const { pathname } = useLocation();\n\n const prevPath = useRef<null | string>(null);\n\n const trackPageView = useCallback(\n (opts: PageViewConfig) => {\n if (prevPath.current === pathname) {\n return;\n }\n\n window?.AWSMA?.ready?.(() => {\n document.dispatchEvent(\n new CustomEvent(window.AWSMA.TRIGGER_EVENT, { detail: opts })\n );\n\n prevPath.current = pathname;\n });\n },\n [pathname]\n );\n\n return (\n <AnalyticsContext.Provider value={{ trackPageView }}>\n {children}\n </AnalyticsContext.Provider>\n );\n};\n","import { useCallback, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { useAnalytics } from \"./Analytics\";\nimport type { PageViewOptions, PageViewConfig } from \"./types\";\n\nexport const usePageView = (opts: PageViewOptions) => {\n const { trackPageView } = useAnalytics();\n const { pathname } = useLocation();\n\n const options: PageViewConfig = useMemo(\n () => ({\n page: {\n // This is silly but the analytics library crashes in dev if using localhost as the pageURL :/\n pageURL: window.location.href.replace(\n \"://localhost:3000\",\n \"://constructs.local.dev\"\n ),\n ...opts.page,\n },\n event: {\n type: \"pageview\",\n name: opts.event.name,\n description: opts.event.description,\n },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pathname, opts]\n );\n\n const track = useCallback(() => {\n return trackPageView(options);\n }, [trackPageView, options]);\n\n return track;\n};\n","import {\n forwardRef,\n Image,\n ImageProps,\n Text,\n TextProps,\n} from \"@chakra-ui/react\";\nimport { CDKType, CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\n\ninterface CDKTypeIconProps extends ImageProps {\n name?: CDKType;\n}\n\nexport const CDKTypeIcon = forwardRef<CDKTypeIconProps, \"img\">(\n ({ name, ...props }, ref) => {\n if (!name) return null;\n\n return (\n <Image\n alt={`${CDKTYPE_RENDER_MAP[name].name} Logo`}\n h={5}\n ref={ref}\n src={CDKTYPE_RENDER_MAP[name].imgsrc}\n w={5}\n {...props}\n />\n );\n }\n);\n\ninterface CDKTypeTextProps extends TextProps {\n name?: CDKType;\n majorVersion?: number;\n}\n\nexport const CDKTypeText = forwardRef<CDKTypeTextProps, \"p\">(\n ({ name, majorVersion, ...props }, ref) => {\n if (!name) return null;\n\n return (\n <Text ref={ref} {...props}>\n {CDKTYPE_RENDER_MAP[name].name}\n {majorVersion !== undefined ? ` v${majorVersion}` : \"\"}\n </Text>\n );\n }\n);\n","import { useMemo } from \"react\";\n\nexport interface UsePaginationOptions {\n limit?: number;\n offset?: number;\n}\n\nconst takePage = <T extends any[]>(\n items: T,\n opts: Required<UsePaginationOptions>\n) => {\n const { limit, offset } = opts;\n const start = offset * limit;\n const stop = start + limit;\n return items.slice(start, stop);\n};\n\nexport const usePagination = <T extends any[]>(\n data: T,\n options?: UsePaginationOptions\n) => {\n const { limit = 25, offset = 0 } = options ?? {};\n const pageLimit = data ? Math.floor(data.length / limit) : 0;\n\n return useMemo(\n () => ({\n page: takePage(data, {\n limit,\n offset: offset > pageLimit ? pageLimit : offset,\n }) as T,\n pageLimit,\n }),\n [data, limit, offset, pageLimit]\n );\n};\n","import { useMemo } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { usePagination } from \"../usePagination\";\nimport { useSearch } from \"../useSearch\";\n\nexport interface UseCatalogResultsOptions {\n cdkMajor?: number;\n cdkType?: CDKType;\n limit: number;\n offset?: number;\n query?: string;\n language?: Language | null;\n languages?: Language[];\n sort?: CatalogSearchSort;\n tags?: string[];\n}\n\n/**\n * A hook to wrap `useSearch` results with pagination and parameter memoization\n * This hook depends on an upstream provider - `<SearchProvider />`, which wraps all pages.\n */\nexport const useCatalogResults = ({\n cdkMajor,\n cdkType,\n limit,\n offset = 0,\n query = \"\",\n language = null,\n languages,\n sort,\n tags,\n}: UseCatalogResultsOptions) => {\n const filters = useMemo(\n () => ({\n cdkMajor,\n cdkType,\n language: language ?? undefined,\n languages,\n tags,\n }),\n [cdkMajor, cdkType, language, languages, tags]\n );\n\n const results = useSearch({\n filters,\n query,\n sort,\n });\n\n const { page, pageLimit } = usePagination(results, {\n offset,\n limit,\n });\n\n return useMemo(\n () => ({ results, page, pageLimit }),\n [page, pageLimit, results]\n );\n};\n","import { useMemo } from \"react\";\nimport type { CatalogSearchParams } from \"../../api/catalog-search\";\nimport { useSearchContext } from \"../../contexts/Search\";\n\n/**\n * A hook which returns a list of packages returned by the CatalogSearchAPI.\n * Generally this hook will be called via `useCatalogSearchResults` which wraps this functionality with pagination\n * This hook depends on an upstream provider - `<SearchProvider />`, which wraps all pages.\n */\nexport const useSearch = ({\n query,\n filters,\n sort,\n}: CatalogSearchParams = {}) => {\n const instance = useSearchContext();\n\n if (!instance) {\n throw new Error(\n \"This hook can only be called within a descendant of a <SearchProvider />\"\n );\n }\n\n const results = useMemo(\n () => [\n ...instance\n .search({\n query,\n filters,\n sort,\n })\n .values(),\n ],\n [instance, query, filters, sort]\n );\n\n return results;\n};\n","export const API_PATHS = {\n PACKAGES_PREFIX: \"/data\",\n CATALOG_SUFFIX: \"/catalog.json\",\n ASSEMBLY_SUFFIX: \"/assembly.json\",\n METADATA_SUFFIX: \"/metadata.json\",\n CONFIG: \"/config.json\",\n STATS: \"/stats.json\",\n} as const;\n\nexport const QUERY_PARAMS = {\n CDK_TYPE: \"cdk\",\n LANGUAGE: \"lang\",\n LANGUAGES: \"langs\",\n OFFSET: \"offset\",\n SEARCH_QUERY: \"q\",\n SORT: \"sort\",\n SUBMODULE: \"submodule\",\n CDK_MAJOR: \"cdkver\",\n TAGS: \"tags\",\n} as const;\n\nexport const ROUTES = {\n FAQ: \"/faq\",\n HOME: \"/\",\n PACKAGES: \"/packages\",\n SEARCH: \"/search\",\n SITE_TERMS: \"/terms\",\n};\n\ntype QueryParams = typeof QUERY_PARAMS;\n\nexport type QueryParamKey = QueryParams[keyof QueryParams];\n","import { API_PATHS } from \"../../constants/url\";\n\nexport interface PackageLinkConfig {\n linkLabel: string;\n configKey: string;\n linkText?: string;\n}\n\nexport interface PackageKeyword {\n label: string;\n color?: string;\n}\n\nexport interface PackageHighlight extends PackageKeyword {\n icon?: string;\n}\n\nexport interface PackageTagConfig {\n id: string;\n keyword?: PackageKeyword;\n highlight?: PackageHighlight;\n searchFilter?: {\n groupBy: string;\n display: string;\n };\n}\n\n/**\n * Configuration for packages to feature on the home page.\n */\nexport interface FeaturedPackages {\n /**\n * Grouped sections of packages on the homepage.\n */\n readonly sections: FeaturedPackagesSection[];\n}\n\n/**\n * Customization options for one section of the home page.\n */\nexport interface FeaturedPackagesSection {\n /**\n * The name of the section (displayed as a header).\n */\n readonly name: string;\n\n /**\n * Show the N most recently updated packages in this section.\n * Cannot be used with `showPackages`.\n */\n readonly showLastUpdated?: number;\n\n /**\n * Show an explicit list of packages.\n * Cannot be used with `showLastUpdated`.\n */\n readonly showPackages?: FeaturedPackagesDetail[];\n}\n\n/**\n * Customization options for a specific package on the home page.\n */\nexport interface FeaturedPackagesDetail {\n /**\n * The name of the package.\n */\n readonly name: string;\n\n /**\n * An additional comment to include with the package.\n */\n readonly comment?: string;\n}\n\nexport interface FeatureFlags {}\n\nexport interface Config {\n featureFlags?: FeatureFlags;\n packageLinks?: PackageLinkConfig[];\n featuredPackages?: FeaturedPackages;\n packageTags?: PackageTagConfig[];\n}\n\nexport const DEFAULT_FEATURED_PACKAGES = {\n sections: [\n {\n name: \"Recently updated\",\n showLastUpdated: 10,\n },\n ],\n};\n\nconst defaultConfig: Config = {\n featureFlags: {},\n packageLinks: [],\n featuredPackages: DEFAULT_FEATURED_PACKAGES,\n};\n\nexport const fetchConfig = async (): Promise<Config> => {\n if (window.configOverride) {\n return window.configOverride;\n }\n\n const response = await fetch(API_PATHS.CONFIG);\n\n if (!response.ok) {\n console.log(\"Failed to fetch application config, using default values\");\n return defaultConfig;\n }\n\n return response.json().catch((err) => {\n console.error(err);\n console.log(\"Invalid config response, using default values\");\n return defaultConfig;\n });\n};\n","import { CloseIcon, InfoOutlineIcon } from \"@chakra-ui/icons\";\nimport {\n Box,\n IconButton,\n Collapse,\n Text,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { CONSTRUCT_HUB_REPO_URL } from \"../../constants/links\";\nimport { Card } from \"../Card\";\nimport { ExternalLink } from \"../ExternalLink\";\n\nconst STORAGE_KEY = \"showing-dev-preview-banner\";\n\nexport const DevPreviewBanner: FunctionComponent = () => {\n const { isOpen, onClose } = useDisclosure({\n defaultIsOpen: JSON.parse(\n window.sessionStorage.getItem(STORAGE_KEY) ?? \"true\"\n ),\n onClose: () => window.sessionStorage.setItem(STORAGE_KEY, \"false\"),\n });\n\n return (\n <Box h=\"max-content\">\n <Collapse in={isOpen}>\n <Card\n aria-label=\"Preview Banner\"\n bg=\"blue.500\"\n border=\"none\"\n boxShadow=\"none\"\n color=\"white\"\n mt={4}\n mx={4}\n p={4}\n position=\"relative\"\n role=\"alertdialog\"\n >\n <InfoOutlineIcon h={5} left={4} position=\"absolute\" top={4} w={5} />\n <Text fontSize=\"md\" mx={8} textAlign=\"center\">\n This application is in Dev Preview. Some features may change. If you\n find any issues, please report them{\" \"}\n <ExternalLink\n color=\"inherit\"\n hasWarning={false}\n href={`${CONSTRUCT_HUB_REPO_URL}/issues`}\n textDecoration=\"underline\"\n >\n here\n </ExternalLink>\n </Text>\n <IconButton\n aria-label=\"Dismiss banner\"\n colorScheme=\"white\"\n icon={<CloseIcon />}\n onClick={onClose}\n position=\"absolute\"\n right={4}\n size=\"xs\"\n top={3}\n variant=\"ghost\"\n />\n </Card>\n </Collapse>\n </Box>\n );\n};\n","import { chakra, HTMLChakraProps, forwardRef } from \"@chakra-ui/react\";\n\nexport interface FormProps extends HTMLChakraProps<\"form\"> {}\n\nexport const Form = forwardRef<FormProps, \"form\">((props, ref) => (\n <chakra.form {...props} ref={ref} />\n));\n\nForm.displayName = \"Form\";\n","import { useState, useEffect } from \"react\";\n\nexport interface UseDebounceOptions<T> {\n delay?: number;\n onChange?: (val: T) => void;\n}\n\nexport const useDebounce = <T>(\n value: T,\n options: UseDebounceOptions<T> = {}\n) => {\n const [debouncedValue, setDebouncedValue] = useState(value);\n const { delay = 250, onChange } = options;\n\n useEffect(() => {\n // Update value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n onChange?.(value);\n }, delay);\n\n // Cancel timeout when value / delay changes\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay, onChange]);\n\n return debouncedValue;\n};\n","import { HTMLChakraProps, ListItem, forwardRef } from \"@chakra-ui/react\";\nimport type { KeyboardEventHandler, ReactNode } from \"react\";\n\nexport interface SearchItemProps extends HTMLChakraProps<\"li\"> {\n name: ReactNode;\n onClick: () => void;\n}\n\nexport const SearchItem = forwardRef<SearchItemProps, \"li\">(\n ({ name, onClick, ...props }, ref) => {\n const onKeyDown: KeyboardEventHandler<HTMLLIElement> = (e) => {\n if ([\"Enter\", \" \"].includes(e.key)) {\n e.preventDefault();\n onClick();\n }\n };\n\n return (\n <ListItem\n _hover={{\n cursor: \"pointer\",\n }}\n alignItems=\"center\"\n display=\"flex\"\n fontSize=\"md\"\n lineHeight=\"base\"\n listStyleType=\"none\"\n minH={8}\n onClick={onClick}\n onKeyDown={onKeyDown}\n px={4}\n ref={ref}\n role=\"option\"\n sx={{ \":hover, :focus\": { bg: \"gray.100\" } }}\n tabIndex={0}\n {...props}\n >\n {name}\n </ListItem>\n );\n }\n);\n\nSearchItem.displayName = \"SearchItem\";\n","import { getLocalStoreWriter } from \"./getLocalStoreWriter\";\n\nexport interface ShortbreadOptions {\n domain?: string;\n parent?: HTMLElement;\n language?: Navigator[\"language\"];\n __storeWriter?: (cookie: Document[\"cookie\"]) => void;\n}\n\nexport interface Shortbread {\n /**\n * Call this function to be notified when you cookie category is allowed\n */\n access: (\n name: \"essential\" | \"performance\" | \"functional\" | \"advertising\",\n onAllowed: () => void\n ) => void;\n /**\n * Call to ask the user the type of cookies they'd like to receive\n */\n checkForCookieConsent: () => void;\n /**\n * Open the Customize Cookie Dialog\n */\n customizeCookies: () => void;\n /**\n * Returns the consent cookie or undefined if not yet set\n */\n getConsentCookie: () => Document[\"cookie\"] | undefined;\n /**\n * Call this to ask if the cookie has been set\n */\n hasConsent: (cookieName: string) => boolean;\n}\n\n// We only want to manage a single instance at a time\nlet instance: Shortbread | undefined;\n\n/**\n * Call to initialize the shortbread instance. Must be called before all other methods\n */\nexport const initialize = async () => {\n return new Promise<void>((resolve, reject) => {\n // Wait until page has loaded first\n window.addEventListener(\"load\", async () => {\n try {\n const options: ShortbreadOptions = {\n domain: window.location.hostname,\n language: navigator.language,\n __storeWriter: getLocalStoreWriter(),\n };\n\n // Import the shortbread source\n const { AWSCShortbread } = await import(\"./source\");\n instance = AWSCShortbread(options);\n\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n });\n};\n\n// Shortbread wrappers\n\nconst callIfDefined =\n <T extends keyof Shortbread>(method: T) =>\n (...args: Parameters<Shortbread[T]>): ReturnType<Shortbread[T]> => {\n if (!instance) {\n throw new Error(\"shortbread has not been initialized\");\n }\n\n // Annotations are correct for consumers\n return (instance[method] as any)(...args);\n };\n\n/**\n * Call this function to be notified when you cookie category is allowed\n */\nexport const access = callIfDefined(\"access\");\n/**\n * Call to ask the user the type of cookies they'd like to receive\n */\nexport const checkForCookieConsent = callIfDefined(\"checkForCookieConsent\");\n/**\n * Open the Customize Cookie Dialog\n */\nexport const customizeCookies = callIfDefined(\"customizeCookies\");\n/**\n * Returns the consent cookie or undefined if not yet set\n */\nexport const getConsentCookie = callIfDefined(\"getConsentCookie\");\n/**\n * Call this to ask if the cookie has been set\n */\nexport const hasConsent = callIfDefined(\"hasConsent\");\n","import { ReportHandler } from \"web-vitals\";\n\nexport const reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import(\"web-vitals\").then(\n ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n },\n () => {}\n );\n }\n};\n","import type { ShortbreadOptions } from \"./shortbread\";\n\nconst isDev = process.env.NODE_ENV === \"development\";\n\n/**\n * This function allows for shortbread testing locally.\n * If the node env is dev and the url has a query param of sb=true,\n * it will return a __storeWriter function to pass into shortbread's options\n */\nexport const getLocalStoreWriter = (): ShortbreadOptions[\"__storeWriter\"] => {\n const search = new URLSearchParams(window.location.search);\n const shouldUseOverride = search.get(\"sb\") === \"true\";\n\n if (isDev && shouldUseOverride) {\n return (cookie) => {\n document.cookie = cookie.replace(\" secure=true;\", \"\");\n };\n }\n\n return undefined;\n};\n","import {\n createContext,\n FunctionComponent,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport * as shortbread from \"../../lib/shortbread\";\n\nconst { initialize, ...publicAPI } = shortbread;\n\nconst ShortbreadContext = createContext<Partial<typeof publicAPI>>({});\n\nexport const useShortBread = () => useContext(ShortbreadContext);\n\nexport const ShortbreadProvider: FunctionComponent = ({ children }) => {\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n let isCancelled = false;\n\n initialize()\n .then(() => {\n if (!isCancelled) {\n publicAPI.checkForCookieConsent();\n setIsReady(true);\n }\n })\n .catch((e) => {\n console.error(e);\n\n if (!isCancelled) {\n setIsReady(false);\n }\n });\n\n return () => {\n isCancelled = true;\n setIsReady(false);\n };\n }, []);\n\n return (\n <ShortbreadContext.Provider value={isReady ? publicAPI : {}}>\n {children}\n </ShortbreadContext.Provider>\n );\n};\n","import { ROUTES } from \"../../constants/url\";\n\nexport type Link = {\n display: string;\n url: string;\n testId: string;\n isExternal?: boolean;\n};\n\nexport const FOOTER_LINKS: Record<string, Link> = {\n SERVICE_TERMS: {\n display: \"AWS Service Terms\",\n url: \"https://aws.amazon.com/service-terms/\",\n testId: \"service-terms\",\n },\n PRIVACY: {\n display: \"Privacy\",\n url: \"https://aws.amazon.com/privacy/\",\n testId: \"privacy\",\n },\n SITE_TERMS: {\n display: \"Construct Hub Site Terms\",\n url: ROUTES.SITE_TERMS,\n testId: \"site-terms\",\n isExternal: false,\n },\n LEGAL: {\n display: \"Legal\",\n url: \"https://aws.amazon.com/legal/\",\n testId: \"legal\",\n },\n} as const;\n\nexport const DISCLAIMER = \"2021 Amazon Web Services, Inc. All rights reserved.\";\n","import { createTestIds } from \"../../util/createTestIds\";\nimport { FOOTER_LINKS } from \"./constants\";\n\nconst testIds = createTestIds(\"footer\", [\n \"container\",\n \"links\",\n \"disclaimer\",\n \"manageCookies\",\n ...Object.values(FOOTER_LINKS).map(({ testId }) => testId),\n] as const);\n\nexport default testIds;\n","import { Box, Button, Divider, Flex, SimpleGrid, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { useShortBread } from \"../../contexts/Shortbread\";\nimport { ExternalLink } from \"../ExternalLink\";\nimport { NavLink } from \"../NavLink\";\nimport { DISCLAIMER, FOOTER_LINKS } from \"./constants\";\nimport testIds from \"./testIds\";\n\nexport interface FooterProps {}\n\nexport const Footer: FunctionComponent<FooterProps> = () => {\n const { customizeCookies } = useShortBread();\n\n return (\n <Flex\n align=\"center\"\n as=\"footer\"\n bg=\"blue.800\"\n color=\"white\"\n data-testid={testIds.container}\n direction=\"column\"\n justify=\"center\"\n py={4}\n >\n <SimpleGrid columnGap={6} columns={[1, 2, 4]} data-testid={testIds.links}>\n {Object.entries(FOOTER_LINKS).map(\n ([key, { display, isExternal = true, testId, url }], index) => (\n <Flex\n align=\"center\"\n direction={{ base: \"column\", md: \"row\" }}\n key={key}\n >\n {/* Single Row Divider */}\n <Box\n display={{ base: \"none\", md: index !== 0 ? \"initial\" : \"none\" }}\n h={5}\n >\n <Divider borderColor=\"white\" mr={6} orientation=\"vertical\" />\n </Box>\n {isExternal ? (\n <ExternalLink\n color=\"currentcolor\"\n data-testid={testIds[testId]}\n hasWarning={false}\n href={url}\n lineHeight={10}\n mx=\"auto\"\n >\n {display}\n </ExternalLink>\n ) : (\n <NavLink\n color=\"currentcolor\"\n data-testid={testIds[testId]}\n lineHeight={10}\n mx=\"auto\"\n to={url}\n >\n {display}\n </NavLink>\n )}\n {/* 2 Row Divider */}\n <Box\n display={{\n base: \"none\",\n sm: index < 2 ? \"initial\" : \"none\",\n md: \"none\",\n }}\n w=\"100%\"\n >\n <Divider borderColor=\"white\" />\n </Box>\n </Flex>\n )\n )}\n </SimpleGrid>\n <Text data-testid={testIds.disclaimer} fontSize=\"xs\" mt={4}>\n {DISCLAIMER}\n </Text>\n <Button\n color=\"white\"\n data-testid={testIds.manageCookies}\n fontSize=\"xs\"\n fontWeight=\"normal\"\n mt={4}\n onClick={customizeCookies}\n variant=\"link\"\n >\n Manage Cookies\n </Button>\n </Flex>\n );\n};\n","import { Menu, MenuProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface NavPopoverProps extends MenuProps {}\n\nexport const NavPopover: FunctionComponent<NavPopoverProps> = ({\n children,\n ...menuProps\n}) => {\n return (\n <Menu colorScheme=\"blue.800\" strategy=\"fixed\" {...menuProps}>\n {children}\n </Menu>\n );\n};\n","import {\n forwardRef,\n MenuDivider,\n MenuGroup,\n MenuItem,\n MenuList,\n MenuListProps,\n} from \"@chakra-ui/react\";\nimport { Fragment, FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../ExternalLink\";\nimport { NavLink } from \"../NavLink\";\nimport type { IMenuItems, ILink } from \"./types\";\n\nexport interface NavPopoverContentProps extends MenuListProps {\n items: IMenuItems;\n}\n\nconst Link: FunctionComponent<ILink> = ({ display, isNavLink, url }) =>\n isNavLink ? (\n <NavLink color=\"blue.500\" to={url} w=\"100%\">\n {display}\n </NavLink>\n ) : (\n <ExternalLink\n alignItems=\"center\"\n display=\"flex\"\n hasWarning={false}\n href={url}\n justifyContent=\"space-between\"\n w=\"100%\"\n >\n {display}\n </ExternalLink>\n );\n\nexport const NavPopoverContent = forwardRef<NavPopoverContentProps, \"div\">(\n ({ items, ...menuProps }, ref) => {\n return (\n <MenuList {...menuProps} ref={ref}>\n {items.map((item, idx) => {\n if (\"links\" in item) {\n return (\n <Fragment key={`${item.display}-${idx}`}>\n <MenuGroup align=\"left\" title={item.display}>\n {item.links.map((link, linkIdx) => (\n <MenuItem key={`${link.display}-${linkIdx}`}>\n <Link {...link} />\n </MenuItem>\n ))}\n </MenuGroup>\n {idx !== items.length - 1 && <MenuDivider />}\n </Fragment>\n );\n }\n\n return (\n <MenuItem key={`${item.display}-${idx}`}>\n <Link {...item} />\n </MenuItem>\n );\n })}\n </MenuList>\n );\n }\n);\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n MenuButton,\n MenuButtonProps,\n forwardRef,\n} from \"@chakra-ui/react\";\n\nexport const NavPopoverTrigger = forwardRef<MenuButtonProps, \"button\">(\n ({ children, ...props }, ref) => {\n return (\n <MenuButton\n as={Button}\n color=\"blue.800\"\n fontWeight=\"500\"\n ref={ref}\n rightIcon={<ChevronDownIcon h={6} w={6} />}\n size=\"md\"\n variant=\"link\"\n {...props}\n >\n {children}\n </MenuButton>\n );\n }\n);\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"header\", [\n \"container\",\n \"title\",\n \"gettingStartedTrigger\",\n \"gettingStartedMenu\",\n \"documentationTrigger\",\n \"documentationMenu\",\n \"navOpen\",\n \"navClose\",\n \"searchInput\",\n \"searchIcon\",\n \"mobileNav\",\n] as const);\n\nexport default testIds;\n","import type { FunctionComponent } from \"react\";\nimport { DOCUMENTATION } from \"../../constants/links\";\nimport {\n NavPopover,\n NavPopoverContent,\n NavPopoverTrigger,\n} from \"../NavPopover\";\nimport testIds from \"./testIds\";\n\nexport const DocumentationDropdown: FunctionComponent = () => {\n return (\n <NavPopover>\n <NavPopoverTrigger data-testid={testIds.documentationTrigger}>\n Documentation\n </NavPopoverTrigger>\n <NavPopoverContent\n data-testid={testIds.documentationMenu}\n items={DOCUMENTATION}\n />\n </NavPopover>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { GETTING_STARTED } from \"../../constants/links\";\nimport {\n NavPopover,\n NavPopoverContent,\n NavPopoverTrigger,\n} from \"../NavPopover\";\nimport testIds from \"./testIds\";\n\nexport const GettingStartedDropdown: FunctionComponent = () => (\n <NavPopover>\n <NavPopoverTrigger data-testid={testIds.gettingStartedTrigger}>\n Getting Started\n </NavPopoverTrigger>\n <NavPopoverContent\n data-testid={testIds.gettingStartedMenu}\n items={GETTING_STARTED}\n />\n </NavPopover>\n);\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"searchModal\", [\"container\"] as const);\n\nexport default testIds;\n","import {\n Modal,\n ModalBody,\n ModalCloseButton,\n ModalContent,\n ModalHeader,\n ModalOverlay,\n Portal,\n Stack,\n Button,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { useCatalogSearch } from \"../../hooks/useCatalogSearch\";\nimport { SearchBar } from \"../SearchBar\";\nimport testIds from \"./testIds\";\n\nexport interface SearchModalProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport const SearchModal: FunctionComponent<SearchModalProps> = ({\n isOpen,\n onClose,\n}) => {\n const { query, onQueryChange, onSubmit, onSearch } = useCatalogSearch();\n\n return (\n <Portal>\n <Modal isOpen={isOpen} onClose={onClose}>\n <ModalOverlay>\n <ModalContent data-testid={testIds.container}>\n <ModalCloseButton />\n <ModalHeader>Search</ModalHeader>\n <ModalBody>\n <Stack pb={4} spacing={4}>\n <SearchBar\n onChange={onQueryChange}\n onSubmit={onSubmit}\n value={query}\n ></SearchBar>\n <Button colorScheme=\"blue\" onClick={() => onSearch()}>\n Find Constructs\n </Button>\n </Stack>\n </ModalBody>\n </ModalContent>\n </ModalOverlay>\n </Modal>\n </Portal>\n );\n};\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport { Box, IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Switch, Route } from \"react-router-dom\";\nimport { ROUTES } from \"../../constants/url\";\nimport { SearchBar, SearchOverlay, SearchSuggestions } from \"../SearchBar\";\nimport { SearchModal } from \"../SearchModal\";\nimport testIds from \"./testIds\";\n\n/**\n * Renders a SearchBar at desktop resolutions and shows a search icon which opens a modal on mobile resolutions\n */\nexport const HeaderSearch: FunctionComponent = () => {\n const searchModal = useDisclosure();\n\n return (\n <Switch>\n <Route exact path={[ROUTES.HOME, ROUTES.SEARCH]} />\n <Route path=\"*\">\n {/* Desktop / Tablet Search Trigger */}\n <Box\n data-testid={testIds.searchInput}\n display={{ base: \"none\", md: \"initial\" }}\n >\n <SearchBar bg=\"gray.50\">\n <SearchOverlay />\n <SearchSuggestions />\n </SearchBar>\n </Box>\n {/* Mobile Search Trigger */}\n <Box display={{ base: \"initial\", md: \"none\" }}>\n <IconButton\n aria-label=\"Search Icon\"\n borderRadius=\"md\"\n data-testid={testIds.searchIcon}\n icon={<SearchIcon color=\"gray.600\" />}\n onClick={searchModal.onOpen}\n variant=\"ghost\"\n />\n\n <SearchModal {...searchModal} />\n </Box>\n </Route>\n </Switch>\n );\n};\n","import {\n Accordion,\n AccordionItem,\n AccordionButton,\n AccordionPanel,\n AccordionIcon,\n Box,\n Flex,\n Heading,\n} from \"@chakra-ui/react\";\nimport { Fragment, FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../ExternalLink\";\nimport { NavLink } from \"../NavLink\";\nimport type { IMenuItems, ILink } from \"../NavPopover\";\n\nconst linkProps = {\n color: \"blue.500\",\n py: 2,\n w: \"full\",\n};\n\nconst Link: FunctionComponent<ILink> = ({ display, isNavLink, url }) =>\n isNavLink ? (\n <NavLink to={url} {...linkProps}>\n {display}\n </NavLink>\n ) : (\n <ExternalLink\n alignItems=\"center\"\n display=\"flex\"\n hasWarning={false}\n href={url}\n justifyContent=\"space-between\"\n {...linkProps}\n >\n {display}\n </ExternalLink>\n );\n\ninterface MobileNavLinksContentProps {\n testId?: string;\n title: string;\n items: IMenuItems;\n}\n\nconst MobileNavLinksContent: FunctionComponent<MobileNavLinksContentProps> = ({\n title,\n items,\n testId,\n}) => (\n <AccordionItem data-testid={testId} w=\"full\">\n <AccordionButton px={0} py={4}>\n <Box flex=\"1\" textAlign=\"left\">\n <Heading as=\"h3\" size=\"sm\">\n {title}\n </Heading>\n </Box>\n\n <AccordionIcon />\n </AccordionButton>\n\n <AccordionPanel p={0} w=\"full\">\n <Flex direction=\"column\" w=\"full\">\n {items.map((item, itemIdx) => {\n if (\"links\" in item) {\n return (\n <Fragment key={`${item.display}-${itemIdx}`}>\n <Heading as=\"h4\" borderBottom=\"base\" pb={2} pt={4} size=\"xs\">\n {item.display}\n </Heading>\n\n {item.links.map((link, linkIdx) => (\n <Link {...link} key={`${link.display}-${linkIdx}`} />\n ))}\n </Fragment>\n );\n }\n\n return <Link {...item} key={`${item.display}-${itemIdx}`} />;\n })}\n </Flex>\n </AccordionPanel>\n </AccordionItem>\n);\n\ninterface MobileNavLinksProps {\n sections: MobileNavLinksContentProps[];\n}\n\nexport const MobileNavLinks: FunctionComponent<MobileNavLinksProps> = ({\n sections,\n}) => (\n <Accordion\n allowMultiple\n allowToggle\n defaultIndex={sections.map((_, i) => i)}\n w=\"full\"\n >\n {sections.map((section, idx) => (\n <MobileNavLinksContent key={`section-${idx}`} {...section} />\n ))}\n </Accordion>\n);\n","import { Box, Heading } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport testIds from \"./testIds\";\n\nexport const Title: FunctionComponent = () => (\n <Heading as=\"h1\" color=\"blue.800\" data-testid={testIds.title} size=\"lg\">\n <Link to=\"/\">\n <Box as=\"span\" color=\"blue.500\">\n Construct\n </Box>{\" \"}\n Hub\n </Link>\n </Heading>\n);\n","import {\n Drawer,\n DrawerBody,\n DrawerOverlay,\n DrawerHeader,\n DrawerContent,\n DrawerCloseButton,\n Portal,\n Stack,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { GETTING_STARTED, DOCUMENTATION } from \"../../constants/links\";\nimport { MobileNavLinks } from \"./MobileNavLinks\";\nimport testIds from \"./testIds\";\nimport { Title } from \"./Title\";\nexport interface MobileNavProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport const MobileNav: FunctionComponent<MobileNavProps> = ({\n isOpen,\n onClose,\n}) => {\n return (\n <Portal>\n <Drawer isOpen={isOpen} onClose={onClose} placement=\"left\" size=\"xs\">\n <DrawerOverlay />\n\n <DrawerContent data-testid={testIds.mobileNav}>\n <DrawerCloseButton />\n\n <DrawerHeader display=\"flex\" justifyContent=\"start\">\n <Title />\n </DrawerHeader>\n\n <DrawerBody>\n <Stack align=\"start\" justify=\"start\" spacing={4}>\n <MobileNavLinks\n sections={[\n {\n title: \"Getting Started\",\n items: GETTING_STARTED,\n testId: testIds.gettingStartedMenu,\n },\n {\n title: \"Documentation\",\n items: DOCUMENTATION,\n testId: testIds.documentationMenu,\n },\n ]}\n />\n </Stack>\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </Portal>\n );\n};\n","import { HamburgerIcon } from \"@chakra-ui/icons\";\nimport { IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { MobileNav } from \"./MobileNav\";\nimport testIds from \"./testIds\";\n\nexport const NavButton: FunctionComponent = () => {\n const nav = useDisclosure();\n\n return (\n <>\n <IconButton\n aria-label=\"Navigation Menu\"\n borderRadius=\"md\"\n data-testid={testIds.navOpen}\n display={{ md: \"none\" }}\n icon={<HamburgerIcon />}\n onClick={nav.onOpen}\n variant=\"ghost\"\n />\n <MobileNav {...nav} />\n </>\n );\n};\n","import { Box, Grid, GridItem, GridItemProps } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { DocumentationDropdown } from \"./DocumentationDropdown\";\nimport { GettingStartedDropdown } from \"./GettingStartedDropdown\";\nimport { HeaderSearch } from \"./HeaderSearch\";\nimport { NavButton } from \"./NavButton\";\nimport testIds from \"./testIds\";\nimport { Title } from \"./Title\";\n\nconst HeaderItem: FunctionComponent<GridItemProps> = (props) => (\n <GridItem align=\"center\" justify=\"center\" rowStart={1} {...props} />\n);\n\nexport const Header: FunctionComponent = () => {\n return (\n <Grid\n alignItems=\"center\"\n as=\"header\"\n bg=\"white\"\n boxShadow=\"base\"\n data-testid={testIds.container}\n gap={6}\n gridTemplateColumns={{\n base: \"1fr max-content 1fr\",\n md: \"max-content minmax(12rem, 31rem) auto\",\n }}\n gridTemplateRows=\"1fr\"\n maxW=\"100vw\"\n position=\"sticky\"\n px={4}\n py={4}\n top={0}\n w=\"100%\"\n zIndex=\"sticky\"\n >\n {/* Logo / Header */}\n <HeaderItem\n colStart={{ base: 2, md: 1 }}\n justifySelf={{ base: \"center\", md: \"start\" }}\n >\n <Title />\n </HeaderItem>\n\n {/* Search Trigger */}\n <HeaderItem\n colStart={{ base: 3, md: 2 }}\n justifySelf={{ base: \"end\", md: \"stretch\" }}\n >\n <HeaderSearch />\n </HeaderItem>\n\n {/* Navigation */}\n <HeaderItem\n colStart={{ base: 1, md: 3 }}\n justifySelf={{ base: \"start\", md: \"end\" }}\n >\n <Grid\n display={{ base: \"none\", md: \"grid\" }}\n gap={4}\n gridTemplateColumns=\"1fr 1fr\"\n gridTemplateRows=\"1fr\"\n placeItems=\"center\"\n w=\"100%\"\n >\n <Box>\n <GettingStartedDropdown />\n </Box>\n <Box>\n <DocumentationDropdown />\n </Box>\n </Grid>\n <NavButton />\n </HeaderItem>\n </Grid>\n );\n};\n","import { FunctionComponent, LazyExoticComponent, Suspense } from \"react\";\nimport { Route, RouteProps } from \"react-router-dom\";\nimport { PageLoader } from \"../PageLoader\";\n\nexport interface LazyRouteProps extends RouteProps {\n component: LazyExoticComponent<FunctionComponent>;\n}\n\n/**\n * A wrapper around the react-router-dom <Route /> which takes in a lazy loaded component\n * and wraps it with <Suspense /> and a generic <PageLoader /> fallback\n *\n * Usage:\n * ```tsx\n * import { lazy } from \"react\";\n *\n * const MyComponent = lazy(() => import(\"./path/to/MyComponent\"));\n *\n * <LazyRoute path=\"/\" component={MyComponent} />\n *\n * ```\n */\nexport const LazyRoute: FunctionComponent<LazyRouteProps> = ({\n component: Component,\n ...routeProps\n}) => (\n <Route {...routeProps}>\n <Suspense fallback={<PageLoader />}>\n <Component />\n </Suspense>\n </Route>\n);\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent, lazy } from \"react\";\nimport { Switch, useLocation } from \"react-router-dom\";\nimport { DevPreviewBanner } from \"./components/DevPreviewBanner\";\nimport { Footer } from \"./components/Footer\";\nimport { Header } from \"./components/Header\";\nimport { LazyRoute } from \"./components/LazyRoute\";\nimport { ROUTES } from \"./constants/url\";\n\nconst FAQ = lazy(() => import(\"./views/FAQ\"));\nconst Home = lazy(() => import(\"./views/Home\"));\nconst NotFound = lazy(() => import(\"./views/NotFound\"));\nconst Packages = lazy(() => import(\"./views/Packages\"));\nconst SearchRedesign = lazy(() => import(\"./views/SearchRedesign\"));\nconst SiteTerms = lazy(() => import(\"./views/SiteTerms\"));\n\nexport const App: FunctionComponent = () => {\n const { pathname } = useLocation();\n\n const showBanner = pathname !== \"/\";\n\n return (\n <Grid\n as=\"main\"\n bg=\"bgPrimary\"\n gridTemplateColumns=\"1fr\"\n gridTemplateRows=\"auto auto 1fr auto\"\n h=\"100%\"\n maxW=\"100%\"\n minH=\"100vh\"\n >\n <Header />\n {showBanner ? <DevPreviewBanner /> : <div />}\n <Switch>\n <LazyRoute component={FAQ} exact path={ROUTES.FAQ} />\n <LazyRoute component={Home} exact path={ROUTES.HOME} />\n <LazyRoute component={SiteTerms} exact path={ROUTES.SITE_TERMS} />\n <LazyRoute component={Packages} path={ROUTES.PACKAGES} />\n <LazyRoute component={SearchRedesign} exact path={ROUTES.SEARCH} />\n <LazyRoute component={NotFound} path=\"*\" />\n </Switch>\n <Footer />\n </Grid>\n );\n};\n","import { theme } from \"@chakra-ui/react\";\n\nconst {\n components: { Code: base },\n} = theme;\n\nexport const Code = {\n ...base,\n variants: {\n ...base.variants,\n \"code-block\": {\n ...base.variants.subtle,\n display: \"block\",\n whiteSpace: \"pre\",\n },\n },\n};\n","// TODO: Figure out why this does nothing\nexport const Divider = {\n defaultProps: {\n borderColor: \"rgba(0, 124, 253, 0.15)\",\n },\n};\n","import type { tagAnatomy } from \"@chakra-ui/anatomy\";\nimport { theme } from \"@chakra-ui/react\";\nimport {\n PartsStyleInterpolation,\n StyleFunctionProps,\n transparentize,\n} from \"@chakra-ui/theme-tools\";\nimport { PackageTagConfig } from \"../../api/config\";\n\nconst createVariant =\n (\n variant: PartsStyleInterpolation<typeof tagAnatomy>,\n overrides: Record<string, any>\n ) =>\n (props: StyleFunctionProps) => {\n const varBase = typeof variant === \"function\" ? variant(props) : variant;\n return {\n ...varBase,\n container: {\n ...varBase.container,\n ...overrides,\n },\n };\n };\n\nconst {\n components: { Tag: base },\n} = theme;\n\nexport const makeTag = (config: PackageTagConfig[]) => {\n const customVariants = config.reduce((accum, { keyword }) => {\n return keyword?.color\n ? {\n ...accum,\n [keyword.color]: createVariant(base.variants.subtle, {\n background: transparentize(keyword.color, 0.1),\n color: keyword.color,\n }),\n }\n : accum;\n }, {});\n return {\n ...base,\n baseStyle: {\n container: {\n fontWeight: \"normal\",\n },\n },\n variants: {\n ...base.variants,\n subtle: createVariant(base.variants.subtle, {\n background: \"#F2F2F2\",\n color: \"blue.800\",\n }),\n ...customVariants,\n },\n };\n};\n","import { theme } from \"@chakra-ui/react\";\nimport { PackageTagConfig } from \"../../api/config\";\nimport { Code } from \"./Code\";\nimport { Divider } from \"./Divider\";\nimport { makeTag } from \"./Tag\";\n\ninterface ComponentsConfig {\n Tag: PackageTagConfig[];\n}\n\nexport const makeComponents = (config: ComponentsConfig) => {\n return {\n ...theme.components,\n Code,\n Divider,\n Tag: makeTag(config.Tag),\n };\n};\n","import { borders } from \"./borders\";\nimport { colors } from \"./colors\";\nimport { radii } from \"./radius\";\nimport { shadows } from \"./shadows\";\nimport { sizes } from \"./sizes\";\n\nexport const foundations = {\n borders,\n colors,\n radii,\n sizes,\n shadows,\n};\n","export const borders = {\n base: \"1px solid rgba(0, 124, 253, 0.15)\",\n};\n","import { theme } from \"@chakra-ui/react\";\n\nexport const colors = {\n ...theme.colors,\n blue: {\n 50: \"#dcf3ff\",\n 100: \"#aed9ff\",\n 200: \"#7dbeff\",\n 300: \"#4aa4ff\",\n 400: \"#1a8aff\",\n 500: \"#0070e6\",\n 600: \"#0057b4\",\n 700: \"#003e82\",\n 800: \"#002551\",\n 900: \"#000d21\",\n },\n bgPrimary: \"#F8F8F8\",\n};\n","export const radii = {\n card: \"0.75rem\",\n};\n","// import { theme } from \"@chakra-ui/react\";\n\nexport const sizes = {\n container: {\n \"2xl\": \"120rem\",\n },\n};\n","export const shadows = {\n base: \"0px 4px 15px rgba(40, 132, 178, 0.15)\",\n};\n","import { extendTheme } from \"@chakra-ui/react\";\nimport { Config } from \"../api/config\";\nimport { makeComponents } from \"./components\";\nimport { foundations } from \"./foundations\";\n\nexport const makeTheme = (config: Config) => {\n const componentsConfig = {\n Tag: config.packageTags ?? [],\n };\n\n return extendTheme({\n ...foundations,\n components: makeComponents(componentsConfig),\n });\n};\n","import { ChakraProvider } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PageLoader } from \"../components/PageLoader\";\nimport { makeTheme } from \"../theme\";\nimport { useConfig } from \"./Config\";\n\nexport const Theme: FunctionComponent = ({ children }) => {\n const { loading, data } = useConfig();\n return loading ? (\n <PageLoader />\n ) : (\n <ChakraProvider resetCSS theme={makeTheme(data!)}>\n {children}\n </ChakraProvider>\n );\n};\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://cra.link/PWA\n\n// [::1] is the IPv6 localhost address.\n// 127.0.0.0/8 are considered localhost for IPv4.\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n window.location.hostname === \"[::1]\" ||\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nconst registerValidSW = (swUrl: string, config?: Config) => {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n \"New content is available and will be used when all \" +\n \"tabs for this page are closed. See https://cra.link/PWA.\"\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log(\"Content is cached for offline use.\");\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error(\"Error during service worker registration:\", error);\n });\n};\n\nconst checkValidServiceWorker = (swUrl: string, config?: Config) => {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { \"Service-Worker\": \"script\" },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\");\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf(\"javascript\") === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n void navigator.serviceWorker.ready.then((registration) => {\n void registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n \"No internet connection found. App is running in offline mode.\"\n );\n });\n};\n\nexport const register = (config?: Config) => {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener(\"load\", () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n void navigator.serviceWorker.ready.then(() => {\n console.log(\n \"This web app is being served cache-first by a service worker. To learn more, visit https://cra.link/PWA\"\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n};\n\nexport const unregister = () => {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n void registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n};\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { BrowserRouter as Router } from \"react-router-dom\";\nimport \"./index.css\";\nimport { App } from \"./App\";\nimport { AnalyticsProvider } from \"./contexts/Analytics\";\nimport { CatalogProvider } from \"./contexts/Catalog\";\nimport { ConfigProvider } from \"./contexts/Config\";\nimport { ExternalLinkWarningProvider } from \"./contexts/ExternalLinkWarning\";\nimport { SearchProvider } from \"./contexts/Search\";\nimport { ShortbreadProvider } from \"./contexts/Shortbread\";\nimport { StatsProvider } from \"./contexts/Stats\";\nimport { Theme } from \"./contexts/Theme\";\nimport { unregister } from \"./register-service-worker\";\nimport { reportWebVitals } from \"./reportWebVitals\";\n\nReactDOM.render(\n <React.StrictMode>\n <Router>\n <ShortbreadProvider>\n <AnalyticsProvider>\n <ConfigProvider>\n <CatalogProvider>\n <StatsProvider>\n <SearchProvider>\n <Theme>\n <ExternalLinkWarningProvider>\n <App />\n </ExternalLinkWarningProvider>\n </Theme>\n </SearchProvider>\n </StatsProvider>\n </CatalogProvider>\n </ConfigProvider>\n </AnalyticsProvider>\n </ShortbreadProvider>\n </Router>\n </React.StrictMode>,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n\n// Disable any registered service workers (previously enabled for PWA functionality).\n//\n// This is disabled due to caching issues where users are not receiving\n// the latest versions of content on the first load of the website. This\n// occurs because content is being served from the service worker cache.\n//\n// This should probably not be re-enabled unless we have a mechanism\n// in place to automatically content when new versions of the website are\n// available.\nunregister();\n","import { ExternalLinkIcon } from \"@chakra-ui/icons\";\nimport { forwardRef, Link, LinkProps } from \"@chakra-ui/react\";\nimport { useExternalLinkWarning } from \"../../contexts/ExternalLinkWarning\";\n\nexport interface ExternalLinkProps extends LinkProps {\n /**\n * Shows an external link icon. `true` by default\n */\n hasIcon?: boolean;\n /**\n * Prompts the user to confirm leaving the site. `true` by default\n */\n hasWarning?: boolean;\n /**\n * Adds the nofollow annotation to the anchor's rel attribute\n */\n noFollow?: boolean;\n}\n\nexport const ExternalLink = forwardRef<ExternalLinkProps, \"a\">(\n (\n {\n children,\n hasIcon = true,\n hasWarning = true,\n href,\n onClick,\n noFollow,\n ...props\n },\n ref\n ) => {\n const withPrompt = useExternalLinkWarning();\n\n let rel = \"noopener noreferrer\";\n\n if (hasWarning || noFollow) {\n rel += \" nofollow\";\n }\n\n return (\n <Link\n color=\"blue.500\"\n href={href}\n isExternal\n onClick={hasWarning ? withPrompt({ href, onClick }) : onClick}\n ref={ref}\n rel={rel}\n {...props}\n >\n {children} {hasIcon && <ExternalLinkIcon mb={1} ml={2} />}\n </Link>\n );\n }\n);\n\nExternalLink.displayName = \"ExternalLink\";\n","import type { IMenuItems } from \"../components/NavPopover\";\n\nexport const CONSTRUCT_HUB_REPO_URL =\n \"https://github.com/cdklabs/construct-hub\";\n\nexport const GETTING_STARTED: IMenuItems = [\n { display: \"FAQ\", isNavLink: true, url: \"/faq\" },\n {\n display: \"Construct Hub on GitHub\",\n url: CONSTRUCT_HUB_REPO_URL,\n },\n {\n display: \"Issues on GitHub\",\n url: `${CONSTRUCT_HUB_REPO_URL}/issues`,\n },\n];\n\nexport const DOCUMENTATION: IMenuItems = [\n {\n display: \"AWS CDK\",\n links: [\n { display: \"Home\", url: \"https://aws.amazon.com/cdk/\" },\n {\n display: \"Getting Started\",\n url: \"https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html\",\n },\n { display: \"Workshop\", url: \"https://cdkworkshop.com/\" },\n {\n display: \"Best Practices\",\n url: \"https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk\",\n },\n ],\n },\n {\n display: \"CDK for Terraform\",\n links: [\n {\n display: \"Getting Started\",\n url: \"https://learn.hashicorp.com/tutorials/terraform/cdktf\",\n },\n {\n display: \"Tutorials\",\n url: \"https://learn.hashicorp.com/collections/terraform/cdktf\",\n },\n ],\n },\n {\n display: \"CDK for Kubernetes\",\n links: [\n { display: \"Home\", url: \"https://cdk8s.io\" },\n {\n display: \"Getting Started\",\n url: \"https://cdk8s.io/docs/latest/getting-started\",\n },\n { display: \"Documentation\", url: \"https://cdk8s.io/docs/latest\" },\n {\n display: \"API Reference\",\n url: \"https://cdk8s.io/docs/latest/reference/index.html\",\n },\n ],\n },\n {\n display: \"Community\",\n links: [\n {\n display: \"Slack\",\n url: \"https://join.slack.com/t/cdk-dev/shared_invite/zt-mso6p56d-qJp7SOTBvMaQuDrx7R2wHg\",\n },\n { display: \"Community Hub\", url: \"https://cdk.dev\" },\n ],\n },\n];\n","// These are mapped to user-readable values to keep URL Params clean for users\nexport enum CatalogSearchSort {\n NameAsc = \"asc\",\n NameDesc = \"desc\",\n PublishDateAsc = \"oldest\",\n PublishDateDesc = \"newest\",\n DownloadsAsc = \"downloadsAsc\",\n DownloadsDesc = \"downloadsDesc\",\n}\n","type TestIds<T extends Readonly<string[]>> = {\n [key in T[number]]: string;\n};\n\n/**\n * A helper to create scoped test ids across components which can be re-used\n * in e2e and unit tests.\n */\nexport const createTestIds = <T extends Readonly<string[]>>(\n scope: string,\n ids: T\n): TestIds<T> =>\n ids.reduce<Record<string, string>>((acc, curr) => {\n acc[curr] = `${scope}-${curr}`;\n return acc;\n }, {}) as TestIds<T>;\n","export enum CDKType {\n awscdk = \"aws-cdk\",\n cdktf = \"cdktf\",\n cdk8s = \"cdk8s\",\n}\n\nexport const CDKTYPE_NAME_MAP = {\n [CDKType.awscdk]: \"AWS CDK\",\n [CDKType.cdktf]: \"CDKtf\",\n [CDKType.cdk8s]: \"CDK8s\",\n};\n\nexport const CDKTYPE_RENDER_MAP = {\n [CDKType.awscdk]: {\n name: CDKTYPE_NAME_MAP[CDKType.awscdk],\n imgsrc: \"/assets/awscdk-icon.png\",\n },\n [CDKType.cdk8s]: {\n name: CDKTYPE_NAME_MAP[CDKType.cdk8s],\n imgsrc: \"/assets/cdk8s-icon.png\",\n },\n [CDKType.cdktf]: {\n name: CDKTYPE_NAME_MAP[CDKType.cdktf],\n imgsrc: \"/assets/cdktf-icon.png\",\n },\n};\n","import { CatalogSearchFilters, ExtendedCatalogPackage } from \".\";\nimport { Language } from \"../../constants/languages\";\nimport { CatalogSearchSort } from \"./constants\";\n\ntype SortFunction = (\n p1: ExtendedCatalogPackage,\n p2: ExtendedCatalogPackage\n) => number;\n\ntype FilterFunctionBuilder<T> = (\n filter: T\n) => undefined | ((pkg: ExtendedCatalogPackage) => boolean);\n\nconst getDateSort =\n (isAscending: boolean): SortFunction =>\n (p1, p2) => {\n const d1 = new Date(p1.metadata.date);\n const d2 = new Date(p2.metadata.date);\n if (d1 === d2) {\n return 0;\n }\n\n if (isAscending) {\n return d2 < d1 ? 1 : -1;\n }\n\n return d1 < d2 ? 1 : -1;\n };\n\nconst getStrSort = (isAscending: boolean): SortFunction => {\n return (p1, p2) => p1.name.localeCompare(p2.name) * (isAscending ? 1 : -1);\n};\n\nconst getDownloadsSort = (isAscending: boolean): SortFunction => {\n return (p1, p2) => {\n if (p1.downloads !== p2.downloads) {\n return (p1.downloads - p2.downloads) * (isAscending ? 1 : -1);\n } else {\n // break ties by alphabetical\n return getStrSort(!isAscending)(p1, p2);\n }\n };\n};\n\nconst getLanguageFilter: FilterFunctionBuilder<\n CatalogSearchFilters[\"language\"]\n> = (language) => {\n if (!(language && language !== Language.TypeScript)) {\n return undefined;\n }\n\n return (pkg) => {\n return pkg.languages?.[language] !== undefined;\n };\n};\n\nconst getLanguagesFilter: FilterFunctionBuilder<\n CatalogSearchFilters[\"languages\"]\n> = (languages) => {\n const languageSet =\n (languages?.length ?? 0) > 0 ? new Set(languages) : undefined;\n\n if (!languageSet || languageSet.has(Language.TypeScript)) {\n return undefined;\n }\n\n return (pkg) => {\n const isMatched = Object.keys(pkg.languages ?? {}).some((lang) =>\n languageSet.has(lang as Language)\n );\n\n return isMatched;\n };\n};\n\nconst getCDKTypeFilter: FilterFunctionBuilder<CatalogSearchFilters[\"cdkType\"]> =\n (cdkType) => {\n if (!cdkType) return undefined;\n return (pkg) => pkg.metadata?.constructFramework?.name === cdkType;\n };\n\nconst getCDKMajorFilter: FilterFunctionBuilder<\n CatalogSearchFilters[\"cdkMajor\"]\n> = (cdkMajor) => {\n if (typeof cdkMajor !== \"number\") return undefined;\n return (pkg) => pkg.metadata?.constructFramework?.majorVersion === cdkMajor;\n};\n\nconst getTagsFilter: FilterFunctionBuilder<CatalogSearchFilters[\"tags\"]> = (\n tags\n) => {\n if (!tags || !tags.length) {\n return undefined;\n }\n\n return (pkg) => {\n return (\n pkg.metadata?.packageTags?.some((tag) => {\n return tags.includes(tag.id);\n }) ?? false\n );\n };\n};\n\nexport const SORT_FUNCTIONS: Record<CatalogSearchSort, SortFunction> = {\n [CatalogSearchSort.NameAsc]: getStrSort(true),\n [CatalogSearchSort.NameDesc]: getStrSort(false),\n [CatalogSearchSort.PublishDateAsc]: getDateSort(true),\n [CatalogSearchSort.PublishDateDesc]: getDateSort(false),\n [CatalogSearchSort.DownloadsAsc]: getDownloadsSort(true),\n [CatalogSearchSort.DownloadsDesc]: getDownloadsSort(false),\n};\n\nexport const FILTER_FUNCTIONS: {\n [key in keyof Required<CatalogSearchFilters>]: FilterFunctionBuilder<\n CatalogSearchFilters[key]\n >;\n} = {\n cdkType: getCDKTypeFilter,\n cdkMajor: getCDKMajorFilter,\n language: getLanguageFilter,\n languages: getLanguagesFilter,\n tags: getTagsFilter,\n};\n","import { Link as ChakraLink, PropsOf } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Link as RouterLink } from \"react-router-dom\";\n\nexport type NavLinkProps = PropsOf<typeof ChakraLink> &\n PropsOf<typeof RouterLink>;\n\nexport const NavLink: FunctionComponent<NavLinkProps> = (props) => {\n return <ChakraLink as={RouterLink} {...props} />;\n};\n","import { Language } from \"../../constants/languages\";\nimport { API_PATHS } from \"../../constants/url\";\nimport { Metadata } from \"./metadata\";\n\nexport interface Author {\n readonly name: string;\n readonly url: string;\n}\n\nexport interface CatalogPackage {\n name: string;\n languages?: Partial<Record<Language, Record<string, unknown>>>;\n version: string;\n description: string;\n author: Author | string;\n keywords?: string[];\n metadata: Metadata;\n}\n\nexport interface Packages {\n packages: CatalogPackage[];\n}\n\n/**\n * Fetch the catalog of all packages from the backend.\n */\nexport const fetchPackages = async (): Promise<Packages> => {\n const response = await fetch(API_PATHS.CATALOG_SUFFIX);\n\n if (!response.ok) {\n console.error(response.statusText);\n throw new Error(`Failed fetching packages index: ${response.statusText}`);\n }\n\n return response.json();\n};\n","import { createContext, FunctionComponent, useContext, useEffect } from \"react\";\nimport { fetchPackages, Packages } from \"../../api/package/packages\";\nimport { useRequest, UseRequestResponse } from \"../../hooks/useRequest\";\n\nconst CatalogContext = createContext<UseRequestResponse<Packages>>({\n loading: false,\n data: undefined,\n error: undefined,\n});\n\nexport const useCatalog = () => useContext(CatalogContext);\n\nexport const CatalogProvider: FunctionComponent = ({ children }) => {\n const [requestPackages, catalogResponse] = useRequest(fetchPackages);\n\n useEffect(() => {\n void requestPackages();\n }, [requestPackages]);\n\n return (\n <CatalogContext.Provider value={catalogResponse}>\n {children}\n </CatalogContext.Provider>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"searchBar\", [\n \"input\",\n \"searchIcon\",\n \"searchButton\",\n \"overlay\",\n \"suggestionsList\",\n \"suggestion\",\n] as const);\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport {\n Input,\n InputGroup,\n InputLeftElement,\n InputProps,\n InputRightElement,\n useDisclosure,\n Button,\n} from \"@chakra-ui/react\";\nimport {\n useContext,\n createContext,\n FunctionComponent,\n useEffect,\n useRef,\n ChangeEventHandler,\n FormEventHandler,\n} from \"react\";\nimport { useCatalog } from \"../../contexts/Catalog\";\nimport { useCatalogSearch } from \"../../hooks/useCatalogSearch\";\nimport { Form } from \"../Form\";\nimport testIds from \"./testIds\";\n\nexport interface SearchBarProps\n extends Omit<InputProps, \"onChange\" | \"value\" | \"onSubmit\"> {\n defaultQuery?: string;\n hasButton?: boolean;\n value?: string;\n onChange?: ChangeEventHandler<HTMLInputElement>;\n onSubmit?: FormEventHandler<HTMLFormElement>;\n}\n\nconst SearchBarState = createContext<\n { query: string; isOpen: boolean } | undefined\n>(undefined);\n\nexport const useSearchBarState = () => {\n const state = useContext(SearchBarState);\n\n if (!state) {\n throw new Error(\"This component must be a child of a <SearchBar />\");\n }\n\n return state;\n};\n\n/**\n * Exposes a Search component that provides a default search implementation. This behavior can be overridden by defining `value`, `onChange`, and `onSubmit` props.\n * Additionally, it's behavior can be extended with `<SearchOverlay />` and `<SearchSuggestions />`\n * ```tsx\n * // Minimal use-case\n * import { SearchBar } from \"components/SearchBar\";\n * <SearchBar />\n *\n * // With extended behavior\n * import { SearchBar, SearchOverlay, SearchSuggestions } from \"components/SearchBar\";\n *\n * <SearchBar>\n * <SearchOverlay />\n * <SearchSuggestions />\n * </SearchBar>\n * ```\n */\nexport const SearchBar: FunctionComponent<SearchBarProps> = ({\n children,\n hasButton,\n onSubmit,\n value,\n onChange,\n ...inputProps\n}) => {\n const disclosure = useDisclosure();\n const inputRef = useRef<HTMLInputElement | null>(null);\n const searchAPI = useCatalogSearch();\n const catalog = useCatalog();\n\n const roundedCatalogLength =\n Math.round((catalog?.data?.packages?.length ?? 0) / 100) * 100;\n\n const placeholder = `Search ${\n roundedCatalogLength > 0 ? `${roundedCatalogLength}+ ` : \"\"\n }construct libraries`;\n\n useEffect(() => {\n // Handle closing disclosures when user clicks outside of input.\n // We cannot rely on the input's onBlur due to left & right elements (icon / button) triggering it\n const clickListener = (e: MouseEvent) => {\n if (!inputRef.current || !e.target) {\n return;\n }\n\n if (!inputRef.current.contains(e.target as Node)) {\n disclosure.onClose();\n }\n };\n\n // Closes disclosures when Esc key is pressed\n const kbdListener = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n inputRef.current?.blur?.();\n disclosure.onClose();\n }\n };\n\n window.addEventListener(\"keyup\", kbdListener);\n window.addEventListener(\"click\", clickListener);\n\n return () => {\n window.removeEventListener(\"keyup\", kbdListener);\n window.removeEventListener(\"click\", clickListener);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <SearchBarState.Provider\n value={{ query: value ?? searchAPI.query, isOpen: disclosure.isOpen }}\n >\n <Form\n color=\"initial\"\n onSubmit={onSubmit ?? searchAPI.onSubmit}\n pos=\"relative\"\n >\n <InputGroup pos=\"relative\" zIndex={disclosure.isOpen ? 3 : \"initial\"}>\n {hasButton && (\n <InputLeftElement>\n <SearchIcon data-testid={testIds.searchIcon} />\n </InputLeftElement>\n )}\n\n <Input\n _focus={{\n boxShadow: \"base\",\n borderColor: \"inherit\", // To avoid taking @chakra's border color on focus\n }}\n bg=\"white\"\n boxShadow={disclosure.isOpen ? \"base\" : \"none\"}\n data-testid={testIds.input}\n onChange={onChange ?? searchAPI.onQueryChange}\n onFocus={disclosure.onOpen}\n placeholder={placeholder}\n ref={inputRef}\n value={value ?? searchAPI.query}\n {...inputProps}\n />\n\n {hasButton ? (\n <InputRightElement\n display={{ base: \"none\", md: \"initial\" }}\n w=\"9rem\"\n >\n <Button\n borderLeftRadius=\"0\"\n colorScheme=\"blue\"\n data-testid={testIds.searchButton}\n type=\"submit\"\n >\n Find Constructs\n </Button>\n </InputRightElement>\n ) : (\n <InputRightElement>\n <SearchIcon data-testid={testIds.searchIcon} />\n </InputRightElement>\n )}\n </InputGroup>\n\n {children}\n </Form>\n </SearchBarState.Provider>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { useSearchBarState } from \"./SearchBar\";\nimport testIds from \"./testIds\";\n\n/**\n * An overlay component which can be used to extend the `<SearchBar />` presentational behavior\n * ```tsx\n * import { SearchBar, SearchOverlay } from \"components/SearchBar\";\n *\n * <SearchBar>\n * <SearchOverlay />\n * </SearchBar>\n * ```\n */\nexport const SearchOverlay = forwardRef<BoxProps, \"div\">((props, ref) => {\n const { isOpen } = useSearchBarState();\n\n return (\n <Box\n bg=\"gray.700\"\n data-testid={testIds.overlay}\n display={isOpen ? \"initial\" : \"none\"}\n inset=\"0\"\n opacity=\"0.5\"\n pos=\"fixed\"\n ref={ref}\n zIndex=\"1\"\n {...props}\n />\n );\n});\n","import {\n UnorderedList,\n ListProps,\n forwardRef,\n Divider,\n Stack,\n Text,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { ExtendedCatalogPackage } from \"../../api/catalog-search\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { useDebounce } from \"../../hooks/useDebounce\";\nimport { getPackagePath } from \"../../util/url\";\nimport { Card, CardProps } from \"../Card\";\nimport { CDKTypeIcon } from \"../CDKType\";\nimport { SearchItem } from \"../SearchItem\";\nimport { useSearchBarState } from \"./SearchBar\";\nimport testIds from \"./testIds\";\n\n/**\n * A suggestion component which can be used to extend the `<SearchBar />` behavior with a list of\n * recommended results\n * ```tsx\n * import { SearchBar, SearchSuggestions } from \"components/SearchBar\";\n *\n * <SearchBar>\n * <SearchSuggestions />\n * </SearchBar>\n * ```\n */\nexport const SearchSuggestions: FunctionComponent = forwardRef<\n CardProps & ListProps,\n \"ul\"\n>((props, ref) => {\n const { query, isOpen } = useSearchBarState();\n const debouncedQuery = useDebounce(query);\n\n const { push } = useHistory();\n\n const { page: recommendations } = useCatalogResults({\n limit: 5,\n offset: 0,\n query: debouncedQuery,\n });\n\n if (!isOpen || recommendations.length < 1 || !debouncedQuery) {\n return null;\n }\n\n return (\n <Card\n as={UnorderedList}\n data-testid={testIds.suggestionsList}\n left={0}\n ml={0}\n pos=\"absolute\"\n pt={10}\n px={0}\n ref={ref}\n right={0}\n top={0}\n zIndex={2}\n {...props}\n >\n {recommendations.map((pkg: ExtendedCatalogPackage, i) => {\n const navigate = () => push(getPackagePath(pkg));\n const constructFramework = pkg.metadata?.constructFramework ?? {};\n const hasIcon = Boolean(constructFramework.name);\n\n return (\n <>\n {i > 0 && <Divider mx={4} w=\"auto\" />}\n <SearchItem\n data-testid={testIds.suggestion}\n key={pkg.id}\n name={\n <Stack align=\"center\" direction=\"row\" spacing={4}>\n <CDKTypeIcon {...constructFramework} />\n <Text ml={hasIcon ? 0 : 9}>{pkg.name}</Text>\n </Stack>\n }\n onClick={navigate}\n py={2}\n textAlign=\"left\"\n />\n </>\n );\n })}\n </Card>\n );\n});\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport const PageLoader: FunctionComponent = () => (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n);\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\n// Possible utility types for re-use\ntype PromiseFn = (...args: any[]) => Promise<any>;\ntype Awaited<T> = T extends PromiseLike<infer U> ? Awaited<U> : T;\ntype AwaitedReturn<T extends PromiseFn> = Awaited<ReturnType<T>>;\n\nexport interface UseRequestOptions<T> {\n initialValue?: T;\n onError?: (err: Error) => void;\n onSuccess?: (res: T) => void;\n}\n\nexport interface UseRequestResponse<T> {\n loading: boolean;\n error: Error | undefined;\n data: T | undefined;\n}\n\nexport type UseRequestReturn<T extends (...args: any[]) => Promise<T>> = [\n (...args: Parameters<T>) => Promise<void>,\n UseRequestResponse<AwaitedReturn<T>>\n];\n\n/**\n * Provides an API to statefully interact with promises. This hook\n * prevents state updates if promise has not resolved before component unmounts.\n * It will return a tuple with a request() function, and an object representing the state\n */\nexport const useRequest = <T extends PromiseFn>(\n requestFn: T,\n options: UseRequestOptions<AwaitedReturn<T>> = {}\n): UseRequestReturn<T> => {\n const { initialValue, onSuccess, onError } = options;\n\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<AwaitedReturn<T> | undefined>(initialValue);\n const [error, setError] = useState<Error | undefined>();\n\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const statefulFetch = useCallback(\n async (...args: Parameters<T>): Promise<void> => {\n if (!mountedRef.current) return;\n\n setLoading(true);\n setError(undefined);\n\n try {\n const res = await requestFn(...args);\n onSuccess?.(res);\n\n if (mountedRef.current) {\n setData(res);\n setLoading(false);\n }\n } catch (e: any) {\n console.error(e);\n onError?.(e);\n\n if (mountedRef.current) {\n setData(initialValue);\n setError(e);\n setLoading(false);\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onError, onSuccess]\n );\n\n return useMemo(\n () => [\n statefulFetch,\n {\n data,\n loading,\n error,\n },\n ],\n [statefulFetch, data, loading, error]\n );\n};\n","import { CatalogSearchSort } from \"../api/catalog-search/constants\";\nimport { CDKType } from \"../constants/constructs\";\nimport { Language } from \"../constants/languages\";\nimport { ROUTES, QUERY_PARAMS } from \"../constants/url\";\n\nconst gitSSHRegex = new RegExp(\n /git@github\\.com:([a-zA-Z-]+)+\\/?([a-zA-Z-]+)*(\\.git)?/\n);\n\nexport const getRepoUrlAndHost = (\n repoUrl: string\n): { url: string; hostname: string } | undefined => {\n try {\n let url = repoUrl;\n\n const sshUrl = repoUrl.match(gitSSHRegex);\n\n if (sshUrl) {\n const [, author, repo] = sshUrl;\n\n url = `https://github.com/${author}/${repo}`;\n }\n\n return {\n hostname: new URL(url).hostname,\n url,\n };\n } catch {\n // Invalid URL, return undefined as a signal that we should not display it\n return undefined;\n }\n};\n\nexport type SearchParamsObject = Record<\n string,\n string | number | undefined | null\n>;\n\nexport const createURLSearchParams = (\n params: SearchParamsObject,\n base?: string\n) => {\n const searchParams = new URLSearchParams(base);\n\n Object.entries(params)\n .filter(([, v]) => v != null)\n .forEach(([k, v]) => {\n searchParams.set(k, `${v}`);\n });\n\n return searchParams.toString();\n};\n\nexport const createURL = (base: string, params?: SearchParamsObject) => {\n let url = base;\n\n if (params) {\n const search = createURLSearchParams(params);\n\n if (search) {\n url += `?${search}`;\n }\n }\n\n return url;\n};\n\nexport const getSearchPath = ({\n cdkMajor,\n cdkType,\n query,\n offset,\n language,\n languages,\n sort,\n tags,\n}: {\n cdkMajor?: string | number;\n query?: string;\n offset?: string | number;\n cdkType?: CDKType;\n language?: Language;\n languages?: Language[];\n sort?: CatalogSearchSort;\n tags?: string[];\n}) =>\n createURL(ROUTES.SEARCH, {\n [QUERY_PARAMS.SEARCH_QUERY]: query,\n [QUERY_PARAMS.CDK_TYPE]: cdkType,\n [QUERY_PARAMS.CDK_MAJOR]: cdkMajor,\n [QUERY_PARAMS.LANGUAGE]: language,\n [QUERY_PARAMS.LANGUAGES]: languages?.length ? languages.join(\",\") : null,\n [QUERY_PARAMS.SORT]: sort,\n [QUERY_PARAMS.OFFSET]: offset ?? 0,\n [QUERY_PARAMS.TAGS]: tags?.length ? tags.join(\",\") : null,\n });\n\nexport const getPackagePath = ({\n name,\n version,\n language,\n submodule,\n}: {\n name: string;\n version: string;\n language?: Language;\n submodule?: string;\n}) =>\n createURL(`${ROUTES.PACKAGES}/${name}/v/${version}`, {\n [QUERY_PARAMS.SUBMODULE]: submodule,\n [QUERY_PARAMS.LANGUAGE]: language,\n });\n","import { API_PATHS } from \"../../constants/url\";\n\nconst NOT_FOUND = \"NOT_FOUND\";\n\n/**\n * Download stats for all packages, indexed by npm package name.\n */\nexport interface PackageStats {\n readonly updated: string;\n readonly packages: { [key: string]: PackageStatsEntry };\n}\n\n/**\n * Download stats for a single package.\n */\nexport interface PackageStatsEntry {\n readonly downloads?: { npm: number };\n}\n\nconst defaultStats = { packages: {}, updated: NOT_FOUND };\n\nexport const fetchStats = async (): Promise<PackageStats> => {\n const response = await fetch(API_PATHS.STATS);\n\n if (!response.ok) {\n console.error(\"Could not retrieve package stats. Using empty stats.\");\n return defaultStats;\n }\n\n return response.json().catch((err) => {\n console.error(err);\n console.error(\"Error in package stats response. Using empty stats.\");\n return defaultStats;\n });\n};\n","import { createContext, FunctionComponent, useContext, useEffect } from \"react\";\nimport { fetchStats, PackageStats } from \"../../api/stats\";\nimport { useRequest, UseRequestResponse } from \"../../hooks/useRequest\";\n\nconst StatsContext = createContext<UseRequestResponse<PackageStats>>({\n loading: false,\n data: undefined,\n error: undefined,\n});\n\nexport const useStats = () => useContext(StatsContext);\n\nexport const StatsProvider: FunctionComponent = ({ children }) => {\n const [requestStats, statsResponse] = useRequest(fetchStats);\n\n useEffect(() => {\n void requestStats();\n }, [requestStats]);\n\n return (\n <StatsContext.Provider value={statsResponse}>\n {children}\n </StatsContext.Provider>\n );\n};\n","import {\n createContext,\n FunctionComponent,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport { fetchConfig, Config } from \"../../api/config\";\nimport { useRequest, UseRequestResponse } from \"../../hooks/useRequest\";\n\nconst ConfigContext = createContext<UseRequestResponse<Config>>({\n loading: false,\n data: undefined,\n error: undefined,\n});\n\nconst LOCAL_CONFIG = \"construct-hub-config\";\n\nexport const useConfig = () => useContext(ConfigContext);\n\nexport const ConfigProvider: FunctionComponent = ({ children }) => {\n const [configData, setConfigData] = useState<Config | undefined>(() => {\n try {\n const stored = localStorage.getItem(LOCAL_CONFIG);\n const parsed = stored ? JSON.parse(stored) : undefined;\n return parsed;\n } catch (e) {\n console.error(e);\n }\n\n return undefined;\n });\n\n const [requestConfig, configResponse] = useRequest(fetchConfig, {\n onSuccess: (res) => {\n setConfigData(res);\n\n try {\n localStorage.setItem(LOCAL_CONFIG, JSON.stringify(res));\n } catch (e) {\n console.error(e);\n }\n },\n });\n\n useEffect(() => {\n void requestConfig();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <ConfigContext.Provider value={{ ...configResponse, data: configData }}>\n {children}\n </ConfigContext.Provider>\n );\n};\n","import lunr from \"lunr\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { CatalogPackage } from \"../package/packages\";\nimport { PackageStats } from \"../stats\";\nimport { CatalogSearchSort } from \"./constants\";\nimport { FILTER_FUNCTIONS, SORT_FUNCTIONS } from \"./util\";\n\nexport interface ExtendedCatalogPackage extends CatalogPackage {\n id: string;\n downloads: number;\n}\n\nexport interface CatalogConstructFrameworks {\n [CDKType.awscdk]: CatalogConstructFrameworkMeta;\n [CDKType.cdktf]: CatalogConstructFrameworkMeta;\n [CDKType.cdk8s]: CatalogConstructFrameworkMeta;\n}\nexport interface CatalogConstructFrameworkMeta {\n pkgCount: number;\n majorVersions: number[];\n}\n\nexport interface CatalogSearchFilters {\n /**\n * The CDK Output Type to filter by. This functionality is not yet deployed on any BE so the implementation on the client is not final.\n */\n cdkType?: CDKType;\n /**\n * The CDK Type's major version to filter by. This param is ignored if no major is set\n */\n cdkMajor?: number;\n /**\n * The target language to filter by. This parameter is only used\n * for backwards compatability with the current search page and should be\n * avoided moving forward\n * @deprecated = use languages[] instead\n */\n language?: Language;\n /**\n * A list of languages to filter by. Constructs that are not yet filtered out, will be\n * returned if they support any of the languages in this list.\n */\n languages?: Language[];\n /**\n * A list of tags to filter by.\n */\n tags?: string[];\n}\n\nexport type CatalogSearchResults = Map<string, ExtendedCatalogPackage>;\n\nexport interface CatalogSearchParams {\n query?: string;\n filters?: CatalogSearchFilters;\n sort?: CatalogSearchSort;\n}\n\nexport class CatalogSearchAPI {\n private readonly map: CatalogSearchResults;\n private index: lunr.Index;\n /**\n * A map of detected Construct Frameworks which provides a count of libraries for that framework and a set of major versions detected\n */\n public readonly constructFrameworks: CatalogConstructFrameworks;\n\n constructor(catalogData: CatalogPackage[], stats: PackageStats) {\n const catalogMap = catalogData.reduce((map, pkg) => {\n const { name, version } = pkg;\n const id = [name, version].join(\"@\");\n\n const downloads = stats.packages[name]?.downloads?.npm ?? 0;\n\n map.set(id, {\n ...pkg,\n downloads,\n id,\n });\n\n return map;\n }, new Map());\n\n this.map = this.sort(catalogMap, CatalogSearchSort.PublishDateDesc);\n\n this.constructFrameworks = this.detectConstructFrameworks();\n\n this.index = lunr(function () {\n this.ref(\"id\");\n this.field(\"name\");\n this.field(\"scope\");\n this.field(\"packageName\");\n this.field(\"description\");\n this.field(\"authorName\");\n this.field(\"authorEmail\");\n\n [...catalogMap.values()].forEach((pkg) => {\n const { author, name } = pkg;\n\n const [scope, packageName] = name.split(\"/\");\n\n if (scope && packageName) {\n pkg.scope = scope;\n pkg.packageName = packageName;\n }\n\n if (typeof author === \"string\") {\n pkg.authorName = author;\n }\n\n if (author?.name) {\n pkg.authorName = author.name;\n }\n\n if (author?.email) {\n pkg.authorEmail = author.email;\n }\n\n this.add(pkg);\n });\n });\n }\n\n /**\n * Performs a Search against the catalog and returns a Map with results ordered\n * by search score / relevance\n */\n public search(params?: {\n query?: string;\n filters?: CatalogSearchFilters;\n sort?: CatalogSearchSort;\n }): CatalogSearchResults {\n const { query, filters, sort } = params ?? {};\n\n let results = query ? this.query(query) : new Map(this.map);\n\n if (filters) {\n results = this.filter(results, filters);\n }\n\n if (sort) {\n results = this.sort(results, sort);\n }\n\n return results;\n }\n\n /**\n * This calls the index search method and returns a map of results ordered by relevance.\n */\n private query(query: string): CatalogSearchResults {\n let refs: lunr.Index.Result[] = [];\n\n try {\n refs = this.index.search(query);\n } catch (e) {\n console.error(e);\n }\n\n return refs.reduce((packages, { ref }) => {\n const pkg = this.map.get(ref);\n\n if (pkg) {\n packages.set(ref, pkg);\n }\n\n return packages;\n }, new Map() as CatalogSearchResults);\n }\n\n /**\n * Filters query results. Mutates the passed-in map\n */\n private filter(\n results: CatalogSearchResults,\n filters: CatalogSearchFilters\n ): CatalogSearchResults {\n const { cdkType, cdkMajor, language, languages, tags } = filters;\n const copiedResults = new Map(results);\n\n const filterFunctions = [\n FILTER_FUNCTIONS.cdkType(cdkType),\n // Ignore major version filter if no CDK Type is defined\n FILTER_FUNCTIONS.cdkMajor(cdkType ? cdkMajor : undefined),\n FILTER_FUNCTIONS.language(language),\n FILTER_FUNCTIONS.languages(languages),\n FILTER_FUNCTIONS.tags(tags),\n ].filter(Boolean) as ((pkg: ExtendedCatalogPackage) => boolean)[];\n\n copiedResults.forEach((result) => {\n let isFiltered = false;\n\n filterFunctions.forEach((filterFn) => {\n if (!isFiltered && !filterFn(result)) {\n isFiltered = true;\n }\n });\n\n if (isFiltered) {\n copiedResults.delete(result.id);\n }\n });\n\n return copiedResults;\n }\n\n /**\n * Sort filtered results\n */\n private sort(\n results: CatalogSearchResults,\n strategy: CatalogSearchSort\n ): CatalogSearchResults {\n if (strategy) {\n return new Map(\n [...results.entries()].sort(([, p1], [, p2]) =>\n SORT_FUNCTIONS[strategy](p1, p2)\n )\n );\n } else {\n return results;\n }\n }\n\n /**\n * Creates an object of found construct frameworks in the catalog map.\n * They are indexed by the name of the construct framework and record the count\n * of packages for that framework as well as a list of major versions.\n */\n private detectConstructFrameworks() {\n const results: CatalogConstructFrameworks = [...this.map.values()].reduce(\n (frameworks: CatalogConstructFrameworks, pkg: ExtendedCatalogPackage) => {\n const { metadata } = pkg;\n\n const frameworkName = metadata?.constructFramework?.name;\n const majorVersion = metadata?.constructFramework?.majorVersion;\n\n if (frameworkName) {\n const entry = frameworks[frameworkName];\n\n if (\n majorVersion !== undefined &&\n !entry.majorVersions.includes(majorVersion)\n ) {\n entry.majorVersions.push(majorVersion);\n }\n\n entry.pkgCount += 1;\n }\n\n return frameworks;\n },\n {\n [CDKType.awscdk]: {\n majorVersions: [],\n pkgCount: 0,\n },\n [CDKType.cdk8s]: {\n majorVersions: [],\n pkgCount: 0,\n },\n [CDKType.cdktf]: {\n majorVersions: [],\n pkgCount: 0,\n },\n }\n );\n\n return results;\n }\n}\n","import { createContext, FunctionComponent, useContext, useMemo } from \"react\";\nimport { CatalogSearchAPI } from \"../../api/catalog-search\";\nimport { PageLoader } from \"../../components/PageLoader\";\nimport { useCatalog } from \"../../contexts/Catalog\";\nimport { useStats } from \"../Stats\";\n\nconst SearchContext = createContext<CatalogSearchAPI | undefined>(undefined);\n\nexport const useSearchContext = () => useContext(SearchContext);\n\nexport const SearchProvider: FunctionComponent = ({ children }) => {\n const { data: catalogData, loading: catalogLoading } = useCatalog();\n const { data: statsData, loading: statsLoading } = useStats();\n\n const searchAPI = useMemo(() => {\n if (catalogData?.packages === undefined || catalogLoading) return;\n if (statsData === undefined || statsLoading) return;\n\n const instance = new CatalogSearchAPI(catalogData.packages, statsData);\n return instance;\n }, [catalogData, catalogLoading, statsData, statsLoading]);\n\n if (!searchAPI) {\n return <PageLoader />;\n }\n\n return (\n <SearchContext.Provider value={searchAPI}>\n {children}\n </SearchContext.Provider>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\n\nexport interface CardProps extends BoxProps {}\n\n/**\n * Implements a <Box /> with simple card styles.\n */\nexport const Card = forwardRef<CardProps, \"div\">((props, ref) => {\n return (\n <Box\n bg=\"white\"\n border=\"base\"\n borderRadius=\"card\"\n boxShadow=\"base\"\n p={2}\n ref={ref}\n {...props}\n />\n );\n});\n\nCard.displayName = \"Card\";\n","import {\n ChangeEventHandler,\n FormEventHandler,\n useCallback,\n useMemo,\n useState,\n Dispatch,\n SetStateAction,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { getSearchPath } from \"../../util/url\";\n\nexport interface UseCatalogSearchParams {\n defaultCdkMajor?: number;\n defaultCdkType?: CDKType;\n defaultQuery?: string;\n defaultLanguage?: UseCatalogSearchReturn[\"language\"];\n defaultLanguages?: UseCatalogSearchReturn[\"languages\"];\n defaultSort?: UseCatalogSearchReturn[\"sort\"];\n defaultTags?: UseCatalogSearchReturn[\"tags\"];\n}\n\ninterface NavigationParams {\n replace?: boolean;\n}\n\nexport interface UseCatalogSearchReturn {\n /**\n * The CDK Type's major version to filter by\n */\n cdkMajor?: number;\n /**\n * The CDK Type to filter by\n */\n cdkType?: CDKType;\n /**\n * The language state for this search\n */\n language?: Language;\n /**\n * The list of languages being filtered\n */\n languages: Language[];\n /**\n * The list of tags being filtered\n */\n tags: string[];\n /**\n * Updates language state\n */\n onLanguageChange: (lang?: Language) => void;\n /**\n * Input ChangeEventHandler which wraps the setQuery state setter\n */\n onQueryChange: ChangeEventHandler<HTMLInputElement>;\n /**\n * Navigates to the search query url\n */\n onSearch: (p?: NavigationParams) => void;\n /**\n * FormEventHandler to handle query submission\n */\n onSubmit: FormEventHandler<HTMLFormElement>;\n /**\n * The query state for this search\n */\n query: string;\n /**\n * CDK Major state setter\n */\n setCdkMajor: Dispatch<SetStateAction<UseCatalogSearchReturn[\"cdkMajor\"]>>;\n /**\n * CDK Type state setter\n */\n setCdkType: Dispatch<SetStateAction<UseCatalogSearchReturn[\"cdkType\"]>>;\n /**\n * Language state setter\n */\n setLanguage: Dispatch<SetStateAction<UseCatalogSearchReturn[\"language\"]>>;\n /**\n * Languages list state setter\n */\n setLanguages: Dispatch<SetStateAction<UseCatalogSearchReturn[\"languages\"]>>;\n /**\n * Tags list state setter\n */\n setTags: Dispatch<SetStateAction<UseCatalogSearchReturn[\"tags\"]>>;\n /**\n * Query state setter\n */\n setQuery: Dispatch<SetStateAction<UseCatalogSearchReturn[\"query\"]>>;\n\n setSort: Dispatch<SetStateAction<UseCatalogSearchReturn[\"sort\"]>>;\n\n sort?: CatalogSearchSort;\n}\n\n/**\n * This hook provides all of the methods required to implement the functionality\n * of a client-side catalog search component. It additionally exposes lower-level methods\n * for custom components which may want to access parts of the search API\n */\nexport const useCatalogSearch = (\n options: UseCatalogSearchParams = {}\n): UseCatalogSearchReturn => {\n const [query, setQuery] = useState(options.defaultQuery ?? \"\");\n\n const [cdkType, setCdkType] = useState<UseCatalogSearchReturn[\"cdkType\"]>(\n options.defaultCdkType\n );\n\n const [cdkMajor, setCdkMajor] = useState<UseCatalogSearchReturn[\"cdkMajor\"]>(\n options.defaultCdkMajor\n );\n\n const [languages, setLanguages] = useState<\n UseCatalogSearchReturn[\"languages\"]\n >(options.defaultLanguages ?? []);\n\n const [tags, setTags] = useState<UseCatalogSearchReturn[\"tags\"]>(\n options.defaultTags ?? []\n );\n\n const [language, setLanguage] = useState<UseCatalogSearchReturn[\"language\"]>(\n options.defaultLanguage\n );\n\n const [sort, setSort] = useState<UseCatalogSearchReturn[\"sort\"]>(\n options.defaultSort\n );\n\n const { push, replace } = useHistory();\n\n const onQueryChange: UseCatalogSearchReturn[\"onQueryChange\"] = (e) => {\n e.preventDefault();\n setQuery(e.target.value);\n };\n\n const onSearch: UseCatalogSearchReturn[\"onSearch\"] = useCallback(\n (opts) => {\n const navigate = opts?.replace ? replace : push;\n navigate(\n getSearchPath({\n cdkType,\n cdkMajor,\n language,\n languages,\n query,\n sort,\n tags,\n })\n );\n },\n [cdkType, cdkMajor, language, languages, push, query, replace, sort, tags]\n );\n\n const onSubmit: UseCatalogSearchReturn[\"onSubmit\"] = useCallback(\n (e) => {\n e?.preventDefault();\n onSearch();\n },\n [onSearch]\n );\n\n return useMemo(\n () => ({\n cdkMajor,\n cdkType,\n language,\n languages,\n onLanguageChange: setLanguage,\n onQueryChange,\n onSearch,\n onSubmit,\n query,\n setCdkMajor,\n setCdkType,\n setLanguage,\n setLanguages,\n setTags,\n setQuery,\n setSort,\n sort,\n tags,\n }),\n [\n cdkMajor,\n cdkType,\n language,\n languages,\n onSearch,\n onSubmit,\n query,\n sort,\n tags,\n ]\n );\n};\n"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- !function(e){function t(t){for(var n,a,c=t[0],i=t[1],f=t[2],p=0,s=[];p<c.length;p++)a=c[p],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(l&&l(t);s.length;)s.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,c=1;c<r.length;c++){var i=r[c];0!==o[i]&&(n=!1)}n&&(u.splice(t--,1),e=a(a.s=r[0]))}return e}var n={},o={3:0},u=[];function a(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.e=function(e){var t=[],r=o[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=o[e]=[t,n]}));t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,a.nc&&c.setAttribute("nonce",a.nc),c.src=function(e){return a.p+"static/js/"+({}[e]||e)+"."+{0:"0c7321f8",1:"fa36c516",4:"d2b9c583",6:"7ba5b2e6",7:"ca8ff14b",8:"bd66730f",9:"b8a2bbeb",10:"02ced27a",11:"f6ca229f",12:"ba292c49",13:"f4fd1c03",14:"17f5c1d8"}[e]+".chunk.js"}(e);var i=new Error;u=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=o[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),u=t&&t.target&&t.target.src;i.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",i.name="ChunkLoadError",i.type=n,i.request=u,r[1](i)}o[e]=void 0}};var f=setTimeout((function(){u({type:"timeout",target:c})}),12e4);c.onerror=c.onload=u,document.head.appendChild(c)}return Promise.all(t)},a.m=e,a.c=n,a.d=function(e,t,r){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(a.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)a.d(r,n,function(t){return e[t]}.bind(null,n));return r},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="/",a.oe=function(e){throw console.error(e),e};var c=this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[],i=c.push.bind(c);c.push=t,c=c.slice();for(var f=0;f<c.length;f++)t(c[f]);var l=i;r()}([]);
2
- //# sourceMappingURL=runtime-main.808c6139.js.map
1
+ !function(e){function t(t){for(var n,a,c=t[0],i=t[1],f=t[2],p=0,s=[];p<c.length;p++)a=c[p],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(l&&l(t);s.length;)s.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,c=1;c<r.length;c++){var i=r[c];0!==o[i]&&(n=!1)}n&&(u.splice(t--,1),e=a(a.s=r[0]))}return e}var n={},o={3:0},u=[];function a(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}a.e=function(e){var t=[],r=o[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((function(t,n){r=o[e]=[t,n]}));t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,a.nc&&c.setAttribute("nonce",a.nc),c.src=function(e){return a.p+"static/js/"+({}[e]||e)+"."+{0:"0c7321f8",1:"ddd0fd4b",4:"e2ba75d9",6:"0fcd2680",7:"123067dc",8:"703cfb42",9:"a8fecf34",10:"b91108a6",11:"f6ca229f",12:"309ba8f7",13:"f4fd1c03",14:"17f5c1d8"}[e]+".chunk.js"}(e);var i=new Error;u=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=o[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),u=t&&t.target&&t.target.src;i.message="Loading chunk "+e+" failed.\n("+n+": "+u+")",i.name="ChunkLoadError",i.type=n,i.request=u,r[1](i)}o[e]=void 0}};var f=setTimeout((function(){u({type:"timeout",target:c})}),12e4);c.onerror=c.onload=u,document.head.appendChild(c)}return Promise.all(t)},a.m=e,a.c=n,a.d=function(e,t,r){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(a.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)a.d(r,n,function(t){return e[t]}.bind(null,n));return r},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="/",a.oe=function(e){throw console.error(e),e};var c=this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[],i=c.push.bind(c);c.push=t,c=c.slice();for(var f=0;f<c.length;f++)t(c[f]);var l=i;r()}([]);
2
+ //# sourceMappingURL=runtime-main.9acc4988.js.map