diff --git a/docs/blog/2019-03-18-releasing-new-schema-customization/index.md b/docs/blog/2019-03-18-releasing-new-schema-customization/index.md
new file mode 100644
index 0000000000000..88c407e1ceed7
--- /dev/null
+++ b/docs/blog/2019-03-18-releasing-new-schema-customization/index.md
@@ -0,0 +1,133 @@
+---
+title: New Schema Customization API - Available in Gatsby 2.2.0
+date: 2019-03-19
+author: Mikhail Novikov
+tags:
+ - schema
+ - graphql
+---
+
+Two weeks ago, we announced our plans for a [new schema customization API](/blog/2019-03-04-new-schema-customization/). Today we are making this set of new APIs and enhancements available to all in `gatsby`@`2.2.0`.
+
+First, install the latest and greatest version of `gatsby`, like so:
+
+```shell
+npm install gatsby --save
+```
+
+Next, continue reading below to see if any of the great, new features we've enabled scratch a particular itch. We feel very confident they will π
+
+# Recap of schema customization
+
+Before this change, the Gatsby GraphQL schema was generated automatically from the data that the user added to Gatsby. While very convenient and easy to start, changes to the data could cause changes to the schema, which could cause breakage in unrelated locations. Those bugs were confusing and hard to debug. To alleviate this problem, we've added a schema customization API that lets you customize, fix, and enhance types in your Gatsby GraphQL schema.
+
+There are two new APIs, `createTypes` and `createResolvers`.
+
+## `createTypes`
+
+`createTypes` can be used to define, fix, or extend a Gatsby GraphQL type that represents some of your app's data. Think of it like an escape hatch to politely inform Gatsby of your data's shape.
+
+```js:title=gatsby-node.js
+exports.sourceNodes = ({ actions }) => {
+ const { createTypes } = actions
+ const typeDefs = `
+ type AuthorJson implements Node {
+ name: String
+ birthday: Date
+ }
+ `
+ createTypes(typeDefs)
+}
+```
+
+After adding this to your [gatsby-node](/docs/gatsby-project-structure/#files) file, the `AuthorJson` type will always have fields name and birthday, regardless of the automatically inferred data shape. The rest of the fields will still be inferred normally, allowing you to enjoy the default benefits of Gatsby schema inference.
+
+## `createResolvers`
+
+`createResolvers` allows doing additional customization after all schema processing has been finished. Thus it can be used to add fields to any types, including root types like `Query` and types from third party schemas.
+
+```js:title=gatsby-node.js
+createResolvers({
+ Query: {
+ allAuthorFullNames: {
+ type: `[String!]!`,
+ resolve(source, args, context, info) {
+ const authors = context.nodeModel.getAllNodes({
+ type: `AuthorJson`,
+ })
+ return authors.map(author => author.name)
+ },
+ },
+ },
+})
+```
+
+## The Type Builder API
+
+While `createTypes` accepts GraphQL types as a [Schema Definition Language (SDL)](https://graphql.org/learn/schema/) string, we've also added an option to use `graphql-js` types so that users could create types with resolvers. However, `graphql-js` is somewhat verbose and it can be hard to refer to types that don't yet exist or don't exist in a current scope. Therefore, we decided to add another programmatic API that combines brevity of SDL with flexibility of `graphql-js`.
+
+We refer to this API as the _Type Builder API_. It is available in the `schema` field of the arguments object passed to [Gatsby Node APIs](/docs/node-apis/).
+
+```js:title=gatsby-node.js
+exports.sourceNodes = ({ actions, schema }) => {
+ const { createTypes } = actions
+ createTypes([
+ schema.buildObjectType({
+ name: `CommentJson`,
+ fields: {
+ text: `String!`,
+ blog: {
+ type: `BlogJson`,
+ resolve(parent, args, context) {
+ return context.nodeModel.getNodeById({
+ id: parent.author,
+ type: `BlogJson`,
+ })
+ },
+ },
+ author: {
+ type: `AuthorJson`,
+ resolve(parent, args, context) {
+ return context.nodeModel.getNodeById({
+ id: parent.author,
+ type: `AuthorJson`,
+ })
+ },
+ },
+ },
+ interfaces: [`Node`],
+ }),
+ ])
+}
+```
+
+# Potential for Breaking Changes
+
+We have tried to avoid any breaking changes in this refactor of the underlying GraphQL layer, testing it in notable Gatsby sites and ensuring all tests were passing. However, there are areas where we needed to introduce more stable naming, and in these instances it _could_ be possible that a breaking change was introduced if you were relying on this undocumented API.
+
+Specifically, before this refactor Gatsby type names weren't stable. They could have names like `frontmatter_2` because of some quirks in our schema generation. Now the types names are **stable** and **defined**. For a `Node`, it's always a Pascal Camel Cased name of the `Node` type (for example, `MarkdownRemark`). For an inline object, it's the name of the node plus the name of the field, again Pascal Camel Cased. So `frontmatter_2` would be available as `MarkdownRemarkFrontmatter` now. If you've had fragments referring to some types by their old names, you may need to change it to new names, e.g.:
+
+```diff
+- fragment someFragment on frontmatter_2 {
++ fragment someFragment on MarkdownRemarkFrontmatter {
+ title
+}
+```
+
+Another change relates to inference. Previously, ordering of the Nodes in your data source could affect which type Gatsby inferred. Now, we always consider all possible types, thus you might experience type conflicts for conflicting data sources. They can be solved by either fixing the data or defining a type using new schema customization APIs that we've exposed.
+
+# Wrap-up
+
+As next steps, we will work on adding more convenient tooling to "freeze" your schema type definitions, so that you can quickly start using this feature. We will also be working on improving API docs for this.
+
+We strongly believe that these new APIs are the foundation of an evolutionary leap of the Gatsby GraphQL API. These changes make the GraphQL API more stable, more robust, and more easily customizable. They will enable further customization and use cases, like [theming](/blog/2018-11-11-introducing-gatsby-themes/) and more still that we haven't even envisioned yet. We truly can't wait to see the great things you build and how you use these new APIs and improvements powered by Gatsby and its improved GraphQL layer. We got some very enthusiastic feedback about this feature and we are happy to have it released.
+
+
+
+## Additional Resources
+
+- [Meta issue](https://github.com/gatsbyjs/gatsby/issues/12272) for bug reports
+- [API docs for createTypes](/docs/actions/#createTypes)
+- [API docs for createResolvers](/docs/node-apis/#createResolvers)
+- [API docs for node model](/docs/node-model)
+- [Using type definitions example](https://github.com/gatsbyjs/gatsby/tree/master/examples/using-type-definitions)
diff --git a/examples/using-type-definitions/.gitignore b/examples/using-type-definitions/.gitignore
new file mode 100644
index 0000000000000..e86fe25559ba0
--- /dev/null
+++ b/examples/using-type-definitions/.gitignore
@@ -0,0 +1,69 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Typescript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# dotenv environment variables file
+.env
+
+# gatsby files
+.cache/
+public
+
+# Mac files
+.DS_Store
+
+# Yarn
+yarn-error.log
+.pnp/
+.pnp.js
+# Yarn Integrity file
+.yarn-integrity
diff --git a/examples/using-type-definitions/.prettierrc b/examples/using-type-definitions/.prettierrc
new file mode 100644
index 0000000000000..36301bc5cff6c
--- /dev/null
+++ b/examples/using-type-definitions/.prettierrc
@@ -0,0 +1,5 @@
+{
+ "semi": false,
+ "singleQuote": true,
+ "trailingComma": "es5"
+}
diff --git a/examples/using-type-definitions/LICENSE b/examples/using-type-definitions/LICENSE
new file mode 100644
index 0000000000000..5169a5e4135e9
--- /dev/null
+++ b/examples/using-type-definitions/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 gatsbyjs
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/examples/using-type-definitions/README.md b/examples/using-type-definitions/README.md
new file mode 100644
index 0000000000000..11e2af0eab56b
--- /dev/null
+++ b/examples/using-type-definitions/README.md
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+ Gatsby's default starter
+
+
+Kick off your project with this default boilerplate. This starter ships with the main Gatsby configuration files you might need to get up and running blazing fast with the blazing fast app generator for React.
+
+_Have another more specific idea? You may want to check out our vibrant collection of [official and community-created starters](https://www.gatsbyjs.org/docs/gatsby-starters/)._
+
+## π Quick start
+
+1. **Create a Gatsby site.**
+
+ Use the Gatsby CLI to create a new site, specifying the default starter.
+
+ ```sh
+ # create a new Gatsby site using the default starter
+ gatsby new my-default-starter https://github.com/gatsbyjs/gatsby-starter-default
+ ```
+
+1. **Start developing.**
+
+ Navigate into your new siteβs directory and start it up.
+
+ ```sh
+ cd my-default-starter/
+ gatsby develop
+ ```
+
+1. **Open the source code and start editing!**
+
+ Your site is now running at `http://localhost:8000`!
+
+ _Note: You'll also see a second link: _`http://localhost:8000/___graphql`_. This is a tool you can use to experiment with querying your data. Learn more about using this tool in the [Gatsby tutorial](https://www.gatsbyjs.org/tutorial/part-five/#introducing-graphiql)._
+
+ Open the `my-default-starter` directory in your code editor of choice and edit `src/pages/index.js`. Save your changes and the browser will update in real time!
+
+## π§ What's inside?
+
+A quick look at the top-level files and directories you'll see in a Gatsby project.
+
+ .
+ βββ node_modules
+ βββ src
+ βββ .gitignore
+ βββ .prettierrc
+ βββ gatsby-browser.js
+ βββ gatsby-config.js
+ βββ gatsby-node.js
+ βββ gatsby-ssr.js
+ βββ LICENSE
+ βββ package-lock.json
+ βββ package.json
+ βββ README.md
+
+1. **`/node_modules`**: This directory contains all of the modules of code that your project depends on (npm packages) are automatically installed.
+
+2. **`/src`**: This directory will contain all of the code related to what you will see on the front-end of your site (what you see in the browser) such as your site header or a page template. `src` is a convention for βsource codeβ.
+
+3. **`.gitignore`**: This file tells git which files it should not track / not maintain a version history for.
+
+4. **`.prettierrc`**: This is a configuration file for [Prettier](https://prettier.io/). Prettier is a tool to help keep the formatting of your code consistent.
+
+5. **`gatsby-browser.js`**: This file is where Gatsby expects to find any usage of the [Gatsby browser APIs](https://www.gatsbyjs.org/docs/browser-apis/) (if any). These allow customization/extension of default Gatsby settings affecting the browser.
+
+6. **`gatsby-config.js`**: This is the main configuration file for a Gatsby site. This is where you can specify information about your site (metadata) like the site title and description, which Gatsby plugins youβd like to include, etc. (Check out the [config docs](https://www.gatsbyjs.org/docs/gatsby-config/) for more detail).
+
+7. **`gatsby-node.js`**: This file is where Gatsby expects to find any usage of the [Gatsby Node APIs](https://www.gatsbyjs.org/docs/node-apis/) (if any). These allow customization/extension of default Gatsby settings affecting pieces of the site build process.
+
+8. **`gatsby-ssr.js`**: This file is where Gatsby expects to find any usage of the [Gatsby server-side rendering APIs](https://www.gatsbyjs.org/docs/ssr-apis/) (if any). These allow customization of default Gatsby settings affecting server-side rendering.
+
+9. **`LICENSE`**: Gatsby is licensed under the MIT license.
+
+10. **`package-lock.json`** (See `package.json` below, first). This is an automatically generated file based on the exact versions of your npm dependencies that were installed for your project. **(You wonβt change this file directly).**
+
+11. **`package.json`**: A manifest file for Node.js projects, which includes things like metadata (the projectβs name, author, etc). This manifest is how npm knows which packages to install for your project.
+
+12. **`README.md`**: A text file containing useful reference information about your project.
+
+## π Learning Gatsby
+
+Looking for more guidance? Full documentation for Gatsby lives [on the website](https://www.gatsbyjs.org/). Here are some places to start:
+
+- **For most developers, we recommend starting with our [in-depth tutorial for creating a site with Gatsby](https://www.gatsbyjs.org/tutorial/).** It starts with zero assumptions about your level of ability and walks through every step of the process.
+
+- **To dive straight into code samples, head [to our documentation](https://www.gatsbyjs.org/docs/).** In particular, check out the _Guides_, _API Reference_, and _Advanced Tutorials_ sections in the sidebar.
+
+## π« Deploy
+
+[](https://app.netlify.com/start/deploy?repository=https://github.com/gatsbyjs/gatsby-starter-default)
+
+
diff --git a/examples/using-type-definitions/gatsby-config.js b/examples/using-type-definitions/gatsby-config.js
new file mode 100644
index 0000000000000..17c273c627a3b
--- /dev/null
+++ b/examples/using-type-definitions/gatsby-config.js
@@ -0,0 +1,26 @@
+module.exports = {
+ siteMetadata: {
+ title: `Gatsby Default Starter`,
+ description: `Kick off your next, great Gatsby project with this default starter. This barebones starter ships with the main Gatsby configuration files you might need.`,
+ author: `@gatsbyjs`,
+ },
+ plugins: [
+ {
+ resolve: `gatsby-source-filesystem`,
+ options: {
+ name: `images`,
+ path: `./src/images`,
+ },
+ },
+ `gatsby-transformer-sharp`,
+ `gatsby-plugin-sharp`,
+ `gatsby-transformer-json`,
+ {
+ resolve: `gatsby-source-filesystem`,
+ options: {
+ name: `data`,
+ path: `./src/data/`,
+ },
+ },
+ ],
+}
diff --git a/examples/using-type-definitions/gatsby-node.js b/examples/using-type-definitions/gatsby-node.js
new file mode 100644
index 0000000000000..75b79eb2ac196
--- /dev/null
+++ b/examples/using-type-definitions/gatsby-node.js
@@ -0,0 +1,131 @@
+const fs = require(`fs`)
+
+exports.sourceNodes = ({ actions, schema }) => {
+ const { createTypes } = actions
+
+ // Type definitions can be provided in SDL
+ const typeDefs = `
+ type AuthorJson implements Node {
+ name: String!
+ firstName: String!
+ email: String!
+ picture: File
+ }
+
+ type BlogJson implements Node {
+ title: String!
+ authors: [AuthorJson]
+ text: String
+ date: Date
+ tags: [String]
+ meta: Metadata
+ }
+ `
+ createTypes(typeDefs)
+
+ // Alternatively, you can use type builders to construct types
+ createTypes([
+ schema.buildObjectType({
+ name: `CommentJson`,
+ fields: {
+ text: `String!`,
+ blog: {
+ type: `BlogJson`,
+ resolve(parent, args, context) {
+ return context.nodeModel.getNodeById({
+ id: parent.author,
+ type: `BlogJson`,
+ })
+ },
+ },
+ author: {
+ type: `AuthorJson`,
+ resolve(parent, args, context) {
+ return context.nodeModel.getNodeById({
+ id: parent.author,
+ type: `AuthorJson`,
+ })
+ },
+ },
+ },
+ interfaces: [`Node`],
+ }),
+ ])
+
+ // It is of course also possible to read type definitions from a .gql file,
+ // which will give you proper syntax highlighting
+ const additionalTypeDefs = fs.readFileSync(`type-defs.gql`, {
+ encoding: `utf-8`,
+ })
+ createTypes(additionalTypeDefs)
+}
+
+exports.createResolvers = ({ createResolvers }) => {
+ createResolvers({
+ Query: {
+ // Create a new root query field.
+ allAuthorFullNames: {
+ type: [`String!`],
+ resolve(source, args, context, info) {
+ const authors = context.nodeModel.getAllNodes({
+ type: `AuthorJson`,
+ })
+ return authors.map(author => `${author.name}, ${author.firstName}`)
+ },
+ },
+ // Field resolvers can use all of Gatsby's querying capabilities
+ allPostsTaggedWithBaz: {
+ type: [`BlogJson`],
+ resolve(source, args, context, info) {
+ return context.nodeModel.runQuery({
+ query: { filter: { tags: { eq: `baz` } } },
+ type: `BlogJson`,
+ firstOnly: false,
+ })
+ },
+ },
+ },
+ AuthorJson: {
+ // Add a field to an existing type by providing a field config.
+ // Note that added fields will not be available in the input filter
+ // when no type definitions are provided wth `createTypes`.
+ posts: {
+ type: [`BlogJson`],
+ resolve(source, args, context, info) {
+ // We use an author's `email` as foreign key in `BlogJson.authors`
+ const fieldValue = source.email
+
+ const posts = context.nodeModel.getAllNodes({
+ type: `BlogJson`,
+ })
+ return posts.filter(post =>
+ (post.authors || []).some(author => author === fieldValue)
+ )
+ },
+ },
+ },
+ BlogJson: {
+ // Add a resolver to a field defined with `createTypes`.
+ authors: {
+ resolve(source, args, context, info) {
+ const emails = source[info.fieldName]
+ if (emails == null) return null
+
+ const authors = context.nodeModel.getAllNodes({
+ type: `AuthorJson`,
+ })
+ return authors.filter(author => emails.includes(author.email))
+ },
+ },
+ comments: {
+ type: `[CommentJson!]!`,
+ resolve(source, args, context, info) {
+ const result = context.nodeModel.getAllNodes({
+ type: `CommentJson`,
+ })
+ return result.filter(({ blog }) => blog === source.id)
+ },
+ },
+ },
+ })
+}
diff --git a/examples/using-type-definitions/package.json b/examples/using-type-definitions/package.json
new file mode 100644
index 0000000000000..4404ea8a12137
--- /dev/null
+++ b/examples/using-type-definitions/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "using-type-definitions",
+ "private": true,
+ "description": "An example site using createTypes action and createResolvers API",
+ "version": "0.1.0",
+ "dependencies": {
+ "gatsby": "schema-customization",
+ "gatsby-image": "^2.0.20",
+ "gatsby-plugin-sharp": "^2.0.14",
+ "gatsby-source-filesystem": "^2.0.13",
+ "gatsby-transformer-json": "^2.1.7",
+ "gatsby-transformer-sharp": "^2.1.8",
+ "prop-types": "^15.6.2",
+ "react": "^16.6.3",
+ "react-dom": "^16.6.3",
+ "react-helmet": "^5.2.0"
+ },
+ "keywords": [
+ "gatsby"
+ ],
+ "license": "MIT",
+ "scripts": {
+ "build": "gatsby build",
+ "develop": "gatsby develop",
+ "start": "npm run develop",
+ "format": "prettier --write \"src/**/*.js\"",
+ "test": "echo \"Write tests! -> https://gatsby.app/unit-testing\""
+ },
+ "devDependencies": {
+ "prettier": "^1.15.2"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/gatsbyjs/gatsby-starter-default"
+ },
+ "bugs": {
+ "url": "https://github.com/gatsbyjs/gatsby/issues"
+ }
+}
diff --git a/examples/using-type-definitions/src/components/header.js b/examples/using-type-definitions/src/components/header.js
new file mode 100644
index 0000000000000..235f8834818a3
--- /dev/null
+++ b/examples/using-type-definitions/src/components/header.js
@@ -0,0 +1,42 @@
+import { Link } from 'gatsby'
+import PropTypes from 'prop-types'
+import React from 'react'
+
+const Header = ({ siteTitle }) => (
+
+
+
+
+ {siteTitle}
+
+
+
+
+)
+
+Header.propTypes = {
+ siteTitle: PropTypes.string,
+}
+
+Header.defaultProps = {
+ siteTitle: ``,
+}
+
+export default Header
diff --git a/examples/using-type-definitions/src/components/image.js b/examples/using-type-definitions/src/components/image.js
new file mode 100644
index 0000000000000..9ed27ee238349
--- /dev/null
+++ b/examples/using-type-definitions/src/components/image.js
@@ -0,0 +1,32 @@
+import React from 'react'
+import { StaticQuery, graphql } from 'gatsby'
+import Img from 'gatsby-image'
+
+/*
+ * This component is built using `gatsby-image` to automatically serve optimized
+ * images with lazy loading and reduced file sizes. The image is loaded using a
+ * `StaticQuery`, which allows us to load the image from directly within this
+ * component, rather than having to pass the image data down from pages.
+ *
+ * For more information, see the docs:
+ * - `gatsby-image`: https://gatsby.app/gatsby-image
+ * - `StaticQuery`: https://gatsby.app/staticquery
+ */
+
+const Image = () => (
+ }
+ />
+)
+export default Image
diff --git a/examples/using-type-definitions/src/components/layout.css b/examples/using-type-definitions/src/components/layout.css
new file mode 100644
index 0000000000000..68aa9337485f7
--- /dev/null
+++ b/examples/using-type-definitions/src/components/layout.css
@@ -0,0 +1,624 @@
+html {
+ font-family: sans-serif;
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+}
+body {
+ margin: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+main,
+menu,
+nav,
+section,
+summary {
+ display: block;
+}
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+}
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+progress {
+ vertical-align: baseline;
+}
+[hidden],
+template {
+ display: none;
+}
+a {
+ background-color: transparent;
+ -webkit-text-decoration-skip: objects;
+}
+a:active,
+a:hover {
+ outline-width: 0;
+}
+abbr[title] {
+ border-bottom: none;
+ text-decoration: underline;
+ text-decoration: underline dotted;
+}
+b,
+strong {
+ font-weight: inherit;
+ font-weight: bolder;
+}
+dfn {
+ font-style: italic;
+}
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+mark {
+ background-color: #ff0;
+ color: #000;
+}
+small {
+ font-size: 80%;
+}
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+sub {
+ bottom: -0.25em;
+}
+sup {
+ top: -0.5em;
+}
+img {
+ border-style: none;
+}
+svg:not(:root) {
+ overflow: hidden;
+}
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+figure {
+ margin: 1em 40px;
+}
+hr {
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+ font: inherit;
+ margin: 0;
+}
+optgroup {
+ font-weight: 700;
+}
+button,
+input {
+ overflow: visible;
+}
+button,
+select {
+ text-transform: none;
+}
+[type='reset'],
+[type='submit'],
+button,
+html [type='button'] {
+ -webkit-appearance: button;
+}
+[type='button']::-moz-focus-inner,
+[type='reset']::-moz-focus-inner,
+[type='submit']::-moz-focus-inner,
+button::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+}
+[type='button']:-moz-focusring,
+[type='reset']:-moz-focusring,
+[type='submit']:-moz-focusring,
+button:-moz-focusring {
+ outline: 1px dotted ButtonText;
+}
+fieldset {
+ border: 1px solid silver;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+legend {
+ box-sizing: border-box;
+ color: inherit;
+ display: table;
+ max-width: 100%;
+ padding: 0;
+ white-space: normal;
+}
+textarea {
+ overflow: auto;
+}
+[type='checkbox'],
+[type='radio'] {
+ box-sizing: border-box;
+ padding: 0;
+}
+[type='number']::-webkit-inner-spin-button,
+[type='number']::-webkit-outer-spin-button {
+ height: auto;
+}
+[type='search'] {
+ -webkit-appearance: textfield;
+ outline-offset: -2px;
+}
+[type='search']::-webkit-search-cancel-button,
+[type='search']::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+::-webkit-input-placeholder {
+ color: inherit;
+ opacity: 0.54;
+}
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ font: inherit;
+}
+html {
+ font: 112.5%/1.45em georgia, serif;
+ box-sizing: border-box;
+ overflow-y: scroll;
+}
+* {
+ box-sizing: inherit;
+}
+*:before {
+ box-sizing: inherit;
+}
+*:after {
+ box-sizing: inherit;
+}
+body {
+ color: hsla(0, 0%, 0%, 0.8);
+ font-family: georgia, serif;
+ font-weight: normal;
+ word-wrap: break-word;
+ font-kerning: normal;
+ -moz-font-feature-settings: 'kern', 'liga', 'clig', 'calt';
+ -ms-font-feature-settings: 'kern', 'liga', 'clig', 'calt';
+ -webkit-font-feature-settings: 'kern', 'liga', 'clig', 'calt';
+ font-feature-settings: 'kern', 'liga', 'clig', 'calt';
+}
+img {
+ max-width: 100%;
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+}
+h1 {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+ color: inherit;
+ font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
+ Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
+ font-weight: bold;
+ text-rendering: optimizeLegibility;
+ font-size: 2.25rem;
+ line-height: 1.1;
+}
+h2 {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+ color: inherit;
+ font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
+ Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
+ font-weight: bold;
+ text-rendering: optimizeLegibility;
+ font-size: 1.62671rem;
+ line-height: 1.1;
+}
+h3 {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+ color: inherit;
+ font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
+ Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
+ font-weight: bold;
+ text-rendering: optimizeLegibility;
+ font-size: 1.38316rem;
+ line-height: 1.1;
+}
+h4 {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+ color: inherit;
+ font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
+ Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
+ font-weight: bold;
+ text-rendering: optimizeLegibility;
+ font-size: 1rem;
+ line-height: 1.1;
+}
+h5 {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+ color: inherit;
+ font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
+ Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
+ font-weight: bold;
+ text-rendering: optimizeLegibility;
+ font-size: 0.85028rem;
+ line-height: 1.1;
+}
+h6 {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+ color: inherit;
+ font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
+ Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
+ font-weight: bold;
+ text-rendering: optimizeLegibility;
+ font-size: 0.78405rem;
+ line-height: 1.1;
+}
+hgroup {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+}
+ul {
+ margin-left: 1.45rem;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+ list-style-position: outside;
+ list-style-image: none;
+}
+ol {
+ margin-left: 1.45rem;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+ list-style-position: outside;
+ list-style-image: none;
+}
+dl {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+}
+dd {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+}
+p {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+}
+figure {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+}
+pre {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+ font-size: 0.85rem;
+ line-height: 1.42;
+ background: hsla(0, 0%, 0%, 0.04);
+ border-radius: 3px;
+ overflow: auto;
+ word-wrap: normal;
+ padding: 1.45rem;
+}
+table {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+ font-size: 1rem;
+ line-height: 1.45rem;
+ border-collapse: collapse;
+ width: 100%;
+}
+fieldset {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+}
+blockquote {
+ margin-left: 1.45rem;
+ margin-right: 1.45rem;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+}
+form {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+}
+noscript {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+}
+iframe {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+}
+hr {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: calc(1.45rem - 1px);
+ background: hsla(0, 0%, 0%, 0.2);
+ border: none;
+ height: 1px;
+}
+address {
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ margin-bottom: 1.45rem;
+}
+b {
+ font-weight: bold;
+}
+strong {
+ font-weight: bold;
+}
+dt {
+ font-weight: bold;
+}
+th {
+ font-weight: bold;
+}
+li {
+ margin-bottom: calc(1.45rem / 2);
+}
+ol li {
+ padding-left: 0;
+}
+ul li {
+ padding-left: 0;
+}
+li > ol {
+ margin-left: 1.45rem;
+ margin-bottom: calc(1.45rem / 2);
+ margin-top: calc(1.45rem / 2);
+}
+li > ul {
+ margin-left: 1.45rem;
+ margin-bottom: calc(1.45rem / 2);
+ margin-top: calc(1.45rem / 2);
+}
+blockquote *:last-child {
+ margin-bottom: 0;
+}
+li *:last-child {
+ margin-bottom: 0;
+}
+p *:last-child {
+ margin-bottom: 0;
+}
+li > p {
+ margin-bottom: calc(1.45rem / 2);
+}
+code {
+ font-size: 0.85rem;
+ line-height: 1.45rem;
+}
+kbd {
+ font-size: 0.85rem;
+ line-height: 1.45rem;
+}
+samp {
+ font-size: 0.85rem;
+ line-height: 1.45rem;
+}
+abbr {
+ border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5);
+ cursor: help;
+}
+acronym {
+ border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5);
+ cursor: help;
+}
+abbr[title] {
+ border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5);
+ cursor: help;
+ text-decoration: none;
+}
+thead {
+ text-align: left;
+}
+td,
+th {
+ text-align: left;
+ border-bottom: 1px solid hsla(0, 0%, 0%, 0.12);
+ font-feature-settings: 'tnum';
+ -moz-font-feature-settings: 'tnum';
+ -ms-font-feature-settings: 'tnum';
+ -webkit-font-feature-settings: 'tnum';
+ padding-left: 0.96667rem;
+ padding-right: 0.96667rem;
+ padding-top: 0.725rem;
+ padding-bottom: calc(0.725rem - 1px);
+}
+th:first-child,
+td:first-child {
+ padding-left: 0;
+}
+th:last-child,
+td:last-child {
+ padding-right: 0;
+}
+tt,
+code {
+ background-color: hsla(0, 0%, 0%, 0.04);
+ border-radius: 3px;
+ font-family: 'SFMono-Regular', Consolas, 'Roboto Mono', 'Droid Sans Mono',
+ 'Liberation Mono', Menlo, Courier, monospace;
+ padding: 0;
+ padding-top: 0.2em;
+ padding-bottom: 0.2em;
+}
+pre code {
+ background: none;
+ line-height: 1.42;
+}
+code:before,
+code:after,
+tt:before,
+tt:after {
+ letter-spacing: -0.2em;
+ content: ' ';
+}
+pre code:before,
+pre code:after,
+pre tt:before,
+pre tt:after {
+ content: '';
+}
+@media only screen and (max-width: 480px) {
+ html {
+ font-size: 100%;
+ }
+}
diff --git a/examples/using-type-definitions/src/components/layout.js b/examples/using-type-definitions/src/components/layout.js
new file mode 100644
index 0000000000000..0750dcd6422fe
--- /dev/null
+++ b/examples/using-type-definitions/src/components/layout.js
@@ -0,0 +1,46 @@
+import React from 'react'
+import PropTypes from 'prop-types'
+import { StaticQuery, graphql } from 'gatsby'
+
+import Header from './header'
+import './layout.css'
+
+const Layout = ({ children }) => (
+ (
+ <>
+
+
+ {children}
+
+ Β© {new Date().getFullYear()}, Built with
+ {` `}
+ Gatsby
+
+
+ >
+ )}
+ />
+)
+
+Layout.propTypes = {
+ children: PropTypes.node.isRequired,
+}
+
+export default Layout
diff --git a/examples/using-type-definitions/src/components/seo.js b/examples/using-type-definitions/src/components/seo.js
new file mode 100644
index 0000000000000..f639bd883cdf1
--- /dev/null
+++ b/examples/using-type-definitions/src/components/seo.js
@@ -0,0 +1,96 @@
+import React from 'react'
+import PropTypes from 'prop-types'
+import Helmet from 'react-helmet'
+import { StaticQuery, graphql } from 'gatsby'
+
+function SEO({ description, lang, meta, keywords, title }) {
+ return (
+ {
+ const metaDescription =
+ description || data.site.siteMetadata.description
+ return (
+ 0
+ ? {
+ name: `keywords`,
+ content: keywords.join(`, `),
+ }
+ : []
+ )
+ .concat(meta)}
+ />
+ )
+ }}
+ />
+ )
+}
+
+SEO.defaultProps = {
+ lang: `en`,
+ meta: [],
+ keywords: [],
+}
+
+SEO.propTypes = {
+ description: PropTypes.string,
+ lang: PropTypes.string,
+ meta: PropTypes.array,
+ keywords: PropTypes.arrayOf(PropTypes.string),
+ title: PropTypes.string.isRequired,
+}
+
+export default SEO
+
+const detailsQuery = graphql`
+ query DefaultSEOQuery {
+ site {
+ siteMetadata {
+ title
+ description
+ author
+ }
+ }
+ }
+`
diff --git a/examples/using-type-definitions/src/data/author.json b/examples/using-type-definitions/src/data/author.json
new file mode 100644
index 0000000000000..e42a1e2160170
--- /dev/null
+++ b/examples/using-type-definitions/src/data/author.json
@@ -0,0 +1,16 @@
+[
+ {
+ "id": "author-1",
+ "name": "Novikov",
+ "firstName": "Mikhail",
+ "email": "m@example.com",
+ "picture": "../images/gatsby-astronaut.png"
+ },
+ {
+ "id": "author-2",
+ "name": "Probst",
+ "firstName": "Stefan",
+ "email": "s@example.com",
+ "picture": "../images/gatsby-astronaut.png"
+ }
+]
diff --git a/examples/using-type-definitions/src/data/blog.json b/examples/using-type-definitions/src/data/blog.json
new file mode 100644
index 0000000000000..d24a819092b3b
--- /dev/null
+++ b/examples/using-type-definitions/src/data/blog.json
@@ -0,0 +1,22 @@
+[
+ {
+ "id": "blog-1",
+ "title": "Gatsby is pretty amazing",
+ "authors": ["m@example.com"],
+ "date": "2019-01-01",
+ "tags": ["foo", "bar"]
+ },
+ {
+ "id": "blog-2",
+ "title": "But Gatsby blog posts might not have an author",
+ "date": "2018-01-01",
+ "tags": ["baz", "bar"]
+ },
+ {
+ "id": "blog-3",
+ "title": "Or they might have more than one author",
+ "authors": ["m@example.com", "s@example.com"],
+ "date": "2017-01-01",
+ "tags": ["baz"]
+ }
+]
diff --git a/examples/using-type-definitions/src/data/comment.json b/examples/using-type-definitions/src/data/comment.json
new file mode 100644
index 0000000000000..ab82243acc725
--- /dev/null
+++ b/examples/using-type-definitions/src/data/comment.json
@@ -0,0 +1,7 @@
+[
+ {
+ "text": "Wow, so cool!",
+ "blog": "blog-1",
+ "author": "author-1"
+ }
+]
diff --git a/examples/using-type-definitions/src/images/gatsby-astronaut.png b/examples/using-type-definitions/src/images/gatsby-astronaut.png
new file mode 100644
index 0000000000000..da58ece0a8c5b
Binary files /dev/null and b/examples/using-type-definitions/src/images/gatsby-astronaut.png differ
diff --git a/examples/using-type-definitions/src/images/gatsby-icon.png b/examples/using-type-definitions/src/images/gatsby-icon.png
new file mode 100644
index 0000000000000..908bc78a7f559
Binary files /dev/null and b/examples/using-type-definitions/src/images/gatsby-icon.png differ
diff --git a/examples/using-type-definitions/src/pages/404.js b/examples/using-type-definitions/src/pages/404.js
new file mode 100644
index 0000000000000..77a691f9da56d
--- /dev/null
+++ b/examples/using-type-definitions/src/pages/404.js
@@ -0,0 +1,14 @@
+import React from 'react'
+
+import Layout from '../components/layout'
+import SEO from '../components/seo'
+
+const NotFoundPage = () => (
+
+
+ NOT FOUND
+ You just hit a route that doesn't exist... the sadness.
+
+)
+
+export default NotFoundPage
diff --git a/examples/using-type-definitions/src/pages/index.js b/examples/using-type-definitions/src/pages/index.js
new file mode 100644
index 0000000000000..d64b7eff6973d
--- /dev/null
+++ b/examples/using-type-definitions/src/pages/index.js
@@ -0,0 +1,65 @@
+import React from 'react'
+import { Link, graphql } from 'gatsby'
+
+import Layout from '../components/layout'
+import SEO from '../components/seo'
+
+const IndexPage = ({ data }) => (
+
+
+ Hi people
+ Welcome to your new Gatsby site.
+ Now go build something great.
+
+ {data.allAuthorJson.edges.map(({ node }) => (
+
+
+ Posts by {node.firstName} {node.name}
+
+
+ {node.posts.map(post => (
+
+ {post.title}
+
+ {post.comments.map((comment, i) => (
+
+ {comment.author.name} - {comment.text}
+
+ ))}
+
+
+ ))}
+
+
+ ))}
+
+
+ Go to page 2
+
+)
+
+export default IndexPage
+
+export const query = graphql`
+ {
+ allAuthorJson {
+ edges {
+ node {
+ id
+ name
+ firstName
+ posts {
+ id
+ title
+ comments {
+ text
+ author {
+ name
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+`
diff --git a/examples/using-type-definitions/src/pages/page-2.js b/examples/using-type-definitions/src/pages/page-2.js
new file mode 100644
index 0000000000000..6d8cfa70f5fec
--- /dev/null
+++ b/examples/using-type-definitions/src/pages/page-2.js
@@ -0,0 +1,16 @@
+import React from 'react'
+import { Link } from 'gatsby'
+
+import Layout from '../components/layout'
+import SEO from '../components/seo'
+
+const SecondPage = () => (
+
+
+ Hi from the second page
+ Welcome to page 2
+ Go back to the homepage
+
+)
+
+export default SecondPage
diff --git a/examples/using-type-definitions/type-defs.gql b/examples/using-type-definitions/type-defs.gql
new file mode 100644
index 0000000000000..de80b35c7119e
--- /dev/null
+++ b/examples/using-type-definitions/type-defs.gql
@@ -0,0 +1,4 @@
+type Metadata {
+ publishedAt: Date
+ updatedAt: Date
+}
diff --git a/packages/gatsby-transformer-remark/src/__tests__/extend-node.js b/packages/gatsby-transformer-remark/src/__tests__/extend-node.js
index 435fc8b8d1862..27fe09bfbe6e1 100644
--- a/packages/gatsby-transformer-remark/src/__tests__/extend-node.js
+++ b/packages/gatsby-transformer-remark/src/__tests__/extend-node.js
@@ -1,26 +1,13 @@
-const {
- graphql,
- GraphQLObjectType,
- GraphQLList,
- GraphQLSchema,
-} = require(`gatsby/graphql`)
+const { graphql } = require(`gatsby/graphql`)
const { onCreateNode } = require(`../gatsby-node`)
-const {
- inferObjectStructureFromNodes,
-} = require(`../../../gatsby/src/schema/infer-graphql-type`)
const extendNodeType = require(`../extend-node-type`)
// given a set of nodes and a query, return the result of the query
async function queryResult(
nodes,
fragment,
- { types = [] } = {},
{ additionalParameters = {}, pluginOptions = {} }
) {
- const inferredFields = inferObjectStructureFromNodes({
- nodes,
- types: [...types],
- })
const extendNodeTypeFields = await extendNodeType(
{
type: { name: `MarkdownRemark` },
@@ -37,32 +24,30 @@ async function queryResult(
}
)
- const markdownRemarkFields = {
- ...inferredFields,
- ...extendNodeTypeFields,
- }
-
- const schema = new GraphQLSchema({
- query: new GraphQLObjectType({
- name: `RootQueryType`,
- fields: () => {
- return {
- listNode: {
- name: `LISTNODE`,
- type: new GraphQLList(
- new GraphQLObjectType({
- name: `MarkdownRemark`,
- fields: markdownRemarkFields,
- })
- ),
- resolve() {
- return nodes
- },
- },
- }
- },
- }),
+ const {
+ createSchemaComposer,
+ } = require(`../../../gatsby/src/schema/schema-composer`)
+
+ const {
+ addInferredFields,
+ } = require(`../../../gatsby/src/schema/infer/add-inferred-fields`)
+ const {
+ getExampleValue,
+ } = require(`../../../gatsby/src/schema/infer/example-value`)
+
+ const typeName = `MarkdownRemark`
+ const sc = createSchemaComposer()
+ const tc = sc.createTC(typeName)
+ addInferredFields({
+ schemaComposer: sc,
+ typeComposer: tc,
+ exampleValue: getExampleValue({ nodes, typeName }),
+ })
+ tc.addFields(extendNodeTypeFields)
+ sc.Query.addFields({
+ listNode: { type: [tc], resolve: () => nodes },
})
+ const schema = sc.buildSchema()
const result = await graphql(
schema,
@@ -97,14 +82,10 @@ const bootstrapTest = (
it(label, async done => {
node.content = content
const createNode = markdownNode => {
- queryResult(
- [markdownNode],
- query,
- {
- types: [{ name: `MarkdownRemark` }],
- },
- { additionalParameters, pluginOptions }
- ).then(result => {
+ queryResult([markdownNode], query, {
+ additionalParameters,
+ pluginOptions,
+ }).then(result => {
try {
test(result.data.listNode[0])
done()
diff --git a/packages/gatsby-transformer-remark/src/__tests__/on-node-create.js b/packages/gatsby-transformer-remark/src/__tests__/on-node-create.js
index 62564aedcfa9e..873597270c283 100644
--- a/packages/gatsby-transformer-remark/src/__tests__/on-node-create.js
+++ b/packages/gatsby-transformer-remark/src/__tests__/on-node-create.js
@@ -1,17 +1,7 @@
const Promise = require(`bluebird`)
const _ = require(`lodash`)
-
const onCreateNode = require(`../on-node-create`)
-
-const {
- graphql,
- GraphQLObjectType,
- GraphQLList,
- GraphQLSchema,
-} = require(`gatsby/graphql`)
-const {
- inferObjectStructureFromNodes,
-} = require(`../../../gatsby/src/schema/infer-graphql-type`)
+const { graphql } = require(`gatsby/graphql`)
let node
let actions
@@ -124,31 +114,29 @@ yadda yadda
describe(`process graphql correctly`, () => {
// given a set of nodes and a query, return the result of the query
- async function queryResult(nodes, fragment, { types = [] } = {}) {
- const schema = new GraphQLSchema({
- query: new GraphQLObjectType({
- name: `RootQueryType`,
- fields: () => {
- return {
- listNode: {
- name: `LISTNODE`,
- type: new GraphQLList(
- new GraphQLObjectType({
- name: `MarkdownRemark`,
- fields: inferObjectStructureFromNodes({
- nodes,
- types: [...types],
- }),
- })
- ),
- resolve() {
- return nodes
- },
- },
- }
- },
- }),
+ async function queryResult(nodes, fragment) {
+ const {
+ createSchemaComposer,
+ } = require(`../../../gatsby/src/schema/schema-composer`)
+ const {
+ addInferredFields,
+ } = require(`../../../gatsby/src/schema/infer/add-inferred-fields`)
+ const {
+ getExampleValue,
+ } = require(`../../../gatsby/src/schema/infer/example-value`)
+
+ const sc = createSchemaComposer()
+ const typeName = `MarkdownRemark`
+ const tc = sc.createTC(typeName)
+ addInferredFields({
+ schemaComposer: sc,
+ typeComposer: tc,
+ exampleValue: getExampleValue({ nodes, typeName }),
+ })
+ sc.Query.addFields({
+ listNode: { type: [tc], resolve: () => nodes },
})
+ const schema = sc.buildSchema()
const result = await graphql(
schema,
@@ -191,8 +179,7 @@ Sed bibendum sem iaculis, pellentesque leo sed, imperdiet ante. Sed consequat ma
frontmatter {
title
}
- `,
- { types: [{ name: `MarkdownRemark` }] }
+ `
).then(result => {
try {
createdNode = result.data.listNode[0]
@@ -252,8 +239,7 @@ Sed bibendum sem iaculis, pellentesque leo sed, imperdiet ante. Sed consequat ma
frontmatter {
title
}
- `,
- { types: [{ name: `MarkdownRemark` }] }
+ `
).then(result => {
try {
createdNode = result.data.listNode[0]
diff --git a/packages/gatsby/graphql.js b/packages/gatsby/graphql.js
index b8878535d40d8..40b2d5bde0223 100644
--- a/packages/gatsby/graphql.js
+++ b/packages/gatsby/graphql.js
@@ -1,6 +1,6 @@
"use strict"
const graphql = require(`graphql`)
-const GraphQLJSON = require(`graphql-type-json`)
+const { GraphQLJSON } = require(`graphql-compose`)
module.exports = Object.assign({}, graphql, { GraphQLJSON })
diff --git a/packages/gatsby/package.json b/packages/gatsby/package.json
index cf70744f0d91c..106641cda4f79 100644
--- a/packages/gatsby/package.json
+++ b/packages/gatsby/package.json
@@ -70,11 +70,10 @@
"gatsby-react-router-scroll": "^2.0.6",
"glob": "^7.1.1",
"graphql": "^14.1.1",
+ "graphql-compose": "^5.11.0",
"graphql-playground-middleware-express": "^1.7.10",
"graphql-relay": "^0.6.0",
- "graphql-skip-limit": "^2.0.6",
"graphql-tools": "^3.0.4",
- "graphql-type-json": "^0.2.1",
"hash-mod": "^0.0.5",
"invariant": "^2.2.4",
"is-relative": "^1.0.0",
diff --git a/packages/gatsby/src/bootstrap/index.js b/packages/gatsby/src/bootstrap/index.js
index f29a1b63beb1d..ba3bd0b7f6ec5 100644
--- a/packages/gatsby/src/bootstrap/index.js
+++ b/packages/gatsby/src/bootstrap/index.js
@@ -21,6 +21,7 @@ const getConfigFile = require(`./get-config-file`)
const tracer = require(`opentracing`).globalTracer()
const preferDefault = require(`./prefer-default`)
const nodeTracking = require(`../db/node-tracking`)
+const withResolverContext = require(`../schema/context`)
require(`../db`).startAutosave()
// Show stack trace on unhandled promises.
@@ -387,7 +388,13 @@ module.exports = async (args: BootstrapArgs) => {
const graphqlRunner = (query, context = {}) => {
const schema = store.getState().schema
- return graphql(schema, query, context, context, context)
+ return graphql(
+ schema,
+ query,
+ context,
+ withResolverContext(context, schema),
+ context
+ )
}
// Collect pages.
@@ -431,11 +438,9 @@ module.exports = async (args: BootstrapArgs) => {
parentSpan: bootstrapSpan,
})
activity.start()
- await require(`../schema`).build({ parentSpan: activity.span })
+ await require(`../schema`).rebuildWithSitePage({ parentSpan: activity.span })
activity.end()
- require(`../schema/type-conflict-reporter`).printConflicts()
-
// Extract queries
activity = report.activityTimer(`extract queries from components`, {
parentSpan: bootstrapSpan,
diff --git a/packages/gatsby/src/commands/develop.js b/packages/gatsby/src/commands/develop.js
index 24087560d5325..9b9e5c9b30a36 100644
--- a/packages/gatsby/src/commands/develop.js
+++ b/packages/gatsby/src/commands/develop.js
@@ -23,6 +23,7 @@ const launchEditor = require(`react-dev-utils/launchEditor`)
const formatWebpackMessages = require(`react-dev-utils/formatWebpackMessages`)
const chalk = require(`chalk`)
const address = require(`address`)
+const withResolverContext = require(`../schema/context`)
const sourceNodes = require(`../utils/source-nodes`)
const websocketManager = require(`../utils/websocket-manager`)
const getSslCert = require(`../utils/get-ssl-cert`)
@@ -105,9 +106,14 @@ async function startServer(program) {
}
app.use(
`/___graphql`,
- graphqlHTTP({
- schema: store.getState().schema,
- graphiql: process.env.GATSBY_GRAPHQL_IDE === `playground` ? false : true,
+ graphqlHTTP(() => {
+ const schema = store.getState().schema
+ return {
+ schema,
+ graphiql:
+ process.env.GATSBY_GRAPHQL_IDE === `playground` ? false : true,
+ context: withResolverContext({}, schema),
+ }
})
)
diff --git a/packages/gatsby/src/db/__tests__/node-tracking-test.js b/packages/gatsby/src/db/__tests__/node-tracking-test.js
index 491a346c95ed9..d646932bfd502 100644
--- a/packages/gatsby/src/db/__tests__/node-tracking-test.js
+++ b/packages/gatsby/src/db/__tests__/node-tracking-test.js
@@ -4,7 +4,6 @@ const {
} = require(`../../redux/actions`)
const { getNode } = require(`../../db/nodes`)
const { findRootNodeAncestor, trackDbNodes } = require(`../node-tracking`)
-const nodeTypes = require(`../../schema/build-node-types`)
const { run: runQuery } = require(`../nodes-query`)
require(`./fixtures/ensure-loki`)()
@@ -18,7 +17,7 @@ function makeNode() {
},
inlineArray: [1, 2, 3],
internal: {
- type: `TestNode`,
+ type: `Test`,
contentDigest: `digest1`,
owner: `test`,
},
@@ -43,7 +42,7 @@ describe(`track root nodes`, () => {
},
inlineArray: [1, 2, 3],
internal: {
- type: `TestNode`,
+ type: `Test`,
contentDigest: `digest2`,
},
},
@@ -89,7 +88,21 @@ describe(`track root nodes`, () => {
let type
beforeAll(async () => {
- type = (await nodeTypes.buildAll({})).testNode.nodeObjectType
+ const { createSchemaComposer } = require(`../../schema/schema-composer`)
+ const {
+ addInferredFields,
+ } = require(`../../schema/infer/add-inferred-fields`)
+ const { getExampleValue } = require(`../../schema/infer/example-value`)
+
+ const sc = createSchemaComposer()
+ const typeName = `Test`
+ const tc = sc.createTC(typeName)
+ addInferredFields({
+ schemaComposer: sc,
+ typeComposer: tc,
+ exampleValue: getExampleValue({ nodes: [makeNode()], typeName }),
+ })
+ type = tc.getType()
})
it(`Tracks objects when running query without filter`, async () => {
diff --git a/packages/gatsby/src/db/loki/__tests__/nodes-query-test.js b/packages/gatsby/src/db/loki/__tests__/nodes-query-test.js
index fbde8ade5970e..aae1f42b82907 100644
--- a/packages/gatsby/src/db/loki/__tests__/nodes-query-test.js
+++ b/packages/gatsby/src/db/loki/__tests__/nodes-query-test.js
@@ -1,6 +1,6 @@
if (process.env.GATSBY_DB_NODES === `loki`) {
const _ = require(`lodash`)
- const nodeTypes = require(`../../../schema/build-node-types`)
+ const { GraphQLObjectType } = require(`graphql`)
const { store } = require(`../../../redux`)
const runQuery = require(`../nodes-query`)
const { getNodeTypeCollection } = require(`../nodes`)
@@ -21,11 +21,11 @@ if (process.env.GATSBY_DB_NODES === `loki`) {
for (const node of nodes) {
store.dispatch({ type: `CREATE_NODE`, payload: node })
}
- const gqlType = nodeTypes.buildNodeObjectType({
- typeName: `Test`,
- nodes,
- pluginFields: [],
- processedTypes: {},
+ const gqlType = new GraphQLObjectType({
+ name: `Test`,
+ fields: {
+ foo: { type: `String` },
+ },
})
const queryArgs = { filter: { foo: { eq: `bar` } } }
const args = { gqlType, queryArgs }
diff --git a/packages/gatsby/src/db/loki/nodes-query.js b/packages/gatsby/src/db/loki/nodes-query.js
index 9922bede16332..1f9f22a53064e 100644
--- a/packages/gatsby/src/db/loki/nodes-query.js
+++ b/packages/gatsby/src/db/loki/nodes-query.js
@@ -248,8 +248,8 @@ function toSortFields(sortArgs) {
const { fields, order } = sortArgs
const lokiSortFields = []
for (let i = 0; i < fields.length; i++) {
- const dottedField = fields[i].replace(/___/g, `.`)
- const isDesc = order[i] === `desc`
+ const dottedField = fields[i]
+ const isDesc = order[i] && order[i].toLowerCase() === `desc`
lokiSortFields.push([dottedField, isDesc])
}
return lokiSortFields
@@ -291,8 +291,11 @@ function ensureFieldIndexes(coll, lokiArgs) {
* @returns {promise} A promise that will eventually be resolved with
* a collection of matching objects (even if `firstOnly` is true)
*/
-async function runQuery({ gqlType, queryArgs, context = {}, firstOnly }) {
- const lokiArgs = convertArgs(queryArgs, gqlType)
+async function runQuery({ gqlType, queryArgs, firstOnly }) {
+ // Clone args as for some reason graphql-js removes the constructor
+ // from nested objects which breaks a check in sift.js.
+ const gqlArgs = JSON.parse(JSON.stringify(queryArgs))
+ const lokiArgs = convertArgs(gqlArgs, gqlType)
const coll = getNodeTypeCollection(gqlType.name)
ensureFieldIndexes(coll, lokiArgs)
let chain = coll.chain().find(lokiArgs, firstOnly)
diff --git a/packages/gatsby/src/db/loki/nodes.js b/packages/gatsby/src/db/loki/nodes.js
index 36071a9c7d764..802db08fe8ab9 100644
--- a/packages/gatsby/src/db/loki/nodes.js
+++ b/packages/gatsby/src/db/loki/nodes.js
@@ -141,8 +141,8 @@ function getNodesByType(typeName) {
* `getNodesByType` should be used instead. Or at least where possible
*/
function getNodes() {
- const nodeTypes = getDb().getCollection(colls.nodeTypes.name).data
- return _.flatMap(nodeTypes, nodeType => getNodesByType(nodeType.type))
+ const nodeTypes = getTypes()
+ return _.flatMap(nodeTypes, nodeType => getNodesByType(nodeType))
}
/**
@@ -335,9 +335,9 @@ module.exports = {
getNodes,
getNode,
getNodesByType,
+ getTypes,
hasNodeChanged,
getNodeAndSavePathDependency,
- getTypes,
createNode,
updateNode,
diff --git a/packages/gatsby/src/db/node-tracking.js b/packages/gatsby/src/db/node-tracking.js
index fa0e5587facb5..b344a6266136c 100644
--- a/packages/gatsby/src/db/node-tracking.js
+++ b/packages/gatsby/src/db/node-tracking.js
@@ -1,5 +1,4 @@
const _ = require(`lodash`)
-const { getNode, getNodes } = require(`./nodes`)
/**
* Map containing links between inline objects or arrays
@@ -50,6 +49,8 @@ exports.trackInlineObjectsInRootNode = trackInlineObjectsInRootNode
* or first node that meet predicate conditions if predicate is specified
*/
const findRootNodeAncestor = (obj, predicate = null) => {
+ const { getNode } = require(`./nodes`)
+
// Find the root node.
let rootNode = obj
let whileCount = 0
@@ -79,6 +80,7 @@ const findRootNodeAncestor = (obj, predicate = null) => {
}
function trackDbNodes() {
+ const { getNodes } = require(`./nodes`)
_.each(getNodes(), node => {
trackInlineObjectsInRootNode(node)
})
diff --git a/packages/gatsby/src/db/nodes-query.js b/packages/gatsby/src/db/nodes-query.js
index 09273499d9ba4..c933c33f7d0bb 100644
--- a/packages/gatsby/src/db/nodes-query.js
+++ b/packages/gatsby/src/db/nodes-query.js
@@ -1,12 +1,52 @@
-const backend = process.env.GATSBY_DB_NODES || `redux`
+const _ = require(`lodash`)
+const { getNamedType } = require(`graphql`)
+
const lokiRunQuery = require(`./loki/nodes-query`)
const siftRunQuery = require(`../redux/run-sift`)
-const lazyFields = require(`../schema/lazy-fields`)
+
+// FIXME: This is duplicate code (`extractFieldsToSift`)
+const dropQueryOperators = filter =>
+ Object.keys(filter).reduce((acc, key) => {
+ let value = filter[key]
+ let k = Object.keys(value)[0]
+ let v = value[k]
+ if (_.isPlainObject(value) && _.isPlainObject(v)) {
+ acc[key] =
+ k === `elemMatch` ? dropQueryOperators(v) : dropQueryOperators(value)
+ } else {
+ acc[key] = true
+ }
+ return acc
+ }, {})
+
+const hasFieldResolvers = (type, filterFields) => {
+ const fields = type.getFields()
+ return Object.keys(filterFields).some(fieldName => {
+ const filterValue = filterFields[fieldName]
+ const field = fields[fieldName]
+ return (
+ Boolean(field.resolve) ||
+ (filterValue !== true &&
+ hasFieldResolvers(getNamedType(field.type), filterValue))
+ )
+ })
+}
function chooseQueryEngine(args) {
+ const { backend } = require(`./nodes`)
+
const { queryArgs, gqlType } = args
+ // TODO: Resolve nodes on sort fields
+ // TODO: Need to get group and distinct `field` arg from projection
const { filter } = queryArgs
- if (backend === `loki` && !lazyFields.contains(filter, gqlType)) {
+ const fields = filter ? dropQueryOperators(filter) : {}
+
+ // NOTE: `hasFieldResolvers` is also true for Date fields
+ if (
+ backend === `loki` &&
+ !args.nodes &&
+ !hasFieldResolvers(gqlType, fields)
+ ) {
return lokiRunQuery
} else {
return siftRunQuery
@@ -16,15 +56,15 @@ function chooseQueryEngine(args) {
/**
* Runs the query over all nodes of type. It must first select the
* appropriate query engine. Sift, or Loki. Sift is used by default,
- * or if the query includes "lazy fields", those that need to be
- * resolved before being queried. These could be either plugin fields,
- * i.e those declared by plugins during the
- * `setFieldsOnGraphQLNodeType` API, or they could be linked
- * fields. See `../redux/run-sift.js` for more.
+ * or if the query includes fields with custom resolver functions,
+ * those that need to be resolved before being queried.
+ * These could be either plugin fields, i.e those declared by plugins during
+ * the `setFieldsOnGraphQLNodeType` API, or they could be linked fields.
+ * See `../redux/run-sift.js` for more.
*
- * If the query does *not* include lazy fields, and environment
- * variable `GATSBY_DB_NODES` = `loki` then we can perform a much
- * faster pure data query using loki. See `loki/nodes-query.js` for
+ * If the query does *not* include fields with custom resolver functions,
+ * and environment variable `GATSBY_DB_NODES` = `loki` then we can perform
+ * a much faster pure data query using loki. See `loki/nodes-query.js` for
* more.
*
* @param {Object} args. Object with:
diff --git a/packages/gatsby/src/db/nodes.js b/packages/gatsby/src/db/nodes.js
index 281c3049597c3..df1f80470526f 100644
--- a/packages/gatsby/src/db/nodes.js
+++ b/packages/gatsby/src/db/nodes.js
@@ -1,8 +1,23 @@
+/* @flow */
const _ = require(`lodash`)
const { store } = require(`../redux`)
+const { run: runQuery } = require(`./nodes-query`)
+const { findRootNodeAncestor } = require(`../db/node-tracking`)
+
+interface NodeStore {
+ getNodes: () => Array;
+ getNode: (id: string) => any | undefined;
+ getNodesByType: (type: string) => Array;
+ getTypes: () => Array;
+ hasNodeChanged: (id: string, digest: string) => boolean;
+ getNodeAndSavePathDependency: (id: string, path: string) => any | undefined;
+ // XXX(freiksenet): types
+ runQuery: (...args: any) => any | undefined;
+ findRootNodeAncestor: (...args: any) => any | undefined;
+}
const backend = process.env.GATSBY_DB_NODES || `redux`
-let nodesDb
+let nodesDb: NodeStore
switch (backend) {
case `redux`:
nodesDb = require(`../redux/nodes`)
@@ -16,7 +31,7 @@ switch (backend) {
)
}
-module.exports = { ...nodesDb }
+module.exports = { ...nodesDb, runQuery, findRootNodeAncestor }
module.exports.backend = backend
/**
diff --git a/packages/gatsby/src/internal-plugins/query-runner/query-runner.js b/packages/gatsby/src/internal-plugins/query-runner/query-runner.js
index 1e3197efc43f4..298af3f67a39a 100644
--- a/packages/gatsby/src/internal-plugins/query-runner/query-runner.js
+++ b/packages/gatsby/src/internal-plugins/query-runner/query-runner.js
@@ -7,6 +7,7 @@ const websocketManager = require(`../../utils/websocket-manager`)
const path = require(`path`)
const { store } = require(`../../redux`)
+const withResolverContext = require(`../../schema/context`)
const { generatePathChunkName } = require(`../../utils/js-chunk-names`)
const { formatErrorDetails } = require(`./utils`)
const mod = require(`hash-mod`)(999)
@@ -28,7 +29,13 @@ module.exports = async (queryJob: QueryJob, component: Any) => {
const { schema, program } = store.getState()
const graphql = (query, context) =>
- graphqlFunction(schema, query, context, context, context)
+ graphqlFunction(
+ schema,
+ query,
+ context,
+ withResolverContext(context, schema),
+ context
+ )
// Run query
let result
diff --git a/packages/gatsby/src/redux/__tests__/redirects.js b/packages/gatsby/src/redux/__tests__/redirects.js
index e5a9707b3f633..35c982055328d 100644
--- a/packages/gatsby/src/redux/__tests__/redirects.js
+++ b/packages/gatsby/src/redux/__tests__/redirects.js
@@ -7,6 +7,9 @@ jest.mock(`../index`, () => {
getState: jest.fn(),
},
dispath: () => {},
+ emitter: {
+ on: jest.fn(),
+ },
}
})
diff --git a/packages/gatsby/src/redux/actions.js b/packages/gatsby/src/redux/actions.js
index 618e5520dec93..4a80c16d6c4f7 100644
--- a/packages/gatsby/src/redux/actions.js
+++ b/packages/gatsby/src/redux/actions.js
@@ -1179,6 +1179,111 @@ actions.addThirdPartySchema = (
}
}
+import type GatsbyGraphQLType from "../schema/types/type-builders"
+/**
+ * Add type definitions to the GraphQL schema.
+ *
+ * @param {string | GraphQLOutputType | GatsbyGraphQLType | string[] | GraphQLOutputType[] | GatsbyGraphQLType[]} types Type definitions
+ *
+ * Type definitions can be provided either as
+ * [`graphql-js` types](https://graphql.org/graphql-js/), in
+ * [GraphQL schema definition language (SDL)](https://graphql.org/learn/)
+ * or using Gatsby Type Builders available on the `schema` API argument.
+ *
+ * Things to note:
+ * * needs to be called *before* schema generation. It is recommended to use
+ * `createTypes` in the `sourceNodes` API.
+ * * type definitions targeting node types, i.e. `MarkdownRemark` and others
+ * added in `sourceNodes` or `onCreateNode` APIs, need to implement the
+ * `Node` interface. Interface fields will be added automatically, but it
+ * is mandatory to label those types with `implements Node`.
+ * * by default, explicit type definitions from `createTypes` will be merged
+ * with inferred field types, and default field resolvers for `Date` (which
+ * adds formatting options) and `File` (which resolves the field value as
+ * a `relativePath` foreign-key field) are added. This behavior can be
+ * customised with `@infer` and `@dontInfer` directives, and their
+ * `noDefaultResolvers` argument.
+ *
+ * @example
+ * exports.sourceNodes = ({ actions }) => {
+ * const { createTypes } = actions
+ * const typeDefs = `
+ * """
+ * Markdown Node
+ * """
+ * type MarkdownRemark implements Node {
+ * frontmatter: Frontmatter!
+ * }
+ *
+ * """
+ * Markdown Frontmatter
+ * """
+ * type Frontmatter {
+ * title: String!
+ * author: AuthorJson!
+ * date: Date!
+ * published: Boolean!
+ * tags: [String!]!
+ * }
+ *
+ * """
+ * Author information
+ * """
+ * # Does not include automatically inferred fields
+ * type AuthorJson implements Node @dontInfer(noFieldResolvers: true) {
+ * name: String!
+ * birthday: Date! # no default resolvers for Date formatting added
+ * }
+ * `
+ * createTypes(typeDefs)
+ * }
+ *
+ * // using Gatsby Type Builder API
+ * exports.sourceNodes = ({ actions, schema }) => {
+ * const { createTypes } = actions
+ * const typeDefs = [
+ * schema.buildObjectType({
+ * name: 'MarkdownRemark',
+ * fields: {
+ * frontmatter: 'Frontmatter!'
+ * },
+ * }),
+ * schema.buildObjectType({
+ * name: 'Frontmatter',
+ * fields: {
+ * title: {
+ * type: 'String!',
+ * resolve(parent) {
+ * return parent.title || '(Untitled)'
+ * }
+ * },
+ * author: 'AuthorJson!',
+ * date: 'Date!',
+ * published: 'Boolean!',
+ * tags: '[String!]!',
+ * }
+ * })
+ * ]
+ * createTypes(typeDefs)
+ * }
+ */
+actions.createTypes = (
+ types:
+ | string
+ | GraphQLOutputType
+ | GatsbyGraphQLType
+ | Array,
+ plugin: Plugin,
+ traceId?: string
+) => {
+ return {
+ type: `CREATE_TYPES`,
+ plugin,
+ traceId,
+ payload: types,
+ }
+}
+
/**
* All action creators wrapped with a dispatch.
*/
diff --git a/packages/gatsby/src/redux/nodes.js b/packages/gatsby/src/redux/nodes.js
index 924a322ad69fd..e53da404087e8 100644
--- a/packages/gatsby/src/redux/nodes.js
+++ b/packages/gatsby/src/redux/nodes.js
@@ -1,3 +1,5 @@
+/* @flow */
+
const { store } = require(`./index`)
/**
@@ -43,7 +45,7 @@ const getNodesByType = type => {
exports.getNodesByType = getNodesByType
/**
- * Get all types from redux store.
+ * Get all type names from redux store.
*
* @returns {Array}
*/
diff --git a/packages/gatsby/src/redux/prepare-nodes.js b/packages/gatsby/src/redux/prepare-nodes.js
new file mode 100644
index 0000000000000..81451c2246958
--- /dev/null
+++ b/packages/gatsby/src/redux/prepare-nodes.js
@@ -0,0 +1,129 @@
+const _ = require(`lodash`)
+const { trackInlineObjectsInRootNode } = require(`../db/node-tracking`)
+const { store } = require(`../redux`)
+const { getNullableType, getNamedType } = require(`graphql`)
+const withResolverContext = require(`../schema/context`)
+
+const enhancedNodeCache = new Map()
+const enhancedNodePromiseCache = new Map()
+const enhancedNodeCacheId = ({ node, args }) =>
+ node && node.internal && node.internal.contentDigest
+ ? JSON.stringify({
+ nodeid: node.id,
+ digest: node.internal.contentDigest,
+ ...args,
+ })
+ : null
+
+/////////////////////////////////////////////////////////////////////
+// Resolve nodes
+/////////////////////////////////////////////////////////////////////
+
+function awaitSiftField(fields, node, k) {
+ const field = fields[k]
+ if (field.resolve) {
+ const { schema } = store.getState()
+ return field.resolve(node, {}, withResolverContext({}, schema), {
+ fieldName: k,
+ schema,
+ returnType: field.type,
+ })
+ } else if (node[k] !== undefined) {
+ return node[k]
+ }
+
+ return undefined
+}
+
+// Resolves every field used in the node.
+function resolveRecursive(node, siftFieldsObj, gqFields) {
+ return Promise.all(
+ _.keys(siftFieldsObj).map(k =>
+ Promise.resolve(awaitSiftField(gqFields, node, k))
+ .then(v => {
+ const innerSift = siftFieldsObj[k]
+ const innerGqConfig = gqFields[k]
+
+ const innerType = getNullableType(innerGqConfig.type)
+ const innerListType = getNamedType(innerType)
+ if (_.isObject(innerSift) && v != null && innerType) {
+ if (_.isFunction(innerType.getFields)) {
+ // this is single object
+ return resolveRecursive(v, innerSift, innerType.getFields())
+ } else if (_.isArray(v) && _.isFunction(innerListType.getFields)) {
+ // this is array
+ return Promise.all(
+ v.map(item =>
+ resolveRecursive(item, innerSift, innerListType.getFields())
+ )
+ )
+ }
+ }
+
+ return v
+ })
+ .then(v => [k, v])
+ )
+ ).then(resolvedFields => {
+ const myNode = {
+ ...node,
+ }
+ resolvedFields.forEach(([k, v]) => (myNode[k] = v))
+ return myNode
+ })
+}
+
+function resolveNodes(nodes, typeName, firstOnly, fieldsToSift, gqlFields) {
+ const { resolvedNodesCache } = store.getState()
+ const nodesCacheKey = JSON.stringify({
+ // typeName + count being the same is a pretty good
+ // indication that the nodes are the same.
+ typeName,
+ firstOnly,
+ nodesLength: nodes.length,
+ ...fieldsToSift,
+ })
+ if (resolvedNodesCache.has(nodesCacheKey)) {
+ return Promise.resolve(resolvedNodesCache.get(nodesCacheKey))
+ } else {
+ return Promise.all(
+ nodes.map(node => {
+ const cacheKey = enhancedNodeCacheId({
+ node,
+ args: fieldsToSift,
+ })
+ if (cacheKey && enhancedNodeCache.has(cacheKey)) {
+ return Promise.resolve(enhancedNodeCache.get(cacheKey))
+ } else if (cacheKey && enhancedNodePromiseCache.has(cacheKey)) {
+ return enhancedNodePromiseCache.get(cacheKey)
+ }
+
+ const enhancedNodeGenerationPromise = new Promise(resolve => {
+ resolveRecursive(node, fieldsToSift, gqlFields).then(resolvedNode => {
+ trackInlineObjectsInRootNode(resolvedNode)
+ if (cacheKey) {
+ enhancedNodeCache.set(cacheKey, resolvedNode)
+ }
+ resolve(resolvedNode)
+ })
+ })
+ enhancedNodePromiseCache.set(cacheKey, enhancedNodeGenerationPromise)
+ return enhancedNodeGenerationPromise
+ })
+ ).then(resolvedNodes => {
+ store.dispatch({
+ type: `SET_RESOLVED_NODES`,
+ payload: {
+ key: nodesCacheKey,
+ nodes: resolvedNodes,
+ },
+ })
+ return resolvedNodes
+ })
+ }
+}
+
+module.exports = {
+ resolveNodes,
+ resolveRecursive,
+}
diff --git a/packages/gatsby/src/redux/reducers/index.js b/packages/gatsby/src/redux/reducers/index.js
index cef9e829332d0..3b2e9dab8d5d6 100644
--- a/packages/gatsby/src/redux/reducers/index.js
+++ b/packages/gatsby/src/redux/reducers/index.js
@@ -42,6 +42,6 @@ module.exports = {
redirects: require(`./redirects`),
babelrc: require(`./babelrc`),
jsonDataPaths: require(`./json-data-paths`),
- thirdPartySchemas: require(`./third-party-schemas`),
+ schemaCustomization: require(`./schema-customization`),
themes: require(`./themes`),
}
diff --git a/packages/gatsby/src/redux/reducers/schema-composer.js b/packages/gatsby/src/redux/reducers/schema-composer.js
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/packages/gatsby/src/redux/reducers/schema-customization.js b/packages/gatsby/src/redux/reducers/schema-customization.js
new file mode 100644
index 0000000000000..baf6929f989c8
--- /dev/null
+++ b/packages/gatsby/src/redux/reducers/schema-customization.js
@@ -0,0 +1,42 @@
+const _ = require(`lodash`)
+module.exports = (
+ state = {
+ composer: null,
+ thirdPartySchemas: [],
+ types: [],
+ },
+ action
+) => {
+ switch (action.type) {
+ case `ADD_THIRD_PARTY_SCHEMA`:
+ return {
+ ...state,
+ thirdPartySchemas: [...state.thirdPartySchemas, action.payload],
+ }
+ case `SET_SCHEMA_COMPOSER`:
+ return {
+ ...state,
+ composer: action.payload,
+ }
+ case `CREATE_TYPES`: {
+ let types
+ if (_.isArray(action.payload)) {
+ types = [...state.types, ...action.payload]
+ } else {
+ types = [...state.types, action.payload]
+ }
+ return {
+ ...state,
+ types,
+ }
+ }
+ case `DELETE_CACHE`:
+ return {
+ composer: null,
+ thirdPartySchemas: [],
+ types: [],
+ }
+ default:
+ return state
+ }
+}
diff --git a/packages/gatsby/src/redux/reducers/third-party-schemas.js b/packages/gatsby/src/redux/reducers/third-party-schemas.js
deleted file mode 100644
index da4550f19c6d8..0000000000000
--- a/packages/gatsby/src/redux/reducers/third-party-schemas.js
+++ /dev/null
@@ -1,8 +0,0 @@
-module.exports = (state = [], action) => {
- switch (action.type) {
- case `ADD_THIRD_PARTY_SCHEMA`:
- return [...state, action.payload]
- default:
- return state
- }
-}
diff --git a/packages/gatsby/src/redux/run-sift.js b/packages/gatsby/src/redux/run-sift.js
index 709f8f988d5ae..8fd492373d874 100644
--- a/packages/gatsby/src/redux/run-sift.js
+++ b/packages/gatsby/src/redux/run-sift.js
@@ -2,21 +2,7 @@
const sift = require(`sift`)
const _ = require(`lodash`)
const prepareRegex = require(`../utils/prepare-regex`)
-const Promise = require(`bluebird`)
-const { trackInlineObjectsInRootNode } = require(`../db/node-tracking`)
-const { getNode, getNodesByType } = require(`../db/nodes`)
-const { store } = require(`.`)
-
-const enhancedNodeCache = new Map()
-const enhancedNodePromiseCache = new Map()
-const enhancedNodeCacheId = ({ node, args }) =>
- node && node.internal && node.internal.contentDigest
- ? JSON.stringify({
- nodeid: node.id,
- digest: node.internal.contentDigest,
- ...args,
- })
- : null
+const { resolveNodes, resolveRecursive } = require(`./prepare-nodes`)
/////////////////////////////////////////////////////////////////////
// Parse filter
@@ -85,7 +71,7 @@ function parseFilter(filter) {
}
/////////////////////////////////////////////////////////////////////
-// Resolve nodes
+// Run Sift
/////////////////////////////////////////////////////////////////////
function isEqId(firstOnly, fieldsToSift, siftArgs) {
@@ -98,130 +84,6 @@ function isEqId(firstOnly, fieldsToSift, siftArgs) {
)
}
-function awaitSiftField(fields, node, k) {
- const field = fields[k]
- if (field.resolve) {
- return field.resolve(
- node,
- {},
- {},
- {
- fieldName: k,
- }
- )
- } else if (node[k] !== undefined) {
- return node[k]
- }
-
- return undefined
-}
-
-// Resolves every field used in the node.
-function resolveRecursive(node, siftFieldsObj, gqFields) {
- return Promise.all(
- _.keys(siftFieldsObj).map(k =>
- Promise.resolve(awaitSiftField(gqFields, node, k))
- .then(v => {
- const innerSift = siftFieldsObj[k]
- const innerGqConfig = gqFields[k]
- if (
- _.isObject(innerSift) &&
- v != null &&
- innerGqConfig &&
- innerGqConfig.type
- ) {
- if (_.isFunction(innerGqConfig.type.getFields)) {
- // this is single object
- return resolveRecursive(
- v,
- innerSift,
- innerGqConfig.type.getFields()
- )
- } else if (
- _.isArray(v) &&
- innerGqConfig.type.ofType &&
- _.isFunction(innerGqConfig.type.ofType.getFields)
- ) {
- // this is array
- return Promise.all(
- v.map(item =>
- resolveRecursive(
- item,
- innerSift,
- innerGqConfig.type.ofType.getFields()
- )
- )
- )
- }
- }
-
- return v
- })
- .then(v => [k, v])
- )
- ).then(resolvedFields => {
- const myNode = {
- ...node,
- }
- resolvedFields.forEach(([k, v]) => (myNode[k] = v))
- return myNode
- })
-}
-
-function resolveNodes(nodes, typeName, firstOnly, fieldsToSift, gqlFields) {
- const { resolvedNodesCache } = store.getState()
- const nodesCacheKey = JSON.stringify({
- // typeName + count being the same is a pretty good
- // indication that the nodes are the same.
- typeName,
- firstOnly,
- nodesLength: nodes.length,
- ...fieldsToSift,
- })
- if (resolvedNodesCache.has(nodesCacheKey)) {
- return Promise.resolve(resolvedNodesCache.get(nodesCacheKey))
- } else {
- return Promise.all(
- nodes.map(node => {
- const cacheKey = enhancedNodeCacheId({
- node,
- args: fieldsToSift,
- })
- if (cacheKey && enhancedNodeCache.has(cacheKey)) {
- return Promise.resolve(enhancedNodeCache.get(cacheKey))
- } else if (cacheKey && enhancedNodePromiseCache.has(cacheKey)) {
- return enhancedNodePromiseCache.get(cacheKey)
- }
-
- const enhancedNodeGenerationPromise = new Promise(resolve => {
- resolveRecursive(node, fieldsToSift, gqlFields).then(resolvedNode => {
- trackInlineObjectsInRootNode(resolvedNode)
- if (cacheKey) {
- enhancedNodeCache.set(cacheKey, resolvedNode)
- }
- resolve(resolvedNode)
- })
- })
- enhancedNodePromiseCache.set(cacheKey, enhancedNodeGenerationPromise)
- return enhancedNodeGenerationPromise
- })
- ).then(resolvedNodes => {
- store.dispatch({
- type: `SET_RESOLVED_NODES`,
- payload: {
- key: nodesCacheKey,
- nodes: resolvedNodes,
- },
- })
- return resolvedNodes
- })
- }
-}
-
-/////////////////////////////////////////////////////////////////////
-// Run Sift
-/////////////////////////////////////////////////////////////////////
-
function handleFirst(siftArgs, nodes) {
const index = _.isEmpty(siftArgs)
? 0
@@ -255,11 +117,10 @@ function handleMany(siftArgs, nodes, sort) {
if (sort) {
// create functions that return the item to compare on
// uses _.get so nested fields can be retrieved
- const convertedFields = sort.fields
- .map(field => field.replace(/___/g, `.`))
- .map(field => v => _.get(v, field))
+ const sortFields = sort.fields.map(field => v => _.get(v, field))
+ const sortOrder = sort.order.map(order => order.toLowerCase())
- result = _.orderBy(result, convertedFields, sort.order)
+ result = _.orderBy(result, sortFields, sortOrder)
}
return result
}
@@ -278,12 +139,16 @@ function handleMany(siftArgs, nodes, sort) {
* if `firstOnly` is true
*/
module.exports = (args: Object) => {
+ const { getNode, getNodesByType } = require(`../db/nodes`)
+
const { queryArgs, gqlType, firstOnly = false } = args
// If nodes weren't provided, then load them from the DB
const nodes = args.nodes || getNodesByType(gqlType.name)
const { siftArgs, fieldsToSift } = parseFilter(queryArgs.filter)
+ // FIXME: fieldsToSift must include `sort.fields` as well as the
+ // `field` arg on `group` and `distinct`
// If the the query for single node only has a filter for an "id"
// using "eq" operator, then we'll just grab that ID and return it.
diff --git a/packages/gatsby/src/schema/__tests__/__snapshots__/connection-input-fields-test.js.snap b/packages/gatsby/src/schema/__tests__/__snapshots__/connection-input-fields.js.snap
similarity index 100%
rename from packages/gatsby/src/schema/__tests__/__snapshots__/connection-input-fields-test.js.snap
rename to packages/gatsby/src/schema/__tests__/__snapshots__/connection-input-fields.js.snap
diff --git a/packages/gatsby/src/schema/__tests__/__snapshots__/data-tree-utils-test.js.snap b/packages/gatsby/src/schema/__tests__/__snapshots__/data-tree-utils-test.js.snap
deleted file mode 100644
index 9817db5f9662f..0000000000000
--- a/packages/gatsby/src/schema/__tests__/__snapshots__/data-tree-utils-test.js.snap
+++ /dev/null
@@ -1,85 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Gatsby data tree utils build enum values for fields from array on nodes 1`] = `
-Object {
- "anArray": Object {
- "field": "anArray",
- },
- "context___nestedObject___name": Object {
- "field": "context___nestedObject___name",
- },
- "context___nestedObject___someOtherProperty": Object {
- "field": "context___nestedObject___someOtherProperty",
- },
- "date": Object {
- "field": "date",
- },
- "frontmatter___blue": Object {
- "field": "frontmatter___blue",
- },
- "frontmatter___circle": Object {
- "field": "frontmatter___circle",
- },
- "frontmatter___date": Object {
- "field": "frontmatter___date",
- },
- "frontmatter___draft": Object {
- "field": "frontmatter___draft",
- },
- "frontmatter___title": Object {
- "field": "frontmatter___title",
- },
- "hair": Object {
- "field": "hair",
- },
- "key_with__unsupported_values": Object {
- "field": "key-with..unsupported-values",
- },
- "name": Object {
- "field": "name",
- },
- "nestedArrays": Object {
- "field": "nestedArrays",
- },
- "objectsInArray": Object {
- "field": "objectsInArray",
- },
-}
-`;
-
-exports[`Gatsby data tree utils builds field examples from an array of nodes 1`] = `
-Object {
- "anArray": Array [
- 1,
- ],
- "context": Object {
- "nestedObject": Object {
- "name": "Inner name",
- "someOtherProperty": 1,
- },
- },
- "date": "2006-07-22T22:39:53.000Z",
- "frontmatter": Object {
- "blue": 100,
- "circle": "happy",
- "date": "2006-07-22T22:39:53.000Z",
- "draft": false,
- "title": "The world of dash and adventure",
- },
- "hair": 1,
- "key-with..unsupported-values": true,
- "name": "The Mad Max",
- "nestedArrays": Array [
- Array [
- 1,
- ],
- ],
- "objectsInArray": Array [
- Object {
- "field1": true,
- "field2": 1,
- "field3": "foo",
- },
- ],
-}
-`;
diff --git a/packages/gatsby/src/schema/__tests__/__snapshots__/infer-graphql-type-test.js.snap b/packages/gatsby/src/schema/__tests__/__snapshots__/infer-graphql-type-test.js.snap
deleted file mode 100644
index a41450342d450..0000000000000
--- a/packages/gatsby/src/schema/__tests__/__snapshots__/infer-graphql-type-test.js.snap
+++ /dev/null
@@ -1,152 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`GraphQL type inferance Handles dates Infers from Date objects 1`] = `
-Object {
- "data": Object {
- "listNode": Array [
- Object {
- "dateObject": "2012-11-05T00:00:00.000Z",
- },
- Object {
- "dateObject": "2012-11-05T00:00:00.000Z",
- },
- ],
- },
-}
-`;
-
-exports[`GraphQL type inferance Handles dates Infers from array of Date objects 1`] = `
-Object {
- "data": Object {
- "listNode": Array [
- Object {
- "dateObject": Array [
- "2012-11-05T00:00:00.000Z",
- "2012-11-06T00:00:00.000Z",
- ],
- },
- Object {
- "dateObject": Array [
- "2012-11-05T00:00:00.000Z",
- ],
- },
- ],
- },
-}
-`;
-
-exports[`GraphQL type inferance Infers graphql type from array of nodes 1`] = `
-Object {
- "data": Object {
- "listNode": Array [
- Object {
- "aBoolean": true,
- "aNestedArray": Array [
- Array [
- 1,
- 2,
- 3,
- 4,
- ],
- Array [
- 5,
- 6,
- 7,
- 8,
- ],
- ],
- "anArray": Array [
- 1,
- 2,
- 3,
- 4,
- ],
- "anObjectArray": Array [
- Object {
- "aBoolean": true,
- "aNumber": 2,
- "anArray": null,
- "anotherObjectArray": null,
- },
- Object {
- "aBoolean": null,
- "aNumber": 2,
- "anArray": Array [
- 1,
- 2,
- ],
- "anotherObjectArray": null,
- },
- Object {
- "aBoolean": null,
- "aNumber": null,
- "anArray": null,
- "anotherObjectArray": Array [
- Object {
- "bar": 10,
- "baz": null,
- },
- ],
- },
- ],
- "date": "1012",
- "deepObject": Object {
- "deepObject": Object {
- "deepObject": Object {
- "level": 3,
- },
- "level": 2,
- },
- "level": 1,
- },
- "domain": "pizza.com",
- "externalUrl": "https://example.com/awesome.jpg",
- "frontmatter": Object {
- "date": "1012",
- "title": "The world of dash and adventure",
- },
- "hair": 1,
- },
- Object {
- "aBoolean": null,
- "aNestedArray": Array [
- Array [
- 1,
- 2,
- 3,
- 4,
- ],
- ],
- "anArray": Array [
- 1,
- 2,
- 5,
- 4,
- ],
- "anObjectArray": Array [
- Object {
- "aBoolean": null,
- "aNumber": null,
- "anArray": null,
- "anotherObjectArray": Array [
- Object {
- "bar": null,
- "baz": "quz",
- },
- ],
- },
- ],
- "date": "1984",
- "deepObject": null,
- "domain": null,
- "externalUrl": null,
- "frontmatter": Object {
- "date": "1984",
- "title": "The world of slash and adventure",
- },
- "hair": 2,
- },
- ],
- },
-}
-`;
diff --git a/packages/gatsby/src/schema/__tests__/__snapshots__/kitchen-sink.js.snap b/packages/gatsby/src/schema/__tests__/__snapshots__/kitchen-sink.js.snap
new file mode 100644
index 0000000000000..e16ee8e2d0b3b
--- /dev/null
+++ b/packages/gatsby/src/schema/__tests__/__snapshots__/kitchen-sink.js.snap
@@ -0,0 +1,80 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Kichen sink schema test passes kitchen sink query 1`] = `
+Object {
+ "data": Object {
+ "addResolvers": Array [
+ Object {
+ "code": "BdiU-TTFP4h",
+ "id": "1685001452849004065",
+ "likes": 33,
+ },
+ Object {
+ "code": "BdIpEzalAJx",
+ "id": "1677771511187112561",
+ "likes": 29,
+ },
+ ],
+ "filter": Object {
+ "edges": Array [
+ Object {
+ "node": Object {
+ "comment": 1,
+ "id": "1270677182602272387",
+ },
+ },
+ Object {
+ "node": Object {
+ "comment": 0,
+ "id": "1256134251849702933",
+ },
+ },
+ ],
+ },
+ "resolveFilter": Object {
+ "id": "1601601194425654597",
+ "idWithDecoration": "decoration-1601601194425654597",
+ "likes": 9,
+ },
+ "sort": Object {
+ "edges": Array [
+ Object {
+ "node": Object {
+ "_3invalidKey": null,
+ "code": "BShF_8qhtEv",
+ "comment": 0,
+ "id": "1486495736706552111",
+ "idWithDecoration": "decoration-1486495736706552111",
+ "image": Object {
+ "childImageSharp": Object {
+ "id": "f5f0e564-899f-5bbc-92de-a2325b69cb75",
+ },
+ },
+ "likes": 8,
+ "time": "05.04.2017",
+ },
+ },
+ Object {
+ "node": Object {
+ "_3invalidKey": null,
+ "code": "BY6B8z5lR1F",
+ "comment": 0,
+ "id": "1601601194425654597",
+ "idWithDecoration": "decoration-1601601194425654597",
+ "image": Object {
+ "childImageSharp": Object {
+ "id": "6ba97198-5331-53d6-a0e0-c9c063c5094e",
+ },
+ },
+ "likes": 9,
+ "time": "11.09.2017",
+ },
+ },
+ ],
+ },
+ "thirdPartyStuff": Object {
+ "text": "Hello third-party schema!",
+ },
+ },
+}
+`;
diff --git a/packages/gatsby/src/schema/__tests__/build-node-connections-test.js b/packages/gatsby/src/schema/__tests__/build-node-connections.js
similarity index 68%
rename from packages/gatsby/src/schema/__tests__/build-node-connections-test.js
rename to packages/gatsby/src/schema/__tests__/build-node-connections.js
index 8878f4652d929..762bb5a18dbd8 100644
--- a/packages/gatsby/src/schema/__tests__/build-node-connections-test.js
+++ b/packages/gatsby/src/schema/__tests__/build-node-connections.js
@@ -1,67 +1,76 @@
-const { graphql, GraphQLObjectType, GraphQLSchema } = require(`graphql`)
-const _ = require(`lodash`)
-const createPageDependency = require(`../../redux/actions/add-page-dependency`)
+const { graphql } = require(`graphql`)
+const { createSchemaComposer } = require(`../schema-composer`)
+const { buildSchema } = require(`../schema`)
+const { LocalNodeModel } = require(`../node-model`)
+const nodeStore = require(`../../db/nodes`)
+const { store } = require(`../../redux`)
+
jest.mock(`../../redux/actions/add-page-dependency`)
-const nodeTypes = require(`../build-node-types`)
-const nodeConnections = require(`../build-node-connections`)
+const createPageDependency = require(`../../redux/actions/add-page-dependency`)
+
require(`../../db/__tests__/fixtures/ensure-loki`)()
-describe(`build-node-connections`, () => {
- let schema, store, types, connections
+const makeNodes = () => [
+ {
+ id: `p1`,
+ internal: { type: `Parent` },
+ hair: `red`,
+ children: [`c1`, `c2`, `r1`],
+ },
+ {
+ id: `r1`,
+ internal: { type: `Relative` },
+ hair: `black`,
+ children: [],
+ parent: `p1`,
+ },
+ {
+ id: `c1`,
+ internal: { type: `Child` },
+ hair: `brown`,
+ children: [],
+ parent: `p1`,
+ },
+ {
+ id: `c2`,
+ internal: { type: `Child` },
+ hair: `blonde`,
+ children: [],
+ parent: `p1`,
+ },
+]
- async function runQuery(query) {
- let context = { path: `foo` }
- let { data, errors } = await graphql(schema, query, context, context)
- expect(errors).not.toBeDefined()
- return data
- }
-
- beforeEach(async () => {
- ;({ store } = require(`../../redux`))
+describe(`build-node-connections`, () => {
+ async function runQuery(query, nodes = makeNodes()) {
store.dispatch({ type: `DELETE_CACHE` })
- ;[
- {
- id: `p1`,
- internal: { type: `Parent` },
- hair: `red`,
- children: [`c1`, `c2`, `r1`],
- },
- {
- id: `r1`,
- internal: { type: `Relative` },
- hair: `black`,
- children: [],
- parent: `p1`,
- },
- {
- id: `c1`,
- internal: { type: `Child` },
- hair: `brown`,
- children: [],
- parent: `p1`,
- },
- {
- id: `c2`,
- internal: { type: `Child` },
- hair: `blonde`,
- children: [],
- parent: `p1`,
- },
- ].forEach(n => store.dispatch({ type: `CREATE_NODE`, payload: n }))
+ nodes.forEach(node =>
+ store.dispatch({ type: `CREATE_NODE`, payload: node })
+ )
- types = await nodeTypes.buildAll({})
- connections = await nodeConnections.buildAll(_.values(types))
+ const schemaComposer = createSchemaComposer()
+ const schema = await buildSchema({
+ schemaComposer,
+ nodeStore,
+ types: [],
+ thirdPartySchemas: [],
+ })
+ store.dispatch({ type: `SET_SCHEMA`, payload: schema })
- schema = new GraphQLSchema({
- query: new GraphQLObjectType({
- name: `RootQueryType`,
- fields: { ...connections, ..._.mapValues(types, `node`) },
+ let context = { path: `foo` }
+ let { data, errors } = await graphql(schema, query, undefined, {
+ ...context,
+ nodeModel: new LocalNodeModel({
+ schema,
+ nodeStore,
+ createPageDependency,
}),
})
- })
+ expect(errors).not.toBeDefined()
+ return data
+ }
- it(`should build connections`, () => {
- expect(Object.keys(connections)).toHaveLength(3)
+ afterEach(() => {
+ createPageDependency.mockClear()
})
it(`should result in a valid queryable schema`, async () => {
diff --git a/packages/gatsby/src/schema/__tests__/build-node-types-test.js b/packages/gatsby/src/schema/__tests__/build-node-types.js
similarity index 75%
rename from packages/gatsby/src/schema/__tests__/build-node-types-test.js
rename to packages/gatsby/src/schema/__tests__/build-node-types.js
index 78a56861c5461..05071b4a38cf6 100644
--- a/packages/gatsby/src/schema/__tests__/build-node-types-test.js
+++ b/packages/gatsby/src/schema/__tests__/build-node-types.js
@@ -1,28 +1,80 @@
-const {
- graphql,
- GraphQLObjectType,
- GraphQLSchema,
- GraphQLString,
-} = require(`graphql`)
-const _ = require(`lodash`)
+const { graphql, GraphQLString } = require(`graphql`)
require(`../../db/__tests__/fixtures/ensure-loki`)()
+const { createSchemaComposer } = require(`../schema-composer`)
+const { buildSchema } = require(`../schema`)
+const { LocalNodeModel } = require(`../node-model`)
+const nodeStore = require(`../../db/nodes`)
+const { store } = require(`../../redux`)
+
jest.mock(`../../utils/api-runner-node`)
const apiRunnerNode = require(`../../utils/api-runner-node`)
-const createPageDependency = require(`../../redux/actions/add-page-dependency`)
jest.mock(`../../redux/actions/add-page-dependency`)
-const nodeTypes = require(`../build-node-types`)
+const createPageDependency = require(`../../redux/actions/add-page-dependency`)
-const { typeConflictReporter } = require(`../type-conflict-reporter`)
+const { TypeConflictReporter } = require(`../infer/type-conflict-reporter`)
+const typeConflictReporter = new TypeConflictReporter()
const addConflictSpy = jest.spyOn(typeConflictReporter, `addConflict`)
+const makeNodes = () => [
+ {
+ id: `p1`,
+ internal: { type: `Parent` },
+ hair: `red`,
+ children: [`c1`, `c2`, `r1`],
+ },
+ {
+ id: `r1`,
+ internal: { type: `Relative` },
+ hair: `black`,
+ children: [],
+ parent: `p1`,
+ },
+ {
+ id: `c1`,
+ internal: { type: `Child` },
+ hair: `brown`,
+ children: [],
+ parent: `p1`,
+ pluginField: `string`,
+ },
+ {
+ id: `c2`,
+ internal: { type: `Child` },
+ hair: `blonde`,
+ children: [],
+ parent: `p1`,
+ pluginField: 5,
+ },
+]
+
describe(`build-node-types`, () => {
- let schema, store, types
+ async function runQuery(query, nodes = makeNodes()) {
+ store.dispatch({ type: `DELETE_CACHE` })
+ nodes.forEach(node =>
+ store.dispatch({ type: `CREATE_NODE`, payload: node })
+ )
+
+ const schemaComposer = createSchemaComposer()
+ const schema = await buildSchema({
+ schemaComposer,
+ nodeStore,
+ types: [],
+ typeConflictReporter,
+ thirdPartySchemas: [],
+ })
+ store.dispatch({ type: `SET_SCHEMA`, payload: schema })
- async function runQuery(query) {
let context = { path: `foo` }
- let { data, errors } = await graphql(schema, query, context, context)
+ let { data, errors } = await graphql(schema, query, undefined, {
+ ...context,
+ nodeModel: new LocalNodeModel({
+ schema,
+ nodeStore,
+ createPageDependency,
+ }),
+ })
expect(errors).not.toBeDefined()
return data
}
@@ -35,56 +87,11 @@ describe(`build-node-types`, () => {
pluginField: {
type: GraphQLString,
description: `test description`,
- resolve: parent => `pluginFieldValue`,
+ resolve: () => `pluginFieldValue`,
},
},
]
apiRunnerNode.mockImplementation(() => apiRunnerResponse)
- ;({ store } = require(`../../redux`))
- store.dispatch({ type: `DELETE_CACHE` })
- ;[
- {
- id: `p1`,
- internal: { type: `Parent` },
- hair: `red`,
- children: [`c1`, `c2`, `r1`],
- },
- {
- id: `r1`,
- internal: { type: `Relative` },
- hair: `black`,
- children: [],
- parent: `p1`,
- },
- {
- id: `c1`,
- internal: { type: `Child` },
- hair: `brown`,
- children: [],
- parent: `p1`,
- pluginField: `string`,
- },
- {
- id: `c2`,
- internal: { type: `Child` },
- hair: `blonde`,
- children: [],
- parent: `p1`,
- pluginField: 5,
- },
- ].forEach(n => store.dispatch({ type: `CREATE_NODE`, payload: n }))
-
- types = await nodeTypes.buildAll({})
- schema = new GraphQLSchema({
- query: new GraphQLObjectType({
- name: `RootQueryType`,
- fields: _.mapValues(types, `node`),
- }),
- })
- })
-
- it(`should build types`, () => {
- expect(Object.keys(types)).toHaveLength(3)
})
it(`should result in a valid queryable schema`, async () => {
diff --git a/packages/gatsby/src/schema/__tests__/build-schema.js b/packages/gatsby/src/schema/__tests__/build-schema.js
new file mode 100644
index 0000000000000..7b96d22848e96
--- /dev/null
+++ b/packages/gatsby/src/schema/__tests__/build-schema.js
@@ -0,0 +1,698 @@
+const {
+ GraphQLObjectType,
+ GraphQLNonNull,
+ GraphQLString,
+ GraphQLInterfaceType,
+ GraphQLUnionType,
+ GraphQLBoolean,
+} = require(`graphql`)
+const { SchemaComposer } = require(`graphql-compose`)
+jest.mock(`../../utils/api-runner-node`)
+const { store } = require(`../../redux`)
+const { build } = require(`..`)
+const {
+ buildObjectType,
+ buildUnionType,
+ buildInterfaceType,
+} = require(`../types/type-builders`)
+require(`../../db/__tests__/fixtures/ensure-loki`)()
+
+const nodes = require(`./fixtures/node-model`)
+
+describe(`Build schema`, () => {
+ beforeAll(() => {
+ addDefaultApiRunnerMock()
+ })
+
+ beforeEach(async () => {
+ store.dispatch({ type: `DELETE_CACHE` })
+ nodes.forEach(node =>
+ store.dispatch({ type: `CREATE_NODE`, payload: { ...node } })
+ )
+ })
+
+ afterEach(() => {
+ addDefaultApiRunnerMock()
+ })
+
+ describe(`createTypes`, () => {
+ it(`allows adding graphql-js types`, async () => {
+ createTypes(
+ new GraphQLObjectType({
+ name: `Foo`,
+ fields: {
+ text: {
+ type: GraphQLString,
+ },
+ },
+ })
+ )
+ const schema = await buildSchema()
+ const fooType = schema.getType(`Foo`)
+ expect(fooType).toBeInstanceOf(GraphQLObjectType)
+ const fields = fooType.getFields()
+ expect(fields[`text`]).toBeDefined()
+ expect(fields[`text`].type).toBe(GraphQLString)
+ })
+
+ it(`allows adding type in SDL`, async () => {
+ createTypes(`type Foo implements Node { text: String! }`)
+ const schema = await buildSchema()
+ const fooType = schema.getType(`Foo`)
+ expect(fooType).toBeInstanceOf(GraphQLObjectType)
+ expect(fooType.getInterfaces()).toEqual([schema.getType(`Node`)])
+ const fields = fooType.getFields()
+ expect(fields[`text`]).toBeDefined()
+ expect(fields[`text`].type).toBeInstanceOf(GraphQLNonNull)
+ expect(fields[`text`].type.ofType).toBe(GraphQLString)
+ })
+
+ it(`allows adding type in gatsby type def language`, async () => {
+ createTypes(
+ buildObjectType({
+ name: `Foo`,
+ fields: {
+ text: `String!`,
+ withArgs: {
+ type: `Boolean`,
+ args: {
+ what: {
+ type: `Boolean`,
+ },
+ },
+ resolve(parent, args) {
+ return Boolean(args.what)
+ },
+ },
+ },
+ interfaces: [`Node`],
+ })
+ )
+ const schema = await buildSchema()
+ const fooType = schema.getType(`Foo`)
+ expect(fooType).toBeInstanceOf(GraphQLObjectType)
+ expect(fooType.getInterfaces()).toEqual([schema.getType(`Node`)])
+ const fields = fooType.getFields()
+ expect(fields[`text`]).toBeDefined()
+ expect(fields[`text`].type).toBeInstanceOf(GraphQLNonNull)
+ expect(fields[`text`].type.ofType).toBe(GraphQLString)
+ expect(fields[`withArgs`]).toBeDefined()
+ expect(fields[`withArgs`].type).toBe(GraphQLBoolean)
+ expect(fields[`withArgs`].args[0]).toBeDefined()
+ expect(fields[`withArgs`].args[0].name).toEqual(`what`)
+ expect(fields[`withArgs`].args[0].type).toBe(GraphQLBoolean)
+ expect(fields[`withArgs`].resolve({}, { what: true })).toBe(true)
+ })
+
+ it(`allows adding array of types`, async () => {
+ createTypes([
+ new GraphQLObjectType({
+ name: `Foo`,
+ fields: {
+ text: {
+ type: GraphQLString,
+ },
+ },
+ }),
+ new GraphQLObjectType({
+ name: `Bar`,
+ fields: {
+ text: {
+ type: GraphQLString,
+ },
+ },
+ }),
+ `type Baz implements Node { text: String }`,
+ `type Author implements Node { text: String }`,
+ ])
+ const schema = await buildSchema()
+
+ ;[(`Foo`, `Bar`, `Baz`, `Author`)].forEach(typeName => {
+ const type = schema.getType(typeName)
+ expect(type).toBeInstanceOf(GraphQLObjectType)
+ const fields = type.getFields()
+ expect(fields[`text`]).toBeDefined()
+ expect(fields[`text`].type).toBe(GraphQLString)
+ })
+ })
+
+ it(`adds node interface fields`, async () => {
+ createTypes(`
+ type Foo implements Node { text: String! }
+
+ type Bar implements Node {
+ id: ID!
+ parent: Node
+ children: [Node!]!
+ internal: Internal!
+ }
+ `)
+
+ const schema = await buildSchema()
+ ;[(`Foo`, `Bar`)].forEach(typeName => {
+ const type = schema.getType(typeName)
+ expect(type).toBeInstanceOf(GraphQLObjectType)
+ expect(type.getInterfaces()).toEqual([schema.getType(`Node`)])
+ const fields = type.getFields()
+ expect(fields[`id`]).toBeDefined()
+ expect(fields[`id`].type.toString()).toEqual(`ID!`)
+ expect(fields[`parent`]).toBeDefined()
+ expect(fields[`parent`].type.toString()).toEqual(`Node`)
+ expect(fields[`children`]).toBeDefined()
+ expect(fields[`children`].type.toString()).toEqual(`[Node!]!`)
+ expect(fields[`internal`]).toBeDefined()
+ expect(fields[`internal`].type.toString()).toEqual(`Internal!`)
+ })
+ })
+
+ it(`allows adding abstract types in SDL`, async () => {
+ createTypes(`
+ interface FooBar {
+ text: String!
+ }
+
+ type Foo implements Node & FooBar {
+ text: String!
+ }
+
+ type Bar implements Node & FooBar {
+ text: String!
+ }
+
+ type Author implements Node & FooBar {
+ text: String!
+ }
+
+ union UFooBar = Foo | Bar | Author
+ `)
+
+ const schema = await buildSchema()
+
+ const interfaceType = schema.getType(`FooBar`)
+ expect(interfaceType).toBeInstanceOf(GraphQLInterfaceType)
+ const unionType = schema.getType(`UFooBar`)
+ expect(unionType).toBeInstanceOf(GraphQLUnionType)
+ ;[(`Foo`, `Bar`, `Author`)].forEach(typeName => {
+ const type = schema.getType(typeName)
+ const typeSample = { internal: { type: typeName } }
+ expect(interfaceType.resolveType(typeSample)).toBe(typeName)
+ expect(unionType.resolveType(typeSample)).toBe(typeName)
+ expect(new Set(type.getInterfaces())).toEqual(
+ new Set([schema.getType(`Node`), schema.getType(`FooBar`)])
+ )
+ })
+ })
+
+ it(`allows adding abstract types in gatsby type def language`, async () => {
+ createTypes([
+ buildInterfaceType({
+ name: `FooBar`,
+ fields: {
+ text: `String!`,
+ },
+ }),
+ buildObjectType({
+ name: `Foo`,
+ fields: {
+ text: `String!`,
+ },
+ interfaces: [`Node`, `FooBar`],
+ }),
+ buildObjectType({
+ name: `Bar`,
+ fields: {
+ text: `String!`,
+ },
+ interfaces: [`Node`, `FooBar`],
+ }),
+ buildObjectType({
+ name: `Author`,
+ fields: {
+ text: `String!`,
+ },
+ interfaces: [`Node`, `FooBar`],
+ }),
+ buildUnionType({
+ name: `UFooBar`,
+ types: [`Foo`, `Bar`, `Author`],
+ }),
+ ])
+
+ const schema = await buildSchema()
+
+ const interfaceType = schema.getType(`FooBar`)
+ expect(interfaceType).toBeInstanceOf(GraphQLInterfaceType)
+ const unionType = schema.getType(`UFooBar`)
+ expect(unionType).toBeInstanceOf(GraphQLUnionType)
+ ;[(`Foo`, `Bar`, `Author`)].forEach(typeName => {
+ const type = schema.getType(typeName)
+ const typeSample = { internal: { type: typeName } }
+ expect(interfaceType.resolveType(typeSample)).toBe(typeName)
+ expect(unionType.resolveType(typeSample)).toBe(typeName)
+ expect(new Set(type.getInterfaces())).toEqual(
+ new Set([schema.getType(`Node`), schema.getType(`FooBar`)])
+ )
+ })
+ })
+
+ it(`adds args to field`, async () => {
+ createTypes(`
+ type Author implements Node {
+ name(withHello: Boolean = false): String!
+ }
+ `)
+ const schema = await buildSchema()
+ const type = schema.getType(`Author`)
+ const fields = type.getFields()
+ const arg = fields[`name`].args.find(arg => arg.name === `withHello`)
+ expect(arg).toBeDefined()
+ expect(arg.type.toString()).toEqual(`Boolean`)
+ expect(arg.defaultValue).toEqual(false)
+ })
+
+ // TODO: Define what "handles being called multiple times mean"
+ it.todo(`handles being called multiple times`)
+
+ it(`displays error message for reserved Node interface`, () => {
+ const typeDefs = [
+ `interface Node { foo: Boolean }`,
+ `type Node { foo: Boolean }`,
+ new GraphQLInterfaceType({ name: `Node`, fields: {} }),
+ buildInterfaceType({ name: `Node`, fields: {} }),
+ ]
+ return Promise.all(
+ typeDefs.map(def => {
+ store.dispatch({ type: `DELETE_CACHE` })
+ createTypes(def)
+ return expect(buildSchema()).rejects.toThrow(
+ `The GraphQL type \`Node\` is reserved for internal use.`
+ )
+ })
+ )
+ })
+
+ it(`displays error message for reserved type names`, () => {
+ const typeDefs = [
+ [`TestSortInput`, `type TestSortInput { foo: Boolean }`],
+ [
+ `TestFilterInput`,
+ `type TestFilterInput implements Node { foo: Boolean }`,
+ ],
+ [
+ `TestSortInput`,
+ new GraphQLObjectType({ name: `TestSortInput`, fields: {} }),
+ ],
+ [
+ `TestFilterInput`,
+ buildObjectType({ name: `TestFilterInput`, fields: {} }),
+ ],
+ ]
+ return Promise.all(
+ typeDefs.map(([name, def]) => {
+ store.dispatch({ type: `DELETE_CACHE` })
+ createTypes(def)
+ return expect(buildSchema()).rejects.toThrow(
+ `GraphQL type names ending with "FilterInput" or "SortInput" are ` +
+ `reserved for internal use. Please rename \`${name}\`.`
+ )
+ })
+ )
+ })
+
+ it(`displays error message for reserved type names`, () => {
+ const typeDefs = [
+ [`JSON`, `type JSON { foo: Boolean }`],
+ [`Date`, new GraphQLObjectType({ name: `Date`, fields: {} })],
+ [`Float`, buildObjectType({ name: `Float`, fields: {} })],
+ ]
+ return Promise.all(
+ typeDefs.map(([name, def]) => {
+ store.dispatch({ type: `DELETE_CACHE` })
+ createTypes(def)
+ return expect(buildSchema()).rejects.toThrow(
+ `The GraphQL type \`${name}\` is reserved for internal use by ` +
+ `built-in scalar types.`
+ )
+ })
+ )
+ })
+ })
+
+ describe(`createResolvers`, () => {
+ it(`allows adding resolver to field`, async () => {
+ createTypes(`
+ type Author implements Node {
+ name(withHello: Boolean = false): String!
+ }
+ `)
+ createCreateResolversMock({
+ Author: {
+ name: {
+ resolve(parent, args, context, info) {
+ if (args.withHello) {
+ return `Hello ${parent.name}`
+ } else {
+ return info.originalResolver(parent, args, context, info)
+ }
+ },
+ },
+ },
+ })
+ const schema = await buildSchema()
+ const type = schema.getType(`Author`)
+ const fields = type.getFields()
+ expect(fields[`name`].resolve).toBeDefined()
+ expect(
+ fields[`name`].resolve(
+ { name: `Mikhail` },
+ { withHello: true },
+ {},
+ {
+ fieldName: `name`,
+ }
+ )
+ ).toEqual(`Hello Mikhail`)
+ expect(
+ fields[`name`].resolve(
+ { name: `Mikhail` },
+ { withHello: false },
+ {},
+ {
+ fieldName: `name`,
+ }
+ )
+ ).toEqual(`Mikhail`)
+ })
+
+ it(`allows adding args to field`, async () => {
+ createCreateResolversMock({
+ Author: {
+ name: {
+ args: {
+ withHello: {
+ type: `Boolean`,
+ defaultValue: false,
+ },
+ },
+ resolve(parent, args, context, info) {
+ if (args.withHello) {
+ return `Hello ${parent.name}`
+ } else {
+ return info.originalResolver(parent, args, context, info)
+ }
+ },
+ },
+ },
+ })
+ const schema = await buildSchema()
+ const type = schema.getType(`Author`)
+ const fields = type.getFields()
+ expect(fields[`name`].resolve).toBeDefined()
+ expect(
+ fields[`name`].resolve(
+ { name: `Mikhail` },
+ { withHello: true },
+ {},
+ {
+ fieldName: `name`,
+ }
+ )
+ ).toEqual(`Hello Mikhail`)
+ expect(
+ fields[`name`].resolve(
+ { name: `Mikhail` },
+ { withHello: false },
+ {},
+ {
+ fieldName: `name`,
+ }
+ )
+ ).toEqual(`Mikhail`)
+ })
+
+ it(`disallows overriding field type on field`, async () => {
+ createCreateResolversMock({
+ Author: {
+ name: {
+ type: `Boolean`,
+ },
+ },
+ })
+ const schema = await buildSchema()
+ const type = schema.getType(`Author`)
+ const fields = type.getFields()
+ expect(fields[`name`].type).toEqual(GraphQLString)
+ })
+
+ it(`allows overriding field type on field on third-party type`, async () => {
+ addThirdPartySchema(`
+ type ThirdPartyFoo {
+ text: String
+ }
+
+ type Query {
+ foo: ThirdPartyFoo
+ }
+ `)
+ createCreateResolversMock({
+ ThirdPartyFoo: {
+ text: {
+ type: `Boolean`,
+ },
+ },
+ })
+
+ const schema = await buildSchema()
+ const type = schema.getType(`ThirdPartyFoo`)
+ const fields = type.getFields()
+ expect(fields[`text`].type).toEqual(GraphQLBoolean)
+ })
+
+ it(`allows adding new field`, async () => {
+ createCreateResolversMock({
+ Author: {
+ newField: {
+ type: `String`,
+ },
+ },
+ })
+
+ const schema = await buildSchema()
+ const type = schema.getType(`Author`)
+ const fields = type.getFields()
+ expect(fields[`newField`]).toBeDefined()
+ expect(fields[`newField`].type).toEqual(GraphQLString)
+ })
+
+ it(`disallows adding if type does not exist`, async () => {
+ createCreateResolversMock({
+ FakeType: {
+ newField: {
+ type: `String`,
+ },
+ },
+ })
+ const schema = await buildSchema()
+ const type = schema.getType(`FakeType`)
+ expect(type).not.toBeDefined()
+ })
+
+ it(`makes original field resolver available on info`, async () => {
+ createCreateResolversMock({
+ PostFrontmatter: {
+ date: {
+ resolve(parent, args, context, info) {
+ if (parent.date.getFullYear() < 2018) {
+ return info.originalResolver(
+ {
+ ...parent,
+ date: new Date(2018, 10, 10),
+ },
+ args,
+ context,
+ info
+ )
+ } else {
+ return info.originalResolver(parent, args, context, info)
+ }
+ },
+ },
+ },
+ })
+ const schema = await buildSchema()
+ const type = schema.getType(`PostFrontmatter`)
+ const fields = type.getFields()
+ expect(
+ fields[`date`].resolve(
+ { date: new Date(2019, 10, 10) },
+ { formatString: `YYYY` },
+ {},
+ {
+ fieldName: `date`,
+ }
+ )
+ ).toEqual(`2019`)
+ expect(
+ fields[`date`].resolve(
+ { date: new Date(2010, 10, 10) },
+ { formatString: `YYYY` },
+ {},
+ {
+ fieldName: `date`,
+ }
+ )
+ ).toEqual(`2018`)
+ })
+
+ // TODO: Define what "handles being called multiple times mean"
+ it.todo(`handles being called multiple times`)
+ })
+
+ describe(`addThirdPartySchemas`, () => {
+ it(`makes third-party schema available on root Query type`, async () => {
+ addThirdPartySchema(`
+ type ThirdPartyFoo {
+ text: String
+ }
+
+ type Query {
+ foo: ThirdPartyFoo
+ foos: [ThirdPartyFoo]
+ }
+ `)
+ createCreateResolversMock({
+ ThirdPartyFoo: {
+ text: {
+ type: `Boolean`,
+ },
+ },
+ })
+
+ const schema = await buildSchema()
+ const type = schema.getType(`Query`)
+ const fields = type.getFields()
+ expect(fields[`foo`].type.toString()).toEqual(`ThirdPartyFoo`)
+ expect(fields[`foos`].type.toString()).toEqual(`[ThirdPartyFoo]`)
+ })
+
+ it(`adds third-party types to schema`, async () => {
+ addThirdPartySchema(`
+ type ThirdPartyFoo {
+ text: String
+ }
+
+ type ThirdPartyBar {
+ baz: String
+ }
+
+ union ThirdPartyUnion = ThirdPartyFoo | ThirdPartyBar
+
+ type Query {
+ union: ThirdPartyUnion
+ }
+ `)
+
+ const schema = await buildSchema()
+ ;[`ThirdPartyFoo`, `ThirdPartyBar`, `ThirdPartyUnion`].forEach(
+ typeName => {
+ const type = schema.getType(typeName)
+ expect(type).toBeDefined()
+ }
+ )
+ })
+ })
+
+ describe(`setFieldsOnGraphQLNodeType`, () => {
+ it(`allows adding fields`, async () => {
+ createSetFieldsOnNodeTypeMock(({ type: { name } }) => {
+ if (name === `Author`) {
+ return [
+ {
+ newField: {
+ type: GraphQLString,
+ },
+ },
+ ]
+ } else {
+ return []
+ }
+ })
+
+ const schema = await buildSchema()
+ const type = schema.getType(`Author`)
+ const fields = type.getFields()
+ expect(fields[`newField`]).toBeDefined()
+ expect(fields[`newField`].type).toBe(GraphQLString)
+ })
+
+ it(`allows adding nested fields`, async () => {
+ createSetFieldsOnNodeTypeMock(({ type: { name } }) => {
+ if (name === `Post`) {
+ return [
+ {
+ newField: {
+ type: GraphQLString,
+ },
+ "frontmatter.newField": {
+ type: GraphQLString,
+ },
+ },
+ ]
+ } else {
+ return []
+ }
+ })
+
+ const schema = await buildSchema()
+ const type = schema.getType(`Post`)
+ const fields = type.getFields()
+ expect(fields[`newField`]).toBeDefined()
+ expect(fields[`newField`].type).toBe(GraphQLString)
+ const frontmatterType = fields[`frontmatter`].type
+ const frontmatterFields = frontmatterType.getFields()
+ expect(frontmatterFields[`newField`]).toBeDefined()
+ expect(frontmatterFields[`newField`].type).toBe(GraphQLString)
+ })
+ })
+})
+
+const createTypes = types => {
+ store.dispatch({ type: `CREATE_TYPES`, payload: types })
+}
+
+const createCreateResolversMock = resolvers => {
+ const apiRunnerNode = require(`../../utils/api-runner-node`)
+ apiRunnerNode.mockImplementation((api, { createResolvers }) => {
+ if (api === `createResolvers`) {
+ return createResolvers(resolvers)
+ }
+ return []
+ })
+}
+
+const createSetFieldsOnNodeTypeMock = mock => {
+ const apiRunnerNode = require(`../../utils/api-runner-node`)
+ apiRunnerNode.mockImplementation((api, ...args) => {
+ if (api === `setFieldsOnGraphQLNodeType`) {
+ return mock(...args)
+ }
+ return []
+ })
+}
+
+const addDefaultApiRunnerMock = () => {
+ const apiRunnerNode = require(`../../utils/api-runner-node`)
+ apiRunnerNode.mockImplementation(() => [])
+}
+
+const buildSchema = async () => {
+ await build({})
+ return store.getState().schema
+}
+
+const addThirdPartySchema = async typeDefs => {
+ const schemaComposer = new SchemaComposer()
+ schemaComposer.addTypeDefs(typeDefs)
+ const schema = schemaComposer.buildSchema()
+ store.dispatch({ type: `ADD_THIRD_PARTY_SCHEMA`, payload: schema })
+}
diff --git a/packages/gatsby/src/schema/__tests__/connections-filter-on-linked-nodes.js b/packages/gatsby/src/schema/__tests__/connection-filter-on-linked-nodes.js
similarity index 76%
rename from packages/gatsby/src/schema/__tests__/connections-filter-on-linked-nodes.js
rename to packages/gatsby/src/schema/__tests__/connection-filter-on-linked-nodes.js
index 711eb2dabc10e..ee603bbee6319 100644
--- a/packages/gatsby/src/schema/__tests__/connections-filter-on-linked-nodes.js
+++ b/packages/gatsby/src/schema/__tests__/connection-filter-on-linked-nodes.js
@@ -1,13 +1,8 @@
-const _ = require(`lodash`)
const { graphql } = require(`graphql`)
-const nodeTypes = require(`../build-node-types`)
-const nodeConnections = require(`../build-node-connections`)
-const { buildNodesSchema } = require(`../index`)
-const { clearUnionTypes } = require(`../infer-graphql-type`)
-const { getExampleValues } = require(`../data-tree-utils`)
-const {
- inferInputObjectStructureFromNodes,
-} = require(`../infer-graphql-input-fields`)
+const { createSchemaComposer } = require(`../schema-composer`)
+const { buildSchema } = require(`../schema`)
+const { LocalNodeModel } = require(`../node-model`)
+const nodeStore = require(`../../db/nodes`)
const { store } = require(`../../redux`)
require(`../../db/__tests__/fixtures/ensure-loki`)()
@@ -32,26 +27,31 @@ function makeNodes() {
]
}
-async function queryResult(nodesData, query, { types = [] } = {}) {
- for (const node of nodesData) {
- store.dispatch({ type: `CREATE_NODE`, payload: node })
- }
- const typesGQL = await nodeTypes.buildAll({})
- const connections = nodeConnections.buildAll(_.values(typesGQL))
+async function queryResult(nodes, query) {
+ store.dispatch({ type: `DELETE_CACHE` })
+ nodes.forEach(node => store.dispatch({ type: `CREATE_NODE`, payload: node }))
- // Pull off just the graphql node from each type object.
- const nodes = _.mapValues(typesGQL, `node`)
-
- const schema = buildNodesSchema({ ...connections, ...nodes })
+ const schemaComposer = createSchemaComposer()
+ const schema = await buildSchema({
+ schemaComposer,
+ nodeStore,
+ types: [],
+ thirdPartySchemas: [],
+ })
+ store.dispatch({ type: `SET_SCHEMA`, payload: schema })
- return graphql(schema, query)
+ let context = { path: `foo` }
+ return graphql(schema, query, undefined, {
+ ...context,
+ nodeModel: new LocalNodeModel({
+ schema,
+ nodeStore,
+ createPageDependency: jest.fn(),
+ }),
+ })
}
describe(`filtering on linked nodes`, () => {
- beforeEach(() => {
- store.dispatch({ type: `DELETE_CACHE` })
- })
- clearUnionTypes()
it(`filters on linked nodes via id`, async () => {
let result = await queryResult(
makeNodes().concat([
@@ -249,45 +249,11 @@ describe(`filtering on linked nodes`, () => {
)
})
- it(`doesn't mutate node object`, async () => {
- const allTestNodes = makeNodes()
- await queryResult(
- allTestNodes.concat([
- {
- id: `1`,
- internal: { type: `Test` },
- children: [],
- test: [
- {
- linked___NODE: `linked_A`,
- },
- ],
- },
- ]),
- `
- {
- allTest {
- edges { node { hair } }
- }
- }
- `
- )
- const originalTestNode = allTestNodes.find(
- node => node.internal.type === `Linked_A`
- )
- delete originalTestNode.children
-
- expect(getExampleValues({ typeName: `Linked_A` })).toEqual(originalTestNode)
+ it.skip(`doesn't mutate node object`, async () => {
+ // We now infer the InputObjectType from the ObjectType, not from exampleValue
})
- it(`skips fields with missing nodes`, async () => {
- const fields = inferInputObjectStructureFromNodes({
- nodes: [],
- exampleValue: {
- movie___NODE: `foobar`,
- },
- }).inferredFields
-
- expect(Object.keys(fields)).toHaveLength(0)
+ it.skip(`skips fields with missing nodes`, async () => {
+ // We now infer the InputObjectType from the ObjectType, not from exampleValue
})
})
diff --git a/packages/gatsby/src/schema/__tests__/connection-input-fields-test.js b/packages/gatsby/src/schema/__tests__/connection-input-fields.js
similarity index 89%
rename from packages/gatsby/src/schema/__tests__/connection-input-fields-test.js
rename to packages/gatsby/src/schema/__tests__/connection-input-fields.js
index 29a458c3f7321..d693053644ad3 100644
--- a/packages/gatsby/src/schema/__tests__/connection-input-fields-test.js
+++ b/packages/gatsby/src/schema/__tests__/connection-input-fields.js
@@ -1,9 +1,8 @@
-const _ = require(`lodash`)
const { graphql } = require(`graphql`)
-const nodeTypes = require(`../build-node-types`)
-const nodeConnections = require(`../build-node-connections`)
-const { buildNodesSchema } = require(`../index`)
-const { clearUnionTypes } = require(`../infer-graphql-type`)
+const { createSchemaComposer } = require(`../schema-composer`)
+const { buildSchema } = require(`../schema`)
+const { LocalNodeModel } = require(`../node-model`)
+const nodeStore = require(`../../db/nodes`)
const { store } = require(`../../redux`)
require(`../../db/__tests__/fixtures/ensure-loki`)()
@@ -132,21 +131,28 @@ function makeNodes() {
]
}
-async function queryResult(nodesData, query, { types = [] } = {}) {
+async function queryResult(nodes, query) {
store.dispatch({ type: `DELETE_CACHE` })
- for (const node of nodesData) {
- store.dispatch({ type: `CREATE_NODE`, payload: node })
- }
- clearUnionTypes()
- const typesGQL = await nodeTypes.buildAll({})
- const connections = nodeConnections.buildAll(_.values(typesGQL))
+ nodes.forEach(node => store.dispatch({ type: `CREATE_NODE`, payload: node }))
- // Pull off just the graphql node from each type object.
- const nodes = _.mapValues(typesGQL, `node`)
-
- const schema = buildNodesSchema({ ...connections, ...nodes })
+ const schemaComposer = createSchemaComposer()
+ const schema = await buildSchema({
+ schemaComposer,
+ nodeStore,
+ types: [],
+ thirdPartySchemas: [],
+ })
+ store.dispatch({ type: `SET_SCHEMA`, payload: schema })
- return graphql(schema, query)
+ let context = { path: `foo` }
+ return graphql(schema, query, undefined, {
+ ...context,
+ nodeModel: new LocalNodeModel({
+ schema,
+ nodeStore,
+ createPageDependency: jest.fn(),
+ }),
+ })
}
describe(`connection input fields`, () => {
diff --git a/packages/gatsby/src/schema/__tests__/create-key.js b/packages/gatsby/src/schema/__tests__/create-key.js
deleted file mode 100644
index 4ff52b57bf269..0000000000000
--- a/packages/gatsby/src/schema/__tests__/create-key.js
+++ /dev/null
@@ -1,27 +0,0 @@
-const createKey = require(`../create-key`)
-
-describe(`createKey`, () => {
- it(`leaves valid strings as is`, () => {
- ;[`validstring`, `_hello`, `_`].forEach(input => {
- expect(createKey(input)).toBe(input)
- })
- })
-
- it(`replaces invalid characters`, () => {
- ;[
- [`/hello`, `_hello`],
- [`~/path/to/some/module`, `_xpathxtoxsomexmodule`],
- [`/*`, `_x`],
- [`/*.js`, `_xxjs`],
- [`01234`, `_01234`],
- ].forEach(([input, output]) => {
- expect(createKey(input)).toBe(output)
- })
- })
-
- it(`does not generate same key for different input`, () => {
- ;[[`/*.js`, `*js`]].forEach(([one, two]) => {
- expect(createKey(one)).not.toBe(createKey(two))
- })
- })
-})
diff --git a/packages/gatsby/src/schema/__tests__/data-tree-utils-test.js b/packages/gatsby/src/schema/__tests__/data-tree-utils-test.js
deleted file mode 100644
index 04e81693d81fa..0000000000000
--- a/packages/gatsby/src/schema/__tests__/data-tree-utils-test.js
+++ /dev/null
@@ -1,517 +0,0 @@
-const {
- getExampleValues,
- buildFieldEnumValues,
- clearTypeExampleValues,
- INVALID_VALUE,
-} = require(`../data-tree-utils`)
-const {
- typeConflictReporter,
- TypeConflictEntry,
-} = require(`../type-conflict-reporter`)
-
-describe(`Gatsby data tree utils`, () => {
- beforeEach(() => {
- clearTypeExampleValues()
- })
-
- const nodes = [
- {
- name: `The Mad Max`,
- hair: 1,
- date: `2006-07-22T22:39:53.000Z`,
- "key-with..unsupported-values": true,
- emptyArray: [],
- anArray: [1, 2, 3, 4],
- nestedArrays: [[1, 2, 3], [4, 5, 6]],
- objectsInArray: [{ field1: true }, { field2: 1 }],
- frontmatter: {
- date: `2006-07-22T22:39:53.000Z`,
- title: `The world of dash and adventure`,
- blue: 100,
- },
- context: {
- nestedObject: null,
- },
- },
- {
- name: `The Mad Wax`,
- hair: 2,
- date: `2006-07-22T22:39:53.000Z`,
- emptyArray: [undefined, null],
- anArray: [1, 2, 5, 4],
- iAmNull: null,
- nestedArrays: [[1, 2, 3]],
- objectsInArray: [{ field3: `foo` }],
- frontmatter: {
- date: `2006-07-22T22:39:53.000Z`,
- title: `The world of slash and adventure`,
- blue: 10010,
- circle: `happy`,
- draft: false,
- },
- context: {
- nestedObject: {
- someOtherProperty: 1,
- },
- },
- },
- {
- name: `The Mad Wax`,
- hair: 3,
- date: `2006-07-22T22:39:53.000Z`,
- anArray: [],
- iAmNull: null,
- frontmatter: {
- date: `2006-07-22T22:39:53.000Z`,
- title: `The world of slash and adventure`,
- blue: 10010,
- circle: `happy`,
- draft: false,
- },
- context: {
- nestedObject: {
- someOtherProperty: 2,
- },
- },
- },
- {
- name: `The Mad Wax`,
- hair: 4,
- date: `2006-07-22T22:39:53.000Z`,
- anArray: [4, 6, 2],
- iAmNull: null,
- frontmatter: {
- date: `2006-07-22T22:39:53.000Z`,
- title: `The world of slash and adventure`,
- blue: 10010,
- circle: `happy`,
- draft: false,
- },
- context: {
- nestedObject: {
- name: `Inner name`,
- someOtherProperty: 3,
- },
- },
- "": ``,
- },
- ]
-
- it(`builds field examples from an array of nodes`, () => {
- expect(getExampleValues({ nodes })).toMatchSnapshot()
- })
-
- it(`skips null fields`, () => {
- expect(getExampleValues({ nodes }).iAmNull).not.toBeDefined()
- })
-
- it(`skips fields with key set to empty string`, () => {
- expect(getExampleValues({ nodes })[``]).not.toBeDefined()
- })
-
- it(`should not mutate the nodes`, () => {
- getExampleValues({ nodes })
- expect(nodes[0].context.nestedObject).toBeNull()
- expect(nodes[1].context.nestedObject.someOtherProperty).toEqual(1)
- expect(nodes[2].context.nestedObject.someOtherProperty).toEqual(2)
- expect(nodes[3].context.nestedObject.someOtherProperty).toEqual(3)
- })
-
- it(`skips empty or sparse arrays`, () => {
- expect(getExampleValues({ nodes }).emptyArray).not.toBeDefined()
- expect(getExampleValues({ nodes }).hair).toBeDefined()
- })
-
- it(`skips ignoredFields at the top level`, () => {
- const example = getExampleValues({
- nodes,
- ignoreFields: [`name`, `anArray`],
- })
-
- expect(example.name).not.toBeDefined()
- expect(example.anArray).not.toBeDefined()
- expect(example.hair).toBeDefined()
- expect(example.context.nestedObject.name).toBeDefined()
- })
-
- it(`build enum values for fields from array on nodes`, () => {
- expect(buildFieldEnumValues({ nodes })).toMatchSnapshot()
- })
-
- it(`turns polymorphic fields null`, () => {
- let example = getExampleValues({
- nodes: [{ foo: null }, { foo: [1] }, { foo: { field: 1 } }],
- })
- expect(example.foo).toBe(INVALID_VALUE)
- })
-
- it(`handles polymorphic arrays`, () => {
- let example = getExampleValues({
- nodes: [{ foo: [[`foo`, `bar`]] }, { foo: [{ field: 1 }] }],
- })
- expect(example.foo).toBe(INVALID_VALUE)
- })
-
- it(`doesn't confuse empty fields for polymorhpic ones`, () => {
- let example = getExampleValues({
- nodes: [{ foo: { bar: 1 } }, { foo: null }, { foo: { field: 1 } }],
- })
- expect(example.foo).toEqual({ field: 1, bar: 1 })
-
- example = getExampleValues({
- nodes: [
- { foo: [{ bar: 1 }] },
- { foo: null },
- { foo: [{ field: 1 }, { baz: 1 }] },
- ],
- })
- expect(example.foo).toEqual([{ field: 1, bar: 1, baz: 1 }])
- })
-
- it(`skips unsupported types`, () => {
- // Skips functions
- let example = getExampleValues({ nodes: [{ foo: () => {} }] })
- expect(example.foo).not.toBeDefined()
-
- // Skips array of functions
- example = getExampleValues({ nodes: [{ foo: [() => {}] }] })
- expect(example.foo).not.toBeDefined()
- })
-
- it(`prefers float when multiple number types`, () => {
- let example
-
- // nodes starting with 32-bit integer ("big" ints are float)
- example = getExampleValues({ nodes: [{ number: 5 }, { number: 2.5 }] })
- expect(example.number).toBeDefined()
- expect(example.number).toEqual(2.5)
- example = getExampleValues({
- nodes: [{ number: 5 }, { number: 3000000000 }],
- })
- expect(example.number).toBeDefined()
- expect(example.number).toEqual(3000000000)
-
- // with node not containing number field
- example = getExampleValues({ nodes: [{ number: 5 }, {}, { number: 2.5 }] })
- expect(example.number).toBeDefined()
- expect(example.number).toEqual(2.5)
-
- // nodes starting with float ("big" ints are float)
- example = getExampleValues({ nodes: [{ number: 2.5 }, { number: 5 }] })
- expect(example.number).toBeDefined()
- expect(example.number).toEqual(2.5)
- example = getExampleValues({
- nodes: [{ number: 3000000000 }, { number: 5 }],
- })
- expect(example.number).toBeDefined()
- expect(example.number).toEqual(3000000000)
-
- // array of numbers - starting with float
- example = getExampleValues({ nodes: [{ numbers: [2.5, 5] }] })
- expect(example.numbers).toBeDefined()
- expect(Array.isArray(example.numbers)).toBe(true)
- expect(example.numbers.length).toBe(1)
- expect(example.numbers[0]).toBe(2.5)
- example = getExampleValues({ nodes: [{ numbers: [3000000000, 5] }] })
- expect(example.numbers).toBeDefined()
- expect(Array.isArray(example.numbers)).toBe(true)
- expect(example.numbers.length).toBe(1)
- expect(example.numbers[0]).toBe(3000000000)
-
- // array of numbers - starting with 32-bit integer
- example = getExampleValues({ nodes: [{ numbers: [5, 2.5] }] })
- expect(example.numbers).toBeDefined()
- expect(Array.isArray(example.numbers)).toBe(true)
- expect(example.numbers.length).toBe(1)
- expect(example.numbers[0]).toBe(2.5)
- example = getExampleValues({ nodes: [{ numbers: [5, 3000000000] }] })
- expect(example.numbers).toBeDefined()
- expect(Array.isArray(example.numbers)).toBe(true)
- expect(example.numbers.length).toBe(1)
- expect(example.numbers[0]).toBe(3000000000)
- })
-
- it(`handles mix of date strings and date objects`, () => {
- let example
-
- // should be valid
- example = getExampleValues({
- nodes: [
- { date: new Date(`2017-12-01T14:59:45.600Z`) },
- { date: `2017-01-12T18:13:38.326Z` },
- ],
- })
- expect(example.date).not.toBe(INVALID_VALUE)
-
- // should be invalid (string is not a date)
- example = getExampleValues({
- nodes: [
- { date: new Date(`2017-12-01T14:59:45.600Z`) },
- { date: `This is not a date!!!!!!` },
- ],
- })
- expect(example.date).toBe(INVALID_VALUE)
-
- // should be valid - reversed order
- example = getExampleValues({
- nodes: [
- { date: `2017-01-12T18:13:38.326Z` },
- { date: new Date(`2017-12-01T14:59:45.600Z`) },
- ],
- })
- expect(example.date).not.toBe(INVALID_VALUE)
-
- // should be invalid (string is not a date) - reversed order
- example = getExampleValues({
- nodes: [
- { date: `This is not a date!!!!!!` },
- { date: new Date(`2017-12-01T14:59:45.600Z`) },
- ],
- })
- expect(example.date).toBe(INVALID_VALUE)
- })
-
- it(`handles arrays with mix of date strings and date objects`, () => {
- let example
-
- // should be valid - separate arrays of unique types
- example = getExampleValues({
- nodes: [
- { dates: [new Date(`2017-12-01T14:59:45.600Z`)] },
- { dates: [`2017-01-12T18:13:38.326Z`] },
- ],
- })
- expect(example.dates).not.toBe(INVALID_VALUE)
-
- // should be invalid - separate arrays of unique types (string is not a date)
- example = getExampleValues({
- nodes: [
- { dates: [new Date(`2017-12-01T14:59:45.600Z`)] },
- { dates: [`This is not a date!!!!!!`] },
- ],
- })
- expect(example.dates).toBe(INVALID_VALUE)
-
- // should be valid - single array of mixed types
- example = getExampleValues({
- nodes: [
- {
- dates: [
- new Date(`2017-12-01T14:59:45.600Z`),
- `2017-01-12T18:13:38.326Z`,
- ],
- },
- ],
- })
- expect(example.dates).not.toBe(INVALID_VALUE)
-
- // should be invalid - single array of mixed types (string is not a date)
- example = getExampleValues({
- nodes: [
- {
- dates: [
- new Date(`2017-12-01T14:59:45.600Z`),
- `This is not a date!!!!!!`,
- ],
- },
- ],
- })
- expect(example.dates).toBe(INVALID_VALUE)
-
- // should be valid - separate arrays of both unique types and mixed types
- example = getExampleValues({
- nodes: [
- {
- dates: [
- new Date(`2017-12-01T14:59:45.600Z`),
- `2017-01-12T18:13:38.326Z`,
- ],
- },
- { dates: [new Date(`2017-12-01T14:59:45.600Z`)] },
- { dates: [`2017-01-12T18:13:38.326Z`] },
- ],
- })
- expect(example.dates).not.toBe(INVALID_VALUE)
-
- // should be valid - separate arrays of both unique types and mixed types (string is not a date) #1
- example = getExampleValues({
- nodes: [
- {
- dates: [
- new Date(`2017-12-01T14:59:45.600Z`),
- `This is not a date!!!!!!`,
- ],
- },
- { dates: [new Date(`2017-12-01T14:59:45.600Z`)] },
- { dates: [`2017-01-12T18:13:38.326Z`] },
- ],
- })
- expect(example.dates).toBe(INVALID_VALUE)
-
- // should be valid - separate arrays of both unique types and mixed types (string is not a date) #2
- example = getExampleValues({
- nodes: [
- {
- dates: [
- new Date(`2017-12-01T14:59:45.600Z`),
- `2017-01-12T18:13:38.326Z`,
- ],
- },
- { dates: [new Date(`2017-12-01T14:59:45.600Z`)] },
- { dates: [`This is not a date!!!!!!`] },
- ],
- })
- expect(example.dates).toBe(INVALID_VALUE)
-
- // should be valid - separate arrays of both unique types and mixed types (string is not a date) #2
- example = getExampleValues({
- nodes: [
- {
- dates: [
- new Date(`2017-12-01T14:59:45.600Z`),
- `This is not a date!!!!!!`,
- ],
- },
- { dates: [new Date(`2017-12-01T14:59:45.600Z`)] },
- { dates: [`This is not a date!!!!!!`] },
- ],
- })
- expect(example.dates).toBe(INVALID_VALUE)
- })
-})
-
-describe(`Type conflicts`, () => {
- let addConflictSpy = jest.spyOn(typeConflictReporter, `addConflict`)
- let addConflictExampleSpy = jest.spyOn(
- TypeConflictEntry.prototype,
- `addExample`
- )
-
- beforeEach(() => {
- clearTypeExampleValues()
- addConflictExampleSpy.mockReset()
- })
-
- afterAll(() => {
- addConflictSpy.mockRestore()
- addConflictExampleSpy.mockRestore()
- })
-
- it(`Doesn't report conflicts if there are none`, () => {
- const nodes = [
- {
- id: `id1`,
- string: `string`,
- number: 5,
- boolean: true,
- arrayOfStrings: [`string1`],
- },
- {
- id: `id2`,
- string: `other string`,
- number: 3.5,
- boolean: false,
- arrayOfStrings: null,
- },
- ]
-
- getExampleValues({ nodes, typeName: `NoConflict` })
-
- expect(addConflictExampleSpy).not.toBeCalled()
- })
-
- it(`Report type conflicts and its origin`, () => {
- const nodes = [
- {
- id: `id1`,
- stringOrNumber: `string`,
- number: 5,
- boolean: true,
- arrayOfStrings: [`string1`],
- },
- {
- id: `id2`,
- stringOrNumber: 5,
- number: 3.5,
- boolean: false,
- arrayOfStrings: null,
- },
- ]
-
- getExampleValues({ nodes, typeName: `Conflict_1` })
-
- expect(addConflictSpy).toBeCalled()
- expect(addConflictSpy).toBeCalledWith(
- `Conflict_1.stringOrNumber`,
- expect.any(Array)
- )
-
- expect(addConflictExampleSpy).toHaveBeenCalledTimes(2)
- expect(addConflictExampleSpy).toBeCalledWith(
- expect.objectContaining({
- value: nodes[0].stringOrNumber,
- type: `string`,
- parent: nodes[0],
- })
- )
- expect(addConflictExampleSpy).toBeCalledWith(
- expect.objectContaining({
- value: nodes[1].stringOrNumber,
- type: `number`,
- parent: nodes[1],
- })
- )
- })
-
- it(`Report conflict when array has mixed types and its origin`, () => {
- const nodes = [
- {
- id: `id1`,
- arrayOfMixedType: [`string1`, 5, `string2`, true],
- },
- ]
-
- getExampleValues({ nodes, typeName: `Conflict_2` })
- expect(addConflictSpy).toBeCalled()
- expect(addConflictSpy).toBeCalledWith(
- `Conflict_2.arrayOfMixedType`,
- expect.any(Array)
- )
-
- expect(addConflictExampleSpy).toBeCalled()
- expect(addConflictExampleSpy).toHaveBeenCalledTimes(1)
- expect(addConflictExampleSpy).toBeCalledWith(
- expect.objectContaining({
- value: nodes[0].arrayOfMixedType,
- type: `array`,
- parent: nodes[0],
- })
- )
- })
-
- it(`Doesn't report ignored fields`, () => {
- const nodes = [
- {
- id: `id1`,
- stringOrNumber: `string`,
- other: 1,
- },
- {
- id: `id2`,
- stringOrNumber: 5,
- other: `foo`,
- },
- ]
-
- getExampleValues({
- nodes,
- typeName: `Conflict_3`,
- ignoreFields: [`stringOrNumber`],
- })
-
- expect(addConflictSpy).toBeCalled()
- expect(addConflictSpy).toBeCalledWith(`Conflict_3.other`, expect.any(Array))
- expect(addConflictSpy).not.toBeCalledWith(`Conflict_3.stringOrNumber`)
- expect(addConflictExampleSpy).toBeCalled()
- })
-})
diff --git a/packages/gatsby/src/schema/__tests__/fixtures/kitchen-sink.json b/packages/gatsby/src/schema/__tests__/fixtures/kitchen-sink.json
new file mode 100644
index 0000000000000..c9ac2f76726e1
--- /dev/null
+++ b/packages/gatsby/src/schema/__tests__/fixtures/kitchen-sink.json
@@ -0,0 +1,11257 @@
+[
+ {
+ "jsonName": "dev-404-page-5f9",
+ "internalComponentName": "ComponentDev404Page",
+ "path": "/dev-404-page/",
+ "component": "/examples/gatsbygram/.cache/dev-404-page.js",
+ "componentChunkName": "component---cache-dev-404-page-js",
+ "context": {},
+ "pluginCreator___NODE": "d48d1c52-fe48-53cb-8f08-aa4b47dde5a5",
+ "pluginCreatorId": "d48d1c52-fe48-53cb-8f08-aa4b47dde5a5",
+ "componentPath": "/examples/gatsbygram/.cache/dev-404-page.js",
+ "id": "SitePage /dev-404-page/",
+ "parent": null,
+ "children": [],
+ "internal": {
+ "type": "SitePage",
+ "contentDigest": "42a24b67a94307f5e21997eb6cfc9cc5",
+ "description": "d48d1c52-fe48-53cb-8f08-aa4b47dde5a5",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby/dist/internal-plugins/dev-404-page",
+ "id": "d48d1c52-fe48-53cb-8f08-aa4b47dde5a5",
+ "name": "dev-404-page",
+ "version": "1.0.0",
+ "pluginOptions": {
+ "plugins": []
+ },
+ "nodeAPIs": [
+ "createPagesStatefully"
+ ],
+ "browserAPIs": [],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby/dist/internal-plugins/dev-404-page",
+ "packageJson": {
+ "name": "dev-404-page",
+ "description": "Internal plugin to add a 404 page in development with helpful information",
+ "version": "1.0.0",
+ "main": "index.js",
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [],
+ "devDependencies": [],
+ "peerDependencies": [],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "2b5b4bced853926de0d5335ae5f9a5d3",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby/dist/internal-plugins/load-babel-config",
+ "id": "1fc32581-893a-55e8-8927-bcd667e2b700",
+ "name": "load-babel-config",
+ "version": "1.0.0",
+ "pluginOptions": {
+ "plugins": []
+ },
+ "nodeAPIs": [
+ "onPreBootstrap"
+ ],
+ "browserAPIs": [],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby/dist/internal-plugins/load-babel-config",
+ "packageJson": {
+ "name": "load-babel-config",
+ "description": "Internal plugin that handles loading Babel configs",
+ "version": "1.0.0",
+ "main": "index.js",
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [],
+ "devDependencies": [],
+ "peerDependencies": [],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "50184920d40e80f70b8bc61a8def475f",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby/dist/internal-plugins/internal-data-bridge",
+ "id": "a5079d69-ba80-53dc-82f9-0f440bd5448c",
+ "name": "internal-data-bridge",
+ "version": "1.0.0",
+ "pluginOptions": {
+ "plugins": []
+ },
+ "nodeAPIs": [
+ "sourceNodes",
+ "onCreatePage"
+ ],
+ "browserAPIs": [],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby/dist/internal-plugins/internal-data-bridge",
+ "packageJson": {
+ "name": "internal-data-bridge",
+ "description": "An internal Gatsby plugin which creates data nodes from internal data",
+ "version": "1.0.0",
+ "main": "index.js",
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [],
+ "devDependencies": [],
+ "peerDependencies": [],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "85bcc671b6e460a752264931c2cec1b6",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby/dist/internal-plugins/prod-404",
+ "id": "f795702c-a3b8-5a88-88ee-5d06019d44fa",
+ "name": "prod-404",
+ "version": "1.0.0",
+ "pluginOptions": {
+ "plugins": []
+ },
+ "nodeAPIs": [
+ "onCreatePage"
+ ],
+ "browserAPIs": [],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby/dist/internal-plugins/prod-404",
+ "packageJson": {
+ "name": "prod-404",
+ "description": "Internal plugin to detect various flavors of 404 pages and ensure there's a 404.html path created as well to ensure compatability with static hosts",
+ "version": "1.0.0",
+ "main": "index.js",
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [],
+ "devDependencies": [],
+ "peerDependencies": [],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "a4f893432f792cfe311d087d4d920c74",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby/dist/internal-plugins/query-runner",
+ "id": "84dad27f-1d44-51fc-ac56-4db2e5222995",
+ "name": "query-runner",
+ "version": "1.0.0",
+ "pluginOptions": {
+ "plugins": []
+ },
+ "nodeAPIs": [
+ "onCreatePage"
+ ],
+ "browserAPIs": [],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby/dist/internal-plugins/query-runner",
+ "packageJson": {
+ "name": "query-runner",
+ "description": "Internal plugin for running queries",
+ "version": "1.0.0",
+ "main": "index.js",
+ "author": "",
+ "license": "MIT",
+ "dependencies": [],
+ "devDependencies": [],
+ "peerDependencies": [],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "85803f60a930a1147b86ff8022857e5f",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby/dist/internal-plugins/webpack-theme-component-shadowing",
+ "id": "6f4b2fa9-66b5-5205-a03f-140005a2cfe5",
+ "name": "webpack-theme-component-shadowing",
+ "version": "1.0.0",
+ "pluginOptions": {
+ "plugins": []
+ },
+ "nodeAPIs": [
+ "onCreateWebpackConfig"
+ ],
+ "browserAPIs": [],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby/dist/internal-plugins/webpack-theme-component-shadowing",
+ "packageJson": {
+ "name": "webpack-theme-component-shadowing",
+ "description": "An internal Gatsby plugin which handles configuring webpack to ensure theme components fall back from the user's site to theme modules.",
+ "version": "1.0.0",
+ "main": "index.js",
+ "author": "Chris Biscardi ",
+ "license": "MIT",
+ "dependencies": [],
+ "devDependencies": [],
+ "peerDependencies": [],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "4dfb9738a5f82d68075b870cdd6346eb",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby-source-filesystem",
+ "id": "9855a692-fe04-5c80-9f07-de8fe989d990",
+ "name": "gatsby-source-filesystem",
+ "version": "2.0.17",
+ "pluginOptions": {
+ "plugins": [],
+ "name": "data",
+ "path": "/examples/gatsbygram/data"
+ },
+ "nodeAPIs": [
+ "sourceNodes",
+ "setFieldsOnGraphQLNodeType"
+ ],
+ "browserAPIs": [],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby-source-filesystem",
+ "packageJson": {
+ "name": "gatsby-source-filesystem",
+ "description": "Gatsby plugin which parses files within a directory for further parsing by other plugins",
+ "version": "2.0.17",
+ "keywords": [
+ "gatsby",
+ "gatsby-plugin"
+ ],
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [
+ {
+ "name": "@babel/runtime",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "better-queue",
+ "version": "^3.8.7"
+ },
+ {
+ "name": "bluebird",
+ "version": "^3.5.0"
+ },
+ {
+ "name": "chokidar",
+ "version": "^1.7.0"
+ },
+ {
+ "name": "file-type",
+ "version": "^10.2.0"
+ },
+ {
+ "name": "fs-extra",
+ "version": "^5.0.0"
+ },
+ {
+ "name": "got",
+ "version": "^7.1.0"
+ },
+ {
+ "name": "md5-file",
+ "version": "^3.1.1"
+ },
+ {
+ "name": "mime",
+ "version": "^2.2.0"
+ },
+ {
+ "name": "pretty-bytes",
+ "version": "^4.0.2"
+ },
+ {
+ "name": "progress",
+ "version": "^1.1.8"
+ },
+ {
+ "name": "read-chunk",
+ "version": "^3.0.0"
+ },
+ {
+ "name": "slash",
+ "version": "^1.0.0"
+ },
+ {
+ "name": "valid-url",
+ "version": "^1.0.9"
+ },
+ {
+ "name": "xstate",
+ "version": "^3.1.0"
+ }
+ ],
+ "devDependencies": [
+ {
+ "name": "@babel/cli",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "@babel/core",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "babel-preset-gatsby-package",
+ "version": "^0.1.3"
+ },
+ {
+ "name": "cross-env",
+ "version": "^5.1.4"
+ }
+ ],
+ "peerDependencies": [
+ {
+ "name": "gatsby",
+ "version": ">2.0.0-alpha"
+ }
+ ],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "b989561eb4aee8115abfb92098ce322b",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby-plugin-sharp",
+ "id": "84d6154d-4241-556c-a679-cc8339cac100",
+ "name": "gatsby-plugin-sharp",
+ "version": "2.0.18",
+ "pluginOptions": {
+ "plugins": []
+ },
+ "nodeAPIs": [
+ "onPreInit"
+ ],
+ "browserAPIs": [],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby-plugin-sharp",
+ "packageJson": {
+ "name": "gatsby-plugin-sharp",
+ "description": "Wrapper of the Sharp image manipulation library for Gatsby plugins",
+ "version": "2.0.18",
+ "main": "index.js",
+ "keywords": [
+ "gatsby",
+ "gatsby-plugin",
+ "image",
+ "sharp"
+ ],
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [
+ {
+ "name": "@babel/runtime",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "async",
+ "version": "^2.1.2"
+ },
+ {
+ "name": "bluebird",
+ "version": "^3.5.0"
+ },
+ {
+ "name": "fs-exists-cached",
+ "version": "^1.0.0"
+ },
+ {
+ "name": "fs-extra",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "imagemin",
+ "version": "^6.0.0"
+ },
+ {
+ "name": "imagemin-mozjpeg",
+ "version": "^8.0.0"
+ },
+ {
+ "name": "imagemin-pngquant",
+ "version": "^6.0.0"
+ },
+ {
+ "name": "imagemin-webp",
+ "version": "^5.0.0"
+ },
+ {
+ "name": "lodash",
+ "version": "^4.17.10"
+ },
+ {
+ "name": "mini-svg-data-uri",
+ "version": "^1.0.0"
+ },
+ {
+ "name": "potrace",
+ "version": "^2.1.1"
+ },
+ {
+ "name": "probe-image-size",
+ "version": "^4.0.0"
+ },
+ {
+ "name": "progress",
+ "version": "^1.1.8"
+ },
+ {
+ "name": "sharp",
+ "version": "^0.21.0"
+ },
+ {
+ "name": "svgo",
+ "version": "^0.7.2"
+ }
+ ],
+ "devDependencies": [
+ {
+ "name": "@babel/cli",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "@babel/core",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "babel-preset-gatsby-package",
+ "version": "^0.1.3"
+ },
+ {
+ "name": "cross-env",
+ "version": "^5.1.4"
+ }
+ ],
+ "peerDependencies": [
+ {
+ "name": "gatsby",
+ "version": ">2.0.0-alpha"
+ }
+ ],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "8add3038ea3427eb78b761b82dcb7666",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby-transformer-sharp",
+ "id": "da3d06eb-685e-5c77-ae1d-750eb6a2e4a9",
+ "name": "gatsby-transformer-sharp",
+ "version": "2.1.12",
+ "pluginOptions": {
+ "plugins": []
+ },
+ "nodeAPIs": [
+ "onCreateNode",
+ "setFieldsOnGraphQLNodeType",
+ "onPreExtractQueries"
+ ],
+ "browserAPIs": [],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby-transformer-sharp",
+ "packageJson": {
+ "name": "gatsby-transformer-sharp",
+ "description": "Gatsby transformer plugin for images using Sharp",
+ "version": "2.1.12",
+ "keywords": [
+ "gatsby",
+ "gatsby-plugin",
+ "image",
+ "sharp"
+ ],
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [
+ {
+ "name": "@babel/runtime",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "bluebird",
+ "version": "^3.5.0"
+ },
+ {
+ "name": "fs-extra",
+ "version": "^4.0.2"
+ },
+ {
+ "name": "potrace",
+ "version": "^2.1.1"
+ },
+ {
+ "name": "probe-image-size",
+ "version": "^4.0.0"
+ },
+ {
+ "name": "sharp",
+ "version": "^0.21.0"
+ }
+ ],
+ "devDependencies": [
+ {
+ "name": "@babel/cli",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "@babel/core",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "babel-preset-gatsby-package",
+ "version": "^0.1.3"
+ },
+ {
+ "name": "cross-env",
+ "version": "^5.1.4"
+ }
+ ],
+ "peerDependencies": [
+ {
+ "name": "gatsby",
+ "version": "^2.0.33"
+ },
+ {
+ "name": "gatsby-plugin-sharp",
+ "version": "^2.0.0-beta.3"
+ }
+ ],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "a590bcac2abc9aa140121a41d81e80eb",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby-transformer-json",
+ "id": "6aa321d5-19bf-5a36-99ac-3b6091585e24",
+ "name": "gatsby-transformer-json",
+ "version": "2.1.7",
+ "pluginOptions": {
+ "plugins": []
+ },
+ "nodeAPIs": [
+ "onCreateNode"
+ ],
+ "browserAPIs": [],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby-transformer-json",
+ "packageJson": {
+ "name": "gatsby-transformer-json",
+ "description": "Gatsby transformer plugin for JSON files",
+ "version": "2.1.7",
+ "keywords": [
+ "gatsby",
+ "gatsby-plugin",
+ "json"
+ ],
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [
+ {
+ "name": "@babel/runtime",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "bluebird",
+ "version": "^3.5.0"
+ }
+ ],
+ "devDependencies": [
+ {
+ "name": "@babel/cli",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "@babel/core",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "babel-preset-gatsby-package",
+ "version": "^0.1.3"
+ },
+ {
+ "name": "cross-env",
+ "version": "^5.1.4"
+ }
+ ],
+ "peerDependencies": [
+ {
+ "name": "gatsby",
+ "version": ">=2.0.15"
+ }
+ ],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "d57cc1b24d600a05fce36573de3cc390",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby-plugin-glamor",
+ "id": "35060b81-dece-5ee0-8b77-8e505cbed3a6",
+ "name": "gatsby-plugin-glamor",
+ "version": "2.0.7",
+ "pluginOptions": {
+ "plugins": []
+ },
+ "nodeAPIs": [
+ "onCreateWebpackConfig",
+ "onCreateBabelConfig"
+ ],
+ "browserAPIs": [
+ "onClientEntry"
+ ],
+ "ssrAPIs": [
+ "replaceRenderer"
+ ],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby-plugin-glamor",
+ "packageJson": {
+ "name": "gatsby-plugin-glamor",
+ "description": "Gatsby plugin to add support for Glamor",
+ "version": "2.0.7",
+ "main": "index.js",
+ "keywords": [
+ "gatsby",
+ "gatsby-plugin",
+ "glamor"
+ ],
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [
+ {
+ "name": "@babel/runtime",
+ "version": "^7.0.0"
+ }
+ ],
+ "devDependencies": [
+ {
+ "name": "@babel/cli",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "@babel/core",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "babel-preset-gatsby-package",
+ "version": "^0.1.3"
+ },
+ {
+ "name": "cross-env",
+ "version": "^5.1.4"
+ }
+ ],
+ "peerDependencies": [
+ {
+ "name": "gatsby",
+ "version": ">2.0.0-alpha"
+ },
+ {
+ "name": "glamor",
+ "version": "^2.20.29"
+ }
+ ],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "07fe11bf009b042d7610d6584a6a82f0",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby-plugin-manifest",
+ "id": "354c933d-4995-53d9-833e-04b2604718cf",
+ "name": "gatsby-plugin-manifest",
+ "version": "2.0.13",
+ "pluginOptions": {
+ "plugins": [],
+ "name": "Gatsbygram",
+ "short_name": "Gatsbygram",
+ "start_url": "/",
+ "background_color": "#f7f7f7",
+ "theme_color": "#191919",
+ "display": "minimal-ui"
+ },
+ "nodeAPIs": [
+ "onPostBootstrap"
+ ],
+ "browserAPIs": [],
+ "ssrAPIs": [
+ "onRenderBody"
+ ],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby-plugin-manifest",
+ "packageJson": {
+ "name": "gatsby-plugin-manifest",
+ "description": "Gatsby plugin which adds a manifest.webmanifest to make sites progressive web apps",
+ "version": "2.0.13",
+ "main": "index.js",
+ "keywords": [
+ "gatsby",
+ "gatsby-plugin",
+ "favicon",
+ "icons",
+ "manifest.webmanifest",
+ "progressive-web-app",
+ "pwa"
+ ],
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [
+ {
+ "name": "@babel/runtime",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "bluebird",
+ "version": "^3.5.0"
+ },
+ {
+ "name": "sharp",
+ "version": "^0.21.0"
+ }
+ ],
+ "devDependencies": [
+ {
+ "name": "@babel/cli",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "@babel/core",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "babel-preset-gatsby-package",
+ "version": "^0.1.3"
+ },
+ {
+ "name": "cross-env",
+ "version": "^5.1.4"
+ }
+ ],
+ "peerDependencies": [
+ {
+ "name": "gatsby",
+ "version": ">2.0.0-alpha"
+ }
+ ],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "2a1e638a5fb60ec5262cbc8ed62e5cc6",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby-plugin-offline",
+ "id": "63e5f7ff-e5f1-58f7-8e2c-55872ac42281",
+ "name": "gatsby-plugin-offline",
+ "version": "2.0.21",
+ "pluginOptions": {
+ "plugins": []
+ },
+ "nodeAPIs": [
+ "createPages",
+ "onPostBuild"
+ ],
+ "browserAPIs": [
+ "registerServiceWorker",
+ "onServiceWorkerActive",
+ "onPostPrefetchPathname"
+ ],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby-plugin-offline",
+ "packageJson": {
+ "name": "gatsby-plugin-offline",
+ "description": "Gatsby plugin which sets up a site to be able to run offline",
+ "version": "2.0.21",
+ "main": "index.js",
+ "keywords": [
+ "gatsby",
+ "gatsby-plugin",
+ "offline",
+ "precache",
+ "service-worker"
+ ],
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [
+ {
+ "name": "@babel/runtime",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "cheerio",
+ "version": "^1.0.0-rc.2"
+ },
+ {
+ "name": "idb-keyval",
+ "version": "^3.1.0"
+ },
+ {
+ "name": "lodash",
+ "version": "^4.17.10"
+ },
+ {
+ "name": "workbox-build",
+ "version": "^3.6.3"
+ }
+ ],
+ "devDependencies": [
+ {
+ "name": "@babel/cli",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "@babel/core",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "babel-preset-gatsby-package",
+ "version": "^0.1.3"
+ },
+ {
+ "name": "cross-env",
+ "version": "^5.1.4"
+ }
+ ],
+ "peerDependencies": [
+ {
+ "name": "gatsby",
+ "version": ">=2.0.53"
+ }
+ ],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "9ffbbc3953e1390fee5266216806594e",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby-plugin-google-analytics",
+ "id": "9abf9609-8fa7-52f9-89e6-affec700ccb8",
+ "name": "gatsby-plugin-google-analytics",
+ "version": "2.0.10",
+ "pluginOptions": {
+ "plugins": [],
+ "trackingId": "UA-91652198-1"
+ },
+ "nodeAPIs": [],
+ "browserAPIs": [
+ "onRouteUpdate"
+ ],
+ "ssrAPIs": [
+ "onRenderBody"
+ ],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby-plugin-google-analytics",
+ "packageJson": {
+ "name": "gatsby-plugin-google-analytics",
+ "description": "Gatsby plugin to add google analytics onto a site",
+ "version": "2.0.10",
+ "main": "index.js",
+ "keywords": [
+ "gatsby",
+ "gatsby-plugin",
+ "google analytics"
+ ],
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [
+ {
+ "name": "@babel/runtime",
+ "version": "^7.0.0"
+ }
+ ],
+ "devDependencies": [
+ {
+ "name": "@babel/cli",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "@babel/core",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "babel-preset-gatsby-package",
+ "version": "^0.1.3"
+ },
+ {
+ "name": "cross-env",
+ "version": "^5.1.4"
+ }
+ ],
+ "peerDependencies": [
+ {
+ "name": "gatsby",
+ "version": ">2.0.0-alpha"
+ }
+ ],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "d6337969d7a1d54a73b0003fb2fe099b",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby-plugin-typography",
+ "id": "64059fc2-eafe-53ab-a542-ad6d70a5c7ff",
+ "name": "gatsby-plugin-typography",
+ "version": "2.2.5",
+ "pluginOptions": {
+ "plugins": [],
+ "pathToConfigModule": "src/utils/typography"
+ },
+ "nodeAPIs": [
+ "onPreBootstrap"
+ ],
+ "browserAPIs": [
+ "onClientEntry"
+ ],
+ "ssrAPIs": [
+ "onRenderBody"
+ ],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby-plugin-typography",
+ "packageJson": {
+ "name": "gatsby-plugin-typography",
+ "description": "Gatsby plugin to setup server rendering of Typography.js' CSS",
+ "version": "2.2.5",
+ "main": "index.js",
+ "keywords": [
+ "gatsby",
+ "gatsby-plugin",
+ "typography",
+ "typography.js"
+ ],
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [
+ {
+ "name": "@babel/runtime",
+ "version": "^7.0.0"
+ }
+ ],
+ "devDependencies": [
+ {
+ "name": "@babel/cli",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "@babel/core",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "babel-preset-gatsby-package",
+ "version": "^0.1.3"
+ },
+ {
+ "name": "cross-env",
+ "version": "^5.1.4"
+ }
+ ],
+ "peerDependencies": [
+ {
+ "name": "gatsby",
+ "version": ">2.0.0-alpha"
+ },
+ {
+ "name": "react-typography",
+ "version": "^0.16.1 || ^1.0.0-alpha.0"
+ },
+ {
+ "name": "typography",
+ "version": "^0.16.0 || ^1.0.0-alpha.0"
+ }
+ ],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "81344244d96b1e3dca196f0e0116e4c2",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram",
+ "id": "7374ebf2-d961-52ee-92a2-c25e7cb387a9",
+ "name": "default-site-plugin",
+ "version": "c903a11cb8a9951bb996b03d186e2f0d",
+ "pluginOptions": {
+ "plugins": []
+ },
+ "nodeAPIs": [
+ "createPages",
+ "sourceNodes",
+ "addResolvers"
+ ],
+ "browserAPIs": [
+ "shouldUpdateScroll",
+ "onInitialClientRender"
+ ],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram",
+ "packageJson": {
+ "name": "gatsby-example-image-gallery",
+ "description": "Gatsby example site: image gallery",
+ "version": "1.0.0",
+ "main": "n/a",
+ "keywords": [
+ "gatsby"
+ ],
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [
+ {
+ "name": "core-js",
+ "version": "^2.5.5"
+ },
+ {
+ "name": "gatsby",
+ "version": "2.0.110"
+ },
+ {
+ "name": "gatsby-image",
+ "version": "^2.0.5"
+ },
+ {
+ "name": "gatsby-plugin-glamor",
+ "version": "^2.0.5"
+ },
+ {
+ "name": "gatsby-plugin-google-analytics",
+ "version": "^2.0.5"
+ },
+ {
+ "name": "gatsby-plugin-manifest",
+ "version": "^2.0.2"
+ },
+ {
+ "name": "gatsby-plugin-offline",
+ "version": "^2.0.5"
+ },
+ {
+ "name": "gatsby-plugin-sharp",
+ "version": "^2.0.5"
+ },
+ {
+ "name": "gatsby-plugin-typography",
+ "version": "^2.2.0"
+ },
+ {
+ "name": "gatsby-source-filesystem",
+ "version": "^2.0.1"
+ },
+ {
+ "name": "gatsby-transformer-json",
+ "version": "^2.1.1"
+ },
+ {
+ "name": "gatsby-transformer-sharp",
+ "version": "^2.1.1"
+ },
+ {
+ "name": "glamor",
+ "version": "^2.20.40"
+ },
+ {
+ "name": "graphql-compose",
+ "version": "^5.10.1"
+ },
+ {
+ "name": "graphql",
+ "version": "^14.1.1"
+ },
+ {
+ "name": "instagram-screen-scrape",
+ "version": "^2.0.0"
+ },
+ {
+ "name": "lodash",
+ "version": "^4.17.10"
+ },
+ {
+ "name": "mkdirp",
+ "version": "^0.5.1"
+ },
+ {
+ "name": "mousetrap",
+ "version": "^1.6.0"
+ },
+ {
+ "name": "progress",
+ "version": "^2.0.0"
+ },
+ {
+ "name": "prop-types",
+ "version": "^15.5.8"
+ },
+ {
+ "name": "react",
+ "version": "^16.3.2"
+ },
+ {
+ "name": "react-dom",
+ "version": "^16.3.2"
+ },
+ {
+ "name": "react-gravatar",
+ "version": "^2.6.1"
+ },
+ {
+ "name": "react-icons",
+ "version": "^2.2.7"
+ },
+ {
+ "name": "react-modal",
+ "version": "^3.4.2"
+ },
+ {
+ "name": "react-typography",
+ "version": "^0.16.13"
+ },
+ {
+ "name": "request",
+ "version": "^2.79.0"
+ },
+ {
+ "name": "slug",
+ "version": "^0.9.1"
+ },
+ {
+ "name": "typeface-space-mono",
+ "version": "0.0.54"
+ },
+ {
+ "name": "typography",
+ "version": "^0.16.6"
+ }
+ ],
+ "devDependencies": [
+ {
+ "name": "cypress",
+ "version": "^3.1.0"
+ },
+ {
+ "name": "start-server-and-test",
+ "version": "^1.1.4"
+ }
+ ],
+ "peerDependencies": [],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "ba80e871b6f1f077cc01118f4075271d",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "resolve": "/examples/gatsbygram/node_modules/gatsby-plugin-page-creator",
+ "id": "52fe8a30-9176-50f6-aaf9-4ba1a44e0ffa",
+ "name": "gatsby-plugin-page-creator",
+ "version": "2.0.6",
+ "pluginOptions": {
+ "plugins": [],
+ "path": "/examples/gatsbygram/src/pages",
+ "pathCheck": false
+ },
+ "nodeAPIs": [
+ "createPagesStatefully"
+ ],
+ "browserAPIs": [],
+ "ssrAPIs": [],
+ "pluginFilepath": "/examples/gatsbygram/node_modules/gatsby-plugin-page-creator",
+ "packageJson": {
+ "name": "gatsby-plugin-page-creator",
+ "description": "Gatsby plugin that automatically creates pages from React components in specified directories",
+ "version": "2.0.6",
+ "main": "index.js",
+ "keywords": [
+ "gatsby",
+ "gatsby-plugin"
+ ],
+ "author": "Kyle Mathews ",
+ "license": "MIT",
+ "dependencies": [
+ {
+ "name": "@babel/runtime",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "bluebird",
+ "version": "^3.5.0"
+ },
+ {
+ "name": "chokidar",
+ "version": "^1.7.0"
+ },
+ {
+ "name": "fs-exists-cached",
+ "version": "^1.0.0"
+ },
+ {
+ "name": "glob",
+ "version": "^7.1.1"
+ },
+ {
+ "name": "lodash",
+ "version": "^4.17.10"
+ },
+ {
+ "name": "micromatch",
+ "version": "^3.1.10"
+ },
+ {
+ "name": "parse-filepath",
+ "version": "^1.0.1"
+ },
+ {
+ "name": "slash",
+ "version": "^1.0.0"
+ }
+ ],
+ "devDependencies": [
+ {
+ "name": "@babel/cli",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "@babel/core",
+ "version": "^7.0.0"
+ },
+ {
+ "name": "babel-preset-gatsby-package",
+ "version": "^0.1.3"
+ },
+ {
+ "name": "cross-env",
+ "version": "^5.0.5"
+ }
+ ],
+ "peerDependencies": [
+ {
+ "name": "gatsby",
+ "version": "^2.0.0"
+ }
+ ],
+ "optionalDependecies": [],
+ "bundledDependecies": []
+ },
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "a5b91bd941c5cd288ffd494d6287e2e8",
+ "type": "SitePlugin",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "siteMetadata": {
+ "title": "Gatsbygram"
+ },
+ "port": "8000",
+ "host": "localhost",
+ "pathPrefix": "",
+ "polyfill": true,
+ "buildTime": "2019-02-14T09:17:58.369Z",
+ "id": "Site",
+ "parent": null,
+ "children": [],
+ "internal": {
+ "contentDigest": "70bb763c0bc449768affd27a058600c4",
+ "type": "Site",
+ "owner": "internal-data-bridge"
+ }
+ },
+ {
+ "id": "61d88d2c-01e8-5539-9bda-2f6c3e50f26f",
+ "children": [],
+ "parent": null,
+ "internal": {
+ "contentDigest": "7c287a06a2b98e74381a857d58c42d87",
+ "type": "Directory",
+ "description": "Directory \"data\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data",
+ "relativePath": "",
+ "extension": "",
+ "size": 4096,
+ "prettySize": "4.1 kB",
+ "modifiedTime": "2019-02-14T08:37:54.870Z",
+ "accessTime": "2019-01-25T13:36:16.858Z",
+ "changeTime": "2019-02-14T08:37:54.870Z",
+ "birthTime": "2019-02-14T08:37:54.870Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram",
+ "base": "data",
+ "ext": "",
+ "name": "data",
+ "relativeDirectory": "..",
+ "dev": 65024,
+ "mode": 16877,
+ "nlink": 3,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17465654,
+ "blocks": 8,
+ "atimeMs": 1548423376858.1704,
+ "mtimeMs": 1550133474870.4333,
+ "ctimeMs": 1550133474870.4333,
+ "birthtimeMs": 1550133474870.4333,
+ "atime": "2019-01-25T13:36:16.858Z",
+ "mtime": "2019-02-14T08:37:54.870Z",
+ "ctime": "2019-02-14T08:37:54.870Z",
+ "birthtime": "2019-02-14T08:37:54.870Z"
+ },
+ {
+ "id": "99b099fc-c5b9-5b71-8d78-415bd969cd9d",
+ "children": [],
+ "parent": null,
+ "internal": {
+ "contentDigest": "2391d2ba19bc435c9dbe78d320cac52a",
+ "type": "Directory",
+ "description": "Directory \"data/images\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images",
+ "relativePath": "images",
+ "extension": "",
+ "size": 4096,
+ "prettySize": "4.1 kB",
+ "modifiedTime": "2019-02-08T08:55:07.965Z",
+ "accessTime": "2019-01-25T13:36:16.858Z",
+ "changeTime": "2019-02-08T08:55:07.965Z",
+ "birthTime": "2019-02-08T08:55:07.965Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data",
+ "base": "images",
+ "ext": "",
+ "name": "images",
+ "relativeDirectory": "",
+ "dev": 65024,
+ "mode": 16877,
+ "nlink": 2,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17465655,
+ "blocks": 8,
+ "atimeMs": 1548423376858.1704,
+ "mtimeMs": 1549616107964.5935,
+ "ctimeMs": 1549616107964.5935,
+ "birthtimeMs": 1549616107964.5935,
+ "atime": "2019-01-25T13:36:16.858Z",
+ "mtime": "2019-02-08T08:55:07.965Z",
+ "ctime": "2019-02-08T08:55:07.965Z",
+ "birthtime": "2019-02-08T08:55:07.965Z"
+ },
+ {
+ "id": "aa67975d-e8e0-5c1b-8f31-52eeb71a1bb2",
+ "children": [
+ "1685001452849004065",
+ "1677771511187112561",
+ "1632234281433883850",
+ "1601601194425654597",
+ "1601530617317009166",
+ "1565766376903475329",
+ "1515268510112420213",
+ "1486495736706552111",
+ "1483463111452464830",
+ "1478435327902728655",
+ "1360516742464695325",
+ "1346779149175505545",
+ "1270677182602272387",
+ "1256134251849702933",
+ "1232199266021400176",
+ "1192421294565743753",
+ "1179335444856560759",
+ "1093024552502680593",
+ "1082958063116475674",
+ "1072104297123274725",
+ "1050382401524719413",
+ "1047380412691897508",
+ "1019954573251698010",
+ "1011212316101041196",
+ "1001206739996237060",
+ "996585130438155443",
+ "976313048697659257",
+ "973323047219223582",
+ "811160600493415566",
+ "811160112838466685",
+ "800034649663593593",
+ "783599315140730647",
+ "734060454761192929",
+ "734060430375509472",
+ "734060413657013727",
+ "732757276941868346",
+ "732747494080109637",
+ "732734464004972239",
+ "732606339090734326",
+ "732532731974770038",
+ "732520051645864977",
+ "732518754003705841",
+ "723243022496816380",
+ "722040340713037050",
+ "709713470394982233",
+ "707264656279068376",
+ "695949453427990223",
+ "695178098877128227",
+ "682173039289556382",
+ "680440398655774583",
+ "679681270014532918",
+ "673465739406204031",
+ "673461065357712415",
+ "673457707733475299",
+ "665350447119457524",
+ "650011560209800782",
+ "640022460883001336",
+ "636409258827833279",
+ "635682624046882725",
+ "633544903908122621",
+ "633500736435772673",
+ "632772965954739789",
+ "620418901388549762",
+ "617411858855616370",
+ "613426420792942449",
+ "611758039731788991",
+ "607214368319594481",
+ "603923376229310167",
+ "602898508977266473",
+ "599599505648902132",
+ "597507196258082479",
+ "596440361295142025",
+ "587804514970754664",
+ "584320489442499989",
+ "529876495778438153",
+ "529863260585057945",
+ "528199217793195914",
+ "528198485736152948",
+ "528197163355987780",
+ "523176638502133365",
+ "515988147267690192",
+ "514154189823401179",
+ "493743881078431577",
+ "491519698525216526",
+ "474753551234752325",
+ "465165262878137499",
+ "463285372889325235",
+ "463283463063330440",
+ "433258973868842114",
+ "432671828728864094",
+ "432671016199904582",
+ "432595958039305297",
+ "402249729178853273",
+ "396657460300210097",
+ "394910241079418429",
+ "389212604606962827",
+ "388739099008425940",
+ "358263540721901467",
+ "358258295744749374",
+ "354333585801731194"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "f32cd3d16b306b4c62bd0f7f6404c945",
+ "type": "File",
+ "mediaType": "application/json",
+ "description": "File \"data/posts.json\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/posts.json",
+ "relativePath": "posts.json",
+ "extension": "json",
+ "size": 41712,
+ "prettySize": "41.7 kB",
+ "modifiedTime": "2019-02-11T12:36:25.701Z",
+ "accessTime": "2019-02-11T12:36:25.701Z",
+ "changeTime": "2019-02-11T12:36:25.701Z",
+ "birthTime": "2019-02-11T12:36:25.701Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data",
+ "base": "posts.json",
+ "ext": ".json",
+ "name": "posts",
+ "relativeDirectory": "",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453936,
+ "blocks": 88,
+ "atimeMs": 1549888585701.1294,
+ "mtimeMs": 1549888585701.1294,
+ "ctimeMs": 1549888585701.1294,
+ "birthtimeMs": 1549888585701.1294,
+ "atime": "2019-02-11T12:36:25.701Z",
+ "mtime": "2019-02-11T12:36:25.701Z",
+ "ctime": "2019-02-11T12:36:25.701Z",
+ "birthtime": "2019-02-11T12:36:25.701Z"
+ },
+ {
+ "id": "632c83c7-e76d-5478-8863-fc5a593f7119",
+ "children": [
+ "8d8852d5-d464-5153-b1fe-afc94b70d0a1"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "e6879945b14d6234875718df657b8beb",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/2B8CeRM9we.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/2B8CeRM9we.jpg",
+ "relativePath": "images/2B8CeRM9we.jpg",
+ "extension": "jpg",
+ "size": 110182,
+ "prettySize": "110 kB",
+ "modifiedTime": "2019-02-08T08:55:07.921Z",
+ "accessTime": "2019-02-08T08:55:07.921Z",
+ "changeTime": "2019-02-08T08:55:07.921Z",
+ "birthTime": "2019-02-08T08:55:07.921Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "2B8CeRM9we.jpg",
+ "ext": ".jpg",
+ "name": "2B8CeRM9we",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453836,
+ "blocks": 216,
+ "atimeMs": 1549616107921.2603,
+ "mtimeMs": 1549616107921.2603,
+ "ctimeMs": 1549616107921.2603,
+ "birthtimeMs": 1549616107921.2603,
+ "atime": "2019-02-08T08:55:07.921Z",
+ "mtime": "2019-02-08T08:55:07.921Z",
+ "ctime": "2019-02-08T08:55:07.921Z",
+ "birthtime": "2019-02-08T08:55:07.921Z"
+ },
+ {
+ "id": "cfedef16-1f17-5489-aea7-61529e33d160",
+ "children": [
+ "39d3bdcd-5adf-5f04-83b5-40c4e7dc60d5"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "5c7a76710cb2f7e4d3f2f2ebe64f628d",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/2Mj4uJM995.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/2Mj4uJM995.jpg",
+ "relativePath": "images/2Mj4uJM995.jpg",
+ "extension": "jpg",
+ "size": 83530,
+ "prettySize": "83.5 kB",
+ "modifiedTime": "2019-02-08T08:55:07.921Z",
+ "accessTime": "2019-02-08T08:55:07.921Z",
+ "changeTime": "2019-02-08T08:55:07.921Z",
+ "birthTime": "2019-02-08T08:55:07.921Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "2Mj4uJM995.jpg",
+ "ext": ".jpg",
+ "name": "2Mj4uJM995",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453837,
+ "blocks": 168,
+ "atimeMs": 1549616107921.2603,
+ "mtimeMs": 1549616107921.2603,
+ "ctimeMs": 1549616107921.2603,
+ "birthtimeMs": 1549616107921.2603,
+ "atime": "2019-02-08T08:55:07.921Z",
+ "mtime": "2019-02-08T08:55:07.921Z",
+ "ctime": "2019-02-08T08:55:07.921Z",
+ "birthtime": "2019-02-08T08:55:07.921Z"
+ },
+ {
+ "id": "a03bf39a-da09-5c14-9cf6-103c439f3472",
+ "children": [
+ "9fdf7ff2-9e51-5c2c-90cf-4c3a4af4e6b4"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "30c7fb1607938caece1719e539c54154",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/4IjD5ts9ws.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/4IjD5ts9ws.jpg",
+ "relativePath": "images/4IjD5ts9ws.jpg",
+ "extension": "jpg",
+ "size": 87898,
+ "prettySize": "87.9 kB",
+ "modifiedTime": "2019-02-08T08:55:07.921Z",
+ "accessTime": "2019-02-08T08:55:07.921Z",
+ "changeTime": "2019-02-08T08:55:07.921Z",
+ "birthTime": "2019-02-08T08:55:07.921Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "4IjD5ts9ws.jpg",
+ "ext": ".jpg",
+ "name": "4IjD5ts9ws",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453840,
+ "blocks": 176,
+ "atimeMs": 1549616107921.2603,
+ "mtimeMs": 1549616107921.2603,
+ "ctimeMs": 1549616107921.2603,
+ "birthtimeMs": 1549616107921.2603,
+ "atime": "2019-02-08T08:55:07.921Z",
+ "mtime": "2019-02-08T08:55:07.921Z",
+ "ctime": "2019-02-08T08:55:07.921Z",
+ "birthtime": "2019-02-08T08:55:07.921Z"
+ },
+ {
+ "id": "5fb18353-ad2b-55d6-8f8b-365ab131d348",
+ "children": [
+ "0b06bdfe-f253-5859-8321-b42b5d737195"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "d41e8de7afad8820915adf302f4bce27",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/3lADm0M90E.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/3lADm0M90E.jpg",
+ "relativePath": "images/3lADm0M90E.jpg",
+ "extension": "jpg",
+ "size": 73520,
+ "prettySize": "73.5 kB",
+ "modifiedTime": "2019-02-08T08:55:07.921Z",
+ "accessTime": "2019-02-08T08:55:07.921Z",
+ "changeTime": "2019-02-08T08:55:07.921Z",
+ "birthTime": "2019-02-08T08:55:07.921Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "3lADm0M90E.jpg",
+ "ext": ".jpg",
+ "name": "3lADm0M90E",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453839,
+ "blocks": 144,
+ "atimeMs": 1549616107921.2603,
+ "mtimeMs": 1549616107921.2603,
+ "ctimeMs": 1549616107921.2603,
+ "birthtimeMs": 1549616107921.2603,
+ "atime": "2019-02-08T08:55:07.921Z",
+ "mtime": "2019-02-08T08:55:07.921Z",
+ "ctime": "2019-02-08T08:55:07.921Z",
+ "birthtime": "2019-02-08T08:55:07.921Z"
+ },
+ {
+ "id": "eadfe4c4-6636-55b1-95ee-b24faa4d46f3",
+ "children": [
+ "4abaade8-8f68-5bbb-9e81-798fa66a160d"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "b648f5c6b4dd19a1e20f59eab97dcccb",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/4nm0fJs91a.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/4nm0fJs91a.jpg",
+ "relativePath": "images/4nm0fJs91a.jpg",
+ "extension": "jpg",
+ "size": 68049,
+ "prettySize": "68 kB",
+ "modifiedTime": "2019-02-08T08:55:07.925Z",
+ "accessTime": "2019-02-08T08:55:07.921Z",
+ "changeTime": "2019-02-08T08:55:07.925Z",
+ "birthTime": "2019-02-08T08:55:07.925Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "4nm0fJs91a.jpg",
+ "ext": ".jpg",
+ "name": "4nm0fJs91a",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453841,
+ "blocks": 136,
+ "atimeMs": 1549616107921.2603,
+ "mtimeMs": 1549616107924.5935,
+ "ctimeMs": 1549616107924.5935,
+ "birthtimeMs": 1549616107924.5935,
+ "atime": "2019-02-08T08:55:07.921Z",
+ "mtime": "2019-02-08T08:55:07.925Z",
+ "ctime": "2019-02-08T08:55:07.925Z",
+ "birthtime": "2019-02-08T08:55:07.925Z"
+ },
+ {
+ "id": "e882dc2b-8f14-576e-8f17-a491cd037251",
+ "children": [
+ "e6681fae-b509-5472-a7e4-077f9038072f"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "9af0ebae8944fcbeb03e57571babe823",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/6JCu-jM9yk.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/6JCu-jM9yk.jpg",
+ "relativePath": "images/6JCu-jM9yk.jpg",
+ "extension": "jpg",
+ "size": 101649,
+ "prettySize": "102 kB",
+ "modifiedTime": "2019-02-08T08:55:07.925Z",
+ "accessTime": "2019-02-08T08:55:07.925Z",
+ "changeTime": "2019-02-08T08:55:07.925Z",
+ "birthTime": "2019-02-08T08:55:07.925Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "6JCu-jM9yk.jpg",
+ "ext": ".jpg",
+ "name": "6JCu-jM9yk",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453842,
+ "blocks": 200,
+ "atimeMs": 1549616107924.5935,
+ "mtimeMs": 1549616107924.5935,
+ "ctimeMs": 1549616107924.5935,
+ "birthtimeMs": 1549616107924.5935,
+ "atime": "2019-02-08T08:55:07.925Z",
+ "mtime": "2019-02-08T08:55:07.925Z",
+ "ctime": "2019-02-08T08:55:07.925Z",
+ "birthtime": "2019-02-08T08:55:07.925Z"
+ },
+ {
+ "id": "5bc47ad3-c074-5e02-be9b-0150d6322b2c",
+ "children": [
+ "e3621331-a649-549c-bee4-a9d9bd112e47"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "c99a72470ab736db7b1546334122f456",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/6TtTqhM981.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/6TtTqhM981.jpg",
+ "relativePath": "images/6TtTqhM981.jpg",
+ "extension": "jpg",
+ "size": 110964,
+ "prettySize": "111 kB",
+ "modifiedTime": "2019-02-08T08:55:07.925Z",
+ "accessTime": "2019-02-08T08:55:07.925Z",
+ "changeTime": "2019-02-08T08:55:07.925Z",
+ "birthTime": "2019-02-08T08:55:07.925Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "6TtTqhM981.jpg",
+ "ext": ".jpg",
+ "name": "6TtTqhM981",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453843,
+ "blocks": 224,
+ "atimeMs": 1549616107924.5935,
+ "mtimeMs": 1549616107924.5935,
+ "ctimeMs": 1549616107924.5935,
+ "birthtimeMs": 1549616107924.5935,
+ "atime": "2019-02-08T08:55:07.925Z",
+ "mtime": "2019-02-08T08:55:07.925Z",
+ "ctime": "2019-02-08T08:55:07.925Z",
+ "birthtime": "2019-02-08T08:55:07.925Z"
+ },
+ {
+ "id": "28c84528-48f8-59b0-ba66-3da2c17fd0a7",
+ "children": [
+ "09df17a3-2377-5cb1-ae72-a42c552bc588"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "b6bb6cf1090c42d50f02d7c66669c898",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/7g4S2QM9_l.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/7g4S2QM9_l.jpg",
+ "relativePath": "images/7g4S2QM9_l.jpg",
+ "extension": "jpg",
+ "size": 129607,
+ "prettySize": "130 kB",
+ "modifiedTime": "2019-02-08T08:55:07.925Z",
+ "accessTime": "2019-02-08T08:55:07.925Z",
+ "changeTime": "2019-02-08T08:55:07.925Z",
+ "birthTime": "2019-02-08T08:55:07.925Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "7g4S2QM9_l.jpg",
+ "ext": ".jpg",
+ "name": "7g4S2QM9_l",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453844,
+ "blocks": 256,
+ "atimeMs": 1549616107924.5935,
+ "mtimeMs": 1549616107924.5935,
+ "ctimeMs": 1549616107924.5935,
+ "birthtimeMs": 1549616107924.5935,
+ "atime": "2019-02-08T08:55:07.925Z",
+ "mtime": "2019-02-08T08:55:07.925Z",
+ "ctime": "2019-02-08T08:55:07.925Z",
+ "birthtime": "2019-02-08T08:55:07.925Z"
+ },
+ {
+ "id": "7d697ee3-2e66-51f6-a386-b1e5d8cf5dba",
+ "children": [
+ "98324bbd-3257-5c70-a3be-e713965f5fa6"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "ad40145e18355345c530559aa46945ad",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/8HcJ7is90a.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/8HcJ7is90a.jpg",
+ "relativePath": "images/8HcJ7is90a.jpg",
+ "extension": "jpg",
+ "size": 104076,
+ "prettySize": "104 kB",
+ "modifiedTime": "2019-02-08T08:55:07.925Z",
+ "accessTime": "2019-02-08T08:55:07.925Z",
+ "changeTime": "2019-02-08T08:55:07.925Z",
+ "birthTime": "2019-02-08T08:55:07.925Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "8HcJ7is90a.jpg",
+ "ext": ".jpg",
+ "name": "8HcJ7is90a",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453845,
+ "blocks": 208,
+ "atimeMs": 1549616107924.5935,
+ "mtimeMs": 1549616107924.5935,
+ "ctimeMs": 1549616107924.5935,
+ "birthtimeMs": 1549616107924.5935,
+ "atime": "2019-02-08T08:55:07.925Z",
+ "mtime": "2019-02-08T08:55:07.925Z",
+ "ctime": "2019-02-08T08:55:07.925Z",
+ "birthtime": "2019-02-08T08:55:07.925Z"
+ },
+ {
+ "id": "83ac87f2-cea9-575a-82bd-51543c082415",
+ "children": [
+ "b6f4d1f7-ddf6-5994-92b4-7a0116275f71"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "830697857fd3bc129303d3068cad20dd",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/BCMVNmFM9yJ.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/BCMVNmFM9yJ.jpg",
+ "relativePath": "images/BCMVNmFM9yJ.jpg",
+ "extension": "jpg",
+ "size": 117148,
+ "prettySize": "117 kB",
+ "modifiedTime": "2019-02-08T08:55:07.928Z",
+ "accessTime": "2019-02-08T08:55:07.928Z",
+ "changeTime": "2019-02-08T08:55:07.928Z",
+ "birthTime": "2019-02-08T08:55:07.928Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "BCMVNmFM9yJ.jpg",
+ "ext": ".jpg",
+ "name": "BCMVNmFM9yJ",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453848,
+ "blocks": 232,
+ "atimeMs": 1549616107927.9268,
+ "mtimeMs": 1549616107927.9268,
+ "ctimeMs": 1549616107927.9268,
+ "birthtimeMs": 1549616107927.9268,
+ "atime": "2019-02-08T08:55:07.928Z",
+ "mtime": "2019-02-08T08:55:07.928Z",
+ "ctime": "2019-02-08T08:55:07.928Z",
+ "birthtime": "2019-02-08T08:55:07.928Z"
+ },
+ {
+ "id": "999e1cb6-9c25-564b-8fe4-e139a71b988c",
+ "children": [
+ "a47b1fe4-1b94-5cf8-9a0f-1a72f48d3c98"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "f783590e0d9d9478f6ce8d6d126a2104",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/BEZprQ3s95w.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/BEZprQ3s95w.jpg",
+ "relativePath": "images/BEZprQ3s95w.jpg",
+ "extension": "jpg",
+ "size": 122754,
+ "prettySize": "123 kB",
+ "modifiedTime": "2019-02-08T08:55:07.928Z",
+ "accessTime": "2019-02-08T08:55:07.928Z",
+ "changeTime": "2019-02-08T08:55:07.928Z",
+ "birthTime": "2019-02-08T08:55:07.928Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "BEZprQ3s95w.jpg",
+ "ext": ".jpg",
+ "name": "BEZprQ3s95w",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453849,
+ "blocks": 240,
+ "atimeMs": 1549616107927.9268,
+ "mtimeMs": 1549616107927.9268,
+ "ctimeMs": 1549616107927.9268,
+ "birthtimeMs": 1549616107927.9268,
+ "atime": "2019-02-08T08:55:07.928Z",
+ "mtime": "2019-02-08T08:55:07.928Z",
+ "ctime": "2019-02-08T08:55:07.928Z",
+ "birthtime": "2019-02-08T08:55:07.928Z"
+ },
+ {
+ "id": "dbee0e06-cc3e-5d80-8099-182acbf084d2",
+ "children": [
+ "af0788ba-9b32-5ca7-9080-bad0a49b22c6"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "6661c542bb747a61d808f6745f64716e",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/BKwuIApgkKJ.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/BKwuIApgkKJ.jpg",
+ "relativePath": "images/BKwuIApgkKJ.jpg",
+ "extension": "jpg",
+ "size": 83747,
+ "prettySize": "83.7 kB",
+ "modifiedTime": "2019-02-08T08:55:07.931Z",
+ "accessTime": "2019-02-08T08:55:07.931Z",
+ "changeTime": "2019-02-08T08:55:07.931Z",
+ "birthTime": "2019-02-08T08:55:07.931Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "BKwuIApgkKJ.jpg",
+ "ext": ".jpg",
+ "name": "BKwuIApgkKJ",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453852,
+ "blocks": 168,
+ "atimeMs": 1549616107931.2603,
+ "mtimeMs": 1549616107931.2603,
+ "ctimeMs": 1549616107931.2603,
+ "birthtimeMs": 1549616107931.2603,
+ "atime": "2019-02-08T08:55:07.931Z",
+ "mtime": "2019-02-08T08:55:07.931Z",
+ "ctime": "2019-02-08T08:55:07.931Z",
+ "birthtime": "2019-02-08T08:55:07.931Z"
+ },
+ {
+ "id": "7c1a6eea-05e7-5024-9926-36b68de7aa11",
+ "children": [
+ "f5f0e564-899f-5bbc-92de-a2325b69cb75"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "787ec91c0900453445c1777845387089",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/BShF_8qhtEv.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/BShF_8qhtEv.jpg",
+ "relativePath": "images/BShF_8qhtEv.jpg",
+ "extension": "jpg",
+ "size": 122085,
+ "prettySize": "122 kB",
+ "modifiedTime": "2019-02-08T08:55:07.935Z",
+ "accessTime": "2019-02-08T08:55:07.931Z",
+ "changeTime": "2019-02-08T08:55:07.935Z",
+ "birthTime": "2019-02-08T08:55:07.935Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "BShF_8qhtEv.jpg",
+ "ext": ".jpg",
+ "name": "BShF_8qhtEv",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453856,
+ "blocks": 240,
+ "atimeMs": 1549616107931.2603,
+ "mtimeMs": 1549616107934.5935,
+ "ctimeMs": 1549616107934.5935,
+ "birthtimeMs": 1549616107934.5935,
+ "atime": "2019-02-08T08:55:07.931Z",
+ "mtime": "2019-02-08T08:55:07.935Z",
+ "ctime": "2019-02-08T08:55:07.935Z",
+ "birthtime": "2019-02-08T08:55:07.935Z"
+ },
+ {
+ "id": "67493e72-7ae8-572d-8cf1-5b6fb600dd8b",
+ "children": [
+ "630d597e-cb8d-5eb2-9858-ff9cd89de40f"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "53d1a945465e41017425f1b19ae140f3",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/BUHUK6ElhF1.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/BUHUK6ElhF1.jpg",
+ "relativePath": "images/BUHUK6ElhF1.jpg",
+ "extension": "jpg",
+ "size": 100374,
+ "prettySize": "100 kB",
+ "modifiedTime": "2019-02-08T08:55:07.935Z",
+ "accessTime": "2019-02-08T08:55:07.935Z",
+ "changeTime": "2019-02-08T08:55:07.935Z",
+ "birthTime": "2019-02-08T08:55:07.935Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "BUHUK6ElhF1.jpg",
+ "ext": ".jpg",
+ "name": "BUHUK6ElhF1",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453857,
+ "blocks": 200,
+ "atimeMs": 1549616107934.5935,
+ "mtimeMs": 1549616107934.5935,
+ "ctimeMs": 1549616107934.5935,
+ "birthtimeMs": 1549616107934.5935,
+ "atime": "2019-02-08T08:55:07.935Z",
+ "mtime": "2019-02-08T08:55:07.935Z",
+ "ctime": "2019-02-08T08:55:07.935Z",
+ "birthtime": "2019-02-08T08:55:07.935Z"
+ },
+ {
+ "id": "090efc09-4260-50c7-a541-ecebe1d1aa6e",
+ "children": [
+ "6ba97198-5331-53d6-a0e0-c9c063c5094e"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "77d150d429e4a17804959337a1b7aa79",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/BY6B8z5lR1F.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/BY6B8z5lR1F.jpg",
+ "relativePath": "images/BY6B8z5lR1F.jpg",
+ "extension": "jpg",
+ "size": 80980,
+ "prettySize": "81 kB",
+ "modifiedTime": "2019-02-08T08:55:07.935Z",
+ "accessTime": "2019-02-08T08:55:07.935Z",
+ "changeTime": "2019-02-08T08:55:07.935Z",
+ "birthTime": "2019-02-08T08:55:07.935Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "BY6B8z5lR1F.jpg",
+ "ext": ".jpg",
+ "name": "BY6B8z5lR1F",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453860,
+ "blocks": 160,
+ "atimeMs": 1549616107934.5935,
+ "mtimeMs": 1549616107934.5935,
+ "ctimeMs": 1549616107934.5935,
+ "birthtimeMs": 1549616107934.5935,
+ "atime": "2019-02-08T08:55:07.935Z",
+ "mtime": "2019-02-08T08:55:07.935Z",
+ "ctime": "2019-02-08T08:55:07.935Z",
+ "birthtime": "2019-02-08T08:55:07.935Z"
+ },
+ {
+ "id": "3cba6722-5053-5298-b2fb-32a4a9cc44aa",
+ "children": [
+ "cdd5a1b7-b7d8-507e-8d66-6ebf484592fc"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "93f646b8ddec29b5f8d8e071f6381be7",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/T4ygWXs98-.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/T4ygWXs98-.jpg",
+ "relativePath": "images/T4ygWXs98-.jpg",
+ "extension": "jpg",
+ "size": 102293,
+ "prettySize": "102 kB",
+ "modifiedTime": "2019-02-08T08:55:07.938Z",
+ "accessTime": "2019-02-08T08:55:07.938Z",
+ "changeTime": "2019-02-08T08:55:07.938Z",
+ "birthTime": "2019-02-08T08:55:07.938Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "T4ygWXs98-.jpg",
+ "ext": ".jpg",
+ "name": "T4ygWXs98-",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453864,
+ "blocks": 200,
+ "atimeMs": 1549616107937.9268,
+ "mtimeMs": 1549616107937.9268,
+ "ctimeMs": 1549616107937.9268,
+ "birthtimeMs": 1549616107937.9268,
+ "atime": "2019-02-08T08:55:07.938Z",
+ "mtime": "2019-02-08T08:55:07.938Z",
+ "ctime": "2019-02-08T08:55:07.938Z",
+ "birthtime": "2019-02-08T08:55:07.938Z"
+ },
+ {
+ "id": "d49a67c2-a204-598d-908f-7a00b225745e",
+ "children": [
+ "b0d46bbe-d4b8-568e-9323-215b2bf6f4fd"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "245770f51f9bad853b90b8edaeab3c1e",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/T4zsrIs9-b.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/T4zsrIs9-b.jpg",
+ "relativePath": "images/T4zsrIs9-b.jpg",
+ "extension": "jpg",
+ "size": 95894,
+ "prettySize": "95.9 kB",
+ "modifiedTime": "2019-02-08T08:55:07.938Z",
+ "accessTime": "2019-02-08T08:55:07.938Z",
+ "changeTime": "2019-02-08T08:55:07.938Z",
+ "birthTime": "2019-02-08T08:55:07.938Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "T4zsrIs9-b.jpg",
+ "ext": ".jpg",
+ "name": "T4zsrIs9-b",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453865,
+ "blocks": 192,
+ "atimeMs": 1549616107937.9268,
+ "mtimeMs": 1549616107937.9268,
+ "ctimeMs": 1549616107937.9268,
+ "birthtimeMs": 1549616107937.9268,
+ "atime": "2019-02-08T08:55:07.938Z",
+ "mtime": "2019-02-08T08:55:07.938Z",
+ "ctime": "2019-02-08T08:55:07.938Z",
+ "birthtime": "2019-02-08T08:55:07.938Z"
+ },
+ {
+ "id": "07472021-5400-5e27-b461-4cdc44276afd",
+ "children": [
+ "da85ad45-2a90-5615-9cfa-007e5439f117"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "eda1d3a40ea2a822f776f57ccf5314a4",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/Tq2ITZs9x6.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/Tq2ITZs9x6.jpg",
+ "relativePath": "images/Tq2ITZs9x6.jpg",
+ "extension": "jpg",
+ "size": 126202,
+ "prettySize": "126 kB",
+ "modifiedTime": "2019-02-08T08:55:07.938Z",
+ "accessTime": "2019-02-08T08:55:07.938Z",
+ "changeTime": "2019-02-08T08:55:07.938Z",
+ "birthTime": "2019-02-08T08:55:07.938Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "Tq2ITZs9x6.jpg",
+ "ext": ".jpg",
+ "name": "Tq2ITZs9x6",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453866,
+ "blocks": 248,
+ "atimeMs": 1549616107937.9268,
+ "mtimeMs": 1549616107937.9268,
+ "ctimeMs": 1549616107937.9268,
+ "birthtimeMs": 1549616107937.9268,
+ "atime": "2019-02-08T08:55:07.938Z",
+ "mtime": "2019-02-08T08:55:07.938Z",
+ "ctime": "2019-02-08T08:55:07.938Z",
+ "birthtime": "2019-02-08T08:55:07.938Z"
+ },
+ {
+ "id": "456af405-df25-5607-bdaf-8f502011b101",
+ "children": [
+ "dafc0c89-ea55-502d-8a01-62798c6d6b54"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "57f55da8c14230ad75372ec4a6effcb7",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/VlFCais9_U.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/VlFCais9_U.jpg",
+ "relativePath": "images/VlFCais9_U.jpg",
+ "extension": "jpg",
+ "size": 79650,
+ "prettySize": "79.7 kB",
+ "modifiedTime": "2019-02-08T08:55:07.938Z",
+ "accessTime": "2019-02-08T08:55:07.938Z",
+ "changeTime": "2019-02-08T08:55:07.938Z",
+ "birthTime": "2019-02-08T08:55:07.938Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "VlFCais9_U.jpg",
+ "ext": ".jpg",
+ "name": "VlFCais9_U",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453868,
+ "blocks": 160,
+ "atimeMs": 1549616107937.9268,
+ "mtimeMs": 1549616107937.9268,
+ "ctimeMs": 1549616107937.9268,
+ "birthtimeMs": 1549616107937.9268,
+ "atime": "2019-02-08T08:55:07.938Z",
+ "mtime": "2019-02-08T08:55:07.938Z",
+ "ctime": "2019-02-08T08:55:07.938Z",
+ "birthtime": "2019-02-08T08:55:07.938Z"
+ },
+ {
+ "id": "9b7fd7a3-7a98-53e9-9ab6-1889b03203e6",
+ "children": [
+ "4e7c08cd-45c8-5648-a56e-3367f115082e"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "6577ed66bb1cd75d133b10dadeb07a06",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/WBNdvKs9-x.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/WBNdvKs9-x.jpg",
+ "relativePath": "images/WBNdvKs9-x.jpg",
+ "extension": "jpg",
+ "size": 104812,
+ "prettySize": "105 kB",
+ "modifiedTime": "2019-02-08T08:55:07.941Z",
+ "accessTime": "2019-02-08T08:55:07.941Z",
+ "changeTime": "2019-02-08T08:55:07.941Z",
+ "birthTime": "2019-02-08T08:55:07.941Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "WBNdvKs9-x.jpg",
+ "ext": ".jpg",
+ "name": "WBNdvKs9-x",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453870,
+ "blocks": 208,
+ "atimeMs": 1549616107941.2603,
+ "mtimeMs": 1549616107941.2603,
+ "ctimeMs": 1549616107941.2603,
+ "birthtimeMs": 1549616107941.2603,
+ "atime": "2019-02-08T08:55:07.941Z",
+ "mtime": "2019-02-08T08:55:07.941Z",
+ "ctime": "2019-02-08T08:55:07.941Z",
+ "birthtime": "2019-02-08T08:55:07.941Z"
+ },
+ {
+ "id": "7a5888c5-e8b7-5aae-86fa-8efab6abb379",
+ "children": [
+ "2ff71dde-ecb7-59ec-b168-dd9c55f7559f"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "893254689a3fbcff68226bfd83570a5a",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/WVE_9as9-Z.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/WVE_9as9-Z.jpg",
+ "relativePath": "images/WVE_9as9-Z.jpg",
+ "extension": "jpg",
+ "size": 123346,
+ "prettySize": "123 kB",
+ "modifiedTime": "2019-02-08T08:55:07.941Z",
+ "accessTime": "2019-02-08T08:55:07.941Z",
+ "changeTime": "2019-02-08T08:55:07.941Z",
+ "birthTime": "2019-02-08T08:55:07.941Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "WVE_9as9-Z.jpg",
+ "ext": ".jpg",
+ "name": "WVE_9as9-Z",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453871,
+ "blocks": 248,
+ "atimeMs": 1549616107941.2603,
+ "mtimeMs": 1549616107941.2603,
+ "ctimeMs": 1549616107941.2603,
+ "birthtimeMs": 1549616107941.2603,
+ "atime": "2019-02-08T08:55:07.941Z",
+ "mtime": "2019-02-08T08:55:07.941Z",
+ "ctime": "2019-02-08T08:55:07.941Z",
+ "birthtime": "2019-02-08T08:55:07.941Z"
+ },
+ {
+ "id": "905eb070-4deb-5d58-8481-35d2e15b5a79",
+ "children": [
+ "897bfc21-4f6a-5468-85ec-32290c1d0cd8"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "6d5b3dcd65cec1eddb1d1b8b692d6046",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/YDPr3BM9yC.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/YDPr3BM9yC.jpg",
+ "relativePath": "images/YDPr3BM9yC.jpg",
+ "extension": "jpg",
+ "size": 129018,
+ "prettySize": "129 kB",
+ "modifiedTime": "2019-02-08T08:55:07.941Z",
+ "accessTime": "2019-02-08T08:55:07.941Z",
+ "changeTime": "2019-02-08T08:55:07.941Z",
+ "birthTime": "2019-02-08T08:55:07.941Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "YDPr3BM9yC.jpg",
+ "ext": ".jpg",
+ "name": "YDPr3BM9yC",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453875,
+ "blocks": 256,
+ "atimeMs": 1549616107941.2603,
+ "mtimeMs": 1549616107941.2603,
+ "ctimeMs": 1549616107941.2603,
+ "birthtimeMs": 1549616107941.2603,
+ "atime": "2019-02-08T08:55:07.941Z",
+ "mtime": "2019-02-08T08:55:07.941Z",
+ "ctime": "2019-02-08T08:55:07.941Z",
+ "birthtime": "2019-02-08T08:55:07.941Z"
+ },
+ {
+ "id": "cfddc65a-4b9b-5019-ab64-0e2132cf3ec3",
+ "children": [
+ "2fd9b628-48a9-55fd-ad58-9d96fe093a77"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "4952f588e9d3a6bbc23aa89be0360a6e",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/Zt6drmM96I.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/Zt6drmM96I.jpg",
+ "relativePath": "images/Zt6drmM96I.jpg",
+ "extension": "jpg",
+ "size": 71363,
+ "prettySize": "71.4 kB",
+ "modifiedTime": "2019-02-08T08:55:07.945Z",
+ "accessTime": "2019-02-08T08:55:07.945Z",
+ "changeTime": "2019-02-08T08:55:07.945Z",
+ "birthTime": "2019-02-08T08:55:07.945Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "Zt6drmM96I.jpg",
+ "ext": ".jpg",
+ "name": "Zt6drmM96I",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453878,
+ "blocks": 144,
+ "atimeMs": 1549616107944.5935,
+ "mtimeMs": 1549616107944.5935,
+ "ctimeMs": 1549616107944.5935,
+ "birthtimeMs": 1549616107944.5935,
+ "atime": "2019-02-08T08:55:07.945Z",
+ "mtime": "2019-02-08T08:55:07.945Z",
+ "ctime": "2019-02-08T08:55:07.945Z",
+ "birthtime": "2019-02-08T08:55:07.945Z"
+ },
+ {
+ "id": "a95d071f-2ba7-5e05-8371-07afd027e5a8",
+ "children": [
+ "1d700556-4c15-52b4-96a1-80881c888aa6"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "9fd68751ddb126a1850940108cb6521a",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/Zt65eQs96z.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/Zt65eQs96z.jpg",
+ "relativePath": "images/Zt65eQs96z.jpg",
+ "extension": "jpg",
+ "size": 81626,
+ "prettySize": "81.6 kB",
+ "modifiedTime": "2019-02-08T08:55:07.945Z",
+ "accessTime": "2019-02-08T08:55:07.945Z",
+ "changeTime": "2019-02-08T08:55:07.945Z",
+ "birthTime": "2019-02-08T08:55:07.945Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "Zt65eQs96z.jpg",
+ "ext": ".jpg",
+ "name": "Zt65eQs96z",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453877,
+ "blocks": 160,
+ "atimeMs": 1549616107944.5935,
+ "mtimeMs": 1549616107944.5935,
+ "ctimeMs": 1549616107944.5935,
+ "birthtimeMs": 1549616107944.5935,
+ "atime": "2019-02-08T08:55:07.945Z",
+ "mtime": "2019-02-08T08:55:07.945Z",
+ "ctime": "2019-02-08T08:55:07.945Z",
+ "birthtime": "2019-02-08T08:55:07.945Z"
+ },
+ {
+ "id": "2e21897a-06bb-5271-81e1-62850e7937ac",
+ "children": [
+ "93ad2692-82e1-5c38-99f3-d388530ec676"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "c31dc82f9d0047241bbeb1d94f57754e",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/baIXGhs99Z.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/baIXGhs99Z.jpg",
+ "relativePath": "images/baIXGhs99Z.jpg",
+ "extension": "jpg",
+ "size": 130596,
+ "prettySize": "131 kB",
+ "modifiedTime": "2019-02-08T08:55:07.945Z",
+ "accessTime": "2019-02-08T08:55:07.945Z",
+ "changeTime": "2019-02-08T08:55:07.945Z",
+ "birthTime": "2019-02-08T08:55:07.945Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "baIXGhs99Z.jpg",
+ "ext": ".jpg",
+ "name": "baIXGhs99Z",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453881,
+ "blocks": 256,
+ "atimeMs": 1549616107944.5935,
+ "mtimeMs": 1549616107944.5935,
+ "ctimeMs": 1549616107944.5935,
+ "birthtimeMs": 1549616107944.5935,
+ "atime": "2019-02-08T08:55:07.945Z",
+ "mtime": "2019-02-08T08:55:07.945Z",
+ "ctime": "2019-02-08T08:55:07.945Z",
+ "birthtime": "2019-02-08T08:55:07.945Z"
+ },
+ {
+ "id": "b5aea16f-3162-5ea1-ab5a-e493b38043e8",
+ "children": [
+ "d7aa2b29-5e4a-5ae5-ab52-9defa7b95918"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "fd4bcbf421b4b2bd8087a6e01e042e45",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/cpKHxyM97Q.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/cpKHxyM97Q.jpg",
+ "relativePath": "images/cpKHxyM97Q.jpg",
+ "extension": "jpg",
+ "size": 122883,
+ "prettySize": "123 kB",
+ "modifiedTime": "2019-02-08T08:55:07.945Z",
+ "accessTime": "2019-02-08T08:55:07.945Z",
+ "changeTime": "2019-02-08T08:55:07.945Z",
+ "birthTime": "2019-02-08T08:55:07.945Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "cpKHxyM97Q.jpg",
+ "ext": ".jpg",
+ "name": "cpKHxyM97Q",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453883,
+ "blocks": 248,
+ "atimeMs": 1549616107944.5935,
+ "mtimeMs": 1549616107944.5935,
+ "ctimeMs": 1549616107944.5935,
+ "birthtimeMs": 1549616107944.5935,
+ "atime": "2019-02-08T08:55:07.945Z",
+ "mtime": "2019-02-08T08:55:07.945Z",
+ "ctime": "2019-02-08T08:55:07.945Z",
+ "birthtime": "2019-02-08T08:55:07.945Z"
+ },
+ {
+ "id": "c95ff874-a15f-5f6b-98b7-1566ac1e9bc6",
+ "children": [
+ "0e4486ff-f98f-5c92-a706-f69d1edcbe7c"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "25d4c3e99e97d8320700e1c29aab95d6",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/dUiIWFM99E.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/dUiIWFM99E.jpg",
+ "relativePath": "images/dUiIWFM99E.jpg",
+ "extension": "jpg",
+ "size": 97838,
+ "prettySize": "97.8 kB",
+ "modifiedTime": "2019-02-08T08:55:07.948Z",
+ "accessTime": "2019-02-08T08:55:07.948Z",
+ "changeTime": "2019-02-08T08:55:07.948Z",
+ "birthTime": "2019-02-08T08:55:07.948Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "dUiIWFM99E.jpg",
+ "ext": ".jpg",
+ "name": "dUiIWFM99E",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453885,
+ "blocks": 192,
+ "atimeMs": 1549616107947.9268,
+ "mtimeMs": 1549616107947.9268,
+ "ctimeMs": 1549616107947.9268,
+ "birthtimeMs": 1549616107947.9268,
+ "atime": "2019-02-08T08:55:07.948Z",
+ "mtime": "2019-02-08T08:55:07.948Z",
+ "ctime": "2019-02-08T08:55:07.948Z",
+ "birthtime": "2019-02-08T08:55:07.948Z"
+ },
+ {
+ "id": "6dab4fa2-e99b-5f01-954e-d8521cb12b6f",
+ "children": [
+ "33370589-de2f-55a7-8e5c-ea4f5ffd0cf0"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "779287fe3b4bc4db813afd7adb213e4f",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/dUiblpM990.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/dUiblpM990.jpg",
+ "relativePath": "images/dUiblpM990.jpg",
+ "extension": "jpg",
+ "size": 116202,
+ "prettySize": "116 kB",
+ "modifiedTime": "2019-02-08T08:55:07.948Z",
+ "accessTime": "2019-02-08T08:55:07.948Z",
+ "changeTime": "2019-02-08T08:55:07.948Z",
+ "birthTime": "2019-02-08T08:55:07.948Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "dUiblpM990.jpg",
+ "ext": ".jpg",
+ "name": "dUiblpM990",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453886,
+ "blocks": 232,
+ "atimeMs": 1549616107947.9268,
+ "mtimeMs": 1549616107947.9268,
+ "ctimeMs": 1549616107947.9268,
+ "birthtimeMs": 1549616107947.9268,
+ "atime": "2019-02-08T08:55:07.948Z",
+ "mtime": "2019-02-08T08:55:07.948Z",
+ "ctime": "2019-02-08T08:55:07.948Z",
+ "birthtime": "2019-02-08T08:55:07.948Z"
+ },
+ {
+ "id": "6f5ab75b-4ba7-50e4-ad4f-cc8357f6155e",
+ "children": [
+ "74b20d30-e241-58cf-8d3e-1d25e263f3ba"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "beabcb86762d72aaa391ca3d3bacf50f",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/dac9QCs96Z.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/dac9QCs96Z.jpg",
+ "relativePath": "images/dac9QCs96Z.jpg",
+ "extension": "jpg",
+ "size": 97984,
+ "prettySize": "98 kB",
+ "modifiedTime": "2019-02-08T08:55:07.948Z",
+ "accessTime": "2019-02-08T08:55:07.948Z",
+ "changeTime": "2019-02-08T08:55:07.948Z",
+ "birthTime": "2019-02-08T08:55:07.948Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "dac9QCs96Z.jpg",
+ "ext": ".jpg",
+ "name": "dac9QCs96Z",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453888,
+ "blocks": 192,
+ "atimeMs": 1549616107947.9268,
+ "mtimeMs": 1549616107947.9268,
+ "ctimeMs": 1549616107947.9268,
+ "birthtimeMs": 1549616107947.9268,
+ "atime": "2019-02-08T08:55:07.948Z",
+ "mtime": "2019-02-08T08:55:07.948Z",
+ "ctime": "2019-02-08T08:55:07.948Z",
+ "birthtime": "2019-02-08T08:55:07.948Z"
+ },
+ {
+ "id": "8d8852d5-d464-5153-b1fe-afc94b70d0a1",
+ "children": [],
+ "parent": "632c83c7-e76d-5478-8863-fc5a593f7119",
+ "internal": {
+ "contentDigest": "e6879945b14d6234875718df657b8beb",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "39d3bdcd-5adf-5f04-83b5-40c4e7dc60d5",
+ "children": [],
+ "parent": "cfedef16-1f17-5489-aea7-61529e33d160",
+ "internal": {
+ "contentDigest": "5c7a76710cb2f7e4d3f2f2ebe64f628d",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "9fdf7ff2-9e51-5c2c-90cf-4c3a4af4e6b4",
+ "children": [],
+ "parent": "a03bf39a-da09-5c14-9cf6-103c439f3472",
+ "internal": {
+ "contentDigest": "30c7fb1607938caece1719e539c54154",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "0b06bdfe-f253-5859-8321-b42b5d737195",
+ "children": [],
+ "parent": "5fb18353-ad2b-55d6-8f8b-365ab131d348",
+ "internal": {
+ "contentDigest": "d41e8de7afad8820915adf302f4bce27",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "4abaade8-8f68-5bbb-9e81-798fa66a160d",
+ "children": [],
+ "parent": "eadfe4c4-6636-55b1-95ee-b24faa4d46f3",
+ "internal": {
+ "contentDigest": "b648f5c6b4dd19a1e20f59eab97dcccb",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "e6681fae-b509-5472-a7e4-077f9038072f",
+ "children": [],
+ "parent": "e882dc2b-8f14-576e-8f17-a491cd037251",
+ "internal": {
+ "contentDigest": "9af0ebae8944fcbeb03e57571babe823",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "e3621331-a649-549c-bee4-a9d9bd112e47",
+ "children": [],
+ "parent": "5bc47ad3-c074-5e02-be9b-0150d6322b2c",
+ "internal": {
+ "contentDigest": "c99a72470ab736db7b1546334122f456",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "09df17a3-2377-5cb1-ae72-a42c552bc588",
+ "children": [],
+ "parent": "28c84528-48f8-59b0-ba66-3da2c17fd0a7",
+ "internal": {
+ "contentDigest": "b6bb6cf1090c42d50f02d7c66669c898",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "98324bbd-3257-5c70-a3be-e713965f5fa6",
+ "children": [],
+ "parent": "7d697ee3-2e66-51f6-a386-b1e5d8cf5dba",
+ "internal": {
+ "contentDigest": "ad40145e18355345c530559aa46945ad",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "b6f4d1f7-ddf6-5994-92b4-7a0116275f71",
+ "children": [],
+ "parent": "83ac87f2-cea9-575a-82bd-51543c082415",
+ "internal": {
+ "contentDigest": "830697857fd3bc129303d3068cad20dd",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "a47b1fe4-1b94-5cf8-9a0f-1a72f48d3c98",
+ "children": [],
+ "parent": "999e1cb6-9c25-564b-8fe4-e139a71b988c",
+ "internal": {
+ "contentDigest": "f783590e0d9d9478f6ce8d6d126a2104",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "af0788ba-9b32-5ca7-9080-bad0a49b22c6",
+ "children": [],
+ "parent": "dbee0e06-cc3e-5d80-8099-182acbf084d2",
+ "internal": {
+ "contentDigest": "6661c542bb747a61d808f6745f64716e",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "f5f0e564-899f-5bbc-92de-a2325b69cb75",
+ "children": [],
+ "parent": "7c1a6eea-05e7-5024-9926-36b68de7aa11",
+ "internal": {
+ "contentDigest": "787ec91c0900453445c1777845387089",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "630d597e-cb8d-5eb2-9858-ff9cd89de40f",
+ "children": [],
+ "parent": "67493e72-7ae8-572d-8cf1-5b6fb600dd8b",
+ "internal": {
+ "contentDigest": "53d1a945465e41017425f1b19ae140f3",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "6ba97198-5331-53d6-a0e0-c9c063c5094e",
+ "children": [],
+ "parent": "090efc09-4260-50c7-a541-ecebe1d1aa6e",
+ "internal": {
+ "contentDigest": "77d150d429e4a17804959337a1b7aa79",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "cdd5a1b7-b7d8-507e-8d66-6ebf484592fc",
+ "children": [],
+ "parent": "3cba6722-5053-5298-b2fb-32a4a9cc44aa",
+ "internal": {
+ "contentDigest": "93f646b8ddec29b5f8d8e071f6381be7",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "b0d46bbe-d4b8-568e-9323-215b2bf6f4fd",
+ "children": [],
+ "parent": "d49a67c2-a204-598d-908f-7a00b225745e",
+ "internal": {
+ "contentDigest": "245770f51f9bad853b90b8edaeab3c1e",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "da85ad45-2a90-5615-9cfa-007e5439f117",
+ "children": [],
+ "parent": "07472021-5400-5e27-b461-4cdc44276afd",
+ "internal": {
+ "contentDigest": "eda1d3a40ea2a822f776f57ccf5314a4",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "dafc0c89-ea55-502d-8a01-62798c6d6b54",
+ "children": [],
+ "parent": "456af405-df25-5607-bdaf-8f502011b101",
+ "internal": {
+ "contentDigest": "57f55da8c14230ad75372ec4a6effcb7",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "4e7c08cd-45c8-5648-a56e-3367f115082e",
+ "children": [],
+ "parent": "9b7fd7a3-7a98-53e9-9ab6-1889b03203e6",
+ "internal": {
+ "contentDigest": "6577ed66bb1cd75d133b10dadeb07a06",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "2ff71dde-ecb7-59ec-b168-dd9c55f7559f",
+ "children": [],
+ "parent": "7a5888c5-e8b7-5aae-86fa-8efab6abb379",
+ "internal": {
+ "contentDigest": "893254689a3fbcff68226bfd83570a5a",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "897bfc21-4f6a-5468-85ec-32290c1d0cd8",
+ "children": [],
+ "parent": "905eb070-4deb-5d58-8481-35d2e15b5a79",
+ "internal": {
+ "contentDigest": "6d5b3dcd65cec1eddb1d1b8b692d6046",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "2fd9b628-48a9-55fd-ad58-9d96fe093a77",
+ "children": [],
+ "parent": "cfddc65a-4b9b-5019-ab64-0e2132cf3ec3",
+ "internal": {
+ "contentDigest": "4952f588e9d3a6bbc23aa89be0360a6e",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "1d700556-4c15-52b4-96a1-80881c888aa6",
+ "children": [],
+ "parent": "a95d071f-2ba7-5e05-8371-07afd027e5a8",
+ "internal": {
+ "contentDigest": "9fd68751ddb126a1850940108cb6521a",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "93ad2692-82e1-5c38-99f3-d388530ec676",
+ "children": [],
+ "parent": "2e21897a-06bb-5271-81e1-62850e7937ac",
+ "internal": {
+ "contentDigest": "c31dc82f9d0047241bbeb1d94f57754e",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "d7aa2b29-5e4a-5ae5-ab52-9defa7b95918",
+ "children": [],
+ "parent": "b5aea16f-3162-5ea1-ab5a-e493b38043e8",
+ "internal": {
+ "contentDigest": "fd4bcbf421b4b2bd8087a6e01e042e45",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "0e4486ff-f98f-5c92-a706-f69d1edcbe7c",
+ "children": [],
+ "parent": "c95ff874-a15f-5f6b-98b7-1566ac1e9bc6",
+ "internal": {
+ "contentDigest": "25d4c3e99e97d8320700e1c29aab95d6",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "33370589-de2f-55a7-8e5c-ea4f5ffd0cf0",
+ "children": [],
+ "parent": "6dab4fa2-e99b-5f01-954e-d8521cb12b6f",
+ "internal": {
+ "contentDigest": "779287fe3b4bc4db813afd7adb213e4f",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "74b20d30-e241-58cf-8d3e-1d25e263f3ba",
+ "children": [],
+ "parent": "6f5ab75b-4ba7-50e4-ad4f-cc8357f6155e",
+ "internal": {
+ "contentDigest": "beabcb86762d72aaa391ca3d3bacf50f",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "25bfb17b-4867-52b0-b6b2-31141ffd66ea",
+ "children": [
+ "da2bca11-40c5-5629-8ac5-d4e80b3002e7"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "12d6834787247fa1fd603472dca4779b",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/daf92Rs9wJ.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/daf92Rs9wJ.jpg",
+ "relativePath": "images/daf92Rs9wJ.jpg",
+ "extension": "jpg",
+ "size": 91071,
+ "prettySize": "91.1 kB",
+ "modifiedTime": "2019-02-08T08:55:07.948Z",
+ "accessTime": "2019-02-08T08:55:07.948Z",
+ "changeTime": "2019-02-08T08:55:07.948Z",
+ "birthTime": "2019-02-08T08:55:07.948Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "daf92Rs9wJ.jpg",
+ "ext": ".jpg",
+ "name": "daf92Rs9wJ",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453889,
+ "blocks": 184,
+ "atimeMs": 1549616107947.9268,
+ "mtimeMs": 1549616107947.9268,
+ "ctimeMs": 1549616107947.9268,
+ "birthtimeMs": 1549616107947.9268,
+ "atime": "2019-02-08T08:55:07.948Z",
+ "mtime": "2019-02-08T08:55:07.948Z",
+ "ctime": "2019-02-08T08:55:07.948Z",
+ "birthtime": "2019-02-08T08:55:07.948Z"
+ },
+ {
+ "id": "b35cc487-b060-5849-a332-ae2b6214b30b",
+ "children": [
+ "c364338a-eb65-5925-a014-effd93849b40"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "113c46804bc8908ced0a7bd6c7d24f7b",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/goTReQM95o.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/goTReQM95o.jpg",
+ "relativePath": "images/goTReQM95o.jpg",
+ "extension": "jpg",
+ "size": 118621,
+ "prettySize": "119 kB",
+ "modifiedTime": "2019-02-08T08:55:07.948Z",
+ "accessTime": "2019-02-08T08:55:07.948Z",
+ "changeTime": "2019-02-08T08:55:07.948Z",
+ "birthTime": "2019-02-08T08:55:07.948Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "goTReQM95o.jpg",
+ "ext": ".jpg",
+ "name": "goTReQM95o",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453891,
+ "blocks": 232,
+ "atimeMs": 1549616107947.9268,
+ "mtimeMs": 1549616107947.9268,
+ "ctimeMs": 1549616107947.9268,
+ "birthtimeMs": 1549616107947.9268,
+ "atime": "2019-02-08T08:55:07.948Z",
+ "mtime": "2019-02-08T08:55:07.948Z",
+ "ctime": "2019-02-08T08:55:07.948Z",
+ "birthtime": "2019-02-08T08:55:07.948Z"
+ },
+ {
+ "id": "63209335-2764-5ec8-b050-ab0acf938a05",
+ "children": [
+ "4d9816a7-3885-5dd4-bbe6-85c655a48316"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "fce6b57d4f233faed53317605e60455e",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/h9ZrIms9y_.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/h9ZrIms9y_.jpg",
+ "relativePath": "images/h9ZrIms9y_.jpg",
+ "extension": "jpg",
+ "size": 79925,
+ "prettySize": "79.9 kB",
+ "modifiedTime": "2019-02-08T08:55:07.948Z",
+ "accessTime": "2019-02-08T08:55:07.948Z",
+ "changeTime": "2019-02-08T08:55:07.948Z",
+ "birthTime": "2019-02-08T08:55:07.948Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "h9ZrIms9y_.jpg",
+ "ext": ".jpg",
+ "name": "h9ZrIms9y_",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453892,
+ "blocks": 160,
+ "atimeMs": 1549616107947.9268,
+ "mtimeMs": 1549616107947.9268,
+ "ctimeMs": 1549616107947.9268,
+ "birthtimeMs": 1549616107947.9268,
+ "atime": "2019-02-08T08:55:07.948Z",
+ "mtime": "2019-02-08T08:55:07.948Z",
+ "ctime": "2019-02-08T08:55:07.948Z",
+ "birthtime": "2019-02-08T08:55:07.948Z"
+ },
+ {
+ "id": "91d496c3-3368-5810-811f-7523e45582dd",
+ "children": [
+ "442f41c4-bbf2-5124-8602-f242880c593f"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "a9f1eea7376c2d4c9f366f8750fc9623",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/hKxaEXs96v.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/hKxaEXs96v.jpg",
+ "relativePath": "images/hKxaEXs96v.jpg",
+ "extension": "jpg",
+ "size": 117417,
+ "prettySize": "117 kB",
+ "modifiedTime": "2019-02-08T08:55:07.951Z",
+ "accessTime": "2019-02-08T08:55:07.951Z",
+ "changeTime": "2019-02-08T08:55:07.951Z",
+ "birthTime": "2019-02-08T08:55:07.951Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "hKxaEXs96v.jpg",
+ "ext": ".jpg",
+ "name": "hKxaEXs96v",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453894,
+ "blocks": 232,
+ "atimeMs": 1549616107951.2603,
+ "mtimeMs": 1549616107951.2603,
+ "ctimeMs": 1549616107951.2603,
+ "birthtimeMs": 1549616107951.2603,
+ "atime": "2019-02-08T08:55:07.951Z",
+ "mtime": "2019-02-08T08:55:07.951Z",
+ "ctime": "2019-02-08T08:55:07.951Z",
+ "birthtime": "2019-02-08T08:55:07.951Z"
+ },
+ {
+ "id": "605ea709-2f6b-5c32-84dd-c01d1d764a55",
+ "children": [
+ "adb8e4b2-34ed-5f31-b6d7-60b144c100d3"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "a7680535f18d909cdf3f60908dedc9bb",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/hhkRxns97X.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/hhkRxns97X.jpg",
+ "relativePath": "images/hhkRxns97X.jpg",
+ "extension": "jpg",
+ "size": 81083,
+ "prettySize": "81.1 kB",
+ "modifiedTime": "2019-02-08T08:55:07.951Z",
+ "accessTime": "2019-02-08T08:55:07.951Z",
+ "changeTime": "2019-02-08T08:55:07.951Z",
+ "birthTime": "2019-02-08T08:55:07.951Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "hhkRxns97X.jpg",
+ "ext": ".jpg",
+ "name": "hhkRxns97X",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453897,
+ "blocks": 160,
+ "atimeMs": 1549616107951.2603,
+ "mtimeMs": 1549616107951.2603,
+ "ctimeMs": 1549616107951.2603,
+ "birthtimeMs": 1549616107951.2603,
+ "atime": "2019-02-08T08:55:07.951Z",
+ "mtime": "2019-02-08T08:55:07.951Z",
+ "ctime": "2019-02-08T08:55:07.951Z",
+ "birthtime": "2019-02-08T08:55:07.951Z"
+ },
+ {
+ "id": "c61e32c1-b74a-577d-bcc5-71e591546782",
+ "children": [
+ "fa1545ee-c421-566f-a062-5b3cc5ed86df"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "70db28f9118ddc122d2aad303021137c",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/cipIL0M9zb.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/cipIL0M9zb.jpg",
+ "relativePath": "images/cipIL0M9zb.jpg",
+ "extension": "jpg",
+ "size": 100735,
+ "prettySize": "101 kB",
+ "modifiedTime": "2019-02-08T08:55:07.945Z",
+ "accessTime": "2019-02-08T08:55:07.945Z",
+ "changeTime": "2019-02-08T08:55:07.945Z",
+ "birthTime": "2019-02-08T08:55:07.945Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "cipIL0M9zb.jpg",
+ "ext": ".jpg",
+ "name": "cipIL0M9zb",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453882,
+ "blocks": 200,
+ "atimeMs": 1549616107944.5935,
+ "mtimeMs": 1549616107944.5935,
+ "ctimeMs": 1549616107944.5935,
+ "birthtimeMs": 1549616107944.5935,
+ "atime": "2019-02-08T08:55:07.945Z",
+ "mtime": "2019-02-08T08:55:07.945Z",
+ "ctime": "2019-02-08T08:55:07.945Z",
+ "birthtime": "2019-02-08T08:55:07.945Z"
+ },
+ {
+ "id": "538f5859-d9a3-589e-8dde-3e731732b0ca",
+ "children": [
+ "3f06569d-ebc6-5848-a69d-5ff64a9d9b67"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "96cc7e05e1dd76339a0332b39dfc4640",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/htQkA2M9_x.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/htQkA2M9_x.jpg",
+ "relativePath": "images/htQkA2M9_x.jpg",
+ "extension": "jpg",
+ "size": 121047,
+ "prettySize": "121 kB",
+ "modifiedTime": "2019-02-08T08:55:07.951Z",
+ "accessTime": "2019-02-08T08:55:07.951Z",
+ "changeTime": "2019-02-08T08:55:07.951Z",
+ "birthTime": "2019-02-08T08:55:07.951Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "htQkA2M9_x.jpg",
+ "ext": ".jpg",
+ "name": "htQkA2M9_x",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453898,
+ "blocks": 240,
+ "atimeMs": 1549616107951.2603,
+ "mtimeMs": 1549616107951.2603,
+ "ctimeMs": 1549616107951.2603,
+ "birthtimeMs": 1549616107951.2603,
+ "atime": "2019-02-08T08:55:07.951Z",
+ "mtime": "2019-02-08T08:55:07.951Z",
+ "ctime": "2019-02-08T08:55:07.951Z",
+ "birthtime": "2019-02-08T08:55:07.951Z"
+ },
+ {
+ "id": "632d64a1-e24c-55fe-a3b3-a4a31997af39",
+ "children": [
+ "42244d78-fac3-5e3b-9f14-02a15c31b548"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "3a533f4c318f142c43c6aea513fde2ee",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/iRfNB_M99y.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/iRfNB_M99y.jpg",
+ "relativePath": "images/iRfNB_M99y.jpg",
+ "extension": "jpg",
+ "size": 116819,
+ "prettySize": "117 kB",
+ "modifiedTime": "2019-02-08T08:55:07.951Z",
+ "accessTime": "2019-02-08T08:55:07.951Z",
+ "changeTime": "2019-02-08T08:55:07.951Z",
+ "birthTime": "2019-02-08T08:55:07.951Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "iRfNB_M99y.jpg",
+ "ext": ".jpg",
+ "name": "iRfNB_M99y",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453900,
+ "blocks": 232,
+ "atimeMs": 1549616107951.2603,
+ "mtimeMs": 1549616107951.2603,
+ "ctimeMs": 1549616107951.2603,
+ "birthtimeMs": 1549616107951.2603,
+ "atime": "2019-02-08T08:55:07.951Z",
+ "mtime": "2019-02-08T08:55:07.951Z",
+ "ctime": "2019-02-08T08:55:07.951Z",
+ "birthtime": "2019-02-08T08:55:07.951Z"
+ },
+ {
+ "id": "922f795a-bf71-5370-bf64-e04720bd110e",
+ "children": [
+ "8a7742e1-6b5a-59f8-9d48-f0abf0ea86a9"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "9c8ce28260d2ae31eb2ed1b06bbd473e",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/iDVBRjM99x.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/iDVBRjM99x.jpg",
+ "relativePath": "images/iDVBRjM99x.jpg",
+ "extension": "jpg",
+ "size": 107987,
+ "prettySize": "108 kB",
+ "modifiedTime": "2019-02-08T08:55:07.951Z",
+ "accessTime": "2019-02-08T08:55:07.951Z",
+ "changeTime": "2019-02-08T08:55:07.951Z",
+ "birthTime": "2019-02-08T08:55:07.951Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "iDVBRjM99x.jpg",
+ "ext": ".jpg",
+ "name": "iDVBRjM99x",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453899,
+ "blocks": 216,
+ "atimeMs": 1549616107951.2603,
+ "mtimeMs": 1549616107951.2603,
+ "ctimeMs": 1549616107951.2603,
+ "birthtimeMs": 1549616107951.2603,
+ "atime": "2019-02-08T08:55:07.951Z",
+ "mtime": "2019-02-08T08:55:07.951Z",
+ "ctime": "2019-02-08T08:55:07.951Z",
+ "birthtime": "2019-02-08T08:55:07.951Z"
+ },
+ {
+ "id": "14d49c41-5571-57c5-b7f8-07e5d19e24fc",
+ "children": [
+ "2f9bc223-d0e2-57c4-9de2-0de4c32d6ec3"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "c687cf5f4977f346c919e3f0b10a5fd3",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/icK7QlM96C.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/icK7QlM96C.jpg",
+ "relativePath": "images/icK7QlM96C.jpg",
+ "extension": "jpg",
+ "size": 108678,
+ "prettySize": "109 kB",
+ "modifiedTime": "2019-02-08T08:55:07.951Z",
+ "accessTime": "2019-02-08T08:55:07.951Z",
+ "changeTime": "2019-02-08T08:55:07.951Z",
+ "birthTime": "2019-02-08T08:55:07.951Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "icK7QlM96C.jpg",
+ "ext": ".jpg",
+ "name": "icK7QlM96C",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453901,
+ "blocks": 216,
+ "atimeMs": 1549616107951.2603,
+ "mtimeMs": 1549616107951.2603,
+ "ctimeMs": 1549616107951.2603,
+ "birthtimeMs": 1549616107951.2603,
+ "atime": "2019-02-08T08:55:07.951Z",
+ "mtime": "2019-02-08T08:55:07.951Z",
+ "ctime": "2019-02-08T08:55:07.951Z",
+ "birthtime": "2019-02-08T08:55:07.951Z"
+ },
+ {
+ "id": "b8d1824e-97a7-58ad-8f6a-9eca8ffe31c5",
+ "children": [
+ "cdaeb064-5204-570a-b236-f8410c35fcff"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "96fad019fa39ab34f2ad3b09cc17a1e2",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/dCsmF8s951.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/dCsmF8s951.jpg",
+ "relativePath": "images/dCsmF8s951.jpg",
+ "extension": "jpg",
+ "size": 124650,
+ "prettySize": "125 kB",
+ "modifiedTime": "2019-02-08T08:55:07.948Z",
+ "accessTime": "2019-02-08T08:55:07.945Z",
+ "changeTime": "2019-02-08T08:55:07.948Z",
+ "birthTime": "2019-02-08T08:55:07.948Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "dCsmF8s951.jpg",
+ "ext": ".jpg",
+ "name": "dCsmF8s951",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453884,
+ "blocks": 248,
+ "atimeMs": 1549616107944.5935,
+ "mtimeMs": 1549616107947.9268,
+ "ctimeMs": 1549616107947.9268,
+ "birthtimeMs": 1549616107947.9268,
+ "atime": "2019-02-08T08:55:07.945Z",
+ "mtime": "2019-02-08T08:55:07.948Z",
+ "ctime": "2019-02-08T08:55:07.948Z",
+ "birthtime": "2019-02-08T08:55:07.948Z"
+ },
+ {
+ "id": "c52dd4e6-274f-556f-84af-21c118aa6cca",
+ "children": [
+ "eeac8d14-bf7c-5762-ab78-4d172dd5afe3"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "31ba31edc1bf4fdf281939ae690236de",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/jKpZA4M90B.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/jKpZA4M90B.jpg",
+ "relativePath": "images/jKpZA4M90B.jpg",
+ "extension": "jpg",
+ "size": 123145,
+ "prettySize": "123 kB",
+ "modifiedTime": "2019-02-08T08:55:07.955Z",
+ "accessTime": "2019-02-08T08:55:07.955Z",
+ "changeTime": "2019-02-08T08:55:07.955Z",
+ "birthTime": "2019-02-08T08:55:07.955Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "jKpZA4M90B.jpg",
+ "ext": ".jpg",
+ "name": "jKpZA4M90B",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453904,
+ "blocks": 248,
+ "atimeMs": 1549616107954.5935,
+ "mtimeMs": 1549616107954.5935,
+ "ctimeMs": 1549616107954.5935,
+ "birthtimeMs": 1549616107954.5935,
+ "atime": "2019-02-08T08:55:07.955Z",
+ "mtime": "2019-02-08T08:55:07.955Z",
+ "ctime": "2019-02-08T08:55:07.955Z",
+ "birthtime": "2019-02-08T08:55:07.955Z"
+ },
+ {
+ "id": "f64841a4-4d95-5112-9348-bc562961db4d",
+ "children": [
+ "a5c97fc5-c9f1-54c0-9233-210fe1f160b0"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "3f7ccb765115bdcdb775a7cecd5bce2d",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/jID6jzM95N.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/jID6jzM95N.jpg",
+ "relativePath": "images/jID6jzM95N.jpg",
+ "extension": "jpg",
+ "size": 85157,
+ "prettySize": "85.2 kB",
+ "modifiedTime": "2019-02-08T08:55:07.955Z",
+ "accessTime": "2019-02-08T08:55:07.951Z",
+ "changeTime": "2019-02-08T08:55:07.955Z",
+ "birthTime": "2019-02-08T08:55:07.955Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "jID6jzM95N.jpg",
+ "ext": ".jpg",
+ "name": "jID6jzM95N",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453903,
+ "blocks": 168,
+ "atimeMs": 1549616107951.2603,
+ "mtimeMs": 1549616107954.5935,
+ "ctimeMs": 1549616107954.5935,
+ "birthtimeMs": 1549616107954.5935,
+ "atime": "2019-02-08T08:55:07.951Z",
+ "mtime": "2019-02-08T08:55:07.955Z",
+ "ctime": "2019-02-08T08:55:07.955Z",
+ "birthtime": "2019-02-08T08:55:07.955Z"
+ },
+ {
+ "id": "b633e034-a20b-5d41-a9b0-11e9d621d983",
+ "children": [
+ "b0cedf3b-cd9b-5421-9d27-48a8f2da610f"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "1fd8c62f69302a0232f236888d945b75",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/jSZfqEM9-l.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/jSZfqEM9-l.jpg",
+ "relativePath": "images/jSZfqEM9-l.jpg",
+ "extension": "jpg",
+ "size": 128798,
+ "prettySize": "129 kB",
+ "modifiedTime": "2019-02-08T08:55:07.955Z",
+ "accessTime": "2019-02-08T08:55:07.955Z",
+ "changeTime": "2019-02-08T08:55:07.955Z",
+ "birthTime": "2019-02-08T08:55:07.955Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "jSZfqEM9-l.jpg",
+ "ext": ".jpg",
+ "name": "jSZfqEM9-l",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453902,
+ "blocks": 256,
+ "atimeMs": 1549616107954.5935,
+ "mtimeMs": 1549616107954.5935,
+ "ctimeMs": 1549616107954.5935,
+ "birthtimeMs": 1549616107954.5935,
+ "atime": "2019-02-08T08:55:07.955Z",
+ "mtime": "2019-02-08T08:55:07.955Z",
+ "ctime": "2019-02-08T08:55:07.955Z",
+ "birthtime": "2019-02-08T08:55:07.955Z"
+ },
+ {
+ "id": "dc8d98cd-9a4b-5c95-978c-72e5e003d3a9",
+ "children": [
+ "9034de88-ace8-585c-b0fe-acea09a60b4f"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "af544090b8d1f2150b5ebfab252dbf3e",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/jh0QmFM9_4.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/jh0QmFM9_4.jpg",
+ "relativePath": "images/jh0QmFM9_4.jpg",
+ "extension": "jpg",
+ "size": 107268,
+ "prettySize": "107 kB",
+ "modifiedTime": "2019-02-08T08:55:07.955Z",
+ "accessTime": "2019-02-08T08:55:07.955Z",
+ "changeTime": "2019-02-08T08:55:07.955Z",
+ "birthTime": "2019-02-08T08:55:07.955Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "jh0QmFM9_4.jpg",
+ "ext": ".jpg",
+ "name": "jh0QmFM9_4",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453907,
+ "blocks": 216,
+ "atimeMs": 1549616107954.5935,
+ "mtimeMs": 1549616107954.5935,
+ "ctimeMs": 1549616107954.5935,
+ "birthtimeMs": 1549616107954.5935,
+ "atime": "2019-02-08T08:55:07.955Z",
+ "mtime": "2019-02-08T08:55:07.955Z",
+ "ctime": "2019-02-08T08:55:07.955Z",
+ "birthtime": "2019-02-08T08:55:07.955Z"
+ },
+ {
+ "id": "c9a40590-98f2-560d-b091-34e10179dc1c",
+ "children": [
+ "f59e19cb-3173-5247-a277-76b3b8250b4b"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "ce267a020dec9362be41e06d8d586975",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/k7zLTbs9z0.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/k7zLTbs9z0.jpg",
+ "relativePath": "images/k7zLTbs9z0.jpg",
+ "extension": "jpg",
+ "size": 87182,
+ "prettySize": "87.2 kB",
+ "modifiedTime": "2019-02-08T08:55:07.955Z",
+ "accessTime": "2019-02-08T08:55:07.955Z",
+ "changeTime": "2019-02-08T08:55:07.955Z",
+ "birthTime": "2019-02-08T08:55:07.955Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "k7zLTbs9z0.jpg",
+ "ext": ".jpg",
+ "name": "k7zLTbs9z0",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453908,
+ "blocks": 176,
+ "atimeMs": 1549616107954.5935,
+ "mtimeMs": 1549616107954.5935,
+ "ctimeMs": 1549616107954.5935,
+ "birthtimeMs": 1549616107954.5935,
+ "atime": "2019-02-08T08:55:07.955Z",
+ "mtime": "2019-02-08T08:55:07.955Z",
+ "ctime": "2019-02-08T08:55:07.955Z",
+ "birthtime": "2019-02-08T08:55:07.955Z"
+ },
+ {
+ "id": "19f096ac-7d47-53e3-81df-5f6b6fd942b7",
+ "children": [
+ "da1377ca-7e8f-5196-a4fd-d0a4f3589a41"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "46bfd9fcfe5f42f54aafc1e4dd7b40d2",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/kFThHyM95O.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/kFThHyM95O.jpg",
+ "relativePath": "images/kFThHyM95O.jpg",
+ "extension": "jpg",
+ "size": 127219,
+ "prettySize": "127 kB",
+ "modifiedTime": "2019-02-08T08:55:07.955Z",
+ "accessTime": "2019-02-08T08:55:07.955Z",
+ "changeTime": "2019-02-08T08:55:07.955Z",
+ "birthTime": "2019-02-08T08:55:07.955Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "kFThHyM95O.jpg",
+ "ext": ".jpg",
+ "name": "kFThHyM95O",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453909,
+ "blocks": 256,
+ "atimeMs": 1549616107954.5935,
+ "mtimeMs": 1549616107954.5935,
+ "ctimeMs": 1549616107954.5935,
+ "birthtimeMs": 1549616107954.5935,
+ "atime": "2019-02-08T08:55:07.955Z",
+ "mtime": "2019-02-08T08:55:07.955Z",
+ "ctime": "2019-02-08T08:55:07.955Z",
+ "birthtime": "2019-02-08T08:55:07.955Z"
+ },
+ {
+ "id": "6bb783c1-92c8-5a66-8b1c-97aeb2f18647",
+ "children": [
+ "ad5bf0e8-78e6-5c06-8f36-18de7bfe675a"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "8e4fa5e7e3dae7c02bd280bb24e95c66",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/l3kMPSM92e.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/l3kMPSM92e.jpg",
+ "relativePath": "images/l3kMPSM92e.jpg",
+ "extension": "jpg",
+ "size": 94180,
+ "prettySize": "94.2 kB",
+ "modifiedTime": "2019-02-08T08:55:07.955Z",
+ "accessTime": "2019-02-08T08:55:07.955Z",
+ "changeTime": "2019-02-08T08:55:07.955Z",
+ "birthTime": "2019-02-08T08:55:07.955Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "l3kMPSM92e.jpg",
+ "ext": ".jpg",
+ "name": "l3kMPSM92e",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453910,
+ "blocks": 184,
+ "atimeMs": 1549616107954.5935,
+ "mtimeMs": 1549616107954.5935,
+ "ctimeMs": 1549616107954.5935,
+ "birthtimeMs": 1549616107954.5935,
+ "atime": "2019-02-08T08:55:07.955Z",
+ "mtime": "2019-02-08T08:55:07.955Z",
+ "ctime": "2019-02-08T08:55:07.955Z",
+ "birthtime": "2019-02-08T08:55:07.955Z"
+ },
+ {
+ "id": "ac3d890f-c2bd-5ccc-a584-ab773e2bb356",
+ "children": [
+ "4be4599e-5f28-5597-9b97-5d689b785dc3"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "0f3cf0fd60b391d081376a9912172984",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/lYmjeQs9_j.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/lYmjeQs9_j.jpg",
+ "relativePath": "images/lYmjeQs9_j.jpg",
+ "extension": "jpg",
+ "size": 118234,
+ "prettySize": "118 kB",
+ "modifiedTime": "2019-02-08T08:55:07.955Z",
+ "accessTime": "2019-02-08T08:55:07.955Z",
+ "changeTime": "2019-02-08T08:55:07.955Z",
+ "birthTime": "2019-02-08T08:55:07.955Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "lYmjeQs9_j.jpg",
+ "ext": ".jpg",
+ "name": "lYmjeQs9_j",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453911,
+ "blocks": 232,
+ "atimeMs": 1549616107954.5935,
+ "mtimeMs": 1549616107954.5935,
+ "ctimeMs": 1549616107954.5935,
+ "birthtimeMs": 1549616107954.5935,
+ "atime": "2019-02-08T08:55:07.955Z",
+ "mtime": "2019-02-08T08:55:07.955Z",
+ "ctime": "2019-02-08T08:55:07.955Z",
+ "birthtime": "2019-02-08T08:55:07.955Z"
+ },
+ {
+ "id": "19737ea3-cf41-5044-9262-cc8a00ba37a2",
+ "children": [
+ "cc003810-50ca-5300-921f-f45dc27bb000"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "4e0218a426f7ca098de8f79f19a9812a",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/lYnUVSs9wf.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/lYnUVSs9wf.jpg",
+ "relativePath": "images/lYnUVSs9wf.jpg",
+ "extension": "jpg",
+ "size": 119134,
+ "prettySize": "119 kB",
+ "modifiedTime": "2019-02-08T08:55:07.958Z",
+ "accessTime": "2019-02-08T08:55:07.955Z",
+ "changeTime": "2019-02-08T08:55:07.958Z",
+ "birthTime": "2019-02-08T08:55:07.958Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "lYnUVSs9wf.jpg",
+ "ext": ".jpg",
+ "name": "lYnUVSs9wf",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453912,
+ "blocks": 240,
+ "atimeMs": 1549616107954.5935,
+ "mtimeMs": 1549616107957.9268,
+ "ctimeMs": 1549616107957.9268,
+ "birthtimeMs": 1549616107957.9268,
+ "atime": "2019-02-08T08:55:07.955Z",
+ "mtime": "2019-02-08T08:55:07.958Z",
+ "ctime": "2019-02-08T08:55:07.958Z",
+ "birthtime": "2019-02-08T08:55:07.958Z"
+ },
+ {
+ "id": "eddf5a86-e422-5513-aace-a59d556fab11",
+ "children": [
+ "07adb971-0e2b-52a2-9851-73a0c0c2b841"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "288bf0943ae797b95a21705b79a45c26",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/lYoYWVs9x_.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/lYoYWVs9x_.jpg",
+ "relativePath": "images/lYoYWVs9x_.jpg",
+ "extension": "jpg",
+ "size": 76512,
+ "prettySize": "76.5 kB",
+ "modifiedTime": "2019-02-08T08:55:07.958Z",
+ "accessTime": "2019-02-08T08:55:07.958Z",
+ "changeTime": "2019-02-08T08:55:07.958Z",
+ "birthTime": "2019-02-08T08:55:07.958Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "lYoYWVs9x_.jpg",
+ "ext": ".jpg",
+ "name": "lYoYWVs9x_",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453913,
+ "blocks": 152,
+ "atimeMs": 1549616107957.9268,
+ "mtimeMs": 1549616107957.9268,
+ "ctimeMs": 1549616107957.9268,
+ "birthtimeMs": 1549616107957.9268,
+ "atime": "2019-02-08T08:55:07.958Z",
+ "mtime": "2019-02-08T08:55:07.958Z",
+ "ctime": "2019-02-08T08:55:07.958Z",
+ "birthtime": "2019-02-08T08:55:07.958Z"
+ },
+ {
+ "id": "b1b28a49-b910-5669-ad19-d2917aa1bfdf",
+ "children": [
+ "d53df682-65cb-509b-b179-88d7b95a97e2"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "82de37baa6823ff4a3ac419158d02ab3",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/lutoOTs902.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/lutoOTs902.jpg",
+ "relativePath": "images/lutoOTs902.jpg",
+ "extension": "jpg",
+ "size": 123968,
+ "prettySize": "124 kB",
+ "modifiedTime": "2019-02-08T08:55:07.958Z",
+ "accessTime": "2019-02-08T08:55:07.958Z",
+ "changeTime": "2019-02-08T08:55:07.958Z",
+ "birthTime": "2019-02-08T08:55:07.958Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "lutoOTs902.jpg",
+ "ext": ".jpg",
+ "name": "lutoOTs902",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453914,
+ "blocks": 248,
+ "atimeMs": 1549616107957.9268,
+ "mtimeMs": 1549616107957.9268,
+ "ctimeMs": 1549616107957.9268,
+ "birthtimeMs": 1549616107957.9268,
+ "atime": "2019-02-08T08:55:07.958Z",
+ "mtime": "2019-02-08T08:55:07.958Z",
+ "ctime": "2019-02-08T08:55:07.958Z",
+ "birthtime": "2019-02-08T08:55:07.958Z"
+ },
+ {
+ "id": "4f84a220-540e-5fdb-91c0-5f680c657eea",
+ "children": [
+ "4a42eab4-43b3-5d69-8a5b-37d744d78ead"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "4f455e646bcb5a9b3b2160f5997611e7",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/lxaO_8s993.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/lxaO_8s993.jpg",
+ "relativePath": "images/lxaO_8s993.jpg",
+ "extension": "jpg",
+ "size": 109951,
+ "prettySize": "110 kB",
+ "modifiedTime": "2019-02-08T08:55:07.958Z",
+ "accessTime": "2019-02-08T08:55:07.958Z",
+ "changeTime": "2019-02-08T08:55:07.958Z",
+ "birthTime": "2019-02-08T08:55:07.958Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "lxaO_8s993.jpg",
+ "ext": ".jpg",
+ "name": "lxaO_8s993",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453915,
+ "blocks": 216,
+ "atimeMs": 1549616107957.9268,
+ "mtimeMs": 1549616107957.9268,
+ "ctimeMs": 1549616107957.9268,
+ "birthtimeMs": 1549616107957.9268,
+ "atime": "2019-02-08T08:55:07.958Z",
+ "mtime": "2019-02-08T08:55:07.958Z",
+ "ctime": "2019-02-08T08:55:07.958Z",
+ "birthtime": "2019-02-08T08:55:07.958Z"
+ },
+ {
+ "id": "c3e4eeee-a771-5915-a1ea-5f8aa5496e2b",
+ "children": [
+ "8bb85c36-4986-5dca-a1ef-935fc216b78a"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "695a76d7cd1ff8a8fbe78ea9482bc4e7",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/mlxMw3M94j.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/mlxMw3M94j.jpg",
+ "relativePath": "images/mlxMw3M94j.jpg",
+ "extension": "jpg",
+ "size": 117540,
+ "prettySize": "118 kB",
+ "modifiedTime": "2019-02-08T08:55:07.958Z",
+ "accessTime": "2019-02-08T08:55:07.958Z",
+ "changeTime": "2019-02-08T08:55:07.958Z",
+ "birthTime": "2019-02-08T08:55:07.958Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "mlxMw3M94j.jpg",
+ "ext": ".jpg",
+ "name": "mlxMw3M94j",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453916,
+ "blocks": 232,
+ "atimeMs": 1549616107957.9268,
+ "mtimeMs": 1549616107957.9268,
+ "ctimeMs": 1549616107957.9268,
+ "birthtimeMs": 1549616107957.9268,
+ "atime": "2019-02-08T08:55:07.958Z",
+ "mtime": "2019-02-08T08:55:07.958Z",
+ "ctime": "2019-02-08T08:55:07.958Z",
+ "birthtime": "2019-02-08T08:55:07.958Z"
+ },
+ {
+ "id": "d4f6feaa-9001-5ca8-8f11-d5d01cd9d254",
+ "children": [
+ "9a6c566e-9b00-5135-a512-a7375437d91b"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "654eaeabf3232517b925392ff64244dd",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/moglcxM97P.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/moglcxM97P.jpg",
+ "relativePath": "images/moglcxM97P.jpg",
+ "extension": "jpg",
+ "size": 84281,
+ "prettySize": "84.3 kB",
+ "modifiedTime": "2019-02-08T08:55:07.958Z",
+ "accessTime": "2019-02-08T08:55:07.958Z",
+ "changeTime": "2019-02-08T08:55:07.958Z",
+ "birthTime": "2019-02-08T08:55:07.958Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "moglcxM97P.jpg",
+ "ext": ".jpg",
+ "name": "moglcxM97P",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453917,
+ "blocks": 168,
+ "atimeMs": 1549616107957.9268,
+ "mtimeMs": 1549616107957.9268,
+ "ctimeMs": 1549616107957.9268,
+ "birthtimeMs": 1549616107957.9268,
+ "atime": "2019-02-08T08:55:07.958Z",
+ "mtime": "2019-02-08T08:55:07.958Z",
+ "ctime": "2019-02-08T08:55:07.958Z",
+ "birthtime": "2019-02-08T08:55:07.958Z"
+ },
+ {
+ "id": "9b6b9a69-0c6e-5abe-986b-7b11cd1764e6",
+ "children": [
+ "5868eb13-70c3-5331-984c-7ceaa5c309ca"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "d110db904291dc24c26b5e2696e59338",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/nZaKQfM99Z.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/nZaKQfM99Z.jpg",
+ "relativePath": "images/nZaKQfM99Z.jpg",
+ "extension": "jpg",
+ "size": 101114,
+ "prettySize": "101 kB",
+ "modifiedTime": "2019-02-08T08:55:07.958Z",
+ "accessTime": "2019-02-08T08:55:07.958Z",
+ "changeTime": "2019-02-08T08:55:07.958Z",
+ "birthTime": "2019-02-08T08:55:07.958Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "nZaKQfM99Z.jpg",
+ "ext": ".jpg",
+ "name": "nZaKQfM99Z",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453919,
+ "blocks": 200,
+ "atimeMs": 1549616107957.9268,
+ "mtimeMs": 1549616107957.9268,
+ "ctimeMs": 1549616107957.9268,
+ "birthtimeMs": 1549616107957.9268,
+ "atime": "2019-02-08T08:55:07.958Z",
+ "mtime": "2019-02-08T08:55:07.958Z",
+ "ctime": "2019-02-08T08:55:07.958Z",
+ "birthtime": "2019-02-08T08:55:07.958Z"
+ },
+ {
+ "id": "fe6abbeb-14b1-52c4-916c-6498b0694452",
+ "children": [
+ "02673219-a18f-5c15-a63c-550dd5bf110d"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "fd95ba3ac4e3bbc7331025248432a239",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/oFM91Fs9z6.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/oFM91Fs9z6.jpg",
+ "relativePath": "images/oFM91Fs9z6.jpg",
+ "extension": "jpg",
+ "size": 78127,
+ "prettySize": "78.1 kB",
+ "modifiedTime": "2019-02-08T08:55:07.958Z",
+ "accessTime": "2019-02-08T08:55:07.958Z",
+ "changeTime": "2019-02-08T08:55:07.958Z",
+ "birthTime": "2019-02-08T08:55:07.958Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "oFM91Fs9z6.jpg",
+ "ext": ".jpg",
+ "name": "oFM91Fs9z6",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453920,
+ "blocks": 160,
+ "atimeMs": 1549616107957.9268,
+ "mtimeMs": 1549616107957.9268,
+ "ctimeMs": 1549616107957.9268,
+ "birthtimeMs": 1549616107957.9268,
+ "atime": "2019-02-08T08:55:07.958Z",
+ "mtime": "2019-02-08T08:55:07.958Z",
+ "ctime": "2019-02-08T08:55:07.958Z",
+ "birthtime": "2019-02-08T08:55:07.958Z"
+ },
+ {
+ "id": "7051dfff-7b4a-5d7f-947f-c85e2034b05e",
+ "children": [
+ "11b30767-49c7-594f-8d4d-760356e21321"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "a513d53f3a11403596639be3a1d3bedd",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/oJebJyM9z8.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/oJebJyM9z8.jpg",
+ "relativePath": "images/oJebJyM9z8.jpg",
+ "extension": "jpg",
+ "size": 78329,
+ "prettySize": "78.3 kB",
+ "modifiedTime": "2019-02-08T08:55:07.958Z",
+ "accessTime": "2019-02-08T08:55:07.958Z",
+ "changeTime": "2019-02-08T08:55:07.958Z",
+ "birthTime": "2019-02-08T08:55:07.958Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "oJebJyM9z8.jpg",
+ "ext": ".jpg",
+ "name": "oJebJyM9z8",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453921,
+ "blocks": 160,
+ "atimeMs": 1549616107957.9268,
+ "mtimeMs": 1549616107957.9268,
+ "ctimeMs": 1549616107957.9268,
+ "birthtimeMs": 1549616107957.9268,
+ "atime": "2019-02-08T08:55:07.958Z",
+ "mtime": "2019-02-08T08:55:07.958Z",
+ "ctime": "2019-02-08T08:55:07.958Z",
+ "birthtime": "2019-02-08T08:55:07.958Z"
+ },
+ {
+ "id": "de0199a4-a8f3-5fee-a01e-3637d7424778",
+ "children": [
+ "1da41841-fb71-52b0-9bac-b9abefcfe47a"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "32fcef3d89b53f53148ffb0a61feb53a",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/oqbez7s9_x.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/oqbez7s9_x.jpg",
+ "relativePath": "images/oqbez7s9_x.jpg",
+ "extension": "jpg",
+ "size": 78913,
+ "prettySize": "78.9 kB",
+ "modifiedTime": "2019-02-08T08:55:07.958Z",
+ "accessTime": "2019-02-08T08:55:07.958Z",
+ "changeTime": "2019-02-08T08:55:07.958Z",
+ "birthTime": "2019-02-08T08:55:07.958Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "oqbez7s9_x.jpg",
+ "ext": ".jpg",
+ "name": "oqbez7s9_x",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453922,
+ "blocks": 160,
+ "atimeMs": 1549616107957.9268,
+ "mtimeMs": 1549616107957.9268,
+ "ctimeMs": 1549616107957.9268,
+ "birthtimeMs": 1549616107957.9268,
+ "atime": "2019-02-08T08:55:07.958Z",
+ "mtime": "2019-02-08T08:55:07.958Z",
+ "ctime": "2019-02-08T08:55:07.958Z",
+ "birthtime": "2019-02-08T08:55:07.958Z"
+ },
+ {
+ "id": "4957ed17-f7ed-5ef1-8ea1-0ce081bb357c",
+ "children": [
+ "b7587480-754e-5318-bfd4-5b73acc41548"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "d3a2dca69116b045287f258388a60718",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/oqvZV5s9z2.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/oqvZV5s9z2.jpg",
+ "relativePath": "images/oqvZV5s9z2.jpg",
+ "extension": "jpg",
+ "size": 116141,
+ "prettySize": "116 kB",
+ "modifiedTime": "2019-02-08T08:55:07.961Z",
+ "accessTime": "2019-02-08T08:55:07.961Z",
+ "changeTime": "2019-02-08T08:55:07.961Z",
+ "birthTime": "2019-02-08T08:55:07.961Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "oqvZV5s9z2.jpg",
+ "ext": ".jpg",
+ "name": "oqvZV5s9z2",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453925,
+ "blocks": 232,
+ "atimeMs": 1549616107961.26,
+ "mtimeMs": 1549616107961.26,
+ "ctimeMs": 1549616107961.26,
+ "birthtimeMs": 1549616107961.26,
+ "atime": "2019-02-08T08:55:07.961Z",
+ "mtime": "2019-02-08T08:55:07.961Z",
+ "ctime": "2019-02-08T08:55:07.961Z",
+ "birthtime": "2019-02-08T08:55:07.961Z"
+ },
+ {
+ "id": "5dfa0a18-5fd7-5bc8-b763-61e8a0aa110d",
+ "children": [
+ "2d3de8d8-437a-5ca5-9ba2-181af73e42d7"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "c229673b43857230fa2c7b3969eaab42",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/oqeqN7s912.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/oqeqN7s912.jpg",
+ "relativePath": "images/oqeqN7s912.jpg",
+ "extension": "jpg",
+ "size": 98068,
+ "prettySize": "98.1 kB",
+ "modifiedTime": "2019-02-08T08:55:07.961Z",
+ "accessTime": "2019-02-08T08:55:07.961Z",
+ "changeTime": "2019-02-08T08:55:07.961Z",
+ "birthTime": "2019-02-08T08:55:07.961Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "oqeqN7s912.jpg",
+ "ext": ".jpg",
+ "name": "oqeqN7s912",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453924,
+ "blocks": 192,
+ "atimeMs": 1549616107961.26,
+ "mtimeMs": 1549616107961.26,
+ "ctimeMs": 1549616107961.26,
+ "birthtimeMs": 1549616107961.26,
+ "atime": "2019-02-08T08:55:07.961Z",
+ "mtime": "2019-02-08T08:55:07.961Z",
+ "ctime": "2019-02-08T08:55:07.961Z",
+ "birthtime": "2019-02-08T08:55:07.961Z"
+ },
+ {
+ "id": "41f4e7be-c697-5c50-be60-9ca3828603c7",
+ "children": [
+ "dea320e4-3a3c-520c-ba44-6336e369315f"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "92b29ea9b9b5d01a2e00ae8a5e8f73aa",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/orMhzhs97P.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/orMhzhs97P.jpg",
+ "relativePath": "images/orMhzhs97P.jpg",
+ "extension": "jpg",
+ "size": 113368,
+ "prettySize": "113 kB",
+ "modifiedTime": "2019-02-08T08:55:07.961Z",
+ "accessTime": "2019-02-08T08:55:07.961Z",
+ "changeTime": "2019-02-08T08:55:07.961Z",
+ "birthTime": "2019-02-08T08:55:07.961Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "orMhzhs97P.jpg",
+ "ext": ".jpg",
+ "name": "orMhzhs97P",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453926,
+ "blocks": 224,
+ "atimeMs": 1549616107961.26,
+ "mtimeMs": 1549616107961.26,
+ "ctimeMs": 1549616107961.26,
+ "birthtimeMs": 1549616107961.26,
+ "atime": "2019-02-08T08:55:07.961Z",
+ "mtime": "2019-02-08T08:55:07.961Z",
+ "ctime": "2019-02-08T08:55:07.961Z",
+ "birthtime": "2019-02-08T08:55:07.961Z"
+ },
+ {
+ "id": "0229ab2d-e417-59b4-b2a5-22a7714092df",
+ "children": [
+ "2d54e667-4d48-5698-8510-2a5e463e939a"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "ee0bb483ba82477ad08c43d9a463dd48",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/oqbxsdM9wR.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/oqbxsdM9wR.jpg",
+ "relativePath": "images/oqbxsdM9wR.jpg",
+ "extension": "jpg",
+ "size": 86259,
+ "prettySize": "86.3 kB",
+ "modifiedTime": "2019-02-08T08:55:07.961Z",
+ "accessTime": "2019-02-08T08:55:07.961Z",
+ "changeTime": "2019-02-08T08:55:07.961Z",
+ "birthTime": "2019-02-08T08:55:07.961Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "oqbxsdM9wR.jpg",
+ "ext": ".jpg",
+ "name": "oqbxsdM9wR",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453923,
+ "blocks": 176,
+ "atimeMs": 1549616107961.26,
+ "mtimeMs": 1549616107961.26,
+ "ctimeMs": 1549616107961.26,
+ "birthtimeMs": 1549616107961.26,
+ "atime": "2019-02-08T08:55:07.961Z",
+ "mtime": "2019-02-08T08:55:07.961Z",
+ "ctime": "2019-02-08T08:55:07.961Z",
+ "birthtime": "2019-02-08T08:55:07.961Z"
+ },
+ {
+ "id": "f87566b3-c14c-5cac-b9db-190fdf797a8b",
+ "children": [
+ "326f8570-2d93-5ce1-9896-111bc85486af"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "951de4497ed7365c199cf73d9a18b0c4",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/orPfaus9xF.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/orPfaus9xF.jpg",
+ "relativePath": "images/orPfaus9xF.jpg",
+ "extension": "jpg",
+ "size": 93560,
+ "prettySize": "93.6 kB",
+ "modifiedTime": "2019-02-08T08:55:07.961Z",
+ "accessTime": "2019-02-08T08:55:07.961Z",
+ "changeTime": "2019-02-08T08:55:07.961Z",
+ "birthTime": "2019-02-08T08:55:07.961Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "orPfaus9xF.jpg",
+ "ext": ".jpg",
+ "name": "orPfaus9xF",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453927,
+ "blocks": 184,
+ "atimeMs": 1549616107961.26,
+ "mtimeMs": 1549616107961.26,
+ "ctimeMs": 1549616107961.26,
+ "birthtimeMs": 1549616107961.26,
+ "atime": "2019-02-08T08:55:07.961Z",
+ "mtime": "2019-02-08T08:55:07.961Z",
+ "ctime": "2019-02-08T08:55:07.961Z",
+ "birthtime": "2019-02-08T08:55:07.961Z"
+ },
+ {
+ "id": "7908fb4d-98d9-5e13-b9f0-84b52012a546",
+ "children": [
+ "9815f23e-7bf8-5aba-b9c2-ee9ee31d0a6a"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "f7b42abd98737507194603523c20a00b",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/orRtxus906.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/orRtxus906.jpg",
+ "relativePath": "images/orRtxus906.jpg",
+ "extension": "jpg",
+ "size": 130938,
+ "prettySize": "131 kB",
+ "modifiedTime": "2019-02-08T08:55:07.961Z",
+ "accessTime": "2019-02-08T08:55:07.961Z",
+ "changeTime": "2019-02-08T08:55:07.961Z",
+ "birthTime": "2019-02-08T08:55:07.961Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "orRtxus906.jpg",
+ "ext": ".jpg",
+ "name": "orRtxus906",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453928,
+ "blocks": 256,
+ "atimeMs": 1549616107961.26,
+ "mtimeMs": 1549616107961.26,
+ "ctimeMs": 1549616107961.26,
+ "birthtimeMs": 1549616107961.26,
+ "atime": "2019-02-08T08:55:07.961Z",
+ "mtime": "2019-02-08T08:55:07.961Z",
+ "ctime": "2019-02-08T08:55:07.961Z",
+ "birthtime": "2019-02-08T08:55:07.961Z"
+ },
+ {
+ "id": "14fff379-a53f-5902-9d91-d3973b5fa952",
+ "children": [
+ "e0111747-3565-5d71-9c95-4339fb01006e"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "a005f461571fcc05eb8a9972e6b9c3fb",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/ov6BJ8M93g.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/ov6BJ8M93g.jpg",
+ "relativePath": "images/ov6BJ8M93g.jpg",
+ "extension": "jpg",
+ "size": 109921,
+ "prettySize": "110 kB",
+ "modifiedTime": "2019-02-08T08:55:07.961Z",
+ "accessTime": "2019-02-08T08:55:07.961Z",
+ "changeTime": "2019-02-08T08:55:07.961Z",
+ "birthTime": "2019-02-08T08:55:07.961Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "ov6BJ8M93g.jpg",
+ "ext": ".jpg",
+ "name": "ov6BJ8M93g",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453930,
+ "blocks": 216,
+ "atimeMs": 1549616107961.26,
+ "mtimeMs": 1549616107961.26,
+ "ctimeMs": 1549616107961.26,
+ "birthtimeMs": 1549616107961.26,
+ "atime": "2019-02-08T08:55:07.961Z",
+ "mtime": "2019-02-08T08:55:07.961Z",
+ "ctime": "2019-02-08T08:55:07.961Z",
+ "birthtime": "2019-02-08T08:55:07.961Z"
+ },
+ {
+ "id": "fb621d85-5a2c-59c1-afd2-243507d447b5",
+ "children": [
+ "bc663945-deb3-5070-9a5b-367df4a50400"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "36a057b15efdf7e657949dcaf2b5a5ca",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/tB0dMts9x9.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/tB0dMts9x9.jpg",
+ "relativePath": "images/tB0dMts9x9.jpg",
+ "extension": "jpg",
+ "size": 85281,
+ "prettySize": "85.3 kB",
+ "modifiedTime": "2019-02-08T08:55:07.965Z",
+ "accessTime": "2019-02-08T08:55:07.965Z",
+ "changeTime": "2019-02-08T08:55:07.965Z",
+ "birthTime": "2019-02-08T08:55:07.965Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "tB0dMts9x9.jpg",
+ "ext": ".jpg",
+ "name": "tB0dMts9x9",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453934,
+ "blocks": 168,
+ "atimeMs": 1549616107964.5935,
+ "mtimeMs": 1549616107964.5935,
+ "ctimeMs": 1549616107964.5935,
+ "birthtimeMs": 1549616107964.5935,
+ "atime": "2019-02-08T08:55:07.965Z",
+ "mtime": "2019-02-08T08:55:07.965Z",
+ "ctime": "2019-02-08T08:55:07.965Z",
+ "birthtime": "2019-02-08T08:55:07.965Z"
+ },
+ {
+ "id": "fd3c1dc8-5ed1-5194-891a-d6af0c3952c9",
+ "children": [
+ "4d53a1c1-4ade-5627-9297-1c8cb7642f0a"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "565cb37da59eeddeb6ddf0667e1f6aa7",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/tB0kS4M9yO.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/tB0kS4M9yO.jpg",
+ "relativePath": "images/tB0kS4M9yO.jpg",
+ "extension": "jpg",
+ "size": 119496,
+ "prettySize": "119 kB",
+ "modifiedTime": "2019-02-08T08:55:07.965Z",
+ "accessTime": "2019-02-08T08:55:07.965Z",
+ "changeTime": "2019-02-08T08:55:07.965Z",
+ "birthTime": "2019-02-08T08:55:07.965Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "tB0kS4M9yO.jpg",
+ "ext": ".jpg",
+ "name": "tB0kS4M9yO",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453935,
+ "blocks": 240,
+ "atimeMs": 1549616107964.5935,
+ "mtimeMs": 1549616107964.5935,
+ "ctimeMs": 1549616107964.5935,
+ "birthtimeMs": 1549616107964.5935,
+ "atime": "2019-02-08T08:55:07.965Z",
+ "mtime": "2019-02-08T08:55:07.965Z",
+ "ctime": "2019-02-08T08:55:07.965Z",
+ "birthtime": "2019-02-08T08:55:07.965Z"
+ },
+ {
+ "id": "03b29c0e-71da-5ebf-8a51-caa50706b0de",
+ "children": [
+ "02606998-d4ff-5676-a381-d9a587c42ffb"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "e473c8292e19bb448af74410a8f45edc",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/3UlOVgM9yz.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/3UlOVgM9yz.jpg",
+ "relativePath": "images/3UlOVgM9yz.jpg",
+ "extension": "jpg",
+ "size": 145800,
+ "prettySize": "146 kB",
+ "modifiedTime": "2019-02-08T08:55:07.921Z",
+ "accessTime": "2019-02-08T08:55:07.921Z",
+ "changeTime": "2019-02-08T08:55:07.921Z",
+ "birthTime": "2019-02-08T08:55:07.921Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "3UlOVgM9yz.jpg",
+ "ext": ".jpg",
+ "name": "3UlOVgM9yz",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453838,
+ "blocks": 288,
+ "atimeMs": 1549616107921.2603,
+ "mtimeMs": 1549616107921.2603,
+ "ctimeMs": 1549616107921.2603,
+ "birthtimeMs": 1549616107921.2603,
+ "atime": "2019-02-08T08:55:07.921Z",
+ "mtime": "2019-02-08T08:55:07.921Z",
+ "ctime": "2019-02-08T08:55:07.921Z",
+ "birthtime": "2019-02-08T08:55:07.921Z"
+ },
+ {
+ "id": "764b3942-c154-52a1-9a0a-cc422572a352",
+ "children": [
+ "6503cf4b-80bb-54f7-b7af-a759055c558d"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "a7b8c880534ac5c210f0da4c8b852700",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/8rNAoWs9wR.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/8rNAoWs9wR.jpg",
+ "relativePath": "images/8rNAoWs9wR.jpg",
+ "extension": "jpg",
+ "size": 162215,
+ "prettySize": "162 kB",
+ "modifiedTime": "2019-02-08T08:55:07.925Z",
+ "accessTime": "2019-02-08T08:55:07.925Z",
+ "changeTime": "2019-02-08T08:55:07.925Z",
+ "birthTime": "2019-02-08T08:55:07.925Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "8rNAoWs9wR.jpg",
+ "ext": ".jpg",
+ "name": "8rNAoWs9wR",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453846,
+ "blocks": 320,
+ "atimeMs": 1549616107924.5935,
+ "mtimeMs": 1549616107924.5935,
+ "ctimeMs": 1549616107924.5935,
+ "birthtimeMs": 1549616107924.5935,
+ "atime": "2019-02-08T08:55:07.925Z",
+ "mtime": "2019-02-08T08:55:07.925Z",
+ "ctime": "2019-02-08T08:55:07.925Z",
+ "birthtime": "2019-02-08T08:55:07.925Z"
+ },
+ {
+ "id": "f3f69364-b797-5e77-a7b7-a7cca6124124",
+ "children": [
+ "8347bef3-7615-5041-889e-9d1d0e21df7b"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "1949cbb78a54ccd7b7f6be80ce5bf22e",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/BLhhsTZlGwd.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/BLhhsTZlGwd.jpg",
+ "relativePath": "images/BLhhsTZlGwd.jpg",
+ "extension": "jpg",
+ "size": 150655,
+ "prettySize": "151 kB",
+ "modifiedTime": "2019-02-08T08:55:07.931Z",
+ "accessTime": "2019-02-08T08:55:07.931Z",
+ "changeTime": "2019-02-08T08:55:07.931Z",
+ "birthTime": "2019-02-08T08:55:07.931Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "BLhhsTZlGwd.jpg",
+ "ext": ".jpg",
+ "name": "BLhhsTZlGwd",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453853,
+ "blocks": 296,
+ "atimeMs": 1549616107931.2603,
+ "mtimeMs": 1549616107931.2603,
+ "ctimeMs": 1549616107931.2603,
+ "birthtimeMs": 1549616107931.2603,
+ "atime": "2019-02-08T08:55:07.931Z",
+ "mtime": "2019-02-08T08:55:07.931Z",
+ "ctime": "2019-02-08T08:55:07.931Z",
+ "birthtime": "2019-02-08T08:55:07.931Z"
+ },
+ {
+ "id": "d72ea313-fe13-56fd-b3e0-3b30f986abe3",
+ "children": [
+ "d8355763-6b57-5141-8af4-4fef9518f87f"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "6b4a90bb8a9df452816b73a921a077c5",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/BSEdRj_B8HP.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/BSEdRj_B8HP.jpg",
+ "relativePath": "images/BSEdRj_B8HP.jpg",
+ "extension": "jpg",
+ "size": 165688,
+ "prettySize": "166 kB",
+ "modifiedTime": "2019-02-08T08:55:07.931Z",
+ "accessTime": "2019-02-08T08:55:07.931Z",
+ "changeTime": "2019-02-08T08:55:07.931Z",
+ "birthTime": "2019-02-08T08:55:07.931Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "BSEdRj_B8HP.jpg",
+ "ext": ".jpg",
+ "name": "BSEdRj_B8HP",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453854,
+ "blocks": 328,
+ "atimeMs": 1549616107931.2603,
+ "mtimeMs": 1549616107931.2603,
+ "ctimeMs": 1549616107931.2603,
+ "birthtimeMs": 1549616107931.2603,
+ "atime": "2019-02-08T08:55:07.931Z",
+ "mtime": "2019-02-08T08:55:07.931Z",
+ "ctime": "2019-02-08T08:55:07.931Z",
+ "birthtime": "2019-02-08T08:55:07.931Z"
+ },
+ {
+ "id": "14085584-d2d6-505c-b15e-18366c538350",
+ "children": [
+ "4ea50907-055a-5080-97eb-430182a400f6"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "753e3daa82ea260cfec5a30b16cd27ef",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/BdIpEzalAJx.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/BdIpEzalAJx.jpg",
+ "relativePath": "images/BdIpEzalAJx.jpg",
+ "extension": "jpg",
+ "size": 142370,
+ "prettySize": "142 kB",
+ "modifiedTime": "2019-02-08T08:55:07.938Z",
+ "accessTime": "2019-02-08T08:55:07.938Z",
+ "changeTime": "2019-02-08T08:55:07.938Z",
+ "birthTime": "2019-02-08T08:55:07.938Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "BdIpEzalAJx.jpg",
+ "ext": ".jpg",
+ "name": "BdIpEzalAJx",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453862,
+ "blocks": 280,
+ "atimeMs": 1549616107937.9268,
+ "mtimeMs": 1549616107937.9268,
+ "ctimeMs": 1549616107937.9268,
+ "birthtimeMs": 1549616107937.9268,
+ "atime": "2019-02-08T08:55:07.938Z",
+ "mtime": "2019-02-08T08:55:07.938Z",
+ "ctime": "2019-02-08T08:55:07.938Z",
+ "birthtime": "2019-02-08T08:55:07.938Z"
+ },
+ {
+ "id": "933a84a9-75b4-5d1b-ab13-7fa6dc512635",
+ "children": [
+ "5e40ac10-3140-596a-a2f1-6f24cae9a73b"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "b0e8b99b4f33ff57a12ff7d3c99dd534",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/BdiU-TTFP4h.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/BdiU-TTFP4h.jpg",
+ "relativePath": "images/BdiU-TTFP4h.jpg",
+ "extension": "jpg",
+ "size": 163326,
+ "prettySize": "163 kB",
+ "modifiedTime": "2019-02-08T08:55:07.938Z",
+ "accessTime": "2019-02-08T08:55:07.938Z",
+ "changeTime": "2019-02-08T08:55:07.938Z",
+ "birthTime": "2019-02-08T08:55:07.938Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "BdiU-TTFP4h.jpg",
+ "ext": ".jpg",
+ "name": "BdiU-TTFP4h",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453863,
+ "blocks": 320,
+ "atimeMs": 1549616107937.9268,
+ "mtimeMs": 1549616107937.9268,
+ "ctimeMs": 1549616107937.9268,
+ "birthtimeMs": 1549616107937.9268,
+ "atime": "2019-02-08T08:55:07.938Z",
+ "mtime": "2019-02-08T08:55:07.938Z",
+ "ctime": "2019-02-08T08:55:07.938Z",
+ "birthtime": "2019-02-08T08:55:07.938Z"
+ },
+ {
+ "id": "4902ea03-096b-5af7-a274-7814546687ef",
+ "children": [
+ "349d04c8-368f-5b97-b838-2d4d988072e4"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "d00220e3e4b792741841b85af042983d",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/V7AMWds949.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/V7AMWds949.jpg",
+ "relativePath": "images/V7AMWds949.jpg",
+ "extension": "jpg",
+ "size": 142755,
+ "prettySize": "143 kB",
+ "modifiedTime": "2019-02-08T08:55:07.938Z",
+ "accessTime": "2019-02-08T08:55:07.938Z",
+ "changeTime": "2019-02-08T08:55:07.938Z",
+ "birthTime": "2019-02-08T08:55:07.938Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "V7AMWds949.jpg",
+ "ext": ".jpg",
+ "name": "V7AMWds949",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453867,
+ "blocks": 280,
+ "atimeMs": 1549616107937.9268,
+ "mtimeMs": 1549616107937.9268,
+ "ctimeMs": 1549616107937.9268,
+ "birthtimeMs": 1549616107937.9268,
+ "atime": "2019-02-08T08:55:07.938Z",
+ "mtime": "2019-02-08T08:55:07.938Z",
+ "ctime": "2019-02-08T08:55:07.938Z",
+ "birthtime": "2019-02-08T08:55:07.938Z"
+ },
+ {
+ "id": "76885354-e4ab-5649-b98f-8e5a75c0b7c6",
+ "children": [
+ "34152597-9a17-5250-8fab-074a17f83f99"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "17fbab6f315a13755c50133b2120d84e",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/Vmws0_s9yL.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/Vmws0_s9yL.jpg",
+ "relativePath": "images/Vmws0_s9yL.jpg",
+ "extension": "jpg",
+ "size": 153102,
+ "prettySize": "153 kB",
+ "modifiedTime": "2019-02-08T08:55:07.941Z",
+ "accessTime": "2019-02-08T08:55:07.938Z",
+ "changeTime": "2019-02-08T08:55:07.941Z",
+ "birthTime": "2019-02-08T08:55:07.941Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "Vmws0_s9yL.jpg",
+ "ext": ".jpg",
+ "name": "Vmws0_s9yL",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453869,
+ "blocks": 304,
+ "atimeMs": 1549616107937.9268,
+ "mtimeMs": 1549616107941.2603,
+ "ctimeMs": 1549616107941.2603,
+ "birthtimeMs": 1549616107941.2603,
+ "atime": "2019-02-08T08:55:07.938Z",
+ "mtime": "2019-02-08T08:55:07.941Z",
+ "ctime": "2019-02-08T08:55:07.941Z",
+ "birthtime": "2019-02-08T08:55:07.941Z"
+ },
+ {
+ "id": "1221d4f2-c8f5-5268-b0e7-fcd0aa12d598",
+ "children": [
+ "6582f45a-6f10-5656-9bcd-205b18f3578a"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "312d4c34b4bba4e8143c6f8bf9bfbea6",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/YBJ_8xM91G.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/YBJ_8xM91G.jpg",
+ "relativePath": "images/YBJ_8xM91G.jpg",
+ "extension": "jpg",
+ "size": 133831,
+ "prettySize": "134 kB",
+ "modifiedTime": "2019-02-08T08:55:07.941Z",
+ "accessTime": "2019-02-08T08:55:07.941Z",
+ "changeTime": "2019-02-08T08:55:07.941Z",
+ "birthTime": "2019-02-08T08:55:07.941Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "YBJ_8xM91G.jpg",
+ "ext": ".jpg",
+ "name": "YBJ_8xM91G",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453873,
+ "blocks": 264,
+ "atimeMs": 1549616107941.2603,
+ "mtimeMs": 1549616107941.2603,
+ "ctimeMs": 1549616107941.2603,
+ "birthtimeMs": 1549616107941.2603,
+ "atime": "2019-02-08T08:55:07.941Z",
+ "mtime": "2019-02-08T08:55:07.941Z",
+ "ctime": "2019-02-08T08:55:07.941Z",
+ "birthtime": "2019-02-08T08:55:07.941Z"
+ },
+ {
+ "id": "fe7f4316-fb22-5cc0-a414-48f12f2a41da",
+ "children": [
+ "e960cdfc-bc59-5b7d-aeb3-fbeb79d0cd8c"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "b5a6a1676f667a0444c7e9d4ba6472f3",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/YA47taM9xR.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/YA47taM9xR.jpg",
+ "relativePath": "images/YA47taM9xR.jpg",
+ "extension": "jpg",
+ "size": 160993,
+ "prettySize": "161 kB",
+ "modifiedTime": "2019-02-08T08:55:07.941Z",
+ "accessTime": "2019-02-08T08:55:07.941Z",
+ "changeTime": "2019-02-08T08:55:07.941Z",
+ "birthTime": "2019-02-08T08:55:07.941Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "YA47taM9xR.jpg",
+ "ext": ".jpg",
+ "name": "YA47taM9xR",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453872,
+ "blocks": 320,
+ "atimeMs": 1549616107941.2603,
+ "mtimeMs": 1549616107941.2603,
+ "ctimeMs": 1549616107941.2603,
+ "birthtimeMs": 1549616107941.2603,
+ "atime": "2019-02-08T08:55:07.941Z",
+ "mtime": "2019-02-08T08:55:07.941Z",
+ "ctime": "2019-02-08T08:55:07.941Z",
+ "birthtime": "2019-02-08T08:55:07.941Z"
+ },
+ {
+ "id": "4b976bd1-00ad-5bea-81d5-aa845f0081dc",
+ "children": [
+ "68b4838a-e6c7-5d36-a661-301b45843aeb"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "5918a7fcb8e8c9d1cfb7ed39e9391b32",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/YBKLxfs91e.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/YBKLxfs91e.jpg",
+ "relativePath": "images/YBKLxfs91e.jpg",
+ "extension": "jpg",
+ "size": 148404,
+ "prettySize": "148 kB",
+ "modifiedTime": "2019-02-08T08:55:07.941Z",
+ "accessTime": "2019-02-08T08:55:07.941Z",
+ "changeTime": "2019-02-08T08:55:07.941Z",
+ "birthTime": "2019-02-08T08:55:07.941Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "YBKLxfs91e.jpg",
+ "ext": ".jpg",
+ "name": "YBKLxfs91e",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453874,
+ "blocks": 296,
+ "atimeMs": 1549616107941.2603,
+ "mtimeMs": 1549616107941.2603,
+ "ctimeMs": 1549616107941.2603,
+ "birthtimeMs": 1549616107941.2603,
+ "atime": "2019-02-08T08:55:07.941Z",
+ "mtime": "2019-02-08T08:55:07.941Z",
+ "ctime": "2019-02-08T08:55:07.941Z",
+ "birthtime": "2019-02-08T08:55:07.941Z"
+ },
+ {
+ "id": "2a8de103-3662-541b-a0b9-a384e7ec141c",
+ "children": [
+ "c92a09ee-5025-556c-a536-7cd1182a1f75"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "ac148a522d9d29989de0380c2b416b09",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/aWqdbpM99F.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/aWqdbpM99F.jpg",
+ "relativePath": "images/aWqdbpM99F.jpg",
+ "extension": "jpg",
+ "size": 132315,
+ "prettySize": "132 kB",
+ "modifiedTime": "2019-02-08T08:55:07.945Z",
+ "accessTime": "2019-02-08T08:55:07.945Z",
+ "changeTime": "2019-02-08T08:55:07.945Z",
+ "birthTime": "2019-02-08T08:55:07.945Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "aWqdbpM99F.jpg",
+ "ext": ".jpg",
+ "name": "aWqdbpM99F",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453879,
+ "blocks": 264,
+ "atimeMs": 1549616107944.5935,
+ "mtimeMs": 1549616107944.5935,
+ "ctimeMs": 1549616107944.5935,
+ "birthtimeMs": 1549616107944.5935,
+ "atime": "2019-02-08T08:55:07.945Z",
+ "mtime": "2019-02-08T08:55:07.945Z",
+ "ctime": "2019-02-08T08:55:07.945Z",
+ "birthtime": "2019-02-08T08:55:07.945Z"
+ },
+ {
+ "id": "792f605d-6d45-50cc-b1fe-3d3852795915",
+ "children": [
+ "36877a4e-6f98-5bc5-acf4-71c6c70c1f10"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "9131efb20760a4549bc102032737eeb8",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/bSOo_Gs98O.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/bSOo_Gs98O.jpg",
+ "relativePath": "images/bSOo_Gs98O.jpg",
+ "extension": "jpg",
+ "size": 133888,
+ "prettySize": "134 kB",
+ "modifiedTime": "2019-02-08T08:55:07.945Z",
+ "accessTime": "2019-02-08T08:55:07.945Z",
+ "changeTime": "2019-02-08T08:55:07.945Z",
+ "birthTime": "2019-02-08T08:55:07.945Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "bSOo_Gs98O.jpg",
+ "ext": ".jpg",
+ "name": "bSOo_Gs98O",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453880,
+ "blocks": 264,
+ "atimeMs": 1549616107944.5935,
+ "mtimeMs": 1549616107944.5935,
+ "ctimeMs": 1549616107944.5935,
+ "birthtimeMs": 1549616107944.5935,
+ "atime": "2019-02-08T08:55:07.945Z",
+ "mtime": "2019-02-08T08:55:07.945Z",
+ "ctime": "2019-02-08T08:55:07.945Z",
+ "birthtime": "2019-02-08T08:55:07.945Z"
+ },
+ {
+ "id": "cd24a64f-32cb-5167-a6fe-783a46d7ca4b",
+ "children": [
+ "c6154f11-7111-5af9-bc65-e339d6e68db9"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "2bce315ca5a1d4f5236850a7b953e99b",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/dUimPbM9-K.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/dUimPbM9-K.jpg",
+ "relativePath": "images/dUimPbM9-K.jpg",
+ "extension": "jpg",
+ "size": 134095,
+ "prettySize": "134 kB",
+ "modifiedTime": "2019-02-08T08:55:07.948Z",
+ "accessTime": "2019-02-08T08:55:07.948Z",
+ "changeTime": "2019-02-08T08:55:07.948Z",
+ "birthTime": "2019-02-08T08:55:07.948Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "dUimPbM9-K.jpg",
+ "ext": ".jpg",
+ "name": "dUimPbM9-K",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453887,
+ "blocks": 264,
+ "atimeMs": 1549616107947.9268,
+ "mtimeMs": 1549616107947.9268,
+ "ctimeMs": 1549616107947.9268,
+ "birthtimeMs": 1549616107947.9268,
+ "atime": "2019-02-08T08:55:07.948Z",
+ "mtime": "2019-02-08T08:55:07.948Z",
+ "ctime": "2019-02-08T08:55:07.948Z",
+ "birthtime": "2019-02-08T08:55:07.948Z"
+ },
+ {
+ "id": "da2bca11-40c5-5629-8ac5-d4e80b3002e7",
+ "children": [],
+ "parent": "25bfb17b-4867-52b0-b6b2-31141ffd66ea",
+ "internal": {
+ "contentDigest": "12d6834787247fa1fd603472dca4779b",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "c364338a-eb65-5925-a014-effd93849b40",
+ "children": [],
+ "parent": "b35cc487-b060-5849-a332-ae2b6214b30b",
+ "internal": {
+ "contentDigest": "113c46804bc8908ced0a7bd6c7d24f7b",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "4d9816a7-3885-5dd4-bbe6-85c655a48316",
+ "children": [],
+ "parent": "63209335-2764-5ec8-b050-ab0acf938a05",
+ "internal": {
+ "contentDigest": "fce6b57d4f233faed53317605e60455e",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "442f41c4-bbf2-5124-8602-f242880c593f",
+ "children": [],
+ "parent": "91d496c3-3368-5810-811f-7523e45582dd",
+ "internal": {
+ "contentDigest": "a9f1eea7376c2d4c9f366f8750fc9623",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "adb8e4b2-34ed-5f31-b6d7-60b144c100d3",
+ "children": [],
+ "parent": "605ea709-2f6b-5c32-84dd-c01d1d764a55",
+ "internal": {
+ "contentDigest": "a7680535f18d909cdf3f60908dedc9bb",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "fa1545ee-c421-566f-a062-5b3cc5ed86df",
+ "children": [],
+ "parent": "c61e32c1-b74a-577d-bcc5-71e591546782",
+ "internal": {
+ "contentDigest": "70db28f9118ddc122d2aad303021137c",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "3f06569d-ebc6-5848-a69d-5ff64a9d9b67",
+ "children": [],
+ "parent": "538f5859-d9a3-589e-8dde-3e731732b0ca",
+ "internal": {
+ "contentDigest": "96cc7e05e1dd76339a0332b39dfc4640",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "42244d78-fac3-5e3b-9f14-02a15c31b548",
+ "children": [],
+ "parent": "632d64a1-e24c-55fe-a3b3-a4a31997af39",
+ "internal": {
+ "contentDigest": "3a533f4c318f142c43c6aea513fde2ee",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "8a7742e1-6b5a-59f8-9d48-f0abf0ea86a9",
+ "children": [],
+ "parent": "922f795a-bf71-5370-bf64-e04720bd110e",
+ "internal": {
+ "contentDigest": "9c8ce28260d2ae31eb2ed1b06bbd473e",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "2f9bc223-d0e2-57c4-9de2-0de4c32d6ec3",
+ "children": [],
+ "parent": "14d49c41-5571-57c5-b7f8-07e5d19e24fc",
+ "internal": {
+ "contentDigest": "c687cf5f4977f346c919e3f0b10a5fd3",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "cdaeb064-5204-570a-b236-f8410c35fcff",
+ "children": [],
+ "parent": "b8d1824e-97a7-58ad-8f6a-9eca8ffe31c5",
+ "internal": {
+ "contentDigest": "96fad019fa39ab34f2ad3b09cc17a1e2",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "eeac8d14-bf7c-5762-ab78-4d172dd5afe3",
+ "children": [],
+ "parent": "c52dd4e6-274f-556f-84af-21c118aa6cca",
+ "internal": {
+ "contentDigest": "31ba31edc1bf4fdf281939ae690236de",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "a5c97fc5-c9f1-54c0-9233-210fe1f160b0",
+ "children": [],
+ "parent": "f64841a4-4d95-5112-9348-bc562961db4d",
+ "internal": {
+ "contentDigest": "3f7ccb765115bdcdb775a7cecd5bce2d",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "b0cedf3b-cd9b-5421-9d27-48a8f2da610f",
+ "children": [],
+ "parent": "b633e034-a20b-5d41-a9b0-11e9d621d983",
+ "internal": {
+ "contentDigest": "1fd8c62f69302a0232f236888d945b75",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "9034de88-ace8-585c-b0fe-acea09a60b4f",
+ "children": [],
+ "parent": "dc8d98cd-9a4b-5c95-978c-72e5e003d3a9",
+ "internal": {
+ "contentDigest": "af544090b8d1f2150b5ebfab252dbf3e",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "f59e19cb-3173-5247-a277-76b3b8250b4b",
+ "children": [],
+ "parent": "c9a40590-98f2-560d-b091-34e10179dc1c",
+ "internal": {
+ "contentDigest": "ce267a020dec9362be41e06d8d586975",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "da1377ca-7e8f-5196-a4fd-d0a4f3589a41",
+ "children": [],
+ "parent": "19f096ac-7d47-53e3-81df-5f6b6fd942b7",
+ "internal": {
+ "contentDigest": "46bfd9fcfe5f42f54aafc1e4dd7b40d2",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "ad5bf0e8-78e6-5c06-8f36-18de7bfe675a",
+ "children": [],
+ "parent": "6bb783c1-92c8-5a66-8b1c-97aeb2f18647",
+ "internal": {
+ "contentDigest": "8e4fa5e7e3dae7c02bd280bb24e95c66",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "4be4599e-5f28-5597-9b97-5d689b785dc3",
+ "children": [],
+ "parent": "ac3d890f-c2bd-5ccc-a584-ab773e2bb356",
+ "internal": {
+ "contentDigest": "0f3cf0fd60b391d081376a9912172984",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "cc003810-50ca-5300-921f-f45dc27bb000",
+ "children": [],
+ "parent": "19737ea3-cf41-5044-9262-cc8a00ba37a2",
+ "internal": {
+ "contentDigest": "4e0218a426f7ca098de8f79f19a9812a",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "07adb971-0e2b-52a2-9851-73a0c0c2b841",
+ "children": [],
+ "parent": "eddf5a86-e422-5513-aace-a59d556fab11",
+ "internal": {
+ "contentDigest": "288bf0943ae797b95a21705b79a45c26",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "d53df682-65cb-509b-b179-88d7b95a97e2",
+ "children": [],
+ "parent": "b1b28a49-b910-5669-ad19-d2917aa1bfdf",
+ "internal": {
+ "contentDigest": "82de37baa6823ff4a3ac419158d02ab3",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "4a42eab4-43b3-5d69-8a5b-37d744d78ead",
+ "children": [],
+ "parent": "4f84a220-540e-5fdb-91c0-5f680c657eea",
+ "internal": {
+ "contentDigest": "4f455e646bcb5a9b3b2160f5997611e7",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "8bb85c36-4986-5dca-a1ef-935fc216b78a",
+ "children": [],
+ "parent": "c3e4eeee-a771-5915-a1ea-5f8aa5496e2b",
+ "internal": {
+ "contentDigest": "695a76d7cd1ff8a8fbe78ea9482bc4e7",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "9a6c566e-9b00-5135-a512-a7375437d91b",
+ "children": [],
+ "parent": "d4f6feaa-9001-5ca8-8f11-d5d01cd9d254",
+ "internal": {
+ "contentDigest": "654eaeabf3232517b925392ff64244dd",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "5868eb13-70c3-5331-984c-7ceaa5c309ca",
+ "children": [],
+ "parent": "9b6b9a69-0c6e-5abe-986b-7b11cd1764e6",
+ "internal": {
+ "contentDigest": "d110db904291dc24c26b5e2696e59338",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "02673219-a18f-5c15-a63c-550dd5bf110d",
+ "children": [],
+ "parent": "fe6abbeb-14b1-52c4-916c-6498b0694452",
+ "internal": {
+ "contentDigest": "fd95ba3ac4e3bbc7331025248432a239",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "11b30767-49c7-594f-8d4d-760356e21321",
+ "children": [],
+ "parent": "7051dfff-7b4a-5d7f-947f-c85e2034b05e",
+ "internal": {
+ "contentDigest": "a513d53f3a11403596639be3a1d3bedd",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "1da41841-fb71-52b0-9bac-b9abefcfe47a",
+ "children": [],
+ "parent": "de0199a4-a8f3-5fee-a01e-3637d7424778",
+ "internal": {
+ "contentDigest": "32fcef3d89b53f53148ffb0a61feb53a",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "b7587480-754e-5318-bfd4-5b73acc41548",
+ "children": [],
+ "parent": "4957ed17-f7ed-5ef1-8ea1-0ce081bb357c",
+ "internal": {
+ "contentDigest": "d3a2dca69116b045287f258388a60718",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "2d3de8d8-437a-5ca5-9ba2-181af73e42d7",
+ "children": [],
+ "parent": "5dfa0a18-5fd7-5bc8-b763-61e8a0aa110d",
+ "internal": {
+ "contentDigest": "c229673b43857230fa2c7b3969eaab42",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "dea320e4-3a3c-520c-ba44-6336e369315f",
+ "children": [],
+ "parent": "41f4e7be-c697-5c50-be60-9ca3828603c7",
+ "internal": {
+ "contentDigest": "92b29ea9b9b5d01a2e00ae8a5e8f73aa",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "2d54e667-4d48-5698-8510-2a5e463e939a",
+ "children": [],
+ "parent": "0229ab2d-e417-59b4-b2a5-22a7714092df",
+ "internal": {
+ "contentDigest": "ee0bb483ba82477ad08c43d9a463dd48",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "326f8570-2d93-5ce1-9896-111bc85486af",
+ "children": [],
+ "parent": "f87566b3-c14c-5cac-b9db-190fdf797a8b",
+ "internal": {
+ "contentDigest": "951de4497ed7365c199cf73d9a18b0c4",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "9815f23e-7bf8-5aba-b9c2-ee9ee31d0a6a",
+ "children": [],
+ "parent": "7908fb4d-98d9-5e13-b9f0-84b52012a546",
+ "internal": {
+ "contentDigest": "f7b42abd98737507194603523c20a00b",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "e0111747-3565-5d71-9c95-4339fb01006e",
+ "children": [],
+ "parent": "14fff379-a53f-5902-9d91-d3973b5fa952",
+ "internal": {
+ "contentDigest": "a005f461571fcc05eb8a9972e6b9c3fb",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "bc663945-deb3-5070-9a5b-367df4a50400",
+ "children": [],
+ "parent": "fb621d85-5a2c-59c1-afd2-243507d447b5",
+ "internal": {
+ "contentDigest": "36a057b15efdf7e657949dcaf2b5a5ca",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "4d53a1c1-4ade-5627-9297-1c8cb7642f0a",
+ "children": [],
+ "parent": "fd3c1dc8-5ed1-5194-891a-d6af0c3952c9",
+ "internal": {
+ "contentDigest": "565cb37da59eeddeb6ddf0667e1f6aa7",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "02606998-d4ff-5676-a381-d9a587c42ffb",
+ "children": [],
+ "parent": "03b29c0e-71da-5ebf-8a51-caa50706b0de",
+ "internal": {
+ "contentDigest": "e473c8292e19bb448af74410a8f45edc",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "6503cf4b-80bb-54f7-b7af-a759055c558d",
+ "children": [],
+ "parent": "764b3942-c154-52a1-9a0a-cc422572a352",
+ "internal": {
+ "contentDigest": "a7b8c880534ac5c210f0da4c8b852700",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "8347bef3-7615-5041-889e-9d1d0e21df7b",
+ "children": [],
+ "parent": "f3f69364-b797-5e77-a7b7-a7cca6124124",
+ "internal": {
+ "contentDigest": "1949cbb78a54ccd7b7f6be80ce5bf22e",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "d8355763-6b57-5141-8af4-4fef9518f87f",
+ "children": [],
+ "parent": "d72ea313-fe13-56fd-b3e0-3b30f986abe3",
+ "internal": {
+ "contentDigest": "6b4a90bb8a9df452816b73a921a077c5",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "4ea50907-055a-5080-97eb-430182a400f6",
+ "children": [],
+ "parent": "14085584-d2d6-505c-b15e-18366c538350",
+ "internal": {
+ "contentDigest": "753e3daa82ea260cfec5a30b16cd27ef",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "5e40ac10-3140-596a-a2f1-6f24cae9a73b",
+ "children": [],
+ "parent": "933a84a9-75b4-5d1b-ab13-7fa6dc512635",
+ "internal": {
+ "contentDigest": "b0e8b99b4f33ff57a12ff7d3c99dd534",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "349d04c8-368f-5b97-b838-2d4d988072e4",
+ "children": [],
+ "parent": "4902ea03-096b-5af7-a274-7814546687ef",
+ "internal": {
+ "contentDigest": "d00220e3e4b792741841b85af042983d",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "34152597-9a17-5250-8fab-074a17f83f99",
+ "children": [],
+ "parent": "76885354-e4ab-5649-b98f-8e5a75c0b7c6",
+ "internal": {
+ "contentDigest": "17fbab6f315a13755c50133b2120d84e",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "6582f45a-6f10-5656-9bcd-205b18f3578a",
+ "children": [],
+ "parent": "1221d4f2-c8f5-5268-b0e7-fcd0aa12d598",
+ "internal": {
+ "contentDigest": "312d4c34b4bba4e8143c6f8bf9bfbea6",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "e960cdfc-bc59-5b7d-aeb3-fbeb79d0cd8c",
+ "children": [],
+ "parent": "fe7f4316-fb22-5cc0-a414-48f12f2a41da",
+ "internal": {
+ "contentDigest": "b5a6a1676f667a0444c7e9d4ba6472f3",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "68b4838a-e6c7-5d36-a661-301b45843aeb",
+ "children": [],
+ "parent": "4b976bd1-00ad-5bea-81d5-aa845f0081dc",
+ "internal": {
+ "contentDigest": "5918a7fcb8e8c9d1cfb7ed39e9391b32",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "c92a09ee-5025-556c-a536-7cd1182a1f75",
+ "children": [],
+ "parent": "2a8de103-3662-541b-a0b9-a384e7ec141c",
+ "internal": {
+ "contentDigest": "ac148a522d9d29989de0380c2b416b09",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "36877a4e-6f98-5bc5-acf4-71c6c70c1f10",
+ "children": [],
+ "parent": "792f605d-6d45-50cc-b1fe-3d3852795915",
+ "internal": {
+ "contentDigest": "9131efb20760a4549bc102032737eeb8",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "c6154f11-7111-5af9-bc65-e339d6e68db9",
+ "children": [],
+ "parent": "cd24a64f-32cb-5167-a6fe-783a46d7ca4b",
+ "internal": {
+ "contentDigest": "2bce315ca5a1d4f5236850a7b953e99b",
+ "type": "ImageSharp",
+ "owner": "gatsby-transformer-sharp"
+ }
+ },
+ {
+ "id": "29f5369d-8108-5d6a-8328-d266944a63ce",
+ "children": [
+ "f6cf4e6b-590e-5515-a0f9-e164c5d36d5f"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "b92813a0608bc12340061e5882d93abb",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/gb7GOoM92V.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/gb7GOoM92V.jpg",
+ "relativePath": "images/gb7GOoM92V.jpg",
+ "extension": "jpg",
+ "size": 145057,
+ "prettySize": "145 kB",
+ "modifiedTime": "2019-02-08T08:55:07.948Z",
+ "accessTime": "2019-02-08T08:55:07.948Z",
+ "changeTime": "2019-02-08T08:55:07.948Z",
+ "birthTime": "2019-02-08T08:55:07.948Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "gb7GOoM92V.jpg",
+ "ext": ".jpg",
+ "name": "gb7GOoM92V",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453890,
+ "blocks": 288,
+ "atimeMs": 1549616107947.9268,
+ "mtimeMs": 1549616107947.9268,
+ "ctimeMs": 1549616107947.9268,
+ "birthtimeMs": 1549616107947.9268,
+ "atime": "2019-02-08T08:55:07.948Z",
+ "mtime": "2019-02-08T08:55:07.948Z",
+ "ctime": "2019-02-08T08:55:07.948Z",
+ "birthtime": "2019-02-08T08:55:07.948Z"
+ },
+ {
+ "id": "3ec85680-8562-56fe-9dd2-05278a92b5cc",
+ "children": [
+ "f4fb0237-4f43-5acc-8a65-c49d5f809b1f"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "47ef7dc01d0534f0719af9379714e732",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/hG-1k4s9yJ.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/hG-1k4s9yJ.jpg",
+ "relativePath": "images/hG-1k4s9yJ.jpg",
+ "extension": "jpg",
+ "size": 152267,
+ "prettySize": "152 kB",
+ "modifiedTime": "2019-02-08T08:55:07.951Z",
+ "accessTime": "2019-02-08T08:55:07.948Z",
+ "changeTime": "2019-02-08T08:55:07.951Z",
+ "birthTime": "2019-02-08T08:55:07.951Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "hG-1k4s9yJ.jpg",
+ "ext": ".jpg",
+ "name": "hG-1k4s9yJ",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453893,
+ "blocks": 304,
+ "atimeMs": 1549616107947.9268,
+ "mtimeMs": 1549616107951.2603,
+ "ctimeMs": 1549616107951.2603,
+ "birthtimeMs": 1549616107951.2603,
+ "atime": "2019-02-08T08:55:07.948Z",
+ "mtime": "2019-02-08T08:55:07.951Z",
+ "ctime": "2019-02-08T08:55:07.951Z",
+ "birthtime": "2019-02-08T08:55:07.951Z"
+ },
+ {
+ "id": "73ff79eb-7c36-52f8-8d0c-5ba294e09a27",
+ "children": [
+ "9980f111-9638-5121-b5de-51c4869685a0"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "8682e77e0894df0d6ee3e65d4781b418",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/hSNJLVs9_0.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/hSNJLVs9_0.jpg",
+ "relativePath": "images/hSNJLVs9_0.jpg",
+ "extension": "jpg",
+ "size": 163625,
+ "prettySize": "164 kB",
+ "modifiedTime": "2019-02-08T08:55:07.951Z",
+ "accessTime": "2019-02-08T08:55:07.951Z",
+ "changeTime": "2019-02-08T08:55:07.951Z",
+ "birthTime": "2019-02-08T08:55:07.951Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "hSNJLVs9_0.jpg",
+ "ext": ".jpg",
+ "name": "hSNJLVs9_0",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453896,
+ "blocks": 320,
+ "atimeMs": 1549616107951.2603,
+ "mtimeMs": 1549616107951.2603,
+ "ctimeMs": 1549616107951.2603,
+ "birthtimeMs": 1549616107951.2603,
+ "atime": "2019-02-08T08:55:07.951Z",
+ "mtime": "2019-02-08T08:55:07.951Z",
+ "ctime": "2019-02-08T08:55:07.951Z",
+ "birthtime": "2019-02-08T08:55:07.951Z"
+ },
+ {
+ "id": "e6c580e0-1f87-523f-bcd7-170a47ac88a3",
+ "children": [
+ "b36193d8-4a0b-5cef-b150-b121d2a1d559"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "3d2f982848b850a5a313efcaa3c46d76",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/hd7P_nM98p.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/hd7P_nM98p.jpg",
+ "relativePath": "images/hd7P_nM98p.jpg",
+ "extension": "jpg",
+ "size": 136739,
+ "prettySize": "137 kB",
+ "modifiedTime": "2019-02-08T08:55:07.951Z",
+ "accessTime": "2019-02-08T08:55:07.951Z",
+ "changeTime": "2019-02-08T08:55:07.951Z",
+ "birthTime": "2019-02-08T08:55:07.951Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "hd7P_nM98p.jpg",
+ "ext": ".jpg",
+ "name": "hd7P_nM98p",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453895,
+ "blocks": 272,
+ "atimeMs": 1549616107951.2603,
+ "mtimeMs": 1549616107951.2603,
+ "ctimeMs": 1549616107951.2603,
+ "birthtimeMs": 1549616107951.2603,
+ "atime": "2019-02-08T08:55:07.951Z",
+ "mtime": "2019-02-08T08:55:07.951Z",
+ "ctime": "2019-02-08T08:55:07.951Z",
+ "birthtime": "2019-02-08T08:55:07.951Z"
+ },
+ {
+ "id": "47fd50e1-52a2-5faf-896d-e493f98f9034",
+ "children": [
+ "8d3ac1fd-20ff-5914-b364-47d98d106d27"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "f78f68624655ffd1cbf779ee7803057a",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/jKzbvCs9_9.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/jKzbvCs9_9.jpg",
+ "relativePath": "images/jKzbvCs9_9.jpg",
+ "extension": "jpg",
+ "size": 143584,
+ "prettySize": "144 kB",
+ "modifiedTime": "2019-02-08T08:55:07.955Z",
+ "accessTime": "2019-02-08T08:55:07.955Z",
+ "changeTime": "2019-02-08T08:55:07.955Z",
+ "birthTime": "2019-02-08T08:55:07.955Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "jKzbvCs9_9.jpg",
+ "ext": ".jpg",
+ "name": "jKzbvCs9_9",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453905,
+ "blocks": 288,
+ "atimeMs": 1549616107954.5935,
+ "mtimeMs": 1549616107954.5935,
+ "ctimeMs": 1549616107954.5935,
+ "birthtimeMs": 1549616107954.5935,
+ "atime": "2019-02-08T08:55:07.955Z",
+ "mtime": "2019-02-08T08:55:07.955Z",
+ "ctime": "2019-02-08T08:55:07.955Z",
+ "birthtime": "2019-02-08T08:55:07.955Z"
+ },
+ {
+ "id": "e78659b1-96a0-591b-9eba-a9f4296191ed",
+ "children": [
+ "5f4f8277-f1a5-574c-80ae-a9cad81b24f0"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "2be93a5bd589a6e10b5ec9ff8d52e3cb",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/jU-tlcM9-_.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/jU-tlcM9-_.jpg",
+ "relativePath": "images/jU-tlcM9-_.jpg",
+ "extension": "jpg",
+ "size": 132657,
+ "prettySize": "133 kB",
+ "modifiedTime": "2019-02-08T08:55:07.955Z",
+ "accessTime": "2019-02-08T08:55:07.955Z",
+ "changeTime": "2019-02-08T08:55:07.955Z",
+ "birthTime": "2019-02-08T08:55:07.955Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "jU-tlcM9-_.jpg",
+ "ext": ".jpg",
+ "name": "jU-tlcM9-_",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453906,
+ "blocks": 264,
+ "atimeMs": 1549616107954.5935,
+ "mtimeMs": 1549616107954.5935,
+ "ctimeMs": 1549616107954.5935,
+ "birthtimeMs": 1549616107954.5935,
+ "atime": "2019-02-08T08:55:07.955Z",
+ "mtime": "2019-02-08T08:55:07.955Z",
+ "ctime": "2019-02-08T08:55:07.955Z",
+ "birthtime": "2019-02-08T08:55:07.955Z"
+ },
+ {
+ "id": "2dc47b1b-bb47-5353-857a-34632bb43351",
+ "children": [
+ "71a5e7e2-80e6-5b5e-b823-3d0e5940f58b"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "570a71489dec85b03f29a4e68654c4e9",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/nQtXUns97Y.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/nQtXUns97Y.jpg",
+ "relativePath": "images/nQtXUns97Y.jpg",
+ "extension": "jpg",
+ "size": 180316,
+ "prettySize": "180 kB",
+ "modifiedTime": "2019-02-08T08:55:07.958Z",
+ "accessTime": "2019-02-08T08:55:07.958Z",
+ "changeTime": "2019-02-08T08:55:07.958Z",
+ "birthTime": "2019-02-08T08:55:07.958Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "nQtXUns97Y.jpg",
+ "ext": ".jpg",
+ "name": "nQtXUns97Y",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453918,
+ "blocks": 360,
+ "atimeMs": 1549616107957.9268,
+ "mtimeMs": 1549616107957.9268,
+ "ctimeMs": 1549616107957.9268,
+ "birthtimeMs": 1549616107957.9268,
+ "atime": "2019-02-08T08:55:07.958Z",
+ "mtime": "2019-02-08T08:55:07.958Z",
+ "ctime": "2019-02-08T08:55:07.958Z",
+ "birthtime": "2019-02-08T08:55:07.958Z"
+ },
+ {
+ "id": "64fd4aea-27e4-5a24-87b2-4b025d4ab76a",
+ "children": [
+ "f5376bd2-b65a-5dc4-8150-fdc8a89eb1a8"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "0520f8a8807c390404a4d7f8d2cd512e",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/ov6A6Xs93f.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/ov6A6Xs93f.jpg",
+ "relativePath": "images/ov6A6Xs93f.jpg",
+ "extension": "jpg",
+ "size": 161456,
+ "prettySize": "161 kB",
+ "modifiedTime": "2019-02-08T08:55:07.961Z",
+ "accessTime": "2019-02-08T08:55:07.961Z",
+ "changeTime": "2019-02-08T08:55:07.961Z",
+ "birthTime": "2019-02-08T08:55:07.961Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "ov6A6Xs93f.jpg",
+ "ext": ".jpg",
+ "name": "ov6A6Xs93f",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453929,
+ "blocks": 320,
+ "atimeMs": 1549616107961.26,
+ "mtimeMs": 1549616107961.26,
+ "ctimeMs": 1549616107961.26,
+ "birthtimeMs": 1549616107961.26,
+ "atime": "2019-02-08T08:55:07.961Z",
+ "mtime": "2019-02-08T08:55:07.961Z",
+ "ctime": "2019-02-08T08:55:07.961Z",
+ "birthtime": "2019-02-08T08:55:07.961Z"
+ },
+ {
+ "id": "85ca8b03-3685-5a26-92c7-8076d158f8dd",
+ "children": [
+ "152364d9-6590-5dd1-88dd-042e251b33ef"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "9a121a607116f40f35013e58b1455229",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/saS0ZtM9x5.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/saS0ZtM9x5.jpg",
+ "relativePath": "images/saS0ZtM9x5.jpg",
+ "extension": "jpg",
+ "size": 175347,
+ "prettySize": "175 kB",
+ "modifiedTime": "2019-02-08T08:55:07.965Z",
+ "accessTime": "2019-02-08T08:55:07.965Z",
+ "changeTime": "2019-02-08T08:55:07.965Z",
+ "birthTime": "2019-02-08T08:55:07.965Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "saS0ZtM9x5.jpg",
+ "ext": ".jpg",
+ "name": "saS0ZtM9x5",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453933,
+ "blocks": 344,
+ "atimeMs": 1549616107964.5935,
+ "mtimeMs": 1549616107964.5935,
+ "ctimeMs": 1549616107964.5935,
+ "birthtimeMs": 1549616107964.5935,
+ "atime": "2019-02-08T08:55:07.965Z",
+ "mtime": "2019-02-08T08:55:07.965Z",
+ "ctime": "2019-02-08T08:55:07.965Z",
+ "birthtime": "2019-02-08T08:55:07.965Z"
+ },
+ {
+ "id": "1e621a1e-31fa-5bc6-87a0-c9f69386cf9e",
+ "children": [
+ "33bf67bd-d1b3-5915-a801-de7b2629c4a3"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "bfc29e26125f8afe0e281e612a6c28a0",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/rf52zpM98X.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/rf52zpM98X.jpg",
+ "relativePath": "images/rf52zpM98X.jpg",
+ "extension": "jpg",
+ "size": 141454,
+ "prettySize": "141 kB",
+ "modifiedTime": "2019-02-08T08:55:07.965Z",
+ "accessTime": "2019-02-08T08:55:07.961Z",
+ "changeTime": "2019-02-08T08:55:07.965Z",
+ "birthTime": "2019-02-08T08:55:07.965Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "rf52zpM98X.jpg",
+ "ext": ".jpg",
+ "name": "rf52zpM98X",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453932,
+ "blocks": 280,
+ "atimeMs": 1549616107961.26,
+ "mtimeMs": 1549616107964.5935,
+ "ctimeMs": 1549616107964.5935,
+ "birthtimeMs": 1549616107964.5935,
+ "atime": "2019-02-08T08:55:07.961Z",
+ "mtime": "2019-02-08T08:55:07.965Z",
+ "ctime": "2019-02-08T08:55:07.965Z",
+ "birthtime": "2019-02-08T08:55:07.965Z"
+ },
+ {
+ "id": "9cf24c02-5c23-584e-b42b-a2d315946f26",
+ "children": [
+ "ceb49dc8-381d-55e3-b9b0-05ea7ec1cba6"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "0184cf7d576a3626ce482e1156894f92",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/ov6Bgps93h.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "/examples/gatsbygram/data/images/ov6Bgps93h.jpg",
+ "relativePath": "images/ov6Bgps93h.jpg",
+ "extension": "jpg",
+ "size": 138679,
+ "prettySize": "139 kB",
+ "modifiedTime": "2019-02-08T08:55:07.961Z",
+ "accessTime": "2019-02-08T08:55:07.961Z",
+ "changeTime": "2019-02-08T08:55:07.961Z",
+ "birthTime": "2019-02-08T08:55:07.961Z",
+ "root": "/",
+ "dir": "/examples/gatsbygram/data/images",
+ "base": "ov6Bgps93h.jpg",
+ "ext": ".jpg",
+ "name": "ov6Bgps93h",
+ "relativeDirectory": "images",
+ "dev": 65024,
+ "mode": 33188,
+ "nlink": 1,
+ "uid": 1000,
+ "gid": 100,
+ "rdev": 0,
+ "blksize": 4096,
+ "ino": 17453931,
+ "blocks": 272,
+ "atimeMs": 1549616107961.26,
+ "mtimeMs": 1549616107961.26,
+ "ctimeMs": 1549616107961.26,
+ "birthtimeMs": 1549616107961.26,
+ "atime": "2019-02-08T08:55:07.961Z",
+ "mtime": "2019-02-08T08:55:07.961Z",
+ "ctime": "2019-02-08T08:55:07.961Z",
+ "birthtime": "2019-02-08T08:55:07.961Z"
+ },
+ {
+ "id": "61622fcc-aa74-5f23-9298-05621ac64f7d",
+ "children": [
+ "e16b83bd-4ff6-5a8b-b277-16291a0eefe3"
+ ],
+ "parent": null,
+ "internal": {
+ "contentDigest": "3dcb61ad3e8b7a5ec8cc3f13bf31338e",
+ "type": "File",
+ "mediaType": "image/jpeg",
+ "description": "File \"data/images/BW6uDlYlQCB.jpg\"",
+ "owner": "gatsby-source-filesystem"
+ },
+ "sourceInstanceName": "data",
+ "absolutePath": "