{"version":3,"sources":["articles/components/Code.jsx","serviceWorker.js","constants.js","Header.jsx","articles/components/A.jsx","articles/components/H3.jsx","articles/components/Hero.jsx","articles/components/HomeLink.jsx","articles/imageMappings.js","images/typewriter-illustration.png","articles/components/Image.jsx","articles/components/InlineCode.jsx","articles/components/Li.jsx","articles/components/P.jsx","articles/components/Wrapper.jsx","articles/defaultComponentMapping.js","articles/components/Standout.jsx","articles/posts/automating-local-env-vars/index.jsx","images/articleThumbs/code-block.png","images/articleThumbs/pattern.png","images/articleThumbs/react-logo.png","images/articleThumbs/scream-emoji-banner.png","articles/posts/automating-local-env-vars/metadata.js","images/articleThumbs/styled-components.png","articles/posts/handling-line-endings/index.jsx","articles/posts/handling-line-endings/metadata.js","articles/posts/refactoring-this-site/index.jsx","articles/posts/refactoring-this-site/metadata.js","articles/posts/smart-code-performance/index.jsx","articles/posts/smart-code-performance/metadata.js","articles/articleMetaData.js","homepage/ArticleListItem.jsx","homepage/ArticleList.jsx","Footer.jsx","ScrollToTop.jsx","homepage/Home.jsx","about/Anchor.jsx","about/About.jsx","articles/Articles.jsx","Error404.jsx","index.js"],"names":["global","window","Prism","require","Code","children","language","className","replace","defaultProps","code","theme","dracula","style","tokens","getLineProps","getTokenProps","pop","padding","map","line","i","key","token","Boolean","location","hostname","match","BLOG_ROOT","Header","href","target","title","rel","to","A","rest","H3","props","Hero","color","date","shortTitle","subtitle","author","HomeLink","viewBox","fill","d","imageMappings","typewriter_illustration","Image","resolvedSrc","src","alt","loading","InlineCode","Li","P","Wrapper","defaultComponentMapping","a","blockquote","h3","img","inlineCode","li","p","wrapper","Content","lazy","Post","fallback","components","metadata","content","description","id","imageAlt","imageSrc","Pattern","url","ScreamEmojiBanner","ReactLogo","CodeBlock","articleMetaData","automatingLocalEnvVars","handlingLineEndings","smartCodePerformance","refactoringThisSite","allArticlesMetaData","Object","keys","ArticleListItem","article","ArticleList","articles","articleItems","useMemo","Footer","xmlns","fillRule","clipRule","strokeLinejoin","strokeMiterlimit","ScrollToTop","useEffect","scrollTo","Home","Helmet","Anchor","About","Articles","slug","useParams","name","property","Error404","ReactDOM","render","path","element","document","getElementById","navigator","serviceWorker","ready","then","registration","unregister"],"mappings":"+KAKmB,qBAAXA,EAAyBA,EAASC,QAAQC,MAAQA,IAE1DC,EAAQ,IAoCOC,IAlCF,SAAC,GAA6B,IAA3BC,EAA0B,EAA1BA,SACRC,EADkC,EAAhBC,UACGC,QAAQ,YAAa,IAEhD,OACE,cAAC,IAAD,2BACMC,KADN,IAEEC,KAAML,EACNC,SAAUA,EACVK,MAAOC,IAJT,SAMG,YAAgE,IAA7DL,EAA4D,EAA5DA,UAAWM,EAAiD,EAAjDA,MAAOC,EAA0C,EAA1CA,OAAQC,EAAkC,EAAlCA,aAAcC,EAAoB,EAApBA,cAK1C,OAFAF,EAAOG,MAGL,qBACEV,UAAS,4CAAuCA,GAChDM,MAAK,2BAAOA,GAAP,IAAcK,QAAS,SAF9B,SAIGJ,EAAOK,KAAI,SAACC,EAAMC,GAAP,OACV,+CAAiBN,EAAa,CAAEK,OAAME,IAAKD,KAA3C,aACGD,EAAKD,KAAI,SAACI,EAAOD,GAAR,OACR,oCAAoBN,EAAc,CAAEO,QAAOD,SAAhCA,QAFLD,e,wHClBJG,QACW,cAA7BvB,OAAOwB,SAASC,UAEe,UAA7BzB,OAAOwB,SAASC,UAEhBzB,OAAOwB,SAASC,SAASC,MACvB,2DClBC,IACMC,EAAY,W,cCcVC,EAZA,kBACX,sBAAKtB,UAAU,wBAAf,UACI,oBAAIA,UAAU,qCAAd,uBACA,oBAAIA,UAAU,4CAAd,uBACA,sBAAKA,UAAU,SAAf,UACI,mBAAGA,UAAU,+CAA+CuB,KAAK,kCAAkCC,OAAO,SAASC,MAAM,SAASC,IAAI,sBAAtI,oBACA,mBAAG1B,UAAU,+CAA+CuB,KAAK,mCAAmCC,OAAO,SAASC,MAAM,UAAUC,IAAI,sBAAxI,qBACA,cAAC,IAAD,CAAM1B,UAAU,2CAA2C2B,GAAG,SAASF,MAAM,QAA7E,0B,8BCGGG,EAXL,SAAC,GAAD,IAAG9B,EAAH,EAAGA,SAAa+B,EAAhB,wBACN,2CACI7B,UAAU,2BACVwB,OAAO,SACPE,IAAI,uBACAG,GAJR,aAMK/B,M,QCDMgC,EANJ,SAAAC,GAAK,OACd,oBAAI/B,UAAU,+BAAd,SACG+B,EAAMjC,YCCLkC,EAAO,SAACD,GAAD,OACX,wBAAQ/B,UAAS,iCAA4B+B,EAAME,MAAlC,eAAjB,SACE,sBAAKjC,UAAU,0CAAf,UACG+B,EAAMG,MACL,sBAAMlC,UAAU,yBAAhB,SACE,gCAAQ+B,EAAMG,SAGlB,oBAAIlC,UAAU,8CAAd,SACE,sBAAMA,UAAU,8CAAhB,SACG+B,EAAMI,YAAcJ,EAAMN,UAG9BM,EAAMK,UAAY,oBAAIpC,UAAU,mBAAd,SAAkC+B,EAAMK,WAC3D,qBAAIpC,UAAU,0BAAd,gBAA4C+B,EAAMM,gBAcxDL,EAAK9B,aAAe,CAClBmC,OAAQ,YACRJ,MJnC2B,OIoC3BC,KAAM,KACNC,WAAY,KACZC,SAAU,KACVX,MAAO,MAGMO,QC3BAM,EAZE,kBACf,qBAAKtC,UAAU,yBAAf,SACI,eAAC,IAAD,CAAM2B,GAAG,IAAI3B,UAAU,6GAAvB,UACI,sBAAKA,UAAU,KAAK,YAAU,cAAcuC,QAAQ,YAAYjC,MAAO,CAACkC,KAAM,gBAA9E,UACI,qDACA,sBAAMC,EAAE,gDAEZ,sBAAMzC,UAAU,MAAhB,kCCJK0C,EAJO,CACpBC,wBCHa,IAA0B,qDCqB1BC,EAhBD,SAACb,GACb,IAAMc,EAAcH,EAAcX,EAAMe,KAExC,OAAKD,EAME,qBAAK7C,UAAU,UAAU8C,IAAKD,EAAaE,IAAKhB,EAAMgB,MAJzD,qBAAK/C,UAAU,UAAU8C,IAAKf,EAAMe,IAAKC,IAAKhB,EAAMgB,IAAKC,QAAQ,UCCxDC,EARI,SAAC,GAAD,IAAGnD,EAAH,EAAGA,SAAH,OACjB,sBAAME,UAAU,WAAhB,SAA4BF,KCIfoD,EANJ,SAAAnB,GAAK,OACd,oBAAI/B,UAAU,uCAAd,SACG+B,EAAMjC,YCOIqD,EARL,SAAC,GAAD,IAAGrD,EAAH,EAAGA,SAAH,OACN,mBAAGE,UAAU,mCAAb,SAAiDF,KCAtCsD,EAFC,SAACrB,GAAD,OAAW,qBAAK/B,UAAU,SAAf,SAAyB+B,EAAMjC,YCsB3CuD,EAZiB,CAC9BC,EAAG1B,EACH2B,WCXe,SAACxB,GAAD,OACb,4BAAY/B,UAAU,uEAAtB,SAA8F+B,EAAMjC,YDWtGK,KAAMN,IACN2D,GAAI1B,EACJ2B,IAAKb,EACLc,WAAYT,EACZU,GAAIT,EACJU,EAAGT,EACHU,QAAST,GEhBLU,EAAUC,gBAAK,kDAQNC,EANF,kBACX,cAAC,WAAD,CAAUC,SAAU,wBAApB,SACE,cAACH,EAAD,CAASI,WAAYb,OCTV,MAA0B,uCCA1B,MAA0B,oCCA1B,MAA0B,uCCA1B,MAA0B,gDCQ5Bc,GCRE,IDQS,CACtB,4BAA6B,CAC3BlC,MAAO,SACPmC,QAASJ,EACT9B,KAAM,gBACNmC,YAAY,sFAGZC,GAAI,IACJC,SAAU,qBACVC,SAAUC,EACVtC,WAAY,yCACZC,SAAS,6DAGTX,MAAO,yCACPiD,IAAI,GAAD,OAAKrD,EAAL,iCEnBDyC,EAAUC,gBAAK,kDCGRI,EAAW,CACtB,wBAAyB,CACvBlC,MAAO,aACPmC,QDJS,kBACX,cAAC,WAAD,CAAUH,SAAU,wBAApB,SACE,cAAC,EAAD,CAASC,WAAYb,OCGrBnB,KAAM,iBACNmC,YAAY,uIAIZC,GAAI,IACJC,SAAU,iBACVC,SAAUG,EACVxC,WAAY,wBACZC,SAAS,2DAGTX,MAAO,wBACPiD,IAAI,GAAD,OAAKrD,EAAL,4BCpBDyC,EAAUC,gBAAK,kDCGRI,EAAW,CACtB,wBAAyB,CACvBlC,MAAO,WACPmC,QDJS,kBACX,cAAC,WAAD,CAAUH,SAAU,wBAApB,SACE,cAAC,EAAD,CAASC,WAAYb,OCGrBnB,KAAM,kBACNmC,YAAY,mIAIZC,GAAI,IACJC,SAAU,iBACVC,SAAUI,EACVzC,WAAY,wBACZC,SAAS,iEAGTX,MAAO,mCACPiD,IAAI,GAAD,OAAKrD,EAAL,4BCpBDyC,EAAUC,gBAAK,kDCGRI,EAAW,CACtB,yBAA0B,CACxBlC,MAAO,MACPmC,QDJS,kBACX,cAAC,WAAD,CAAUH,SAAU,wBAApB,SACE,cAAC,EAAD,CAASC,WAAYb,OCGrBnB,KAAM,cACNmC,YAAY,mDAGZC,GAAI,IACJC,SAAU,qBACVC,SAAUK,EACV1C,WAAY,+BACZC,SAAS,mDAGTX,MAAO,qCACPiD,IAAI,GAAD,OAAKrD,EAAL,6BCnBDyD,EAAe,mDAChBC,GACAC,GACAC,GACAC,GAGQC,EAAsBC,OAAOC,KAAKP,GAAiBlE,KAC9D,SAACG,GAAD,OAAS+D,EAAgB/D,MAGZ+D,ICeAQ,EA3BS,SAAC,GAAD,IAAGC,EAAH,EAAGA,QAAH,OACtB,yBAASvF,UAAU,oBAAnB,SACE,cAAC,IAAD,CAAMA,UAAU,0CAA0C2B,GAAI4D,EAAQb,IAAtE,SACE,sBAAK1E,UAAU,+BAAf,UACE,qBAAKA,UAAU,oDAAf,SACE,qBACE8C,IAAKyC,EAAQf,SACbxE,UAAU,KACV+C,IAAKwC,EAAQhB,SAAWgB,EAAQhB,SAAW,oBAG/C,sBAAKvE,UAAU,uBAAf,UACE,oBAAIA,UAAU,kCAAd,SAAiDuF,EAAQ9D,QACzD,mBAAGzB,UAAU,kBAAb,SAAgCuF,EAAQlB,cACxC,oBAAGrE,UAAU,iBAAb,gBACMuF,EAAQlD,OAASkD,EAAQlD,OAAS,0BCEnCmD,EAhBK,SAAC,GAAkB,IAAhBC,EAAe,EAAfA,SACbC,EAAeC,mBAAQ,kBAAMF,EAAS7E,KAAI,SAAA2E,GAAO,OACnD,cAAC,EAAD,CAAiBA,QAASA,GAAcA,EAAQb,UAChD,CAACe,IAEL,OACI,yBAASzF,UAAU,oBAAnB,SACK0F,KCDEE,EATA,kBACX,wBAAQ5F,UAAU,aAAlB,SACI,oBAAGA,UAAU,yGAAyGuB,KAAK,0CAA0CC,OAAO,SAASC,MAAM,SAASC,IAAI,sBAAxM,UACI,qBAAK1B,UAAU,YAAYwC,KAAK,eAAeqD,MAAM,6BAA6BtD,QAAQ,YAAYuD,SAAS,UAAUC,SAAS,UAAUC,eAAe,QAAQC,iBAAiB,QAApL,SAA4L,sBAAMxD,EAAE,8qBACpM,sBAAMzC,UAAU,aAAhB,kCCIGkG,EARK,WAKlB,OAJAC,qBAAU,WACRzG,OAAO0G,SAAS,EAAG,KAClB,IAEI,MCkBMC,EAhBF,WACX,OACE,qCACE,cAACC,EAAA,EAAD,UACE,+CAAW,WAEb,sBAAKtG,UAAU,aAAf,UACE,cAAC,EAAD,IACA,cAAC,EAAD,IACA,cAAC,EAAD,CAAayF,SAAUN,IACvB,cAAC,EAAD,WCAOoB,EAhBA,SAAAxE,GAAK,OAClB,mBACE/B,UAAU,4CACVuB,KAAMQ,EAAMR,KACZC,OAAO,SACPE,IAAI,sBAJN,SAMKK,EAAMjC,YC+FE0G,EAnGD,WACZ,OACE,qCACE,cAACF,EAAA,EAAD,UACE,uDAAW,WAEb,0BAAStG,UAAU,aAAnB,UACE,0BAASA,UAAU,wBAAnB,UACE,yBAAQA,UAAU,0BAAlB,UACE,oBAAIA,UAAU,qCAAd,mBACA,sBAAKA,UAAU,MAAf,UACE,mBACEA,UAAU,6CACVuB,KAAK,8BACLE,MAAM,SACND,OAAO,SACPE,IAAI,sBALN,SAOE,qBACEc,KAAK,eACLqD,MAAM,6BACNtD,QAAQ,YACRuD,SAAS,UACTC,SAAS,UACTC,eAAe,QACfC,iBAAiB,QAPnB,SASE,sBAAMxD,EAAE,grBAGZ,mBACEzC,UAAU,6CACVuB,KAAK,+BACLE,MAAM,UACND,OAAO,SACPE,IAAI,sBALN,SAOE,qBACEc,KAAK,eACLqD,MAAM,6BACNtD,QAAQ,YACRuD,SAAS,UACTC,SAAS,UACTC,eAAe,QACfC,iBAAiB,QAPnB,SASE,sBACExD,EAAE,glBACFqD,SAAS,sBAMnB,sBAAK9F,UAAU,mBAAf,UACE,oBAAGA,UAAU,4BAAb,2CACiC,IAC/B,cAAC,EAAD,CAAQuB,KAAK,8BAAb,sBAFF,0EAKA,oBAAGvB,UAAU,qBAAb,iFAEQ,IACN,cAAC,EAAD,CAAQuB,KAAK,mCAAb,kBAHF,iLAMyC,IACvC,cAAC,EAAD,CAAQA,KAAK,qCAAb,kBAPF,OASA,oBAAGvB,UAAU,qBAAb,wFAEa,cAAC,EAAD,CAAQuB,KAAK,6BAAb,kBAFb,0FAQJ,qBAAKvB,UAAU,iCAAf,SACE,eAAC,IAAD,CACE2B,GAAG,IACH3B,UAAU,6GAFZ,UAIE,sBACEA,UAAU,KACV,YAAU,cACVuC,QAAQ,YACRjC,MAAO,CAAEkC,KAAM,gBAJjB,UAME,qDACA,sBAAMC,EAAE,gDAEV,sBAAMzC,UAAU,MAAhB,wCCxBGyG,EA5DE,WACf,IAAQC,EAASC,cAATD,KAEFvC,EAAWW,EAAgB4B,GAEjC,OAAKvC,EAKH,qCACE,cAAC,EAAD,IACA,eAACmC,EAAA,EAAD,WACE,mDAAkCnC,EAAS1C,QAAhC,SACX,sBACEmF,KAAK,cACLxC,QAASD,EAASE,aACd,eAEN,sBACED,QAAO,wBAAmBD,EAAS1C,OAEnCoF,SAAS,YADL,YAGN,sBACEA,SAAS,iBACTzC,QAASD,EAASE,aACd,kBAEN,sBACED,QAAO,6BAAwBD,EAASO,KAExCmC,SAAS,UADL,UAGN,sBAAMA,SAAS,WAAWzC,QAASD,EAASK,UAAc,YAC1D,sBACEqC,SAAS,sBACTzC,QAASD,EAASK,UACd,0BAGR,oCACE,cAAC,EAAD,CACEnC,OAAQ8B,EAAS9B,OACjBJ,MAAOkC,EAASlC,MAChBC,KAAMiC,EAASjC,KACfC,WAAYgC,EAAShC,WACrBC,SAAU+B,EAAS/B,SACnBX,MAAO0C,EAAS1C,QAElB,0BAASzB,UAAU,qCAAnB,UACE,cAACmE,EAASC,QAAV,IACA,cAAC,EAAD,OAEF,cAAC,EAAD,UAhDG,cAAC,IAAD,CAAUzC,GAAG,UCFTmF,EAdE,kBACb,0BAAS9G,UAAU,6BAAnB,UACI,yBAAQA,UAAU,iBAAlB,UACI,oBAAIA,UAAU,qEAAd,iBACA,oBAAIA,UAAU,cAAd,+CAEJ,qBAAKA,UAAU,6CAAf,SACI,cAAC,IAAD,CAAM2B,GAAG,IAAI3B,UAAU,yGAAvB,SACI,sBAAMA,UAAU,MAAhB,oC,MCQhB+G,IAASC,OACP,cAAC,IAAD,UACE,eAAC,IAAD,WACE,cAAC,IAAD,CAAOC,KAAK,IAAIC,QAAS,cAAC,EAAD,MACzB,cAAC,IAAD,CAAOD,KAAI,UAAK5F,EAAL,UAAwB6F,QAAS,cAAC,EAAD,MAC5C,cAAC,IAAD,CAAOD,KAAK,SAASC,QAAS,cAAC,EAAD,MAC9B,cAAC,IAAD,CAAOD,KAAK,IAAIC,QAAS,cAAC,EAAD,WAG7BC,SAASC,eAAe,SvCuGpB,kBAAmBC,WACrBA,UAAUC,cAAcC,MAAMC,MAAK,SAAAC,GACjCA,EAAaC,kB","file":"static/js/main.9b5e7db3.chunk.js","sourcesContent":["import React from 'react';\nimport Highlight, { defaultProps } from 'prism-react-renderer';\nimport Prism from 'prism-react-renderer/prism';\nimport dracula from 'prism-react-renderer/themes/dracula';\n\n(typeof global !== 'undefined' ? global : window).Prism = Prism;\n\nrequire('prismjs/components/prism-rust');\n\nconst Code = ({ children, className }) => {\n const language = className.replace(/language-/, '');\n\n return (\n \n {({ className, style, tokens, getLineProps, getTokenProps }) => {\n // not sure why an extra token was being added\n // removed here\n tokens.pop();\n\n return (\n \n {tokens.map((line, i) => (\n
\n {line.map((token, key) => (\n \n ))}\n
\n ))}\n \n );\n }}\n \n );\n};\n\nexport default Code;\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://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(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 navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, 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://bit.ly/CRA-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\nfunction checkValidServiceWorker(swUrl, 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 navigator.serviceWorker.ready.then(registration => {\n 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 function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","export const DEFAULT_COLOR = 'gold';\nexport const BLOG_ROOT = '/article';\n","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nconst Header = () => (\n \n);\n\nexport default Header;\n","import React from 'react';\n\nconst A = ({ children, ...rest }) => (\n \n {children}\n \n);\n\nexport default A;\n","import React from 'react';\n\nconst H3 = props => (\n

\n {props.children}\n

\n);\n\nexport default H3;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { DEFAULT_COLOR } from '../../constants';\n\nconst Hero = (props) => (\n
\n
\n {props.date && (\n \n )}\n

\n \n {props.shortTitle || props.title}\n \n

\n {props.subtitle &&

{props.subtitle}

}\n
By {props.author}
\n
\n
\n);\n\nHero.propTypes = {\n author: PropTypes.string,\n color: PropTypes.string,\n date: PropTypes.string,\n shortTitle: PropTypes.string,\n subtitle: PropTypes.string,\n title: PropTypes.string,\n};\n\nHero.defaultProps = {\n author: 'Jon Short',\n color: DEFAULT_COLOR,\n date: null,\n shortTitle: null,\n subtitle: null,\n title: null,\n};\n\nexport default Hero;\n","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nconst HomeLink = () => (\n
\n \n \n chevronLeft icon\n \n \n Return to Home\n \n
\n);\n\nexport default HomeLink;\n","import TypewriterIllustration from '../images/typewriter-illustration.png';\n\nconst imageMappings = {\n typewriter_illustration: TypewriterIllustration,\n};\n\nexport default imageMappings;\n","export default __webpack_public_path__ + \"static/media/typewriter-illustration.8553ad62.png\";","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport imageMappings from '../imageMappings';\n\nconst Image = (props) => {\n const resolvedSrc = imageMappings[props.src];\n\n if (!resolvedSrc) {\n return (\n {props.alt}\n );\n }\n\n return {props.alt};\n};\n\nImage.propTypes = {\n children: PropTypes.node,\n};\n\nexport default Image;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst InlineCode = ({ children }) => (\n {children}\n);\n\nInlineCode.propTypes = {\n children: PropTypes.node,\n};\n\nexport default InlineCode;\n","import React from 'react';\n\nconst Li = props => (\n
  • \n {props.children}\n
  • \n);\n\nexport default Li;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst P = ({ children }) => (\n

    {children}

    \n);\n\nP.propTypes = {\n children: PropTypes.node,\n};\n\nexport default P;\n","import React from 'react';\n\nconst Wrapper = (props) =>
    {props.children}
    ;\n\nexport default Wrapper;\n","import {\n A,\n Code,\n H3,\n Image,\n InlineCode,\n Li,\n P,\n Standout,\n Wrapper,\n} from './components';\n\nconst defaultComponentMapping = {\n a: A,\n blockquote: Standout,\n code: Code,\n h3: H3,\n img: Image,\n inlineCode: InlineCode,\n li: Li,\n p: P,\n wrapper: Wrapper,\n};\n\nexport default defaultComponentMapping;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst Standout = (props) => (\n
    {props.children}
    \n);\n\nStandout.propTypes = {\n children: PropTypes.node,\n};\n\nexport default Standout;\n","import React, { lazy, Suspense } from 'react';\nimport { importMDX } from 'mdx.macro';\n\nimport defaultComponentMapping from '../../defaultComponentMapping';\n\nconst Content = lazy(() => importMDX('./content.mdx'));\n\nconst Post = () => (\n }>\n \n \n);\n\nexport default Post;\n","export default __webpack_public_path__ + \"static/media/code-block.265fd953.png\";","export default __webpack_public_path__ + \"static/media/pattern.a3fb9556.png\";","export default __webpack_public_path__ + \"static/media/react-logo.939ce98b.png\";","export default __webpack_public_path__ + \"static/media/scream-emoji-banner.346f3694.png\";","import { BLOG_ROOT } from '../../../constants';\n\n// The article\nimport Post from './';\n\n// Images\nimport { Pattern } from '../../../images/articleThumbs';\n\nexport const metadata = {\n 'automating-local-env-vars': {\n color: 'yellow',\n content: Post,\n date: '22 March 2021',\n description: `\n Can we improve the experience of using environment variables locally?\n `,\n id: '4',\n imageAlt: 'Tiles in a pattern',\n imageSrc: Pattern,\n shortTitle: 'Automating local environment variables',\n subtitle: `\n Changing env vars manually can be repetitive\n `,\n title: 'Automating local environment variables',\n url: `${BLOG_ROOT}/automating-local-env-vars`,\n },\n};\n","export default __webpack_public_path__ + \"static/media/styled-components.d8fa26e8.png\";","import React, { lazy, Suspense } from 'react';\nimport { importMDX } from 'mdx.macro';\n\nimport defaultComponentMapping from '../../defaultComponentMapping';\n\nconst Content = lazy(() => importMDX('./content.mdx'));\n\nconst Post = () => (\n }>\n \n \n);\n\nexport default Post;\n","import { BLOG_ROOT } from '../../../constants';\n\n// The article\nimport Post from './';\n\n// Images\nimport { ScreamEmojiBanner } from '../../../images/articleThumbs';\n\nexport const metadata = {\n 'handling-line-endings': {\n color: 'washed-red',\n content: Post,\n date: '20 August 2020',\n description: `\n Dealing with line endings is something that most developers\n will have to do at some point, and it can be tricky\n `,\n id: '3',\n imageAlt: 'A scream emoji',\n imageSrc: ScreamEmojiBanner,\n shortTitle: 'Handling line endings',\n subtitle: `\n Let's be honest, line endings are annoying\n `,\n title: 'Handling line endings',\n url: `${BLOG_ROOT}/handling-line-endings`,\n },\n};\n","import React, { lazy, Suspense } from 'react';\nimport { importMDX } from 'mdx.macro';\n\nimport defaultComponentMapping from '../../defaultComponentMapping';\n\nconst Content = lazy(() => importMDX('./content.mdx'));\n\nconst Post = () => (\n }>\n \n \n);\n\nexport default Post;\n","import { BLOG_ROOT } from '../../../constants';\n\n// The article\nimport Post from './';\n\n// Images\nimport { ReactLogo } from '../../../images/articleThumbs';\n\nexport const metadata = {\n 'refactoring-this-site': {\n color: 'hot-pink',\n content: Post,\n date: '25 January 2020',\n description: `\n I created this site in 2017, as a learning exercise for React.\n Would I approach it differently in 2020?\n `,\n id: '1',\n imageAlt: 'The React logo',\n imageSrc: ReactLogo,\n shortTitle: 'Refactoring this site',\n subtitle: `\n Looking back at a repo started three years ago\n `,\n title: 'Refactoring this site 3 years on',\n url: `${BLOG_ROOT}/refactoring-this-site`,\n },\n};\n","import React, { lazy, Suspense } from 'react';\nimport { importMDX } from 'mdx.macro';\n\nimport defaultComponentMapping from '../../defaultComponentMapping';\n\nconst Content = lazy(() => importMDX('./content.mdx'));\n\nconst Post = () => (\n }>\n \n \n);\n\nexport default Post;\n","import { BLOG_ROOT } from '../../../constants';\n\n// The article\nimport Post from './';\n\n// Images\nimport { CodeBlock } from '../../../images/articleThumbs';\n\nexport const metadata = {\n 'smart-code-performance': {\n color: 'red',\n content: Post,\n date: '20 May 2020',\n description: `\n Sometimes performance can suffer\n `,\n id: '2',\n imageAlt: 'Generic code block',\n imageSrc: CodeBlock,\n shortTitle: \"'Smart' code and performance\",\n subtitle: `\n Smart, clean code is better right?\n `,\n title: 'Smart, clean code is better right?',\n url: `${BLOG_ROOT}/smart-code-performance`,\n },\n};\n","import { metadata as automatingLocalEnvVars } from './posts/automating-local-env-vars/metadata';\nimport { metadata as handlingLineEndings } from './posts/handling-line-endings/metadata';\nimport { metadata as refactoringThisSite } from './posts/refactoring-this-site/metadata';\nimport { metadata as smartCodePerformance } from './posts/smart-code-performance/metadata';\n\nconst articleMetaData = {\n ...automatingLocalEnvVars,\n ...handlingLineEndings,\n ...smartCodePerformance,\n ...refactoringThisSite,\n};\n\nexport const allArticlesMetaData = Object.keys(articleMetaData).map(\n (key) => articleMetaData[key]\n);\n\nexport default articleMetaData;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from 'react-router-dom';\n\nconst ArticleListItem = ({ article }) => (\n
    \n \n
    \n
    \n \n
    \n
    \n

    {article.title}

    \n

    {article.description}

    \n

    \n By {article.author ? article.author : 'Jon Short'}\n

    \n
    \n
    \n \n
    \n);\n\nArticleListItem.propTypes = {\n article: PropTypes.object,\n};\n\nexport default ArticleListItem;\n","import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types'\n\nimport ArticleListItem from './ArticleListItem';\n\nconst ArticleList = ({ articles }) => {\n const articleItems = useMemo(() => articles.map(article => (\n \n )), [articles])\n\n return (\n
    \n {articleItems}\n
    \n );\n};\n\nArticleList.propTypes = {\n articles: PropTypes.array\n};\n\nexport default ArticleList;\n","import React from 'react';\n\nconst Footer = () => (\n \n);\n\nexport default Footer;","import { useEffect } from 'react';\n\nconst ScrollToTop = () => {\n useEffect(() => {\n window.scrollTo(0, 0);\n }, []);\n\n return null;\n}\n\nexport default ScrollToTop;\n","import React from 'react';\nimport { Helmet } from 'react-helmet';\n\nimport Header from '../Header';\nimport { allArticlesMetaData } from '../articles/articleMetaData';\nimport ArticleList from './ArticleList';\nimport Footer from '../Footer';\nimport ScrollToTop from '../ScrollToTop';\n\nconst Home = () => {\n return (\n <>\n \n JonShort.me\n \n
    \n \n
    \n \n
    \n
    \n \n );\n};\n\nexport default Home;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst Anchor = props => (\n \n {props.children}\n \n);\n\nAnchor.propTypes = {\n children: PropTypes.node,\n href: PropTypes.string.isRequired,\n};\n\nexport default Anchor;\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { Helmet } from 'react-helmet';\n\nimport Anchor from './Anchor';\n\nconst About = () => {\n return (\n <>\n \n JonShort.me - About\n \n
    \n
    \n
    \n

    About

    \n
    \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n
    \n

    \n I am a full-stack developer at{' '}\n Experian,\n focusing on best practice, maintainability, and empowering others.\n

    \n

    \n I have a few personal projects which I use mostly to learn new\n tech.{' '}\n cenv is\n one my more useful projects, developed to help developers manage\n changing env vars within .env files. I wrote an article around the\n inspiration for this which can be read{' '}\n here.\n

    \n

    \n While day-to-day I write mostly Typescript / Javascript, I am a\n big fan of Rust\n , and have used it for a lot of CLI tooling both personal and\n within Experian.\n

    \n
    \n
    \n
    \n \n \n chevronLeft icon\n \n \n Return to Home\n \n
    \n
    \n \n );\n};\n\nexport default About;\n","import React from 'react';\nimport { Navigate, useParams } from 'react-router-dom';\nimport { Helmet } from 'react-helmet';\n\n// Components\nimport ScrollToTop from '../ScrollToTop';\nimport Footer from '../Footer';\nimport Hero from './components/Hero';\nimport HomeLink from './components/HomeLink';\n\n// Article data\nimport articleMetaData from './articleMetaData';\n\nconst Articles = () => {\n const { slug } = useParams();\n\n const metadata = articleMetaData[slug];\n\n if (!metadata) {\n return ;\n }\n\n return (\n <>\n \n \n JonShort.me - {metadata.title}\n \n \n \n \n \n \n \n
    \n \n
    \n \n \n
    \n
    \n
    \n \n );\n};\n\nexport default Articles;\n","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nconst Error404 = () => (\n
    \n
    \n

    404

    \n

    I've become lost in the matrix

    \n
    \n
    \n \n Return to Home\n \n
    \n
    \n);\n\nexport default Error404;","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { BrowserRouter, Route, Routes } from 'react-router-dom';\n\n// Service worker\nimport * as serviceWorker from './serviceWorker';\n\n// Constants\nimport { BLOG_ROOT } from './constants';\n\n// General Components\nimport Home from './homepage/Home';\nimport About from './about/About';\nimport Articles from './articles/Articles';\nimport Error404 from './Error404';\n\n// Styles\nimport './index.css';\n\nReactDOM.render(\n \n \n } />\n } />\n } />\n } />\n \n ,\n document.getElementById('root')\n);\n\nserviceWorker.unregister();\n"],"sourceRoot":""}