diff --git a/config.js b/config.js index 5a3c980..8640648 100644 --- a/config.js +++ b/config.js @@ -6,7 +6,7 @@ module.exports = { subtitle: 'Pellentesque odio nisi, euismod in, pharetra a, ultricies in, diam. Sed arcu.', copyright: '© All rights reserved.', disqusShortname: '', - postsPerPage: 1, + postsPerPage: 4, googleAnalyticsId: 'UA-73379983-2', menu: [ { diff --git a/gatsby-config.js b/gatsby-config.js index 2d7283b..b0cce10 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -22,9 +22,9 @@ module.exports = { } }, { - resolve: "gatsby-source-filesystem", + resolve: 'gatsby-source-filesystem', options: { - name: "assets", + name: 'assets', path: `${__dirname}/static` } }, diff --git a/gatsby/on-create-node.js b/gatsby/on-create-node.js index aa47919..9686ea1 100644 --- a/gatsby/on-create-node.js +++ b/gatsby/on-create-node.js @@ -2,10 +2,13 @@ const _ = require('lodash'); const { createFilePath } = require('gatsby-source-filesystem'); +const { fmImagesToRelative } = require('gatsby-remark-relative-images'); const onCreateNode = ({ node, actions, getNode }) => { const { createNodeField } = actions; + fmImagesToRelative(node); + if (node.internal.type === 'MarkdownRemark') { if (typeof node.frontmatter.path !== 'undefined') { createNodeField({ @@ -23,12 +26,12 @@ const onCreateNode = ({ node, actions, getNode }) => { } if (node.frontmatter.tags) { - const tagSlugs = node.frontmatter.tags.map((tag) => `/tags/${_.kebabCase(tag)}/`); + const tagSlugs = node.frontmatter.tags.map((tag) => `/tag/${_.kebabCase(tag)}/`); createNodeField({ node, name: 'tagSlugs', value: tagSlugs }); } if (node.frontmatter.category) { - const categorySlug = `/categories/${_.kebabCase(node.frontmatter.category)}/`; + const categorySlug = `/category/${_.kebabCase(node.frontmatter.category)}/`; createNodeField({ node, name: 'categorySlug', value: categorySlug }); } } diff --git a/gatsby/pagination/create-categories-pages.js b/gatsby/pagination/create-categories-pages.js index 290d744..4114324 100644 --- a/gatsby/pagination/create-categories-pages.js +++ b/gatsby/pagination/create-categories-pages.js @@ -6,6 +6,7 @@ const siteConfig = require('../../config.js'); module.exports = async (graphql, actions) => { const { createPage } = actions; + const { postsPerPage } = siteConfig; const result = await graphql(` { @@ -21,17 +22,22 @@ module.exports = async (graphql, actions) => { `); _.each(result.data.allMarkdownRemark.group, (category) => { - const numPages = Math.ceil(category.totalCount / siteConfig.postsPerPage); + const numPages = Math.ceil(category.totalCount / postsPerPage); + const categorySlug = `/category/${_.kebabCase(category.fieldValue)}`; for (let i = 0; i < numPages; i += 1) { createPage({ - path: i === 0 ? `/category/${_.kebabCase(category.fieldValue)}` : `/category/${_.kebabCase(category.fieldValue)}/page/${i}`, + path: i === 0 ? categorySlug : `${categorySlug}/page/${i}`, component: path.resolve('./src/templates/category-template.js'), context: { - page: i, category: category.fieldValue, - limit: siteConfig.postsPerPage, - skip: i * siteConfig.postsPerPage, + currentPage: i, + postsLimit: postsPerPage, + postsOffset: i * postsPerPage, + prevPagePath: i <= 1 ? categorySlug : `${categorySlug}/page/${i - 1}`, + nextPagePath: `/${categorySlug}/page/${i + 1}`, + hasPrevPage: i !== 0, + hasNextPage: i !== numPages - 1 } }); } diff --git a/gatsby/pagination/create-posts-pages.js b/gatsby/pagination/create-posts-pages.js index df32ab8..792bcde 100644 --- a/gatsby/pagination/create-posts-pages.js +++ b/gatsby/pagination/create-posts-pages.js @@ -14,16 +14,21 @@ module.exports = async (graphql, actions) => { } `); - const numPages = Math.ceil(result.data.allMarkdownRemark.totalCount / siteConfig.postsPerPage); + const { postsPerPage } = siteConfig; + const numPages = Math.ceil(result.data.allMarkdownRemark.totalCount / postsPerPage); for (let i = 0; i < numPages; i += 1) { createPage({ path: i === 0 ? '/' : `/page/${i}`, component: path.resolve('./src/templates/index-template.js'), context: { - page: i, - limit: siteConfig.postsPerPage, - skip: i * siteConfig.postsPerPage, + currentPage: i, + postsLimit: postsPerPage, + postsOffset: i * postsPerPage, + prevPagePath: i <= 1 ? '/' : `/page/${i - 1}`, + nextPagePath: `/page/${i + 1}`, + hasPrevPage: i !== 0, + hasNextPage: i !== numPages - 1 } }); } diff --git a/gatsby/pagination/create-tags-pages.js b/gatsby/pagination/create-tags-pages.js index f6d506e..a2683d0 100644 --- a/gatsby/pagination/create-tags-pages.js +++ b/gatsby/pagination/create-tags-pages.js @@ -6,6 +6,7 @@ const siteConfig = require('../../config.js'); module.exports = async (graphql, actions) => { const { createPage } = actions; + const { postsPerPage } = siteConfig; const result = await graphql(` { @@ -21,17 +22,22 @@ module.exports = async (graphql, actions) => { `); _.each(result.data.allMarkdownRemark.group, (tag) => { - const numPages = Math.ceil(tag.totalCount / siteConfig.postsPerPage); + const numPages = Math.ceil(tag.totalCount / postsPerPage); + const tagSlug = `/tag/${_.kebabCase(tag.fieldValue)}`; for (let i = 0; i < numPages; i += 1) { createPage({ - path: i === 0 ? `/tag/${_.kebabCase(tag.fieldValue)}` : `/tag/${_.kebabCase(tag.fieldValue)}/page/${i}`, + path: i === 0 ? tagSlug : `${tagSlug}/page/${i}`, component: path.resolve('./src/templates/tag-template.js'), context: { - page: i, tag: tag.fieldValue, - limit: siteConfig.postsPerPage, - skip: i * siteConfig.postsPerPage, + currentPage: i, + postsLimit: postsPerPage, + postsOffset: i * postsPerPage, + prevPagePath: i <= 1 ? tagSlug : `${tagSlug}/page/${i - 1}`, + nextPagePath: `${tagSlug}/page/${i + 1}`, + hasPrevPage: i !== 0, + hasNextPage: i !== numPages - 1 } }); } diff --git a/package.json b/package.json index 721f2fc..a36efc0 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "starter" ], "dependencies": { + "classnames": "^2.2.6", "bluebird": "^3.5.2", "codecov": "^3.1.0", "gatsby": "^2.0.38", @@ -38,7 +39,7 @@ "gatsby-plugin-feed": "^2.0.8", "gatsby-plugin-google-analytics": "^2.0.6", "gatsby-plugin-netlify": "^2.0.3", - "gatsby-plugin-netlify-cms": "^3.0.5", + "gatsby-plugin-netlify-cms": "^3.0.7", "gatsby-plugin-offline": "^2.0.6", "gatsby-plugin-react-helmet": "^3.0.0", "gatsby-plugin-sass": "^2.0.3", @@ -48,6 +49,7 @@ "gatsby-remark-images": "^2.0.4", "gatsby-remark-prismjs": "^3.0.2", "gatsby-remark-responsive-iframe": "^2.0.5", + "gatsby-remark-relative-images": "^0.2.0", "gatsby-remark-smartypants": "^2.0.5", "gatsby-source-filesystem": "^2.0.3", "gatsby-transformer-remark": "^2.1.7", diff --git a/src/components/Pagination/Pagination.js b/src/components/Pagination/Pagination.js new file mode 100644 index 0000000..faa217f --- /dev/null +++ b/src/components/Pagination/Pagination.js @@ -0,0 +1,37 @@ +import React from 'react'; +import classNames from 'classnames/bind'; +import { Link } from 'gatsby'; +import { PAGINATION } from '../../constants'; +import styles from './Pagination.module.scss'; + +const cx = classNames.bind(styles); + +const Pagination = ({ + prevPagePath, + nextPagePath, + hasNextPage, + hasPrevPage +}) => { + const prevClassName = cx({ + 'pagination__prev-link': true, + 'pagination__prev-link--disable': !hasPrevPage + }); + + const nextClassName = cx({ + 'pagination__next-link': true, + 'pagination__next-link--disable': !hasNextPage + }); + + return ( +
+
+ {PAGINATION.PREV_PAGE} +
+
+ {PAGINATION.NEXT_PAGE} +
+
+ ) +}; + +export default Pagination; diff --git a/src/components/Pagination/Pagination.module.scss b/src/components/Pagination/Pagination.module.scss new file mode 100644 index 0000000..750efdf --- /dev/null +++ b/src/components/Pagination/Pagination.module.scss @@ -0,0 +1,54 @@ +@import '../../assets/scss/variables'; +@import '../../assets/scss/mixins'; + +.pagination { + @include margin-top(2); + display: flex; + + &__prev { + width: 50%; + text-align: left; + + &-link { + color: $color-secondary; + font-size: 26px; + font-weight: bold; + + &:hover, + &:focus { + color: $color-primary; + } + + &--disable { + pointer-events: none; + color: lighten($color-gray, 20%); + } + + } + + } + + &__next { + width: 50%; + text-align: right; + + &-link { + color: $color-secondary; + font-size: 26px; + font-weight: bold; + + &:hover, + &:focus { + color: $color-primary; + } + + &--disable { + pointer-events: none; + color: lighten($color-gray, 20%); + } + + } + + } + +} \ No newline at end of file diff --git a/src/components/Pagination/Pagination.test.js b/src/components/Pagination/Pagination.test.js new file mode 100644 index 0000000..334d1f8 --- /dev/null +++ b/src/components/Pagination/Pagination.test.js @@ -0,0 +1,17 @@ +import React from 'react'; +import renderer from 'react-test-renderer'; +import Pagination from './Pagination'; + +describe('Pagination', () => { + const props = { + prevPagePath: '/page/1', + nextPagePath: '/page/3', + hasNextPage: true, + hasPrevPage: true + }; + + it('renders correctly', () => { + const tree = renderer.create().toJSON(); + expect(tree).toMatchSnapshot(); + }); +}); diff --git a/src/components/Pagination/__snapshots__/Pagination.test.js.snap b/src/components/Pagination/__snapshots__/Pagination.test.js.snap new file mode 100644 index 0000000..cdb22ff --- /dev/null +++ b/src/components/Pagination/__snapshots__/Pagination.test.js.snap @@ -0,0 +1,28 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Pagination renders correctly 1`] = ` +
+
+ + ← PREV + +
+
+ + → NEXT + +
+
+`; diff --git a/src/components/Pagination/index.js b/src/components/Pagination/index.js new file mode 100644 index 0000000..eaef04e --- /dev/null +++ b/src/components/Pagination/index.js @@ -0,0 +1 @@ +export { default } from './Pagination'; diff --git a/src/constants/index.js b/src/constants/index.js index 62cc29e..9afe180 100644 --- a/src/constants/index.js +++ b/src/constants/index.js @@ -1 +1,2 @@ export { default as ICONS } from './icons'; +export { default as PAGINATION } from './pagination'; diff --git a/src/constants/pagination.js b/src/constants/pagination.js new file mode 100644 index 0000000..449e3c8 --- /dev/null +++ b/src/constants/pagination.js @@ -0,0 +1,6 @@ +const PAGINATION = { + PREV_PAGE: '← PREV', + NEXT_PAGE: '→ NEXT' +}; + +export default PAGINATION; diff --git a/src/templates/__snapshots__/category-template.test.js.snap b/src/templates/__snapshots__/category-template.test.js.snap index 3d26e23..1f87309 100644 --- a/src/templates/__snapshots__/category-template.test.js.snap +++ b/src/templates/__snapshots__/category-template.test.js.snap @@ -121,6 +121,30 @@ exports[`CategoryTemplate renders correctly 1`] = ` +
+
+ + ← PREV + +
+
+ + → NEXT + +
+
diff --git a/src/templates/__snapshots__/index-template.test.js.snap b/src/templates/__snapshots__/index-template.test.js.snap index 5cdb8bb..5c3f3ad 100644 --- a/src/templates/__snapshots__/index-template.test.js.snap +++ b/src/templates/__snapshots__/index-template.test.js.snap @@ -116,6 +116,30 @@ exports[`IndexTemplate renders correctly 1`] = ` +
+
+ + ← PREV + +
+
+ + → NEXT + +
+
diff --git a/src/templates/__snapshots__/tag-template.test.js.snap b/src/templates/__snapshots__/tag-template.test.js.snap index 702371b..2614e27 100644 --- a/src/templates/__snapshots__/tag-template.test.js.snap +++ b/src/templates/__snapshots__/tag-template.test.js.snap @@ -121,6 +121,30 @@ exports[`TagTemplate renders correctly 1`] = ` +
+
+ + ← PREV + +
+
+ + → NEXT + +
+
diff --git a/src/templates/category-template.js b/src/templates/category-template.js index 70bad4a..579b88c 100644 --- a/src/templates/category-template.js +++ b/src/templates/category-template.js @@ -4,6 +4,7 @@ import Layout from '../components/Layout'; import Sidebar from '../components/Sidebar'; import Feed from '../components/Feed'; import Page from '../components/Page'; +import Pagination from '../components/Pagination'; const CategoryTemplate = ({ data, pageContext }) => { const { @@ -13,24 +14,34 @@ const CategoryTemplate = ({ data, pageContext }) => { const { category, - page + currentPage, + prevPagePath, + nextPagePath, + hasPrevPage, + hasNextPage, } = pageContext; const { edges } = data.allMarkdownRemark; - const pageTitle = page > 0 ? `${category} - Page ${page} - ${siteTitle}` : `${category} - ${siteTitle}`; + const pageTitle = currentPage > 0 ? `${category} - Page ${currentPage} - ${siteTitle}` : `${category} - ${siteTitle}`; return ( + ); }; export const query = graphql` - query CategoryPage($category: String, $limit: Int!, $skip: Int!) { + query CategoryPage($category: String, $postsLimit: Int!, $postsOffset: Int!) { site { siteMetadata { title @@ -38,8 +49,8 @@ export const query = graphql` } } allMarkdownRemark( - limit: $limit, - skip: $skip, + limit: $postsLimit, + skip: $postsOffset, filter: { frontmatter: { category: { eq: $category }, layout: { eq: "post" }, draft: { ne: true } } }, sort: { order: DESC, fields: [frontmatter___date] } ){ diff --git a/src/templates/category-template.test.js b/src/templates/category-template.test.js index 48efbcf..fdc3b09 100644 --- a/src/templates/category-template.test.js +++ b/src/templates/category-template.test.js @@ -56,7 +56,11 @@ describe('CategoryTemplate', () => { }, pageContext: { category: 'test', - page: 1 + currentPage: 1, + prevPagePath: '/page/1', + nextPagePath: '/page/3', + hasNextPage: true, + hasPrevPage: true } }; diff --git a/src/templates/index-template.js b/src/templates/index-template.js index 1c33592..21186ef 100644 --- a/src/templates/index-template.js +++ b/src/templates/index-template.js @@ -4,6 +4,7 @@ import Layout from '../components/Layout'; import Sidebar from '../components/Sidebar'; import Feed from '../components/Feed'; import Page from '../components/Page'; +import Pagination from '../components/Pagination'; const IndexTemplate = ({ data, pageContext }) => { const { @@ -11,22 +12,35 @@ const IndexTemplate = ({ data, pageContext }) => { subtitle: siteSubtitle } = data.site.siteMetadata; - const { page } = pageContext; + const { + currentPage, + hasNextPage, + hasPrevPage, + prevPagePath, + nextPagePath + } = pageContext; + const { edges } = data.allMarkdownRemark; - const pageTitle = page > 0 ? `Posts - Page ${page} - ${siteTitle}` : siteTitle; + const pageTitle = currentPage > 0 ? `Posts - Page ${currentPage} - ${siteTitle}` : siteTitle; return ( - + + ); }; export const query = graphql` - query IndexTemplate($limit: Int!, $skip: Int!) { + query IndexTemplate($postsLimit: Int!, $postsOffset: Int!) { site { siteMetadata { title @@ -34,8 +48,8 @@ export const query = graphql` } } allMarkdownRemark( - limit: $limit, - skip: $skip, + limit: $postsLimit, + skip: $postsOffset, filter: { frontmatter: { layout: { eq: "post" }, draft: { ne: true } } }, sort: { order: DESC, fields: [frontmatter___date] } ){ diff --git a/src/templates/index-template.test.js b/src/templates/index-template.test.js index c802440..fa975bf 100644 --- a/src/templates/index-template.test.js +++ b/src/templates/index-template.test.js @@ -45,7 +45,11 @@ describe('IndexTemplate', () => { } }, pageContext: { - page: 1 + currentPage: 1, + prevPagePath: '/page/1', + nextPagePath: '/page/3', + hasNextPage: true, + hasPrevPage: true } }; diff --git a/src/templates/tag-template.js b/src/templates/tag-template.js index dbcda72..3a61b08 100644 --- a/src/templates/tag-template.js +++ b/src/templates/tag-template.js @@ -4,6 +4,7 @@ import Layout from '../components/Layout'; import Sidebar from '../components/Sidebar'; import Feed from '../components/Feed'; import Page from '../components/Page'; +import Pagination from '../components/Pagination'; const TagTemplate = ({ data, pageContext }) => { const { @@ -12,25 +13,35 @@ const TagTemplate = ({ data, pageContext }) => { } = data.site.siteMetadata; const { - page, - tag + tag, + currentPage, + prevPagePath, + nextPagePath, + hasPrevPage, + hasNextPage } = pageContext; const { edges } = data.allMarkdownRemark; - const pageTitle = page > 0 ? `All Posts tagged as "${tag}" - Page ${page} - ${siteTitle}` : `All Posts tagged as "${tag}" - ${siteTitle}`; + const pageTitle = currentPage > 0 ? `All Posts tagged as "${tag}" - Page ${currentPage} - ${siteTitle}` : `All Posts tagged as "${tag}" - ${siteTitle}`; return ( + ); }; export const query = graphql` - query TagPage($tag: String, $limit: Int!, $skip: Int!) { + query TagPage($tag: String, $postsLimit: Int!, $postsOffset: Int!) { site { siteMetadata { title @@ -38,8 +49,8 @@ export const query = graphql` } } allMarkdownRemark( - limit: $limit, - skip: $skip, + limit: $postsLimit, + skip: $postsOffset, filter: { frontmatter: { tags: { in: [$tag] }, layout: { eq: "post" }, draft: { ne: true } } }, sort: { order: DESC, fields: [frontmatter___date] } ){ diff --git a/src/templates/tag-template.test.js b/src/templates/tag-template.test.js index 440bb5a..13539b3 100644 --- a/src/templates/tag-template.test.js +++ b/src/templates/tag-template.test.js @@ -56,7 +56,11 @@ describe('TagTemplate', () => { }, pageContext: { tag: 'test', - page: 1 + currentPage: 1, + prevPagePath: '/page/1', + nextPagePath: '/page/3', + hasNextPage: true, + hasPrevPage: true } }; diff --git a/yarn.lock b/yarn.lock index 723df35..04f9949 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1920,7 +1920,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-polyfill@^6.20.0: +babel-polyfill@^6.20.0, babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" dependencies: @@ -2682,7 +2682,7 @@ charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" -cheerio@^1.0.0-rc.2: +cheerio@1.0.0-rc.2, cheerio@^1.0.0-rc.2: version "1.0.0-rc.2" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" dependencies: @@ -2767,6 +2767,10 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classnames@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + clean-css@4.2.x: version "4.2.1" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" @@ -3495,6 +3499,12 @@ cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" +d@1: + version "1.0.0" + resolved "http://registry.npmjs.org/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + damerau-levenshtein@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" @@ -3700,6 +3710,14 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" +deep-map@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/deep-map/-/deep-map-1.5.0.tgz#eaa595cb81783ca2800f26a42e09f16e7d4fb890" + dependencies: + es6-weak-map "^2.0.2" + lodash "^4.17.4" + tslib "^1.6.0" + deepmerge@^2.0.1: version "2.2.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" @@ -4255,6 +4273,22 @@ es-to-primitive@^1.1.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.46" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" + +es6-iterator@^2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + es6-promise@^3.0.2: version "3.3.1" resolved "http://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" @@ -4263,6 +4297,22 @@ es6-promisify@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.0.0.tgz#b526a75eaa5ca600e960bf3d5ad98c40d75c7203" +es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -5291,9 +5341,9 @@ gatsby-plugin-google-analytics@^2.0.6: dependencies: "@babel/runtime" "^7.0.0" -gatsby-plugin-netlify-cms@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/gatsby-plugin-netlify-cms/-/gatsby-plugin-netlify-cms-3.0.5.tgz#2508424c43ec432163656b63e46c6ea9ff8a29f9" +gatsby-plugin-netlify-cms@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/gatsby-plugin-netlify-cms/-/gatsby-plugin-netlify-cms-3.0.7.tgz#d5da2b65611667cae7ca01d49fe8d4df0944a639" dependencies: friendly-errors-webpack-plugin "^1.7.0" html-webpack-exclude-assets-plugin "^0.0.7" @@ -5416,6 +5466,18 @@ gatsby-remark-prismjs@^3.0.2: parse-numeric-range "^0.0.2" unist-util-visit "^1.3.0" +gatsby-remark-relative-images@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/gatsby-remark-relative-images/-/gatsby-remark-relative-images-0.2.0.tgz#a8a88186d38a2c5ab0a8a9f926df7abcd1dd2d55" + dependencies: + babel-polyfill "^6.26.0" + cheerio "1.0.0-rc.2" + deep-map "1.5.0" + is-relative-url "2.0.0" + lodash "4.17.5" + slash "2.0.0" + unist-util-select "1.5.0" + gatsby-remark-responsive-iframe@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/gatsby-remark-responsive-iframe/-/gatsby-remark-responsive-iframe-2.0.5.tgz#a8ee276e38ce92f98746916c01d1c30e328048fd" @@ -7132,7 +7194,7 @@ is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" -is-relative-url@^2.0.0: +is-relative-url@2.0.0, is-relative-url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-2.0.0.tgz#72902d7fe04b3d4792e7db15f9db84b7204c9cef" dependencies: @@ -8227,6 +8289,10 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" +lodash@4.17.5: + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" + lodash@^4.0.0, lodash@^4.1.1, lodash@^4.11.1, lodash@^4.12.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@~4.17.10: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -9083,7 +9149,7 @@ netlify-identity-widget@^1.4.11: version "1.4.14" resolved "https://registry.yarnpkg.com/netlify-identity-widget/-/netlify-identity-widget-1.4.14.tgz#32539380b85ce98881f3cea2d59111cb031ea994" -next-tick@^1.0.0: +next-tick@1, next-tick@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" @@ -12047,6 +12113,10 @@ sitemap@^1.12.0: underscore "^1.7.0" url-join "^1.1.0" +slash@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -13403,7 +13473,7 @@ unist-util-remove-position@^1.0.0, unist-util-remove-position@^1.1.2: dependencies: unist-util-visit "^1.1.0" -unist-util-select@^1.5.0: +unist-util-select@1.5.0, unist-util-select@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/unist-util-select/-/unist-util-select-1.5.0.tgz#a93c2be8c0f653827803b81331adec2aa24cd933" dependencies: