construct-hub 0.2.50 → 0.2.51

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) 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 +2 -2
  8. package/website/asset-manifest.json +37 -37
  9. package/website/index.html +1 -1
  10. package/website/service-worker.js +1 -1
  11. package/website/service-worker.js.map +1 -1
  12. package/website/static/js/{0.476ccc35.chunk.js → 0.14ae620d.chunk.js} +2 -2
  13. package/website/static/js/{0.476ccc35.chunk.js.map → 0.14ae620d.chunk.js.map} +1 -1
  14. package/website/static/js/{1.dce521b7.chunk.js → 1.ba696ffb.chunk.js} +2 -2
  15. package/website/static/js/{1.dce521b7.chunk.js.map → 1.ba696ffb.chunk.js.map} +1 -1
  16. package/website/static/js/{10.511ed889.chunk.js → 10.48221095.chunk.js} +2 -2
  17. package/website/static/js/{10.511ed889.chunk.js.map → 10.48221095.chunk.js.map} +1 -1
  18. package/website/static/js/{11.fedfcf57.chunk.js → 11.c3c4095a.chunk.js} +2 -2
  19. package/website/static/js/{11.fedfcf57.chunk.js.map → 11.c3c4095a.chunk.js.map} +1 -1
  20. package/website/static/js/{12.f223385d.chunk.js → 12.cadd501c.chunk.js} +2 -2
  21. package/website/static/js/{12.f223385d.chunk.js.map → 12.cadd501c.chunk.js.map} +1 -1
  22. package/website/static/js/13.fe1e2da5.chunk.js +2 -0
  23. package/website/static/js/{13.97b408c9.chunk.js.map → 13.fe1e2da5.chunk.js.map} +1 -1
  24. package/website/static/js/{14.5a16949a.chunk.js → 14.0902aefd.chunk.js} +2 -2
  25. package/website/static/js/{14.5a16949a.chunk.js.map → 14.0902aefd.chunk.js.map} +1 -1
  26. package/website/static/js/{15.d29607c9.chunk.js → 15.50336305.chunk.js} +2 -2
  27. package/website/static/js/{15.d29607c9.chunk.js.map → 15.50336305.chunk.js.map} +1 -1
  28. package/website/static/js/{2.8028f8f1.chunk.js → 2.5cef3eb0.chunk.js} +2 -2
  29. package/website/static/js/{2.8028f8f1.chunk.js.map → 2.5cef3eb0.chunk.js.map} +1 -1
  30. package/website/static/js/{5.9ad3252f.chunk.js → 5.a2fc9d7c.chunk.js} +3 -3
  31. package/website/static/js/{5.9ad3252f.chunk.js.LICENSE.txt → 5.a2fc9d7c.chunk.js.LICENSE.txt} +0 -0
  32. package/website/static/js/{5.9ad3252f.chunk.js.map → 5.a2fc9d7c.chunk.js.map} +1 -1
  33. package/website/static/js/6.c49f34c2.chunk.js +3 -0
  34. package/website/static/js/{6.e67c67fc.chunk.js.LICENSE.txt → 6.c49f34c2.chunk.js.LICENSE.txt} +0 -0
  35. package/website/static/js/{6.e67c67fc.chunk.js.map → 6.c49f34c2.chunk.js.map} +1 -1
  36. package/website/static/js/{7.85487e43.chunk.js → 7.4fcbd19f.chunk.js} +2 -2
  37. package/website/static/js/{7.85487e43.chunk.js.map → 7.4fcbd19f.chunk.js.map} +1 -1
  38. package/website/static/js/8.31a21ecd.chunk.js +2 -0
  39. package/website/static/js/8.31a21ecd.chunk.js.map +1 -0
  40. package/website/static/js/9.e8c984d8.chunk.js +2 -0
  41. package/website/static/js/9.e8c984d8.chunk.js.map +1 -0
  42. package/website/static/js/main.65f1e14b.chunk.js +2 -0
  43. package/website/static/js/main.65f1e14b.chunk.js.map +1 -0
  44. package/website/static/js/{runtime-main.fc2986a7.js → runtime-main.d3c4ab29.js} +2 -2
  45. package/website/static/js/{runtime-main.fc2986a7.js.map → runtime-main.d3c4ab29.js.map} +1 -1
  46. package/website/static/js/13.97b408c9.chunk.js +0 -2
  47. package/website/static/js/6.e67c67fc.chunk.js +0 -3
  48. package/website/static/js/8.e3d4e000.chunk.js +0 -2
  49. package/website/static/js/8.e3d4e000.chunk.js.map +0 -1
  50. package/website/static/js/9.a24ba07b.chunk.js +0 -2
  51. package/website/static/js/9.a24ba07b.chunk.js.map +0 -1
  52. package/website/static/js/main.3e01d988.chunk.js +0 -2
  53. package/website/static/js/main.3e01d988.chunk.js.map +0 -1
@@ -1,2 +0,0 @@
1
- (this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[]).push([[3],{105:function(e,t,n){"use strict";n.d(t,"b",(function(){return p})),n.d(t,"a",(function(){return m}));var r=n(6),c=n(5),a=n(200),i=n(0),o="prefersWarnOnExternalLinkClick",s=n(201),u=n(44),l=n(198),d=n(222),b=n(153),j=n(225),f=n(57),h=n(1),O=function(e){var t=e.href,n=e.isOpen,r=e.onClick,a=e.onClose,O=e.setShouldWarn,v=Object(i.useState)(!0),p=Object(c.a)(v,2),m=p[0],g=p[1];return Object(h.jsx)(u.a,{closeOnOverlayClick:!1,isOpen:n,onClose:a,children:Object(h.jsx)(u.h,{children:Object(h.jsxs)(u.d,{color:"blue.800",children:[Object(h.jsx)(u.g,{children:"Confirm"}),Object(h.jsxs)(u.b,{children:[Object(h.jsx)(l.a,{fontSize:"lg",mb:2,children:"This link is taking you to an external site"}),Object(h.jsx)(l.a,{bg:"gray.100",borderRadius:"sm",color:"blue.500",fontSize:"sm",mb:4,p:1,children:t}),Object(h.jsx)(d.a,{onChange:function(e){var t=!e.target.checked;g(t)},children:"Do not show this warning again."})]}),Object(h.jsxs)(u.f,{children:[Object(h.jsx)(b.a,{onClick:function(){g(!0),a()},variant:"ghost",children:"Cancel"}),Object(h.jsx)(j.a,{hasArrow:!0,label:t,placement:"top",children:Object(h.jsx)(f.a,{hasIcon:!1,hasWarning:!1,href:t,noFollow:!0,onClick:function(e){if(!m){O(m);try{localStorage.setItem(o,JSON.stringify(m))}catch(t){}}null===r||void 0===r||r(e),a()},children:Object(h.jsx)(b.a,{colorScheme:"blue",ml:4,rightIcon:Object(h.jsx)(s.a,{}),tabIndex:0,variant:"ghost",children:"Proceed"})})})]})]})})})},v=Object(i.createContext)((function(e){return e.onClick})),p=function(){return Object(i.useContext)(v)},m=function(e){var t=e.children,n=Object(i.useState)(null),s=Object(c.a)(n,2),u=s[0],l=s[1],d=Object(a.a)({onClose:function(){l(null)}}),b=d.isOpen,j=d.onOpen,f=d.onClose,p=Object(i.useState)((function(){try{var e,t=null!==(e=localStorage.getItem(o))&&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(i.useCallback)((function(e){var t=e.href,n=e.onClick;if(!g)return n;return function(e){l({href:t,onClick:n}),e.preventDefault(),j()}}),[j,g]);return Object(h.jsxs)(v.Provider,{value:k,children:[t,Object(h.jsx)(O,Object(r.a)({isOpen:b,onClose:f,setShouldWarn:x},u))]})}},108:function(e,t,n){"use strict";n.d(t,"d",(function(){return a})),n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return d})),n.d(t,"e",(function(){return b})),n.d(t,"c",(function(){return j}));var r,c,a,i=n(4),o=n(6),s=n(106),u=n(1);!function(e){e.DotNet="dotnet",e.TypeScript="typescript",e.Python="python",e.Go="golang",e.Java="java"}(a||(a={}));var l=[a.TypeScript,a.Python,a.Java,a.Go,a.DotNet],d=(r={},Object(i.a)(r,a.TypeScript,"TypeScript"),Object(i.a)(r,a.Python,"Python"),Object(i.a)(r,a.Java,"Java"),Object(i.a)(r,a.Go,"Go"),Object(i.a)(r,a.DotNet,".NET"),r),b=new Set([a.Python,a.TypeScript,a.Java]),j=(c={},Object(i.a)(c,a.TypeScript,{name:d.typescript,icon:function(e){return Object(u.jsxs)(s.a,Object(o.a)(Object(o.a)({},e),{},{"aria-hidden":"true",transform:"rotate(360)",viewBox:"0 0 256 256",children:[Object(u.jsx)("path",{d:"M0 128v128h256V0H0z",fill:"#007ACC"}),Object(u.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)(c,a.Python,{name:d.python,icon:function(e){return Object(u.jsxs)(s.a,Object(o.a)(Object(o.a)({},e),{},{version:"1.0",viewBox:"0 0 110.421 109.846",children:[Object(u.jsxs)("defs",{children:[Object(u.jsxs)("linearGradient",{id:"a",children:[Object(u.jsx)("stop",{offset:"0",stopColor:"#ffe052"}),Object(u.jsx)("stop",{offset:"1",stopColor:"#ffc331"})]}),Object(u.jsx)("linearGradient",{gradientUnits:"userSpaceOnUse",id:"d",x1:"89.137",x2:"147.777",xlinkHref:"#a",y1:"111.921",y2:"168.101"}),Object(u.jsxs)("linearGradient",{id:"b",children:[Object(u.jsx)("stop",{offset:"0",stopColor:"#387eb8"}),Object(u.jsx)("stop",{offset:"1",stopColor:"#366994"})]}),Object(u.jsx)("linearGradient",{gradientUnits:"userSpaceOnUse",id:"c",x1:"55.549",x2:"110.149",xlinkHref:"#b",y1:"77.07",y2:"131.853"})]}),Object(u.jsxs)("g",{color:"#000",children:[Object(u.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(u.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)(c,a.Java,{name:d.java,icon:function(e){return Object(u.jsxs)(s.a,Object(o.a)(Object(o.a)({},e),{},{"aria-hidden":"true",transform:"rotate(360)",viewBox:"0 0 256 346",children:[Object(u.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(u.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(u.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(u.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(u.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)(c,a.Go,{name:d.golang,icon:function(e){return Object(u.jsx)(s.a,Object(o.a)(Object(o.a)({},e),{},{"aria-hidden":"true",transform:"rotate(360)",viewBox:"0 0 512 192",children:Object(u.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)(c,a.DotNet,{name:d.dotnet,icon:function(e){return Object(u.jsx)(s.a,Object(o.a)(Object(o.a)({},e),{},{"aria-hidden":"true",transform:"rotate(360)",viewBox:"0 0 32 32",children:Object(u.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"})}))}}),c)},118:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return u}));var r=n(0),c=n(21),a=n(1),i=Object(r.createContext)({trackPageView:function(){}}),o=function(e){var t=e.children,n=Object(c.h)().pathname,o=Object(r.useRef)(null),s=Object(r.useCallback)((function(e){var t,r,c;o.current!==n&&(null===(t=window)||void 0===t||null===(r=t.AWSMA)||void 0===r||null===(c=r.ready)||void 0===c||c.call(r,(function(){document.dispatchEvent(new CustomEvent(window.AWSMA.TRIGGER_EVENT,{detail:e})),o.current=n})))}),[n]);return Object(a.jsx)(i.Provider,{value:{trackPageView:s},children:t})},s=n(6),u=function(e){var t=Object(r.useContext)(i).trackPageView,n=Object(c.h)().pathname,a=Object(r.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(r.useCallback)((function(){return t(a)}),[t,a])}},120:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var r=n(0),c=function(e,t){var n=t.limit,r=t.offset*n,c=r+n;return e.slice(r,c)},a=n(18),i=n(93),o=function(e){var t=e.cdkMajor,n=e.cdkType,o=e.limit,s=e.offset,u=void 0===s?0:s,l=e.query,d=void 0===l?"":l,b=e.language,j=void 0===b?null:b,f=e.languages,h=e.sort,O=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.query,n=e.filters,c=e.sort,o=Object(i.b)();if(!o)throw new Error("This hook can only be called within a descendant of a <SearchProvider />");return Object(r.useMemo)((function(){return Object(a.a)(o.search({query:t,filters:n,sort:c}).values())}),[o,t,n,c])}({filters:Object(r.useMemo)((function(){return{cdkMajor:t,cdkType:n,language:null!==j&&void 0!==j?j:void 0,languages:f}}),[t,n,j,f]),query:d,sort:h}),v=function(e,t){var n=null!==t&&void 0!==t?t:{},a=n.limit,i=void 0===a?25:a,o=n.offset,s=void 0===o?0:o,u=e?Math.floor(e.length/i):0;return Object(r.useMemo)((function(){return{page:c(e,{limit:i,offset:s>u?u:s}),pageLimit:u}}),[e,i,s,u])}(O,{offset:u,limit:o}),p=v.page,m=v.pageLimit;return Object(r.useMemo)((function(){return{results:O,page:p,pageLimit:m}}),[p,m,O])}},127:function(e,t,n){"use strict";n.d(t,"b",(function(){return f})),n.d(t,"a",(function(){return h}));var r=n(5),c=n(0),a=n(26),i=n.n(a),o=n(41),s=n(14),u={packages:{},updated:"NOT_FOUND"},l=function(){var e=Object(o.a)(i.a.mark((function e(){var t;return i.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(71),b=n(1),j=Object(c.createContext)({loading:!1,data:void 0,error:void 0}),f=function(){return Object(c.useContext)(j)},h=function(e){var t=e.children,n=Object(d.a)(l),a=Object(r.a)(n,2),i=a[0],o=a[1];return Object(c.useEffect)((function(){i()}),[i]),Object(b.jsx)(j.Provider,{value:o,children:t})}},128:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var r=n(6),c=n(17),a=n(20),i=n(1),o=Object(c.a)((function(e,t){return Object(i.jsx)(a.a.form,Object(r.a)(Object(r.a)({},e),{},{ref:t}))}));o.displayName="Form"},137:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return u}));var r=n(26),c=n.n(r),a=n(41),i=n(14),o={sections:[{name:"Recently updated",showLastUpdated:10}]},s={featureFlags:{homeRedesign:!1,searchRedesign:!1},packageLinks:[],featuredPackages:o},u=function(){var e=Object(a.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(i.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)}}()},14:function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return c})),n.d(t,"c",(function(){return a}));var r={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"},a={FAQ:"/faq",HOME:"/",PACKAGES:"/packages",SEARCH:"/search",SITE_TERMS:"/terms"}},140:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var r=n(5),c=n(0),a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=Object(c.useState)(e),a=Object(r.a)(n,2),i=a[0],o=a[1],s=t.delay,u=void 0===s?250:s,l=t.onChange;return Object(c.useEffect)((function(){var t=setTimeout((function(){o(e),null===l||void 0===l||l(e)}),u);return function(){clearTimeout(t)}}),[e,u,l]),i}},141:function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(6),c=n(28),a=n(17),i=n(217),o=n(1),s=["name","onClick"],u=Object(a.a)((function(e,t){var n=e.name,a=e.onClick,u=Object(c.a)(e,s);return Object(o.jsx)(i.a,Object(r.a)(Object(r.a)({_hover:{cursor:"pointer"},alignItems:"center",display:"flex",fontSize:"md",lineHeight:"base",listStyleType:"none",minH:8,onClick:a,onKeyDown:function(e){["Enter"," "].includes(e.key)&&(e.preventDefault(),a())},px:4,ref:t,role:"option",sx:{":hover, :focus":{bg:"gray.100"}},tabIndex:0},u),{},{children:n}))}));u.displayName="SearchItem"},167:function(e,t,n){},174:function(e,t,n){"use strict";n.r(t);var r={};n.r(r),n.d(r,"initialize",(function(){return R})),n.d(r,"access",(function(){return D})),n.d(r,"checkForCookieConsent",(function(){return N})),n.d(r,"customizeCookies",(function(){return G})),n.d(r,"getConsentCookie",(function(){return W})),n.d(r,"hasConsent",(function(){return U}));var c,a,i=n(0),o=n.n(i),s=n(82),u=n.n(s),l=n(33),d=(n(167),n(147)),b=n(21),j=n(204),f=n(206),h=n(200),O=n(194),v=n(203),p=n(198),m=n(205),g=n(87),x=n(57),k=n(1),y="showing-dev-preview-banner",w=function(){var e,t=Object(h.a)({defaultIsOpen:JSON.parse(null!==(e=window.sessionStorage.getItem(y))&&void 0!==e?e:"true"),onClose:function(){return window.sessionStorage.setItem(y,"false")}}),n=t.isOpen,r=t.onClose;return Object(k.jsx)(O.a,{h:"max-content",children:Object(k.jsx)(v.a,{in:n,children:Object(k.jsxs)(g.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(k.jsx)(j.a,{h:5,left:4,position:"absolute",top:4,w:5}),Object(k.jsxs)(p.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(k.jsx)(x.a,{color:"inherit",hasWarning:!1,href:"https://github.com/cdklabs/construct-hub-webapp/issues",textDecoration:"underline",children:"here"})]}),Object(k.jsx)(m.a,{"aria-label":"Dismiss banner",colorScheme:"white",icon:Object(k.jsx)(f.a,{}),onClick:r,position:"absolute",right:4,size:"xs",top:3,variant:"ghost"})]})})})},C=n(5),S=n(207),E=n(208),T=n(209),A=n(153),M=n(28),F=n(26),I=n.n(F),z=n(41),P=function(){new URLSearchParams(window.location.search).get("sb")},R=function(){var e=Object(z.a)(I.a.mark((function e(){return I.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(z.a)(I.a.mark((function r(){var a,i,o;return I.a.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.prev=0,a={domain:window.location.hostname,language:navigator.language,__storeWriter:P()},r.next=4,n.e(16).then(n.t.bind(null,603,7));case 4:i=r.sent,o=i.AWSCShortbread,c=o(a),e(),r.next=13;break;case 10:r.prev=10,r.t0=r.catch(0),t(r.t0);case 13:case"end":return r.stop()}}),r,null,[[0,10]])}))))})));case 1:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),L=function(e){return function(){var t;if(!c)throw new Error("shortbread has not been initialized");return(t=c)[e].apply(t,arguments)}},D=L("access"),N=L("checkForCookieConsent"),G=L("customizeCookies"),W=L("getConsentCookie"),U=L("hasConsent"),H=R,_=Object(M.a)(r,["initialize"]),B=Object(i.createContext)({}),q=function(e){var t=e.children,n=Object(i.useState)(!1),r=Object(C.a)(n,2),c=r[0],a=r[1];return Object(i.useEffect)((function(){var e=!1;return H().then((function(){e||(_.checkForCookieConsent(),a(!0))})).catch((function(t){console.error(t),e||a(!1)})),function(){e=!0,a(!1)}}),[]),Object(k.jsx)(B.Provider,{value:c?_:{},children:t})},V=n(86),J=n(14),K={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:J.c.SITE_TERMS,testId:"site-terms",isExternal:!1},LEGAL:{display:"Legal",url:"https://aws.amazon.com/legal/",testId:"legal"}},Q=n(18),Y=n(56),X=Object(Y.a)("footer",["container","links","disclaimer","manageCookies"].concat(Object(Q.a)(Object.values(K).map((function(e){return e.testId}))))),Z=function(){var e=Object(i.useContext)(B).customizeCookies;return Object(k.jsxs)(S.a,{align:"center",as:"footer",bg:"blue.800",color:"white","data-testid":X.container,direction:"column",justify:"center",py:4,children:[Object(k.jsx)(E.a,{columnGap:6,columns:[1,2,4],"data-testid":X.links,children:Object.entries(K).map((function(e,t){var n=Object(C.a)(e,2),r=n[0],c=n[1],a=c.display,i=c.isExternal,o=void 0===i||i,s=c.testId,u=c.url;return Object(k.jsxs)(S.a,{align:"center",direction:{base:"column",md:"row"},children:[Object(k.jsx)(O.a,{display:{base:"none",md:0!==t?"initial":"none"},h:5,children:Object(k.jsx)(T.a,{borderColor:"white",mr:6,orientation:"vertical"})}),o?Object(k.jsx)(x.a,{color:"currentcolor","data-testid":X[s],hasWarning:!1,href:u,lineHeight:10,mx:"auto",children:a}):Object(k.jsx)(V.a,{color:"currentcolor","data-testid":X[s],lineHeight:10,mx:"auto",to:u,children:a}),Object(k.jsx)(O.a,{display:{base:"none",sm:t<2?"initial":"none",md:"none"},w:"100%",children:Object(k.jsx)(T.a,{borderColor:"white"})})]},r)}))}),Object(k.jsx)(p.a,{"data-testid":X.disclaimer,fontSize:"xs",mt:4,children:"2021 Amazon Web Services, Inc. All rights reserved."}),Object(k.jsx)(A.a,{color:"white","data-testid":X.manageCookies,fontSize:"xs",fontWeight:"normal",mt:4,onClick:e,variant:"link",children:"Manage Cookies"})]})},$=n(6),ee=[{display:"FAQ",isNavLink:!0,url:"/faq"},{display:"Construct Hub on GitHub",url:"https://github.com/cdklabs/construct-hub"},{display:"Issues on GitHub",url:"https://github.com/cdklabs/construct-hub/issues"}],te=[{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"}]}],ne=n(223),re=["children"],ce=function(e){var t=e.children,n=Object(M.a)(e,re);return Object(k.jsx)(ne.a,Object($.a)(Object($.a)({colorScheme:"blue.800",strategy:"fixed"},n),{},{children:t}))},ae=n(17),ie=["items"],oe=function(e){var t=e.display,n=e.isNavLink,r=e.url;return n?Object(k.jsx)(V.a,{color:"blue.500",to:r,w:"100%",children:t}):Object(k.jsx)(x.a,{alignItems:"center",display:"flex",hasWarning:!1,href:r,justifyContent:"space-between",w:"100%",children:t})},se=Object(ae.a)((function(e,t){var n=e.items,r=Object(M.a)(e,ie);return Object(k.jsx)(ne.f,Object($.a)(Object($.a)({},r),{},{ref:t,children:n.map((function(e,t){return"links"in e?Object(k.jsxs)(i.Fragment,{children:[Object(k.jsx)(ne.d,{align:"left",title:e.display,children:e.links.map((function(e,t){return Object(k.jsx)(ne.e,{children:Object(k.jsx)(oe,Object($.a)({},e))},"".concat(e.display,"-").concat(t))}))}),t!==n.length-1&&Object(k.jsx)(ne.c,{})]},"".concat(e.display,"-").concat(t)):Object(k.jsx)(ne.e,{children:Object(k.jsx)(oe,Object($.a)({},e))},"".concat(e.display,"-").concat(t))}))}))})),ue=n(212),le=["children"],de=Object(ae.a)((function(e,t){var n=e.children,r=Object(M.a)(e,le);return Object(k.jsx)(ne.b,Object($.a)(Object($.a)({as:A.a,color:"blue.800",fontWeight:"500",ref:t,rightIcon:Object(k.jsx)(ue.a,{h:6,w:6}),size:"md",variant:"link"},r),{},{children:n}))})),be=Object(Y.a)("header",["container","title","gettingStartedTrigger","gettingStartedMenu","resourcesTrigger","resourcesMenu","navOpen","navClose","searchInput","searchIcon","mobileNav"]),je=function(){return Object(k.jsxs)(ce,{children:[Object(k.jsx)(de,{"data-testid":be.gettingStartedTrigger,children:"Getting Started"}),Object(k.jsx)(se,{"data-testid":be.gettingStartedMenu,items:ee})]})},fe=n(215),he=n(70),Oe=n(228),ve=n(44),pe=n(231),me=n(88),ge=Object(Y.a)("searchModal",["container"]),xe=function(e){var t=e.isOpen,n=e.onClose,r=Object(me.a)(),c=r.query,a=r.onQueryChange,i=r.onSubmit,o=r.onSearch;return Object(k.jsx)(Oe.a,{children:Object(k.jsx)(ve.a,{isOpen:t,onClose:n,children:Object(k.jsx)(ve.h,{children:Object(k.jsxs)(ve.d,{"data-testid":ge.container,children:[Object(k.jsx)(ve.c,{}),Object(k.jsx)(ve.g,{children:"Search"}),Object(k.jsx)(ve.b,{children:Object(k.jsxs)(pe.a,{pb:4,spacing:4,children:[Object(k.jsx)(he.a,{onChange:a,onSubmit:i,value:c}),Object(k.jsx)(A.a,{colorScheme:"blue",onClick:function(){return o()},children:"Find Constructs"})]})})]})})})})},ke=function(){var e=Object(h.a)();return Object(k.jsxs)(b.d,{children:[Object(k.jsx)(b.b,{exact:!0,path:[J.c.HOME,J.c.SEARCH]}),Object(k.jsxs)(b.b,{path:"*",children:[Object(k.jsx)(O.a,{"data-testid":be.searchInput,display:{base:"none",md:"initial"},children:Object(k.jsxs)(he.a,{bg:"gray.50",children:[Object(k.jsx)(he.b,{}),Object(k.jsx)(he.c,{})]})}),Object(k.jsxs)(O.a,{display:{base:"initial",md:"none"},children:[Object(k.jsx)(m.a,{"aria-label":"Search Icon",borderRadius:"md","data-testid":be.searchIcon,icon:Object(k.jsx)(fe.a,{color:"gray.600"}),onClick:e.onOpen,variant:"ghost"}),Object(k.jsx)(xe,Object($.a)({},e))]})]})]})},ye=n(219),we=n(232),Ce=function(){return Object(k.jsxs)(ce,{children:[Object(k.jsx)(de,{"data-testid":be.resourcesTrigger,children:"Resources"}),Object(k.jsx)(se,{"data-testid":be.resourcesMenu,items:te})]})},Se=n(218),Ee=function(){return Object(k.jsx)(Se.a,{as:"h1",color:"blue.800","data-testid":be.title,size:"lg",children:Object(k.jsxs)(l.b,{to:"/",children:[Object(k.jsx)(O.a,{as:"span",color:"blue.500",children:"Construct"})," ","Hub"]})})},Te=function(e){var t=e.isOpen,n=e.onClose;return Object(k.jsx)(Oe.a,{children:Object(k.jsxs)(we.a,{isOpen:t,onClose:n,placement:"left",size:"xs",children:[Object(k.jsx)(ve.h,{}),Object(k.jsxs)(we.b,{"data-testid":be.mobileNav,children:[Object(k.jsx)(ve.c,{}),Object(k.jsx)(ve.g,{display:"flex",justifyContent:"center",children:Object(k.jsx)(Ee,{})}),Object(k.jsx)(ve.b,{children:Object(k.jsxs)(pe.a,{align:"start",justify:"start",spacing:4,children:[Object(k.jsx)(je,{}),Object(k.jsx)(Ce,{})]})})]})]})})},Ae=function(){var e=Object(h.a)();return Object(k.jsxs)(k.Fragment,{children:[Object(k.jsx)(m.a,{"aria-label":"Navigation Menu",borderRadius:"md","data-testid":be.navOpen,display:{md:"none"},icon:Object(k.jsx)(ye.a,{}),onClick:e.onOpen,variant:"ghost"}),Object(k.jsx)(Te,Object($.a)({},e))]})},Me=function(e){return Object(k.jsx)(d.b,Object($.a)({align:"center",justify:"center",rowStart:1},e))},Fe=function(){return Object(k.jsxs)(d.a,{alignItems:"center",as:"header",bg:"white",boxShadow:"base","data-testid":be.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(k.jsx)(Me,{colStart:{base:2,md:1},justifySelf:{base:"center",md:"start"},children:Object(k.jsx)(Ee,{})}),Object(k.jsx)(Me,{colStart:{base:3,md:2},justifySelf:{base:"end",md:"stretch"},children:Object(k.jsx)(ke,{})}),Object(k.jsxs)(Me,{colStart:{base:1,md:3},justifySelf:{base:"start",md:"end"},children:[Object(k.jsxs)(d.a,{display:{base:"none",md:"grid"},gap:4,gridTemplateColumns:"1fr 1fr",gridTemplateRows:"1fr",placeItems:"center",w:"100%",children:[Object(k.jsx)(O.a,{children:Object(k.jsx)(je,{})}),Object(k.jsx)(O.a,{children:Object(k.jsx)(Ce,{})})]}),Object(k.jsx)(Ae,{})]})]})},Ie=n(76),ze=["component"],Pe=function(e){var t=e.component,n=Object(M.a)(e,ze);return Object(k.jsx)(b.b,Object($.a)(Object($.a)({},n),{},{children:Object(k.jsx)(i.Suspense,{fallback:Object(k.jsx)(Ie.a,{}),children:Object(k.jsx)(t,{})})}))},Re=n(90),Le=Object(i.lazy)((function(){return Promise.all([n.e(0),n.e(13)]).then(n.bind(null,609))})),De=Object(i.lazy)((function(){return Promise.all([n.e(0),n.e(1),n.e(2),n.e(15)]).then(n.bind(null,612))})),Ne=Object(i.lazy)((function(){return Promise.all([n.e(0),n.e(1),n.e(8)]).then(n.bind(null,608))})),Ge=Object(i.lazy)((function(){return Promise.all([n.e(0),n.e(12)]).then(n.bind(null,283))})),We=Object(i.lazy)((function(){return Promise.all([n.e(0),n.e(1),n.e(5),n.e(7)]).then(n.bind(null,605))})),Ue=Object(i.lazy)((function(){return Promise.all([n.e(0),n.e(1),n.e(2),n.e(11)]).then(n.bind(null,611))})),He=Object(i.lazy)((function(){return Promise.all([n.e(0),n.e(1),n.e(10),n.e(9)]).then(n.bind(null,607))})),_e=Object(i.lazy)((function(){return Promise.all([n.e(0),n.e(14)]).then(n.bind(null,613))})),Be=function(){var e,t=Object(Re.b)(),n=t.data,r=t.loading,c=null!==(e=null===n||void 0===n?void 0:n.featureFlags)&&void 0!==e?e:{},a=(null===c||void 0===c?void 0:c.homeRedesign)||(null===c||void 0===c?void 0:c.searchRedesign);return Object(k.jsxs)(d.a,{as:"main",bg:"bgPrimary",gridTemplateColumns:"1fr",gridTemplateRows:"auto auto 1fr auto",h:"100%",maxW:"100%",minH:"100vh",children:[Object(k.jsx)(Fe,{}),r||a?Object(k.jsx)("div",{}):Object(k.jsx)(w,{}),r?Object(k.jsx)(Ie.a,{}):Object(k.jsxs)(b.d,{children:[Object(k.jsx)(Pe,{component:Le,exact:!0,path:J.c.FAQ}),Object(k.jsx)(Pe,{component:(null===c||void 0===c?void 0:c.homeRedesign)?Ne:De,exact:!0,path:J.c.HOME}),Object(k.jsx)(Pe,{component:_e,exact:!0,path:J.c.SITE_TERMS}),Object(k.jsx)(Pe,{component:We,path:J.c.PACKAGES}),Object(k.jsx)(Pe,{component:(null===c||void 0===c?void 0:c.searchRedesign)?He:Ue,exact:!0,path:J.c.SEARCH}),Object(k.jsx)(Pe,{component:Ge,path:"*"})]}),Object(k.jsx)(Z,{})]})},qe=n(118),Ve=n(89),Je=n(105),Ke=n(93),Qe=n(127),Ye=n(224),Xe=n(220),Ze=n(101),$e=Ze.theme.components.Code,et=Object($.a)(Object($.a)({},$e),{},{variants:Object($.a)(Object($.a)({},$e.variants),{},{"code-block":Object($.a)(Object($.a)({},$e.variants.subtle),{},{display:"block",whiteSpace:"pre"})})}),tt=function(e,t){return function(n){var r="function"===typeof e?e(n):e;return Object($.a)(Object($.a)({},r),{},{container:Object($.a)(Object($.a)({},r.container),t)})}},nt=Ze.theme.components.Tag,rt=Object($.a)(Object($.a)({},nt),{},{baseStyle:{container:{fontWeight:"normal"}},variants:Object($.a)(Object($.a)({},nt.variants),{},{subtle:tt(nt.variants.subtle,{background:"#F2F2F2",color:"blue.800"}),official:tt(nt.variants.subtle,{background:"rgba(33, 150, 83, 0.1)",color:"#219653"})})}),ct=Object($.a)(Object($.a)({},Ze.theme.components),{},{Code:et,Divider:{defaultProps:{borderColor:"rgba(0, 124, 253, 0.15)"}},Tag:rt}),at={borders:{base:"1px solid rgba(0, 124, 253, 0.15)"},colors:Object($.a)(Object($.a)({},Ze.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)"}},it=Object(Xe.a)(Object($.a)(Object($.a)({},at),{},{components:ct})),ot=function(e){var t=e.children;return Object(k.jsx)(Ye.a,{resetCSS:!0,theme:it,children:t})},st=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}$/)),ut=function(e,t){navigator.serviceWorker.register(e).then((function(e){e.onupdatefound=function(){var n=e.installing;null!=n&&(n.onstatechange=function(){"installed"===n.state&&(navigator.serviceWorker.controller?(console.log("New content is available and will be used when all tabs for this page are closed. See https://cra.link/PWA."),t&&t.onUpdate&&t.onUpdate(e)):(console.log("Content is cached for offline use."),t&&t.onSuccess&&t.onSuccess(e)))})}})).catch((function(e){console.error("Error during service worker registration:",e)}))};u.a.render(Object(k.jsx)(o.a.StrictMode,{children:Object(k.jsx)(l.a,{children:Object(k.jsx)(q,{children:Object(k.jsx)(qe.a,{children:Object(k.jsx)(Re.a,{children:Object(k.jsx)(Ve.a,{children:Object(k.jsx)(Qe.a,{children:Object(k.jsx)(Ke.a,{children:Object(k.jsx)(ot,{children:Object(k.jsx)(Je.a,{children:Object(k.jsx)(Be,{})})})})})})})})})})}),document.getElementById("root")),a&&a instanceof Function&&n.e(17).then(n.bind(null,604)).then((function(e){var t=e.getCLS,n=e.getFID,r=e.getFCP,c=e.getLCP,i=e.getTTFB;t(a),n(a),r(a),c(a),i(a)}),(function(){})),function(e){if("serviceWorker"in navigator){if(new URL("",window.location.href).origin!==window.location.origin)return;window.addEventListener("load",(function(){var t="".concat("","/service-worker.js");st?(!function(e,t){fetch(e,{headers:{"Service-Worker":"script"}}).then((function(n){var r=n.headers.get("content-type");404===n.status||null!=r&&-1===r.indexOf("javascript")?navigator.serviceWorker.ready.then((function(e){e.unregister().then((function(){window.location.reload()}))})):ut(e,t)})).catch((function(){console.log("No internet connection found. App is running in offline mode.")}))}(t,e),navigator.serviceWorker.ready.then((function(){console.log("This web app is being served cache-first by a service worker. To learn more, visit https://cra.link/PWA")}))):ut(t,e)}))}}()},56:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var r=function(e,t){return t.reduce((function(t,n){return t[n]="".concat(e,"-").concat(n),t}),{})}},57:function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var r=n(6),c=n(28),a=n(201),i=n(17),o=n(202),s=n(105),u=n(1),l=["children","hasIcon","hasWarning","href","onClick","noFollow"],d=Object(i.a)((function(e,t){var n=e.children,i=e.hasIcon,d=void 0===i||i,b=e.hasWarning,j=void 0===b||b,f=e.href,h=e.onClick,O=e.noFollow,v=Object(c.a)(e,l),p=Object(s.b)(),m="noopener noreferrer";return(j||O)&&(m+=" nofollow"),Object(u.jsxs)(o.a,Object(r.a)(Object(r.a)({color:"blue.500",href:f,isExternal:!0,onClick:j?p({href:f,onClick:h}):h,ref:t,rel:m},v),{},{children:[n," ",d&&Object(u.jsx)(a.a,{mb:1,ml:2})]}))}));d.displayName="ExternalLink"},65:function(e,t,n){"use strict";n.d(t,"c",(function(){return a})),n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return s})),n.d(t,"d",(function(){return u}));var r,c,a,i=n(4);!function(e){e.awscdk="aws-cdk",e.cdktf="cdktf",e.cdk8s="cdk8s"}(a||(a={}));var o=(r={},Object(i.a)(r,a.awscdk,"AWS CDK"),Object(i.a)(r,a.cdktf,"CDKtf"),Object(i.a)(r,a.cdk8s,"CDK8s"),r),s=(c={},Object(i.a)(c,a.awscdk,{name:o[a.awscdk],imgsrc:"/assets/awscdk-icon.png"}),Object(i.a)(c,a.cdk8s,{name:o[a.cdk8s],imgsrc:"/assets/cdk8s-icon.png"}),Object(i.a)(c,a.cdktf,{name:o[a.cdktf],imgsrc:"/assets/cdktf-icon.png"}),c),u=["@aws-cdk/","@cdktf/"]},66:function(e,t,n){"use strict";var r;n.d(t,"a",(function(){return r})),function(e){e.NameAsc="asc",e.NameDesc="desc",e.PublishDateAsc="oldest",e.PublishDateDesc="newest"}(r||(r={}))},70:function(e,t,n){"use strict";n.d(t,"a",(function(){return g})),n.d(t,"b",(function(){return y})),n.d(t,"c",(function(){return L}));var r=n(6),c=n(28),a=n(215),i=n(200),o=n(213),s=n(214),u=n(229),l=n(153),d=n(0),b=n(88),j=n(128),f=n(56),h=Object(f.a)("searchBar",["input","searchIcon","searchButton","overlay","suggestionsList","suggestion"]),O=n(1),v=["children","hasButton","onSubmit","value","onChange"],p=Object(d.createContext)(void 0),m=function(){var e=Object(d.useContext)(p);if(!e)throw new Error("This component must be a child of a <SearchBar />");return e},g=function(e){var t=e.children,n=e.hasButton,f=e.onSubmit,m=e.value,g=e.onChange,x=Object(c.a)(e,v),k=Object(i.a)(),y=Object(d.useRef)(null),w=Object(b.a)();return Object(d.useEffect)((function(){var e=function(e){y.current&&e.target&&(y.current.contains(e.target)||k.onClose())},t=function(e){var t,n;"Escape"===e.key&&(null===(t=y.current)||void 0===t||null===(n=t.blur)||void 0===n||n.call(t),k.onClose())};return window.addEventListener("keyup",t),window.addEventListener("click",e),function(){window.removeEventListener("keyup",t),window.removeEventListener("click",e)}}),[]),Object(O.jsx)(p.Provider,{value:{query:null!==m&&void 0!==m?m:w.query,isOpen:k.isOpen},children:Object(O.jsxs)(j.a,{color:"initial",onSubmit:null!==f&&void 0!==f?f:w.onSubmit,pos:"relative",children:[Object(O.jsxs)(o.a,{pos:"relative",zIndex:k.isOpen?3:"initial",children:[n&&Object(O.jsx)(s.a,{children:Object(O.jsx)(a.a,{"data-testid":h.searchIcon})}),Object(O.jsx)(u.a,Object(r.a)({_focus:{boxShadow:"base",borderColor:"inherit"},bg:"white",boxShadow:k.isOpen?"base":"none","data-testid":h.input,onChange:null!==g&&void 0!==g?g:w.onQueryChange,onFocus:k.onOpen,placeholder:"Search construct libraries",ref:y,value:null!==m&&void 0!==m?m:w.query},x)),n?Object(O.jsx)(s.b,{w:"9rem",children:Object(O.jsx)(l.a,{borderLeftRadius:"0",colorScheme:"blue","data-testid":h.searchButton,type:"submit",children:"Find Constructs"})}):Object(O.jsx)(s.b,{children:Object(O.jsx)(a.a,{"data-testid":h.searchIcon})})]}),t]})})},x=n(17),k=n(194),y=Object(x.a)((function(e,t){var n=m().isOpen;return Object(O.jsx)(k.a,Object(r.a)({bg:"gray.700","data-testid":h.overlay,display:n?"initial":"none",inset:"0",opacity:"0.5",pos:"fixed",ref:t,zIndex:"1"},e))})),w=n(230),C=n(217),S=n(209),E=n(231),T=n(198),A=n(21),M=n(65),F=n(120),I=n(140),z=n(85),P=n(87),R=n(141),L=Object(x.a)((function(e,t){var n=m(),c=n.query,a=n.isOpen,i=Object(I.a)(c),o=Object(A.g)().push,s=Object(F.a)({limit:5,offset:0,query:i}).page;if(!a||s.length<1||!i)return null;return Object(O.jsx)(P.a,Object(r.a)(Object(r.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=function(e){var t,n=e.metadata,r=null,c=null===n||void 0===n||null===(t=n.constructFramework)||void 0===t?void 0:t.name;return c&&c in M.b&&(r=Object(O.jsx)(w.a,{alt:"".concat(c," Logo"),h:5,src:M.b[c].imgsrc,w:5})),r}(e);return Object(O.jsxs)(O.Fragment,{children:[t>0&&Object(O.jsx)(S.a,{mx:4,w:"auto"}),Object(O.jsx)(R.a,{"data-testid":h.suggestion,name:Object(O.jsxs)(E.a,{align:"center",direction:"row",spacing:4,children:[n,Object(O.jsx)(T.a,{ml:n?0:9,children:e.name})]}),onClick:function(){return o(Object(z.a)(e))},py:2,textAlign:"left"},e.id)]})}))}))}))},71:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(26),c=n.n(r),a=n(41),i=n(5),o=n(0),s=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.initialValue,r=t.onSuccess,s=t.onError,u=Object(o.useState)(!1),l=Object(i.a)(u,2),d=l[0],b=l[1],j=Object(o.useState)(n),f=Object(i.a)(j,2),h=f[0],O=f[1],v=Object(o.useState)(),p=Object(i.a)(v,2),m=p[0],g=p[1],x=Object(o.useRef)(!1);Object(o.useEffect)((function(){return x.current=!0,function(){x.current=!1}}),[]);var k=Object(o.useCallback)(Object(a.a)(c.a.mark((function t(){var a,i=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 b(!0),g(void 0),t.prev=4,t.next=7,e.apply(void 0,i);case 7:a=t.sent,null===r||void 0===r||r(a),x.current&&(O(a),b(!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&&(O(n),g(t.t0),b(!1));case 17:case"end":return t.stop()}}),t,null,[[4,12]])}))),[s,r]);return Object(o.useMemo)((function(){return[k,{data:h,loading:d,error:m}]}),[k,h,d,m])}},76:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n(216),c=n(199),a=n(1),i=function(){return Object(a.jsx)(r.a,{children:Object(a.jsx)(c.a,{size:"xl"})})}},77:function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return l}));var r,c=n(4),a=n(108),i=n(66),o=function(e){return function(t,n){var r=new Date(t.metadata.date),c=new Date(n.metadata.date);return r===c?0:e?c<r?1:-1:r<c?1:-1}},s=function(e){return function(t,n){return t.name.localeCompare(n.name)*(e?1:-1)}},u=(r={},Object(c.a)(r,i.a.NameAsc,s(!0)),Object(c.a)(r,i.a.NameDesc,s(!1)),Object(c.a)(r,i.a.PublishDateAsc,o(!0)),Object(c.a)(r,i.a.PublishDateDesc,o(!1)),r),l={cdkType:function(e){if(e)return function(t){var n,r;return(null===(n=t.metadata)||void 0===n||null===(r=n.constructFramework)||void 0===r?void 0:r.name)===e}},cdkMajor:function(e){if("number"===typeof e)return function(t){var n,r;return(null===(n=t.metadata)||void 0===n||null===(r=n.constructFramework)||void 0===r?void 0:r.majorVersion)===e}},language:function(e){if(e&&e!==a.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(a.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)}))}}}},85:function(e,t,n){"use strict";n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return u})),n.d(t,"a",(function(){return l}));var r=n(4),c=n(5),a=n(14),i=new RegExp(/git@github\.com:([a-zA-Z-]+)+\/?([a-zA-Z-]+)*(\.git)?/),o=function(e){try{var t=e,n=e.match(i);if(n){var r=Object(c.a)(n,3),a=r[1],o=r[2];t="https://github.com/".concat(a,"/").concat(o)}return{hostname:new URL(t).hostname,url:t}}catch(s){return}},s=function(e,t){var n=e;if(t){var r=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),r=t[0],a=t[1];n.set(r,"".concat(a))})),n.toString()}(t);r&&(n+="?".concat(r))}return n},u=function(e){var t,n=e.cdkMajor,c=e.cdkType,i=e.query,o=e.offset,u=e.language,l=e.languages,d=e.sort;return s(a.c.SEARCH,(t={},Object(r.a)(t,a.b.SEARCH_QUERY,i),Object(r.a)(t,a.b.CDK_TYPE,c),Object(r.a)(t,a.b.CDK_MAJOR,n),Object(r.a)(t,a.b.LANGUAGE,u),Object(r.a)(t,a.b.LANGUAGES,(null===l||void 0===l?void 0:l.length)?l.join(","):null),Object(r.a)(t,a.b.SORT,d),Object(r.a)(t,a.b.OFFSET,null!==o&&void 0!==o?o:0),t))},l=function(e){var t,n=e.name,c=e.version,i=e.language,o=e.submodule;return s("".concat(a.c.PACKAGES,"/").concat(n,"/v/").concat(c),(t={},Object(r.a)(t,a.b.SUBMODULE,o),Object(r.a)(t,a.b.LANGUAGE,i),t))}},86:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var r=n(6),c=n(202),a=n(33),i=n(1),o=function(e){return Object(i.jsx)(c.a,Object(r.a)({as:a.b},e))}},87:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var r=n(6),c=n(17),a=n(194),i=n(1),o=Object(c.a)((function(e,t){return Object(i.jsx)(a.a,Object(r.a)({bg:"white",border:"base",borderRadius:"card",boxShadow:"base",p:2,ref:t},e))}));o.displayName="Card"},88:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var r=n(5),c=n(0),a=n(21),i=n(85),o=function(){var e,t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=Object(c.useState)(null!==(e=n.defaultQuery)&&void 0!==e?e:""),s=Object(r.a)(o,2),u=s[0],l=s[1],d=Object(c.useState)(n.defaultCdkType),b=Object(r.a)(d,2),j=b[0],f=b[1],h=Object(c.useState)(n.defaultCdkMajor),O=Object(r.a)(h,2),v=O[0],p=O[1],m=Object(c.useState)(null!==(t=n.defaultLanguages)&&void 0!==t?t:[]),g=Object(r.a)(m,2),x=g[0],k=g[1],y=Object(c.useState)(n.defaultLanguage),w=Object(r.a)(y,2),C=w[0],S=w[1],E=Object(c.useState)(n.defaultSort),T=Object(r.a)(E,2),A=T[0],M=T[1],F=Object(a.g)(),I=F.push,z=F.replace,P=function(e){e.preventDefault(),l(e.target.value)},R=Object(c.useCallback)((function(e){((null===e||void 0===e?void 0:e.replace)?z:I)(Object(i.c)({cdkType:j,cdkMajor:v,language:C,languages:x,query:u,sort:A}))}),[j,v,C,x,I,u,z,A]),L=Object(c.useCallback)((function(e){null===e||void 0===e||e.preventDefault(),R()}),[R]);return Object(c.useMemo)((function(){return{cdkMajor:v,cdkType:j,language:C,languages:x,onLanguageChange:S,onQueryChange:P,onSearch:R,onSubmit:L,query:u,setCdkMajor:p,setCdkType:f,setLanguage:S,setLanguages:k,setQuery:l,setSort:M,sort:A}}),[v,j,C,x,R,L,u,A])}},89:function(e,t,n){"use strict";n.d(t,"b",(function(){return j})),n.d(t,"a",(function(){return f}));var r=n(5),c=n(0),a=n(26),i=n.n(a),o=n(41),s=n(14),u=function(){var e=Object(o.a)(i.a.mark((function e(){var t;return i.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(71),d=n(1),b=Object(c.createContext)({loading:!1,data:void 0,error:void 0}),j=function(){return Object(c.useContext)(b)},f=function(e){var t=e.children,n=Object(l.a)(u),a=Object(r.a)(n,2),i=a[0],o=a[1];return Object(c.useEffect)((function(){i()}),[i]),Object(d.jsx)(b.Provider,{value:o,children:t})}},90:function(e,t,n){"use strict";n.d(t,"a",(function(){return b})),n.d(t,"b",(function(){return d}));var r=n(6),c=n(5),a=n(0),i=n(137),o=n(71),s=n(1),u=Object(a.createContext)({loading:!1,data:void 0,error:void 0}),l="construct-hub-config",d=function(){return Object(a.useContext)(u)},b=function(e){var t=e.children,n=Object(a.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),b=d[0],j=d[1],f=Object(o.a)(i.b,{onSuccess:function(e){j(e);try{localStorage.setItem(l,JSON.stringify(e))}catch(t){console.error(t)}}}),h=Object(c.a)(f,2),O=h[0],v=h[1];return Object(a.useEffect)((function(){O()}),[]),Object(s.jsx)(u.Provider,{value:Object(r.a)(Object(r.a)({},v),{},{data:b}),children:t})}},93:function(e,t,n){"use strict";n.d(t,"b",(function(){return g})),n.d(t,"a",(function(){return x}));var r=n(0),c=n(4),a=n(5),i=n(18),o=n(6),s=n(62),u=n(72),l=n(149),d=n.n(l),b=n(65),j=n(66),f=n(77),h=function(){function e(t){Object(s.a)(this,e),this.map=void 0,this.index=void 0,this.constructFrameworks=void 0;var n=t.reduce((function(e,t){var n=[t.name,t.version].join("@");return e.set(n,Object(o.a)(Object(o.a)({},t),{},{id:n})),e}),new Map);this.map=this.sort(n,j.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(i.a)(n.values()).forEach((function(t){var n=t.author,r=t.name.split("/"),c=Object(a.a)(r,2),i=c[0],o=c[1];i&&o&&(t.scope=i,t.packageName=o),"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,r=t.filters,c=t.sort,a=n?this.query(n):new Map(this.map);return r&&(a=this.filter(a,r)),c&&(a=this.sort(a,c)),a}},{key:"query",value:function(e){var t=this,n=[];try{n=this.index.search(e)}catch(r){console.error(r)}return n.reduce((function(e,n){var r=n.ref,c=t.map.get(r);return c&&e.set(r,c),e}),new Map)}},{key:"filter",value:function(e,t){var n=t.cdkType,r=t.cdkMajor,c=t.language,a=t.languages,i=new Map(e),o=[f.a.cdkType(n),f.a.cdkMajor(n?r:void 0),f.a.language(c),f.a.languages(a)].filter(Boolean);return i.forEach((function(e){var t=!1;o.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(i.a)(e.entries()).sort((function(e,n){var r=Object(a.a)(e,2)[1],c=Object(a.a)(n,2)[1];return f.b[t](r,c)}))):e}},{key:"detectConstructFrameworks",value:function(){var e;return Object(i.a)(this.map.values()).reduce((function(e,t){var n,r,c=t.metadata,a=null===c||void 0===c||null===(n=c.constructFramework)||void 0===n?void 0:n.name,i=null===c||void 0===c||null===(r=c.constructFramework)||void 0===r?void 0:r.majorVersion;if(a){var o=e[a];void 0===i||o.majorVersions.includes(i)||o.majorVersions.push(i),o.pkgCount+=1}return e}),(e={},Object(c.a)(e,b.c.awscdk,{majorVersions:[],pkgCount:0}),Object(c.a)(e,b.c.cdk8s,{majorVersions:[],pkgCount:0}),Object(c.a)(e,b.c.cdktf,{majorVersions:[],pkgCount:0}),e))}}]),e}(),O=n(76),v=n(89),p=n(1),m=Object(r.createContext)(void 0),g=function(){return Object(r.useContext)(m)},x=function(e){var t=e.children,n=Object(v.b)(),c=n.data,a=n.loading,i=Object(r.useMemo)((function(){if(void 0!==(null===c||void 0===c?void 0:c.packages)&&!a)return new h(c.packages)}),[c,a]);return i?Object(p.jsx)(m.Provider,{value:i,children:t}):Object(p.jsx)(O.a,{})}}},[[174,4,6]]]);
2
- //# sourceMappingURL=main.3e01d988.chunk.js.map
@@ -1 +0,0 @@
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","hooks/usePagination/usePagination.ts","hooks/useCatalogResults/useCatalogResults.ts","hooks/useSearch/useSearch.ts","api/stats/index.ts","contexts/Stats/Stats.tsx","components/Form/Form.tsx","api/config/index.ts","constants/url.ts","hooks/useDebounce/useDebounce.ts","components/SearchItem/SearchItem.tsx","lib/shortbread/shortbread.ts","reportWebVitals.ts","components/DevPreviewBanner/DevPreviewBanner.tsx","lib/shortbread/getLocalStoreWriter.ts","contexts/Shortbread/Shortbread.tsx","components/Footer/constants.ts","components/Footer/testIds.ts","components/Footer/Footer.tsx","constants/links.ts","components/NavPopover/NavPopover.tsx","components/NavPopover/NavPopoverContent.tsx","components/NavPopover/NavPopoverTrigger.tsx","components/Header/testIds.ts","components/Header/Documentation.tsx","components/SearchModal/testIds.ts","components/SearchModal/SearchModal.tsx","components/Header/HeaderSearch.tsx","components/Header/Resources.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/Tag.ts","theme/components/index.ts","theme/components/Divider.ts","theme/foundations/index.ts","theme/foundations/borders.ts","theme/foundations/colors.ts","theme/foundations/radius.ts","theme/foundations/sizes.ts","theme/foundations/shadows.ts","theme/index.ts","contexts/Theme.tsx","register-service-worker.ts","index.tsx","util/createTestIds.ts","components/ExternalLink/ExternalLink.tsx","constants/constructs.ts","api/catalog-search/constants.ts","components/SearchBar/testIds.ts","components/SearchBar/SearchBar.tsx","components/SearchBar/SearchOverlay.tsx","components/SearchBar/SearchSuggestions.tsx","hooks/useRequest/useRequest.ts","components/PageLoader/PageLoader.tsx","api/catalog-search/util.ts","util/url.ts","components/NavLink/NavLink.tsx","components/Card/Card.tsx","hooks/useCatalogSearch/useCatalogSearch.ts","api/package/packages.ts","contexts/Catalog/Catalog.tsx","contexts/Config/Config.tsx","api/catalog-search/catalog-search.ts","contexts/Search/Search.tsx"],"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","LANGUAGES","TypeScript","Python","Java","Go","DotNet","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","takePage","items","limit","start","stop","slice","useCatalogResults","cdkMajor","cdkType","query","language","languages","sort","results","filters","instance","useSearchContext","Error","search","values","useSearch","undefined","data","pageLimit","Math","floor","length","usePagination","defaultStats","packages","updated","fetchStats","a","fetch","API_PATHS","STATS","response","ok","console","error","json","catch","err","StatsContext","loading","useStats","StatsProvider","useRequest","requestStats","statsResponse","useEffect","Form","forwardRef","ref","form","displayName","DEFAULT_FEATURED_PACKAGES","sections","showLastUpdated","defaultConfig","featureFlags","homeRedesign","searchRedesign","packageLinks","featuredPackages","fetchConfig","configOverride","CONFIG","log","PACKAGES_PREFIX","CATALOG_SUFFIX","ASSEMBLY_SUFFIX","METADATA_SUFFIX","QUERY_PARAMS","CDK_TYPE","LANGUAGE","OFFSET","SEARCH_QUERY","SORT","SUBMODULE","CDK_MAJOR","ROUTES","FAQ","HOME","PACKAGES","SEARCH","SITE_TERMS","useDebounce","debouncedValue","setDebouncedValue","delay","handler","setTimeout","clearTimeout","SearchItem","_hover","cursor","alignItems","display","lineHeight","listStyleType","minH","onKeyDown","includes","key","px","role","sx","onPerfEntry","STORAGE_KEY","DevPreviewBanner","defaultIsOpen","sessionStorage","h","in","Card","border","boxShadow","mt","mx","position","InfoOutline","left","top","w","textAlign","textDecoration","Close","right","size","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","DOCUMENTATION","isNavLink","RESOURCES","NavPopover","menuProps","strategy","Link","justifyContent","NavPopoverContent","item","idx","title","link","linkIdx","NavPopoverTrigger","Button","ChevronDown","Documentation","gettingStartedTrigger","gettingStartedMenu","SearchModal","useCatalogSearch","onQueryChange","onSubmit","onSearch","pb","spacing","SearchBar","HeaderSearch","searchModal","exact","path","searchInput","searchIcon","Search","Resources","resourcesTrigger","resourcesMenu","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","HomeRedesign","NotFound","Packages","SearchResults","SearchRedesign","SiteTerms","App","useConfig","isRedesign","theme","components","Code","variants","subtle","whiteSpace","createVariant","overrides","varBase","Tag","baseStyle","background","official","Divider","defaultProps","foundations","borders","colors","blue","bgPrimary","radii","card","sizes","shadows","extendTheme","Theme","resetCSS","isLocalhost","Boolean","match","registerValidSW","swUrl","config","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","onUpdate","onSuccess","ReactDOM","render","StrictMode","Analytics","Config","Catalog","Stats","ExternalLinkWarning","getElementById","Function","getCLS","getFID","getFCP","getLCP","getTTFB","URL","process","origin","headers","contentType","status","indexOf","unregister","reload","checkValidServiceWorker","scope","ids","reduce","acc","curr","rel","CDKType","CDKTYPE_NAME_MAP","awscdk","cdktf","cdk8s","CDKTYPE_RENDER_MAP","imgsrc","OFFICIAL_SCOPES","CatalogSearchSort","SearchBarState","useSearchBarState","hasButton","inputProps","disclosure","inputRef","searchAPI","clickListener","contains","kbdListener","blur","removeEventListener","pos","_focus","input","onFocus","placeholder","borderLeftRadius","searchButton","SearchOverlay","overlay","inset","opacity","SearchSuggestions","debouncedQuery","push","useHistory","recommendations","UnorderedList","suggestionsList","pt","pkg","i","metadata","constructFramework","alt","src","getSuggestionIcon","suggestion","getPackagePath","requestFn","initialValue","onError","setLoading","setData","setError","mountedRef","statefulFetch","res","getDateSort","isAscending","p1","p2","d1","Date","date","d2","getStrSort","localeCompare","SORT_FUNCTIONS","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","FILTER_FUNCTIONS","majorVersion","languageSet","has","keys","some","lang","gitSSHRegex","RegExp","getRepoUrlAndHost","repoUrl","sshUrl","author","repo","createURL","params","searchParams","filter","forEach","k","v","set","toString","createURLSearchParams","getSearchPath","join","submodule","RouterLink","defaultQuery","setQuery","defaultCdkType","setCdkType","defaultCdkMajor","setCdkMajor","defaultLanguages","setLanguages","defaultLanguage","setLanguage","defaultSort","setSort","onLanguageChange","fetchPackages","statusText","CatalogContext","useCatalog","CatalogProvider","requestPackages","catalogResponse","ConfigContext","LOCAL_CONFIG","ConfigProvider","stored","configData","setConfigData","requestConfig","configResponse","CatalogSearchAPI","catalogData","constructFrameworks","catalogMap","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"],"mappings":"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","file":"static/js/main.3e01d988.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\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]);\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 { 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}\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}: UseCatalogResultsOptions) => {\n const filters = useMemo(\n () => ({\n cdkMajor,\n cdkType,\n language: language ?? undefined,\n languages: languages,\n }),\n [cdkMajor, cdkType, language, languages]\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","import { API_PATHS } from \"../../constants/url\";\n\nexport const 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 { 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 { API_PATHS } from \"../../constants/url\";\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 PackageLinksConfig {\n name: string;\n value: string;\n displayText?: string;\n}\n\nexport interface FeatureFlags {\n homeRedesign?: boolean;\n searchRedesign?: boolean;\n}\n\nexport interface Config {\n featureFlags?: FeatureFlags;\n packageLinks?: PackageLinksConfig[];\n featuredPackages?: FeaturedPackages;\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 homeRedesign: false,\n searchRedesign: false,\n },\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","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} 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 { 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 { CloseIcon, InfoOutlineIcon } from \"@chakra-ui/icons\";\nimport {\n Box,\n IconButton,\n Collapse,\n Text,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Card } from \"../Card\";\nimport { ExternalLink } from \"../ExternalLink\";\n\nconst STORAGE_KEY = \"showing-dev-preview-banner\";\n\nexport const DevPreviewBanner: FunctionComponent = () => {\n const { isOpen, onClose } = useDisclosure({\n defaultIsOpen: JSON.parse(\n window.sessionStorage.getItem(STORAGE_KEY) ?? \"true\"\n ),\n onClose: () => window.sessionStorage.setItem(STORAGE_KEY, \"false\"),\n });\n\n return (\n <Box h=\"max-content\">\n <Collapse in={isOpen}>\n <Card\n aria-label=\"Preview Banner\"\n bg=\"blue.500\"\n border=\"none\"\n boxShadow=\"none\"\n color=\"white\"\n mt={4}\n mx={4}\n p={4}\n position=\"relative\"\n role=\"alertdialog\"\n >\n <InfoOutlineIcon h={5} left={4} position=\"absolute\" top={4} w={5} />\n <Text fontSize=\"md\" mx={8} textAlign=\"center\">\n This application is in Dev Preview. Some features may change. If you\n find any issues, please report them{\" \"}\n <ExternalLink\n color=\"inherit\"\n hasWarning={false}\n href=\"https://github.com/cdklabs/construct-hub-webapp/issues\"\n textDecoration=\"underline\"\n >\n here\n </ExternalLink>\n </Text>\n <IconButton\n aria-label=\"Dismiss banner\"\n colorScheme=\"white\"\n icon={<CloseIcon />}\n onClick={onClose}\n position=\"absolute\"\n right={4}\n size=\"xs\"\n top={3}\n variant=\"ghost\"\n />\n </Card>\n </Collapse>\n </Box>\n );\n};\n","import type { ShortbreadOptions } from \"./shortbread\";\n\nconst isDev = process.env.NODE_ENV === \"development\";\n\n/**\n * This function allows for shortbread testing locally.\n * If the node env is dev and the url has a query param of sb=true,\n * it will return a __storeWriter function to pass into shortbread's options\n */\nexport const getLocalStoreWriter = (): ShortbreadOptions[\"__storeWriter\"] => {\n const search = new URLSearchParams(window.location.search);\n const shouldUseOverride = search.get(\"sb\") === \"true\";\n\n if (isDev && shouldUseOverride) {\n return (cookie) => {\n document.cookie = cookie.replace(\" secure=true;\", \"\");\n };\n }\n\n return undefined;\n};\n","import {\n createContext,\n FunctionComponent,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport * as shortbread from \"../../lib/shortbread\";\n\nconst { initialize, ...publicAPI } = shortbread;\n\nconst ShortbreadContext = createContext<Partial<typeof publicAPI>>({});\n\nexport const useShortBread = () => useContext(ShortbreadContext);\n\nexport const ShortbreadProvider: FunctionComponent = ({ children }) => {\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n let isCancelled = false;\n\n initialize()\n .then(() => {\n if (!isCancelled) {\n publicAPI.checkForCookieConsent();\n setIsReady(true);\n }\n })\n .catch((e) => {\n console.error(e);\n\n if (!isCancelled) {\n setIsReady(false);\n }\n });\n\n return () => {\n isCancelled = true;\n setIsReady(false);\n };\n }, []);\n\n return (\n <ShortbreadContext.Provider value={isReady ? publicAPI : {}}>\n {children}\n </ShortbreadContext.Provider>\n );\n};\n","import { ROUTES } from \"../../constants/url\";\n\nexport type Link = {\n display: string;\n url: string;\n testId: string;\n isExternal?: boolean;\n};\n\nexport const FOOTER_LINKS: Record<string, Link> = {\n SERVICE_TERMS: {\n display: \"AWS Service Terms\",\n url: \"https://aws.amazon.com/service-terms/\",\n testId: \"service-terms\",\n },\n PRIVACY: {\n display: \"Privacy\",\n url: \"https://aws.amazon.com/privacy/\",\n testId: \"privacy\",\n },\n SITE_TERMS: {\n display: \"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 type { IMenuItems } from \"../components/NavPopover\";\n\nexport const DOCUMENTATION: IMenuItems = [\n { display: \"FAQ\", isNavLink: true, url: \"/faq\" },\n {\n display: \"Construct Hub on GitHub\",\n url: \"https://github.com/cdklabs/construct-hub\",\n },\n {\n display: \"Issues on GitHub\",\n url: \"https://github.com/cdklabs/construct-hub/issues\",\n },\n];\n\nexport const RESOURCES: IMenuItems = [\n {\n display: \"AWS CDK\",\n links: [\n { display: \"Home\", url: \"https://aws.amazon.com/cdk/\" },\n {\n display: \"Getting Started\",\n url: \"https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html\",\n },\n { display: \"Workshop\", url: \"https://cdkworkshop.com/\" },\n {\n display: \"Best Practices\",\n url: \"https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk\",\n },\n ],\n },\n {\n display: \"CDK for Terraform\",\n links: [\n {\n display: \"Getting Started\",\n url: \"https://learn.hashicorp.com/tutorials/terraform/cdktf\",\n },\n {\n display: \"Tutorials\",\n url: \"https://learn.hashicorp.com/collections/terraform/cdktf\",\n },\n ],\n },\n {\n display: \"CDK for Kubernetes\",\n links: [\n { display: \"Home\", url: \"https://cdk8s.io\" },\n {\n display: \"Getting Started\",\n url: \"https://cdk8s.io/docs/latest/getting-started\",\n },\n { display: \"Documentation\", url: \"https://cdk8s.io/docs/latest\" },\n {\n display: \"API Reference\",\n url: \"https://cdk8s.io/docs/latest/reference/index.html\",\n },\n ],\n },\n {\n display: \"Community\",\n links: [\n {\n display: \"Slack\",\n url: \"https://join.slack.com/t/cdk-dev/shared_invite/zt-mso6p56d-qJp7SOTBvMaQuDrx7R2wHg\",\n },\n { display: \"Community Hub\", url: \"https://cdk.dev\" },\n ],\n },\n];\n","import { Menu, MenuProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface NavPopoverProps extends MenuProps {}\n\nexport const NavPopover: FunctionComponent<NavPopoverProps> = ({\n children,\n ...menuProps\n}) => {\n return (\n <Menu colorScheme=\"blue.800\" strategy=\"fixed\" {...menuProps}>\n {children}\n </Menu>\n );\n};\n","import {\n forwardRef,\n MenuDivider,\n MenuGroup,\n MenuItem,\n MenuList,\n MenuListProps,\n} from \"@chakra-ui/react\";\nimport { Fragment, FunctionComponent } from \"react\";\nimport { ExternalLink } from \"../ExternalLink\";\nimport { NavLink } from \"../NavLink\";\nimport type { IMenuItems, ILink } from \"./types\";\n\nexport interface NavPopoverContentProps extends MenuListProps {\n items: IMenuItems;\n}\n\nconst Link: FunctionComponent<ILink> = ({ display, isNavLink, url }) =>\n isNavLink ? (\n <NavLink color=\"blue.500\" to={url} 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 \"resourcesTrigger\",\n \"resourcesMenu\",\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 Documentation: FunctionComponent = () => (\n <NavPopover>\n <NavPopoverTrigger data-testid={testIds.gettingStartedTrigger}>\n Getting Started\n </NavPopoverTrigger>\n <NavPopoverContent\n data-testid={testIds.gettingStartedMenu}\n items={DOCUMENTATION}\n />\n </NavPopover>\n);\n","import { 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 type { FunctionComponent } from \"react\";\nimport { RESOURCES } from \"../../constants/links\";\nimport {\n NavPopover,\n NavPopoverContent,\n NavPopoverTrigger,\n} from \"../NavPopover\";\nimport testIds from \"./testIds\";\n\nexport const Resources: FunctionComponent = () => {\n return (\n <NavPopover>\n <NavPopoverTrigger data-testid={testIds.resourcesTrigger}>\n Resources\n </NavPopoverTrigger>\n <NavPopoverContent\n data-testid={testIds.resourcesMenu}\n items={RESOURCES}\n />\n </NavPopover>\n );\n};\n","import { Box, Heading } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport testIds from \"./testIds\";\n\nexport const Title: FunctionComponent = () => (\n <Heading as=\"h1\" color=\"blue.800\" data-testid={testIds.title} size=\"lg\">\n <Link to=\"/\">\n <Box as=\"span\" color=\"blue.500\">\n Construct\n </Box>{\" \"}\n Hub\n </Link>\n </Heading>\n);\n","import {\n Drawer,\n DrawerBody,\n DrawerOverlay,\n DrawerHeader,\n DrawerContent,\n DrawerCloseButton,\n Portal,\n Stack,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Documentation } from \"./Documentation\";\nimport { Resources } from \"./Resources\";\nimport testIds from \"./testIds\";\nimport { Title } from \"./Title\";\nexport interface MobileNavProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport const MobileNav: FunctionComponent<MobileNavProps> = ({\n isOpen,\n onClose,\n}) => {\n return (\n <Portal>\n <Drawer isOpen={isOpen} onClose={onClose} placement=\"left\" size=\"xs\">\n <DrawerOverlay />\n <DrawerContent data-testid={testIds.mobileNav}>\n <DrawerCloseButton />\n <DrawerHeader display=\"flex\" justifyContent=\"center\">\n <Title />\n </DrawerHeader>\n <DrawerBody>\n <Stack align=\"start\" justify=\"start\" spacing={4}>\n <Documentation />\n <Resources />\n </Stack>\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </Portal>\n );\n};\n","import { HamburgerIcon } from \"@chakra-ui/icons\";\nimport { IconButton, useDisclosure } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { MobileNav } from \"./MobileNav\";\nimport testIds from \"./testIds\";\n\nexport const NavButton: FunctionComponent = () => {\n const nav = useDisclosure();\n\n return (\n <>\n <IconButton\n aria-label=\"Navigation Menu\"\n borderRadius=\"md\"\n data-testid={testIds.navOpen}\n display={{ md: \"none\" }}\n icon={<HamburgerIcon />}\n onClick={nav.onOpen}\n variant=\"ghost\"\n />\n <MobileNav {...nav} />\n </>\n );\n};\n","import { Box, Grid, GridItem, GridItemProps } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Documentation } from \"./Documentation\";\nimport { HeaderSearch } from \"./HeaderSearch\";\nimport { NavButton } from \"./NavButton\";\nimport { Resources } from \"./Resources\";\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 <Documentation />\n </Box>\n <Box>\n <Resources />\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 } 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 { PageLoader } from \"./components/PageLoader\";\nimport { ROUTES } from \"./constants/url\";\nimport { useConfig } from \"./contexts/Config\";\n\nconst FAQ = lazy(() => import(\"./views/FAQ\"));\nconst Home = lazy(() => import(\"./views/Home\"));\nconst HomeRedesign = lazy(() => import(\"./views/HomeRedesign\"));\nconst NotFound = lazy(() => import(\"./views/NotFound\"));\nconst Packages = lazy(() => import(\"./views/Packages\"));\nconst SearchResults = lazy(() => import(\"./views/SearchResults\"));\nconst SearchRedesign = lazy(() => import(\"./views/SearchRedesign\"));\nconst SiteTerms = lazy(() => import(\"./views/SiteTerms\"));\n\nexport const App: FunctionComponent = () => {\n const { data, loading } = useConfig();\n const featureFlags = data?.featureFlags ?? {};\n const isRedesign = featureFlags?.homeRedesign || featureFlags?.searchRedesign;\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 {!loading && !isRedesign ? <DevPreviewBanner /> : <div />}\n {loading ? (\n <PageLoader />\n ) : (\n <Switch>\n <LazyRoute component={FAQ} exact path={ROUTES.FAQ} />\n <LazyRoute\n component={featureFlags?.homeRedesign ? HomeRedesign : Home}\n exact\n path={ROUTES.HOME}\n />\n <LazyRoute component={SiteTerms} exact path={ROUTES.SITE_TERMS} />\n <LazyRoute component={Packages} path={ROUTES.PACKAGES} />\n <LazyRoute\n component={\n featureFlags?.searchRedesign ? SearchRedesign : SearchResults\n }\n exact\n path={ROUTES.SEARCH}\n />\n <LazyRoute component={NotFound} path=\"*\" />\n </Switch>\n )}\n <Footer />\n </Grid>\n );\n};\n","import { theme } from \"@chakra-ui/react\";\n\nconst {\n components: { Code: base },\n} = theme;\n\nexport const Code = {\n ...base,\n variants: {\n ...base.variants,\n \"code-block\": {\n ...base.variants.subtle,\n display: \"block\",\n whiteSpace: \"pre\",\n },\n },\n};\n","import type { tagAnatomy } from \"@chakra-ui/anatomy\";\nimport { theme } from \"@chakra-ui/react\";\nimport type {\n PartsStyleInterpolation,\n StyleFunctionProps,\n} from \"@chakra-ui/theme-tools\";\n\nconst createVariant =\n (\n variant: PartsStyleInterpolation<typeof tagAnatomy>,\n overrides: Record<string, any>\n ) =>\n (props: StyleFunctionProps) => {\n const varBase = typeof variant === \"function\" ? variant(props) : variant;\n return {\n ...varBase,\n container: {\n ...varBase.container,\n ...overrides,\n },\n };\n };\n\nconst {\n components: { Tag: base },\n} = theme;\n\nexport const Tag = {\n ...base,\n baseStyle: {\n container: {\n fontWeight: \"normal\",\n },\n },\n variants: {\n ...base.variants,\n subtle: createVariant(base.variants.subtle, {\n background: \"#F2F2F2\",\n color: \"blue.800\",\n }),\n official: createVariant(base.variants.subtle, {\n background: \"rgba(33, 150, 83, 0.1)\",\n color: \"#219653\",\n }),\n },\n};\n","import { theme } from \"@chakra-ui/react\";\nimport { Code } from \"./Code\";\nimport { Divider } from \"./Divider\";\nimport { Tag } from \"./Tag\";\n\nexport const components = {\n ...theme.components,\n Code,\n Divider,\n Tag,\n};\n","// TODO: Figure out why this does nothing\nexport const Divider = {\n defaultProps: {\n borderColor: \"rgba(0, 124, 253, 0.15)\",\n },\n};\n","import { borders } from \"./borders\";\nimport { colors } from \"./colors\";\nimport { radii } from \"./radius\";\nimport { shadows } from \"./shadows\";\nimport { sizes } from \"./sizes\";\n\nexport const foundations = {\n borders,\n colors,\n radii,\n sizes,\n shadows,\n};\n","export const borders = {\n base: \"1px solid rgba(0, 124, 253, 0.15)\",\n};\n","import { theme } from \"@chakra-ui/react\";\n\nexport const colors = {\n ...theme.colors,\n blue: {\n 50: \"#dcf3ff\",\n 100: \"#aed9ff\",\n 200: \"#7dbeff\",\n 300: \"#4aa4ff\",\n 400: \"#1a8aff\",\n 500: \"#0070e6\",\n 600: \"#0057b4\",\n 700: \"#003e82\",\n 800: \"#002551\",\n 900: \"#000d21\",\n },\n bgPrimary: \"#F8F8F8\",\n};\n","export const radii = {\n card: \"0.75rem\",\n};\n","// import { theme } from \"@chakra-ui/react\";\n\nexport const sizes = {\n container: {\n \"2xl\": \"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 { components } from \"./components\";\nimport { foundations } from \"./foundations\";\n\nexport const theme = extendTheme({\n ...foundations,\n components,\n});\n","import { ChakraProvider } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { theme } from \"../theme\";\n\nexport const Theme: FunctionComponent = ({ children }) => {\n return (\n <ChakraProvider resetCSS theme={theme}>\n {children}\n </ChakraProvider>\n );\n};\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://cra.link/PWA\n\n// [::1] is the IPv6 localhost address.\n// 127.0.0.0/8 are considered localhost for IPv4.\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n window.location.hostname === \"[::1]\" ||\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nconst registerValidSW = (swUrl: string, config?: Config) => {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n \"New content is available and will be used when all \" +\n \"tabs for this page are closed. See https://cra.link/PWA.\"\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log(\"Content is cached for offline use.\");\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error(\"Error during service worker registration:\", error);\n });\n};\n\nconst checkValidServiceWorker = (swUrl: string, config?: Config) => {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { \"Service-Worker\": \"script\" },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\");\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf(\"javascript\") === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n void navigator.serviceWorker.ready.then((registration) => {\n void registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n \"No internet connection found. App is running in offline mode.\"\n );\n });\n};\n\nexport const register = (config?: Config) => {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener(\"load\", () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n void navigator.serviceWorker.ready.then(() => {\n console.log(\n \"This web app is being served cache-first by a service worker. To learn more, visit https://cra.link/PWA\"\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n};\n\nexport const unregister = () => {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n void registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n};\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { BrowserRouter as Router } from \"react-router-dom\";\nimport \"./index.css\";\nimport { App } from \"./App\";\nimport { AnalyticsProvider } from \"./contexts/Analytics\";\nimport { CatalogProvider } from \"./contexts/Catalog\";\nimport { ConfigProvider } from \"./contexts/Config\";\nimport { ExternalLinkWarningProvider } from \"./contexts/ExternalLinkWarning\";\nimport { SearchProvider } from \"./contexts/Search\";\nimport { ShortbreadProvider } from \"./contexts/Shortbread\";\nimport { StatsProvider } from \"./contexts/Stats\";\nimport { Theme } from \"./contexts/Theme\";\nimport { register } 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// Register service worker for PWA functionality.\nregister();\n","type TestIds<T extends Readonly<string[]>> = {\n [key in T[number]]: string;\n};\n\n/**\n * A helper to create scoped test ids across components which can be re-used\n * in e2e and unit tests.\n */\nexport const createTestIds = <T extends Readonly<string[]>>(\n scope: string,\n ids: T\n): TestIds<T> =>\n ids.reduce<Record<string, string>>((acc, curr) => {\n acc[curr] = `${scope}-${curr}`;\n return acc;\n }, {}) as TestIds<T>;\n","import { 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","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\nexport const OFFICIAL_SCOPES = [\"@aws-cdk/\", \"@cdktf/\"] as const;\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}\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 { 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\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={`Search construct libraries`}\n ref={inputRef}\n value={value ?? searchAPI.query}\n {...inputProps}\n />\n\n {hasButton ? (\n <InputRightElement w=\"9rem\">\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 Image,\n Text,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent, ReactNode } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { CatalogPackageWithId } from \"../../api/catalog-search\";\nimport { CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { useDebounce } from \"../../hooks/useDebounce\";\nimport { getPackagePath } from \"../../util/url\";\nimport { Card, CardProps } from \"../Card\";\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 const getSuggestionIcon = (pkg: CatalogPackageWithId): ReactNode => {\n const { metadata } = pkg;\n let icon = null;\n const cdkType = metadata?.constructFramework?.name;\n\n if (cdkType && cdkType in CDKTYPE_RENDER_MAP) {\n icon = (\n <Image\n alt={`${cdkType} Logo`}\n h={5}\n src={CDKTYPE_RENDER_MAP[cdkType].imgsrc}\n w={5}\n />\n );\n }\n\n return icon;\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: CatalogPackageWithId, i) => {\n const navigate = () => push(getPackagePath(pkg));\n const icon = getSuggestionIcon(pkg);\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 {icon}\n <Text ml={icon ? 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 { 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 { 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 { CatalogSearchFilters } from \".\";\nimport { Language } from \"../../constants/languages\";\nimport { CatalogPackage } from \"../package/packages\";\nimport { CatalogSearchSort } from \"./constants\";\n\ntype SortFunction = (p1: CatalogPackage, p2: CatalogPackage) => number;\n\ntype FilterFunctionBuilder<T> = (\n filter: T\n) => undefined | ((pkg: CatalogPackage) => 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 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\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};\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};\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}: {\n cdkMajor?: string | number;\n query?: string;\n offset?: string | number;\n cdkType?: CDKType;\n language?: Language;\n languages?: Language[];\n sort?: CatalogSearchSort;\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 });\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 { 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 { 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}\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 * 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 * 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 [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({ cdkType, cdkMajor, language, languages, query, sort })\n );\n },\n [cdkType, cdkMajor, language, languages, push, query, replace, sort]\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 setQuery,\n setSort,\n sort,\n }),\n [cdkMajor, cdkType, language, languages, onSearch, onSubmit, query, sort]\n );\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 {\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 { CatalogSearchSort } from \"./constants\";\nimport { FILTER_FUNCTIONS, SORT_FUNCTIONS } from \"./util\";\n\nexport interface CatalogPackageWithId extends CatalogPackage {\n id: string;\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\nexport type CatalogSearchResults = Map<string, CatalogPackageWithId>;\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[]) {\n const catalogMap = catalogData.reduce((map, pkg) => {\n const { name, version } = pkg;\n const id = [name, version].join(\"@\");\n\n map.set(id, {\n ...pkg,\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 } = 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(Boolean) as ((pkg: CatalogPackage) => 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: CatalogPackageWithId) => {\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\";\n\nconst SearchContext = createContext<CatalogSearchAPI | undefined>(undefined);\n\nexport const useSearchContext = () => useContext(SearchContext);\n\nexport const SearchProvider: FunctionComponent = ({ children }) => {\n const { data, loading } = useCatalog();\n\n const searchAPI = useMemo(() => {\n if (data?.packages === undefined || loading) return;\n\n const instance = new CatalogSearchAPI(data.packages);\n return instance;\n }, [data, loading]);\n\n if (!searchAPI) {\n return <PageLoader />;\n }\n\n return (\n <SearchContext.Provider value={searchAPI}>\n {children}\n </SearchContext.Provider>\n );\n};\n"],"sourceRoot":""}