diff --git a/.eslintrc.json b/.eslintrc.json index 1b16b3c..e9bc495 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -22,5 +22,6 @@ "react" ], "rules": { + "comma-dangle": ["error", "never"] } } diff --git a/content/blog/002-deployment/index.md b/content/blog/002-deployment/index.md index 56ea94d..06bec19 100644 --- a/content/blog/002-deployment/index.md +++ b/content/blog/002-deployment/index.md @@ -19,16 +19,18 @@ Some time ago I listened to [an episode of the podcast .Net rocks](https://dotne # How this is built Gatsby has a [template for blogs](https://github.com/gatsbyjs/gatsby-starter-blog). Using - - npx gatsby new blog https://github.com/gatsbyjs/gatsby-starter-blog +```bash +npx gatsby new blog https://github.com/gatsbyjs/gatsby-starter-blog +``` I let gatsby create an instance of the blog template for me. From this template I got going with `npx gatsby develop` and started off with deleting a lot of files I didn't need. I also did some changes to the style. I have absolutely no background in anything even remotely related to making things look good, so I just went with what I had in my mind at that very moment (any feedback and suggestions are very welcome). The `gatsby new` command did also initialize a [`git`]() repository so I just had to commit my new changes. For better availability I then pushed the repository to [my self-hosted git server](https://code.while-false.de/stephan/blog). # How this is run I mentioned `docker` before. [It seems to be officially supported](https://github.com/gatsbyjs/gatsby-docker). I just went with the documentation and tried to get it to run. First, I created a `Dockerfile` in the project with just one line of content: - - FROM gatsbyjs/gatsby:onbuild +```docker +FROM gatsbyjs/gatsby:onbuild +``` Then, I could build first the gatsby project with `npx gatsby build` and use the optimized output from that to build a docker image with `docker build -t while-false/blog .` from the context of my project root. Next, I started a container from the newly created image with `docker run -d --name blog -p 8080:80 while-false/blog`. It worked on my laptop for `localhost:8080`, I saw the blog I just built. Nice! diff --git a/content/blog/004-comments/index.md b/content/blog/004-comments/index.md new file mode 100644 index 0000000..5e39793 --- /dev/null +++ b/content/blog/004-comments/index.md @@ -0,0 +1,86 @@ +--- +title: Comments +date: "2020-09-05T17:56:22.339Z" +description: I would love to hear from you! +--- + +## Where do comments live? + +I built this blog with [`GatsbyJS`](https://www.gatsbyjs.org/), which is optimized for static content. It works great for everything that exists when I build the code and create another docker image. But now I want to add comments from my readers. Which of course aren't static and don't exist on compile-time. So it seems GatsbyJS would not be the right tool for the job. + +Luckily, GatsbyJS is expandable. There even is a [guide on how to integrate comments](https://www.gatsbyjs.com/docs/adding-comments/) in a blog on the gatsby website itself. But it assumes you just go and use some external service like disqus (although it does mention several alternatives). I didn't want to outsource that, the whole point of this blog is to run things myself and learn from that. + +What I found was [Commento](https://commento.io/). It focusses around privacy and can be [self-hosted](https://docs.commento.io/installation/self-hosting/) instead of using an external service. It even has docker support. I quickly set up my very own instance on my server: + +```bash +docker run -d --name blog-commento \ + -e "COMMENTO_ORIGIN=https://comments.while-false.de" \ + -e "COMMENTO_POSTGRES=postgres://commentoDbUser:SuperSecretPassword@db_postgres/commento?sslmode=disable" \ + registry.gitlab.com/commento/commento +``` +*(In reality, I use a few more parameters and steps required for my specific hosting setup, which I will explain in a future post)* + +So my blog itself can still be static and throught the magic of gatsby's automatic optimization blazing fast, while the dynamic comments are handled by an external server, which I can fully control as I host it myself. + +## Include the comments in the blog + +Next, I followed the [documentation for commento](https://docs.commento.io/installation/self-hosting/register-your-website/) and registered the blog on my commento instance. Easy. + +Now to the tricky part. The static Gatsby.js website must embed the dynamic comments from the commento server. Again, I am lucky and found that [someone already did exactly that](https://itnext.io/adding-commento-to-react-apps-like-gatsby-871824fb57ae). With some small tweaks, this is what I use: + +```js +import React, { useEffect } from 'react'; + +/** + * Helper to add scripts to the page. + * @param {string} src The source path for the script to insert. + * @param {string} id The unique identifier for the script element to insert. + * @param {HTMLElement} parentElement The DOM element to insert the script into. + */ +const insertScript = (src, id, parentElement) => { + const script = window.document.createElement('script'); + script.async = true; + script.src = src; + script.id = id; + parentElement.appendChild(script); + return script; +}; + +/** + * Helper to remove scripts from the page. + * @param {string} id The unique identifier for the script element to remove. + * @param {HTMLElement} parentElement The DOM element to remove the script from + */ +const removeScript = (id, parentElement) => { + const script = window.document.getElementById(id); + if (script) { + parentElement.removeChild(script); + } +}; + + +const Commento = ({ id }) => { + useEffect(() => { + // If there's no window there's nothing to do for us + if (!window) { + return; + } + const { document } = window; + // In case our #commento container exists we can add our commento script + if (document.getElementById('commento')) { + insertScript('https://comments.while-false.de/js/commento.js', 'commento-script', document.body); + } + // Cleanup; remove the script from the page + return () => removeScript('commento-script', document.body); + }, [id]); + return
; +}; + +export default Commento; +``` + +This component itself is evaluated at runtime (it uses `useEffect`, which gatsby understands as non-static). It dynamically loads the scripts required by commento. The commento component is then included in my default blog-post template component by adding the line ``. The slug is the part of the URL after the hostname, i.e. `004-comments/` for this page. Thus, commento differentiates which comment belongs to which page. + +Now, users can register and directly comment or comment anonymously with a required moderator review (which is me). Also, markdown, up- and downvoting, sorting, sticky, replies and moderation tools are included. Give it a try, I'd love to hear from you! + +In the next few days I will tinker around with commento's settings for moderation notification emails, custom styling and comment analytics (number of views and number of comments). diff --git a/gatsby-node.js b/gatsby-node.js index b28a51d..0612e40 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -24,7 +24,7 @@ exports.createPages = async ({ graphql, actions }) => { } } } - `, + ` ); if (result.errors) { diff --git a/package.json b/package.json index 68e8494..5a79175 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,10 @@ "name": "while-false-blog", "private": true, "description": "A simple blog powered by Gatsby and Markdown", - "version": "0.1.0", - "author": "Stephan Dörfler ", + "version": "1.0.0", + "author": "Stephan Dörfler ", "dependencies": { - "gatsby": "^2.22.17", + "gatsby": "^2.23.3", "gatsby-cli": "^2.12.45", "gatsby-image": "^2.4.6", "gatsby-plugin-feed": "^2.5.4", @@ -23,6 +23,7 @@ "gatsby-source-filesystem": "^2.3.10", "gatsby-transformer-remark": "^2.8.14", "gatsby-transformer-sharp": "^2.5.4", + "global": "^4.4.0", "prismjs": "^1.20.0", "react": "^16.13.1", "react-dom": "^16.13.1", diff --git a/src/styles/global.css b/src/styles/global.css index b1864e8..8736a72 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1,3 +1,7 @@ body { background-color: #e3dcc2; -} \ No newline at end of file +} + +#commento-textarea-root { + background-color: #00000010; +} diff --git a/src/templates/blog-post.js b/src/templates/blog-post.js index d7eb421..920c3d0 100644 --- a/src/templates/blog-post.js +++ b/src/templates/blog-post.js @@ -48,7 +48,10 @@ class BlogPostTemplate extends React.Component { /> diff --git a/yarn.lock b/yarn.lock index ca3118b..d4a6b5e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3180,10 +3180,10 @@ babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.8.0: cosmiconfig "^6.0.0" resolve "^1.12.0" -babel-plugin-remove-graphql-queries@^2.9.3: - version "2.9.3" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.9.3.tgz#afed7ed58596e84e29914a4ecc88471e0ea76766" - integrity sha512-EfMoizTX4/aUVN/cbWCU+uythWT5Xjh29npZnyTwBL2b16JH7WM9vbVMJQoCi+26HfRpKJS6SJfDcUT12wc3Mg== +babel-plugin-remove-graphql-queries@^2.9.5: + version "2.9.5" + resolved "https://registry.yarnpkg.com/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.9.5.tgz#b094d01e39d911e92317d38bee04bf4b2bf7c156" + integrity sha512-z0T2dMz6V8a8hC11NFDwnuT5xR0k4Vu4Zie4A5BPchQOe59uHpbaM54mMl66FUA/iLTfYC11xez1N3Wc1gV20w== babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" @@ -3246,10 +3246,10 @@ babel-preset-fbjs@^3.3.0: "@babel/plugin-transform-template-literals" "^7.0.0" babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" -babel-preset-gatsby@^0.4.8: - version "0.4.8" - resolved "https://registry.yarnpkg.com/babel-preset-gatsby/-/babel-preset-gatsby-0.4.8.tgz#333d2e79b80186bc4d5ceadfaa07302696a0d976" - integrity sha512-U2Ex9XKYk2SbSabZIvQ/r5aKzrQibmxtyZ1SxGC0HNsjLU1QdWCCs+jeoiClWyi036y/4wmvHTxPjOOM2KdIZQ== +babel-preset-gatsby@^0.4.9: + version "0.4.9" + resolved "https://registry.yarnpkg.com/babel-preset-gatsby/-/babel-preset-gatsby-0.4.9.tgz#738460c86a172c9fc649c66e12db9b137c50a71a" + integrity sha512-Jh8d7d36O2G/bTofQohOuEPBbGwDY6JftiC2U4LCtnZ4WILCvMSnf1DvIP6Y9ZDNuVy8ETb2AzmAfW1Ys6jA1Q== dependencies: "@babel/plugin-proposal-class-properties" "^7.10.1" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" @@ -3263,7 +3263,7 @@ babel-preset-gatsby@^0.4.8: babel-plugin-dynamic-import-node "^2.3.3" babel-plugin-macros "^2.8.0" babel-plugin-transform-react-remove-prop-types "^0.4.24" - gatsby-core-utils "^1.3.4" + gatsby-core-utils "^1.3.5" babel-runtime@^6.26.0: version "6.26.0" @@ -6782,10 +6782,10 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gatsby-admin@^0.1.58: - version "0.1.58" - resolved "https://registry.yarnpkg.com/gatsby-admin/-/gatsby-admin-0.1.58.tgz#b1cb8325cef1dc79a2e4ff1bc3261ee53695a407" - integrity sha512-Tum3Avxp7gVH15S9AVRtQ0Ci4mYeQt3Kjvshjs25LPwcUYqr5Uze0kKTeqSlJjXfjxnIIXrHxEza8mzgGq9uzQ== +gatsby-admin@^0.1.67: + version "0.1.67" + resolved "https://registry.yarnpkg.com/gatsby-admin/-/gatsby-admin-0.1.67.tgz#2813d25ed25f11375500fbe9399ee64ea7a97d66" + integrity sha512-8TCI6TEycyb3qWmrRm6GieCMVsNnuAkbMXwl8grg5Vyi0UA2oGxilTTwfQERjLNfpsPpuI0rn0197clgYZCwQA== dependencies: "@emotion/core" "^10.0.28" "@emotion/styled" "^10.0.27" @@ -6793,12 +6793,13 @@ gatsby-admin@^0.1.58: "@typescript-eslint/parser" "^2.28.0" csstype "^2.6.10" formik "^2.1.4" - gatsby "^2.22.17" + gatsby "^2.23.3" gatsby-interface "0.0.167" - gatsby-plugin-typescript "^2.4.4" - gatsby-source-graphql "^2.5.3" + gatsby-plugin-typescript "^2.4.6" + gatsby-source-graphql "^2.5.4" react "^16.12.0" react-dom "^16.12.0" + react-helmet "^6.0.0" react-icons "^3.10.0" strict-ui "^0.1.3" subscriptions-transport-ws "^0.9.16" @@ -6807,54 +6808,6 @@ gatsby-admin@^0.1.58: urql "^1.9.7" yup "^0.29.1" -gatsby-cli@^2.12.42: - version "2.12.42" - resolved "https://registry.yarnpkg.com/gatsby-cli/-/gatsby-cli-2.12.42.tgz#52482bb70e6caaa8c53523b738c7b9463561cdc9" - integrity sha512-R7uRTthtMV6aXqwz4rEdZg3NGF5EYqsEmq9UwS9C5ErVPzdbN6MpR0QitJ6D775Fr62r8rbu0CuiyDpJ2vGUTg== - dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/runtime" "^7.10.2" - "@hapi/joi" "^15.1.1" - better-opn "^1.0.0" - bluebird "^3.7.2" - chalk "^2.4.2" - clipboardy "^2.3.0" - common-tags "^1.8.0" - configstore "^5.0.1" - convert-hrtime "^3.0.0" - core-js "^2.6.11" - envinfo "^7.5.1" - execa "^3.4.0" - fs-exists-cached "^1.0.0" - fs-extra "^8.1.0" - gatsby-core-utils "^1.3.4" - gatsby-recipes "^0.1.36" - gatsby-telemetry "^1.3.10" - hosted-git-info "^3.0.4" - ink "^2.7.1" - ink-spinner "^3.0.1" - is-valid-path "^0.1.1" - lodash "^4.17.15" - meant "^1.0.1" - node-fetch "^2.6.0" - object.entries "^1.1.2" - opentracing "^0.14.4" - pretty-error "^2.1.1" - progress "^2.0.3" - prompts "^2.3.2" - react "^16.8.0" - redux "^4.0.5" - resolve-cwd "^3.0.0" - semver "^6.3.0" - signal-exit "^3.0.3" - source-map "0.7.3" - stack-trace "^0.0.10" - strip-ansi "^5.2.0" - update-notifier "^3.0.1" - uuid "3.4.0" - yargs "^15.3.1" - yurnalist "^1.1.2" - gatsby-cli@^2.12.45: version "2.12.45" resolved "https://registry.yarnpkg.com/gatsby-cli/-/gatsby-cli-2.12.45.tgz#5f99e8ea96264c55e981d13147c1a387c9bf1164" @@ -6934,10 +6887,10 @@ gatsby-design-tokens@^2.0.2: dependencies: hex2rgba "^0.0.1" -gatsby-graphiql-explorer@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.4.4.tgz#21f62f2dbb363e783cde1fd8569c8f64594ce647" - integrity sha512-9WLWrE7DUOFJ9PQ1ntEQceC0z9JEndRANTkpCTB7MWEBL/fvuj6+oDgmpW/eJPT2KkMuAP+g4o5bKld52MneRA== +gatsby-graphiql-explorer@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.4.5.tgz#63795dc891e0ddc25436f51495342f0f7a2a0a1f" + integrity sha512-5ykkwnMhmIAzcxvVCnvYEk8HmEoFDZLeRET3Ug4sCthYvfucqzG6JJ3RuMGhPElu6Sat0vSS6XKwQ5EPu/sWTA== dependencies: "@babel/runtime" "^7.10.2" @@ -6970,25 +6923,25 @@ gatsby-interface@0.0.167: lodash.sample "^4.2.1" theme-ui "^0.2.49" -gatsby-link@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/gatsby-link/-/gatsby-link-2.4.4.tgz#5887e45f839bba82dfa138b18ed2ce2ec0bcaf9f" - integrity sha512-saWuA7jmN+p0qrZ9kyWVdvWBBM0Dd1X5PvnEUgZ1pa2jpymbJaDnxYOzTBJr9PCmV9IeMA1z5sqxKkMcPp4LGw== +gatsby-link@^2.4.6: + version "2.4.6" + resolved "https://registry.yarnpkg.com/gatsby-link/-/gatsby-link-2.4.6.tgz#5fdd2b16175e33ed51f20c9e5d1d0cc3eb2fe7f6" + integrity sha512-jOYEJa860KHcVOZ/6gjMv2EnCG7StdD4mLEGEMcEC8mzn4PWHQXHYsGdXcOvjn6SaqJ888hWuYjik5Jm8xW+cg== dependencies: "@babel/runtime" "^7.10.2" "@types/reach__router" "^1.3.3" prop-types "^15.7.2" -gatsby-page-utils@^0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/gatsby-page-utils/-/gatsby-page-utils-0.2.8.tgz#9f49415c92d041bc2d06d37376b35dd20b122004" - integrity sha512-LlWDt8Eg6hB5RM601f1P7L2NQ17m4//n+OtMwNpSYjhgklyCw2JHmDWj8fqEGjyMYFLbFFiVurCiYqBbvtc2ng== +gatsby-page-utils@^0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/gatsby-page-utils/-/gatsby-page-utils-0.2.9.tgz#567eb9b446d27a2cbcc99ca8bb6a321e2cfd1a65" + integrity sha512-Mh3QbDdKKrvbJRHtMsBvo+sDTaGfcTiXCFGTkFu2VbL3P6mZySFJ8fDLb9SbQvwvMVw/vD5IZT1KJerfmgfvGQ== dependencies: "@babel/runtime" "^7.10.2" bluebird "^3.7.2" chokidar "3.4.0" fs-exists-cached "^1.0.0" - gatsby-core-utils "^1.3.4" + gatsby-core-utils "^1.3.5" glob "^7.1.6" lodash "^4.17.15" micromatch "^3.1.10" @@ -7032,15 +6985,15 @@ gatsby-plugin-offline@^3.2.8: lodash "^4.17.15" workbox-build "^4.3.1" -gatsby-plugin-page-creator@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.3.8.tgz#0b45574426652edcb75803a18a2bf570418b8434" - integrity sha512-qREefPFXGg6HY5TVhtKFyhrolKfz4vygdBdpDnhxhDVwBNvT49GSzEXZDgNBFJrd4OzZ5CoI4Z38I/Mxz1760A== +gatsby-plugin-page-creator@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.3.9.tgz#b0793cf1340dc903560791fea4948c28b2d302ad" + integrity sha512-ZNfjSoJ3AyACP5FWo0rwoeuIoZdD58le7oCmcVHVks/KOS/pJVGn8GwcrHE6xxCNM4KzqdfNBGZVyM+7RUASyA== dependencies: "@babel/runtime" "^7.10.2" bluebird "^3.7.2" fs-exists-cached "^1.0.0" - gatsby-page-utils "^0.2.8" + gatsby-page-utils "^0.2.9" glob "^7.1.6" lodash "^4.17.15" micromatch "^3.1.10" @@ -7077,10 +7030,10 @@ gatsby-plugin-sharp@^2.6.10: svgo "1.3.2" uuid "^3.4.0" -gatsby-plugin-typescript@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.4.4.tgz#481ba616b608d55ccf3aa869bdfbd2731d68fc1d" - integrity sha512-BWTqUEQ70DrqXQIEE5hl+0NK19ggDLksGZdt4OYJF3cFUmYn6sNhYu9cvKLcj4DLSxFVe1fJl7vK9n0HLdCwRA== +gatsby-plugin-typescript@^2.4.6: + version "2.4.6" + resolved "https://registry.yarnpkg.com/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.4.6.tgz#8c1c53510678978303ce9cd489e69f6696409bd8" + integrity sha512-RfI2/k5XHmyNHjKDZDEPha/TNoY0Wh6zeBteqmidoPsJ2GfeFhyyxFxuRak+wYpZqdMh/aVwaJoF9Q1OiS4woQ== dependencies: "@babel/core" "^7.10.2" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" @@ -7088,7 +7041,7 @@ gatsby-plugin-typescript@^2.4.4: "@babel/plugin-proposal-optional-chaining" "^7.10.1" "@babel/preset-typescript" "^7.10.1" "@babel/runtime" "^7.10.2" - babel-plugin-remove-graphql-queries "^2.9.3" + babel-plugin-remove-graphql-queries "^2.9.5" gatsby-plugin-typography@^2.5.3: version "2.5.3" @@ -7097,83 +7050,15 @@ gatsby-plugin-typography@^2.5.3: dependencies: "@babel/runtime" "^7.10.2" -gatsby-react-router-scroll@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/gatsby-react-router-scroll/-/gatsby-react-router-scroll-3.0.2.tgz#9206c3d7a04d14b507431a4032e842d83c21b4cf" - integrity sha512-1W+16VxanVJ7RD3LmT0EgpUa7n/GgleJmcHg7ujcI7c2gvroJCTlRKxmu5VB6kVFSlZvUh3KPHdBqKxhPsU0DQ== +gatsby-react-router-scroll@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/gatsby-react-router-scroll/-/gatsby-react-router-scroll-3.0.3.tgz#3c373fe96efe63259235bb5f5f79eca837ab19d1" + integrity sha512-VwwF1kmehIbjZek5MeMvf3SySoJUbUhQVQIsteWLqOPU3shz7b1sLpcLu3o0knUn7ml+8NB3rG2Yjb0a/LPBpA== dependencies: "@babel/runtime" "^7.10.2" scroll-behavior "^0.9.12" warning "^3.0.0" -gatsby-recipes@^0.1.36: - version "0.1.36" - resolved "https://registry.yarnpkg.com/gatsby-recipes/-/gatsby-recipes-0.1.36.tgz#a40211b23c11255cd6187b3282d5d2d9bb16441c" - integrity sha512-nDIPCOUkwVGwAap7dITKXSrKJ06er0xgs0LTlB5y+ylQ/2NkyY6g1V+DiFF4/SLLjl9iTxNPgtzffoX+5OXSaw== - dependencies: - "@babel/core" "^7.10.2" - "@babel/generator" "^7.10.2" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/plugin-transform-react-jsx" "^7.10.1" - "@babel/standalone" "^7.10.2" - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.2" - "@hapi/hoek" "8.x" - "@hapi/joi" "^15.1.1" - "@mdx-js/mdx" "^1.6.5" - "@mdx-js/react" "^1.6.5" - "@mdx-js/runtime" "^1.6.5" - acorn "^7.2.0" - acorn-jsx "^5.2.0" - cors "^2.8.5" - debug "^4.1.1" - detect-port "^1.3.0" - execa "^4.0.2" - express "^4.17.1" - express-graphql "^0.9.0" - fs-extra "^8.1.0" - gatsby-core-utils "^1.3.4" - gatsby-telemetry "^1.3.10" - glob "^7.1.6" - graphql "^14.6.0" - graphql-compose "^6.3.8" - graphql-subscriptions "^1.1.0" - graphql-tools "^6.0.5" - graphql-type-json "^0.3.1" - hicat "^0.7.0" - html-tag-names "^1.1.5" - ink "^2.7.1" - ink-box "^1.0.0" - ink-link "^1.1.0" - ink-select-input "^3.1.2" - ink-spinner "^3.0.1" - is-binary-path "^2.1.0" - is-blank "^2.1.0" - is-string "^1.0.5" - is-url "^1.2.4" - jest-diff "^25.5.0" - lodash "^4.17.15" - mkdirp "^0.5.1" - node-fetch "^2.6.0" - pkg-dir "^4.2.0" - prettier "^2.0.5" - react-reconciler "^0.25.1" - remark-mdx "^1.6.5" - remark-parse "^6.0.3" - remark-stringify "^8.0.0" - resolve-cwd "^3.0.0" - semver "^7.3.2" - single-trailing-newline "^1.0.0" - strip-ansi "^6.0.0" - style-to-object "^0.3.0" - subscriptions-transport-ws "^0.9.16" - svg-tag-names "^2.0.1" - unified "^8.4.2" - unist-util-visit "^2.0.2" - urql "^1.9.7" - ws "^7.3.0" - xstate "^4.10.0" - gatsby-recipes@^0.1.39: version "0.1.39" resolved "https://registry.yarnpkg.com/gatsby-recipes/-/gatsby-recipes-0.1.39.tgz#6bd079e0011fbe41c14b371f9b757bcaa377c3ad" @@ -7324,10 +7209,10 @@ gatsby-source-filesystem@^2.3.10: valid-url "^1.0.9" xstate "^4.10.0" -gatsby-source-graphql@^2.5.3: - version "2.5.3" - resolved "https://registry.yarnpkg.com/gatsby-source-graphql/-/gatsby-source-graphql-2.5.3.tgz#353f2949502bf73875caf06653a68265923b9fa7" - integrity sha512-6WiEdyCpjFKFUzWvY26jrQUF3sBg5F0cpVLndJtSMtwvv6GYeiqllhMC2f8ygGYZvUVBCq1NHN/5Z/wGd0d0ww== +gatsby-source-graphql@^2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/gatsby-source-graphql/-/gatsby-source-graphql-2.5.4.tgz#fc2eba5e6128bbe2af06c7e1405fca4370fba5dc" + integrity sha512-lP8/GS6f1SMQXa4q72iH/CAAZQ/RxwgADPdFSAZS8e7fNkdlhUYpUqY69mdmQxwv5iMqaHMVQTdQmuiKcyQYXg== dependencies: "@babel/runtime" "^7.10.2" apollo-link "1.2.14" @@ -7339,29 +7224,6 @@ gatsby-source-graphql@^2.5.3: node-fetch "^1.7.3" uuid "^3.4.0" -gatsby-telemetry@^1.3.10: - version "1.3.10" - resolved "https://registry.yarnpkg.com/gatsby-telemetry/-/gatsby-telemetry-1.3.10.tgz#19a8f450b14f42a8d5dcb8b704bcc17d9ff45dd9" - integrity sha512-Lp2DJhuPh5f5swYfIMcSYfXMi1bdoiO8Z2b3ZW2m+mDZk77dwEQg3dZPXlLyHGxboiO0D8Q7Jz6Fin9mO0T3CA== - dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/runtime" "^7.10.2" - bluebird "^3.7.2" - boxen "^4.2.0" - configstore "^5.0.1" - envinfo "^7.5.1" - fs-extra "^8.1.0" - gatsby-core-utils "^1.3.4" - git-up "4.0.1" - is-docker "2.0.0" - lodash "^4.17.15" - node-fetch "2.6.0" - resolve-cwd "^2.0.0" - source-map "^0.7.3" - stack-trace "^0.0.10" - stack-utils "1.0.2" - uuid "3.4.0" - gatsby-telemetry@^1.3.11: version "1.3.11" resolved "https://registry.yarnpkg.com/gatsby-telemetry/-/gatsby-telemetry-1.3.11.tgz#2a5743387d84e796e11f9577f9981c9b46c34e11" @@ -7425,10 +7287,10 @@ gatsby-transformer-sharp@^2.5.4: semver "^5.7.1" sharp "^0.25.1" -gatsby@^2.22.17: - version "2.22.17" - resolved "https://registry.yarnpkg.com/gatsby/-/gatsby-2.22.17.tgz#e455dc49fedf564b4d7a1e62564a606caf09245f" - integrity sha512-drdf4oIpQhX24fqEOzwmbX0qCzY8QDbmqQQ/6GzNgfSd90mTDwYCA7gCxIrzTE9GGwYDGdlokwwq6hONtIoIVA== +gatsby@^2.23.3: + version "2.23.3" + resolved "https://registry.yarnpkg.com/gatsby/-/gatsby-2.23.3.tgz#d5d7bbe9c68b9d5f982520b06c6a057e034bc2c3" + integrity sha512-uVRJUQuTga7GMag9Rrb+3amjSVoGDPgSTXivhDXW/TzR5ouBr6/rudjcDTruRwFnKsAwUExrYMMXPRCwkMFctQ== dependencies: "@babel/code-frame" "^7.10.1" "@babel/core" "^7.10.2" @@ -7452,8 +7314,8 @@ gatsby@^2.22.17: babel-loader "^8.1.0" babel-plugin-add-module-exports "^0.3.3" babel-plugin-dynamic-import-node "^2.3.3" - babel-plugin-remove-graphql-queries "^2.9.3" - babel-preset-gatsby "^0.4.8" + babel-plugin-remove-graphql-queries "^2.9.5" + babel-preset-gatsby "^0.4.9" better-opn "1.0.0" better-queue "^3.8.10" bluebird "^3.7.2" @@ -7492,15 +7354,15 @@ gatsby@^2.22.17: flat "^4.1.0" fs-exists-cached "1.0.0" fs-extra "^8.1.0" - gatsby-admin "^0.1.58" - gatsby-cli "^2.12.42" - gatsby-core-utils "^1.3.4" - gatsby-graphiql-explorer "^0.4.4" - gatsby-link "^2.4.4" - gatsby-plugin-page-creator "^2.3.8" - gatsby-plugin-typescript "^2.4.4" - gatsby-react-router-scroll "^3.0.2" - gatsby-telemetry "^1.3.10" + gatsby-admin "^0.1.67" + gatsby-cli "^2.12.45" + gatsby-core-utils "^1.3.5" + gatsby-graphiql-explorer "^0.4.5" + gatsby-link "^2.4.6" + gatsby-plugin-page-creator "^2.3.9" + gatsby-plugin-typescript "^2.4.6" + gatsby-react-router-scroll "^3.0.3" + gatsby-telemetry "^1.3.11" glob "^7.1.6" got "8.3.2" graphql "^14.6.0" @@ -7744,7 +7606,7 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -global@^4.3.0: +global@^4.3.0, global@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== @@ -12461,6 +12323,11 @@ react-fast-compare@^2.0.1, react-fast-compare@^2.0.2: resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== +react-fast-compare@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + react-focus-lock@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.3.1.tgz#9d5d85899773609c7eefa4fc54fff6a0f5f2fc47" @@ -12483,6 +12350,16 @@ react-helmet@^5.2.1: react-fast-compare "^2.0.2" react-side-effect "^1.1.0" +react-helmet@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" + integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== + dependencies: + object-assign "^4.1.1" + prop-types "^15.7.2" + react-fast-compare "^3.1.1" + react-side-effect "^2.1.0" + react-hot-loader@^4.12.21: version "4.12.21" resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.12.21.tgz#332e830801fb33024b5a147d6b13417f491eb975" @@ -12565,6 +12442,11 @@ react-side-effect@^1.1.0: dependencies: shallowequal "^1.0.1" +react-side-effect@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.0.tgz#1ce4a8b4445168c487ed24dab886421f74d380d3" + integrity sha512-IgmcegOSi5SNX+2Snh1vqmF0Vg/CbkycU9XZbOHJlZ6kMzTmi3yc254oB1WCkgA7OQtIAoLmcSFuHTc/tlcqXg== + react-style-singleton@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.1.0.tgz#7396885332e9729957f9df51f08cadbfc164e1c4"