From e304ddddcabe648ba2938feb83b528e2c942ca72 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 17 Dec 2020 16:04:51 +0100
Subject: [PATCH 01/37] chore(deps): update dependency postcss to ^8.1.7
(#28082)
Co-authored-by: Renovate Bot
Co-authored-by: gatsbybot
---
packages/gatsby-plugin-image/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/gatsby-plugin-image/package.json b/packages/gatsby-plugin-image/package.json
index 3181d097a0bc2..cbfe9d0acf68a 100644
--- a/packages/gatsby-plugin-image/package.json
+++ b/packages/gatsby-plugin-image/package.json
@@ -68,7 +68,7 @@
"do-sync": "^2.2.0",
"microbundle": "^0.12.4",
"npm-run-all": "^4.1.5",
- "postcss": "^8.1.6",
+ "postcss": "^8.1.7",
"terser": "^5.3.8",
"typescript": "^3.9.7"
},
From a8676a7df63bef6aaa04ab58711237a88d14e226 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 17 Dec 2020 16:08:36 +0100
Subject: [PATCH 02/37] chore(deps): update minor and patch for
gatsby-graphiql-explorer (#28357)
Co-authored-by: Renovate Bot
---
.../gatsby-graphiql-explorer/package.json | 4 +--
yarn.lock | 29 +++++++++----------
2 files changed, 16 insertions(+), 17 deletions(-)
diff --git a/packages/gatsby-graphiql-explorer/package.json b/packages/gatsby-graphiql-explorer/package.json
index afda0f666838c..afeeb3c594d30 100644
--- a/packages/gatsby-graphiql-explorer/package.json
+++ b/packages/gatsby-graphiql-explorer/package.json
@@ -37,9 +37,9 @@
"@babel/plugin-transform-runtime": "^7.12.1",
"@babel/preset-env": "^7.12.1",
"@babel/preset-react": "^7.12.5",
- "babel-loader": "^8.1.0",
+ "babel-loader": "^8.2.2",
"babel-preset-gatsby-package": "^0.10.0-next.0",
- "core-js": "^3.7.0",
+ "core-js": "^3.8.1",
"cross-env": "^7.0.3",
"css-loader": "^1.0.1",
"graphiql": "^0.17.5",
diff --git a/yarn.lock b/yarn.lock
index 36ebc19c97bd1..a3e66e7d04da4 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5798,15 +5798,14 @@ babel-jsx-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/babel-jsx-utils/-/babel-jsx-utils-1.0.1.tgz#f2d171cba526594e7d69e9893d634502cf950f07"
integrity sha512-Qph/atlQiSvfmkoIZ9VA+t8dA0ex2TwL37rkhLT9YLJdhaTMZ2HSM2QGzbqjLWanKA+I3wRQJjjhtuIEgesuLw==
-babel-loader@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3"
- integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==
+babel-loader@^8.1.0, babel-loader@^8.2.2:
+ version "8.2.2"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81"
+ integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==
dependencies:
- find-cache-dir "^2.1.0"
+ find-cache-dir "^3.3.1"
loader-utils "^1.4.0"
- mkdirp "^0.5.3"
- pify "^4.0.1"
+ make-dir "^3.1.0"
schema-utils "^2.6.5"
babel-messages@^6.23.0:
@@ -7950,10 +7949,10 @@ core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.6.5:
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==
-core-js@^3.0.0, core-js@^3.2.1, core-js@^3.6.5, core-js@^3.7.0:
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.7.0.tgz#b0a761a02488577afbf97179e4681bf49568520f"
- integrity sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA==
+core-js@^3.0.0, core-js@^3.2.1, core-js@^3.6.5, core-js@^3.7.0, core-js@^3.8.1:
+ version "3.8.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.1.tgz#f51523668ac8a294d1285c3b9db44025fda66d47"
+ integrity sha512-9Id2xHY1W7m8hCl8NkhQn5CufmF/WuR30BTRewvCXc1aZd3kMECwNZ69ndLbekKfakw9Rf2Xyc+QR6E7Gg+obg==
core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
@@ -16287,10 +16286,10 @@ make-dir@^2.0.0, make-dir@^2.1.0:
pify "^4.0.1"
semver "^5.6.0"
-make-dir@^3.0.0, make-dir@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392"
- integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==
+make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
dependencies:
semver "^6.0.0"
From 0ce0f69863d92cf104185667980e04c1a31837aa Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 17 Dec 2020 16:09:42 +0100
Subject: [PATCH 03/37] fix(deps): update minor and patch for
gatsby-plugin-sharp (#28509)
Co-authored-by: Renovate Bot
---
packages/gatsby-plugin-sharp/package.json | 2 +-
yarn.lock | 10 ++++++----
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/packages/gatsby-plugin-sharp/package.json b/packages/gatsby-plugin-sharp/package.json
index 4a906043d706c..ffe816b78b9f5 100644
--- a/packages/gatsby-plugin-sharp/package.json
+++ b/packages/gatsby-plugin-sharp/package.json
@@ -22,7 +22,7 @@
"potrace": "^2.1.8",
"probe-image-size": "^5.0.0",
"progress": "^2.0.3",
- "semver": "^7.3.2",
+ "semver": "^7.3.4",
"sharp": "^0.26.3",
"svgo": "1.3.2",
"uuid": "3.4.0"
diff --git a/yarn.lock b/yarn.lock
index a3e66e7d04da4..0a3e5d92148bc 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -22523,10 +22523,12 @@ semver@7.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
-semver@^7.2.1, semver@^7.3.2:
- version "7.3.2"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
- integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
+semver@^7.2.1, semver@^7.3.2, semver@^7.3.4:
+ version "7.3.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97"
+ integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==
+ dependencies:
+ lru-cache "^6.0.0"
semver@~5.3.0:
version "5.3.0"
From de134364baf3a962f95bf111e120b0f048dd852d Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 17 Dec 2020 16:13:36 +0100
Subject: [PATCH 04/37] chore(deps): update dependency @testing-library/react
to ^11.2.2 (#28221)
Co-authored-by: Renovate Bot
---
packages/gatsby-plugin-image/package.json | 2 +-
yarn.lock | 22 +++++++++++-----------
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/packages/gatsby-plugin-image/package.json b/packages/gatsby-plugin-image/package.json
index cbfe9d0acf68a..b54a188ae2902 100644
--- a/packages/gatsby-plugin-image/package.json
+++ b/packages/gatsby-plugin-image/package.json
@@ -52,7 +52,7 @@
"devDependencies": {
"@babel/cli": "^7.12.1",
"@babel/core": "^7.12.3",
- "@testing-library/react": "^11.1.2",
+ "@testing-library/react": "^11.2.2",
"@types/babel__core": "^7.1.12",
"@types/babel__traverse": "^7.0.15",
"@types/fs-extra": "^8.1.1",
diff --git a/yarn.lock b/yarn.lock
index 0a3e5d92148bc..a67b7547052f6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1232,7 +1232,7 @@
core-js-pure "^3.0.0"
regenerator-runtime "^0.13.4"
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
version "7.12.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e"
integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==
@@ -3667,10 +3667,10 @@
pretty-format "^25.1.0"
wait-for-expect "^3.0.2"
-"@testing-library/dom@^7.26.6":
- version "7.26.6"
- resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.26.6.tgz#d558db63070a3acea5bea7e2497e631cd12541cc"
- integrity sha512-/poL7WMpolcGFOHMcxfcFkf1u38DcBUjk3YwNYpBs/MdJ546lg0YdvP2Lq3ujuQzAZxgs8vVvadj3MBnZsBjjA==
+"@testing-library/dom@^7.28.1":
+ version "7.28.1"
+ resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.28.1.tgz#dea78be6e1e6db32ddcb29a449e94d9700c79eb9"
+ integrity sha512-acv3l6kDwZkQif/YqJjstT3ks5aaI33uxGNVIQmdKzbZ2eMKgg3EV2tB84GDdc72k3Kjhl6mO8yUt6StVIdRDg==
dependencies:
"@babel/code-frame" "^7.10.4"
"@babel/runtime" "^7.12.5"
@@ -3681,13 +3681,13 @@
lz-string "^1.4.4"
pretty-format "^26.6.2"
-"@testing-library/react@^11.1.2":
- version "11.1.2"
- resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.1.2.tgz#089b06d3828e76fc1ff0092dd69c7b59c454c998"
- integrity sha512-foL0/Mo68M51DdgFwEsO2SDEkUpocuEYidOTcJACGEcoakZDINuERYwVdd6T5e3pPE+BZyGwwURaXcrX1v9RbQ==
+"@testing-library/react@^11.2.2":
+ version "11.2.2"
+ resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.2.tgz#099c6c195140ff069211143cb31c0f8337bdb7b7"
+ integrity sha512-jaxm0hwUjv+hzC+UFEywic7buDC9JQ1q3cDsrWVSDAPmLotfA6E6kUHlYm/zOeGCac6g48DR36tFHxl7Zb+N5A==
dependencies:
- "@babel/runtime" "^7.12.1"
- "@testing-library/dom" "^7.26.6"
+ "@babel/runtime" "^7.12.5"
+ "@testing-library/dom" "^7.28.1"
"@testing-library/react@^9.5.0":
version "9.5.0"
From 275affb724ef17d901b0a73c10e797f4b5ae9a60 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 17 Dec 2020 16:17:48 +0100
Subject: [PATCH 05/37] fix(deps): update minor and patch for
gatsby-transformer-asciidoc (#28359)
Co-authored-by: Renovate Bot
---
.../gatsby-transformer-asciidoc/package.json | 2 +-
yarn.lock | 18 +++++++++---------
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/packages/gatsby-transformer-asciidoc/package.json b/packages/gatsby-transformer-asciidoc/package.json
index 3c9685f64b3e0..a7751ffcfda41 100644
--- a/packages/gatsby-transformer-asciidoc/package.json
+++ b/packages/gatsby-transformer-asciidoc/package.json
@@ -8,7 +8,7 @@
},
"dependencies": {
"@babel/runtime": "^7.12.5",
- "asciidoctor": "^2.2.0"
+ "asciidoctor": "^2.2.1"
},
"devDependencies": {
"@babel/cli": "^7.12.1",
diff --git a/yarn.lock b/yarn.lock
index a67b7547052f6..95adceaae328c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -35,10 +35,10 @@
dependencies:
yargs "15.3.1"
-"@asciidoctor/core@2.2.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@asciidoctor/core/-/core-2.2.0.tgz#cae722e32666bf3c38365afe7d05f2f433b165fd"
- integrity sha512-WN/mFuU4SeWaDqpGvRwAf+Tq2T8NQkVVpZ3Ne1/ZRxDKElzFkqq8bGbmxSMWmMVzC+H9ZO1YxxbOjhWEiNvpOA==
+"@asciidoctor/core@2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@asciidoctor/core/-/core-2.2.1.tgz#eac0361a85b46f2ef2a9d19d73e3875bf94715d4"
+ integrity sha512-wdVseZjCcBvFfWSsCGyyvJkSQJ9UmXDdTDKnL+HerM12XQq4eWtk7lniSIKO459ipqImcsrueib47EtkzzRjLw==
dependencies:
asciidoctor-opal-runtime "0.3.0"
unxhr "1.0.1"
@@ -5456,13 +5456,13 @@ asciidoctor-opal-runtime@0.3.0:
glob "7.1.3"
unxhr "1.0.1"
-asciidoctor@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/asciidoctor/-/asciidoctor-2.2.0.tgz#880f0dfe349d7dcc8b819ebc691bf1fd36d47bbe"
- integrity sha512-w5oBMYPaA5RP/Qlv6XQzWE7kSf8d9sLMRBItcU+nn7E/FF9yGLUd1p/dzqWiu600KyNHBpp8Ml/VTaGjUm6LrQ==
+asciidoctor@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/asciidoctor/-/asciidoctor-2.2.1.tgz#4e29fe7195d97f75b36c91ad8e3448191b9ab0fa"
+ integrity sha512-adH/pDPDZCd4eb1ku7N8WepN+O6Yl0lVQPWE/ep7+0BFkBm4P/Sx8DUqzZ+X+nG6WSZlma5Uu0gNuDgrc7etFg==
dependencies:
"@asciidoctor/cli" "3.4.0"
- "@asciidoctor/core" "2.2.0"
+ "@asciidoctor/core" "2.2.1"
asn1.js@^4.0.0:
version "4.10.1"
From 10d0274f9fd111d0613672e0d7b38161debcef13 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 17 Dec 2020 16:18:53 +0100
Subject: [PATCH 06/37] fix(deps): update starters and examples (#27908)
Co-authored-by: Renovate Bot
---
starters/blog/package-lock.json | 6 +-
starters/blog/package.json | 2 +-
starters/default/package-lock.json | 6 +-
starters/default/package.json | 2 +-
.../package-lock.json | 6 +-
.../package.json | 2 +-
.../package-lock.json | 92 +++-
.../gatsby-starter-blog-theme/package.json | 2 +-
.../package-lock.json | 392 ++++++++++++++++--
.../gatsby-starter-mdx-basic/package.json | 4 +-
starters/hello-world/package-lock.json | 6 +-
starters/hello-world/package.json | 2 +-
12 files changed, 452 insertions(+), 70 deletions(-)
diff --git a/starters/blog/package-lock.json b/starters/blog/package-lock.json
index a208e4ed198d7..0cdfdda30d89f 100644
--- a/starters/blog/package-lock.json
+++ b/starters/blog/package-lock.json
@@ -14321,9 +14321,9 @@
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
},
"prettier": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
- "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg=="
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz",
+ "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q=="
},
"pretty-bytes": {
"version": "5.4.1",
diff --git a/starters/blog/package.json b/starters/blog/package.json
index d7024bc0bd2a4..4df1f4393685f 100644
--- a/starters/blog/package.json
+++ b/starters/blog/package.json
@@ -32,7 +32,7 @@
"typeface-montserrat": "0.0.75"
},
"devDependencies": {
- "prettier": "2.1.2"
+ "prettier": "2.2.1"
},
"homepage": "https://github.com/gatsbyjs/gatsby-starter-blog#readme",
"keywords": [
diff --git a/starters/default/package-lock.json b/starters/default/package-lock.json
index 08436b970a274..b2aadb8c474cf 100644
--- a/starters/default/package-lock.json
+++ b/starters/default/package-lock.json
@@ -13585,9 +13585,9 @@
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
},
"prettier": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
- "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg=="
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz",
+ "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q=="
},
"pretty-bytes": {
"version": "5.4.1",
diff --git a/starters/default/package.json b/starters/default/package.json
index cf63fc2963e7d..debe4ede21868 100644
--- a/starters/default/package.json
+++ b/starters/default/package.json
@@ -19,7 +19,7 @@
"react-helmet": "^6.1.0"
},
"devDependencies": {
- "prettier": "2.1.2"
+ "prettier": "2.2.1"
},
"keywords": [
"gatsby"
diff --git a/starters/gatsby-starter-blog-theme-core/package-lock.json b/starters/gatsby-starter-blog-theme-core/package-lock.json
index 4b5e534d07150..c2a1d7c56df7d 100644
--- a/starters/gatsby-starter-blog-theme-core/package-lock.json
+++ b/starters/gatsby-starter-blog-theme-core/package-lock.json
@@ -3118,9 +3118,9 @@
}
},
"@mdx-js/react": {
- "version": "1.6.19",
- "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.19.tgz",
- "integrity": "sha512-RS37Tagqyp2R0XFPoUZeSbZC5uJQRPhqOHWeT1LEwxESjMWb3VORHz7E827ldeQr3UW6VEQEyq/THegu+bLj6A=="
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz",
+ "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg=="
},
"@mdx-js/util": {
"version": "2.0.0-next.8",
diff --git a/starters/gatsby-starter-blog-theme-core/package.json b/starters/gatsby-starter-blog-theme-core/package.json
index 9b7e0e9cf4671..cfe468b6b493b 100644
--- a/starters/gatsby-starter-blog-theme-core/package.json
+++ b/starters/gatsby-starter-blog-theme-core/package.json
@@ -10,7 +10,7 @@
},
"license": "0BSD",
"dependencies": {
- "@mdx-js/react": "^1.6.19",
+ "@mdx-js/react": "^1.6.22",
"gatsby": "^2.26.1",
"gatsby-theme-blog-core": "^2.0.2",
"react": "^16.12.0",
diff --git a/starters/gatsby-starter-blog-theme/package-lock.json b/starters/gatsby-starter-blog-theme/package-lock.json
index 88be57870e99e..daaa411aee1b6 100644
--- a/starters/gatsby-starter-blog-theme/package-lock.json
+++ b/starters/gatsby-starter-blog-theme/package-lock.json
@@ -3013,6 +3013,14 @@
"@types/node": "*"
}
},
+ "@types/styled-system": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@types/styled-system/-/styled-system-4.2.2.tgz",
+ "integrity": "sha512-eULPjWVEaXElIFKBwDVWRvGkHC0Fj63XVRna8RHoaRivNhCI/QkEJpMgyb0uA4WpsHpO5SDXH+DyQwEUkyW3rA==",
+ "requires": {
+ "csstype": "^2.6.4"
+ }
+ },
"@types/tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz",
@@ -19365,16 +19373,82 @@
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
},
"theme-ui": {
- "version": "0.4.0-rc.5",
- "resolved": "https://registry.npmjs.org/theme-ui/-/theme-ui-0.4.0-rc.5.tgz",
- "integrity": "sha512-Qjwja3xiE8mSf5ozNNJiCE6DhAg3QCdNw3YtceGSwiswC3vsL+jl7LAkaBcjME6r4GAVOuvNaVqu1tFuzqR1Vw==",
+ "version": "0.4.0-rc.14",
+ "resolved": "https://registry.npmjs.org/theme-ui/-/theme-ui-0.4.0-rc.14.tgz",
+ "integrity": "sha512-ciaGwsv9cRskUAukHSzMHdRXhqpweV8xAsywkE61gBg9msAfeI6MyeOU7HCseK4U9/Ppu3NNJExI32CK4BMDtg==",
"requires": {
- "@theme-ui/color-modes": "^0.4.0-rc.5",
- "@theme-ui/components": "^0.4.0-rc.5",
- "@theme-ui/core": "^0.4.0-rc.5",
- "@theme-ui/css": "^0.4.0-rc.5",
- "@theme-ui/mdx": "^0.4.0-rc.5",
- "@theme-ui/theme-provider": "^0.4.0-rc.5"
+ "@theme-ui/color-modes": "^0.4.0-rc.14",
+ "@theme-ui/components": "0.4.0-rc.13",
+ "@theme-ui/core": "^0.4.0-rc.13",
+ "@theme-ui/css": "^0.4.0-rc.13",
+ "@theme-ui/mdx": "^0.4.0-rc.13",
+ "@theme-ui/theme-provider": "^0.4.0-rc.14"
+ },
+ "dependencies": {
+ "@theme-ui/color-modes": {
+ "version": "0.4.0-rc.14",
+ "resolved": "https://registry.npmjs.org/@theme-ui/color-modes/-/color-modes-0.4.0-rc.14.tgz",
+ "integrity": "sha512-nxfgi2pD27xs7v96s7GswrFl/WvzqdbZDlE1RnF0tEvhRhurdWKaDTm2f7mFsALmf6xb85Uwa059lvumwSMbSw==",
+ "requires": {
+ "@emotion/core": "^10.0.0",
+ "@theme-ui/core": "^0.4.0-rc.13",
+ "@theme-ui/css": "^0.4.0-rc.13",
+ "deepmerge": "^4.2.2"
+ }
+ },
+ "@theme-ui/components": {
+ "version": "0.4.0-rc.13",
+ "resolved": "https://registry.npmjs.org/@theme-ui/components/-/components-0.4.0-rc.13.tgz",
+ "integrity": "sha512-+S32r7jxvcsMIbReVW4fBHZhL4ZhmjhDVu9UwlHTYgF2fmoDywc4iJsBKsfqvdkeTg8Z/hWtzmUtdxL4X2lmjQ==",
+ "requires": {
+ "@emotion/core": "^10.0.0",
+ "@emotion/styled": "^10.0.0",
+ "@styled-system/color": "^5.1.2",
+ "@styled-system/should-forward-prop": "^5.1.2",
+ "@styled-system/space": "^5.1.2",
+ "@theme-ui/css": "^0.4.0-rc.13",
+ "@types/styled-system": "^4.2.2"
+ }
+ },
+ "@theme-ui/core": {
+ "version": "0.4.0-rc.13",
+ "resolved": "https://registry.npmjs.org/@theme-ui/core/-/core-0.4.0-rc.13.tgz",
+ "integrity": "sha512-WJZWuA65QrZe6lKx+zLwKCK9JYuaGtnbGc3t+rdpc7hwX519IEM/lIVaLIzrpwih+sn3g64Npmls6gCOIrIIYQ==",
+ "requires": {
+ "@emotion/core": "^10.0.0",
+ "@theme-ui/css": "^0.4.0-rc.13",
+ "deepmerge": "^4.2.2"
+ }
+ },
+ "@theme-ui/css": {
+ "version": "0.4.0-rc.13",
+ "resolved": "https://registry.npmjs.org/@theme-ui/css/-/css-0.4.0-rc.13.tgz",
+ "integrity": "sha512-YEO462Ia26T+i/6p/B4EJt/p3qJanPsSYpRP7MK4GchF/LbuHi0MS+zc4TpctIuIqpXgQR3w75b6xJZG1Oqn1Q==",
+ "requires": {
+ "csstype": "^2.5.7"
+ }
+ },
+ "@theme-ui/mdx": {
+ "version": "0.4.0-rc.13",
+ "resolved": "https://registry.npmjs.org/@theme-ui/mdx/-/mdx-0.4.0-rc.13.tgz",
+ "integrity": "sha512-ZESUQzOkAF9MXVRX0zQYdqfb0j8+K/KWHv+LJIGFgWXJmfhj+vmKn4CL630jT9jALpkMKXN08QD9mw3/vGlT6A==",
+ "requires": {
+ "@emotion/core": "^10.0.0",
+ "@emotion/styled": "^10.0.0",
+ "@mdx-js/react": "^1.0.0"
+ }
+ },
+ "@theme-ui/theme-provider": {
+ "version": "0.4.0-rc.14",
+ "resolved": "https://registry.npmjs.org/@theme-ui/theme-provider/-/theme-provider-0.4.0-rc.14.tgz",
+ "integrity": "sha512-DyypwnCSY+ogzBJCGYS9Q/58BIRxxk2WVqp2wx4LHhADAhIdLCDz2KO+8SAGLXfwmgt3cvCO7ebo1T6ZRpJV5Q==",
+ "requires": {
+ "@emotion/core": "^10.0.0",
+ "@theme-ui/color-modes": "^0.4.0-rc.14",
+ "@theme-ui/core": "^0.4.0-rc.13",
+ "@theme-ui/mdx": "^0.4.0-rc.13"
+ }
+ }
}
},
"through": {
diff --git a/starters/gatsby-starter-blog-theme/package.json b/starters/gatsby-starter-blog-theme/package.json
index c9212ba04f25f..1db4eb0026ece 100644
--- a/starters/gatsby-starter-blog-theme/package.json
+++ b/starters/gatsby-starter-blog-theme/package.json
@@ -14,6 +14,6 @@
"gatsby-theme-blog": "^2.0.2",
"react": "^16.12.0",
"react-dom": "^16.12.0",
- "theme-ui": "0.4.0-rc.5"
+ "theme-ui": "0.4.0-rc.14"
}
}
diff --git a/starters/gatsby-starter-mdx-basic/package-lock.json b/starters/gatsby-starter-mdx-basic/package-lock.json
index c635abd678865..f5d171333e1e8 100644
--- a/starters/gatsby-starter-mdx-basic/package-lock.json
+++ b/starters/gatsby-starter-mdx-basic/package-lock.json
@@ -2682,40 +2682,185 @@
}
},
"@mdx-js/mdx": {
- "version": "1.6.19",
- "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.19.tgz",
- "integrity": "sha512-L3eLhEFnV/2bcb9XwOegsRmLHd1oEDQPtTBVezhptQ5U1YM+/WQNzx1apjzVTAyukwOanUXnTUMjRUtqJNgFCg==",
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz",
+ "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==",
"requires": {
- "@babel/core": "7.11.6",
- "@babel/plugin-syntax-jsx": "7.10.4",
+ "@babel/core": "7.12.9",
+ "@babel/plugin-syntax-jsx": "7.12.1",
"@babel/plugin-syntax-object-rest-spread": "7.8.3",
- "@mdx-js/util": "1.6.19",
- "babel-plugin-apply-mdx-type-prop": "1.6.19",
- "babel-plugin-extract-import-names": "1.6.19",
+ "@mdx-js/util": "1.6.22",
+ "babel-plugin-apply-mdx-type-prop": "1.6.22",
+ "babel-plugin-extract-import-names": "1.6.22",
"camelcase-css": "2.0.1",
- "detab": "2.0.3",
+ "detab": "2.0.4",
"hast-util-raw": "6.0.1",
"lodash.uniq": "4.5.0",
- "mdast-util-to-hast": "9.1.1",
+ "mdast-util-to-hast": "10.0.1",
"remark-footnotes": "2.0.0",
- "remark-mdx": "1.6.19",
+ "remark-mdx": "1.6.22",
"remark-parse": "8.0.3",
"remark-squeeze-paragraphs": "4.0.0",
"style-to-object": "0.3.0",
"unified": "9.2.0",
"unist-builder": "2.0.3",
"unist-util-visit": "2.0.3"
+ },
+ "dependencies": {
+ "@babel/core": {
+ "version": "7.12.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz",
+ "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==",
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helpers": "^7.12.5",
+ "@babel/parser": "^7.12.7",
+ "@babel/template": "^7.12.7",
+ "@babel/traverse": "^7.12.9",
+ "@babel/types": "^7.12.7",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.1",
+ "json5": "^2.1.2",
+ "lodash": "^4.17.19",
+ "resolve": "^1.3.2",
+ "semver": "^5.4.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz",
+ "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==",
+ "requires": {
+ "@babel/types": "^7.12.5",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz",
+ "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==",
+ "requires": {
+ "@babel/types": "^7.12.7"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz",
+ "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==",
+ "requires": {
+ "@babel/types": "^7.12.5"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+ "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-simple-access": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz",
+ "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==",
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "^7.12.1",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+ "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
+ "requires": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "@babel/helpers": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz",
+ "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==",
+ "requires": {
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz",
+ "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg=="
+ },
+ "@babel/plugin-syntax-jsx": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz",
+ "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/template": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz",
+ "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==",
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.12.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.9.tgz",
+ "integrity": "sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw==",
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/types": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz",
+ "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
}
},
"@mdx-js/react": {
- "version": "1.6.19",
- "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.19.tgz",
- "integrity": "sha512-RS37Tagqyp2R0XFPoUZeSbZC5uJQRPhqOHWeT1LEwxESjMWb3VORHz7E827ldeQr3UW6VEQEyq/THegu+bLj6A=="
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz",
+ "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg=="
},
"@mdx-js/util": {
- "version": "1.6.19",
- "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.19.tgz",
- "integrity": "sha512-bkkQNSHz3xSr3KRHUQ2Qk2XhewvvXAOUqjIUKwcQuL4ijOA4tUHZfUgXExi5CpMysrX7izcsyICtXjZHlfJUjg=="
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz",
+ "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA=="
},
"@mikaelkristiansson/domready": {
"version": "1.0.10",
@@ -3960,12 +4105,12 @@
}
},
"babel-plugin-apply-mdx-type-prop": {
- "version": "1.6.19",
- "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.19.tgz",
- "integrity": "sha512-zAuL11EaBbeNpfTqsa9xP7mkvX3V4LaEV6M9UUaI4zQtTqN5JwvDyhNsALQs5Ud7WFQSXtoqU74saTgE+rgZOw==",
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz",
+ "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==",
"requires": {
"@babel/helper-plugin-utils": "7.10.4",
- "@mdx-js/util": "1.6.19"
+ "@mdx-js/util": "1.6.22"
}
},
"babel-plugin-dynamic-import-node": {
@@ -3977,9 +4122,9 @@
}
},
"babel-plugin-extract-import-names": {
- "version": "1.6.19",
- "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.19.tgz",
- "integrity": "sha512-5kbSEhQdg1ybR9OnxybbyR1PXw51z6T6ZCtX3vYSU6t1pC/+eBlSzWXyU2guStbwQgJyxS+mHWSNnL7PUdzAlw==",
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz",
+ "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==",
"requires": {
"@babel/helper-plugin-utils": "7.10.4"
}
@@ -6730,9 +6875,9 @@
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"detab": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.3.tgz",
- "integrity": "sha512-Up8P0clUVwq0FnFjDclzZsy9PadzRn5FFxrr47tQQvMHqyiFYVbpH8oXDzWtF0Q7pYy3l+RPmtBl+BsFF6wH0A==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz",
+ "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==",
"requires": {
"repeat-string": "^1.5.4"
}
@@ -12585,21 +12730,21 @@
}
},
"mdast-util-definitions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-3.0.1.tgz",
- "integrity": "sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz",
+ "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==",
"requires": {
"unist-util-visit": "^2.0.0"
}
},
"mdast-util-to-hast": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-9.1.1.tgz",
- "integrity": "sha512-vpMWKFKM2mnle+YbNgDXxx95vv0CoLU0v/l3F5oFAG5DV7qwkZVWA206LsAdOnEVyf5vQcLnb3cWJywu7mUxsQ==",
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz",
+ "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==",
"requires": {
"@types/mdast": "^3.0.0",
- "@types/unist": "^2.0.3",
- "mdast-util-definitions": "^3.0.0",
+ "@types/unist": "^2.0.0",
+ "mdast-util-definitions": "^4.0.0",
"mdurl": "^1.0.0",
"unist-builder": "^2.0.0",
"unist-util-generated": "^1.0.0",
@@ -16196,18 +16341,181 @@
"integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ=="
},
"remark-mdx": {
- "version": "1.6.19",
- "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.19.tgz",
- "integrity": "sha512-UKK1CFatVPNhgjsIlNQ3GjVl3+6O7x7Hag6oyntFTg8s7sgq+rhWaSfM/6lW5UWU6hzkj520KYBuBlsaSriGtA==",
+ "version": "1.6.22",
+ "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz",
+ "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==",
"requires": {
- "@babel/core": "7.11.6",
+ "@babel/core": "7.12.9",
"@babel/helper-plugin-utils": "7.10.4",
- "@babel/plugin-proposal-object-rest-spread": "7.11.0",
- "@babel/plugin-syntax-jsx": "7.10.4",
- "@mdx-js/util": "1.6.19",
+ "@babel/plugin-proposal-object-rest-spread": "7.12.1",
+ "@babel/plugin-syntax-jsx": "7.12.1",
+ "@mdx-js/util": "1.6.22",
"is-alphabetical": "1.0.4",
"remark-parse": "8.0.3",
"unified": "9.2.0"
+ },
+ "dependencies": {
+ "@babel/core": {
+ "version": "7.12.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz",
+ "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==",
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helpers": "^7.12.5",
+ "@babel/parser": "^7.12.7",
+ "@babel/template": "^7.12.7",
+ "@babel/traverse": "^7.12.9",
+ "@babel/types": "^7.12.7",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.1",
+ "json5": "^2.1.2",
+ "lodash": "^4.17.19",
+ "resolve": "^1.3.2",
+ "semver": "^5.4.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz",
+ "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==",
+ "requires": {
+ "@babel/types": "^7.12.5",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz",
+ "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==",
+ "requires": {
+ "@babel/types": "^7.12.7"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz",
+ "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==",
+ "requires": {
+ "@babel/types": "^7.12.5"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+ "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
+ "requires": {
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-simple-access": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz",
+ "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==",
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "^7.12.1",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+ "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
+ "requires": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "@babel/helpers": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz",
+ "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==",
+ "requires": {
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz",
+ "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg=="
+ },
+ "@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
+ "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-transform-parameters": "^7.12.1"
+ }
+ },
+ "@babel/plugin-syntax-jsx": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz",
+ "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-parameters": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz",
+ "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==",
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/template": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz",
+ "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==",
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.12.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.9.tgz",
+ "integrity": "sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw==",
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/types": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz",
+ "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
}
},
"remark-mdxjs": {
diff --git a/starters/gatsby-starter-mdx-basic/package.json b/starters/gatsby-starter-mdx-basic/package.json
index bc0a9c3250904..8115b2bd6f259 100644
--- a/starters/gatsby-starter-mdx-basic/package.json
+++ b/starters/gatsby-starter-mdx-basic/package.json
@@ -4,8 +4,8 @@
"version": "1.0.0",
"author": "Chris Biscardi ",
"dependencies": {
- "@mdx-js/mdx": "^1.6.19",
- "@mdx-js/react": "^1.6.19",
+ "@mdx-js/mdx": "^1.6.22",
+ "@mdx-js/react": "^1.6.22",
"gatsby": "^2.26.1",
"gatsby-image": "^2.5.0",
"gatsby-plugin-manifest": "^2.6.1",
diff --git a/starters/hello-world/package-lock.json b/starters/hello-world/package-lock.json
index 2d8fec7737d44..8f72c69d5a32c 100644
--- a/starters/hello-world/package-lock.json
+++ b/starters/hello-world/package-lock.json
@@ -11272,9 +11272,9 @@
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
},
"prettier": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
- "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg=="
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz",
+ "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q=="
},
"pretty-error": {
"version": "2.1.2",
diff --git a/starters/hello-world/package.json b/starters/hello-world/package.json
index 7bd15111e0bc9..bbe3f89630f8a 100644
--- a/starters/hello-world/package.json
+++ b/starters/hello-world/package.json
@@ -19,7 +19,7 @@
"react-dom": "^16.12.0"
},
"devDependencies": {
- "prettier": "2.1.2"
+ "prettier": "2.2.1"
},
"repository": {
"type": "git",
From b712950af10fbf31eb21f3bf6452c8761e7bb2df Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 17 Dec 2020 16:20:57 +0100
Subject: [PATCH 07/37] fix(deps): update minor and patch for
gatsby-transformer-sharp (#28510)
Co-authored-by: Renovate Bot
---
packages/gatsby-transformer-sharp/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/gatsby-transformer-sharp/package.json b/packages/gatsby-transformer-sharp/package.json
index eb1bc9521b182..7f413ee0def84 100644
--- a/packages/gatsby-transformer-sharp/package.json
+++ b/packages/gatsby-transformer-sharp/package.json
@@ -12,7 +12,7 @@
"fs-extra": "^9.0.1",
"potrace": "^2.1.8",
"probe-image-size": "^5.0.0",
- "semver": "^7.3.2",
+ "semver": "^7.3.4",
"sharp": "^0.26.3"
},
"devDependencies": {
From 3474ae39e75e718a7545a9d7d0379fdbdfba2f91 Mon Sep 17 00:00:00 2001
From: Sidhartha Chatterjee
Date: Thu, 17 Dec 2020 21:28:46 +0530
Subject: [PATCH 08/37] fix(gatsby-source-filesystem): Retry a download if a
file is incomplete (#28547)
---
.../src/create-remote-file-node.js | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/packages/gatsby-source-filesystem/src/create-remote-file-node.js b/packages/gatsby-source-filesystem/src/create-remote-file-node.js
index 7629b59e5557e..dcedd301356f6 100644
--- a/packages/gatsby-source-filesystem/src/create-remote-file-node.js
+++ b/packages/gatsby-source-filesystem/src/create-remote-file-node.js
@@ -61,6 +61,8 @@ const STALL_TIMEOUT = process.env.GATSBY_STALL_TIMEOUT || 30000
const CONNECTION_TIMEOUT = process.env.GATSBY_CONNECTION_TIMEOUT || 30000
+const INCOMPLETE_RETRY_LIMIT = process.env.GATSBY_INCOMPLETE_RETRY_LIMIT || 3
+
/********************
* Queue Management *
********************/
@@ -178,8 +180,31 @@ const requestRemoteNode = (url, headers, tmpFilename, httpOpts, attempt = 1) =>
responseStream.on(`response`, response => {
resetTimeout()
+ const contentLength =
+ response.headers && Number(response.headers[`content-length`])
fsWriteStream.on(`finish`, () => {
+ // We have an incomplete download
+ if (contentLength && contentLength !== fsWriteStream.bytesWritten) {
+ fs.removeSync(tmpFilename)
+
+ if (attempt < INCOMPLETE_RETRY_LIMIT) {
+ resolve(
+ requestRemoteNode(
+ url,
+ headers,
+ tmpFilename,
+ httpOpts,
+ attempt + 1
+ )
+ )
+ } else {
+ reject(
+ `Failed to download ${url} after ${INCOMPLETE_RETRY_LIMIT} attempts`
+ )
+ }
+ }
+
if (timeout) {
clearTimeout(timeout)
}
From cde7885f39eab846a8cdd9d3d08b9b5d299cfd76 Mon Sep 17 00:00:00 2001
From: Matt Kane
Date: Thu, 17 Dec 2020 17:24:22 +0000
Subject: [PATCH 09/37] fix(deps): Revert postcss upgrade which broke css macro
(#28672)
This reverts commit e304ddddcabe648ba2938feb83b528e2c942ca72.
---
packages/gatsby-plugin-image/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/gatsby-plugin-image/package.json b/packages/gatsby-plugin-image/package.json
index b54a188ae2902..b6a6e83ab0c79 100644
--- a/packages/gatsby-plugin-image/package.json
+++ b/packages/gatsby-plugin-image/package.json
@@ -68,7 +68,7 @@
"do-sync": "^2.2.0",
"microbundle": "^0.12.4",
"npm-run-all": "^4.1.5",
- "postcss": "^8.1.7",
+ "postcss": "^8.1.6",
"terser": "^5.3.8",
"typescript": "^3.9.7"
},
From 7813f0c077ea60807571f770d7ddc61dfcf4817b Mon Sep 17 00:00:00 2001
From: Sidhartha Chatterjee
Date: Thu, 17 Dec 2020 23:03:37 +0530
Subject: [PATCH 10/37] Update yarn.lock
---
yarn.lock | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 126 insertions(+), 2 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index 95adceaae328c..57b1904e300a2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,110 @@
# yarn lockfile v1
+"@algolia/cache-browser-local-storage@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.8.3.tgz#79cc502892c83f378b8f1a87f78020268806f5c3"
+ integrity sha512-Cwc03hikHSUI+xvgUdN+H+f6jFyoDsC9fegzXzJ2nPn1YSN9EXzDMBnbrgl0sbl9iLGXe0EIGMYqR2giCv1wMQ==
+ dependencies:
+ "@algolia/cache-common" "4.8.3"
+
+"@algolia/cache-common@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.8.3.tgz#7aca2644159ec791921dc8b296817e5b532b3464"
+ integrity sha512-Cf7zZ2i6H+tLSBTkFePHhYvlgc9fnMPKsF9qTmiU38kFIGORy/TN2Fx5n1GBuRLIzaSXvcf+oHv1HvU0u1gE1g==
+
+"@algolia/cache-in-memory@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.8.3.tgz#3d2692b895e9b8da47249b2b8dc638f53d6328ee"
+ integrity sha512-+N7tkvmijXiDy2E7u1mM73AGEgGPWFmEmPeJS96oT46I98KXAwVPNYbcAqBE79YlixdXpkYJk41cFcORzNh+Iw==
+ dependencies:
+ "@algolia/cache-common" "4.8.3"
+
+"@algolia/client-account@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.8.3.tgz#4abc270dbd136644e69cc6b1ca1d0d14c9822aaf"
+ integrity sha512-Uku8LqnXBwfDCtsTCDYTUOz2/2oqcAQCKgaO0uGdIR8DTQENBXFQvzziambHdn9KuFuY+6Et9k1+cjpTPBDTBg==
+ dependencies:
+ "@algolia/client-common" "4.8.3"
+ "@algolia/client-search" "4.8.3"
+ "@algolia/transporter" "4.8.3"
+
+"@algolia/client-analytics@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.8.3.tgz#578b6e6fa33818a0417298438066642e584e1de9"
+ integrity sha512-9ensIWmjYJprZ+YjAVSZdWUG05xEnbytENXp508X59tf34IMIX8BR2xl0RjAQODtxBdAteGxuKt5THX6U9tQLA==
+ dependencies:
+ "@algolia/client-common" "4.8.3"
+ "@algolia/client-search" "4.8.3"
+ "@algolia/requester-common" "4.8.3"
+ "@algolia/transporter" "4.8.3"
+
+"@algolia/client-common@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.8.3.tgz#d8ea3368a5b98ce907e4be0eed804c3301cd91de"
+ integrity sha512-TU3623AEFAWUQlDTznkgAMSYo8lfS9pNs5QYDQzkvzWdqK0GBDWthwdRfo9iIsfxiR9qdCMHqwEu+AlZMVhNSA==
+ dependencies:
+ "@algolia/requester-common" "4.8.3"
+ "@algolia/transporter" "4.8.3"
+
+"@algolia/client-recommendation@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/client-recommendation/-/client-recommendation-4.8.3.tgz#fc15688bf9d0fc0111a6c56d247e33dc3fcf8190"
+ integrity sha512-qysGbmkcc6Agt29E38KWJq9JuxjGsyEYoKuX9K+P5HyQh08yR/BlRYrA8mB7vT/OIUHRGFToGO6Vq/rcg0NIOQ==
+ dependencies:
+ "@algolia/client-common" "4.8.3"
+ "@algolia/requester-common" "4.8.3"
+ "@algolia/transporter" "4.8.3"
+
+"@algolia/client-search@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.8.3.tgz#c70e09935e2cf25da356d59794e6a5a95f9a4cc8"
+ integrity sha512-rAnvoy3GAhbzOQVniFcKVn1eM2NX77LearzYNCbtFrFYavG+hJI187bNVmajToiuGZ10FfJvK99X2OB1AzzezQ==
+ dependencies:
+ "@algolia/client-common" "4.8.3"
+ "@algolia/requester-common" "4.8.3"
+ "@algolia/transporter" "4.8.3"
+
+"@algolia/logger-common@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.8.3.tgz#449e8767863466528de7d18017417b319e4782d3"
+ integrity sha512-03wksHRbhl2DouEKnqWuUb64s1lV6kDAAabMCQ2Du1fb8X/WhDmxHC4UXMzypeOGlH5BZBsgVwSB7vsZLP3MZg==
+
+"@algolia/logger-console@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.8.3.tgz#e4bcda8ac6477ecf143a1d536be2b747b84b7047"
+ integrity sha512-Npt+hI4UF8t3TLMluL5utr9Gc11BjL5kDnGZOhDOAz5jYiSO2nrHMFmnpLT4Cy/u7a5t7EB5dlypuC4/AGStkA==
+ dependencies:
+ "@algolia/logger-common" "4.8.3"
+
+"@algolia/requester-browser-xhr@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.8.3.tgz#f2fe880d261e33bce1c6d613be074fd87af9f7e6"
+ integrity sha512-/LTTIpgEmEwkyhn8yXxDdBWqXqzlgw5w2PtTpIwkSlP2/jDwdR/9w1TkFzhNbJ81ki6LAEQM5mSwoTTnbIIecg==
+ dependencies:
+ "@algolia/requester-common" "4.8.3"
+
+"@algolia/requester-common@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.8.3.tgz#633b6782ae3fcf1743507c0ef207db5c62737443"
+ integrity sha512-+Yo9vBkofoKR1SCqqtMnmnfq9yt/BiaDewY/6bYSMNxSYCnu2Fw1JKSIaf/4zos09PMSsxGpLohZwGas3+0GDQ==
+
+"@algolia/requester-node-http@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.8.3.tgz#81c8e5d02f16a57cebfa2309a931fad6de84eb6d"
+ integrity sha512-k2fiKIeMIFqgC01FnzII6kqC2GQBAfbNaUX4k7QCPa6P8t4sp2xE6fImOUiztLnnL3C9X9ZX6Fw3L+cudi7jvQ==
+ dependencies:
+ "@algolia/requester-common" "4.8.3"
+
+"@algolia/transporter@4.8.3":
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.8.3.tgz#6ad10b4be16653d667bb4727df27478931631fe8"
+ integrity sha512-nU7fy2iU8snxATlsks0MjMyv97QJWQmOVwTjDc+KZ4+nue8CLcgm4LA4dsTBqvxeCQIoEtt3n72GwXcaqiJSjQ==
+ dependencies:
+ "@algolia/cache-common" "4.8.3"
+ "@algolia/logger-common" "4.8.3"
+ "@algolia/requester-common" "4.8.3"
+
"@apollo/client@^3.1.5":
version "3.2.5"
resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.2.5.tgz#24e0a6faa1d231ab44807af237c6227410c75c4d"
@@ -5043,7 +5147,7 @@ algoliasearch-helper@^2.26.0:
lodash "^4.17.5"
qs "^6.5.1"
-algoliasearch@^3.27.1, algoliasearch@^3.35.1:
+algoliasearch@^3.27.1:
version "3.35.1"
resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-3.35.1.tgz#297d15f534a3507cab2f5dfb996019cac7568f0c"
integrity sha512-K4yKVhaHkXfJ/xcUnil04xiSrB8B8yHZoFEhWNpXg23eiCnqvTZw1tn/SqvdsANlYHLJlKl0qi3I/Q2Sqo7LwQ==
@@ -5064,6 +5168,26 @@ algoliasearch@^3.27.1, algoliasearch@^3.35.1:
semver "^5.1.0"
tunnel-agent "^0.6.0"
+algoliasearch@^4.8.3:
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.8.3.tgz#f76b824423e4264506fb6ba6a6709feb08ab9954"
+ integrity sha512-pljX9jEE2TQ3i1JayhG8afNdE8UuJg3O9c7unW6QO67yRWCKr6b0t5aKC3hSVtjt7pA2TQXLKoAISb4SHx9ozQ==
+ dependencies:
+ "@algolia/cache-browser-local-storage" "4.8.3"
+ "@algolia/cache-common" "4.8.3"
+ "@algolia/cache-in-memory" "4.8.3"
+ "@algolia/client-account" "4.8.3"
+ "@algolia/client-analytics" "4.8.3"
+ "@algolia/client-common" "4.8.3"
+ "@algolia/client-recommendation" "4.8.3"
+ "@algolia/client-search" "4.8.3"
+ "@algolia/logger-common" "4.8.3"
+ "@algolia/logger-console" "4.8.3"
+ "@algolia/requester-browser-xhr" "4.8.3"
+ "@algolia/requester-common" "4.8.3"
+ "@algolia/requester-node-http" "4.8.3"
+ "@algolia/transporter" "4.8.3"
+
alphanum-sort@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
@@ -14901,7 +15025,7 @@ js-yaml@3.14.0:
argparse "^1.0.7"
esprima "^4.0.0"
-js-yaml@^3.10.0, js-yaml@^3.11.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.0, js-yaml@^3.14.1, js-yaml@^3.6.1, js-yaml@^3.8.1, js-yaml@^3.9.1:
+js-yaml@^3.10.0, js-yaml@^3.11.0, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.14.1, js-yaml@^3.6.1, js-yaml@^3.8.1, js-yaml@^3.9.1:
version "3.14.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
From 8138b97d025b5aaa8f3a46e7d9911484a00591f7 Mon Sep 17 00:00:00 2001
From: Sidhartha Chatterjee
Date: Thu, 17 Dec 2020 23:04:41 +0530
Subject: [PATCH 11/37] chore(release): Publish next
- gatsby-admin@0.6.0-next.6
- gatsby-graphiql-explorer@0.9.0-next.1
- gatsby-plugin-image@0.5.0-next.4
- gatsby-plugin-sharp@2.12.0-next.4
- gatsby-source-contentful@4.4.0-next.3
- gatsby-source-drupal@3.11.0-next.1
- gatsby-source-filesystem@2.9.0-next.1
- gatsby-source-shopify@3.8.0-next.1
- gatsby-source-wordpress@3.9.0-next.1
- gatsby-transformer-asciidoc@1.8.0-next.1
- gatsby-transformer-sharp@2.10.0-next.2
- gatsby-transformer-sqip@2.9.0-next.4
- gatsby@2.30.0-next.6
---
packages/gatsby-admin/CHANGELOG.md | 4 ++++
packages/gatsby-admin/package.json | 4 ++--
packages/gatsby-graphiql-explorer/CHANGELOG.md | 4 ++++
packages/gatsby-graphiql-explorer/package.json | 2 +-
packages/gatsby-plugin-image/CHANGELOG.md | 6 ++++++
packages/gatsby-plugin-image/package.json | 2 +-
packages/gatsby-plugin-sharp/CHANGELOG.md | 6 ++++++
packages/gatsby-plugin-sharp/package.json | 4 ++--
packages/gatsby-source-contentful/CHANGELOG.md | 4 ++++
packages/gatsby-source-contentful/package.json | 4 ++--
packages/gatsby-source-drupal/CHANGELOG.md | 4 ++++
packages/gatsby-source-drupal/package.json | 4 ++--
packages/gatsby-source-filesystem/CHANGELOG.md | 6 ++++++
packages/gatsby-source-filesystem/package.json | 2 +-
packages/gatsby-source-shopify/CHANGELOG.md | 4 ++++
packages/gatsby-source-shopify/package.json | 4 ++--
packages/gatsby-source-wordpress/CHANGELOG.md | 4 ++++
packages/gatsby-source-wordpress/package.json | 4 ++--
packages/gatsby-transformer-asciidoc/CHANGELOG.md | 6 ++++++
packages/gatsby-transformer-asciidoc/package.json | 2 +-
packages/gatsby-transformer-sharp/CHANGELOG.md | 6 ++++++
packages/gatsby-transformer-sharp/package.json | 2 +-
packages/gatsby-transformer-sqip/CHANGELOG.md | 4 ++++
packages/gatsby-transformer-sqip/package.json | 4 ++--
packages/gatsby/CHANGELOG.md | 4 ++++
packages/gatsby/package.json | 4 ++--
26 files changed, 83 insertions(+), 21 deletions(-)
diff --git a/packages/gatsby-admin/CHANGELOG.md b/packages/gatsby-admin/CHANGELOG.md
index ff1d79c12b6ad..855a588f2cc5f 100644
--- a/packages/gatsby-admin/CHANGELOG.md
+++ b/packages/gatsby-admin/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [0.6.0-next.6](https://github.com/gatsbyjs/gatsby/compare/gatsby-admin@0.6.0-next.5...gatsby-admin@0.6.0-next.6) (2020-12-17)
+
+**Note:** Version bump only for package gatsby-admin
+
# [0.6.0-next.5](https://github.com/gatsbyjs/gatsby/compare/gatsby-admin@0.6.0-next.4...gatsby-admin@0.6.0-next.5) (2020-12-17)
**Note:** Version bump only for package gatsby-admin
diff --git a/packages/gatsby-admin/package.json b/packages/gatsby-admin/package.json
index a00ea96d76198..afcfa0096ef88 100644
--- a/packages/gatsby-admin/package.json
+++ b/packages/gatsby-admin/package.json
@@ -1,6 +1,6 @@
{
"name": "gatsby-admin",
- "version": "0.6.0-next.5",
+ "version": "0.6.0-next.6",
"main": "index.js",
"author": "Max Stoiber",
"license": "MIT",
@@ -20,7 +20,7 @@
"@typescript-eslint/parser": "^2.34.0",
"csstype": "^2.6.13",
"formik": "^2.2.5",
- "gatsby": "^2.30.0-next.5",
+ "gatsby": "^2.30.0-next.6",
"gatsby-interface": "^0.0.225",
"gatsby-plugin-typescript": "^2.10.0-next.0",
"gatsby-plugin-webfonts": "^1.1.3",
diff --git a/packages/gatsby-graphiql-explorer/CHANGELOG.md b/packages/gatsby-graphiql-explorer/CHANGELOG.md
index 4decf03a84af0..a36a969e81f23 100644
--- a/packages/gatsby-graphiql-explorer/CHANGELOG.md
+++ b/packages/gatsby-graphiql-explorer/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [0.9.0-next.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-graphiql-explorer@0.9.0-next.0...gatsby-graphiql-explorer@0.9.0-next.1) (2020-12-17)
+
+**Note:** Version bump only for package gatsby-graphiql-explorer
+
# [0.9.0-next.0](https://github.com/gatsbyjs/gatsby/compare/gatsby-graphiql-explorer@0.8.0-next.0...gatsby-graphiql-explorer@0.9.0-next.0) (2020-12-10)
**Note:** Version bump only for package gatsby-graphiql-explorer
diff --git a/packages/gatsby-graphiql-explorer/package.json b/packages/gatsby-graphiql-explorer/package.json
index afeeb3c594d30..7fac0102fb2a7 100644
--- a/packages/gatsby-graphiql-explorer/package.json
+++ b/packages/gatsby-graphiql-explorer/package.json
@@ -1,6 +1,6 @@
{
"name": "gatsby-graphiql-explorer",
- "version": "0.9.0-next.0",
+ "version": "0.9.0-next.1",
"description": "GraphiQL IDE with custom features for Gatsby users",
"main": "index.js",
"scripts": {
diff --git a/packages/gatsby-plugin-image/CHANGELOG.md b/packages/gatsby-plugin-image/CHANGELOG.md
index 290bd860b9957..110ca9ce9f2c0 100644
--- a/packages/gatsby-plugin-image/CHANGELOG.md
+++ b/packages/gatsby-plugin-image/CHANGELOG.md
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [0.5.0-next.4](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-image@0.5.0-next.3...gatsby-plugin-image@0.5.0-next.4) (2020-12-17)
+
+### Bug Fixes
+
+- **deps:** Revert postcss upgrade which broke css macro ([#28672](https://github.com/gatsbyjs/gatsby/issues/28672)) ([cde7885](https://github.com/gatsbyjs/gatsby/commit/cde7885f39eab846a8cdd9d3d08b9b5d299cfd76))
+
# [0.5.0-next.3](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-image@0.5.0-next.2...gatsby-plugin-image@0.5.0-next.3) (2020-12-17)
**Note:** Version bump only for package gatsby-plugin-image
diff --git a/packages/gatsby-plugin-image/package.json b/packages/gatsby-plugin-image/package.json
index b6a6e83ab0c79..a8ec566ea4ba0 100644
--- a/packages/gatsby-plugin-image/package.json
+++ b/packages/gatsby-plugin-image/package.json
@@ -1,6 +1,6 @@
{
"name": "gatsby-plugin-image",
- "version": "0.5.0-next.3",
+ "version": "0.5.0-next.4",
"scripts": {
"build": "npm-run-all -s clean -p build:*",
"build:gatsby-node": "tsc --jsx react --downlevelIteration true --skipLibCheck true --esModuleInterop true --outDir dist/ src/gatsby-node.ts src/babel-plugin-parse-static-images.ts src/resolver-utils.ts src/types.d.ts",
diff --git a/packages/gatsby-plugin-sharp/CHANGELOG.md b/packages/gatsby-plugin-sharp/CHANGELOG.md
index a20a086b0af7a..dfe444263a48e 100644
--- a/packages/gatsby-plugin-sharp/CHANGELOG.md
+++ b/packages/gatsby-plugin-sharp/CHANGELOG.md
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.12.0-next.4](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-sharp@2.12.0-next.3...gatsby-plugin-sharp@2.12.0-next.4) (2020-12-17)
+
+### Bug Fixes
+
+- **deps:** update minor and patch for gatsby-plugin-sharp ([#28509](https://github.com/gatsbyjs/gatsby/issues/28509)) ([0ce0f69](https://github.com/gatsbyjs/gatsby/commit/0ce0f69863d92cf104185667980e04c1a31837aa))
+
# [2.12.0-next.3](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-sharp@2.12.0-next.2...gatsby-plugin-sharp@2.12.0-next.3) (2020-12-17)
**Note:** Version bump only for package gatsby-plugin-sharp
diff --git a/packages/gatsby-plugin-sharp/package.json b/packages/gatsby-plugin-sharp/package.json
index ffe816b78b9f5..8542a6e3fd811 100644
--- a/packages/gatsby-plugin-sharp/package.json
+++ b/packages/gatsby-plugin-sharp/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby-plugin-sharp",
"description": "Wrapper of the Sharp image manipulation library for Gatsby plugins",
- "version": "2.12.0-next.3",
+ "version": "2.12.0-next.4",
"author": "Kyle Mathews ",
"bugs": {
"url": "https://github.com/gatsbyjs/gatsby/issues"
@@ -33,7 +33,7 @@
"@types/sharp": "^0.26.1",
"babel-preset-gatsby-package": "^0.10.0-next.0",
"cross-env": "^7.0.3",
- "gatsby-plugin-image": "^0.5.0-next.3"
+ "gatsby-plugin-image": "^0.5.0-next.4"
},
"homepage": "https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-plugin-sharp#readme",
"keywords": [
diff --git a/packages/gatsby-source-contentful/CHANGELOG.md b/packages/gatsby-source-contentful/CHANGELOG.md
index 95383e99f6978..7fcea47d5c49f 100644
--- a/packages/gatsby-source-contentful/CHANGELOG.md
+++ b/packages/gatsby-source-contentful/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [4.4.0-next.3](https://github.com/gatsbyjs/gatsby/compare/gatsby-source-contentful@4.4.0-next.2...gatsby-source-contentful@4.4.0-next.3) (2020-12-17)
+
+**Note:** Version bump only for package gatsby-source-contentful
+
# [4.4.0-next.2](https://github.com/gatsbyjs/gatsby/compare/gatsby-source-contentful@4.4.0-next.1...gatsby-source-contentful@4.4.0-next.2) (2020-12-17)
**Note:** Version bump only for package gatsby-source-contentful
diff --git a/packages/gatsby-source-contentful/package.json b/packages/gatsby-source-contentful/package.json
index c8ff9c288538a..5bbdd99da6ddb 100644
--- a/packages/gatsby-source-contentful/package.json
+++ b/packages/gatsby-source-contentful/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby-source-contentful",
"description": "Gatsby source plugin for building websites using the Contentful CMS as a data source",
- "version": "4.4.0-next.2",
+ "version": "4.4.0-next.3",
"author": "Marcus Ericsson (mericsson.com)",
"bugs": {
"url": "https://github.com/gatsbyjs/gatsby/issues"
@@ -19,7 +19,7 @@
"fs-extra": "^9.0.1",
"gatsby-core-utils": "^1.8.0-next.0",
"gatsby-plugin-utils": "^0.7.0-next.1",
- "gatsby-source-filesystem": "^2.9.0-next.0",
+ "gatsby-source-filesystem": "^2.9.0-next.1",
"is-online": "^8.5.1",
"json-stringify-safe": "^5.0.1",
"lodash": "^4.17.20",
diff --git a/packages/gatsby-source-drupal/CHANGELOG.md b/packages/gatsby-source-drupal/CHANGELOG.md
index 104e1b6c1aa42..4c456ee94e680 100644
--- a/packages/gatsby-source-drupal/CHANGELOG.md
+++ b/packages/gatsby-source-drupal/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [3.11.0-next.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-source-drupal@3.11.0-next.0...gatsby-source-drupal@3.11.0-next.1) (2020-12-17)
+
+**Note:** Version bump only for package gatsby-source-drupal
+
# [3.11.0-next.0](https://github.com/gatsbyjs/gatsby/compare/gatsby-source-drupal@3.10.0-next.0...gatsby-source-drupal@3.11.0-next.0) (2020-12-10)
### Bug Fixes
diff --git a/packages/gatsby-source-drupal/package.json b/packages/gatsby-source-drupal/package.json
index 365aaabb08e98..ed58eb98cd038 100644
--- a/packages/gatsby-source-drupal/package.json
+++ b/packages/gatsby-source-drupal/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby-source-drupal",
"description": "Gatsby source plugin for building websites using the Drupal CMS as a data source",
- "version": "3.11.0-next.0",
+ "version": "3.11.0-next.1",
"author": "Kyle Mathews ",
"bugs": {
"url": "https://github.com/gatsbyjs/gatsby/issues"
@@ -11,7 +11,7 @@
"axios": "^0.21.0",
"bluebird": "^3.7.2",
"body-parser": "^1.19.0",
- "gatsby-source-filesystem": "^2.9.0-next.0",
+ "gatsby-source-filesystem": "^2.9.0-next.1",
"lodash": "^4.17.20",
"tiny-async-pool": "^1.1.0"
},
diff --git a/packages/gatsby-source-filesystem/CHANGELOG.md b/packages/gatsby-source-filesystem/CHANGELOG.md
index fc4a34f263062..de7d5d5b77fec 100644
--- a/packages/gatsby-source-filesystem/CHANGELOG.md
+++ b/packages/gatsby-source-filesystem/CHANGELOG.md
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.9.0-next.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-source-filesystem@2.9.0-next.0...gatsby-source-filesystem@2.9.0-next.1) (2020-12-17)
+
+### Bug Fixes
+
+- **gatsby-source-filesystem:** Retry a download if a file is incomplete ([#28547](https://github.com/gatsbyjs/gatsby/issues/28547)) ([3474ae3](https://github.com/gatsbyjs/gatsby/commit/3474ae39e75e718a7545a9d7d0379fdbdfba2f91))
+
# [2.9.0-next.0](https://github.com/gatsbyjs/gatsby/compare/gatsby-source-filesystem@2.8.0-next.0...gatsby-source-filesystem@2.9.0-next.0) (2020-12-10)
**Note:** Version bump only for package gatsby-source-filesystem
diff --git a/packages/gatsby-source-filesystem/package.json b/packages/gatsby-source-filesystem/package.json
index f840353987825..a61525ee11257 100644
--- a/packages/gatsby-source-filesystem/package.json
+++ b/packages/gatsby-source-filesystem/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby-source-filesystem",
"description": "Gatsby source plugin for building websites from local data. Markdown, JSON, images, YAML, CSV, and dozens of other data types supported.",
- "version": "2.9.0-next.0",
+ "version": "2.9.0-next.1",
"author": "Kyle Mathews ",
"bugs": {
"url": "https://github.com/gatsbyjs/gatsby/issues"
diff --git a/packages/gatsby-source-shopify/CHANGELOG.md b/packages/gatsby-source-shopify/CHANGELOG.md
index ab4e606838936..73df086dfab24 100644
--- a/packages/gatsby-source-shopify/CHANGELOG.md
+++ b/packages/gatsby-source-shopify/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [3.8.0-next.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-source-shopify@3.8.0-next.0...gatsby-source-shopify@3.8.0-next.1) (2020-12-17)
+
+**Note:** Version bump only for package gatsby-source-shopify
+
# [3.8.0-next.0](https://github.com/gatsbyjs/gatsby/compare/gatsby-source-shopify@3.7.0-next.1...gatsby-source-shopify@3.8.0-next.0) (2020-12-10)
**Note:** Version bump only for package gatsby-source-shopify
diff --git a/packages/gatsby-source-shopify/package.json b/packages/gatsby-source-shopify/package.json
index b2275056058dc..cffa4a69605a9 100644
--- a/packages/gatsby-source-shopify/package.json
+++ b/packages/gatsby-source-shopify/package.json
@@ -1,6 +1,6 @@
{
"name": "gatsby-source-shopify",
- "version": "3.8.0-next.0",
+ "version": "3.8.0-next.1",
"description": "Gatsby source plugin for building websites using Shopify as a data source.",
"scripts": {
"build": "babel src --out-dir . --ignore \"**/__tests__\"",
@@ -36,7 +36,7 @@
"babel-preset-gatsby-package": "^0.10.0-next.0",
"chalk": "^4.1.0",
"gatsby-node-helpers": "^0.3.0",
- "gatsby-source-filesystem": "^2.9.0-next.0",
+ "gatsby-source-filesystem": "^2.9.0-next.1",
"graphql-request": "^1.8.2",
"lodash": "^4.17.20",
"p-iteration": "^1.1.8",
diff --git a/packages/gatsby-source-wordpress/CHANGELOG.md b/packages/gatsby-source-wordpress/CHANGELOG.md
index 684c8262e800e..23d2e157e074a 100644
--- a/packages/gatsby-source-wordpress/CHANGELOG.md
+++ b/packages/gatsby-source-wordpress/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [3.9.0-next.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-source-wordpress@3.9.0-next.0...gatsby-source-wordpress@3.9.0-next.1) (2020-12-17)
+
+**Note:** Version bump only for package gatsby-source-wordpress
+
# [3.9.0-next.0](https://github.com/gatsbyjs/gatsby/compare/gatsby-source-wordpress@3.8.0-next.0...gatsby-source-wordpress@3.9.0-next.0) (2020-12-10)
**Note:** Version bump only for package gatsby-source-wordpress
diff --git a/packages/gatsby-source-wordpress/package.json b/packages/gatsby-source-wordpress/package.json
index 71643147f1d8e..e7193fec77a2e 100644
--- a/packages/gatsby-source-wordpress/package.json
+++ b/packages/gatsby-source-wordpress/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby-source-wordpress",
"description": "Gatsby source plugin for building websites using the WordPress CMS as a data source.",
- "version": "3.9.0-next.0",
+ "version": "3.9.0-next.1",
"author": "Sebastien Fichot ",
"bugs": {
"url": "https://github.com/gatsbyjs/gatsby/issues"
@@ -14,7 +14,7 @@
"bluebird": "^3.7.2",
"deep-map": "^1.5.0",
"deep-map-keys": "^1.2.0",
- "gatsby-source-filesystem": "^2.9.0-next.0",
+ "gatsby-source-filesystem": "^2.9.0-next.1",
"json-stringify-safe": "^5.0.1",
"lodash": "^4.17.20",
"minimatch": "^3.0.4",
diff --git a/packages/gatsby-transformer-asciidoc/CHANGELOG.md b/packages/gatsby-transformer-asciidoc/CHANGELOG.md
index 63cedc682f087..80fd245317e8a 100644
--- a/packages/gatsby-transformer-asciidoc/CHANGELOG.md
+++ b/packages/gatsby-transformer-asciidoc/CHANGELOG.md
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [1.8.0-next.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-transformer-asciidoc@1.8.0-next.0...gatsby-transformer-asciidoc@1.8.0-next.1) (2020-12-17)
+
+### Bug Fixes
+
+- **deps:** update minor and patch for gatsby-transformer-asciidoc ([#28359](https://github.com/gatsbyjs/gatsby/issues/28359)) ([275affb](https://github.com/gatsbyjs/gatsby/commit/275affb724ef17d901b0a73c10e797f4b5ae9a60))
+
# [1.8.0-next.0](https://github.com/gatsbyjs/gatsby/compare/gatsby-transformer-asciidoc@1.7.0-next.0...gatsby-transformer-asciidoc@1.8.0-next.0) (2020-12-10)
**Note:** Version bump only for package gatsby-transformer-asciidoc
diff --git a/packages/gatsby-transformer-asciidoc/package.json b/packages/gatsby-transformer-asciidoc/package.json
index a7751ffcfda41..b9f7013ee3187 100644
--- a/packages/gatsby-transformer-asciidoc/package.json
+++ b/packages/gatsby-transformer-asciidoc/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby-transformer-asciidoc",
"description": "Gatsby transformer plugin for Asciidocs using the Asciidoctor.js library",
- "version": "1.8.0-next.0",
+ "version": "1.8.0-next.1",
"author": "Daniel Oliver ",
"bugs": {
"url": "https://github.com/gatsbyjs/gatsby/issues"
diff --git a/packages/gatsby-transformer-sharp/CHANGELOG.md b/packages/gatsby-transformer-sharp/CHANGELOG.md
index 24542d83a2e87..d1c4246ef34d8 100644
--- a/packages/gatsby-transformer-sharp/CHANGELOG.md
+++ b/packages/gatsby-transformer-sharp/CHANGELOG.md
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.10.0-next.2](https://github.com/gatsbyjs/gatsby/compare/gatsby-transformer-sharp@2.10.0-next.1...gatsby-transformer-sharp@2.10.0-next.2) (2020-12-17)
+
+### Bug Fixes
+
+- **deps:** update minor and patch for gatsby-transformer-sharp ([#28510](https://github.com/gatsbyjs/gatsby/issues/28510)) ([b712950](https://github.com/gatsbyjs/gatsby/commit/b712950af10fbf31eb21f3bf6452c8761e7bb2df))
+
# [2.10.0-next.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-transformer-sharp@2.10.0-next.0...gatsby-transformer-sharp@2.10.0-next.1) (2020-12-17)
### Features
diff --git a/packages/gatsby-transformer-sharp/package.json b/packages/gatsby-transformer-sharp/package.json
index 7f413ee0def84..aa50dfb985dac 100644
--- a/packages/gatsby-transformer-sharp/package.json
+++ b/packages/gatsby-transformer-sharp/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby-transformer-sharp",
"description": "Gatsby transformer plugin for images using Sharp",
- "version": "2.10.0-next.1",
+ "version": "2.10.0-next.2",
"author": "Kyle Mathews ",
"bugs": {
"url": "https://github.com/gatsbyjs/gatsby/issues"
diff --git a/packages/gatsby-transformer-sqip/CHANGELOG.md b/packages/gatsby-transformer-sqip/CHANGELOG.md
index da620df99baf7..36717e63a7c0b 100644
--- a/packages/gatsby-transformer-sqip/CHANGELOG.md
+++ b/packages/gatsby-transformer-sqip/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.9.0-next.4](https://github.com/gatsbyjs/gatsby/compare/gatsby-transformer-sqip@2.9.0-next.3...gatsby-transformer-sqip@2.9.0-next.4) (2020-12-17)
+
+**Note:** Version bump only for package gatsby-transformer-sqip
+
# [2.9.0-next.3](https://github.com/gatsbyjs/gatsby/compare/gatsby-transformer-sqip@2.9.0-next.2...gatsby-transformer-sqip@2.9.0-next.3) (2020-12-17)
**Note:** Version bump only for package gatsby-transformer-sqip
diff --git a/packages/gatsby-transformer-sqip/package.json b/packages/gatsby-transformer-sqip/package.json
index 35105b9f0983d..9a11bad744a31 100644
--- a/packages/gatsby-transformer-sqip/package.json
+++ b/packages/gatsby-transformer-sqip/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby-transformer-sqip",
"description": "Generates geometric primitive version of images",
- "version": "2.9.0-next.3",
+ "version": "2.9.0-next.4",
"author": "Benedikt Rötsch ",
"bugs": {
"url": "https://github.com/gatsbyjs/gatsby/issues"
@@ -9,7 +9,7 @@
"dependencies": {
"@babel/runtime": "^7.12.5",
"fs-extra": "^8.1.0",
- "gatsby-plugin-sharp": "^2.12.0-next.3",
+ "gatsby-plugin-sharp": "^2.12.0-next.4",
"md5-file": "^5.0.0",
"mini-svg-data-uri": "^1.2.3",
"p-queue": "^6.6.2",
diff --git a/packages/gatsby/CHANGELOG.md b/packages/gatsby/CHANGELOG.md
index 0983f02b97d46..90faee2a080fd 100644
--- a/packages/gatsby/CHANGELOG.md
+++ b/packages/gatsby/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.30.0-next.6](https://github.com/gatsbyjs/gatsby/compare/gatsby@2.30.0-next.5...gatsby@2.30.0-next.6) (2020-12-17)
+
+**Note:** Version bump only for package gatsby
+
# [2.30.0-next.5](https://github.com/gatsbyjs/gatsby/compare/gatsby@2.30.0-next.4...gatsby@2.30.0-next.5) (2020-12-17)
**Note:** Version bump only for package gatsby
diff --git a/packages/gatsby/package.json b/packages/gatsby/package.json
index 14f40885216c5..1383a891cfd19 100644
--- a/packages/gatsby/package.json
+++ b/packages/gatsby/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby",
"description": "Blazing fast modern site generator for React",
- "version": "2.30.0-next.5",
+ "version": "2.30.0-next.6",
"author": "Kyle Mathews ",
"bin": {
"gatsby": "./cli.js"
@@ -79,7 +79,7 @@
"fs-extra": "^8.1.0",
"gatsby-cli": "^2.17.0-next.4",
"gatsby-core-utils": "^1.8.0-next.0",
- "gatsby-graphiql-explorer": "^0.9.0-next.0",
+ "gatsby-graphiql-explorer": "^0.9.0-next.1",
"gatsby-legacy-polyfills": "^0.5.0-next.0",
"gatsby-link": "^2.9.0-next.0",
"gatsby-plugin-page-creator": "^2.8.0-next.1",
From 1d7dc76a18de379e0004bd62a26d7630e0a060fe Mon Sep 17 00:00:00 2001
From: Vladimir Razuvaev
Date: Fri, 18 Dec 2020 03:45:02 +0700
Subject: [PATCH 12/37] fix(gatsby): remove redundant dispatch of query
extraction error (#28676)
* fix(gatsby): remove redundant query extraction error dispatch
* Warning message
---
e2e-tests/mdx/gatsby-config.js | 1 +
.../gatsby-plugin-test-regression1/gatsby-node.js | 2 ++
.../gatsby-plugin-test-regression1/package.json | 3 +++
e2e-tests/mdx/src/pages/regressions/index.mdx | 10 ++++++++++
packages/gatsby/src/query/file-parser.js | 5 +----
5 files changed, 17 insertions(+), 4 deletions(-)
create mode 100644 e2e-tests/mdx/plugins/gatsby-plugin-test-regression1/gatsby-node.js
create mode 100644 e2e-tests/mdx/plugins/gatsby-plugin-test-regression1/package.json
create mode 100644 e2e-tests/mdx/src/pages/regressions/index.mdx
diff --git a/e2e-tests/mdx/gatsby-config.js b/e2e-tests/mdx/gatsby-config.js
index 58afed83e39a3..e63a750799933 100644
--- a/e2e-tests/mdx/gatsby-config.js
+++ b/e2e-tests/mdx/gatsby-config.js
@@ -17,6 +17,7 @@ module.exports = {
path: `${__dirname}/src/posts`,
},
},
+ `gatsby-plugin-test-regression1`,
{
resolve: `gatsby-plugin-mdx`,
options: {
diff --git a/e2e-tests/mdx/plugins/gatsby-plugin-test-regression1/gatsby-node.js b/e2e-tests/mdx/plugins/gatsby-plugin-test-regression1/gatsby-node.js
new file mode 100644
index 0000000000000..7c43377e0a662
--- /dev/null
+++ b/e2e-tests/mdx/plugins/gatsby-plugin-test-regression1/gatsby-node.js
@@ -0,0 +1,2 @@
+// See pages/regressions/index.mdx
+exports.preprocessSource = args => args.contents
diff --git a/e2e-tests/mdx/plugins/gatsby-plugin-test-regression1/package.json b/e2e-tests/mdx/plugins/gatsby-plugin-test-regression1/package.json
new file mode 100644
index 0000000000000..22b603114ea08
--- /dev/null
+++ b/e2e-tests/mdx/plugins/gatsby-plugin-test-regression1/package.json
@@ -0,0 +1,3 @@
+{
+ "name": "gatsby-plugin-test-regression1"
+}
diff --git a/e2e-tests/mdx/src/pages/regressions/index.mdx b/e2e-tests/mdx/src/pages/regressions/index.mdx
new file mode 100644
index 0000000000000..4dcf2a0dabff6
--- /dev/null
+++ b/e2e-tests/mdx/src/pages/regressions/index.mdx
@@ -0,0 +1,10 @@
+This is a regression test for query extraction bug in Gatsby.
+
+All of the following is required to hit this bug:
+
+1. There should be at least one other plugin implementing `preprocessSource`
+2. This plugin must be listed before `gatsby-plugin-mdx` in `gatsby-config.js`
+3. MDX file must contain word `graphql`
+
+!Important, do not remove the next line!
+`graphql`
diff --git a/packages/gatsby/src/query/file-parser.js b/packages/gatsby/src/query/file-parser.js
index 734341bb387e4..318ac44678dfc 100644
--- a/packages/gatsby/src/query/file-parser.js
+++ b/packages/gatsby/src/query/file-parser.js
@@ -92,10 +92,7 @@ async function parseToAst(filePath, fileStr, { parentSpan, addError } = {}) {
ast = tmp
break
} catch (error) {
- boundActionCreators.queryExtractionGraphQLError({
- componentPath: filePath,
- })
- continue
+ // We emit the actual error below if every transpiled variant fails to parse
}
}
if (ast === undefined) {
From 739df134adbffddab58d9f85032579169362a348 Mon Sep 17 00:00:00 2001
From: Vladimir Razuvaev
Date: Fri, 18 Dec 2020 05:02:12 +0700
Subject: [PATCH 13/37] fix(gatsby): always add both `childField` and
`childrenField` in GraphQL (#28656)
* fix(gatsby): always add both `childField` and `childrenField` in GraphQL
* Update docs
* fix null reference
* Update tests
* TODO item to remove `many` arg in `v3`
* Update snapshot
* add description to convenience child fields
* update description
* Revert docs for now
---
.../__snapshots__/build-schema.js.snap | 2 +-
.../__snapshots__/kitchen-sink.js.snap | 15 +++++
.../__snapshots__/rebuild-schema.js.snap | 2 +-
.../__tests__/build-node-connections.js | 6 ++
.../src/schema/__tests__/build-node-types.js | 8 ++-
.../src/schema/__tests__/kitchen-sink.js | 6 ++
.../gatsby/src/schema/__tests__/queries.js | 12 ++++
.../src/schema/__tests__/rebuild-schema.js | 9 ++-
.../extensions/__tests__/child-relations.js | 50 ++++++++------
.../gatsby/src/schema/extensions/index.js | 4 +-
packages/gatsby/src/schema/schema.js | 66 ++++++++-----------
11 files changed, 116 insertions(+), 64 deletions(-)
diff --git a/packages/gatsby/src/schema/__tests__/__snapshots__/build-schema.js.snap b/packages/gatsby/src/schema/__tests__/__snapshots__/build-schema.js.snap
index 00a17f4cd91c1..668e4ed3afaae 100644
--- a/packages/gatsby/src/schema/__tests__/__snapshots__/build-schema.js.snap
+++ b/packages/gatsby/src/schema/__tests__/__snapshots__/build-schema.js.snap
@@ -35,7 +35,7 @@ directive @mimeTypes(
) on OBJECT
\\"\\"\\"
-Define parent-child relations between types. This is used to add \`child*\` or
+Define parent-child relations between types. This is used to add \`child*\` and
\`children*\` convenience fields like \`childImageSharp\`.
\\"\\"\\"
directive @childOf(
diff --git a/packages/gatsby/src/schema/__tests__/__snapshots__/kitchen-sink.js.snap b/packages/gatsby/src/schema/__tests__/__snapshots__/kitchen-sink.js.snap
index 0f4f81766d06d..2edc7a8c10f2e 100644
--- a/packages/gatsby/src/schema/__tests__/__snapshots__/kitchen-sink.js.snap
+++ b/packages/gatsby/src/schema/__tests__/__snapshots__/kitchen-sink.js.snap
@@ -40,6 +40,11 @@ Object {
"childImageSharp": Object {
"id": "0b06bdfe-f253-5859-8321-b42b5d737195",
},
+ "childrenImageSharp": Array [
+ Object {
+ "id": "0b06bdfe-f253-5859-8321-b42b5d737195",
+ },
+ ],
},
"time": "06 kesäkuu",
},
@@ -64,6 +69,11 @@ Object {
"childImageSharp": Object {
"id": "f5f0e564-899f-5bbc-92de-a2325b69cb75",
},
+ "childrenImageSharp": Array [
+ Object {
+ "id": "f5f0e564-899f-5bbc-92de-a2325b69cb75",
+ },
+ ],
},
"likes": 8,
"localeFormat": "05 huhtikuu 2017",
@@ -83,6 +93,11 @@ Object {
"childImageSharp": Object {
"id": "6ba97198-5331-53d6-a0e0-c9c063c5094e",
},
+ "childrenImageSharp": Array [
+ Object {
+ "id": "6ba97198-5331-53d6-a0e0-c9c063c5094e",
+ },
+ ],
},
"likes": 9,
"localeFormat": "11 syyskuu 2017",
diff --git a/packages/gatsby/src/schema/__tests__/__snapshots__/rebuild-schema.js.snap b/packages/gatsby/src/schema/__tests__/__snapshots__/rebuild-schema.js.snap
index 0fbfa35fb5f32..4e343ebb589f0 100644
--- a/packages/gatsby/src/schema/__tests__/__snapshots__/rebuild-schema.js.snap
+++ b/packages/gatsby/src/schema/__tests__/__snapshots__/rebuild-schema.js.snap
@@ -35,7 +35,7 @@ directive @mimeTypes(
) on OBJECT
\\"\\"\\"
-Define parent-child relations between types. This is used to add \`child*\` or
+Define parent-child relations between types. This is used to add \`child*\` and
\`children*\` convenience fields like \`childImageSharp\`.
\\"\\"\\"
directive @childOf(
diff --git a/packages/gatsby/src/schema/__tests__/build-node-connections.js b/packages/gatsby/src/schema/__tests__/build-node-connections.js
index 5f1d6bd88b997..152d09cc1e1a4 100644
--- a/packages/gatsby/src/schema/__tests__/build-node-connections.js
+++ b/packages/gatsby/src/schema/__tests__/build-node-connections.js
@@ -184,6 +184,9 @@ describe(`build-node-connections`, () => {
childRelative { # lol
id
}
+ childrenRelative {
+ id
+ }
}
}
}
@@ -193,6 +196,9 @@ describe(`build-node-connections`, () => {
expect(allParent.edges[0].node.childRelative).toBeDefined()
expect(allParent.edges[0].node.childRelative.id).toEqual(`r1`)
+
+ expect(allParent.edges[0].node.childrenRelative).toBeDefined()
+ expect(allParent.edges[0].node.childrenRelative).toEqual([{ id: `r1` }])
})
it(`should create page dependency`, async () => {
diff --git a/packages/gatsby/src/schema/__tests__/build-node-types.js b/packages/gatsby/src/schema/__tests__/build-node-types.js
index 5067c04b8df5f..d62c96b846a12 100644
--- a/packages/gatsby/src/schema/__tests__/build-node-types.js
+++ b/packages/gatsby/src/schema/__tests__/build-node-types.js
@@ -154,19 +154,25 @@ describe(`build-node-types`, () => {
})
it(`should create typed children fields`, async () => {
- let { parent } = await runQuery(
+ const { parent } = await runQuery(
`
{
parent(id: { eq: "p1" }) {
childrenChild { # lol
id
}
+ childChild {
+ id
+ }
}
}
`
)
expect(parent.childrenChild).toBeDefined()
expect(parent.childrenChild.map(c => c.id)).toEqual([`c1`, `c2`])
+
+ expect(parent.childChild).toBeDefined()
+ expect(parent.childChild).toEqual({ id: `c1` })
})
it(`should create typed child field for singular children`, async () => {
diff --git a/packages/gatsby/src/schema/__tests__/kitchen-sink.js b/packages/gatsby/src/schema/__tests__/kitchen-sink.js
index cd439a79d6e53..5bdd46e183e7c 100644
--- a/packages/gatsby/src/schema/__tests__/kitchen-sink.js
+++ b/packages/gatsby/src/schema/__tests__/kitchen-sink.js
@@ -126,6 +126,9 @@ describe(`Kitchen sink schema test`, () => {
childImageSharp {
id
}
+ childrenImageSharp {
+ id
+ }
}
}
}
@@ -146,6 +149,9 @@ describe(`Kitchen sink schema test`, () => {
childImageSharp {
id
}
+ childrenImageSharp {
+ id
+ }
}
_3invalidKey
}
diff --git a/packages/gatsby/src/schema/__tests__/queries.js b/packages/gatsby/src/schema/__tests__/queries.js
index 10f5b98b047fe..3305d90c17b29 100644
--- a/packages/gatsby/src/schema/__tests__/queries.js
+++ b/packages/gatsby/src/schema/__tests__/queries.js
@@ -224,6 +224,7 @@ describe(`Query schema`, () => {
edges {
node {
childMarkdown { frontmatter { title } }
+ childrenMarkdown { frontmatter { title } }
}
}
}
@@ -236,16 +237,23 @@ describe(`Query schema`, () => {
{
node: {
childMarkdown: { frontmatter: { title: `Markdown File 1` } },
+ childrenMarkdown: [
+ { frontmatter: { title: `Markdown File 1` } },
+ ],
},
},
{
node: {
childMarkdown: { frontmatter: { title: `Markdown File 2` } },
+ childrenMarkdown: [
+ { frontmatter: { title: `Markdown File 2` } },
+ ],
},
},
{
node: {
childMarkdown: null,
+ childrenMarkdown: [],
},
},
],
@@ -261,6 +269,7 @@ describe(`Query schema`, () => {
allFile {
edges {
node {
+ childAuthor { name }
childrenAuthor { name }
}
}
@@ -273,16 +282,19 @@ describe(`Query schema`, () => {
edges: [
{
node: {
+ childAuthor: null,
childrenAuthor: [],
},
},
{
node: {
+ childAuthor: null,
childrenAuthor: [],
},
},
{
node: {
+ childAuthor: { name: `Author 2` },
childrenAuthor: [{ name: `Author 2` }, { name: `Author 1` }],
},
},
diff --git a/packages/gatsby/src/schema/__tests__/rebuild-schema.js b/packages/gatsby/src/schema/__tests__/rebuild-schema.js
index 168f92298aeaa..20f59e1d1f58f 100644
--- a/packages/gatsby/src/schema/__tests__/rebuild-schema.js
+++ b/packages/gatsby/src/schema/__tests__/rebuild-schema.js
@@ -541,7 +541,9 @@ describe(`build and update individual types`, () => {
const fields = newSchema.getType(`Foo`).getFields()
const fieldNames = Object.keys(fields).sort()
expect(fieldNames).toEqual(
- initialFooFields.concat(`childBar`, `childBaz`).sort()
+ initialFooFields
+ .concat(`childBar`, `childBaz`, `childrenBar`, `childrenBaz`)
+ .sort()
)
expect(String(fields.childBar.type)).toEqual(`Bar`)
expect(String(fields.childBaz.type)).toEqual(`Baz`)
@@ -573,7 +575,10 @@ describe(`build and update individual types`, () => {
const fields = newSchema.getType(`Foo`).getFields()
const fieldNames = Object.keys(fields).sort()
- expect(fieldNames).toEqual(initialFooFields.concat(`childrenBar`).sort())
+ expect(fieldNames).toEqual(
+ initialFooFields.concat(`childBar`, `childrenBar`).sort()
+ )
+ expect(String(fields.childBar.type)).toEqual(`Bar`)
expect(String(fields.childrenBar.type)).toEqual(`[Bar]`)
await expectSymmetricDelete(nodes)
diff --git a/packages/gatsby/src/schema/extensions/__tests__/child-relations.js b/packages/gatsby/src/schema/extensions/__tests__/child-relations.js
index 39a21043da446..07b865c374587 100644
--- a/packages/gatsby/src/schema/extensions/__tests__/child-relations.js
+++ b/packages/gatsby/src/schema/extensions/__tests__/child-relations.js
@@ -167,7 +167,7 @@ describe(`Define parent-child relationships with field extensions`, () => {
type Child implements Node {
id: ID!
}
- type AnotherChild implements Node @childOf(types: ["Parent"], many: true) {
+ type AnotherChild implements Node @childOf(types: ["Parent"]) {
id: ID!
}
`)
@@ -175,7 +175,8 @@ describe(`Define parent-child relationships with field extensions`, () => {
await buildSchema()
expect(report.warn).toBeCalledTimes(1)
expect(report.warn.mock.calls[0][0]).toEqual(
- `Deprecation warning: In Gatsby v3 field \`Parent.childChild\` will not be added automatically ` +
+ `Deprecation warning: In Gatsby v3 fields \`Parent.childChild\` and \`Parent.childrenChild\` ` +
+ `will not be added automatically ` +
`because type \`Child\` does not explicitly list type \`Parent\` in \`childOf\` extension.\n` +
`Add the following type definition to fix this:\n\n` +
` type Child implements Node @childOf(types: ["Parent"]) {\n` +
@@ -185,19 +186,19 @@ describe(`Define parent-child relationships with field extensions`, () => {
)
})
- it(`adds child fields to parent type with childOf(many: true) extension`, async () => {
+ it(`adds children[Field] field to parent type with childOf extension`, async () => {
dispatch(
createTypes(`
type Parent implements Node @dontInfer {
id: ID!
}
- type Child implements Node @childOf(types: ["Parent"], many: true) {
+ type Child implements Node @childOf(types: ["Parent"]) {
id: ID!
}
- type AnotherChild implements Node @childOf(types: ["Parent"], many: true) {
+ type AnotherChild implements Node @childOf(types: ["Parent"]) {
id: ID!
}
- type ChildWithoutNodes implements Node @childOf(types: ["Parent"], many: true) {
+ type ChildWithoutNodes implements Node @childOf(types: ["Parent"]) {
id: ID!
}
`)
@@ -209,10 +210,12 @@ describe(`Define parent-child relationships with field extensions`, () => {
// expect(parentFields.childChild).toBeUndefined() // Deprecated, see above
expect(parentFields.childrenAnotherChild).toBeDefined()
expect(parentFields.childrenAnotherChild.resolve).toBeDefined()
- expect(parentFields.childAnotherChild).toBeUndefined()
+ expect(parentFields.childAnotherChild).toBeDefined()
+ expect(parentFields.childAnotherChild.resolve).toBeDefined()
expect(parentFields.childrenChildWithoutNodes).toBeDefined()
expect(parentFields.childrenChildWithoutNodes.resolve).toBeDefined()
- expect(parentFields.childChildWithoutNodes).toBeUndefined()
+ expect(parentFields.childChildWithoutNodes).toBeDefined()
+ expect(parentFields.childChildWithoutNodes.resolve).toBeDefined()
})
it(`shows error when childOf extension is used on type that does not implement the Node interface`, async () => {
@@ -239,7 +242,7 @@ describe(`Define parent-child relationships with field extensions`, () => {
type Child implements Node @childOf(types: ["Parent"]) {
name: String
}
- type AnotherChild implements Node @childOf(types: ["Parent"], many: true) {
+ type AnotherChild implements Node @childOf(types: ["Parent"]) {
name: String
}
type ChildWithoutNodes implements Node @childOf(types: ["Parent"]) {
@@ -330,7 +333,6 @@ describe(`Define parent-child relationships with field extensions`, () => {
extensions: {
childOf: {
types: [`Parent`],
- many: true,
},
},
}),
@@ -411,7 +413,7 @@ describe(`Define parent-child relationships with field extensions`, () => {
type Child implements Node @childOf(mimeTypes: ["application/listenup", "multipart/related"]) {
id: ID!
}
- type AnotherChild implements Node @childOf(mimeTypes: ["application/listenup", "multipart/related"], many: true) {
+ type AnotherChild implements Node @childOf(mimeTypes: ["application/listenup", "multipart/related"]) {
id: ID!
}
type ChildWithoutNodes implements Node @childOf(mimeTypes: ["application/listenup", "multipart/related"]) {
@@ -423,23 +425,29 @@ describe(`Define parent-child relationships with field extensions`, () => {
const parentFields = schema.getType(`Parent`).getFields()
expect(parentFields.childChild).toBeDefined()
expect(parentFields.childChild.resolve).toBeDefined()
- expect(parentFields.childrenChild).toBeUndefined()
+ expect(parentFields.childrenChild).toBeDefined()
+ expect(parentFields.childrenChild.resolve).toBeDefined()
expect(parentFields.childrenAnotherChild).toBeDefined()
expect(parentFields.childrenAnotherChild.resolve).toBeDefined()
- expect(parentFields.childAnotherChild).toBeUndefined()
+ expect(parentFields.childAnotherChild).toBeDefined()
+ expect(parentFields.childAnotherChild.resolve).toBeDefined()
expect(parentFields.childChildWithoutNodes).toBeDefined()
expect(parentFields.childChildWithoutNodes.resolve).toBeDefined()
- expect(parentFields.childChildrenWithoutNodes).toBeUndefined()
+ expect(parentFields.childrenChildWithoutNodes).toBeDefined()
+ expect(parentFields.childrenChildWithoutNodes.resolve).toBeDefined()
const relativeFields = schema.getType(`Relative`).getFields()
expect(relativeFields.childChild).toBeDefined()
expect(relativeFields.childChild.resolve).toBeDefined()
- expect(relativeFields.childrenChild).toBeUndefined()
+ expect(relativeFields.childrenChild).toBeDefined()
+ expect(relativeFields.childrenChild.resolve).toBeDefined()
expect(relativeFields.childrenAnotherChild).toBeDefined()
expect(relativeFields.childrenAnotherChild.resolve).toBeDefined()
- expect(relativeFields.childAnotherChild).toBeUndefined()
+ expect(relativeFields.childAnotherChild).toBeDefined()
+ expect(relativeFields.childAnotherChild.resolve).toBeDefined()
expect(relativeFields.childChildWithoutNodes).toBeDefined()
expect(relativeFields.childChildWithoutNodes.resolve).toBeDefined()
- expect(relativeFields.childChildrenWithoutNodes).toBeUndefined()
+ expect(relativeFields.childrenChildWithoutNodes).toBeDefined()
+ expect(relativeFields.childrenChildWithoutNodes.resolve).toBeDefined()
})
it(`returns correct query results for mime-types`, async () => {
@@ -454,7 +462,7 @@ describe(`Define parent-child relationships with field extensions`, () => {
type Child implements Node @childOf(mimeTypes: ["application/listenup", "multipart/related"]) {
name: String
}
- type AnotherChild implements Node @childOf(mimeTypes: ["application/listenup", "multipart/related"], many: true) {
+ type AnotherChild implements Node @childOf(mimeTypes: ["application/listenup", "multipart/related"]) {
name: String
}
type ChildWithoutNodes implements Node @childOf(mimeTypes: ["application/listenup", "multipart/related"]) {
@@ -533,7 +541,7 @@ describe(`Define parent-child relationships with field extensions`, () => {
type Child implements Node @childOf(types: ["Relative"], mimeTypes: ["application/listenup"]) {
name: String
}
- type AnotherChild implements Node @childOf(types: ["Relative"], mimeTypes: ["multipart/related"], many: true) {
+ type AnotherChild implements Node @childOf(types: ["Relative"], mimeTypes: ["multipart/related"]) {
name: String
}
`)
@@ -598,7 +606,7 @@ describe(`Define parent-child relationships with field extensions`, () => {
type Relative implements Node @dontInfer @mimeTypes(types: ["multipart/related"]) {
id: ID!
}
- interface NextGeneration @nodeInterface @childOf(mimeTypes: ["application/listenup", "multipart/related"], many: true) {
+ interface NextGeneration @nodeInterface @childOf(mimeTypes: ["application/listenup", "multipart/related"]) {
id: ID!
name: String
}
@@ -688,7 +696,7 @@ describe(`Define parent-child relationships with field extensions`, () => {
type Parent implements Node & Ancestors {
id: ID!
}
- type AnotherChild implements Node @childOf(types: ["Ancestors"], many: true) {
+ type AnotherChild implements Node @childOf(types: ["Ancestors"]) {
name: String
}
`)
diff --git a/packages/gatsby/src/schema/extensions/index.js b/packages/gatsby/src/schema/extensions/index.js
index 5653b9f084056..04188b70c6157 100644
--- a/packages/gatsby/src/schema/extensions/index.js
+++ b/packages/gatsby/src/schema/extensions/index.js
@@ -58,7 +58,7 @@ const typeExtensions = {
childOf: {
description:
`Define parent-child relations between types. This is used to add ` +
- `\`child*\` or \`children*\` convenience fields like \`childImageSharp\`.`,
+ `\`child*\` and \`children*\` convenience fields like \`childImageSharp\`.`,
args: {
mimeTypes: {
type: `[String!]!`,
@@ -75,9 +75,11 @@ const typeExtensions = {
`types handled by a transformer plugin.`,
},
many: {
+ // TODO: Remove in Gatsby v3
type: `Boolean!`,
defaultValue: false,
description: `Specifies whether a parent can have multiple children of this type or not.`,
+ deprecationReason: `No-op. We always add both \`child[Field]\` and \`children[Field]\` to the parent type`,
},
},
},
diff --git a/packages/gatsby/src/schema/schema.js b/packages/gatsby/src/schema/schema.js
index 04043dd7a38a0..00d1caee63e06 100644
--- a/packages/gatsby/src/schema/schema.js
+++ b/packages/gatsby/src/schema/schema.js
@@ -938,18 +938,19 @@ const addConvenienceChildrenFields = ({ schemaComposer }) => {
return
}
- const { types, mimeTypes, many } = type.getExtension(`childOf`)
+ const { types, mimeTypes } = type.getExtension(`childOf`)
+ // TODO: deprecate `many` argument
new Set(types).forEach(parentType => {
if (!parentTypesToChildren.has(parentType)) {
- parentTypesToChildren.set(parentType, new Map())
+ parentTypesToChildren.set(parentType, new Set())
}
- parentTypesToChildren.get(parentType).set(type, many)
+ parentTypesToChildren.get(parentType).add(type)
})
new Set(mimeTypes).forEach(mimeType => {
if (!mimeTypesToChildren.has(mimeType)) {
- mimeTypesToChildren.set(mimeType, new Map())
+ mimeTypesToChildren.set(mimeType, new Set())
}
- mimeTypesToChildren.get(mimeType).set(type, many)
+ mimeTypesToChildren.get(mimeType).add(type)
})
}
})
@@ -968,12 +969,9 @@ const addConvenienceChildrenFields = ({ schemaComposer }) => {
)
return
}
- children.forEach((many, child) => {
- if (many) {
- typeComposer.addFields(createChildrenField(child.getTypeName()))
- } else {
- typeComposer.addFields(createChildField(child.getTypeName()))
- }
+ children.forEach(child => {
+ typeComposer.addFields(createChildrenField(child.getTypeName()))
+ typeComposer.addFields(createChildField(child.getTypeName()))
})
})
@@ -992,12 +990,9 @@ const addConvenienceChildrenFields = ({ schemaComposer }) => {
)
return
}
- children.forEach((many, child) => {
- if (many) {
- typeComposer.addFields(createChildrenField(child.getTypeName()))
- } else {
- typeComposer.addFields(createChildField(child.getTypeName()))
- }
+ children.forEach(child => {
+ typeComposer.addFields(createChildrenField(child.getTypeName()))
+ typeComposer.addFields(createChildField(child.getTypeName()))
})
})
}
@@ -1021,34 +1016,30 @@ const addImplicitConvenienceChildrenFields = ({
const childNodesByType = groupChildNodesByType({ nodes })
Object.keys(childNodesByType).forEach(typeName => {
- const typeChildren = childNodesByType[typeName]
- const maxChildCount = _.maxBy(
- _.values(_.groupBy(typeChildren, c => c.parent)),
- g => g.length
- ).length
-
// Adding children fields to types with the `@dontInfer` extension is deprecated
if (shouldInfer === false) {
const childTypeComposer = schemaComposer.getAnyTC(typeName)
const childOfExtension = childTypeComposer.getExtension(`childOf`)
- const many = maxChildCount > 1
// Only warn when the parent-child relation has not been explicitly set with
if (
!childOfExtension ||
- !childOfExtension.types.includes(parentTypeName) ||
- !childOfExtension.many === many
+ !childOfExtension.types.includes(parentTypeName)
) {
- const fieldName = many
- ? fieldNames.convenienceChildren(typeName)
- : fieldNames.convenienceChild(typeName)
- const manyArg = many ? `, many: true` : ``
+ const childField = fieldNames.convenienceChild(typeName)
+ const childrenField = fieldNames.convenienceChildren(typeName)
+ const childOfTypes = (childOfExtension?.types ?? [])
+ .concat(parentTypeName)
+ .map(name => `"${name}"`)
+ .join(`,`)
+
report.warn(
`Deprecation warning: ` +
- `In Gatsby v3 field \`${parentTypeName}.${fieldName}\` will not be added automatically because ` +
+ `In Gatsby v3 fields \`${parentTypeName}.${childField}\` and \`${parentTypeName}.${childrenField}\` ` +
+ `will not be added automatically because ` +
`type \`${typeName}\` does not explicitly list type \`${parentTypeName}\` in \`childOf\` extension.\n` +
`Add the following type definition to fix this:\n\n` +
- ` type ${typeName} implements Node @childOf(types: ["${parentTypeName}"]${manyArg}) {\n` +
+ ` type ${typeName} implements Node @childOf(types: [${childOfTypes}]) {\n` +
` id: ID!\n` +
` }\n\n` +
`https://www.gatsbyjs.com/docs/actions/#createTypes`
@@ -1056,11 +1047,8 @@ const addImplicitConvenienceChildrenFields = ({
}
}
- if (maxChildCount > 1) {
- typeComposer.addFields(createChildrenField(typeName))
- } else {
- typeComposer.addFields(createChildField(typeName))
- }
+ typeComposer.addFields(createChildrenField(typeName))
+ typeComposer.addFields(createChildField(typeName))
})
}
@@ -1068,6 +1056,7 @@ const createChildrenField = typeName => {
return {
[fieldNames.convenienceChildren(typeName)]: {
type: () => [typeName],
+ description: `Returns all children nodes filtered by type ${typeName}`,
resolve(source, args, context) {
const { path } = context
return context.nodeModel.getNodesByIds(
@@ -1083,6 +1072,9 @@ const createChildField = typeName => {
return {
[fieldNames.convenienceChild(typeName)]: {
type: () => typeName,
+ description:
+ `Returns the first child node of type ${typeName} ` +
+ `or null if there are no children of given type on this node`,
resolve(source, args, context) {
const { path } = context
const result = context.nodeModel.getNodesByIds(
From 9a492868b4f28179a86204bc393051f0bf96fe9b Mon Sep 17 00:00:00 2001
From: Vladimir Razuvaev
Date: Fri, 18 Dec 2020 16:32:37 +0700
Subject: [PATCH 14/37] fix(gatsby-plugin-image): do not return from
preprocessSource if nothing is changed (#28678)
---
.../gatsby-plugin-image/src/node-apis/preprocess-source.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/gatsby-plugin-image/src/node-apis/preprocess-source.ts b/packages/gatsby-plugin-image/src/node-apis/preprocess-source.ts
index e825f518dd372..fdeeeb6a5deaa 100644
--- a/packages/gatsby-plugin-image/src/node-apis/preprocess-source.ts
+++ b/packages/gatsby-plugin-image/src/node-apis/preprocess-source.ts
@@ -15,13 +15,13 @@ export async function preprocessSource({
store,
createNodeId,
actions: { createNode },
-}: PreprocessSourceArgs): Promise {
+}: PreprocessSourceArgs): Promise {
if (
!contents.includes(`StaticImage`) ||
!contents.includes(`gatsby-plugin-image`) ||
!extensions.includes(path.extname(filename))
) {
- return contents
+ return
}
const root = store.getState().program.directory
@@ -43,5 +43,5 @@ export async function preprocessSource({
createNode,
})
- return contents
+ return
}
From a91825d0e8896c90aaa69e8929fe1da07cb90751 Mon Sep 17 00:00:00 2001
From: Matt Kane
Date: Fri, 18 Dec 2020 10:29:13 +0000
Subject: [PATCH 15/37] feat(gatsby-plugin-image): Add remote image support
(#28647)
* feat(gatsby-plugin-image): Add remote image support
Well that was easier than expected!
* Check for valid image type
* Add flag
* Fix check
* Use set
Co-authored-by: gatsbybot
---
.../src/node-apis/image-processing.ts | 53 ++++++++++++++++---
.../src/node-apis/preprocess-source.ts | 1 +
2 files changed, 46 insertions(+), 8 deletions(-)
diff --git a/packages/gatsby-plugin-image/src/node-apis/image-processing.ts b/packages/gatsby-plugin-image/src/node-apis/image-processing.ts
index f8d73e44d951f..9df2065ff289a 100644
--- a/packages/gatsby-plugin-image/src/node-apis/image-processing.ts
+++ b/packages/gatsby-plugin-image/src/node-apis/image-processing.ts
@@ -4,6 +4,7 @@ import {
Reporter,
ParentSpanPluginArgs,
Actions,
+ Store,
} from "gatsby"
import * as PluginSharp from "gatsby-plugin-sharp"
import { createFileNode } from "gatsby-source-filesystem/create-file-node"
@@ -11,7 +12,9 @@ import fs from "fs-extra"
import path from "path"
import { ImageProps, SharpProps } from "../utils"
import { watchImage } from "./watcher"
+import { createRemoteFileNode } from "gatsby-source-filesystem"
+const supportedTypes = new Set([`image/png`, `image/jpeg`, `image/webp`])
export interface IImageMetadata {
isFixed: boolean
contentDigest?: string
@@ -44,6 +47,9 @@ export async function createImageNode({
return file
}
+export const isRemoteURL = (url: string): boolean =>
+ url.startsWith(`http://`) || url.startsWith(`https://`)
+
export async function writeImages({
images,
pathPrefix,
@@ -53,6 +59,7 @@ export async function writeImages({
sourceDir,
createNodeId,
createNode,
+ store,
}: {
images: Map
pathPrefix: string
@@ -62,16 +69,46 @@ export async function writeImages({
sourceDir: string
createNodeId: ParentSpanPluginArgs["createNodeId"]
createNode: Actions["createNode"]
+ store: Store
}): Promise {
const promises = [...images.entries()].map(
async ([hash, { src, ...args }]) => {
- const fullPath = path.resolve(sourceDir, src)
-
- if (!fs.existsSync(fullPath)) {
- reporter.warn(`Could not find image "${src}". Looked for ${fullPath}`)
- return
+ let file: Node | undefined
+ let fullPath
+ if (process.env.GATSBY_EXPERIMENTAL_REMOTE_IMAGES && isRemoteURL(src)) {
+ try {
+ file = await createRemoteFileNode({
+ url: src,
+ store,
+ cache,
+ createNode,
+ createNodeId,
+ reporter,
+ })
+ } catch (err) {
+ reporter.error(`Error loading image ${src}`)
+ return
+ }
+ if (
+ !file.internal.mediaType ||
+ !supportedTypes.has(file.internal.mediaType)
+ ) {
+ reporter.error(
+ `The file loaded from ${src} is not a valid image type. Found "${
+ file.internal.mediaType || `unknown`
+ }"`
+ )
+ return
+ }
+ } else {
+ fullPath = path.resolve(sourceDir, src)
+
+ if (!fs.existsSync(fullPath)) {
+ reporter.warn(`Could not find image "${src}". Looked for ${fullPath}`)
+ return
+ }
+ file = await createFileNode(fullPath, createNodeId, {})
}
- const file: Node = await createFileNode(fullPath, createNodeId, {})
if (!file) {
reporter.warn(`Could not create node for image ${src}`)
@@ -80,7 +117,7 @@ export async function writeImages({
// We need our own type, because `File` belongs to the filesystem plugin
file.internal.type = `StaticImage`
-
+ delete (file.internal as any).owner
createNode(file)
const cacheKey = `ref-${file.id}`
@@ -100,7 +137,7 @@ export async function writeImages({
await writeImage(file, args, pathPrefix, reporter, cache, cacheFilename)
- if (process.env.NODE_ENV === `development`) {
+ if (fullPath && process.env.NODE_ENV === `development`) {
// Watch the source image for changes
watchImage({
createNode,
diff --git a/packages/gatsby-plugin-image/src/node-apis/preprocess-source.ts b/packages/gatsby-plugin-image/src/node-apis/preprocess-source.ts
index fdeeeb6a5deaa..7e11f4a6f81c2 100644
--- a/packages/gatsby-plugin-image/src/node-apis/preprocess-source.ts
+++ b/packages/gatsby-plugin-image/src/node-apis/preprocess-source.ts
@@ -41,6 +41,7 @@ export async function preprocessSource({
sourceDir,
createNodeId,
createNode,
+ store,
})
return
From f2697cc7496f856d9a4de877bb7129552d2e3c3b Mon Sep 17 00:00:00 2001
From: Lennart
Date: Fri, 18 Dec 2020 12:05:15 +0100
Subject: [PATCH 16/37] chore(docs): Fix links to release notes (#28685)
* chore(docs): Fix links to release notes
* links
* links
---
docs/docs/reference/release-notes/v2.27/index.md | 3 ++-
docs/docs/reference/release-notes/v2.28/index.md | 7 ++++---
docs/docs/reference/release-notes/v2.29/index.md | 13 +++++++------
3 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/docs/docs/reference/release-notes/v2.27/index.md b/docs/docs/reference/release-notes/v2.27/index.md
index db4709c424aa2..9ecb349468826 100644
--- a/docs/docs/reference/release-notes/v2.27/index.md
+++ b/docs/docs/reference/release-notes/v2.27/index.md
@@ -25,7 +25,8 @@ Sneak peek to next releases:
**Bleeding Edge:** Want to try new features as soon as possible? Install `gatsby@next` and let us know if you have any [issues](https://github.com/gatsbyjs/gatsby/issues).
-[Previous release notes](../v2.26/index.md)
+[Previous release notes](/docs/reference/release-notes/v2.26)
+
[Full changelog](https://github.com/gatsbyjs/gatsby/compare/gatsby@2.27.0-next.0...gatsby@2.27.0)
## create-gatsby
diff --git a/docs/docs/reference/release-notes/v2.28/index.md b/docs/docs/reference/release-notes/v2.28/index.md
index db647e75f0af2..e62a134c232d3 100644
--- a/docs/docs/reference/release-notes/v2.28/index.md
+++ b/docs/docs/reference/release-notes/v2.28/index.md
@@ -31,12 +31,13 @@ Sneak peek to next releases:
**Bleeding Edge:** Want to try new features as soon as possible? Install `gatsby@next` and let us know
if you have any [issues](https://github.com/gatsbyjs/gatsby/issues).
-[Previous release notes](../v2.27/index.md)
+[Previous release notes](/docs/reference/release-notes/v2.27)
+
[Full changelog](https://github.com/gatsbyjs/gatsby/compare/gatsby@2.28.0-next.0...gatsby@2.28.0)
## New `gatsby new`
-In previous release we added [interactive way of scaffolding new gatsby project](../v2.27/index.md#create-gatsby) (with `npm init gatsby`). As of this release, `gatsby new` (without any addition arguments) will use the same flow.
+In previous release we added [interactive way of scaffolding new gatsby project](/docs/reference/release-notes/v2.27#create-gatsby) (with `npm init gatsby`). As of this release, `gatsby new` (without any addition arguments) will use the same flow.
## Feature flags in `gatsby-config`
@@ -143,7 +144,7 @@ The plugin is updated to the new major version of emotion: v11. Check out [this
## Removed experimental lazy page bundling
-In `gatsby@2.27.0` we added [Experimental: Lazy page bundling](../v2.27/index.md#experimental-lazy-page-bundling-in-development) mode for `gatsby develop` that would delay compiling page templates until it was needed. While preliminary tests were very promising, we discovered few showstoppers that degraded development experience. [We decided to end the experiment](https://github.com/gatsbyjs/gatsby/discussions/28137#discussioncomment-138998) for now and shift our efforts to [(experimental) new cache clearing behaviors](#experimental-new-cache-clearing-behaviors).
+In `gatsby@2.27.0` we added [Experimental: Lazy page bundling](/docs/reference/release-notes/v2.27#experimental-lazy-page-bundling-in-development) mode for `gatsby develop` that would delay compiling page templates until it was needed. While preliminary tests were very promising, we discovered few showstoppers that degraded development experience. [We decided to end the experiment](https://github.com/gatsbyjs/gatsby/discussions/28137#discussioncomment-138998) for now and shift our efforts to [(experimental) new cache clearing behaviors](#experimental-new-cache-clearing-behaviors).
## Notable bugfixes
diff --git a/docs/docs/reference/release-notes/v2.29/index.md b/docs/docs/reference/release-notes/v2.29/index.md
index 2a4ab3bb458d9..4822af447f5f8 100644
--- a/docs/docs/reference/release-notes/v2.29/index.md
+++ b/docs/docs/reference/release-notes/v2.29/index.md
@@ -26,12 +26,13 @@ Other notable changes:
**Bleeding Edge:** Want to try new features as soon as possible? Install `gatsby@next` and let us know
if you have any [issues](https://github.com/gatsbyjs/gatsby/issues).
-[Previous release notes](../v2.28/index.md)
+[Previous release notes](/docs/reference/release-notes/v2.28)
+
[Full changelog](https://github.com/gatsbyjs/gatsby/compare/gatsby@2.29.0-next.0...gatsby@2.29.0)
## Query on Demand
-Starting with v2.29, 10% of our users are automatically opt-in to this feature. We've first shipped this feature behind a flag in [v2.27](../v2.27/index.md#experimental-queries-on-demand) and feel confident now that more people can try it out. Opt-in users will receive a notice in their terminal about that opt-in behavior and a hint on how to turn it off (in case it disturbs your workflow). As a recap of what Query on Demand will improve:
+Starting with v2.29, 10% of our users are automatically opt-in to this feature. We've first shipped this feature behind a flag in [v2.27](/docs/reference/release-notes/v2.27#experimental-queries-on-demand) and feel confident now that more people can try it out. Opt-in users will receive a notice in their terminal about that opt-in behavior and a hint on how to turn it off (in case it disturbs your workflow). As a recap of what Query on Demand will improve:
> Gatsby will run queries for pages as they're requested by a browser. Think of it like lazily loading the data your pages need, when they need it! This avoids having to wait for slower queries (like image processing) if you're editing an unrelated part of a site. What this means for you: faster local development experience, up to 2x faster in many cases!
@@ -63,7 +64,7 @@ The loading indicator respects the user's settings for `prefers-reduced-motion`
## Lazy Images
-Similarly as with Query on Demand also Lazy Images will be automatically delivered to 10% of our users with this v2.29 release. We've first shipped this feature behind a flag in [v2.28](../v2.28/index.md#experimental-lazy-images-in-develop). Opt-in users will receive a notice in their terminal about that opt-in behavior and a hint on how to turn it off (in case it disturbs your workflow). As a recap of what Lazy Images will improve:
+Similarly as with Query on Demand also Lazy Images will be automatically delivered to 10% of our users with this v2.29 release. We've first shipped this feature behind a flag in [v2.28](/docs/reference/release-notes/v2.28#experimental-lazy-images-in-develop). Opt-in users will receive a notice in their terminal about that opt-in behavior and a hint on how to turn it off (in case it disturbs your workflow). As a recap of what Lazy Images will improve:
> As more and more images are added to a Gatsby site, the slower the local development experience oftentimes becomes. You spend time waiting for images to process, instead of you know, developing! No longer! This experimental version of `gatsby-plugin-sharp` only does image processing when the page gets requested.
@@ -83,7 +84,7 @@ module.exports = {
## Improvements to our CLI
-In [v2.27](../v.27/index.md#create-gatsby) we introduced `create-gatsby`, a new and interactive way to create a Gatsby site. You can run it in your terminal with `npm init gatsby`.
+In [v2.27](/docs/reference/release-notes/v2.27#create-gatsby) we introduced `create-gatsby`, a new and interactive way to create a Gatsby site. You can run it in your terminal with `npm init gatsby`.
A couple of papercuts were fixed but we also added new features:
@@ -95,7 +96,7 @@ The regular `gatsby-cli` received a new command to list out all plugins in your
## Experimental: Parallel data sourcing
-In [v2.28](../v2.28/index.md#experimental-parallel-data-sourcing) we gave a sneak peak at a new feature that enables parallel data sourcing. As a recap:
+In [v2.28](/docs/reference/release-notes/v2.28#experimental-parallel-data-sourcing) we gave a sneak peak at a new feature that enables parallel data sourcing. As a recap:
> Plugin APIs in Gatsby run serially. Generally this what we want as most API calls are CPU/IO bound so things are fastest letting each plugin have the full undivided attention of your computer. But source plugins are often _network_ bound as they're hitting remote APIs and waiting for responses. We tried [changing the invocation of `sourceNodes` to parallel](https://github.com/gatsbyjs/gatsby/pull/28214) on a few sites with 4+ source plugins and saw a big speedup on sourcing (40%+) as they were no longer waiting on each other to start their API calls.
@@ -132,7 +133,7 @@ The File System Route API uses [slugify](https://github.com/sindresorhus/slugify
## gatsby-image codemod
-We introduced some API changes for working with images when we published the new `gatsby-plugin-image` in [v2.26](../v2.26/index.md#gatsby-plugin-image010-beta). In order to make it easier to migrate your code to work with the new plugin, we've created a codemod. Follow the migration instructions in the [README](https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-plugin-image#upgrading-from-the-gatsby-image2) in order to run the codemod against your project.
+We introduced some API changes for working with images when we published the new `gatsby-plugin-image` in [v2.26](/docs/reference/release-notes/v2.26#gatsby-plugin-image010-beta). In order to make it easier to migrate your code to work with the new plugin, we've created a codemod. Follow the migration instructions in the [README](https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-plugin-image#upgrading-from-the-gatsby-image2) in order to run the codemod against your project.
## Notable bugfixes
From c703eb4d994e1b7423e811577d0b9024f10a2bb9 Mon Sep 17 00:00:00 2001
From: Lennart
Date: Fri, 18 Dec 2020 12:58:43 +0100
Subject: [PATCH 17/37] fix(gatsby-plugin-sass): Nest sassOptions (#28683)
---
packages/gatsby-plugin-sass/README.md | 20 +-
.../__snapshots__/gatsby-node.js.snap | 142 ++++++++-----
.../src/__tests__/gatsby-node.js | 124 ++++++------
.../gatsby-plugin-sass/src/gatsby-node.js | 187 +++++++++---------
4 files changed, 270 insertions(+), 203 deletions(-)
diff --git a/packages/gatsby-plugin-sass/README.md b/packages/gatsby-plugin-sass/README.md
index 730edcf8e432d..d65706c581de1 100644
--- a/packages/gatsby-plugin-sass/README.md
+++ b/packages/gatsby-plugin-sass/README.md
@@ -39,8 +39,10 @@ plugins: [
{
resolve: `gatsby-plugin-sass`,
options: {
- includePaths: ["absolute/path/a", "absolute/path/b"],
- ...
+ sassOptions: {
+ includePaths: ["absolute/path/a", "absolute/path/b"],
+ ...
+ }
},
},
]
@@ -95,7 +97,9 @@ plugins: [
resolve: `gatsby-plugin-sass`,
options: {
postCssPlugins: [somePostCssPlugin()],
- precision: 6,
+ sassOptions: {
+ precision: 6,
+ },
},
},
]
@@ -111,7 +115,9 @@ plugins: [
resolve: `gatsby-plugin-sass`,
options: {
postCssPlugins: [somePostCssPlugin()],
- precision: 8,
+ sassOptions: {
+ precision: 8,
+ },
},
},
]
@@ -147,7 +153,7 @@ and common cross-browser flexbox bugs. Normally you don't need to think about it
you'd prefer to add additional postprocessing to your Sass output you can specify plugins
in the plugin options.
-## Relative paths & url()
+## Relative paths & `url()`
This plugin resolves `url()` paths relative to the entry SCSS/Sass file not – as might be expected – the location relative to the declaration. Under the hood, it makes use of [sass-loader](https://github.com/webpack-contrib/sass-loader/blob/master/README.md#problems-with-url) and this is documented in the [readme](https://github.com/webpack-contrib/sass-loader/blob/master/README.md#problems-with-url).
@@ -189,7 +195,7 @@ plugins: [
]
```
-NOTE that adding resolve-url-loader will use `sourceMap: true` on sass-loader (as it is required for the plugin to work), you can then activate/deactivate source-map for Sass files in the plugin:
+**Please note:** Adding resolve-url-loader will use `sourceMap: true` on sass-loader (as it is required for the plugin to work), you can then activate/deactivate source-map for Sass files in the plugin:
```javascript:title=gatsby-config.js
plugins: [
@@ -213,6 +219,8 @@ plugins: [
### v3.0.0
- `sass-loader` is updated to v10 which adds support for `node-sass@^5.0.0` but also switches the default `implementation` to `sass`. webpack also recommends using `sass` so this is reflected in the documentation here, too. In the [deprecation notice of node-sass](https://sass-lang.com/blog/libsass-is-deprecated#how-do-i-migrate) it is noted that switching from `node-sass` to `sass` is straightforward as both packages use the same JavaScript API.
+- All options for both [`node-sass`](https://github.com/sass/node-sass#options) & [`sass`](https://github.com/sass/dart-sass/blob/master/README.md#javascript-api) are moved into the `sassOptions` object
+- You're now able to override the `importLoaders` option. If you have this in your options but don't intend to override it, you'll need to remove it
### v2.0.0
diff --git a/packages/gatsby-plugin-sass/src/__tests__/__snapshots__/gatsby-node.js.snap b/packages/gatsby-plugin-sass/src/__tests__/__snapshots__/gatsby-node.js.snap
index 74156f54540d5..9d8fff779989b 100644
--- a/packages/gatsby-plugin-sass/src/__tests__/__snapshots__/gatsby-node.js.snap
+++ b/packages/gatsby-plugin-sass/src/__tests__/__snapshots__/gatsby-node.js.snap
@@ -12,11 +12,12 @@ exports[`gatsby-plugin-sass Stage: build-html / No options 1`] = `
Object {
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -56,11 +57,12 @@ exports[`gatsby-plugin-sass Stage: build-html / PostCss plugins 1`] = `
Object {
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({\\"plugins\\":[\\"test1\\"]})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -100,15 +102,17 @@ exports[`gatsby-plugin-sass Stage: build-html / Sass options 1`] = `
Object {
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
- "includePaths": Array [
- "absolute/path/a",
- "absolute/path/b",
- ],
+ "sassOptions": Object {
+ "includePaths": Array [
+ "absolute/path/a",
+ "absolute/path/b",
+ ],
+ },
"sourceMap": false,
},
},
@@ -148,11 +152,12 @@ exports[`gatsby-plugin-sass Stage: build-html / css-loader options 1`] = `
Object {
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
- "css({\\"camelCase\\":false,\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"camelCase\\":false,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -192,11 +197,12 @@ exports[`gatsby-plugin-sass Stage: build-html / sass rule modules test options 1
Object {
"test": /\\\\\\.global\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -236,11 +242,12 @@ exports[`gatsby-plugin-sass Stage: build-html / sass rule test options 1`] = `
Object {
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -281,11 +288,12 @@ exports[`gatsby-plugin-sass Stage: build-javascript / No options 1`] = `
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -300,6 +308,7 @@ exports[`gatsby-plugin-sass Stage: build-javascript / No options 1`] = `
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -334,11 +343,12 @@ exports[`gatsby-plugin-sass Stage: build-javascript / PostCss plugins 1`] = `
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({\\"plugins\\":[\\"test1\\"]})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -353,6 +363,7 @@ exports[`gatsby-plugin-sass Stage: build-javascript / PostCss plugins 1`] = `
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -387,15 +398,17 @@ exports[`gatsby-plugin-sass Stage: build-javascript / Sass options 1`] = `
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
- "includePaths": Array [
- "absolute/path/a",
- "absolute/path/b",
- ],
+ "sassOptions": Object {
+ "includePaths": Array [
+ "absolute/path/a",
+ "absolute/path/b",
+ ],
+ },
"sourceMap": false,
},
},
@@ -410,10 +423,12 @@ exports[`gatsby-plugin-sass Stage: build-javascript / Sass options 1`] = `
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
- "includePaths": Array [
- "absolute/path/a",
- "absolute/path/b",
- ],
+ "sassOptions": Object {
+ "includePaths": Array [
+ "absolute/path/a",
+ "absolute/path/b",
+ ],
+ },
"sourceMap": false,
},
},
@@ -448,11 +463,12 @@ exports[`gatsby-plugin-sass Stage: build-javascript / css-loader options 1`] = `
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"camelCase\\":false,\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"camelCase\\":false,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -462,11 +478,12 @@ exports[`gatsby-plugin-sass Stage: build-javascript / css-loader options 1`] = `
"test": /\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"camelCase\\":false,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"camelCase\\":false})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -501,11 +518,12 @@ exports[`gatsby-plugin-sass Stage: build-javascript / sass rule modules test opt
"test": /\\\\\\.global\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -520,6 +538,7 @@ exports[`gatsby-plugin-sass Stage: build-javascript / sass rule modules test opt
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -554,11 +573,12 @@ exports[`gatsby-plugin-sass Stage: build-javascript / sass rule test options 1`]
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -573,6 +593,7 @@ exports[`gatsby-plugin-sass Stage: build-javascript / sass rule test options 1`]
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -607,11 +628,12 @@ exports[`gatsby-plugin-sass Stage: develop / No options 1`] = `
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": true,
},
},
@@ -626,6 +648,7 @@ exports[`gatsby-plugin-sass Stage: develop / No options 1`] = `
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": true,
},
},
@@ -660,11 +683,12 @@ exports[`gatsby-plugin-sass Stage: develop / PostCss plugins 1`] = `
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({\\"plugins\\":[\\"test1\\"]})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": true,
},
},
@@ -679,6 +703,7 @@ exports[`gatsby-plugin-sass Stage: develop / PostCss plugins 1`] = `
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": true,
},
},
@@ -713,15 +738,17 @@ exports[`gatsby-plugin-sass Stage: develop / Sass options 1`] = `
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
- "includePaths": Array [
- "absolute/path/a",
- "absolute/path/b",
- ],
+ "sassOptions": Object {
+ "includePaths": Array [
+ "absolute/path/a",
+ "absolute/path/b",
+ ],
+ },
"sourceMap": true,
},
},
@@ -736,10 +763,12 @@ exports[`gatsby-plugin-sass Stage: develop / Sass options 1`] = `
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
- "includePaths": Array [
- "absolute/path/a",
- "absolute/path/b",
- ],
+ "sassOptions": Object {
+ "includePaths": Array [
+ "absolute/path/a",
+ "absolute/path/b",
+ ],
+ },
"sourceMap": true,
},
},
@@ -774,11 +803,12 @@ exports[`gatsby-plugin-sass Stage: develop / css-loader options 1`] = `
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"camelCase\\":false,\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"camelCase\\":false,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": true,
},
},
@@ -788,11 +818,12 @@ exports[`gatsby-plugin-sass Stage: develop / css-loader options 1`] = `
"test": /\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"camelCase\\":false,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"camelCase\\":false})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": true,
},
},
@@ -827,11 +858,12 @@ exports[`gatsby-plugin-sass Stage: develop / sass rule modules test options 1`]
"test": /\\\\\\.global\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": true,
},
},
@@ -846,6 +878,7 @@ exports[`gatsby-plugin-sass Stage: develop / sass rule modules test options 1`]
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": true,
},
},
@@ -880,11 +913,12 @@ exports[`gatsby-plugin-sass Stage: develop / sass rule test options 1`] = `
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
"miniCssExtract",
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": true,
},
},
@@ -899,6 +933,7 @@ exports[`gatsby-plugin-sass Stage: develop / sass rule test options 1`] = `
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": true,
},
},
@@ -932,11 +967,12 @@ exports[`gatsby-plugin-sass Stage: develop-html / No options 1`] = `
Object {
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -976,11 +1012,12 @@ exports[`gatsby-plugin-sass Stage: develop-html / PostCss plugins 1`] = `
Object {
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({\\"plugins\\":[\\"test1\\"]})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -1020,15 +1057,17 @@ exports[`gatsby-plugin-sass Stage: develop-html / Sass options 1`] = `
Object {
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
- "includePaths": Array [
- "absolute/path/a",
- "absolute/path/b",
- ],
+ "sassOptions": Object {
+ "includePaths": Array [
+ "absolute/path/a",
+ "absolute/path/b",
+ ],
+ },
"sourceMap": false,
},
},
@@ -1068,11 +1107,12 @@ exports[`gatsby-plugin-sass Stage: develop-html / css-loader options 1`] = `
Object {
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
- "css({\\"camelCase\\":false,\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"camelCase\\":false,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -1112,11 +1152,12 @@ exports[`gatsby-plugin-sass Stage: develop-html / sass rule modules test options
Object {
"test": /\\\\\\.global\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
@@ -1156,11 +1197,12 @@ exports[`gatsby-plugin-sass Stage: develop-html / sass rule test options 1`] = `
Object {
"test": /\\\\\\.module\\\\\\.s\\(a\\|c\\)ss\\$/,
"use": Array [
- "css({\\"modules\\":true,\\"importLoaders\\":2})",
+ "css({\\"importLoaders\\":2,\\"modules\\":true})",
"postcss({})",
Object {
"loader": "/node_modules/sass-loader/dist/cjs.js",
"options": Object {
+ "sassOptions": Object {},
"sourceMap": false,
},
},
diff --git a/packages/gatsby-plugin-sass/src/__tests__/gatsby-node.js b/packages/gatsby-plugin-sass/src/__tests__/gatsby-node.js
index 202969b5d9682..09dd53053c9d0 100644
--- a/packages/gatsby-plugin-sass/src/__tests__/gatsby-node.js
+++ b/packages/gatsby-plugin-sass/src/__tests__/gatsby-node.js
@@ -27,7 +27,9 @@ describe(`gatsby-plugin-sass`, () => {
options: {
"No options": {},
"Sass options": {
- includePaths: [`absolute/path/a`, `absolute/path/b`],
+ sassOptions: {
+ includePaths: [`absolute/path/a`, `absolute/path/b`],
+ },
},
"PostCss plugins": {
postCssPlugins: [`test1`],
@@ -66,24 +68,24 @@ describe(`pluginOptionsSchema`, () => {
`"sassRuleTest" must be of type object`,
`"sassRuleModulesTest" must be of type object`,
`"useResolveUrlLoader" must be one of [boolean, object]`,
- `"file" must be a string`,
- `"data" must be a string`,
- `"importer" must be of type function`,
- `"functions" must be of type object`,
- `"includePaths" must be an array`,
- `"indentedSyntax" must be a boolean`,
- `"indentType" must be a string`,
- `"indentWidth" must be less than or equal to 10`,
- `"linefeed" must be one of [cr, crlf, lf, lfcr]`,
- `"omitSourceMapUrl" must be a boolean`,
- `"outFile" must be a string`,
- `"outputStyle" must be one of [nested, expanded, compact, compressed]`,
- `"precision" must be a number`,
- `"sourceComments" must be a boolean`,
- `"sourceMap" must be one of [boolean, string]`,
- `"sourceMapContents" must be a boolean`,
- `"sourceMapEmbed" must be a boolean`,
- `"sourceMapRoot" must be a string`,
+ `"sassOptions.file" must be a string`,
+ `"sassOptions.data" must be a string`,
+ `"sassOptions.importer" must be of type function`,
+ `"sassOptions.functions" must be of type object`,
+ `"sassOptions.includePaths" must be an array`,
+ `"sassOptions.indentedSyntax" must be a boolean`,
+ `"sassOptions.indentType" must be a string`,
+ `"sassOptions.indentWidth" must be less than or equal to 10`,
+ `"sassOptions.linefeed" must be one of [cr, crlf, lf, lfcr]`,
+ `"sassOptions.omitSourceMapUrl" must be a boolean`,
+ `"sassOptions.outFile" must be a string`,
+ `"sassOptions.outputStyle" must be one of [nested, expanded, compact, compressed]`,
+ `"sassOptions.precision" must be a number`,
+ `"sassOptions.sourceComments" must be a boolean`,
+ `"sassOptions.sourceMap" must be one of [boolean, string]`,
+ `"sassOptions.sourceMapContents" must be a boolean`,
+ `"sassOptions.sourceMapEmbed" must be a boolean`,
+ `"sassOptions.sourceMapRoot" must be a string`,
]
const { errors } = await testPluginOptionsSchema(pluginOptionsSchema, {
@@ -93,24 +95,26 @@ describe(`pluginOptionsSchema`, () => {
sassRuleTest: `This should be a regexp`,
sassRuleModulesTest: `This should be a regexp`,
useResolveUrlLoader: `This should be a boolean`,
- file: 123, // should be a string
- data: 123, // should be a string
- importer: `This should be a function`,
- functions: `This should be an object of { string: function }`,
- includePaths: 123, // should be an array of string
- indentedSyntax: `"useResolveUrlLoader" must be a boolean`,
- indentType: 123, // this should be a string
- indentWidth: 40,
- linefeed: `This should be cr, crlf, lf or lfcr`,
- omitSourceMapUrl: `This should be a boolean`,
- outFile: 123, // This should be a string
- outputStyle: `This should be nested, expanded, compact or compressed`,
- precision: `This should be a number`,
- sourceComments: `This should be a boolean`,
- sourceMap: 123, // This should be a string or a boolean
- sourceMapContents: `This should be a boolean`,
- sourceMapEmbed: `This should be a boolean`,
- sourceMapRoot: 123, // This should be a string
+ sassOptions: {
+ file: 123, // should be a string
+ data: 123, // should be a string
+ importer: `This should be a function`,
+ functions: `This should be an object of { string: function }`,
+ includePaths: 123, // should be an array of string
+ indentedSyntax: `"useResolveUrlLoader" must be a boolean`,
+ indentType: 123, // this should be a string
+ indentWidth: 40,
+ linefeed: `This should be cr, crlf, lf or lfcr`,
+ omitSourceMapUrl: `This should be a boolean`,
+ outFile: 123, // This should be a string
+ outputStyle: `This should be nested, expanded, compact or compressed`,
+ precision: `This should be a number`,
+ sourceComments: `This should be a boolean`,
+ sourceMap: 123, // This should be a string or a boolean
+ sourceMapContents: `This should be a boolean`,
+ sourceMapEmbed: `This should be a boolean`,
+ sourceMapRoot: 123, // This should be a string
+ },
})
expect(errors).toEqual(expectedErrors)
@@ -124,30 +128,32 @@ describe(`pluginOptionsSchema`, () => {
sassRuleTest: /\.global\.s(a|c)ss$/,
sassRuleModulesTest: /\.mod\.s(a|c)ss$/,
useResolveUrlLoader: false,
- file: `../path-to-file`,
- data: `{ some: data }`,
- importer: function () {
- return { file: `path-to-file`, contents: `data` }
- },
- functions: {
- "headings($from: 0, $to: 6)": function () {
- return []
+ sassOptions: {
+ file: `../path-to-file`,
+ data: `{ some: data }`,
+ importer: function () {
+ return { file: `path-to-file`, contents: `data` }
+ },
+ functions: {
+ "headings($from: 0, $to: 6)": function () {
+ return []
+ },
},
+ includePaths: [`some`, `path`],
+ indentedSyntax: true,
+ indentType: `tabs`,
+ indentWidth: 7,
+ linefeed: `crlf`,
+ omitSourceMapUrl: true,
+ outFile: `somewhere-around.css`,
+ outputStyle: `expanded`,
+ precision: 12,
+ sourceComments: true,
+ sourceMap: true,
+ sourceMapContents: true,
+ sourceMapEmbed: true,
+ sourceMapRoot: `some-source-map-root`,
},
- includePaths: [`some`, `path`],
- indentedSyntax: true,
- indentType: `tabs`,
- indentWidth: 7,
- linefeed: `crlf`,
- omitSourceMapUrl: true,
- outFile: `somewhere-around.css`,
- outputStyle: `expanded`,
- precision: 12,
- sourceComments: true,
- sourceMap: true,
- sourceMapContents: true,
- sourceMapEmbed: true,
- sourceMapRoot: `some-source-map-root`,
})
expect(isValid).toBe(true)
diff --git a/packages/gatsby-plugin-sass/src/gatsby-node.js b/packages/gatsby-plugin-sass/src/gatsby-node.js
index 773cb179acebd..b40f518d7bf56 100644
--- a/packages/gatsby-plugin-sass/src/gatsby-node.js
+++ b/packages/gatsby-plugin-sass/src/gatsby-node.js
@@ -8,18 +8,22 @@ exports.onCreateWebpackConfig = (
useResolveUrlLoader,
sassRuleTest,
sassRuleModulesTest,
- ...sassOptions
+ sassOptions = {},
+ ...sassLoaderOptions
}
) => {
const { setWebpackConfig } = actions
const PRODUCTION = stage !== `develop`
const isSSR = stage.includes(`html`)
+ delete sassLoaderOptions.plugins
+
const sassLoader = {
loader: resolve(`sass-loader`),
options: {
sourceMap: useResolveUrlLoader ? true : !PRODUCTION,
- ...sassOptions,
+ sassOptions,
+ ...sassLoaderOptions,
},
}
@@ -29,7 +33,7 @@ exports.onCreateWebpackConfig = (
? [loaders.null()]
: [
loaders.miniCssExtract(),
- loaders.css({ ...cssLoaderOptions, importLoaders: 2 }),
+ loaders.css({ importLoaders: 2, ...cssLoaderOptions }),
loaders.postcss({ plugins: postCssPlugins }),
sassLoader,
],
@@ -38,7 +42,7 @@ exports.onCreateWebpackConfig = (
test: sassRuleModulesTest || /\.module\.s(a|c)ss$/,
use: [
!isSSR && loaders.miniCssExtract({ hmr: false }),
- loaders.css({ ...cssLoaderOptions, modules: true, importLoaders: 2 }),
+ loaders.css({ importLoaders: 2, ...cssLoaderOptions, modules: true }),
loaders.postcss({ plugins: postCssPlugins }),
sassLoader,
].filter(Boolean),
@@ -105,92 +109,99 @@ exports.pluginOptionsSchema = function ({ Joi }) {
.description(`This plugin resolves url() paths relative to the entry SCSS/Sass file not – as might be expected – the location relative to the declaration. Under the hood, it makes use of sass-loader and this is documented in the readme.
Using resolve-url-loader provides a workaround, if you want to use relative url just install the plugin and then add it to your sass plugin options configuration.`),
- file: Joi.string()
- .allow(null)
- .description(`Path to a file for LibSass to compile.`)
- .default(null),
- data: Joi.string()
- .allow(null)
- .description(
- `A string to pass to LibSass to compile. It is recommended that you use includePaths in conjunction with this so that LibSass can find files when using the @import directive.`
- )
- .default(null),
- importer: Joi.function()
- .maxArity(3)
- .description(
- `Handles when LibSass encounters the @import directive. A custom importer allows extension of the LibSass engine in both a synchronous and asynchronous manner. In both cases, the goal is to either return or call done() with an object literal. (https://github.com/sass/node-sass#importer--v200---experimental)`
- ),
- functions: Joi.object()
- .pattern(MATCH_ALL_KEYS, Joi.function().maxArity(2))
- .description(
- `functions is an Object that holds a collection of custom functions that may be invoked by the sass files being compiled.`
- ),
- includePaths: Joi.array()
- .items(Joi.string())
- .default([])
- .description(
- `An array of paths that LibSass can look in to attempt to resolve your @import declarations. When using data, it is recommended that you use this.`
- ),
- indentedSyntax: Joi.boolean()
- .default(false)
- .description(
- `true values enable Sass Indented Syntax for parsing the data string or file.`
- ),
- indentType: Joi.string()
- .default(`space`)
- .description(
- `Used to determine whether to use space or tab character for indentation.`
- ),
- indentWidth: Joi.number()
- .default(2)
- .max(10)
- .description(
- `Used to determine the number of spaces or tabs to be used for indentation.`
- ),
- linefeed: Joi.string()
- .default(`lf`)
- .valid(`cr`, `crlf`, `lf`, `lfcr`)
- .description(
- `Used to determine whether to use cr, crlf, lf or lfcr sequence for line break.`
- ),
- omitSourceMapUrl: Joi.boolean()
- .default(false)
- .description(
- `true values disable the inclusion of source map information in the output file.`
- ),
- outFile: Joi.string()
- .allow(null)
- .default(null)
- .description(
- `Specify the intended location of the output file. Strongly recommended when outputting source maps so that they can properly refer back to their intended files.`
- ),
- outputStyle: Joi.string()
- .valid(`nested`, `expanded`, `compact`, `compressed`)
- .description(`Determines the output format of the final CSS style.`),
- precision: Joi.number()
- .default(5)
- .description(
- `Used to determine how many digits after the decimal will be allowed. For instance, if you had a decimal number of 1.23456789 and a precision of 5, the result will be 1.23457 in the final CSS.`
- ),
- sourceComments: Joi.boolean()
- .default(false)
- .description(
- `true Enables the line number and file where a selector is defined to be emitted into the compiled CSS as a comment. Useful for debugging, especially when using imports and mixins.`
- ),
- sourceMap: Joi.alternatives().try(Joi.boolean(), Joi.string()).description(
- `Enables source map generation during render and renderSync.
+ // TODO: Use alternatives() to also allow function. Currently some bug in our schema validation (test)
+ sassOptions: Joi.object({
+ file: Joi.string()
+ .allow(null)
+ .description(`Path to a file for LibSass to compile.`)
+ .default(null),
+ data: Joi.string()
+ .allow(null)
+ .description(
+ `A string to pass to LibSass to compile. It is recommended that you use includePaths in conjunction with this so that LibSass can find files when using the @import directive.`
+ )
+ .default(null),
+ importer: Joi.function()
+ .maxArity(3)
+ .description(
+ `Handles when LibSass encounters the @import directive. A custom importer allows extension of the LibSass engine in both a synchronous and asynchronous manner. In both cases, the goal is to either return or call done() with an object literal. (https://github.com/sass/node-sass#importer--v200---experimental)`
+ ),
+ functions: Joi.object()
+ .pattern(MATCH_ALL_KEYS, Joi.function().maxArity(2))
+ .description(
+ `functions is an Object that holds a collection of custom functions that may be invoked by the sass files being compiled.`
+ ),
+ includePaths: Joi.array()
+ .items(Joi.string())
+ .default([])
+ .description(
+ `An array of paths that LibSass can look in to attempt to resolve your @import declarations. When using data, it is recommended that you use this.`
+ ),
+ indentedSyntax: Joi.boolean()
+ .default(false)
+ .description(
+ `true values enable Sass Indented Syntax for parsing the data string or file.`
+ ),
+ indentType: Joi.string()
+ .default(`space`)
+ .description(
+ `Used to determine whether to use space or tab character for indentation.`
+ ),
+ indentWidth: Joi.number()
+ .default(2)
+ .max(10)
+ .description(
+ `Used to determine the number of spaces or tabs to be used for indentation.`
+ ),
+ linefeed: Joi.string()
+ .default(`lf`)
+ .valid(`cr`, `crlf`, `lf`, `lfcr`)
+ .description(
+ `Used to determine whether to use cr, crlf, lf or lfcr sequence for line break.`
+ ),
+ omitSourceMapUrl: Joi.boolean()
+ .default(false)
+ .description(
+ `true values disable the inclusion of source map information in the output file.`
+ ),
+ outFile: Joi.string()
+ .allow(null)
+ .default(null)
+ .description(
+ `Specify the intended location of the output file. Strongly recommended when outputting source maps so that they can properly refer back to their intended files.`
+ ),
+ outputStyle: Joi.string()
+ .valid(`nested`, `expanded`, `compact`, `compressed`)
+ .description(`Determines the output format of the final CSS style.`),
+ precision: Joi.number()
+ .default(5)
+ .description(
+ `Used to determine how many digits after the decimal will be allowed. For instance, if you had a decimal number of 1.23456789 and a precision of 5, the result will be 1.23457 in the final CSS.`
+ ),
+ sourceComments: Joi.boolean()
+ .default(false)
+ .description(
+ `true Enables the line number and file where a selector is defined to be emitted into the compiled CSS as a comment. Useful for debugging, especially when using imports and mixins.`
+ ),
+ sourceMap: Joi.alternatives()
+ .try(Joi.boolean(), Joi.string())
+ .description(
+ `Enables source map generation during render and renderSync.
When sourceMap === true, the value of outFile is used as the target output location for the source map with the suffix .map appended. If no outFile is set, sourceMap parameter is ignored.
When typeof sourceMap === "string", the value of sourceMap will be used as the writing location for the file`
- ),
- sourceMapContents: Joi.boolean()
- .default(false)
- .description(`true includes the contents in the source map information`),
- sourceMapEmbed: Joi.boolean()
- .default(false)
- .description(`true embeds the source map as a data URI`),
- sourceMapRoot: Joi.string().description(
- `the value will be emitted as sourceRoot in the source map information`
- ),
+ ),
+ sourceMapContents: Joi.boolean()
+ .default(false)
+ .description(
+ `true includes the contents in the source map information`
+ ),
+ sourceMapEmbed: Joi.boolean()
+ .default(false)
+ .description(`true embeds the source map as a data URI`),
+ sourceMapRoot: Joi.string().description(
+ `the value will be emitted as sourceRoot in the source map information`
+ ),
+ }).unknown(true),
}).unknown(true)
}
From 48fa29b74ec2bcff59d524cff6f46bdc7f677aa4 Mon Sep 17 00:00:00 2001
From: LekoArts
Date: Fri, 18 Dec 2020 13:06:18 +0100
Subject: [PATCH 18/37] chore(release): Publish next
- gatsby-admin@0.6.0-next.7
- gatsby-plugin-image@0.5.0-next.5
- gatsby-plugin-sass@3.0.0-next.2
- gatsby-plugin-sharp@2.12.0-next.5
- gatsby-transformer-sqip@2.9.0-next.5
- gatsby@2.30.0-next.7
---
packages/gatsby-admin/CHANGELOG.md | 4 ++++
packages/gatsby-admin/package.json | 4 ++--
packages/gatsby-plugin-image/CHANGELOG.md | 10 ++++++++++
packages/gatsby-plugin-image/package.json | 2 +-
packages/gatsby-plugin-sass/CHANGELOG.md | 6 ++++++
packages/gatsby-plugin-sass/package.json | 2 +-
packages/gatsby-plugin-sharp/CHANGELOG.md | 4 ++++
packages/gatsby-plugin-sharp/package.json | 4 ++--
packages/gatsby-transformer-sqip/CHANGELOG.md | 4 ++++
packages/gatsby-transformer-sqip/package.json | 4 ++--
packages/gatsby/CHANGELOG.md | 7 +++++++
packages/gatsby/package.json | 2 +-
12 files changed, 44 insertions(+), 9 deletions(-)
diff --git a/packages/gatsby-admin/CHANGELOG.md b/packages/gatsby-admin/CHANGELOG.md
index 855a588f2cc5f..085ddc3d536de 100644
--- a/packages/gatsby-admin/CHANGELOG.md
+++ b/packages/gatsby-admin/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [0.6.0-next.7](https://github.com/gatsbyjs/gatsby/compare/gatsby-admin@0.6.0-next.6...gatsby-admin@0.6.0-next.7) (2020-12-18)
+
+**Note:** Version bump only for package gatsby-admin
+
# [0.6.0-next.6](https://github.com/gatsbyjs/gatsby/compare/gatsby-admin@0.6.0-next.5...gatsby-admin@0.6.0-next.6) (2020-12-17)
**Note:** Version bump only for package gatsby-admin
diff --git a/packages/gatsby-admin/package.json b/packages/gatsby-admin/package.json
index afcfa0096ef88..e0a5fc202261c 100644
--- a/packages/gatsby-admin/package.json
+++ b/packages/gatsby-admin/package.json
@@ -1,6 +1,6 @@
{
"name": "gatsby-admin",
- "version": "0.6.0-next.6",
+ "version": "0.6.0-next.7",
"main": "index.js",
"author": "Max Stoiber",
"license": "MIT",
@@ -20,7 +20,7 @@
"@typescript-eslint/parser": "^2.34.0",
"csstype": "^2.6.13",
"formik": "^2.2.5",
- "gatsby": "^2.30.0-next.6",
+ "gatsby": "^2.30.0-next.7",
"gatsby-interface": "^0.0.225",
"gatsby-plugin-typescript": "^2.10.0-next.0",
"gatsby-plugin-webfonts": "^1.1.3",
diff --git a/packages/gatsby-plugin-image/CHANGELOG.md b/packages/gatsby-plugin-image/CHANGELOG.md
index 110ca9ce9f2c0..0f54b3b33caa4 100644
--- a/packages/gatsby-plugin-image/CHANGELOG.md
+++ b/packages/gatsby-plugin-image/CHANGELOG.md
@@ -3,6 +3,16 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [0.5.0-next.5](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-image@0.5.0-next.4...gatsby-plugin-image@0.5.0-next.5) (2020-12-18)
+
+### Bug Fixes
+
+- **gatsby-plugin-image:** do not return from preprocessSource if nothing is changed ([#28678](https://github.com/gatsbyjs/gatsby/issues/28678)) ([9a49286](https://github.com/gatsbyjs/gatsby/commit/9a492868b4f28179a86204bc393051f0bf96fe9b))
+
+### Features
+
+- **gatsby-plugin-image:** Add remote image support ([#28647](https://github.com/gatsbyjs/gatsby/issues/28647)) ([a91825d](https://github.com/gatsbyjs/gatsby/commit/a91825d0e8896c90aaa69e8929fe1da07cb90751))
+
# [0.5.0-next.4](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-image@0.5.0-next.3...gatsby-plugin-image@0.5.0-next.4) (2020-12-17)
### Bug Fixes
diff --git a/packages/gatsby-plugin-image/package.json b/packages/gatsby-plugin-image/package.json
index a8ec566ea4ba0..6e7baac6a049e 100644
--- a/packages/gatsby-plugin-image/package.json
+++ b/packages/gatsby-plugin-image/package.json
@@ -1,6 +1,6 @@
{
"name": "gatsby-plugin-image",
- "version": "0.5.0-next.4",
+ "version": "0.5.0-next.5",
"scripts": {
"build": "npm-run-all -s clean -p build:*",
"build:gatsby-node": "tsc --jsx react --downlevelIteration true --skipLibCheck true --esModuleInterop true --outDir dist/ src/gatsby-node.ts src/babel-plugin-parse-static-images.ts src/resolver-utils.ts src/types.d.ts",
diff --git a/packages/gatsby-plugin-sass/CHANGELOG.md b/packages/gatsby-plugin-sass/CHANGELOG.md
index a094ebc20796c..d530d82719742 100644
--- a/packages/gatsby-plugin-sass/CHANGELOG.md
+++ b/packages/gatsby-plugin-sass/CHANGELOG.md
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [3.0.0-next.2](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-sass@3.0.0-next.1...gatsby-plugin-sass@3.0.0-next.2) (2020-12-18)
+
+### Bug Fixes
+
+- **gatsby-plugin-sass:** Nest sassOptions ([#28683](https://github.com/gatsbyjs/gatsby/issues/28683)) ([c703eb4](https://github.com/gatsbyjs/gatsby/commit/c703eb4d994e1b7423e811577d0b9024f10a2bb9))
+
# [3.0.0-next.1](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-sass@3.0.0-next.0...gatsby-plugin-sass@3.0.0-next.1) (2020-12-17)
**Note:** Version bump only for package gatsby-plugin-sass
diff --git a/packages/gatsby-plugin-sass/package.json b/packages/gatsby-plugin-sass/package.json
index 304b28731f431..1e21c4c1cd9df 100644
--- a/packages/gatsby-plugin-sass/package.json
+++ b/packages/gatsby-plugin-sass/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby-plugin-sass",
"description": "Gatsby plugin to handle scss/sass files",
- "version": "3.0.0-next.1",
+ "version": "3.0.0-next.2",
"author": "Daniel Farrell ",
"bugs": {
"url": "https://github.com/gatsbyjs/gatsby/issues"
diff --git a/packages/gatsby-plugin-sharp/CHANGELOG.md b/packages/gatsby-plugin-sharp/CHANGELOG.md
index dfe444263a48e..6be31153dcc67 100644
--- a/packages/gatsby-plugin-sharp/CHANGELOG.md
+++ b/packages/gatsby-plugin-sharp/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.12.0-next.5](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-sharp@2.12.0-next.4...gatsby-plugin-sharp@2.12.0-next.5) (2020-12-18)
+
+**Note:** Version bump only for package gatsby-plugin-sharp
+
# [2.12.0-next.4](https://github.com/gatsbyjs/gatsby/compare/gatsby-plugin-sharp@2.12.0-next.3...gatsby-plugin-sharp@2.12.0-next.4) (2020-12-17)
### Bug Fixes
diff --git a/packages/gatsby-plugin-sharp/package.json b/packages/gatsby-plugin-sharp/package.json
index 8542a6e3fd811..a8305d9da927e 100644
--- a/packages/gatsby-plugin-sharp/package.json
+++ b/packages/gatsby-plugin-sharp/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby-plugin-sharp",
"description": "Wrapper of the Sharp image manipulation library for Gatsby plugins",
- "version": "2.12.0-next.4",
+ "version": "2.12.0-next.5",
"author": "Kyle Mathews ",
"bugs": {
"url": "https://github.com/gatsbyjs/gatsby/issues"
@@ -33,7 +33,7 @@
"@types/sharp": "^0.26.1",
"babel-preset-gatsby-package": "^0.10.0-next.0",
"cross-env": "^7.0.3",
- "gatsby-plugin-image": "^0.5.0-next.4"
+ "gatsby-plugin-image": "^0.5.0-next.5"
},
"homepage": "https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-plugin-sharp#readme",
"keywords": [
diff --git a/packages/gatsby-transformer-sqip/CHANGELOG.md b/packages/gatsby-transformer-sqip/CHANGELOG.md
index 36717e63a7c0b..52dab06c60e08 100644
--- a/packages/gatsby-transformer-sqip/CHANGELOG.md
+++ b/packages/gatsby-transformer-sqip/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.9.0-next.5](https://github.com/gatsbyjs/gatsby/compare/gatsby-transformer-sqip@2.9.0-next.4...gatsby-transformer-sqip@2.9.0-next.5) (2020-12-18)
+
+**Note:** Version bump only for package gatsby-transformer-sqip
+
# [2.9.0-next.4](https://github.com/gatsbyjs/gatsby/compare/gatsby-transformer-sqip@2.9.0-next.3...gatsby-transformer-sqip@2.9.0-next.4) (2020-12-17)
**Note:** Version bump only for package gatsby-transformer-sqip
diff --git a/packages/gatsby-transformer-sqip/package.json b/packages/gatsby-transformer-sqip/package.json
index 9a11bad744a31..0b3b7ff32a836 100644
--- a/packages/gatsby-transformer-sqip/package.json
+++ b/packages/gatsby-transformer-sqip/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby-transformer-sqip",
"description": "Generates geometric primitive version of images",
- "version": "2.9.0-next.4",
+ "version": "2.9.0-next.5",
"author": "Benedikt Rötsch ",
"bugs": {
"url": "https://github.com/gatsbyjs/gatsby/issues"
@@ -9,7 +9,7 @@
"dependencies": {
"@babel/runtime": "^7.12.5",
"fs-extra": "^8.1.0",
- "gatsby-plugin-sharp": "^2.12.0-next.4",
+ "gatsby-plugin-sharp": "^2.12.0-next.5",
"md5-file": "^5.0.0",
"mini-svg-data-uri": "^1.2.3",
"p-queue": "^6.6.2",
diff --git a/packages/gatsby/CHANGELOG.md b/packages/gatsby/CHANGELOG.md
index 90faee2a080fd..630e14f855d01 100644
--- a/packages/gatsby/CHANGELOG.md
+++ b/packages/gatsby/CHANGELOG.md
@@ -3,6 +3,13 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+# [2.30.0-next.7](https://github.com/gatsbyjs/gatsby/compare/gatsby@2.30.0-next.6...gatsby@2.30.0-next.7) (2020-12-18)
+
+### Bug Fixes
+
+- **gatsby:** always add both `childField` and `childrenField` in GraphQL ([#28656](https://github.com/gatsbyjs/gatsby/issues/28656)) ([739df13](https://github.com/gatsbyjs/gatsby/commit/739df134adbffddab58d9f85032579169362a348))
+- **gatsby:** remove redundant dispatch of query extraction error ([#28676](https://github.com/gatsbyjs/gatsby/issues/28676)) ([1d7dc76](https://github.com/gatsbyjs/gatsby/commit/1d7dc76a18de379e0004bd62a26d7630e0a060fe))
+
# [2.30.0-next.6](https://github.com/gatsbyjs/gatsby/compare/gatsby@2.30.0-next.5...gatsby@2.30.0-next.6) (2020-12-17)
**Note:** Version bump only for package gatsby
diff --git a/packages/gatsby/package.json b/packages/gatsby/package.json
index 1383a891cfd19..bd729aa6a98e4 100644
--- a/packages/gatsby/package.json
+++ b/packages/gatsby/package.json
@@ -1,7 +1,7 @@
{
"name": "gatsby",
"description": "Blazing fast modern site generator for React",
- "version": "2.30.0-next.6",
+ "version": "2.30.0-next.7",
"author": "Kyle Mathews ",
"bin": {
"gatsby": "./cli.js"
From 0a06a795c434312150f30048567b0e2cd797027e Mon Sep 17 00:00:00 2001
From: LB
Date: Fri, 18 Dec 2020 14:18:35 -0500
Subject: [PATCH 19/37] Silly fix to make page component clearer (#28694)
---
starters/gatsby-starter-minimal/src/pages/404.js | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/starters/gatsby-starter-minimal/src/pages/404.js b/starters/gatsby-starter-minimal/src/pages/404.js
index 4f0342a86489e..053ae0e831ee9 100644
--- a/starters/gatsby-starter-minimal/src/pages/404.js
+++ b/starters/gatsby-starter-minimal/src/pages/404.js
@@ -25,7 +25,7 @@ const codeStyles = {
}
// markup
-const IndexPage = () => {
+const NotFoundPage = () => {
return (
Not found
@@ -35,20 +35,20 @@ const IndexPage = () => {
😔
{" "}
- we couldn’t find what you were looking for.
-
+ we couldn’t find what you were looking for.
+
{process.env.NODE_ENV === "development" ? (
<>
-
- Try creating a page in src/pages/
.
-
+
+ Try creating a page in src/pages/
.
+
>
) : null}
-
+
Go home.
)
}
-export default IndexPage
+export default NotFoundPage
From a77e1d80d5b3a75979760d3be2005742feb09266 Mon Sep 17 00:00:00 2001
From: Michal Piechowiak
Date: Sat, 19 Dec 2020 21:33:11 +0100
Subject: [PATCH 20/37] fix(gatsby): use correct stageLabel instead of
`undefined` (#28701)
* add basic tests for webpack-error-utils
* fix(gatsby): use correct stageLabel instead of undefined
---
.../__snapshots__/webpack-error-utils.ts.snap | 77 +++++++++++++++++++
.../utils/__tests__/webpack-error-utils.ts | 32 ++++++++
.../gatsby/src/utils/webpack-error-utils.ts | 17 ++--
3 files changed, 116 insertions(+), 10 deletions(-)
create mode 100644 packages/gatsby/src/utils/__tests__/__snapshots__/webpack-error-utils.ts.snap
create mode 100644 packages/gatsby/src/utils/__tests__/webpack-error-utils.ts
diff --git a/packages/gatsby/src/utils/__tests__/__snapshots__/webpack-error-utils.ts.snap b/packages/gatsby/src/utils/__tests__/__snapshots__/webpack-error-utils.ts.snap
new file mode 100644
index 0000000000000..5160be0a414b3
--- /dev/null
+++ b/packages/gatsby/src/utils/__tests__/__snapshots__/webpack-error-utils.ts.snap
@@ -0,0 +1,77 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`structureWebpackErrors stage: build-html Can't resolve (98124) 1`] = `
+Object {
+ "context": Object {
+ "packageName": "wat.js",
+ "sourceMessage": "Can't resolve 'wat.js' in 'foo.js'",
+ "stage": "build-html",
+ "stageLabel": "Generating SSR bundle",
+ },
+ "filePath": "foo.js",
+ "id": "98124",
+ "location": Object {
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ },
+ },
+}
+`;
+
+exports[`structureWebpackErrors stage: build-javascript Can't resolve (98124) 1`] = `
+Object {
+ "context": Object {
+ "packageName": "wat.js",
+ "sourceMessage": "Can't resolve 'wat.js' in 'foo.js'",
+ "stage": "build-javascript",
+ "stageLabel": "Generating JavaScript bundles",
+ },
+ "filePath": "foo.js",
+ "id": "98124",
+ "location": Object {
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ },
+ },
+}
+`;
+
+exports[`structureWebpackErrors stage: develop Can't resolve (98124) 1`] = `
+Object {
+ "context": Object {
+ "packageName": "wat.js",
+ "sourceMessage": "Can't resolve 'wat.js' in 'foo.js'",
+ "stage": "develop",
+ "stageLabel": "Generating development JavaScript bundle",
+ },
+ "filePath": "foo.js",
+ "id": "98124",
+ "location": Object {
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ },
+ },
+}
+`;
+
+exports[`structureWebpackErrors stage: develop-html Can't resolve (98124) 1`] = `
+Object {
+ "context": Object {
+ "packageName": "wat.js",
+ "sourceMessage": "Can't resolve 'wat.js' in 'foo.js'",
+ "stage": "develop-html",
+ "stageLabel": "Generating development SSR bundle",
+ },
+ "filePath": "foo.js",
+ "id": "98124",
+ "location": Object {
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ },
+ },
+}
+`;
diff --git a/packages/gatsby/src/utils/__tests__/webpack-error-utils.ts b/packages/gatsby/src/utils/__tests__/webpack-error-utils.ts
new file mode 100644
index 0000000000000..3a0cac905bdad
--- /dev/null
+++ b/packages/gatsby/src/utils/__tests__/webpack-error-utils.ts
@@ -0,0 +1,32 @@
+import { structureWebpackErrors } from "../webpack-error-utils"
+import { Stage } from "../../commands/types"
+
+describe(`structureWebpackErrors`, () => {
+ const stages: Array = [
+ Stage.BuildJavascript,
+ Stage.BuildHTML,
+ Stage.DevelopHTML,
+ Stage.Develop,
+ ]
+
+ describe.each(stages)(`stage: %s`, (stage: Stage) => {
+ it(`Can't resolve (98124)`, () => {
+ const error = new Error(`Can't resolve 'wat.js' in 'foo.js'`) as any
+ error.module = { resource: `foo.js` }
+ error.error = {
+ loc: {
+ line: 5,
+ column: 10,
+ },
+ }
+ let structuredError = structureWebpackErrors(stage, error)
+ if (Array.isArray(structuredError)) {
+ structuredError = structuredError[0]
+ }
+
+ expect(structuredError).toMatchSnapshot()
+ expect(structuredError.context.stageLabel).not.toBeUndefined()
+ expect(structuredError.context.stage).not.toBeUndefined()
+ })
+ })
+})
diff --git a/packages/gatsby/src/utils/webpack-error-utils.ts b/packages/gatsby/src/utils/webpack-error-utils.ts
index 37e731bfc79f5..e350c9442373a 100644
--- a/packages/gatsby/src/utils/webpack-error-utils.ts
+++ b/packages/gatsby/src/utils/webpack-error-utils.ts
@@ -3,15 +3,12 @@ import { Stats } from "webpack"
import { IMatch } from "../types"
import { Stage as StageEnum } from "../commands/types"
-const stageCodeToReadableLabel = {
- BuildJavascript: `Generating JavaScript bundles`,
- BuildHTML: `Generating SSR bundle`,
- DevelopHTML: `Generating development SSR bundle`,
- Develop: `Generating development JavaScript bundle`,
-} as const
-
-type Stage = keyof typeof StageEnum
-type StageLabel = typeof stageCodeToReadableLabel[Stage]
+const stageCodeToReadableLabel: Record = {
+ [StageEnum.BuildJavascript]: `Generating JavaScript bundles`,
+ [StageEnum.BuildHTML]: `Generating SSR bundle`,
+ [StageEnum.DevelopHTML]: `Generating development SSR bundle`,
+ [StageEnum.Develop]: `Generating development JavaScript bundle`,
+}
interface ITransformedWebpackError {
id: string
@@ -21,7 +18,7 @@ interface ITransformedWebpackError {
}
context: {
stage: StageEnum
- stageLabel: StageLabel
+ stageLabel: string
sourceMessage?: string
[key: string]: unknown
}
From 3727947f42b8e12fee9c3771ddbbd9f7c290e3ee Mon Sep 17 00:00:00 2001
From: Michal Piechowiak
Date: Mon, 21 Dec 2020 10:38:00 +0100
Subject: [PATCH 21/37] test(cache-resilience): update snapshots (#28703)
---
.../source-added/scenario.js | 3 +++
.../source-changed/scenario.js | 3 +++
.../source-removed/scenario.js | 3 +++
.../transformer-added/scenario.js | 3 +++
.../transformer-changed/scenario.js | 3 +++
.../transformer-removed/scenario.js | 3 +++
6 files changed, 18 insertions(+)
diff --git a/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/source-added/scenario.js b/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/source-added/scenario.js
index e5fed66111b4f..0da1e43b7d438 100644
--- a/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/source-added/scenario.js
+++ b/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/source-added/scenario.js
@@ -141,6 +141,9 @@ const queriesTest = ({ typesFirstRun, typesSecondRun, dataSecondRun }) => {
Object {
"name": "foo",
},
+ Object {
+ "name": "childrenChildOfParentParentAdditionForTransformer",
+ },
Object {
"name": "childChildOfParentParentAdditionForTransformer",
},
diff --git a/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/source-changed/scenario.js b/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/source-changed/scenario.js
index 2dc813ffd9b61..add098795afa5 100644
--- a/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/source-changed/scenario.js
+++ b/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/source-changed/scenario.js
@@ -190,6 +190,9 @@ const queriesTest = ({ typesDiff, dataDiff }) => {
- \\"name\\": \\"foo\\",
+ \\"name\\": \\"bar\\",
},
+ Object {
+ \\"name\\": \\"childrenChildOfParentParentChangeForTransformer\\",
+ },
Object {
\\"name\\": \\"childChildOfParentParentChangeForTransformer\\",
},
diff --git a/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/source-removed/scenario.js b/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/source-removed/scenario.js
index 1816aff5c88a3..3a825f1dd256d 100644
--- a/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/source-removed/scenario.js
+++ b/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/source-removed/scenario.js
@@ -141,6 +141,9 @@ const queriesTest = ({ typesFirstRun, typesSecondRun, dataFirstRun }) => {
Object {
"name": "foo",
},
+ Object {
+ "name": "childrenChildOfParentParentDeletionForTransformer",
+ },
Object {
"name": "childChildOfParentParentDeletionForTransformer",
},
diff --git a/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/transformer-added/scenario.js b/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/transformer-added/scenario.js
index 20c9b0574ab43..0125d8fdb7255 100644
--- a/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/transformer-added/scenario.js
+++ b/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/transformer-added/scenario.js
@@ -151,6 +151,9 @@ const queriesTest = ({ typesDiff, dataDiff }) => {
\\"name\\": \\"foo\\",
+ },
+ Object {
+ + \\"name\\": \\"childrenChildOfParentChildAdditionForTransformer\\",
+ + },
+ + Object {
+ \\"name\\": \\"childChildOfParentChildAdditionForTransformer\\",
},
],
diff --git a/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/transformer-changed/scenario.js b/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/transformer-changed/scenario.js
index 9202cfcc7dc2f..8b38a3f47d567 100644
--- a/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/transformer-changed/scenario.js
+++ b/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/transformer-changed/scenario.js
@@ -176,6 +176,9 @@ const queriesTest = ({ typesDiff, dataDiff }) => {
Object {
\\"name\\": \\"foo\\",
},
+ Object {
+ \\"name\\": \\"childrenChildOfParentChildChangeForTransformer\\",
+ },
Object {
\\"name\\": \\"childChildOfParentChildChangeForTransformer\\",
},
diff --git a/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/transformer-removed/scenario.js b/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/transformer-removed/scenario.js
index 1c050fa032e58..8402c3efb06a6 100644
--- a/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/transformer-removed/scenario.js
+++ b/integration-tests/cache-resilience/plugins/source-and-transformers-child-nodes/transformer-removed/scenario.js
@@ -181,6 +181,9 @@ const queriesTest = ({ typesDiff, dataDiff }) => {
\\"name\\": \\"foo\\",
- },
- Object {
+ - \\"name\\": \\"childrenChildOfParentChildDeletionForTransformer\\",
+ - },
+ - Object {
- \\"name\\": \\"childChildOfParentChildDeletionForTransformer\\",
},
],
From 76a3b57455704f72778b41e01f00ed1b61cc6622 Mon Sep 17 00:00:00 2001
From: Michal Piechowiak
Date: Mon, 21 Dec 2020 15:55:36 +0100
Subject: [PATCH 22/37] chore(dev-ssr): don't dispatch
CREATE_SERVER_VISITED_PAGE if component is already tracked (#28725)
---
packages/gatsby/src/redux/actions/public.js | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/packages/gatsby/src/redux/actions/public.js b/packages/gatsby/src/redux/actions/public.js
index 7588f10ddd0e5..7c06b9a483696 100644
--- a/packages/gatsby/src/redux/actions/public.js
+++ b/packages/gatsby/src/redux/actions/public.js
@@ -1398,6 +1398,12 @@ actions.removePageData = (id: PageDataRemove) => {
* @param {string} $0.id the chunkName for the page component.
*/
actions.createServerVisitedPage = (chunkName: string) => {
+ if (store.getState().visitedPages.get(`server`)?.has(chunkName)) {
+ // we already have given chunk tracked, let's not emit `CREATE_SERVER_VISITED_PAGE`
+ // action to not cause any additional work
+ return []
+ }
+
return {
type: `CREATE_SERVER_VISITED_PAGE`,
payload: { componentChunkName: chunkName },
From 8ff6245f44882d891bc6f291363019047cbdb55f Mon Sep 17 00:00:00 2001
From: Kyle Mathews
Date: Mon, 21 Dec 2020 12:01:01 -0800
Subject: [PATCH 23/37] feature(gatsby): Pause dev-ssr watching between page
loads to avoid slowing down regular develop-js HMR (#28394)
* feature(gatsby): Pause dev-ssr watching between page loads to avoid slowing down regular develop-js HMR
* update snapshot
* Don't double-resolve + add activity for building the SSR bundle
* Add timeout for tests to ensure that dev server has time to bundle SSR + remove activity timers as not helpful
* Update packages/gatsby/src/commands/build-html.ts
Co-authored-by: Michal Piechowiak
* fix typo
* Don't resume if nothing has changed
* Update packages/gatsby/src/commands/build-html.ts
Co-authored-by: Michal Piechowiak
* Didn't need this
Co-authored-by: Michal Piechowiak
---
integration-tests/ssr/__tests__/ssr.js | 4 +-
integration-tests/ssr/test-output.js | 9 +++++
packages/gatsby/src/commands/build-html.ts | 35 +++++++++++++++++-
.../src/utils/dev-ssr/render-dev-html.ts | 37 +++++++++++++++++++
4 files changed, 83 insertions(+), 2 deletions(-)
diff --git a/integration-tests/ssr/__tests__/ssr.js b/integration-tests/ssr/__tests__/ssr.js
index 248426f972cec..c09a8923a5bcf 100644
--- a/integration-tests/ssr/__tests__/ssr.js
+++ b/integration-tests/ssr/__tests__/ssr.js
@@ -9,11 +9,13 @@ describe(`SSR`, () => {
expect(html).toMatchSnapshot()
})
+
test(`dev & build outputs match`, async () => {
const childProcess = await execa(`yarn`, [`test-output`])
expect(childProcess.code).toEqual(0)
- })
+ }, 15000)
+
test(`it generates an error page correctly`, async () => {
const src = path.join(__dirname, `/fixtures/bad-page.js`)
const dest = path.join(__dirname, `../src/pages/bad-page.js`)
diff --git a/integration-tests/ssr/test-output.js b/integration-tests/ssr/test-output.js
index 884cae205fd68..d785a42f32c7e 100644
--- a/integration-tests/ssr/test-output.js
+++ b/integration-tests/ssr/test-output.js
@@ -42,6 +42,15 @@
)
)
+ // Fetch once to trigger re-compilation.
+ await fetch(`${devSiteBasePath}/${path}`)
+
+ // Then wait for 6 seconds to ensure it's ready to go.
+ // Otherwise, tests are flaky depending on the speed of the testing machine.
+ await new Promise(resolve => {
+ setTimeout(() => resolve(), 6000)
+ })
+
let devStatus = 200
const rawDevHtml = await fetch(`${devSiteBasePath}/${path}`).then(res => {
devStatus = res.status
diff --git a/packages/gatsby/src/commands/build-html.ts b/packages/gatsby/src/commands/build-html.ts
index 972cfe88c42ee..b89ab4a4f62d6 100644
--- a/packages/gatsby/src/commands/build-html.ts
+++ b/packages/gatsby/src/commands/build-html.ts
@@ -6,6 +6,7 @@ import telemetry from "gatsby-telemetry"
import { chunk } from "lodash"
import webpack from "webpack"
+import { emitter } from "../redux"
import webpackConfig from "../utils/webpack.config"
import { structureWebpackErrors } from "../utils/webpack-error-utils"
@@ -14,6 +15,30 @@ import { IProgram, Stage } from "./types"
type IActivity = any // TODO
type IWorkerPool = any // TODO
+export interface IWebpackWatchingPauseResume extends webpack.Watching {
+ suspend: () => void
+ resume: () => void
+}
+
+let devssrWebpackCompiler: webpack.Compiler
+let devssrWebpackWatcher: IWebpackWatchingPauseResume
+let needToRecompileSSRBundle = true
+export const getDevSSRWebpack = (): Record<
+ IWebpackWatchingPauseResume,
+ webpack.Compiler,
+ needToRecompileSSRBundle
+> => {
+ if (process.env.gatsby_executing_command !== `develop`) {
+ throw new Error(`This function can only be called in development`)
+ }
+
+ return {
+ devssrWebpackWatcher,
+ devssrWebpackCompiler,
+ needToRecompileSSRBundle,
+ }
+}
+
let oldHash = ``
let newHash = ``
const runWebpack = (
@@ -34,11 +59,19 @@ const runWebpack = (
process.env.GATSBY_EXPERIMENTAL_DEV_SSR &&
stage === `develop-html`
) {
- webpack(compilerConfig).watch(
+ devssrWebpackCompiler = webpack(compilerConfig)
+ devssrWebpackCompiler.hooks.invalid.tap(`ssr file invalidation`, file => {
+ needToRecompileSSRBundle = true
+ })
+ devssrWebpackWatcher = devssrWebpackCompiler.watch(
{
ignored: /node_modules/,
},
(err, stats) => {
+ needToRecompileSSRBundle = false
+ emitter.emit(`DEV_SSR_COMPILATION_DONE`)
+ devssrWebpackWatcher.suspend()
+
if (err) {
return reject(err)
} else {
diff --git a/packages/gatsby/src/utils/dev-ssr/render-dev-html.ts b/packages/gatsby/src/utils/dev-ssr/render-dev-html.ts
index 7424625285164..d549a530b5e10 100644
--- a/packages/gatsby/src/utils/dev-ssr/render-dev-html.ts
+++ b/packages/gatsby/src/utils/dev-ssr/render-dev-html.ts
@@ -6,6 +6,8 @@ import report from "gatsby-cli/lib/reporter"
import { startListener } from "../../bootstrap/requires-writer"
import { findPageByPath } from "../find-page-by-path"
import { getPageData as getPageDataExperimental } from "../get-page-data"
+import { getDevSSRWebpack } from "../../commands/build-html"
+import { emitter } from "../../redux"
const startWorker = (): any => {
const newWorker = new JestWorker(require.resolve(`./render-dev-html-child`), {
@@ -144,6 +146,41 @@ export const renderDevHTML = ({
return reject(`404 page`)
}
+ // Resume the webpack watcher and wait for any compilation necessary to happen.
+ // We timeout after 1.5s as the user might not care per se about SSR.
+ //
+ // We pause and resume so there's no excess webpack activity during normal development.
+ const {
+ devssrWebpackCompiler,
+ devssrWebpackWatcher,
+ needToRecompileSSRBundle,
+ } = getDevSSRWebpack()
+ if (
+ devssrWebpackWatcher &&
+ devssrWebpackCompiler &&
+ needToRecompileSSRBundle
+ ) {
+ let isResolved = false
+ await new Promise(resolve => {
+ function finish(stats: Stats): void {
+ emitter.off(`DEV_SSR_COMPILATION_DONE`, finish)
+ if (!isResolved) {
+ resolve(stats)
+ }
+ }
+ emitter.on(`DEV_SSR_COMPILATION_DONE`, finish)
+ devssrWebpackWatcher.resume()
+ // Suspending is just a flag, so it's safe to re-suspend right away
+ devssrWebpackWatcher.suspend()
+
+ // Timeout after 1.5s.
+ setTimeout(() => {
+ isResolved = true
+ resolve()
+ }, 1500)
+ })
+ }
+
// Wait for public/render-page.js to update w/ the page component.
const found = await ensurePathComponentInSSRBundle(pageObj, directory)
From 6af620c146d380da7e3748bf52ae527c0c167e36 Mon Sep 17 00:00:00 2001
From: Matt Kane
Date: Tue, 22 Dec 2020 09:03:45 +0000
Subject: [PATCH 24/37] fix(gatsby-plugin-image): Preload lazy-hydrator
(#28690)
---
packages/gatsby-plugin-image/gatsby-browser.js | 11 +++++++++++
.../src/components/later-hydrator.tsx | 10 ++++++++++
packages/gatsby-plugin-image/src/index.browser.ts | 1 +
3 files changed, 22 insertions(+)
create mode 100644 packages/gatsby-plugin-image/gatsby-browser.js
create mode 100644 packages/gatsby-plugin-image/src/components/later-hydrator.tsx
diff --git a/packages/gatsby-plugin-image/gatsby-browser.js b/packages/gatsby-plugin-image/gatsby-browser.js
new file mode 100644
index 0000000000000..128583a12d676
--- /dev/null
+++ b/packages/gatsby-plugin-image/gatsby-browser.js
@@ -0,0 +1,11 @@
+const React = require("react")
+
+const { LaterHydrator } = require(".")
+
+exports.wrapRootElement = ({ element }) => {
+ return (
+
+ {element}
+
+ )
+}
\ No newline at end of file
diff --git a/packages/gatsby-plugin-image/src/components/later-hydrator.tsx b/packages/gatsby-plugin-image/src/components/later-hydrator.tsx
new file mode 100644
index 0000000000000..cc1c136cabcfa
--- /dev/null
+++ b/packages/gatsby-plugin-image/src/components/later-hydrator.tsx
@@ -0,0 +1,10 @@
+import * as React from "react"
+export function LaterHydrator({
+ children,
+}: React.PropsWithChildren<{}>): React.ReactNode {
+ React.useEffect(() => {
+ import(`./lazy-hydrate`)
+ }, [])
+
+ return children
+}
diff --git a/packages/gatsby-plugin-image/src/index.browser.ts b/packages/gatsby-plugin-image/src/index.browser.ts
index 62267d37606c9..a64d5b9968e8a 100644
--- a/packages/gatsby-plugin-image/src/index.browser.ts
+++ b/packages/gatsby-plugin-image/src/index.browser.ts
@@ -6,6 +6,7 @@ export {
export { Placeholder } from "./components/placeholder"
export { MainImage } from "./components/main-image"
export { StaticImage } from "./components/static-image"
+export { LaterHydrator } from "./components/later-hydrator"
export { getImage, getSrc, useGatsbyImage } from "./components/hooks"
export {
generateImageData,
From 3a51e2256eb548d21fe47ee0a078ee6fa027e845 Mon Sep 17 00:00:00 2001
From: Peter van der Zee <209817+pvdz@users.noreply.github.com>
Date: Tue, 22 Dec 2020 11:44:53 +0100
Subject: [PATCH 25/37] perf(gatsby-source-contentful): dont re-create nodes
(#28642)
* perf(contentful): prevent creating main nodes if they already exist
* No comment
* Prevent text/json nodes if they already exist
* Just use `id`
* Fix tests
* Add warm build tests
---
.../__tests__/__snapshots__/normalize.js.snap | 5659 +++++++++++++++++
.../src/__tests__/normalize.js | 175 +
.../src/gatsby-node.js | 1 +
.../gatsby-source-contentful/src/normalize.js | 508 +-
4 files changed, 6120 insertions(+), 223 deletions(-)
diff --git a/packages/gatsby-source-contentful/src/__tests__/__snapshots__/normalize.js.snap b/packages/gatsby-source-contentful/src/__tests__/__snapshots__/normalize.js.snap
index bcf5c3ba12b55..919d1add0b746 100644
--- a/packages/gatsby-source-contentful/src/__tests__/__snapshots__/normalize.js.snap
+++ b/packages/gatsby-source-contentful/src/__tests__/__snapshots__/normalize.js.snap
@@ -10133,3 +10133,5662 @@ Unsere Lemnos Produkte werden sorgfältig von unseren Handwerkern fein geschliff
],
]
`;
+
+exports[`Process existing mutated nodes in warm build creates nodes for each asset 1`] = `
+Array [
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c3wtvPBbBjiMKqKKga8I2Cu",
+ "createdAt": "2017-06-27T09:35:37.178Z",
+ "description": "Brand logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 353,
+ "width": 353,
+ },
+ "size": 12302,
+ },
+ "fileName": "zJYzDlGk.jpeg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/3wtvPBbBjiMKqKKga8I2Cu/c65cb9cce1107c2e7e63c17072fe7932/zJYzDlGk.jpeg",
+ },
+ "id": "rocybtov1ozk___c3wtvPBbBjiMKqKKga8I2Cu___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.178Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Normann Copenhagen",
+ "updatedAt": "2017-06-27T09:35:37.178Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c3wtvPBbBjiMKqKKga8I2Cu",
+ "createdAt": "2017-06-27T09:35:37.178Z",
+ "description": "Brand logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 353,
+ "width": 353,
+ },
+ "size": 12302,
+ },
+ "fileName": "zJYzDlGk.jpeg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/3wtvPBbBjiMKqKKga8I2Cu/c65cb9cce1107c2e7e63c17072fe7932/zJYzDlGk.jpeg",
+ },
+ "id": "rocybtov1ozk___c3wtvPBbBjiMKqKKga8I2Cu___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.178Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Normann Copenhagen",
+ "updatedAt": "2017-06-27T09:35:37.178Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "KTRF62Q4gg60q6WCsWKw8",
+ "createdAt": "2017-06-27T09:35:37.064Z",
+ "description": "by Lemnos",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 1000,
+ "width": 1000,
+ },
+ "size": 66927,
+ },
+ "fileName": "soso.clock.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/KTRF62Q4gg60q6WCsWKw8/a8b2e93ac83fbbbb7bf9fba9f92b018e/soso.clock.jpg",
+ },
+ "id": "rocybtov1ozk___KTRF62Q4gg60q6WCsWKw8___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.064Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "SoSo Wall Clock",
+ "updatedAt": "2017-06-27T09:35:37.064Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "KTRF62Q4gg60q6WCsWKw8",
+ "createdAt": "2017-06-27T09:35:37.064Z",
+ "description": "by Lemnos",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 1000,
+ "width": 1000,
+ },
+ "size": 66927,
+ },
+ "fileName": "soso.clock.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/KTRF62Q4gg60q6WCsWKw8/a8b2e93ac83fbbbb7bf9fba9f92b018e/soso.clock.jpg",
+ },
+ "id": "rocybtov1ozk___KTRF62Q4gg60q6WCsWKw8___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.064Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "SoSo Wall Clock",
+ "updatedAt": "2017-06-27T09:35:37.064Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "Xc0ny7GWsMEMCeASWO2um",
+ "createdAt": "2017-06-27T09:35:37.027Z",
+ "description": "Merchandise image",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 600,
+ "width": 600,
+ },
+ "size": 48751,
+ },
+ "fileName": "jqvtazcyfwseah9fmysz.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/Xc0ny7GWsMEMCeASWO2um/af8e29320c04af689798afe96e2345c7/jqvtazcyfwseah9fmysz.jpg",
+ },
+ "id": "rocybtov1ozk___Xc0ny7GWsMEMCeASWO2um___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.027Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Hudson Wall Cup ",
+ "updatedAt": "2017-06-27T09:35:37.027Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "Xc0ny7GWsMEMCeASWO2um",
+ "createdAt": "2017-06-27T09:35:37.027Z",
+ "description": "Merchandise image",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 600,
+ "width": 600,
+ },
+ "size": 48751,
+ },
+ "fileName": "jqvtazcyfwseah9fmysz.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/Xc0ny7GWsMEMCeASWO2um/af8e29320c04af689798afe96e2345c7/jqvtazcyfwseah9fmysz.jpg",
+ },
+ "id": "rocybtov1ozk___Xc0ny7GWsMEMCeASWO2um___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.027Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Hudson Wall Cup ",
+ "updatedAt": "2017-06-27T09:35:37.027Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c2Y8LhXLnYAYqKCGEWG4EKI",
+ "createdAt": "2017-06-27T09:35:37.012Z",
+ "description": "company logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 32,
+ "width": 175,
+ },
+ "size": 7149,
+ },
+ "fileName": "lemnos-logo.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/2Y8LhXLnYAYqKCGEWG4EKI/eb29ab3c817906993f65e221523ef252/lemnos-logo.jpg",
+ },
+ "id": "rocybtov1ozk___c2Y8LhXLnYAYqKCGEWG4EKI___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.012Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Lemnos",
+ "updatedAt": "2017-06-27T09:35:37.012Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c2Y8LhXLnYAYqKCGEWG4EKI",
+ "createdAt": "2017-06-27T09:35:37.012Z",
+ "description": "company logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 32,
+ "width": 175,
+ },
+ "size": 7149,
+ },
+ "fileName": "lemnos-logo.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/2Y8LhXLnYAYqKCGEWG4EKI/eb29ab3c817906993f65e221523ef252/lemnos-logo.jpg",
+ },
+ "id": "rocybtov1ozk___c2Y8LhXLnYAYqKCGEWG4EKI___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.012Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Lemnos",
+ "updatedAt": "2017-06-27T09:35:37.012Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c6t4HKjytPi0mYgs240wkG",
+ "createdAt": "2017-06-27T09:35:36.633Z",
+ "description": "Category icon set",
+ "file": Object {
+ "contentType": "image/png",
+ "details": Object {
+ "image": Object {
+ "height": 128,
+ "width": 128,
+ },
+ "size": 6744,
+ },
+ "fileName": "toys_512pxGREY.png",
+ "url": "//images.ctfassets.net/rocybtov1ozk/6t4HKjytPi0mYgs240wkG/6e730b1e6c2a46929239019240c037e6/toys_512pxGREY.png",
+ },
+ "id": "rocybtov1ozk___c6t4HKjytPi0mYgs240wkG___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.633Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Toys",
+ "updatedAt": "2017-06-27T09:35:36.633Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c6t4HKjytPi0mYgs240wkG",
+ "createdAt": "2017-06-27T09:35:36.633Z",
+ "description": "Category icon set",
+ "file": Object {
+ "contentType": "image/png",
+ "details": Object {
+ "image": Object {
+ "height": 128,
+ "width": 128,
+ },
+ "size": 6744,
+ },
+ "fileName": "toys_512pxGREY.png",
+ "url": "//images.ctfassets.net/rocybtov1ozk/6t4HKjytPi0mYgs240wkG/6e730b1e6c2a46929239019240c037e6/toys_512pxGREY.png",
+ },
+ "id": "rocybtov1ozk___c6t4HKjytPi0mYgs240wkG___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.633Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Toys",
+ "updatedAt": "2017-06-27T09:35:36.633Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c1MgbdJNTsMWKI0W68oYqkU",
+ "createdAt": "2017-06-27T09:35:36.182Z",
+ "description": "Brand logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 500,
+ "width": 500,
+ },
+ "size": 44089,
+ },
+ "fileName": "9ef190c59f0d375c0dea58b58a4bc1f0.jpeg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/1MgbdJNTsMWKI0W68oYqkU/ad0200fe320b85ecdd823c711161c2f6/9ef190c59f0d375c0dea58b58a4bc1f0.jpeg",
+ },
+ "id": "rocybtov1ozk___c1MgbdJNTsMWKI0W68oYqkU___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.182Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Chive logo",
+ "updatedAt": "2017-06-27T09:35:36.182Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c1MgbdJNTsMWKI0W68oYqkU",
+ "createdAt": "2017-06-27T09:35:36.182Z",
+ "description": "Brand logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 500,
+ "width": 500,
+ },
+ "size": 44089,
+ },
+ "fileName": "9ef190c59f0d375c0dea58b58a4bc1f0.jpeg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/1MgbdJNTsMWKI0W68oYqkU/ad0200fe320b85ecdd823c711161c2f6/9ef190c59f0d375c0dea58b58a4bc1f0.jpeg",
+ },
+ "id": "rocybtov1ozk___c1MgbdJNTsMWKI0W68oYqkU___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.182Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Chive logo",
+ "updatedAt": "2017-06-27T09:35:36.182Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c6m5AJ9vMPKc8OUoQeoCS4o",
+ "createdAt": "2017-06-27T09:35:36.172Z",
+ "description": "category icon",
+ "file": Object {
+ "contentType": "image/png",
+ "details": Object {
+ "image": Object {
+ "height": 256,
+ "width": 256,
+ },
+ "size": 2977,
+ },
+ "fileName": "1418244847_Streamline-18-256.png",
+ "url": "//images.ctfassets.net/rocybtov1ozk/6m5AJ9vMPKc8OUoQeoCS4o/e782e3b291ff2b0287546a563af4683c/1418244847_Streamline-18-256.png",
+ },
+ "id": "rocybtov1ozk___c6m5AJ9vMPKc8OUoQeoCS4o___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.172Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Home and Kitchen",
+ "updatedAt": "2017-06-27T09:35:36.172Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c6m5AJ9vMPKc8OUoQeoCS4o",
+ "createdAt": "2017-06-27T09:35:36.172Z",
+ "description": "category icon",
+ "file": Object {
+ "contentType": "image/png",
+ "details": Object {
+ "image": Object {
+ "height": 256,
+ "width": 256,
+ },
+ "size": 2977,
+ },
+ "fileName": "1418244847_Streamline-18-256.png",
+ "url": "//images.ctfassets.net/rocybtov1ozk/6m5AJ9vMPKc8OUoQeoCS4o/e782e3b291ff2b0287546a563af4683c/1418244847_Streamline-18-256.png",
+ },
+ "id": "rocybtov1ozk___c6m5AJ9vMPKc8OUoQeoCS4o___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.172Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Home and Kitchen",
+ "updatedAt": "2017-06-27T09:35:36.172Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c4zj1ZOfHgQ8oqgaSKm4Qo2",
+ "createdAt": "2017-06-27T09:35:36.168Z",
+ "description": "Brand logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 100,
+ "width": 100,
+ },
+ "size": 7003,
+ },
+ "fileName": "playsam.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/4zj1ZOfHgQ8oqgaSKm4Qo2/5d967c9c48d67eabff71a9a0232d4378/playsam.jpg",
+ },
+ "id": "rocybtov1ozk___c4zj1ZOfHgQ8oqgaSKm4Qo2___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.168Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Playsam",
+ "updatedAt": "2017-06-27T09:35:36.168Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c4zj1ZOfHgQ8oqgaSKm4Qo2",
+ "createdAt": "2017-06-27T09:35:36.168Z",
+ "description": "Brand logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 100,
+ "width": 100,
+ },
+ "size": 7003,
+ },
+ "fileName": "playsam.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/4zj1ZOfHgQ8oqgaSKm4Qo2/5d967c9c48d67eabff71a9a0232d4378/playsam.jpg",
+ },
+ "id": "rocybtov1ozk___c4zj1ZOfHgQ8oqgaSKm4Qo2___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.168Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Playsam",
+ "updatedAt": "2017-06-27T09:35:36.168Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "wtrHxeu3zEoEce2MokCSi",
+ "createdAt": "2017-06-27T09:35:36.037Z",
+ "description": "Merchandise photo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 446,
+ "width": 600,
+ },
+ "size": 27187,
+ },
+ "fileName": "quwowooybuqbl6ntboz3.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/wtrHxeu3zEoEce2MokCSi/73dce36715f16e27cf5ff0d2d97d7dff/quwowooybuqbl6ntboz3.jpg",
+ },
+ "id": "rocybtov1ozk___wtrHxeu3zEoEce2MokCSi___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.037Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Playsam Streamliner",
+ "updatedAt": "2017-06-27T09:35:36.037Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "wtrHxeu3zEoEce2MokCSi",
+ "createdAt": "2017-06-27T09:35:36.037Z",
+ "description": "Merchandise photo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 446,
+ "width": 600,
+ },
+ "size": 27187,
+ },
+ "fileName": "quwowooybuqbl6ntboz3.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/wtrHxeu3zEoEce2MokCSi/73dce36715f16e27cf5ff0d2d97d7dff/quwowooybuqbl6ntboz3.jpg",
+ },
+ "id": "rocybtov1ozk___wtrHxeu3zEoEce2MokCSi___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.037Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Playsam Streamliner",
+ "updatedAt": "2017-06-27T09:35:36.037Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c10TkaLheGeQG6qQGqWYqUI",
+ "createdAt": "2017-06-27T09:35:36.032Z",
+ "description": "Merchandise photo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 600,
+ "width": 450,
+ },
+ "size": 28435,
+ },
+ "fileName": "ryugj83mqwa1asojwtwb.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/10TkaLheGeQG6qQGqWYqUI/f997e8e13c8c83c145e976d0905e64b7/ryugj83mqwa1asojwtwb.jpg",
+ },
+ "id": "rocybtov1ozk___c10TkaLheGeQG6qQGqWYqUI___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.032Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Whisk beaters",
+ "updatedAt": "2017-06-27T09:35:36.032Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c10TkaLheGeQG6qQGqWYqUI",
+ "createdAt": "2017-06-27T09:35:36.032Z",
+ "description": "Merchandise photo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 600,
+ "width": 450,
+ },
+ "size": 28435,
+ },
+ "fileName": "ryugj83mqwa1asojwtwb.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/10TkaLheGeQG6qQGqWYqUI/f997e8e13c8c83c145e976d0905e64b7/ryugj83mqwa1asojwtwb.jpg",
+ },
+ "id": "rocybtov1ozk___c10TkaLheGeQG6qQGqWYqUI___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.032Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Whisk beaters",
+ "updatedAt": "2017-06-27T09:35:36.032Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c6s3iG2OVmoUcosmA8ocqsG",
+ "createdAt": "2017-06-27T09:35:35.994Z",
+ "description": "Category icon set",
+ "file": Object {
+ "contentType": "image/png",
+ "details": Object {
+ "image": Object {
+ "height": 250,
+ "width": 250,
+ },
+ "size": 4244,
+ },
+ "fileName": "1418244847_Streamline-18-256 (1).png",
+ "url": "//images.ctfassets.net/rocybtov1ozk/6s3iG2OVmoUcosmA8ocqsG/286ac4c1be74e05d2e7e11bc5a55bc83/1418244847_Streamline-18-256__1_.png",
+ },
+ "id": "rocybtov1ozk___c6s3iG2OVmoUcosmA8ocqsG___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:35.994Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "House icon",
+ "updatedAt": "2017-06-27T09:35:35.994Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c6s3iG2OVmoUcosmA8ocqsG",
+ "createdAt": "2017-06-27T09:35:35.994Z",
+ "description": "Category icon set",
+ "file": Object {
+ "contentType": "image/png",
+ "details": Object {
+ "image": Object {
+ "height": 250,
+ "width": 250,
+ },
+ "size": 4244,
+ },
+ "fileName": "1418244847_Streamline-18-256 (1).png",
+ "url": "//images.ctfassets.net/rocybtov1ozk/6s3iG2OVmoUcosmA8ocqsG/286ac4c1be74e05d2e7e11bc5a55bc83/1418244847_Streamline-18-256__1_.png",
+ },
+ "id": "rocybtov1ozk___c6s3iG2OVmoUcosmA8ocqsG___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:35.994Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "House icon",
+ "updatedAt": "2017-06-27T09:35:35.994Z",
+ },
+ ],
+]
+`;
+
+exports[`Process existing mutated nodes in warm build creates nodes for each entry 1`] = `
+Array [
+ Array [
+ Object {
+ "children": Array [],
+ "description": null,
+ "displayField": "title",
+ "id": "Category",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:40:52.685Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Category",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription___NODE": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___EntrycategoryDescriptionTextNode",
+ "children": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___EntrytitleTextNode",
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___EntrycategoryDescriptionTextNode",
+ ],
+ "contentful_id": "c7LAnCobuuWYSqks6wAwY2a",
+ "createdAt": "2017-06-27T09:35:44.000Z",
+ "icon___NODE": "rocybtov1ozk___c6m5AJ9vMPKc8OUoQeoCS4o___Asset",
+ "id": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry",
+ "internal": Object {
+ "contentDigest": "2020-06-30T11:22:54.201Z",
+ "type": "ContentfulCategory",
+ },
+ "node_locale": "en-US",
+ "parent": "Category",
+ "product___NODE": Array [
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry",
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry",
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "6XwpTaSiiI2Ak2Ww0oi6qa",
+ "id": "c6XwpTaSiiI2Ak2Ww0oi6qa",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 4,
+ "type": "Entry",
+ },
+ "title___NODE": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___EntrytitleTextNode",
+ "updatedAt": "2020-06-30T11:22:54.201Z",
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription___NODE": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___EntrycategoryDescriptionTextNode",
+ "children": Array [
+ "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___EntrytitleTextNode",
+ "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___EntrycategoryDescriptionTextNode",
+ ],
+ "contentful_id": "c24DPGBDeGEaYy8ms4Y8QMQ",
+ "createdAt": "2017-06-27T09:35:44.992Z",
+ "icon___NODE": "rocybtov1ozk___c6t4HKjytPi0mYgs240wkG___Asset",
+ "id": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:46:43.477Z",
+ "type": "ContentfulCategory",
+ },
+ "node_locale": "en-US",
+ "parent": "Category",
+ "product___NODE": Array [
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "6XwpTaSiiI2Ak2Ww0oi6qa",
+ "id": "c6XwpTaSiiI2Ak2Ww0oi6qa",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "title___NODE": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___EntrytitleTextNode",
+ "updatedAt": "2017-06-27T09:46:43.477Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___EntrytitleTextNode",
+ "internal": Object {
+ "content": "Home & Kitchen",
+ "contentDigest": "2020-06-30T11:22:54.201Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryTitleTextNode",
+ },
+ "parent": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ "title": "Home & Kitchen",
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription": "Shop for furniture, bedding, bath, vacuums, kitchen products, and more",
+ "children": Array [],
+ "id": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___EntrycategoryDescriptionTextNode",
+ "internal": Object {
+ "content": "Shop for furniture, bedding, bath, vacuums, kitchen products, and more",
+ "contentDigest": "2020-06-30T11:22:54.201Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryCategoryDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___EntrytitleTextNode",
+ "internal": Object {
+ "content": "Toys",
+ "contentDigest": "2017-06-27T09:46:43.477Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryTitleTextNode",
+ },
+ "parent": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ "title": "Toys",
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription": "Shop for toys, games, educational aids",
+ "children": Array [],
+ "id": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___EntrycategoryDescriptionTextNode",
+ "internal": Object {
+ "content": "Shop for toys, games, educational aids",
+ "contentDigest": "2017-06-27T09:46:43.477Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryCategoryDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": null,
+ "displayField": "title",
+ "id": "Category",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:40:52.685Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Category",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription___NODE": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___decategoryDescriptionTextNode",
+ "children": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___detitleTextNode",
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___decategoryDescriptionTextNode",
+ ],
+ "contentful_id": "c7LAnCobuuWYSqks6wAwY2a",
+ "createdAt": "2017-06-27T09:35:44.000Z",
+ "icon___NODE": "rocybtov1ozk___c6m5AJ9vMPKc8OUoQeoCS4o___Asset___de",
+ "id": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___de",
+ "internal": Object {
+ "contentDigest": "2020-06-30T11:22:54.201Z",
+ "type": "ContentfulCategory",
+ },
+ "node_locale": "de",
+ "parent": "Category",
+ "product___NODE": Array [
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___de",
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___de",
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___de",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "6XwpTaSiiI2Ak2Ww0oi6qa",
+ "id": "c6XwpTaSiiI2Ak2Ww0oi6qa",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 4,
+ "type": "Entry",
+ },
+ "title___NODE": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___detitleTextNode",
+ "updatedAt": "2020-06-30T11:22:54.201Z",
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription___NODE": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___decategoryDescriptionTextNode",
+ "children": Array [
+ "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___detitleTextNode",
+ "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___decategoryDescriptionTextNode",
+ ],
+ "contentful_id": "c24DPGBDeGEaYy8ms4Y8QMQ",
+ "createdAt": "2017-06-27T09:35:44.992Z",
+ "icon___NODE": "rocybtov1ozk___c6t4HKjytPi0mYgs240wkG___Asset___de",
+ "id": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:46:43.477Z",
+ "type": "ContentfulCategory",
+ },
+ "node_locale": "de",
+ "parent": "Category",
+ "product___NODE": Array [
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___de",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "6XwpTaSiiI2Ak2Ww0oi6qa",
+ "id": "c6XwpTaSiiI2Ak2Ww0oi6qa",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "title___NODE": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___detitleTextNode",
+ "updatedAt": "2017-06-27T09:46:43.477Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___detitleTextNode",
+ "internal": Object {
+ "content": "Haus & Küche",
+ "contentDigest": "2020-06-30T11:22:54.201Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryTitleTextNode",
+ },
+ "parent": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ "title": "Haus & Küche",
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription": "Shop für Möbel, Bettwäsche, Bad, Staubsauger, Küchenprodukte und vieles mehr",
+ "children": Array [],
+ "id": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___decategoryDescriptionTextNode",
+ "internal": Object {
+ "content": "Shop für Möbel, Bettwäsche, Bad, Staubsauger, Küchenprodukte und vieles mehr",
+ "contentDigest": "2020-06-30T11:22:54.201Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryCategoryDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___detitleTextNode",
+ "internal": Object {
+ "content": "Spielzeug",
+ "contentDigest": "2017-06-27T09:46:43.477Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryTitleTextNode",
+ },
+ "parent": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ "title": "Spielzeug",
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription": "Spielzeugladen, Spiele, Lernhilfen",
+ "children": Array [],
+ "id": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___decategoryDescriptionTextNode",
+ "internal": Object {
+ "content": "Spielzeugladen, Spiele, Lernhilfen",
+ "contentDigest": "2017-06-27T09:46:43.477Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryCategoryDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": null,
+ "displayField": "companyName",
+ "id": "Brand",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:41:09.339Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Brand",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___EntrycompanyNameTextNode",
+ "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___EntrycompanyDescriptionTextNode",
+ ],
+ "companyDescription___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___EntrycompanyDescriptionTextNode",
+ "companyName___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___EntrycompanyNameTextNode",
+ "contentful_id": "c651CQ8rLoIYCeY6G0QG22q",
+ "createdAt": "2017-06-27T09:35:43.997Z",
+ "email": "normann@normann-copenhagen.com",
+ "id": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:55:16.820Z",
+ "type": "ContentfulBrand",
+ },
+ "logo___NODE": "rocybtov1ozk___c3wtvPBbBjiMKqKKga8I2Cu___Asset",
+ "node_locale": "en-US",
+ "parent": "Brand",
+ "phone": Array [
+ "+45 35 55 44 59",
+ ],
+ "product___NODE": Array [
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry",
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "sFzTZbSuM8coEwygeUYes",
+ "id": "sFzTZbSuM8coEwygeUYes",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "twitter": "https://twitter.com/NormannCPH",
+ "updatedAt": "2017-06-27T09:55:16.820Z",
+ "website": "http://www.normann-copenhagen.com/",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___EntrycompanyNameTextNode",
+ "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___EntrycompanyDescriptionTextNode",
+ ],
+ "companyDescription___NODE": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___EntrycompanyDescriptionTextNode",
+ "companyName___NODE": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___EntrycompanyNameTextNode",
+ "contentful_id": "c4LgMotpNF6W20YKmuemW0a",
+ "createdAt": "2017-06-27T09:35:44.396Z",
+ "email": "info@acgears.com",
+ "id": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:51:15.647Z",
+ "type": "ContentfulBrand",
+ },
+ "logo___NODE": "rocybtov1ozk___c2Y8LhXLnYAYqKCGEWG4EKI___Asset",
+ "node_locale": "en-US",
+ "parent": "Brand",
+ "phone": Array [
+ "+1 212 260 2269",
+ ],
+ "product___NODE": Array [
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "sFzTZbSuM8coEwygeUYes",
+ "id": "sFzTZbSuM8coEwygeUYes",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "updatedAt": "2017-06-27T09:51:15.647Z",
+ "website": "http://www.lemnos.jp/en/",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___EntrycompanyNameTextNode",
+ "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___EntrycompanyDescriptionTextNode",
+ ],
+ "companyDescription___NODE": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___EntrycompanyDescriptionTextNode",
+ "companyName___NODE": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___EntrycompanyNameTextNode",
+ "contentful_id": "JrePkDVYomE8AwcuCUyMi",
+ "createdAt": "2017-06-27T09:35:44.988Z",
+ "id": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:50:36.937Z",
+ "type": "ContentfulBrand",
+ },
+ "logo___NODE": "rocybtov1ozk___c4zj1ZOfHgQ8oqgaSKm4Qo2___Asset",
+ "node_locale": "en-US",
+ "parent": "Brand",
+ "product___NODE": Array [
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "sFzTZbSuM8coEwygeUYes",
+ "id": "sFzTZbSuM8coEwygeUYes",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "updatedAt": "2017-06-27T09:50:36.937Z",
+ "website": "http://playsam.com/",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyName": "Normann Copenhagen",
+ "id": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___EntrycompanyNameTextNode",
+ "internal": Object {
+ "content": "Normann Copenhagen",
+ "contentDigest": "2017-06-27T09:55:16.820Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyDescription": "Normann Copenhagen is a way of living - a mindset. We love to challenge the conventional design rules. This is why you will find traditional materials put into untraditional use such as a Stone Hook made of Icelandic stones, a vase made out of silicon and last but not least a dog made out of plastic.",
+ "id": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___EntrycompanyDescriptionTextNode",
+ "internal": Object {
+ "content": "Normann Copenhagen is a way of living - a mindset. We love to challenge the conventional design rules. This is why you will find traditional materials put into untraditional use such as a Stone Hook made of Icelandic stones, a vase made out of silicon and last but not least a dog made out of plastic.",
+ "contentDigest": "2017-06-27T09:55:16.820Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyName": "Lemnos",
+ "id": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___EntrycompanyNameTextNode",
+ "internal": Object {
+ "content": "Lemnos",
+ "contentDigest": "2017-06-27T09:51:15.647Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyDescription": "TAKATA Lemnos Inc. was founded in 1947 as a brass casting manufacturing industry in Takaoka-city, Toyama Prefecture, Japan and we launched out into the full-scale business trade with Seiko Clock Co., Ltd. since 1966.
+
+We entered into the development for the original planning from late 1980 and \\"Lemnos Brand\\" recognized as the global design clock by a masterpiece \\"HOLA\\" designed by Kazuo KAWASAKI which released in 1989.
+
+Afterwards, we made a lot of projects with well-known designers who took in active in Japan and overseas such as Riki WATANABE, Kazuo KAWASAKI, Shin AZUMI, Tomoko AZUMI, Kanae TSUKAMOTO etc. and we made announcement of their fine works abounding in artistry and prominent designs. In addition, we realized to make a special project by the collaboration with Andrea Branzi, a well-known architect in the world.
+
+Lemnos brand products are now highly praised from the design shops and the interior shops all over the world.
+
+In recent years, we also have been given high priority to develop interior accessories making full use of our traditional techniques by the founding manufacturer and we always focus our minds on the development for the new Lemnos products in the new market.
+
+Our Lemnos products are made carefully by our craftsmen finely honed skillful techniques in Japan. They surely bring out the attractiveness of the materials to the maximum and create fine products not being influenced on the fashion trend accordingly. TAKATA Lemnos Inc. definitely would like to be innovative and continuously propose the beauty lasts forever.",
+ "id": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___EntrycompanyDescriptionTextNode",
+ "internal": Object {
+ "content": "TAKATA Lemnos Inc. was founded in 1947 as a brass casting manufacturing industry in Takaoka-city, Toyama Prefecture, Japan and we launched out into the full-scale business trade with Seiko Clock Co., Ltd. since 1966.
+
+We entered into the development for the original planning from late 1980 and \\"Lemnos Brand\\" recognized as the global design clock by a masterpiece \\"HOLA\\" designed by Kazuo KAWASAKI which released in 1989.
+
+Afterwards, we made a lot of projects with well-known designers who took in active in Japan and overseas such as Riki WATANABE, Kazuo KAWASAKI, Shin AZUMI, Tomoko AZUMI, Kanae TSUKAMOTO etc. and we made announcement of their fine works abounding in artistry and prominent designs. In addition, we realized to make a special project by the collaboration with Andrea Branzi, a well-known architect in the world.
+
+Lemnos brand products are now highly praised from the design shops and the interior shops all over the world.
+
+In recent years, we also have been given high priority to develop interior accessories making full use of our traditional techniques by the founding manufacturer and we always focus our minds on the development for the new Lemnos products in the new market.
+
+Our Lemnos products are made carefully by our craftsmen finely honed skillful techniques in Japan. They surely bring out the attractiveness of the materials to the maximum and create fine products not being influenced on the fashion trend accordingly. TAKATA Lemnos Inc. definitely would like to be innovative and continuously propose the beauty lasts forever.",
+ "contentDigest": "2017-06-27T09:51:15.647Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyName": "Playsam",
+ "id": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___EntrycompanyNameTextNode",
+ "internal": Object {
+ "content": "Playsam",
+ "contentDigest": "2017-06-27T09:50:36.937Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyNameTextNode",
+ },
+ "parent": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyDescription": "Playsam is the leading Scandinavian design company for executive wooden toy gift. Scandinavian design playful creativity, integrity and sophistication are Playsam. Scandinavian design and wooden toy makes Playsam gift lovely to the world of design since 1984.",
+ "id": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___EntrycompanyDescriptionTextNode",
+ "internal": Object {
+ "content": "Playsam is the leading Scandinavian design company for executive wooden toy gift. Scandinavian design playful creativity, integrity and sophistication are Playsam. Scandinavian design and wooden toy makes Playsam gift lovely to the world of design since 1984.",
+ "contentDigest": "2017-06-27T09:50:36.937Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": null,
+ "displayField": "companyName",
+ "id": "Brand",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:41:09.339Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Brand",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___decompanyNameTextNode",
+ "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___decompanyDescriptionTextNode",
+ ],
+ "companyDescription___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___decompanyDescriptionTextNode",
+ "companyName___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___decompanyNameTextNode",
+ "contentful_id": "c651CQ8rLoIYCeY6G0QG22q",
+ "createdAt": "2017-06-27T09:35:43.997Z",
+ "email": "normann@normann-copenhagen.com",
+ "id": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:55:16.820Z",
+ "type": "ContentfulBrand",
+ },
+ "logo___NODE": "rocybtov1ozk___c3wtvPBbBjiMKqKKga8I2Cu___Asset___de",
+ "node_locale": "de",
+ "parent": "Brand",
+ "phone": Array [
+ "+45 35 55 44 59",
+ ],
+ "product___NODE": Array [
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___de",
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___de",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "sFzTZbSuM8coEwygeUYes",
+ "id": "sFzTZbSuM8coEwygeUYes",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "twitter": "https://twitter.com/NormannCPH",
+ "updatedAt": "2017-06-27T09:55:16.820Z",
+ "website": "http://www.normann-copenhagen.com/",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___decompanyNameTextNode",
+ "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___decompanyDescriptionTextNode",
+ ],
+ "companyDescription___NODE": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___decompanyDescriptionTextNode",
+ "companyName___NODE": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___decompanyNameTextNode",
+ "contentful_id": "c4LgMotpNF6W20YKmuemW0a",
+ "createdAt": "2017-06-27T09:35:44.396Z",
+ "email": "info@acgears.com",
+ "id": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:51:15.647Z",
+ "type": "ContentfulBrand",
+ },
+ "logo___NODE": "rocybtov1ozk___c2Y8LhXLnYAYqKCGEWG4EKI___Asset___de",
+ "node_locale": "de",
+ "parent": "Brand",
+ "phone": Array [
+ "+1 212 260 2269",
+ ],
+ "product___NODE": Array [
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___de",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "sFzTZbSuM8coEwygeUYes",
+ "id": "sFzTZbSuM8coEwygeUYes",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "updatedAt": "2017-06-27T09:51:15.647Z",
+ "website": "http://www.lemnos.jp/en/",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___decompanyNameTextNode",
+ "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___decompanyDescriptionTextNode",
+ ],
+ "companyDescription___NODE": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___decompanyDescriptionTextNode",
+ "companyName___NODE": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___decompanyNameTextNode",
+ "contentful_id": "JrePkDVYomE8AwcuCUyMi",
+ "createdAt": "2017-06-27T09:35:44.988Z",
+ "id": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:50:36.937Z",
+ "type": "ContentfulBrand",
+ },
+ "logo___NODE": "rocybtov1ozk___c4zj1ZOfHgQ8oqgaSKm4Qo2___Asset___de",
+ "node_locale": "de",
+ "parent": "Brand",
+ "product___NODE": Array [
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___de",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "sFzTZbSuM8coEwygeUYes",
+ "id": "sFzTZbSuM8coEwygeUYes",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "updatedAt": "2017-06-27T09:50:36.937Z",
+ "website": "http://playsam.com/",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyName": "Normann Copenhagen",
+ "id": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___decompanyNameTextNode",
+ "internal": Object {
+ "content": "Normann Copenhagen",
+ "contentDigest": "2017-06-27T09:55:16.820Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyDescription": "Normann Kopenhagen ist eine Art zu leben - eine Denkweise. Wir lieben es, die konventionellen Designregeln herauszufordern. Aus diesem Grund finden Sie traditionelle Materialien, die in untraditionelle Verwendung wie ein Steinhaken aus isländischen Steinen, eine Vase aus Silizium und last but not least ein Hund aus Kunststoff.",
+ "id": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___decompanyDescriptionTextNode",
+ "internal": Object {
+ "content": "Normann Kopenhagen ist eine Art zu leben - eine Denkweise. Wir lieben es, die konventionellen Designregeln herauszufordern. Aus diesem Grund finden Sie traditionelle Materialien, die in untraditionelle Verwendung wie ein Steinhaken aus isländischen Steinen, eine Vase aus Silizium und last but not least ein Hund aus Kunststoff.",
+ "contentDigest": "2017-06-27T09:55:16.820Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyName": "Lemnos",
+ "id": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___decompanyNameTextNode",
+ "internal": Object {
+ "content": "Lemnos",
+ "contentDigest": "2017-06-27T09:51:15.647Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyDescription": "TAKATA Lemnos Inc. wurde im Jahre 1947 als Messing-Casting-Fertigungsindustrie in Takaoka-Stadt, Toyama Prefecture, Japan gegründet und wir starteten seit 1966 mit der Seiko Clock Co., Ltd.
+
+Wir haben die Entwicklung für die ursprüngliche Planung ab Ende 1980 eingegangen und \\"Lemnos Brand\\" wurde als globale Designuhr von einem Meisterwerk \\"HOLA\\" von Kazuo KAWASAKI entworfen, das 1989 erschien.
+
+Danach machten wir viele Projekte mit namhaften Designern, die in Japan und Übersee tätig waren, wie zB Riki WATANABE, Kazuo KAWASAKI, Shin AZUMI, Tomoko AZUMI, Kanae TSUKAMOTO etc. und wir kündigten ihre Werke in der Kunst an Und prominenten Designs. Darüber hinaus haben wir durch die Zusammenarbeit mit Andrea Branzi, einem bekannten Architekten der Welt, ein besonderes Projekt gemacht.
+
+Lemnos Markenprodukte werden nun von den Designläden und den Innenhandelsgeschäften auf der ganzen Welt hoch gelobt.
+
+In den vergangenen Jahren haben wir auch eine hohe Priorität für die Entwicklung von Innenausstattung, die den traditionellen Techniken des Gründungsherstellers voll ausnutzt, und wir konzentrieren uns immer auf die Entwicklung der neuen Lemnos-Produkte im neuen Markt.
+
+Unsere Lemnos Produkte werden sorgfältig von unseren Handwerkern fein geschliffen geschickten Techniken in Japan gemacht. Sie bringen sicherlich die Attraktivität der Materialien auf das Maximum und schaffen feine Produkte nicht beeinflusst auf die Mode-Trend entsprechend. TAKATA Lemnos Inc. möchte definitiv innovativ sein und ständig vorschlagen, die Schönheit dauert ewig.",
+ "id": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___decompanyDescriptionTextNode",
+ "internal": Object {
+ "content": "TAKATA Lemnos Inc. wurde im Jahre 1947 als Messing-Casting-Fertigungsindustrie in Takaoka-Stadt, Toyama Prefecture, Japan gegründet und wir starteten seit 1966 mit der Seiko Clock Co., Ltd.
+
+Wir haben die Entwicklung für die ursprüngliche Planung ab Ende 1980 eingegangen und \\"Lemnos Brand\\" wurde als globale Designuhr von einem Meisterwerk \\"HOLA\\" von Kazuo KAWASAKI entworfen, das 1989 erschien.
+
+Danach machten wir viele Projekte mit namhaften Designern, die in Japan und Übersee tätig waren, wie zB Riki WATANABE, Kazuo KAWASAKI, Shin AZUMI, Tomoko AZUMI, Kanae TSUKAMOTO etc. und wir kündigten ihre Werke in der Kunst an Und prominenten Designs. Darüber hinaus haben wir durch die Zusammenarbeit mit Andrea Branzi, einem bekannten Architekten der Welt, ein besonderes Projekt gemacht.
+
+Lemnos Markenprodukte werden nun von den Designläden und den Innenhandelsgeschäften auf der ganzen Welt hoch gelobt.
+
+In den vergangenen Jahren haben wir auch eine hohe Priorität für die Entwicklung von Innenausstattung, die den traditionellen Techniken des Gründungsherstellers voll ausnutzt, und wir konzentrieren uns immer auf die Entwicklung der neuen Lemnos-Produkte im neuen Markt.
+
+Unsere Lemnos Produkte werden sorgfältig von unseren Handwerkern fein geschliffen geschickten Techniken in Japan gemacht. Sie bringen sicherlich die Attraktivität der Materialien auf das Maximum und schaffen feine Produkte nicht beeinflusst auf die Mode-Trend entsprechend. TAKATA Lemnos Inc. möchte definitiv innovativ sein und ständig vorschlagen, die Schönheit dauert ewig.",
+ "contentDigest": "2017-06-27T09:51:15.647Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyName": "Playsam",
+ "id": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___decompanyNameTextNode",
+ "internal": Object {
+ "content": "Playsam",
+ "contentDigest": "2017-06-27T09:50:36.937Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyNameTextNode",
+ },
+ "parent": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyDescription": "Playsam ist die führende skandinavische Designfirma für Executive Holzspielzeug Geschenk. Skandinavisches Design spielerische Kreativität, Integrität und Raffinesse sind Playsam. Skandinavisches Design und hölzernes Spielzeug macht Playsam Geschenk schön in die Welt des Designs seit 1984.",
+ "id": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___decompanyDescriptionTextNode",
+ "internal": Object {
+ "content": "Playsam ist die führende skandinavische Designfirma für Executive Holzspielzeug Geschenk. Skandinavisches Design spielerische Kreativität, Integrität und Raffinesse sind Playsam. Skandinavisches Design und hölzernes Spielzeug macht Playsam Geschenk schön in die Welt des Designs seit 1984.",
+ "contentDigest": "2017-06-27T09:50:36.937Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": null,
+ "displayField": "productName",
+ "id": "Product",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:40:36.821Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Product",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___EntryproductNameTextNode",
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___EntryproductDescriptionTextNode",
+ ],
+ "contentful_id": "c5KsDBWseXY6QegucYAoacS",
+ "createdAt": "2017-06-27T09:35:43.996Z",
+ "id": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry",
+ "image___NODE": Array [
+ "rocybtov1ozk___wtrHxeu3zEoEce2MokCSi___Asset",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:56:59.626Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "en-US",
+ "parent": "Product",
+ "price": 44,
+ "productDescription___NODE": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___EntryproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___EntryproductNameTextNode",
+ "quantity": 56,
+ "sizetypecolor": "Length: 135 mm | color: espresso, green, or icar (white)",
+ "sku": "B001R6JUZ2",
+ "slug": "playsam-streamliner-classic-car-espresso",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "wood",
+ "toy",
+ "car",
+ "sweden",
+ "design",
+ ],
+ "updatedAt": "2017-06-27T09:56:59.626Z",
+ "website": "http://www.amazon.com/dp/B001R6JUZ2/",
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___EntryproductNameTextNode",
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___EntryproductDescriptionTextNode",
+ ],
+ "contentful_id": "c3DVqIYj4dOwwcKu6sgqOgg",
+ "createdAt": "2017-06-27T09:35:44.006Z",
+ "id": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry",
+ "image___NODE": Array [
+ "rocybtov1ozk___Xc0ny7GWsMEMCeASWO2um___Asset",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:54:51.159Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "en-US",
+ "parent": "Product",
+ "price": 11,
+ "productDescription___NODE": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___EntryproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___EntryproductNameTextNode",
+ "quantity": 101,
+ "sizetypecolor": "3 x 3 x 5 inches; 5.3 ounces",
+ "sku": "B00E82D7I8",
+ "slug": "hudson-wall-cup",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "vase",
+ "flowers",
+ "accessories",
+ ],
+ "updatedAt": "2017-06-27T09:54:51.159Z",
+ "website": "http://www.amazon.com/dp/B00E82D7I8/",
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___EntryproductNameTextNode",
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___EntryproductDescriptionTextNode",
+ ],
+ "contentful_id": "c6dbjWqNd9SqccegcqYq224",
+ "createdAt": "2017-06-27T09:35:44.049Z",
+ "id": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry",
+ "image___NODE": Array [
+ "rocybtov1ozk___c10TkaLheGeQG6qQGqWYqUI___Asset",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:53:23.179Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "en-US",
+ "parent": "Product",
+ "price": 22,
+ "productDescription___NODE": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___EntryproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___EntryproductNameTextNode",
+ "quantity": 89,
+ "sizetypecolor": "0.8 x 0.8 x 11.2 inches; 1.6 ounces",
+ "sku": "B0081F2CCK",
+ "slug": "whisk-beater",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "kitchen",
+ "accessories",
+ "whisk",
+ "scandinavia",
+ "design",
+ ],
+ "updatedAt": "2017-06-27T09:53:23.179Z",
+ "website": "http://www.amazon.com/dp/B0081F2CCK/",
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___EntryproductNameTextNode",
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___EntryproductDescriptionTextNode",
+ ],
+ "contentful_id": "c4BqrajvA8E6qwgkieoqmqO",
+ "createdAt": "2017-06-27T09:35:44.130Z",
+ "id": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry",
+ "image___NODE": Array [
+ "rocybtov1ozk___KTRF62Q4gg60q6WCsWKw8___Asset",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:52:29.215Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "en-US",
+ "parent": "Product",
+ "price": 120,
+ "productDescription___NODE": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___EntryproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___EntryproductNameTextNode",
+ "quantity": 3,
+ "sizetypecolor": "10\\" x 2.2\\"",
+ "sku": "B00MG4ULK2",
+ "slug": "soso-wall-clock",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "home décor",
+ "clocks",
+ "interior design",
+ "yellow",
+ "gifts",
+ ],
+ "updatedAt": "2017-06-27T09:52:29.215Z",
+ "website": "http://store.dwell.com/soso-wall-clock.html",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___EntryproductNameTextNode",
+ "internal": Object {
+ "content": "Playsam Streamliner Classic Car, Espresso",
+ "contentDigest": "2017-06-27T09:56:59.626Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry",
+ "productName": "Playsam Streamliner Classic Car, Espresso",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___EntryproductDescriptionTextNode",
+ "internal": Object {
+ "content": "A classic Playsam design, the Streamliner Classic Car has been selected as Swedish Design Classic by the Swedish National Museum for its inventive style and sleek surface. It's no wonder that this wooden car has also been a long-standing favorite for children both big and small!",
+ "contentDigest": "2017-06-27T09:56:59.626Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry",
+ "productDescription": "A classic Playsam design, the Streamliner Classic Car has been selected as Swedish Design Classic by the Swedish National Museum for its inventive style and sleek surface. It's no wonder that this wooden car has also been a long-standing favorite for children both big and small!",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___EntryproductNameTextNode",
+ "internal": Object {
+ "content": "Hudson Wall Cup",
+ "contentDigest": "2017-06-27T09:54:51.159Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry",
+ "productName": "Hudson Wall Cup",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___EntryproductDescriptionTextNode",
+ "internal": Object {
+ "content": "Wall Hanging Glass Flower Vase and Terrarium",
+ "contentDigest": "2017-06-27T09:54:51.159Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry",
+ "productDescription": "Wall Hanging Glass Flower Vase and Terrarium",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___EntryproductNameTextNode",
+ "internal": Object {
+ "content": "Whisk Beater",
+ "contentDigest": "2017-06-27T09:53:23.179Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry",
+ "productName": "Whisk Beater",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___EntryproductDescriptionTextNode",
+ "internal": Object {
+ "content": "A creative little whisk that comes in 8 different colors. Handy and easy to clean after use. A great gift idea.",
+ "contentDigest": "2017-06-27T09:53:23.179Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry",
+ "productDescription": "A creative little whisk that comes in 8 different colors. Handy and easy to clean after use. A great gift idea.",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___EntryproductNameTextNode",
+ "internal": Object {
+ "content": "SoSo Wall Clock",
+ "contentDigest": "2017-06-27T09:52:29.215Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry",
+ "productName": "SoSo Wall Clock",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___EntryproductDescriptionTextNode",
+ "internal": Object {
+ "content": "The newly released SoSo Clock from Lemnos marries simple, clean design and bold, striking features. Its saturated marigold face is a lively pop of color to white or grey walls, but would also pair nicely with navy and maroon. Where most clocks feature numbers at the border of the clock, the SoSo brings them in tight to the middle, leaving a wide space between the numbers and the slight frame. The hour hand provides a nice interruption to the black and yellow of the clock - it is featured in a brilliant white. Despite its bold color and contrast, the SoSo maintains a clean, pure aesthetic that is suitable to a variety of contemporary interiors.",
+ "contentDigest": "2017-06-27T09:52:29.215Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry",
+ "productDescription": "The newly released SoSo Clock from Lemnos marries simple, clean design and bold, striking features. Its saturated marigold face is a lively pop of color to white or grey walls, but would also pair nicely with navy and maroon. Where most clocks feature numbers at the border of the clock, the SoSo brings them in tight to the middle, leaving a wide space between the numbers and the slight frame. The hour hand provides a nice interruption to the black and yellow of the clock - it is featured in a brilliant white. Despite its bold color and contrast, the SoSo maintains a clean, pure aesthetic that is suitable to a variety of contemporary interiors.",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": null,
+ "displayField": "productName",
+ "id": "Product",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:40:36.821Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Product",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___de",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___de",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___deproductNameTextNode",
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___deproductDescriptionTextNode",
+ ],
+ "contentful_id": "c5KsDBWseXY6QegucYAoacS",
+ "createdAt": "2017-06-27T09:35:43.996Z",
+ "id": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___de",
+ "image___NODE": Array [
+ "rocybtov1ozk___wtrHxeu3zEoEce2MokCSi___Asset___de",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:56:59.626Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "de",
+ "parent": "Product",
+ "price": 44,
+ "productDescription___NODE": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___deproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___deproductNameTextNode",
+ "quantity": 56,
+ "sizetypecolor": "Length: 135 mm | color: espresso, green, or icar (white)",
+ "sku": "B001R6JUZ2",
+ "slug": "playsam-streamliner-classic-car-espresso",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "wood",
+ "toy",
+ "car",
+ "sweden",
+ "design",
+ ],
+ "updatedAt": "2017-06-27T09:56:59.626Z",
+ "website": "http://www.amazon.com/dp/B001R6JUZ2/",
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___de",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___de",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___deproductNameTextNode",
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___deproductDescriptionTextNode",
+ ],
+ "contentful_id": "c3DVqIYj4dOwwcKu6sgqOgg",
+ "createdAt": "2017-06-27T09:35:44.006Z",
+ "id": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___de",
+ "image___NODE": Array [
+ "rocybtov1ozk___Xc0ny7GWsMEMCeASWO2um___Asset___de",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:54:51.159Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "de",
+ "parent": "Product",
+ "price": 11,
+ "productDescription___NODE": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___deproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___deproductNameTextNode",
+ "quantity": 101,
+ "sizetypecolor": "3 x 3 x 5 inches; 5.3 ounces",
+ "sku": "B00E82D7I8",
+ "slug": "hudson-wall-cup",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "vase",
+ "flowers",
+ "accessories",
+ ],
+ "updatedAt": "2017-06-27T09:54:51.159Z",
+ "website": "http://www.amazon.com/dp/B00E82D7I8/",
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___de",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___de",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___deproductNameTextNode",
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___deproductDescriptionTextNode",
+ ],
+ "contentful_id": "c6dbjWqNd9SqccegcqYq224",
+ "createdAt": "2017-06-27T09:35:44.049Z",
+ "id": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___de",
+ "image___NODE": Array [
+ "rocybtov1ozk___c10TkaLheGeQG6qQGqWYqUI___Asset___de",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:53:23.179Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "de",
+ "parent": "Product",
+ "price": 22,
+ "productDescription___NODE": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___deproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___deproductNameTextNode",
+ "quantity": 89,
+ "sizetypecolor": "0.8 x 0.8 x 11.2 inches; 1.6 ounces",
+ "sku": "B0081F2CCK",
+ "slug": "whisk-beater",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "kitchen",
+ "accessories",
+ "whisk",
+ "scandinavia",
+ "design",
+ ],
+ "updatedAt": "2017-06-27T09:53:23.179Z",
+ "website": "http://www.amazon.com/dp/B0081F2CCK/",
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___de",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___de",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___deproductNameTextNode",
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___deproductDescriptionTextNode",
+ ],
+ "contentful_id": "c4BqrajvA8E6qwgkieoqmqO",
+ "createdAt": "2017-06-27T09:35:44.130Z",
+ "id": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___de",
+ "image___NODE": Array [
+ "rocybtov1ozk___KTRF62Q4gg60q6WCsWKw8___Asset___de",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:52:29.215Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "de",
+ "parent": "Product",
+ "price": 120,
+ "productDescription___NODE": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___deproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___deproductNameTextNode",
+ "quantity": 3,
+ "sizetypecolor": "10\\" x 2.2\\"",
+ "sku": "B00MG4ULK2",
+ "slug": "soso-wall-clock",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "home décor",
+ "clocks",
+ "interior design",
+ "yellow",
+ "gifts",
+ ],
+ "updatedAt": "2017-06-27T09:52:29.215Z",
+ "website": "http://store.dwell.com/soso-wall-clock.html",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___deproductNameTextNode",
+ "internal": Object {
+ "content": "Playsam Streamliner Klassisches Auto, Espresso",
+ "contentDigest": "2017-06-27T09:56:59.626Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___de",
+ "productName": "Playsam Streamliner Klassisches Auto, Espresso",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___deproductDescriptionTextNode",
+ "internal": Object {
+ "content": "Ein klassisches Playsam-Design, das Streamliner Classic Car wurde als Swedish Design Classic vom Schwedischen Nationalmuseum für seinen erfinderischen Stil und seine schlanke Oberfläche ausgewählt. Es ist kein Wunder, dass dieses hölzerne Auto auch ein langjähriger Liebling für Kinder gewesen ist, die groß und klein sind!",
+ "contentDigest": "2017-06-27T09:56:59.626Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___de",
+ "productDescription": "Ein klassisches Playsam-Design, das Streamliner Classic Car wurde als Swedish Design Classic vom Schwedischen Nationalmuseum für seinen erfinderischen Stil und seine schlanke Oberfläche ausgewählt. Es ist kein Wunder, dass dieses hölzerne Auto auch ein langjähriger Liebling für Kinder gewesen ist, die groß und klein sind!",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___deproductNameTextNode",
+ "internal": Object {
+ "content": "Becher",
+ "contentDigest": "2017-06-27T09:54:51.159Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___de",
+ "productName": "Becher",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___deproductDescriptionTextNode",
+ "internal": Object {
+ "content": "Wand-hängende Glas-Blumen-Vase und Terrarium",
+ "contentDigest": "2017-06-27T09:54:51.159Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___de",
+ "productDescription": "Wand-hängende Glas-Blumen-Vase und Terrarium",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___deproductNameTextNode",
+ "internal": Object {
+ "content": "Schneebesen",
+ "contentDigest": "2017-06-27T09:53:23.179Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___de",
+ "productName": "Schneebesen",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___deproductDescriptionTextNode",
+ "internal": Object {
+ "content": "Ein kreativer kleiner Schneebesen, der in 8 verschiedenen Farben kommt. Praktisch und nach dem Gebrauch leicht zu reinigen. Eine tolle Geschenkidee.",
+ "contentDigest": "2017-06-27T09:53:23.179Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___de",
+ "productDescription": "Ein kreativer kleiner Schneebesen, der in 8 verschiedenen Farben kommt. Praktisch und nach dem Gebrauch leicht zu reinigen. Eine tolle Geschenkidee.",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___deproductNameTextNode",
+ "internal": Object {
+ "content": "SoSo wanduhr",
+ "contentDigest": "2017-06-27T09:52:29.215Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___de",
+ "productName": "SoSo wanduhr",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___deproductDescriptionTextNode",
+ "internal": Object {
+ "content": "Die neu veröffentlichte SoSo Clock von Lemnos heiratet einfaches, sauberes Design und fette, auffällige Features. Sein gesättigtes Ringelblumengesicht ist ein lebhafter Pop der Farbe zu den weißen oder grauen Wänden, aber würde auch gut mit Marine und kastanienbraun paaren. Wo die meisten Uhren am Rande der Uhr Nummern sind, bringt der SoSo sie in die Mitte und lässt einen weiten Raum zwischen den Zahlen und dem leichten Rahmen. Der Stundenzeiger bietet eine schöne Unterbrechung der schwarzen und gelben der Uhr - es ist in einem brillanten Weiß vorgestellt. Trotz seiner kräftigen Farbe und des Kontrastes behält der SoSo eine saubere, reine Ästhetik, die für eine Vielzahl von zeitgenössischen Interieurs geeignet ist.",
+ "contentDigest": "2017-06-27T09:52:29.215Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___de",
+ "productDescription": "Die neu veröffentlichte SoSo Clock von Lemnos heiratet einfaches, sauberes Design und fette, auffällige Features. Sein gesättigtes Ringelblumengesicht ist ein lebhafter Pop der Farbe zu den weißen oder grauen Wänden, aber würde auch gut mit Marine und kastanienbraun paaren. Wo die meisten Uhren am Rande der Uhr Nummern sind, bringt der SoSo sie in die Mitte und lässt einen weiten Raum zwischen den Zahlen und dem leichten Rahmen. Der Stundenzeiger bietet eine schöne Unterbrechung der schwarzen und gelben der Uhr - es ist in einem brillanten Weiß vorgestellt. Trotz seiner kräftigen Farbe und des Kontrastes behält der SoSo eine saubere, reine Ästhetik, die für eine Vielzahl von zeitgenössischen Interieurs geeignet ist.",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": "just for testing JSON fields",
+ "displayField": null,
+ "id": "JSON-test",
+ "internal": Object {
+ "contentDigest": "2018-08-13T14:21:13.985Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "JSON-test",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___EntryjsonTestJSONNode",
+ "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___EntryjsonStringTest0JSONNode",
+ ],
+ "contentful_id": "c71mfnH4QKsSsQmgoaQuq6O",
+ "createdAt": "2017-11-28T02:16:10.604Z",
+ "id": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry",
+ "internal": Object {
+ "contentDigest": "2018-08-13T14:27:12.458Z",
+ "type": "ContentfulJsonTest",
+ },
+ "jsonStringTest___NODE": Array [
+ "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___EntryjsonStringTest0JSONNode",
+ ],
+ "jsonTest___NODE": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___EntryjsonTestJSONNode",
+ "node_locale": "en-US",
+ "parent": "JSON-test",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "jsonTest",
+ "id": "jsonTest",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 4,
+ "type": "Entry",
+ },
+ "updatedAt": "2018-08-13T14:27:12.458Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "devDependencies": Object {
+ "babel-cli": "^6.26.0",
+ "babel-eslint": "^7.2.3",
+ "babel-jest": "^20.0.3",
+ "babel-plugin-add-module-exports": "^0.2.1",
+ "babel-plugin-lodash": "^3.2.11",
+ "babel-plugin-transform-async-to-generator": "^6.24.1",
+ "babel-plugin-transform-flow-strip-types": "^6.22.0",
+ "babel-plugin-transform-runtime": "^6.23.0",
+ "babel-preset-env": "^1.6.0",
+ "babel-preset-flow": "^6.23.0",
+ "babel-preset-react": "^6.24.1",
+ "babel-preset-stage-0": "^6.24.1",
+ "babel-register": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "chokidar": "^1.7.0",
+ "cross-env": "^5.0.5",
+ "eslint": "^4.5.0",
+ "eslint-config-google": "^0.9.1",
+ "eslint-config-prettier": "^2.5.0",
+ "eslint-plugin-flow-vars": "^0.5.0",
+ "eslint-plugin-flowtype": "^2.35.0",
+ "eslint-plugin-import": "^2.7.0",
+ "eslint-plugin-jsx-a11y": "^6.0.2",
+ "eslint-plugin-prettier": "^2.2.0",
+ "eslint-plugin-react": "^7.3.0",
+ "flow-bin": "^0.42.0",
+ "glob": "^7.1.1",
+ "jest": "^20.0.4",
+ "jest-cli": "^20.0.4",
+ "lerna": "^2.1.1",
+ "plop": "^1.8.1",
+ "prettier": "^1.7.0",
+ "prettier-eslint-cli": "4.2.x",
+ "remotedev-server": "^0.2.3",
+ "rimraf": "^2.6.1",
+ },
+ "engines": Object {
+ "yarn": "^1.2.1",
+ },
+ "eslintIgnore": Array [
+ "interfaces",
+ "**/__tests__/fixtures/",
+ ],
+ "id": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___EntryjsonTestJSONNode",
+ "internal": Object {
+ "content": "{\\"engines\\":{\\"yarn\\":\\"^1.2.1\\"},\\"private\\":true,\\"scripts\\":{\\"jest\\":\\"jest\\",\\"lint\\":\\"eslint --ext .js,.jsx packages/**/src\\",\\"plop\\":\\"plop\\",\\"test\\":\\"yarn lint && yarn jest\\",\\"lerna\\":\\"lerna\\",\\"watch\\":\\"lerna run watch --no-sort --stream --concurrency 999\\",\\"format\\":\\"npm run format-packages && npm run format-cache-dir && npm run format-www && npm run format-examples && npm run format-scripts\\",\\"publish\\":\\"lerna publish\\",\\"bootstrap\\":\\"yarn && npm run check-versions && lerna run prepublish\\",\\"lint:flow\\":\\"babel-node scripts/flow-check.js\\",\\"remotedev\\":\\"remotedev --hostname=localhost --port=19999\\",\\"test_bkup\\":\\"npm run lint && npm run test-node && npm run test-integration\\",\\"format-www\\":\\"prettier-eslint --write /\\"www/*.js/\\" /\\"www/src/**/*.js/\\"\\",\\"test:watch\\":\\"jest --watch\\",\\"test:update\\":\\"jest --updateSnapshot\\",\\"publish-next\\":\\"lerna publish --npm-tag=next\\",\\"check-versions\\":\\"babel-node scripts/check-versions.js\\",\\"format-scripts\\":\\"prettier-eslint --write /\\"scripts/**/*.js/\\"\\",\\"publish-canary\\":\\"lerna publish --canary --yes\\",\\"format-examples\\":\\"prettier-eslint --write /\\"examples/**/gatsby-node.js/\\" /\\"examples/**/gatsby-config.js/\\" /\\"examples/**/src/**/*.js/\\"\\",\\"format-packages\\":\\"prettier-eslint --write /\\"packages/*/src/**/*.js/\\"\\",\\"format-cache-dir\\":\\"prettier-eslint --write /\\"packages/gatsby/cache-dir/*.js/\\"\\"},\\"workspaces\\":[\\"packages/*\\"],\\"eslintIgnore\\":[\\"interfaces\\",\\"**/__tests__/fixtures/\\"],\\"devDependencies\\":{\\"glob\\":\\"^7.1.1\\",\\"jest\\":\\"^20.0.4\\",\\"plop\\":\\"^1.8.1\\",\\"lerna\\":\\"^2.1.1\\",\\"eslint\\":\\"^4.5.0\\",\\"rimraf\\":\\"^2.6.1\\",\\"chokidar\\":\\"^1.7.0\\",\\"flow-bin\\":\\"^0.42.0\\",\\"jest-cli\\":\\"^20.0.4\\",\\"prettier\\":\\"^1.7.0\\",\\"babel-cli\\":\\"^6.26.0\\",\\"cross-env\\":\\"^5.0.5\\",\\"babel-jest\\":\\"^20.0.3\\",\\"babel-eslint\\":\\"^7.2.3\\",\\"babel-runtime\\":\\"^6.26.0\\",\\"babel-register\\":\\"^6.26.0\\",\\"babel-preset-env\\":\\"^1.6.0\\",\\"remotedev-server\\":\\"^0.2.3\\",\\"babel-preset-flow\\":\\"^6.23.0\\",\\"babel-preset-react\\":\\"^6.24.1\\",\\"babel-plugin-lodash\\":\\"^3.2.11\\",\\"eslint-plugin-react\\":\\"^7.3.0\\",\\"prettier-eslint-cli\\":\\"4.2.x\\",\\"babel-preset-stage-0\\":\\"^6.24.1\\",\\"eslint-config-google\\":\\"^0.9.1\\",\\"eslint-plugin-import\\":\\"^2.7.0\\",\\"eslint-config-prettier\\":\\"^2.5.0\\",\\"eslint-plugin-flowtype\\":\\"^2.35.0\\",\\"eslint-plugin-jsx-a11y\\":\\"^6.0.2\\",\\"eslint-plugin-prettier\\":\\"^2.2.0\\",\\"eslint-plugin-flow-vars\\":\\"^0.5.0\\",\\"babel-plugin-transform-runtime\\":\\"^6.23.0\\",\\"babel-plugin-add-module-exports\\":\\"^0.2.1\\",\\"babel-plugin-transform-flow-strip-types\\":\\"^6.22.0\\",\\"babel-plugin-transform-async-to-generator\\":\\"^6.24.1\\"}}",
+ "contentDigest": "2018-08-13T14:27:12.458Z",
+ "mediaType": "application/json",
+ "type": "contentfulJsonTestJsonTestJsonNode",
+ },
+ "parent": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry",
+ "private": true,
+ "scripts": Object {
+ "bootstrap": "yarn && npm run check-versions && lerna run prepublish",
+ "check-versions": "babel-node scripts/check-versions.js",
+ "format": "npm run format-packages && npm run format-cache-dir && npm run format-www && npm run format-examples && npm run format-scripts",
+ "format-cache-dir": "prettier-eslint --write \\"packages/gatsby/cache-dir/*.js\\"",
+ "format-examples": "prettier-eslint --write \\"examples/**/gatsby-node.js\\" \\"examples/**/gatsby-config.js\\" \\"examples/**/src/**/*.js\\"",
+ "format-packages": "prettier-eslint --write \\"packages/*/src/**/*.js\\"",
+ "format-scripts": "prettier-eslint --write \\"scripts/**/*.js\\"",
+ "format-www": "prettier-eslint --write \\"www/*.js\\" \\"www/src/**/*.js\\"",
+ "jest": "jest",
+ "lerna": "lerna",
+ "lint": "eslint --ext .js,.jsx packages/**/src",
+ "lint:flow": "babel-node scripts/flow-check.js",
+ "plop": "plop",
+ "publish": "lerna publish",
+ "publish-canary": "lerna publish --canary --yes",
+ "publish-next": "lerna publish --npm-tag=next",
+ "remotedev": "remotedev --hostname=localhost --port=19999",
+ "test": "yarn lint && yarn jest",
+ "test:update": "jest --updateSnapshot",
+ "test:watch": "jest --watch",
+ "test_bkup": "npm run lint && npm run test-node && npm run test-integration",
+ "watch": "lerna run watch --no-sort --stream --concurrency 999",
+ },
+ "sys": Object {
+ "type": "Entry",
+ },
+ "workspaces": Array [
+ "packages/*",
+ ],
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "content": "test",
+ "id": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___EntryjsonStringTest0JSONNode",
+ "internal": Object {
+ "content": "\\"test\\"",
+ "contentDigest": "2018-08-13T14:27:12.458Z",
+ "mediaType": "application/json",
+ "type": "contentfulJsonTestJsonStringTestJsonNode",
+ },
+ "parent": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": "just for testing JSON fields",
+ "displayField": null,
+ "id": "JSON-test",
+ "internal": Object {
+ "contentDigest": "2018-08-13T14:21:13.985Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "JSON-test",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___dejsonTestJSONNode",
+ "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___dejsonStringTest0JSONNode",
+ ],
+ "contentful_id": "c71mfnH4QKsSsQmgoaQuq6O",
+ "createdAt": "2017-11-28T02:16:10.604Z",
+ "id": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___de",
+ "internal": Object {
+ "contentDigest": "2018-08-13T14:27:12.458Z",
+ "type": "ContentfulJsonTest",
+ },
+ "jsonStringTest___NODE": Array [
+ "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___dejsonStringTest0JSONNode",
+ ],
+ "jsonTest___NODE": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___dejsonTestJSONNode",
+ "node_locale": "de",
+ "parent": "JSON-test",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "jsonTest",
+ "id": "jsonTest",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 4,
+ "type": "Entry",
+ },
+ "updatedAt": "2018-08-13T14:27:12.458Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "devDependencies": Object {
+ "babel-cli": "^6.26.0",
+ "babel-eslint": "^7.2.3",
+ "babel-jest": "^20.0.3",
+ "babel-plugin-add-module-exports": "^0.2.1",
+ "babel-plugin-lodash": "^3.2.11",
+ "babel-plugin-transform-async-to-generator": "^6.24.1",
+ "babel-plugin-transform-flow-strip-types": "^6.22.0",
+ "babel-plugin-transform-runtime": "^6.23.0",
+ "babel-preset-env": "^1.6.0",
+ "babel-preset-flow": "^6.23.0",
+ "babel-preset-react": "^6.24.1",
+ "babel-preset-stage-0": "^6.24.1",
+ "babel-register": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "chokidar": "^1.7.0",
+ "cross-env": "^5.0.5",
+ "eslint": "^4.5.0",
+ "eslint-config-google": "^0.9.1",
+ "eslint-config-prettier": "^2.5.0",
+ "eslint-plugin-flow-vars": "^0.5.0",
+ "eslint-plugin-flowtype": "^2.35.0",
+ "eslint-plugin-import": "^2.7.0",
+ "eslint-plugin-jsx-a11y": "^6.0.2",
+ "eslint-plugin-prettier": "^2.2.0",
+ "eslint-plugin-react": "^7.3.0",
+ "flow-bin": "^0.42.0",
+ "glob": "^7.1.1",
+ "jest": "^20.0.4",
+ "jest-cli": "^20.0.4",
+ "lerna": "^2.1.1",
+ "plop": "^1.8.1",
+ "prettier": "^1.7.0",
+ "prettier-eslint-cli": "4.2.x",
+ "remotedev-server": "^0.2.3",
+ "rimraf": "^2.6.1",
+ },
+ "engines": Object {
+ "yarn": "^1.2.1",
+ },
+ "eslintIgnore": Array [
+ "interfaces",
+ "**/__tests__/fixtures/",
+ ],
+ "id": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___dejsonTestJSONNode",
+ "internal": Object {
+ "content": "{\\"engines\\":{\\"yarn\\":\\"^1.2.1\\"},\\"private\\":true,\\"scripts\\":{\\"jest\\":\\"jest\\",\\"lint\\":\\"eslint --ext .js,.jsx packages/**/src\\",\\"plop\\":\\"plop\\",\\"test\\":\\"yarn lint && yarn jest\\",\\"lerna\\":\\"lerna\\",\\"watch\\":\\"lerna run watch --no-sort --stream --concurrency 999\\",\\"format\\":\\"npm run format-packages && npm run format-cache-dir && npm run format-www && npm run format-examples && npm run format-scripts\\",\\"publish\\":\\"lerna publish\\",\\"bootstrap\\":\\"yarn && npm run check-versions && lerna run prepublish\\",\\"lint:flow\\":\\"babel-node scripts/flow-check.js\\",\\"remotedev\\":\\"remotedev --hostname=localhost --port=19999\\",\\"test_bkup\\":\\"npm run lint && npm run test-node && npm run test-integration\\",\\"format-www\\":\\"prettier-eslint --write /\\"www/*.js/\\" /\\"www/src/**/*.js/\\"\\",\\"test:watch\\":\\"jest --watch\\",\\"test:update\\":\\"jest --updateSnapshot\\",\\"publish-next\\":\\"lerna publish --npm-tag=next\\",\\"check-versions\\":\\"babel-node scripts/check-versions.js\\",\\"format-scripts\\":\\"prettier-eslint --write /\\"scripts/**/*.js/\\"\\",\\"publish-canary\\":\\"lerna publish --canary --yes\\",\\"format-examples\\":\\"prettier-eslint --write /\\"examples/**/gatsby-node.js/\\" /\\"examples/**/gatsby-config.js/\\" /\\"examples/**/src/**/*.js/\\"\\",\\"format-packages\\":\\"prettier-eslint --write /\\"packages/*/src/**/*.js/\\"\\",\\"format-cache-dir\\":\\"prettier-eslint --write /\\"packages/gatsby/cache-dir/*.js/\\"\\"},\\"workspaces\\":[\\"packages/*\\"],\\"eslintIgnore\\":[\\"interfaces\\",\\"**/__tests__/fixtures/\\"],\\"devDependencies\\":{\\"glob\\":\\"^7.1.1\\",\\"jest\\":\\"^20.0.4\\",\\"plop\\":\\"^1.8.1\\",\\"lerna\\":\\"^2.1.1\\",\\"eslint\\":\\"^4.5.0\\",\\"rimraf\\":\\"^2.6.1\\",\\"chokidar\\":\\"^1.7.0\\",\\"flow-bin\\":\\"^0.42.0\\",\\"jest-cli\\":\\"^20.0.4\\",\\"prettier\\":\\"^1.7.0\\",\\"babel-cli\\":\\"^6.26.0\\",\\"cross-env\\":\\"^5.0.5\\",\\"babel-jest\\":\\"^20.0.3\\",\\"babel-eslint\\":\\"^7.2.3\\",\\"babel-runtime\\":\\"^6.26.0\\",\\"babel-register\\":\\"^6.26.0\\",\\"babel-preset-env\\":\\"^1.6.0\\",\\"remotedev-server\\":\\"^0.2.3\\",\\"babel-preset-flow\\":\\"^6.23.0\\",\\"babel-preset-react\\":\\"^6.24.1\\",\\"babel-plugin-lodash\\":\\"^3.2.11\\",\\"eslint-plugin-react\\":\\"^7.3.0\\",\\"prettier-eslint-cli\\":\\"4.2.x\\",\\"babel-preset-stage-0\\":\\"^6.24.1\\",\\"eslint-config-google\\":\\"^0.9.1\\",\\"eslint-plugin-import\\":\\"^2.7.0\\",\\"eslint-config-prettier\\":\\"^2.5.0\\",\\"eslint-plugin-flowtype\\":\\"^2.35.0\\",\\"eslint-plugin-jsx-a11y\\":\\"^6.0.2\\",\\"eslint-plugin-prettier\\":\\"^2.2.0\\",\\"eslint-plugin-flow-vars\\":\\"^0.5.0\\",\\"babel-plugin-transform-runtime\\":\\"^6.23.0\\",\\"babel-plugin-add-module-exports\\":\\"^0.2.1\\",\\"babel-plugin-transform-flow-strip-types\\":\\"^6.22.0\\",\\"babel-plugin-transform-async-to-generator\\":\\"^6.24.1\\"}}",
+ "contentDigest": "2018-08-13T14:27:12.458Z",
+ "mediaType": "application/json",
+ "type": "contentfulJsonTestJsonTestJsonNode",
+ },
+ "parent": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___de",
+ "private": true,
+ "scripts": Object {
+ "bootstrap": "yarn && npm run check-versions && lerna run prepublish",
+ "check-versions": "babel-node scripts/check-versions.js",
+ "format": "npm run format-packages && npm run format-cache-dir && npm run format-www && npm run format-examples && npm run format-scripts",
+ "format-cache-dir": "prettier-eslint --write \\"packages/gatsby/cache-dir/*.js\\"",
+ "format-examples": "prettier-eslint --write \\"examples/**/gatsby-node.js\\" \\"examples/**/gatsby-config.js\\" \\"examples/**/src/**/*.js\\"",
+ "format-packages": "prettier-eslint --write \\"packages/*/src/**/*.js\\"",
+ "format-scripts": "prettier-eslint --write \\"scripts/**/*.js\\"",
+ "format-www": "prettier-eslint --write \\"www/*.js\\" \\"www/src/**/*.js\\"",
+ "jest": "jest",
+ "lerna": "lerna",
+ "lint": "eslint --ext .js,.jsx packages/**/src",
+ "lint:flow": "babel-node scripts/flow-check.js",
+ "plop": "plop",
+ "publish": "lerna publish",
+ "publish-canary": "lerna publish --canary --yes",
+ "publish-next": "lerna publish --npm-tag=next",
+ "remotedev": "remotedev --hostname=localhost --port=19999",
+ "test": "yarn lint && yarn jest",
+ "test:update": "jest --updateSnapshot",
+ "test:watch": "jest --watch",
+ "test_bkup": "npm run lint && npm run test-node && npm run test-integration",
+ "watch": "lerna run watch --no-sort --stream --concurrency 999",
+ },
+ "sys": Object {
+ "type": "Entry",
+ },
+ "workspaces": Array [
+ "packages/*",
+ ],
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "content": "test",
+ "id": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___dejsonStringTest0JSONNode",
+ "internal": Object {
+ "content": "\\"test\\"",
+ "contentDigest": "2018-08-13T14:27:12.458Z",
+ "mediaType": "application/json",
+ "type": "contentfulJsonTestJsonStringTestJsonNode",
+ },
+ "parent": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": "",
+ "displayField": "title",
+ "id": "Remark Test",
+ "internal": Object {
+ "contentDigest": "2018-05-28T08:43:09.218Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Remark Test",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___EntrycontentTextNode",
+ ],
+ "content___NODE": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___EntrycontentTextNode",
+ "contentful_id": "c4L2GhTsJtCseMYM8Wia64i",
+ "createdAt": "2018-05-28T08:49:06.230Z",
+ "id": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry",
+ "internal": Object {
+ "contentDigest": "2018-05-28T08:49:06.230Z",
+ "type": "ContentfulRemarkTest",
+ },
+ "node_locale": "en-US",
+ "parent": "Remark Test",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "remarkTest",
+ "id": "remarkTest",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 1,
+ "type": "Entry",
+ },
+ "title": "Contentful images inlined in Markdown",
+ "updatedAt": "2018-05-28T08:49:06.230Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "content": "## Toys
+
+
+
+## Chive
+
+
+
+## Playsam Streamliner
+
+
+
+## Whisk beaters
+
+
+
+## SoSo Wall Clock
+
+
+
+## Hudson Wall Cup
+
+",
+ "id": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___EntrycontentTextNode",
+ "internal": Object {
+ "content": "## Toys
+
+
+
+## Chive
+
+
+
+## Playsam Streamliner
+
+
+
+## Whisk beaters
+
+
+
+## SoSo Wall Clock
+
+
+
+## Hudson Wall Cup
+
+",
+ "contentDigest": "2018-05-28T08:49:06.230Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulRemarkTestContentTextNode",
+ },
+ "parent": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": "",
+ "displayField": "title",
+ "id": "Remark Test",
+ "internal": Object {
+ "contentDigest": "2018-05-28T08:43:09.218Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Remark Test",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry___decontentTextNode",
+ ],
+ "content___NODE": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry___decontentTextNode",
+ "contentful_id": "c4L2GhTsJtCseMYM8Wia64i",
+ "createdAt": "2018-05-28T08:49:06.230Z",
+ "id": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry___de",
+ "internal": Object {
+ "contentDigest": "2018-05-28T08:49:06.230Z",
+ "type": "ContentfulRemarkTest",
+ },
+ "node_locale": "de",
+ "parent": "Remark Test",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "remarkTest",
+ "id": "remarkTest",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 1,
+ "type": "Entry",
+ },
+ "title": "Contentful images inlined in Markdown",
+ "updatedAt": "2018-05-28T08:49:06.230Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "content": "## Toys
+
+
+
+## Chive
+
+
+
+## Playsam Streamliner
+
+
+
+## Whisk beaters
+
+
+
+## SoSo Wall Clock
+
+
+
+## Hudson Wall Cup
+
+",
+ "id": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry___decontentTextNode",
+ "internal": Object {
+ "content": "## Toys
+
+
+
+## Chive
+
+
+
+## Playsam Streamliner
+
+
+
+## Whisk beaters
+
+
+
+## SoSo Wall Clock
+
+
+
+## Hudson Wall Cup
+
+",
+ "contentDigest": "2018-05-28T08:49:06.230Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulRemarkTestContentTextNode",
+ },
+ "parent": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+]
+`;
+
+exports[`Skip existing nodes in warm build creates nodes for each asset 1`] = `
+Array [
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c3wtvPBbBjiMKqKKga8I2Cu",
+ "createdAt": "2017-06-27T09:35:37.178Z",
+ "description": "Brand logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 353,
+ "width": 353,
+ },
+ "size": 12302,
+ },
+ "fileName": "zJYzDlGk.jpeg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/3wtvPBbBjiMKqKKga8I2Cu/c65cb9cce1107c2e7e63c17072fe7932/zJYzDlGk.jpeg",
+ },
+ "id": "rocybtov1ozk___c3wtvPBbBjiMKqKKga8I2Cu___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.178Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Normann Copenhagen",
+ "updatedAt": "2017-06-27T09:35:37.178Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c3wtvPBbBjiMKqKKga8I2Cu",
+ "createdAt": "2017-06-27T09:35:37.178Z",
+ "description": "Brand logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 353,
+ "width": 353,
+ },
+ "size": 12302,
+ },
+ "fileName": "zJYzDlGk.jpeg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/3wtvPBbBjiMKqKKga8I2Cu/c65cb9cce1107c2e7e63c17072fe7932/zJYzDlGk.jpeg",
+ },
+ "id": "rocybtov1ozk___c3wtvPBbBjiMKqKKga8I2Cu___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.178Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Normann Copenhagen",
+ "updatedAt": "2017-06-27T09:35:37.178Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "KTRF62Q4gg60q6WCsWKw8",
+ "createdAt": "2017-06-27T09:35:37.064Z",
+ "description": "by Lemnos",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 1000,
+ "width": 1000,
+ },
+ "size": 66927,
+ },
+ "fileName": "soso.clock.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/KTRF62Q4gg60q6WCsWKw8/a8b2e93ac83fbbbb7bf9fba9f92b018e/soso.clock.jpg",
+ },
+ "id": "rocybtov1ozk___KTRF62Q4gg60q6WCsWKw8___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.064Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "SoSo Wall Clock",
+ "updatedAt": "2017-06-27T09:35:37.064Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "KTRF62Q4gg60q6WCsWKw8",
+ "createdAt": "2017-06-27T09:35:37.064Z",
+ "description": "by Lemnos",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 1000,
+ "width": 1000,
+ },
+ "size": 66927,
+ },
+ "fileName": "soso.clock.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/KTRF62Q4gg60q6WCsWKw8/a8b2e93ac83fbbbb7bf9fba9f92b018e/soso.clock.jpg",
+ },
+ "id": "rocybtov1ozk___KTRF62Q4gg60q6WCsWKw8___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.064Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "SoSo Wall Clock",
+ "updatedAt": "2017-06-27T09:35:37.064Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "Xc0ny7GWsMEMCeASWO2um",
+ "createdAt": "2017-06-27T09:35:37.027Z",
+ "description": "Merchandise image",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 600,
+ "width": 600,
+ },
+ "size": 48751,
+ },
+ "fileName": "jqvtazcyfwseah9fmysz.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/Xc0ny7GWsMEMCeASWO2um/af8e29320c04af689798afe96e2345c7/jqvtazcyfwseah9fmysz.jpg",
+ },
+ "id": "rocybtov1ozk___Xc0ny7GWsMEMCeASWO2um___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.027Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Hudson Wall Cup ",
+ "updatedAt": "2017-06-27T09:35:37.027Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "Xc0ny7GWsMEMCeASWO2um",
+ "createdAt": "2017-06-27T09:35:37.027Z",
+ "description": "Merchandise image",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 600,
+ "width": 600,
+ },
+ "size": 48751,
+ },
+ "fileName": "jqvtazcyfwseah9fmysz.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/Xc0ny7GWsMEMCeASWO2um/af8e29320c04af689798afe96e2345c7/jqvtazcyfwseah9fmysz.jpg",
+ },
+ "id": "rocybtov1ozk___Xc0ny7GWsMEMCeASWO2um___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.027Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Hudson Wall Cup ",
+ "updatedAt": "2017-06-27T09:35:37.027Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c2Y8LhXLnYAYqKCGEWG4EKI",
+ "createdAt": "2017-06-27T09:35:37.012Z",
+ "description": "company logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 32,
+ "width": 175,
+ },
+ "size": 7149,
+ },
+ "fileName": "lemnos-logo.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/2Y8LhXLnYAYqKCGEWG4EKI/eb29ab3c817906993f65e221523ef252/lemnos-logo.jpg",
+ },
+ "id": "rocybtov1ozk___c2Y8LhXLnYAYqKCGEWG4EKI___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.012Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Lemnos",
+ "updatedAt": "2017-06-27T09:35:37.012Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c2Y8LhXLnYAYqKCGEWG4EKI",
+ "createdAt": "2017-06-27T09:35:37.012Z",
+ "description": "company logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 32,
+ "width": 175,
+ },
+ "size": 7149,
+ },
+ "fileName": "lemnos-logo.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/2Y8LhXLnYAYqKCGEWG4EKI/eb29ab3c817906993f65e221523ef252/lemnos-logo.jpg",
+ },
+ "id": "rocybtov1ozk___c2Y8LhXLnYAYqKCGEWG4EKI___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:37.012Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Lemnos",
+ "updatedAt": "2017-06-27T09:35:37.012Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c6t4HKjytPi0mYgs240wkG",
+ "createdAt": "2017-06-27T09:35:36.633Z",
+ "description": "Category icon set",
+ "file": Object {
+ "contentType": "image/png",
+ "details": Object {
+ "image": Object {
+ "height": 128,
+ "width": 128,
+ },
+ "size": 6744,
+ },
+ "fileName": "toys_512pxGREY.png",
+ "url": "//images.ctfassets.net/rocybtov1ozk/6t4HKjytPi0mYgs240wkG/6e730b1e6c2a46929239019240c037e6/toys_512pxGREY.png",
+ },
+ "id": "rocybtov1ozk___c6t4HKjytPi0mYgs240wkG___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.633Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Toys",
+ "updatedAt": "2017-06-27T09:35:36.633Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c6t4HKjytPi0mYgs240wkG",
+ "createdAt": "2017-06-27T09:35:36.633Z",
+ "description": "Category icon set",
+ "file": Object {
+ "contentType": "image/png",
+ "details": Object {
+ "image": Object {
+ "height": 128,
+ "width": 128,
+ },
+ "size": 6744,
+ },
+ "fileName": "toys_512pxGREY.png",
+ "url": "//images.ctfassets.net/rocybtov1ozk/6t4HKjytPi0mYgs240wkG/6e730b1e6c2a46929239019240c037e6/toys_512pxGREY.png",
+ },
+ "id": "rocybtov1ozk___c6t4HKjytPi0mYgs240wkG___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.633Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Toys",
+ "updatedAt": "2017-06-27T09:35:36.633Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c1MgbdJNTsMWKI0W68oYqkU",
+ "createdAt": "2017-06-27T09:35:36.182Z",
+ "description": "Brand logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 500,
+ "width": 500,
+ },
+ "size": 44089,
+ },
+ "fileName": "9ef190c59f0d375c0dea58b58a4bc1f0.jpeg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/1MgbdJNTsMWKI0W68oYqkU/ad0200fe320b85ecdd823c711161c2f6/9ef190c59f0d375c0dea58b58a4bc1f0.jpeg",
+ },
+ "id": "rocybtov1ozk___c1MgbdJNTsMWKI0W68oYqkU___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.182Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Chive logo",
+ "updatedAt": "2017-06-27T09:35:36.182Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c1MgbdJNTsMWKI0W68oYqkU",
+ "createdAt": "2017-06-27T09:35:36.182Z",
+ "description": "Brand logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 500,
+ "width": 500,
+ },
+ "size": 44089,
+ },
+ "fileName": "9ef190c59f0d375c0dea58b58a4bc1f0.jpeg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/1MgbdJNTsMWKI0W68oYqkU/ad0200fe320b85ecdd823c711161c2f6/9ef190c59f0d375c0dea58b58a4bc1f0.jpeg",
+ },
+ "id": "rocybtov1ozk___c1MgbdJNTsMWKI0W68oYqkU___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.182Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Chive logo",
+ "updatedAt": "2017-06-27T09:35:36.182Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c6m5AJ9vMPKc8OUoQeoCS4o",
+ "createdAt": "2017-06-27T09:35:36.172Z",
+ "description": "category icon",
+ "file": Object {
+ "contentType": "image/png",
+ "details": Object {
+ "image": Object {
+ "height": 256,
+ "width": 256,
+ },
+ "size": 2977,
+ },
+ "fileName": "1418244847_Streamline-18-256.png",
+ "url": "//images.ctfassets.net/rocybtov1ozk/6m5AJ9vMPKc8OUoQeoCS4o/e782e3b291ff2b0287546a563af4683c/1418244847_Streamline-18-256.png",
+ },
+ "id": "rocybtov1ozk___c6m5AJ9vMPKc8OUoQeoCS4o___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.172Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Home and Kitchen",
+ "updatedAt": "2017-06-27T09:35:36.172Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c6m5AJ9vMPKc8OUoQeoCS4o",
+ "createdAt": "2017-06-27T09:35:36.172Z",
+ "description": "category icon",
+ "file": Object {
+ "contentType": "image/png",
+ "details": Object {
+ "image": Object {
+ "height": 256,
+ "width": 256,
+ },
+ "size": 2977,
+ },
+ "fileName": "1418244847_Streamline-18-256.png",
+ "url": "//images.ctfassets.net/rocybtov1ozk/6m5AJ9vMPKc8OUoQeoCS4o/e782e3b291ff2b0287546a563af4683c/1418244847_Streamline-18-256.png",
+ },
+ "id": "rocybtov1ozk___c6m5AJ9vMPKc8OUoQeoCS4o___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.172Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Home and Kitchen",
+ "updatedAt": "2017-06-27T09:35:36.172Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c4zj1ZOfHgQ8oqgaSKm4Qo2",
+ "createdAt": "2017-06-27T09:35:36.168Z",
+ "description": "Brand logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 100,
+ "width": 100,
+ },
+ "size": 7003,
+ },
+ "fileName": "playsam.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/4zj1ZOfHgQ8oqgaSKm4Qo2/5d967c9c48d67eabff71a9a0232d4378/playsam.jpg",
+ },
+ "id": "rocybtov1ozk___c4zj1ZOfHgQ8oqgaSKm4Qo2___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.168Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Playsam",
+ "updatedAt": "2017-06-27T09:35:36.168Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c4zj1ZOfHgQ8oqgaSKm4Qo2",
+ "createdAt": "2017-06-27T09:35:36.168Z",
+ "description": "Brand logo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 100,
+ "width": 100,
+ },
+ "size": 7003,
+ },
+ "fileName": "playsam.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/4zj1ZOfHgQ8oqgaSKm4Qo2/5d967c9c48d67eabff71a9a0232d4378/playsam.jpg",
+ },
+ "id": "rocybtov1ozk___c4zj1ZOfHgQ8oqgaSKm4Qo2___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.168Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Playsam",
+ "updatedAt": "2017-06-27T09:35:36.168Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "wtrHxeu3zEoEce2MokCSi",
+ "createdAt": "2017-06-27T09:35:36.037Z",
+ "description": "Merchandise photo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 446,
+ "width": 600,
+ },
+ "size": 27187,
+ },
+ "fileName": "quwowooybuqbl6ntboz3.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/wtrHxeu3zEoEce2MokCSi/73dce36715f16e27cf5ff0d2d97d7dff/quwowooybuqbl6ntboz3.jpg",
+ },
+ "id": "rocybtov1ozk___wtrHxeu3zEoEce2MokCSi___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.037Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Playsam Streamliner",
+ "updatedAt": "2017-06-27T09:35:36.037Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "wtrHxeu3zEoEce2MokCSi",
+ "createdAt": "2017-06-27T09:35:36.037Z",
+ "description": "Merchandise photo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 446,
+ "width": 600,
+ },
+ "size": 27187,
+ },
+ "fileName": "quwowooybuqbl6ntboz3.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/wtrHxeu3zEoEce2MokCSi/73dce36715f16e27cf5ff0d2d97d7dff/quwowooybuqbl6ntboz3.jpg",
+ },
+ "id": "rocybtov1ozk___wtrHxeu3zEoEce2MokCSi___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.037Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Playsam Streamliner",
+ "updatedAt": "2017-06-27T09:35:36.037Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c10TkaLheGeQG6qQGqWYqUI",
+ "createdAt": "2017-06-27T09:35:36.032Z",
+ "description": "Merchandise photo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 600,
+ "width": 450,
+ },
+ "size": 28435,
+ },
+ "fileName": "ryugj83mqwa1asojwtwb.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/10TkaLheGeQG6qQGqWYqUI/f997e8e13c8c83c145e976d0905e64b7/ryugj83mqwa1asojwtwb.jpg",
+ },
+ "id": "rocybtov1ozk___c10TkaLheGeQG6qQGqWYqUI___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.032Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Whisk beaters",
+ "updatedAt": "2017-06-27T09:35:36.032Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c10TkaLheGeQG6qQGqWYqUI",
+ "createdAt": "2017-06-27T09:35:36.032Z",
+ "description": "Merchandise photo",
+ "file": Object {
+ "contentType": "image/jpeg",
+ "details": Object {
+ "image": Object {
+ "height": 600,
+ "width": 450,
+ },
+ "size": 28435,
+ },
+ "fileName": "ryugj83mqwa1asojwtwb.jpg",
+ "url": "//images.ctfassets.net/rocybtov1ozk/10TkaLheGeQG6qQGqWYqUI/f997e8e13c8c83c145e976d0905e64b7/ryugj83mqwa1asojwtwb.jpg",
+ },
+ "id": "rocybtov1ozk___c10TkaLheGeQG6qQGqWYqUI___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:36.032Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "Whisk beaters",
+ "updatedAt": "2017-06-27T09:35:36.032Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c6s3iG2OVmoUcosmA8ocqsG",
+ "createdAt": "2017-06-27T09:35:35.994Z",
+ "description": "Category icon set",
+ "file": Object {
+ "contentType": "image/png",
+ "details": Object {
+ "image": Object {
+ "height": 250,
+ "width": 250,
+ },
+ "size": 4244,
+ },
+ "fileName": "1418244847_Streamline-18-256 (1).png",
+ "url": "//images.ctfassets.net/rocybtov1ozk/6s3iG2OVmoUcosmA8ocqsG/286ac4c1be74e05d2e7e11bc5a55bc83/1418244847_Streamline-18-256__1_.png",
+ },
+ "id": "rocybtov1ozk___c6s3iG2OVmoUcosmA8ocqsG___Asset",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:35.994Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "en-US",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "House icon",
+ "updatedAt": "2017-06-27T09:35:35.994Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "contentful_id": "c6s3iG2OVmoUcosmA8ocqsG",
+ "createdAt": "2017-06-27T09:35:35.994Z",
+ "description": "Category icon set",
+ "file": Object {
+ "contentType": "image/png",
+ "details": Object {
+ "image": Object {
+ "height": 250,
+ "width": 250,
+ },
+ "size": 4244,
+ },
+ "fileName": "1418244847_Streamline-18-256 (1).png",
+ "url": "//images.ctfassets.net/rocybtov1ozk/6s3iG2OVmoUcosmA8ocqsG/286ac4c1be74e05d2e7e11bc5a55bc83/1418244847_Streamline-18-256__1_.png",
+ },
+ "id": "rocybtov1ozk___c6s3iG2OVmoUcosmA8ocqsG___Asset___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:35:35.994Z",
+ "type": "ContentfulAsset",
+ },
+ "node_locale": "de",
+ "parent": null,
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "revision": 1,
+ "type": "Asset",
+ },
+ "title": "House icon",
+ "updatedAt": "2017-06-27T09:35:35.994Z",
+ },
+ ],
+]
+`;
+
+exports[`Skip existing nodes in warm build creates nodes for each entry 1`] = `
+Array [
+ Array [
+ Object {
+ "children": Array [],
+ "description": null,
+ "displayField": "title",
+ "id": "Category",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:40:52.685Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Category",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription___NODE": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___EntrycategoryDescriptionTextNode",
+ "children": Array [
+ "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___EntrytitleTextNode",
+ "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___EntrycategoryDescriptionTextNode",
+ ],
+ "contentful_id": "c24DPGBDeGEaYy8ms4Y8QMQ",
+ "createdAt": "2017-06-27T09:35:44.992Z",
+ "icon___NODE": "rocybtov1ozk___c6t4HKjytPi0mYgs240wkG___Asset",
+ "id": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:46:43.477Z",
+ "type": "ContentfulCategory",
+ },
+ "node_locale": "en-US",
+ "parent": "Category",
+ "product___NODE": Array [
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "6XwpTaSiiI2Ak2Ww0oi6qa",
+ "id": "c6XwpTaSiiI2Ak2Ww0oi6qa",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "title___NODE": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___EntrytitleTextNode",
+ "updatedAt": "2017-06-27T09:46:43.477Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___EntrytitleTextNode",
+ "internal": Object {
+ "content": "Toys",
+ "contentDigest": "2017-06-27T09:46:43.477Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryTitleTextNode",
+ },
+ "parent": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ "title": "Toys",
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription": "Shop for toys, games, educational aids",
+ "children": Array [],
+ "id": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___EntrycategoryDescriptionTextNode",
+ "internal": Object {
+ "content": "Shop for toys, games, educational aids",
+ "contentDigest": "2017-06-27T09:46:43.477Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryCategoryDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": null,
+ "displayField": "title",
+ "id": "Category",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:40:52.685Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Category",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription___NODE": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___decategoryDescriptionTextNode",
+ "children": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___detitleTextNode",
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___decategoryDescriptionTextNode",
+ ],
+ "contentful_id": "c7LAnCobuuWYSqks6wAwY2a",
+ "createdAt": "2017-06-27T09:35:44.000Z",
+ "icon___NODE": "rocybtov1ozk___c6m5AJ9vMPKc8OUoQeoCS4o___Asset___de",
+ "id": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___de",
+ "internal": Object {
+ "contentDigest": "2020-06-30T11:22:54.201Z",
+ "type": "ContentfulCategory",
+ },
+ "node_locale": "de",
+ "parent": "Category",
+ "product___NODE": Array [
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___de",
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___de",
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___de",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "6XwpTaSiiI2Ak2Ww0oi6qa",
+ "id": "c6XwpTaSiiI2Ak2Ww0oi6qa",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 4,
+ "type": "Entry",
+ },
+ "title___NODE": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___detitleTextNode",
+ "updatedAt": "2020-06-30T11:22:54.201Z",
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription___NODE": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___decategoryDescriptionTextNode",
+ "children": Array [
+ "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___detitleTextNode",
+ "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___decategoryDescriptionTextNode",
+ ],
+ "contentful_id": "c24DPGBDeGEaYy8ms4Y8QMQ",
+ "createdAt": "2017-06-27T09:35:44.992Z",
+ "icon___NODE": "rocybtov1ozk___c6t4HKjytPi0mYgs240wkG___Asset___de",
+ "id": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:46:43.477Z",
+ "type": "ContentfulCategory",
+ },
+ "node_locale": "de",
+ "parent": "Category",
+ "product___NODE": Array [
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___de",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "6XwpTaSiiI2Ak2Ww0oi6qa",
+ "id": "c6XwpTaSiiI2Ak2Ww0oi6qa",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "title___NODE": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___detitleTextNode",
+ "updatedAt": "2017-06-27T09:46:43.477Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___detitleTextNode",
+ "internal": Object {
+ "content": "Haus & Küche",
+ "contentDigest": "2020-06-30T11:22:54.201Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryTitleTextNode",
+ },
+ "parent": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ "title": "Haus & Küche",
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription": "Shop für Möbel, Bettwäsche, Bad, Staubsauger, Küchenprodukte und vieles mehr",
+ "children": Array [],
+ "id": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___decategoryDescriptionTextNode",
+ "internal": Object {
+ "content": "Shop für Möbel, Bettwäsche, Bad, Staubsauger, Küchenprodukte und vieles mehr",
+ "contentDigest": "2020-06-30T11:22:54.201Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryCategoryDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___detitleTextNode",
+ "internal": Object {
+ "content": "Spielzeug",
+ "contentDigest": "2017-06-27T09:46:43.477Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryTitleTextNode",
+ },
+ "parent": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ "title": "Spielzeug",
+ },
+ ],
+ Array [
+ Object {
+ "categoryDescription": "Spielzeugladen, Spiele, Lernhilfen",
+ "children": Array [],
+ "id": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___decategoryDescriptionTextNode",
+ "internal": Object {
+ "content": "Spielzeugladen, Spiele, Lernhilfen",
+ "contentDigest": "2017-06-27T09:46:43.477Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulCategoryCategoryDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": null,
+ "displayField": "companyName",
+ "id": "Brand",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:41:09.339Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Brand",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___EntrycompanyNameTextNode",
+ "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___EntrycompanyDescriptionTextNode",
+ ],
+ "companyDescription___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___EntrycompanyDescriptionTextNode",
+ "companyName___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___EntrycompanyNameTextNode",
+ "contentful_id": "c651CQ8rLoIYCeY6G0QG22q",
+ "createdAt": "2017-06-27T09:35:43.997Z",
+ "email": "normann@normann-copenhagen.com",
+ "id": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:55:16.820Z",
+ "type": "ContentfulBrand",
+ },
+ "logo___NODE": "rocybtov1ozk___c3wtvPBbBjiMKqKKga8I2Cu___Asset",
+ "node_locale": "en-US",
+ "parent": "Brand",
+ "phone": Array [
+ "+45 35 55 44 59",
+ ],
+ "product___NODE": Array [
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry",
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "sFzTZbSuM8coEwygeUYes",
+ "id": "sFzTZbSuM8coEwygeUYes",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "twitter": "https://twitter.com/NormannCPH",
+ "updatedAt": "2017-06-27T09:55:16.820Z",
+ "website": "http://www.normann-copenhagen.com/",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___EntrycompanyNameTextNode",
+ "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___EntrycompanyDescriptionTextNode",
+ ],
+ "companyDescription___NODE": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___EntrycompanyDescriptionTextNode",
+ "companyName___NODE": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___EntrycompanyNameTextNode",
+ "contentful_id": "c4LgMotpNF6W20YKmuemW0a",
+ "createdAt": "2017-06-27T09:35:44.396Z",
+ "email": "info@acgears.com",
+ "id": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:51:15.647Z",
+ "type": "ContentfulBrand",
+ },
+ "logo___NODE": "rocybtov1ozk___c2Y8LhXLnYAYqKCGEWG4EKI___Asset",
+ "node_locale": "en-US",
+ "parent": "Brand",
+ "phone": Array [
+ "+1 212 260 2269",
+ ],
+ "product___NODE": Array [
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "sFzTZbSuM8coEwygeUYes",
+ "id": "sFzTZbSuM8coEwygeUYes",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "updatedAt": "2017-06-27T09:51:15.647Z",
+ "website": "http://www.lemnos.jp/en/",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___EntrycompanyNameTextNode",
+ "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___EntrycompanyDescriptionTextNode",
+ ],
+ "companyDescription___NODE": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___EntrycompanyDescriptionTextNode",
+ "companyName___NODE": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___EntrycompanyNameTextNode",
+ "contentful_id": "JrePkDVYomE8AwcuCUyMi",
+ "createdAt": "2017-06-27T09:35:44.988Z",
+ "id": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:50:36.937Z",
+ "type": "ContentfulBrand",
+ },
+ "logo___NODE": "rocybtov1ozk___c4zj1ZOfHgQ8oqgaSKm4Qo2___Asset",
+ "node_locale": "en-US",
+ "parent": "Brand",
+ "product___NODE": Array [
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "sFzTZbSuM8coEwygeUYes",
+ "id": "sFzTZbSuM8coEwygeUYes",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "updatedAt": "2017-06-27T09:50:36.937Z",
+ "website": "http://playsam.com/",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyName": "Normann Copenhagen",
+ "id": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___EntrycompanyNameTextNode",
+ "internal": Object {
+ "content": "Normann Copenhagen",
+ "contentDigest": "2017-06-27T09:55:16.820Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyDescription": "Normann Copenhagen is a way of living - a mindset. We love to challenge the conventional design rules. This is why you will find traditional materials put into untraditional use such as a Stone Hook made of Icelandic stones, a vase made out of silicon and last but not least a dog made out of plastic.",
+ "id": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___EntrycompanyDescriptionTextNode",
+ "internal": Object {
+ "content": "Normann Copenhagen is a way of living - a mindset. We love to challenge the conventional design rules. This is why you will find traditional materials put into untraditional use such as a Stone Hook made of Icelandic stones, a vase made out of silicon and last but not least a dog made out of plastic.",
+ "contentDigest": "2017-06-27T09:55:16.820Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyName": "Lemnos",
+ "id": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___EntrycompanyNameTextNode",
+ "internal": Object {
+ "content": "Lemnos",
+ "contentDigest": "2017-06-27T09:51:15.647Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyDescription": "TAKATA Lemnos Inc. was founded in 1947 as a brass casting manufacturing industry in Takaoka-city, Toyama Prefecture, Japan and we launched out into the full-scale business trade with Seiko Clock Co., Ltd. since 1966.
+
+We entered into the development for the original planning from late 1980 and \\"Lemnos Brand\\" recognized as the global design clock by a masterpiece \\"HOLA\\" designed by Kazuo KAWASAKI which released in 1989.
+
+Afterwards, we made a lot of projects with well-known designers who took in active in Japan and overseas such as Riki WATANABE, Kazuo KAWASAKI, Shin AZUMI, Tomoko AZUMI, Kanae TSUKAMOTO etc. and we made announcement of their fine works abounding in artistry and prominent designs. In addition, we realized to make a special project by the collaboration with Andrea Branzi, a well-known architect in the world.
+
+Lemnos brand products are now highly praised from the design shops and the interior shops all over the world.
+
+In recent years, we also have been given high priority to develop interior accessories making full use of our traditional techniques by the founding manufacturer and we always focus our minds on the development for the new Lemnos products in the new market.
+
+Our Lemnos products are made carefully by our craftsmen finely honed skillful techniques in Japan. They surely bring out the attractiveness of the materials to the maximum and create fine products not being influenced on the fashion trend accordingly. TAKATA Lemnos Inc. definitely would like to be innovative and continuously propose the beauty lasts forever.",
+ "id": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___EntrycompanyDescriptionTextNode",
+ "internal": Object {
+ "content": "TAKATA Lemnos Inc. was founded in 1947 as a brass casting manufacturing industry in Takaoka-city, Toyama Prefecture, Japan and we launched out into the full-scale business trade with Seiko Clock Co., Ltd. since 1966.
+
+We entered into the development for the original planning from late 1980 and \\"Lemnos Brand\\" recognized as the global design clock by a masterpiece \\"HOLA\\" designed by Kazuo KAWASAKI which released in 1989.
+
+Afterwards, we made a lot of projects with well-known designers who took in active in Japan and overseas such as Riki WATANABE, Kazuo KAWASAKI, Shin AZUMI, Tomoko AZUMI, Kanae TSUKAMOTO etc. and we made announcement of their fine works abounding in artistry and prominent designs. In addition, we realized to make a special project by the collaboration with Andrea Branzi, a well-known architect in the world.
+
+Lemnos brand products are now highly praised from the design shops and the interior shops all over the world.
+
+In recent years, we also have been given high priority to develop interior accessories making full use of our traditional techniques by the founding manufacturer and we always focus our minds on the development for the new Lemnos products in the new market.
+
+Our Lemnos products are made carefully by our craftsmen finely honed skillful techniques in Japan. They surely bring out the attractiveness of the materials to the maximum and create fine products not being influenced on the fashion trend accordingly. TAKATA Lemnos Inc. definitely would like to be innovative and continuously propose the beauty lasts forever.",
+ "contentDigest": "2017-06-27T09:51:15.647Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyName": "Playsam",
+ "id": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___EntrycompanyNameTextNode",
+ "internal": Object {
+ "content": "Playsam",
+ "contentDigest": "2017-06-27T09:50:36.937Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyNameTextNode",
+ },
+ "parent": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyDescription": "Playsam is the leading Scandinavian design company for executive wooden toy gift. Scandinavian design playful creativity, integrity and sophistication are Playsam. Scandinavian design and wooden toy makes Playsam gift lovely to the world of design since 1984.",
+ "id": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___EntrycompanyDescriptionTextNode",
+ "internal": Object {
+ "content": "Playsam is the leading Scandinavian design company for executive wooden toy gift. Scandinavian design playful creativity, integrity and sophistication are Playsam. Scandinavian design and wooden toy makes Playsam gift lovely to the world of design since 1984.",
+ "contentDigest": "2017-06-27T09:50:36.937Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": null,
+ "displayField": "companyName",
+ "id": "Brand",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:41:09.339Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Brand",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___decompanyNameTextNode",
+ "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___decompanyDescriptionTextNode",
+ ],
+ "companyDescription___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___decompanyDescriptionTextNode",
+ "companyName___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___decompanyNameTextNode",
+ "contentful_id": "c651CQ8rLoIYCeY6G0QG22q",
+ "createdAt": "2017-06-27T09:35:43.997Z",
+ "email": "normann@normann-copenhagen.com",
+ "id": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:55:16.820Z",
+ "type": "ContentfulBrand",
+ },
+ "logo___NODE": "rocybtov1ozk___c3wtvPBbBjiMKqKKga8I2Cu___Asset___de",
+ "node_locale": "de",
+ "parent": "Brand",
+ "phone": Array [
+ "+45 35 55 44 59",
+ ],
+ "product___NODE": Array [
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___de",
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___de",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "sFzTZbSuM8coEwygeUYes",
+ "id": "sFzTZbSuM8coEwygeUYes",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "twitter": "https://twitter.com/NormannCPH",
+ "updatedAt": "2017-06-27T09:55:16.820Z",
+ "website": "http://www.normann-copenhagen.com/",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___decompanyNameTextNode",
+ "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___decompanyDescriptionTextNode",
+ ],
+ "companyDescription___NODE": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___decompanyDescriptionTextNode",
+ "companyName___NODE": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___decompanyNameTextNode",
+ "contentful_id": "c4LgMotpNF6W20YKmuemW0a",
+ "createdAt": "2017-06-27T09:35:44.396Z",
+ "email": "info@acgears.com",
+ "id": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:51:15.647Z",
+ "type": "ContentfulBrand",
+ },
+ "logo___NODE": "rocybtov1ozk___c2Y8LhXLnYAYqKCGEWG4EKI___Asset___de",
+ "node_locale": "de",
+ "parent": "Brand",
+ "phone": Array [
+ "+1 212 260 2269",
+ ],
+ "product___NODE": Array [
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___de",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "sFzTZbSuM8coEwygeUYes",
+ "id": "sFzTZbSuM8coEwygeUYes",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "updatedAt": "2017-06-27T09:51:15.647Z",
+ "website": "http://www.lemnos.jp/en/",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___decompanyNameTextNode",
+ "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___decompanyDescriptionTextNode",
+ ],
+ "companyDescription___NODE": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___decompanyDescriptionTextNode",
+ "companyName___NODE": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___decompanyNameTextNode",
+ "contentful_id": "JrePkDVYomE8AwcuCUyMi",
+ "createdAt": "2017-06-27T09:35:44.988Z",
+ "id": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___de",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:50:36.937Z",
+ "type": "ContentfulBrand",
+ },
+ "logo___NODE": "rocybtov1ozk___c4zj1ZOfHgQ8oqgaSKm4Qo2___Asset___de",
+ "node_locale": "de",
+ "parent": "Brand",
+ "product___NODE": Array [
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___de",
+ ],
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "sFzTZbSuM8coEwygeUYes",
+ "id": "sFzTZbSuM8coEwygeUYes",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "updatedAt": "2017-06-27T09:50:36.937Z",
+ "website": "http://playsam.com/",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyName": "Normann Copenhagen",
+ "id": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___decompanyNameTextNode",
+ "internal": Object {
+ "content": "Normann Copenhagen",
+ "contentDigest": "2017-06-27T09:55:16.820Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyDescription": "Normann Kopenhagen ist eine Art zu leben - eine Denkweise. Wir lieben es, die konventionellen Designregeln herauszufordern. Aus diesem Grund finden Sie traditionelle Materialien, die in untraditionelle Verwendung wie ein Steinhaken aus isländischen Steinen, eine Vase aus Silizium und last but not least ein Hund aus Kunststoff.",
+ "id": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___decompanyDescriptionTextNode",
+ "internal": Object {
+ "content": "Normann Kopenhagen ist eine Art zu leben - eine Denkweise. Wir lieben es, die konventionellen Designregeln herauszufordern. Aus diesem Grund finden Sie traditionelle Materialien, die in untraditionelle Verwendung wie ein Steinhaken aus isländischen Steinen, eine Vase aus Silizium und last but not least ein Hund aus Kunststoff.",
+ "contentDigest": "2017-06-27T09:55:16.820Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyName": "Lemnos",
+ "id": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___decompanyNameTextNode",
+ "internal": Object {
+ "content": "Lemnos",
+ "contentDigest": "2017-06-27T09:51:15.647Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyDescription": "TAKATA Lemnos Inc. wurde im Jahre 1947 als Messing-Casting-Fertigungsindustrie in Takaoka-Stadt, Toyama Prefecture, Japan gegründet und wir starteten seit 1966 mit der Seiko Clock Co., Ltd.
+
+Wir haben die Entwicklung für die ursprüngliche Planung ab Ende 1980 eingegangen und \\"Lemnos Brand\\" wurde als globale Designuhr von einem Meisterwerk \\"HOLA\\" von Kazuo KAWASAKI entworfen, das 1989 erschien.
+
+Danach machten wir viele Projekte mit namhaften Designern, die in Japan und Übersee tätig waren, wie zB Riki WATANABE, Kazuo KAWASAKI, Shin AZUMI, Tomoko AZUMI, Kanae TSUKAMOTO etc. und wir kündigten ihre Werke in der Kunst an Und prominenten Designs. Darüber hinaus haben wir durch die Zusammenarbeit mit Andrea Branzi, einem bekannten Architekten der Welt, ein besonderes Projekt gemacht.
+
+Lemnos Markenprodukte werden nun von den Designläden und den Innenhandelsgeschäften auf der ganzen Welt hoch gelobt.
+
+In den vergangenen Jahren haben wir auch eine hohe Priorität für die Entwicklung von Innenausstattung, die den traditionellen Techniken des Gründungsherstellers voll ausnutzt, und wir konzentrieren uns immer auf die Entwicklung der neuen Lemnos-Produkte im neuen Markt.
+
+Unsere Lemnos Produkte werden sorgfältig von unseren Handwerkern fein geschliffen geschickten Techniken in Japan gemacht. Sie bringen sicherlich die Attraktivität der Materialien auf das Maximum und schaffen feine Produkte nicht beeinflusst auf die Mode-Trend entsprechend. TAKATA Lemnos Inc. möchte definitiv innovativ sein und ständig vorschlagen, die Schönheit dauert ewig.",
+ "id": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___decompanyDescriptionTextNode",
+ "internal": Object {
+ "content": "TAKATA Lemnos Inc. wurde im Jahre 1947 als Messing-Casting-Fertigungsindustrie in Takaoka-Stadt, Toyama Prefecture, Japan gegründet und wir starteten seit 1966 mit der Seiko Clock Co., Ltd.
+
+Wir haben die Entwicklung für die ursprüngliche Planung ab Ende 1980 eingegangen und \\"Lemnos Brand\\" wurde als globale Designuhr von einem Meisterwerk \\"HOLA\\" von Kazuo KAWASAKI entworfen, das 1989 erschien.
+
+Danach machten wir viele Projekte mit namhaften Designern, die in Japan und Übersee tätig waren, wie zB Riki WATANABE, Kazuo KAWASAKI, Shin AZUMI, Tomoko AZUMI, Kanae TSUKAMOTO etc. und wir kündigten ihre Werke in der Kunst an Und prominenten Designs. Darüber hinaus haben wir durch die Zusammenarbeit mit Andrea Branzi, einem bekannten Architekten der Welt, ein besonderes Projekt gemacht.
+
+Lemnos Markenprodukte werden nun von den Designläden und den Innenhandelsgeschäften auf der ganzen Welt hoch gelobt.
+
+In den vergangenen Jahren haben wir auch eine hohe Priorität für die Entwicklung von Innenausstattung, die den traditionellen Techniken des Gründungsherstellers voll ausnutzt, und wir konzentrieren uns immer auf die Entwicklung der neuen Lemnos-Produkte im neuen Markt.
+
+Unsere Lemnos Produkte werden sorgfältig von unseren Handwerkern fein geschliffen geschickten Techniken in Japan gemacht. Sie bringen sicherlich die Attraktivität der Materialien auf das Maximum und schaffen feine Produkte nicht beeinflusst auf die Mode-Trend entsprechend. TAKATA Lemnos Inc. möchte definitiv innovativ sein und ständig vorschlagen, die Schönheit dauert ewig.",
+ "contentDigest": "2017-06-27T09:51:15.647Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyName": "Playsam",
+ "id": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___decompanyNameTextNode",
+ "internal": Object {
+ "content": "Playsam",
+ "contentDigest": "2017-06-27T09:50:36.937Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyNameTextNode",
+ },
+ "parent": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "companyDescription": "Playsam ist die führende skandinavische Designfirma für Executive Holzspielzeug Geschenk. Skandinavisches Design spielerische Kreativität, Integrität und Raffinesse sind Playsam. Skandinavisches Design und hölzernes Spielzeug macht Playsam Geschenk schön in die Welt des Designs seit 1984.",
+ "id": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___decompanyDescriptionTextNode",
+ "internal": Object {
+ "content": "Playsam ist die führende skandinavische Designfirma für Executive Holzspielzeug Geschenk. Skandinavisches Design spielerische Kreativität, Integrität und Raffinesse sind Playsam. Skandinavisches Design und hölzernes Spielzeug macht Playsam Geschenk schön in die Welt des Designs seit 1984.",
+ "contentDigest": "2017-06-27T09:50:36.937Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulBrandCompanyDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": null,
+ "displayField": "productName",
+ "id": "Product",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:40:36.821Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Product",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___EntryproductNameTextNode",
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___EntryproductDescriptionTextNode",
+ ],
+ "contentful_id": "c5KsDBWseXY6QegucYAoacS",
+ "createdAt": "2017-06-27T09:35:43.996Z",
+ "id": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry",
+ "image___NODE": Array [
+ "rocybtov1ozk___wtrHxeu3zEoEce2MokCSi___Asset",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:56:59.626Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "en-US",
+ "parent": "Product",
+ "price": 44,
+ "productDescription___NODE": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___EntryproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___EntryproductNameTextNode",
+ "quantity": 56,
+ "sizetypecolor": "Length: 135 mm | color: espresso, green, or icar (white)",
+ "sku": "B001R6JUZ2",
+ "slug": "playsam-streamliner-classic-car-espresso",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "wood",
+ "toy",
+ "car",
+ "sweden",
+ "design",
+ ],
+ "updatedAt": "2017-06-27T09:56:59.626Z",
+ "website": "http://www.amazon.com/dp/B001R6JUZ2/",
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___EntryproductNameTextNode",
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___EntryproductDescriptionTextNode",
+ ],
+ "contentful_id": "c3DVqIYj4dOwwcKu6sgqOgg",
+ "createdAt": "2017-06-27T09:35:44.006Z",
+ "id": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry",
+ "image___NODE": Array [
+ "rocybtov1ozk___Xc0ny7GWsMEMCeASWO2um___Asset",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:54:51.159Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "en-US",
+ "parent": "Product",
+ "price": 11,
+ "productDescription___NODE": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___EntryproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___EntryproductNameTextNode",
+ "quantity": 101,
+ "sizetypecolor": "3 x 3 x 5 inches; 5.3 ounces",
+ "sku": "B00E82D7I8",
+ "slug": "hudson-wall-cup",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "vase",
+ "flowers",
+ "accessories",
+ ],
+ "updatedAt": "2017-06-27T09:54:51.159Z",
+ "website": "http://www.amazon.com/dp/B00E82D7I8/",
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___EntryproductNameTextNode",
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___EntryproductDescriptionTextNode",
+ ],
+ "contentful_id": "c6dbjWqNd9SqccegcqYq224",
+ "createdAt": "2017-06-27T09:35:44.049Z",
+ "id": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry",
+ "image___NODE": Array [
+ "rocybtov1ozk___c10TkaLheGeQG6qQGqWYqUI___Asset",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:53:23.179Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "en-US",
+ "parent": "Product",
+ "price": 22,
+ "productDescription___NODE": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___EntryproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___EntryproductNameTextNode",
+ "quantity": 89,
+ "sizetypecolor": "0.8 x 0.8 x 11.2 inches; 1.6 ounces",
+ "sku": "B0081F2CCK",
+ "slug": "whisk-beater",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "kitchen",
+ "accessories",
+ "whisk",
+ "scandinavia",
+ "design",
+ ],
+ "updatedAt": "2017-06-27T09:53:23.179Z",
+ "website": "http://www.amazon.com/dp/B0081F2CCK/",
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___EntryproductNameTextNode",
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___EntryproductDescriptionTextNode",
+ ],
+ "contentful_id": "c4BqrajvA8E6qwgkieoqmqO",
+ "createdAt": "2017-06-27T09:35:44.130Z",
+ "id": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry",
+ "image___NODE": Array [
+ "rocybtov1ozk___KTRF62Q4gg60q6WCsWKw8___Asset",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:52:29.215Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "en-US",
+ "parent": "Product",
+ "price": 120,
+ "productDescription___NODE": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___EntryproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___EntryproductNameTextNode",
+ "quantity": 3,
+ "sizetypecolor": "10\\" x 2.2\\"",
+ "sku": "B00MG4ULK2",
+ "slug": "soso-wall-clock",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "home décor",
+ "clocks",
+ "interior design",
+ "yellow",
+ "gifts",
+ ],
+ "updatedAt": "2017-06-27T09:52:29.215Z",
+ "website": "http://store.dwell.com/soso-wall-clock.html",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___EntryproductNameTextNode",
+ "internal": Object {
+ "content": "Playsam Streamliner Classic Car, Espresso",
+ "contentDigest": "2017-06-27T09:56:59.626Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry",
+ "productName": "Playsam Streamliner Classic Car, Espresso",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___EntryproductDescriptionTextNode",
+ "internal": Object {
+ "content": "A classic Playsam design, the Streamliner Classic Car has been selected as Swedish Design Classic by the Swedish National Museum for its inventive style and sleek surface. It's no wonder that this wooden car has also been a long-standing favorite for children both big and small!",
+ "contentDigest": "2017-06-27T09:56:59.626Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry",
+ "productDescription": "A classic Playsam design, the Streamliner Classic Car has been selected as Swedish Design Classic by the Swedish National Museum for its inventive style and sleek surface. It's no wonder that this wooden car has also been a long-standing favorite for children both big and small!",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___EntryproductNameTextNode",
+ "internal": Object {
+ "content": "Hudson Wall Cup",
+ "contentDigest": "2017-06-27T09:54:51.159Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry",
+ "productName": "Hudson Wall Cup",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___EntryproductDescriptionTextNode",
+ "internal": Object {
+ "content": "Wall Hanging Glass Flower Vase and Terrarium",
+ "contentDigest": "2017-06-27T09:54:51.159Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry",
+ "productDescription": "Wall Hanging Glass Flower Vase and Terrarium",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___EntryproductNameTextNode",
+ "internal": Object {
+ "content": "Whisk Beater",
+ "contentDigest": "2017-06-27T09:53:23.179Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry",
+ "productName": "Whisk Beater",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___EntryproductDescriptionTextNode",
+ "internal": Object {
+ "content": "A creative little whisk that comes in 8 different colors. Handy and easy to clean after use. A great gift idea.",
+ "contentDigest": "2017-06-27T09:53:23.179Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry",
+ "productDescription": "A creative little whisk that comes in 8 different colors. Handy and easy to clean after use. A great gift idea.",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___EntryproductNameTextNode",
+ "internal": Object {
+ "content": "SoSo Wall Clock",
+ "contentDigest": "2017-06-27T09:52:29.215Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry",
+ "productName": "SoSo Wall Clock",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___EntryproductDescriptionTextNode",
+ "internal": Object {
+ "content": "The newly released SoSo Clock from Lemnos marries simple, clean design and bold, striking features. Its saturated marigold face is a lively pop of color to white or grey walls, but would also pair nicely with navy and maroon. Where most clocks feature numbers at the border of the clock, the SoSo brings them in tight to the middle, leaving a wide space between the numbers and the slight frame. The hour hand provides a nice interruption to the black and yellow of the clock - it is featured in a brilliant white. Despite its bold color and contrast, the SoSo maintains a clean, pure aesthetic that is suitable to a variety of contemporary interiors.",
+ "contentDigest": "2017-06-27T09:52:29.215Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry",
+ "productDescription": "The newly released SoSo Clock from Lemnos marries simple, clean design and bold, striking features. Its saturated marigold face is a lively pop of color to white or grey walls, but would also pair nicely with navy and maroon. Where most clocks feature numbers at the border of the clock, the SoSo brings them in tight to the middle, leaving a wide space between the numbers and the slight frame. The hour hand provides a nice interruption to the black and yellow of the clock - it is featured in a brilliant white. Despite its bold color and contrast, the SoSo maintains a clean, pure aesthetic that is suitable to a variety of contemporary interiors.",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": null,
+ "displayField": "productName",
+ "id": "Product",
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:40:36.821Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Product",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___JrePkDVYomE8AwcuCUyMi___Entry___de",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c24DPGBDeGEaYy8ms4Y8QMQ___Entry___de",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___deproductNameTextNode",
+ "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___deproductDescriptionTextNode",
+ ],
+ "contentful_id": "c5KsDBWseXY6QegucYAoacS",
+ "createdAt": "2017-06-27T09:35:43.996Z",
+ "id": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___de",
+ "image___NODE": Array [
+ "rocybtov1ozk___wtrHxeu3zEoEce2MokCSi___Asset___de",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:56:59.626Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "de",
+ "parent": "Product",
+ "price": 44,
+ "productDescription___NODE": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___deproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___deproductNameTextNode",
+ "quantity": 56,
+ "sizetypecolor": "Length: 135 mm | color: espresso, green, or icar (white)",
+ "sku": "B001R6JUZ2",
+ "slug": "playsam-streamliner-classic-car-espresso",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "wood",
+ "toy",
+ "car",
+ "sweden",
+ "design",
+ ],
+ "updatedAt": "2017-06-27T09:56:59.626Z",
+ "website": "http://www.amazon.com/dp/B001R6JUZ2/",
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___de",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___de",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___deproductNameTextNode",
+ "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___deproductDescriptionTextNode",
+ ],
+ "contentful_id": "c3DVqIYj4dOwwcKu6sgqOgg",
+ "createdAt": "2017-06-27T09:35:44.006Z",
+ "id": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___de",
+ "image___NODE": Array [
+ "rocybtov1ozk___Xc0ny7GWsMEMCeASWO2um___Asset___de",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:54:51.159Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "de",
+ "parent": "Product",
+ "price": 11,
+ "productDescription___NODE": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___deproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___deproductNameTextNode",
+ "quantity": 101,
+ "sizetypecolor": "3 x 3 x 5 inches; 5.3 ounces",
+ "sku": "B00E82D7I8",
+ "slug": "hudson-wall-cup",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "vase",
+ "flowers",
+ "accessories",
+ ],
+ "updatedAt": "2017-06-27T09:54:51.159Z",
+ "website": "http://www.amazon.com/dp/B00E82D7I8/",
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___c651CQ8rLoIYCeY6G0QG22q___Entry___de",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___de",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___deproductNameTextNode",
+ "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___deproductDescriptionTextNode",
+ ],
+ "contentful_id": "c6dbjWqNd9SqccegcqYq224",
+ "createdAt": "2017-06-27T09:35:44.049Z",
+ "id": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___de",
+ "image___NODE": Array [
+ "rocybtov1ozk___c10TkaLheGeQG6qQGqWYqUI___Asset___de",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:53:23.179Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "de",
+ "parent": "Product",
+ "price": 22,
+ "productDescription___NODE": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___deproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___deproductNameTextNode",
+ "quantity": 89,
+ "sizetypecolor": "0.8 x 0.8 x 11.2 inches; 1.6 ounces",
+ "sku": "B0081F2CCK",
+ "slug": "whisk-beater",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "kitchen",
+ "accessories",
+ "whisk",
+ "scandinavia",
+ "design",
+ ],
+ "updatedAt": "2017-06-27T09:53:23.179Z",
+ "website": "http://www.amazon.com/dp/B0081F2CCK/",
+ },
+ ],
+ Array [
+ Object {
+ "brand___NODE": "rocybtov1ozk___c4LgMotpNF6W20YKmuemW0a___Entry___de",
+ "categories___NODE": Array [
+ "rocybtov1ozk___c7LAnCobuuWYSqks6wAwY2a___Entry___de",
+ ],
+ "children": Array [
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___deproductNameTextNode",
+ "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___deproductDescriptionTextNode",
+ ],
+ "contentful_id": "c4BqrajvA8E6qwgkieoqmqO",
+ "createdAt": "2017-06-27T09:35:44.130Z",
+ "id": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___de",
+ "image___NODE": Array [
+ "rocybtov1ozk___KTRF62Q4gg60q6WCsWKw8___Asset___de",
+ ],
+ "internal": Object {
+ "contentDigest": "2017-06-27T09:52:29.215Z",
+ "type": "ContentfulProduct",
+ },
+ "node_locale": "de",
+ "parent": "Product",
+ "price": 120,
+ "productDescription___NODE": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___deproductDescriptionTextNode",
+ "productName___NODE": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___deproductNameTextNode",
+ "quantity": 3,
+ "sizetypecolor": "10\\" x 2.2\\"",
+ "sku": "B00MG4ULK2",
+ "slug": "soso-wall-clock",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "2PqfXUJwE8qSYKuM0U6w8M",
+ "id": "c2PqfXUJwE8qSYKuM0U6w8M",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 2,
+ "type": "Entry",
+ },
+ "tags": Array [
+ "home décor",
+ "clocks",
+ "interior design",
+ "yellow",
+ "gifts",
+ ],
+ "updatedAt": "2017-06-27T09:52:29.215Z",
+ "website": "http://store.dwell.com/soso-wall-clock.html",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___deproductNameTextNode",
+ "internal": Object {
+ "content": "Playsam Streamliner Klassisches Auto, Espresso",
+ "contentDigest": "2017-06-27T09:56:59.626Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___de",
+ "productName": "Playsam Streamliner Klassisches Auto, Espresso",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___deproductDescriptionTextNode",
+ "internal": Object {
+ "content": "Ein klassisches Playsam-Design, das Streamliner Classic Car wurde als Swedish Design Classic vom Schwedischen Nationalmuseum für seinen erfinderischen Stil und seine schlanke Oberfläche ausgewählt. Es ist kein Wunder, dass dieses hölzerne Auto auch ein langjähriger Liebling für Kinder gewesen ist, die groß und klein sind!",
+ "contentDigest": "2017-06-27T09:56:59.626Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c5KsDBWseXY6QegucYAoacS___Entry___de",
+ "productDescription": "Ein klassisches Playsam-Design, das Streamliner Classic Car wurde als Swedish Design Classic vom Schwedischen Nationalmuseum für seinen erfinderischen Stil und seine schlanke Oberfläche ausgewählt. Es ist kein Wunder, dass dieses hölzerne Auto auch ein langjähriger Liebling für Kinder gewesen ist, die groß und klein sind!",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___deproductNameTextNode",
+ "internal": Object {
+ "content": "Becher",
+ "contentDigest": "2017-06-27T09:54:51.159Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___de",
+ "productName": "Becher",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___deproductDescriptionTextNode",
+ "internal": Object {
+ "content": "Wand-hängende Glas-Blumen-Vase und Terrarium",
+ "contentDigest": "2017-06-27T09:54:51.159Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c3DVqIYj4dOwwcKu6sgqOgg___Entry___de",
+ "productDescription": "Wand-hängende Glas-Blumen-Vase und Terrarium",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___deproductNameTextNode",
+ "internal": Object {
+ "content": "Schneebesen",
+ "contentDigest": "2017-06-27T09:53:23.179Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___de",
+ "productName": "Schneebesen",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___deproductDescriptionTextNode",
+ "internal": Object {
+ "content": "Ein kreativer kleiner Schneebesen, der in 8 verschiedenen Farben kommt. Praktisch und nach dem Gebrauch leicht zu reinigen. Eine tolle Geschenkidee.",
+ "contentDigest": "2017-06-27T09:53:23.179Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c6dbjWqNd9SqccegcqYq224___Entry___de",
+ "productDescription": "Ein kreativer kleiner Schneebesen, der in 8 verschiedenen Farben kommt. Praktisch und nach dem Gebrauch leicht zu reinigen. Eine tolle Geschenkidee.",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___deproductNameTextNode",
+ "internal": Object {
+ "content": "SoSo wanduhr",
+ "contentDigest": "2017-06-27T09:52:29.215Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductNameTextNode",
+ },
+ "parent": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___de",
+ "productName": "SoSo wanduhr",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "id": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___deproductDescriptionTextNode",
+ "internal": Object {
+ "content": "Die neu veröffentlichte SoSo Clock von Lemnos heiratet einfaches, sauberes Design und fette, auffällige Features. Sein gesättigtes Ringelblumengesicht ist ein lebhafter Pop der Farbe zu den weißen oder grauen Wänden, aber würde auch gut mit Marine und kastanienbraun paaren. Wo die meisten Uhren am Rande der Uhr Nummern sind, bringt der SoSo sie in die Mitte und lässt einen weiten Raum zwischen den Zahlen und dem leichten Rahmen. Der Stundenzeiger bietet eine schöne Unterbrechung der schwarzen und gelben der Uhr - es ist in einem brillanten Weiß vorgestellt. Trotz seiner kräftigen Farbe und des Kontrastes behält der SoSo eine saubere, reine Ästhetik, die für eine Vielzahl von zeitgenössischen Interieurs geeignet ist.",
+ "contentDigest": "2017-06-27T09:52:29.215Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulProductProductDescriptionTextNode",
+ },
+ "parent": "rocybtov1ozk___c4BqrajvA8E6qwgkieoqmqO___Entry___de",
+ "productDescription": "Die neu veröffentlichte SoSo Clock von Lemnos heiratet einfaches, sauberes Design und fette, auffällige Features. Sein gesättigtes Ringelblumengesicht ist ein lebhafter Pop der Farbe zu den weißen oder grauen Wänden, aber würde auch gut mit Marine und kastanienbraun paaren. Wo die meisten Uhren am Rande der Uhr Nummern sind, bringt der SoSo sie in die Mitte und lässt einen weiten Raum zwischen den Zahlen und dem leichten Rahmen. Der Stundenzeiger bietet eine schöne Unterbrechung der schwarzen und gelben der Uhr - es ist in einem brillanten Weiß vorgestellt. Trotz seiner kräftigen Farbe und des Kontrastes behält der SoSo eine saubere, reine Ästhetik, die für eine Vielzahl von zeitgenössischen Interieurs geeignet ist.",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": "just for testing JSON fields",
+ "displayField": null,
+ "id": "JSON-test",
+ "internal": Object {
+ "contentDigest": "2018-08-13T14:21:13.985Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "JSON-test",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___EntryjsonTestJSONNode",
+ "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___EntryjsonStringTest0JSONNode",
+ ],
+ "contentful_id": "c71mfnH4QKsSsQmgoaQuq6O",
+ "createdAt": "2017-11-28T02:16:10.604Z",
+ "id": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry",
+ "internal": Object {
+ "contentDigest": "2018-08-13T14:27:12.458Z",
+ "type": "ContentfulJsonTest",
+ },
+ "jsonStringTest___NODE": Array [
+ "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___EntryjsonStringTest0JSONNode",
+ ],
+ "jsonTest___NODE": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___EntryjsonTestJSONNode",
+ "node_locale": "en-US",
+ "parent": "JSON-test",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "jsonTest",
+ "id": "jsonTest",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 4,
+ "type": "Entry",
+ },
+ "updatedAt": "2018-08-13T14:27:12.458Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "devDependencies": Object {
+ "babel-cli": "^6.26.0",
+ "babel-eslint": "^7.2.3",
+ "babel-jest": "^20.0.3",
+ "babel-plugin-add-module-exports": "^0.2.1",
+ "babel-plugin-lodash": "^3.2.11",
+ "babel-plugin-transform-async-to-generator": "^6.24.1",
+ "babel-plugin-transform-flow-strip-types": "^6.22.0",
+ "babel-plugin-transform-runtime": "^6.23.0",
+ "babel-preset-env": "^1.6.0",
+ "babel-preset-flow": "^6.23.0",
+ "babel-preset-react": "^6.24.1",
+ "babel-preset-stage-0": "^6.24.1",
+ "babel-register": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "chokidar": "^1.7.0",
+ "cross-env": "^5.0.5",
+ "eslint": "^4.5.0",
+ "eslint-config-google": "^0.9.1",
+ "eslint-config-prettier": "^2.5.0",
+ "eslint-plugin-flow-vars": "^0.5.0",
+ "eslint-plugin-flowtype": "^2.35.0",
+ "eslint-plugin-import": "^2.7.0",
+ "eslint-plugin-jsx-a11y": "^6.0.2",
+ "eslint-plugin-prettier": "^2.2.0",
+ "eslint-plugin-react": "^7.3.0",
+ "flow-bin": "^0.42.0",
+ "glob": "^7.1.1",
+ "jest": "^20.0.4",
+ "jest-cli": "^20.0.4",
+ "lerna": "^2.1.1",
+ "plop": "^1.8.1",
+ "prettier": "^1.7.0",
+ "prettier-eslint-cli": "4.2.x",
+ "remotedev-server": "^0.2.3",
+ "rimraf": "^2.6.1",
+ },
+ "engines": Object {
+ "yarn": "^1.2.1",
+ },
+ "eslintIgnore": Array [
+ "interfaces",
+ "**/__tests__/fixtures/",
+ ],
+ "id": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___EntryjsonTestJSONNode",
+ "internal": Object {
+ "content": "{\\"engines\\":{\\"yarn\\":\\"^1.2.1\\"},\\"private\\":true,\\"scripts\\":{\\"jest\\":\\"jest\\",\\"lint\\":\\"eslint --ext .js,.jsx packages/**/src\\",\\"plop\\":\\"plop\\",\\"test\\":\\"yarn lint && yarn jest\\",\\"lerna\\":\\"lerna\\",\\"watch\\":\\"lerna run watch --no-sort --stream --concurrency 999\\",\\"format\\":\\"npm run format-packages && npm run format-cache-dir && npm run format-www && npm run format-examples && npm run format-scripts\\",\\"publish\\":\\"lerna publish\\",\\"bootstrap\\":\\"yarn && npm run check-versions && lerna run prepublish\\",\\"lint:flow\\":\\"babel-node scripts/flow-check.js\\",\\"remotedev\\":\\"remotedev --hostname=localhost --port=19999\\",\\"test_bkup\\":\\"npm run lint && npm run test-node && npm run test-integration\\",\\"format-www\\":\\"prettier-eslint --write /\\"www/*.js/\\" /\\"www/src/**/*.js/\\"\\",\\"test:watch\\":\\"jest --watch\\",\\"test:update\\":\\"jest --updateSnapshot\\",\\"publish-next\\":\\"lerna publish --npm-tag=next\\",\\"check-versions\\":\\"babel-node scripts/check-versions.js\\",\\"format-scripts\\":\\"prettier-eslint --write /\\"scripts/**/*.js/\\"\\",\\"publish-canary\\":\\"lerna publish --canary --yes\\",\\"format-examples\\":\\"prettier-eslint --write /\\"examples/**/gatsby-node.js/\\" /\\"examples/**/gatsby-config.js/\\" /\\"examples/**/src/**/*.js/\\"\\",\\"format-packages\\":\\"prettier-eslint --write /\\"packages/*/src/**/*.js/\\"\\",\\"format-cache-dir\\":\\"prettier-eslint --write /\\"packages/gatsby/cache-dir/*.js/\\"\\"},\\"workspaces\\":[\\"packages/*\\"],\\"eslintIgnore\\":[\\"interfaces\\",\\"**/__tests__/fixtures/\\"],\\"devDependencies\\":{\\"glob\\":\\"^7.1.1\\",\\"jest\\":\\"^20.0.4\\",\\"plop\\":\\"^1.8.1\\",\\"lerna\\":\\"^2.1.1\\",\\"eslint\\":\\"^4.5.0\\",\\"rimraf\\":\\"^2.6.1\\",\\"chokidar\\":\\"^1.7.0\\",\\"flow-bin\\":\\"^0.42.0\\",\\"jest-cli\\":\\"^20.0.4\\",\\"prettier\\":\\"^1.7.0\\",\\"babel-cli\\":\\"^6.26.0\\",\\"cross-env\\":\\"^5.0.5\\",\\"babel-jest\\":\\"^20.0.3\\",\\"babel-eslint\\":\\"^7.2.3\\",\\"babel-runtime\\":\\"^6.26.0\\",\\"babel-register\\":\\"^6.26.0\\",\\"babel-preset-env\\":\\"^1.6.0\\",\\"remotedev-server\\":\\"^0.2.3\\",\\"babel-preset-flow\\":\\"^6.23.0\\",\\"babel-preset-react\\":\\"^6.24.1\\",\\"babel-plugin-lodash\\":\\"^3.2.11\\",\\"eslint-plugin-react\\":\\"^7.3.0\\",\\"prettier-eslint-cli\\":\\"4.2.x\\",\\"babel-preset-stage-0\\":\\"^6.24.1\\",\\"eslint-config-google\\":\\"^0.9.1\\",\\"eslint-plugin-import\\":\\"^2.7.0\\",\\"eslint-config-prettier\\":\\"^2.5.0\\",\\"eslint-plugin-flowtype\\":\\"^2.35.0\\",\\"eslint-plugin-jsx-a11y\\":\\"^6.0.2\\",\\"eslint-plugin-prettier\\":\\"^2.2.0\\",\\"eslint-plugin-flow-vars\\":\\"^0.5.0\\",\\"babel-plugin-transform-runtime\\":\\"^6.23.0\\",\\"babel-plugin-add-module-exports\\":\\"^0.2.1\\",\\"babel-plugin-transform-flow-strip-types\\":\\"^6.22.0\\",\\"babel-plugin-transform-async-to-generator\\":\\"^6.24.1\\"}}",
+ "contentDigest": "2018-08-13T14:27:12.458Z",
+ "mediaType": "application/json",
+ "type": "contentfulJsonTestJsonTestJsonNode",
+ },
+ "parent": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry",
+ "private": true,
+ "scripts": Object {
+ "bootstrap": "yarn && npm run check-versions && lerna run prepublish",
+ "check-versions": "babel-node scripts/check-versions.js",
+ "format": "npm run format-packages && npm run format-cache-dir && npm run format-www && npm run format-examples && npm run format-scripts",
+ "format-cache-dir": "prettier-eslint --write \\"packages/gatsby/cache-dir/*.js\\"",
+ "format-examples": "prettier-eslint --write \\"examples/**/gatsby-node.js\\" \\"examples/**/gatsby-config.js\\" \\"examples/**/src/**/*.js\\"",
+ "format-packages": "prettier-eslint --write \\"packages/*/src/**/*.js\\"",
+ "format-scripts": "prettier-eslint --write \\"scripts/**/*.js\\"",
+ "format-www": "prettier-eslint --write \\"www/*.js\\" \\"www/src/**/*.js\\"",
+ "jest": "jest",
+ "lerna": "lerna",
+ "lint": "eslint --ext .js,.jsx packages/**/src",
+ "lint:flow": "babel-node scripts/flow-check.js",
+ "plop": "plop",
+ "publish": "lerna publish",
+ "publish-canary": "lerna publish --canary --yes",
+ "publish-next": "lerna publish --npm-tag=next",
+ "remotedev": "remotedev --hostname=localhost --port=19999",
+ "test": "yarn lint && yarn jest",
+ "test:update": "jest --updateSnapshot",
+ "test:watch": "jest --watch",
+ "test_bkup": "npm run lint && npm run test-node && npm run test-integration",
+ "watch": "lerna run watch --no-sort --stream --concurrency 999",
+ },
+ "sys": Object {
+ "type": "Entry",
+ },
+ "workspaces": Array [
+ "packages/*",
+ ],
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "content": "test",
+ "id": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___EntryjsonStringTest0JSONNode",
+ "internal": Object {
+ "content": "\\"test\\"",
+ "contentDigest": "2018-08-13T14:27:12.458Z",
+ "mediaType": "application/json",
+ "type": "contentfulJsonTestJsonStringTestJsonNode",
+ },
+ "parent": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": "just for testing JSON fields",
+ "displayField": null,
+ "id": "JSON-test",
+ "internal": Object {
+ "contentDigest": "2018-08-13T14:21:13.985Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "JSON-test",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___dejsonTestJSONNode",
+ "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___dejsonStringTest0JSONNode",
+ ],
+ "contentful_id": "c71mfnH4QKsSsQmgoaQuq6O",
+ "createdAt": "2017-11-28T02:16:10.604Z",
+ "id": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___de",
+ "internal": Object {
+ "contentDigest": "2018-08-13T14:27:12.458Z",
+ "type": "ContentfulJsonTest",
+ },
+ "jsonStringTest___NODE": Array [
+ "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___dejsonStringTest0JSONNode",
+ ],
+ "jsonTest___NODE": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___dejsonTestJSONNode",
+ "node_locale": "de",
+ "parent": "JSON-test",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "jsonTest",
+ "id": "jsonTest",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 4,
+ "type": "Entry",
+ },
+ "updatedAt": "2018-08-13T14:27:12.458Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "devDependencies": Object {
+ "babel-cli": "^6.26.0",
+ "babel-eslint": "^7.2.3",
+ "babel-jest": "^20.0.3",
+ "babel-plugin-add-module-exports": "^0.2.1",
+ "babel-plugin-lodash": "^3.2.11",
+ "babel-plugin-transform-async-to-generator": "^6.24.1",
+ "babel-plugin-transform-flow-strip-types": "^6.22.0",
+ "babel-plugin-transform-runtime": "^6.23.0",
+ "babel-preset-env": "^1.6.0",
+ "babel-preset-flow": "^6.23.0",
+ "babel-preset-react": "^6.24.1",
+ "babel-preset-stage-0": "^6.24.1",
+ "babel-register": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "chokidar": "^1.7.0",
+ "cross-env": "^5.0.5",
+ "eslint": "^4.5.0",
+ "eslint-config-google": "^0.9.1",
+ "eslint-config-prettier": "^2.5.0",
+ "eslint-plugin-flow-vars": "^0.5.0",
+ "eslint-plugin-flowtype": "^2.35.0",
+ "eslint-plugin-import": "^2.7.0",
+ "eslint-plugin-jsx-a11y": "^6.0.2",
+ "eslint-plugin-prettier": "^2.2.0",
+ "eslint-plugin-react": "^7.3.0",
+ "flow-bin": "^0.42.0",
+ "glob": "^7.1.1",
+ "jest": "^20.0.4",
+ "jest-cli": "^20.0.4",
+ "lerna": "^2.1.1",
+ "plop": "^1.8.1",
+ "prettier": "^1.7.0",
+ "prettier-eslint-cli": "4.2.x",
+ "remotedev-server": "^0.2.3",
+ "rimraf": "^2.6.1",
+ },
+ "engines": Object {
+ "yarn": "^1.2.1",
+ },
+ "eslintIgnore": Array [
+ "interfaces",
+ "**/__tests__/fixtures/",
+ ],
+ "id": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___dejsonTestJSONNode",
+ "internal": Object {
+ "content": "{\\"engines\\":{\\"yarn\\":\\"^1.2.1\\"},\\"private\\":true,\\"scripts\\":{\\"jest\\":\\"jest\\",\\"lint\\":\\"eslint --ext .js,.jsx packages/**/src\\",\\"plop\\":\\"plop\\",\\"test\\":\\"yarn lint && yarn jest\\",\\"lerna\\":\\"lerna\\",\\"watch\\":\\"lerna run watch --no-sort --stream --concurrency 999\\",\\"format\\":\\"npm run format-packages && npm run format-cache-dir && npm run format-www && npm run format-examples && npm run format-scripts\\",\\"publish\\":\\"lerna publish\\",\\"bootstrap\\":\\"yarn && npm run check-versions && lerna run prepublish\\",\\"lint:flow\\":\\"babel-node scripts/flow-check.js\\",\\"remotedev\\":\\"remotedev --hostname=localhost --port=19999\\",\\"test_bkup\\":\\"npm run lint && npm run test-node && npm run test-integration\\",\\"format-www\\":\\"prettier-eslint --write /\\"www/*.js/\\" /\\"www/src/**/*.js/\\"\\",\\"test:watch\\":\\"jest --watch\\",\\"test:update\\":\\"jest --updateSnapshot\\",\\"publish-next\\":\\"lerna publish --npm-tag=next\\",\\"check-versions\\":\\"babel-node scripts/check-versions.js\\",\\"format-scripts\\":\\"prettier-eslint --write /\\"scripts/**/*.js/\\"\\",\\"publish-canary\\":\\"lerna publish --canary --yes\\",\\"format-examples\\":\\"prettier-eslint --write /\\"examples/**/gatsby-node.js/\\" /\\"examples/**/gatsby-config.js/\\" /\\"examples/**/src/**/*.js/\\"\\",\\"format-packages\\":\\"prettier-eslint --write /\\"packages/*/src/**/*.js/\\"\\",\\"format-cache-dir\\":\\"prettier-eslint --write /\\"packages/gatsby/cache-dir/*.js/\\"\\"},\\"workspaces\\":[\\"packages/*\\"],\\"eslintIgnore\\":[\\"interfaces\\",\\"**/__tests__/fixtures/\\"],\\"devDependencies\\":{\\"glob\\":\\"^7.1.1\\",\\"jest\\":\\"^20.0.4\\",\\"plop\\":\\"^1.8.1\\",\\"lerna\\":\\"^2.1.1\\",\\"eslint\\":\\"^4.5.0\\",\\"rimraf\\":\\"^2.6.1\\",\\"chokidar\\":\\"^1.7.0\\",\\"flow-bin\\":\\"^0.42.0\\",\\"jest-cli\\":\\"^20.0.4\\",\\"prettier\\":\\"^1.7.0\\",\\"babel-cli\\":\\"^6.26.0\\",\\"cross-env\\":\\"^5.0.5\\",\\"babel-jest\\":\\"^20.0.3\\",\\"babel-eslint\\":\\"^7.2.3\\",\\"babel-runtime\\":\\"^6.26.0\\",\\"babel-register\\":\\"^6.26.0\\",\\"babel-preset-env\\":\\"^1.6.0\\",\\"remotedev-server\\":\\"^0.2.3\\",\\"babel-preset-flow\\":\\"^6.23.0\\",\\"babel-preset-react\\":\\"^6.24.1\\",\\"babel-plugin-lodash\\":\\"^3.2.11\\",\\"eslint-plugin-react\\":\\"^7.3.0\\",\\"prettier-eslint-cli\\":\\"4.2.x\\",\\"babel-preset-stage-0\\":\\"^6.24.1\\",\\"eslint-config-google\\":\\"^0.9.1\\",\\"eslint-plugin-import\\":\\"^2.7.0\\",\\"eslint-config-prettier\\":\\"^2.5.0\\",\\"eslint-plugin-flowtype\\":\\"^2.35.0\\",\\"eslint-plugin-jsx-a11y\\":\\"^6.0.2\\",\\"eslint-plugin-prettier\\":\\"^2.2.0\\",\\"eslint-plugin-flow-vars\\":\\"^0.5.0\\",\\"babel-plugin-transform-runtime\\":\\"^6.23.0\\",\\"babel-plugin-add-module-exports\\":\\"^0.2.1\\",\\"babel-plugin-transform-flow-strip-types\\":\\"^6.22.0\\",\\"babel-plugin-transform-async-to-generator\\":\\"^6.24.1\\"}}",
+ "contentDigest": "2018-08-13T14:27:12.458Z",
+ "mediaType": "application/json",
+ "type": "contentfulJsonTestJsonTestJsonNode",
+ },
+ "parent": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___de",
+ "private": true,
+ "scripts": Object {
+ "bootstrap": "yarn && npm run check-versions && lerna run prepublish",
+ "check-versions": "babel-node scripts/check-versions.js",
+ "format": "npm run format-packages && npm run format-cache-dir && npm run format-www && npm run format-examples && npm run format-scripts",
+ "format-cache-dir": "prettier-eslint --write \\"packages/gatsby/cache-dir/*.js\\"",
+ "format-examples": "prettier-eslint --write \\"examples/**/gatsby-node.js\\" \\"examples/**/gatsby-config.js\\" \\"examples/**/src/**/*.js\\"",
+ "format-packages": "prettier-eslint --write \\"packages/*/src/**/*.js\\"",
+ "format-scripts": "prettier-eslint --write \\"scripts/**/*.js\\"",
+ "format-www": "prettier-eslint --write \\"www/*.js\\" \\"www/src/**/*.js\\"",
+ "jest": "jest",
+ "lerna": "lerna",
+ "lint": "eslint --ext .js,.jsx packages/**/src",
+ "lint:flow": "babel-node scripts/flow-check.js",
+ "plop": "plop",
+ "publish": "lerna publish",
+ "publish-canary": "lerna publish --canary --yes",
+ "publish-next": "lerna publish --npm-tag=next",
+ "remotedev": "remotedev --hostname=localhost --port=19999",
+ "test": "yarn lint && yarn jest",
+ "test:update": "jest --updateSnapshot",
+ "test:watch": "jest --watch",
+ "test_bkup": "npm run lint && npm run test-node && npm run test-integration",
+ "watch": "lerna run watch --no-sort --stream --concurrency 999",
+ },
+ "sys": Object {
+ "type": "Entry",
+ },
+ "workspaces": Array [
+ "packages/*",
+ ],
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "content": "test",
+ "id": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___dejsonStringTest0JSONNode",
+ "internal": Object {
+ "content": "\\"test\\"",
+ "contentDigest": "2018-08-13T14:27:12.458Z",
+ "mediaType": "application/json",
+ "type": "contentfulJsonTestJsonStringTestJsonNode",
+ },
+ "parent": "rocybtov1ozk___c71mfnH4QKsSsQmgoaQuq6O___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": "",
+ "displayField": "title",
+ "id": "Remark Test",
+ "internal": Object {
+ "contentDigest": "2018-05-28T08:43:09.218Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Remark Test",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___EntrycontentTextNode",
+ ],
+ "content___NODE": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___EntrycontentTextNode",
+ "contentful_id": "c4L2GhTsJtCseMYM8Wia64i",
+ "createdAt": "2018-05-28T08:49:06.230Z",
+ "id": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry",
+ "internal": Object {
+ "contentDigest": "2018-05-28T08:49:06.230Z",
+ "type": "ContentfulRemarkTest",
+ },
+ "node_locale": "en-US",
+ "parent": "Remark Test",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "remarkTest",
+ "id": "remarkTest",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 1,
+ "type": "Entry",
+ },
+ "title": "Contentful images inlined in Markdown",
+ "updatedAt": "2018-05-28T08:49:06.230Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "content": "## Toys
+
+
+
+## Chive
+
+
+
+## Playsam Streamliner
+
+
+
+## Whisk beaters
+
+
+
+## SoSo Wall Clock
+
+
+
+## Hudson Wall Cup
+
+",
+ "id": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___EntrycontentTextNode",
+ "internal": Object {
+ "content": "## Toys
+
+
+
+## Chive
+
+
+
+## Playsam Streamliner
+
+
+
+## Whisk beaters
+
+
+
+## SoSo Wall Clock
+
+
+
+## Hudson Wall Cup
+
+",
+ "contentDigest": "2018-05-28T08:49:06.230Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulRemarkTestContentTextNode",
+ },
+ "parent": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "description": "",
+ "displayField": "title",
+ "id": "Remark Test",
+ "internal": Object {
+ "contentDigest": "2018-05-28T08:43:09.218Z",
+ "type": "ContentfulContentType",
+ },
+ "name": "Remark Test",
+ "parent": null,
+ "sys": Object {
+ "type": "ContentType",
+ },
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [
+ "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry___decontentTextNode",
+ ],
+ "content___NODE": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry___decontentTextNode",
+ "contentful_id": "c4L2GhTsJtCseMYM8Wia64i",
+ "createdAt": "2018-05-28T08:49:06.230Z",
+ "id": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry___de",
+ "internal": Object {
+ "contentDigest": "2018-05-28T08:49:06.230Z",
+ "type": "ContentfulRemarkTest",
+ },
+ "node_locale": "de",
+ "parent": "Remark Test",
+ "spaceId": "rocybtov1ozk",
+ "sys": Object {
+ "contentType": Object {
+ "sys": Object {
+ "contentful_id": "remarkTest",
+ "id": "remarkTest",
+ "linkType": "ContentType",
+ "type": "Link",
+ },
+ },
+ "revision": 1,
+ "type": "Entry",
+ },
+ "title": "Contentful images inlined in Markdown",
+ "updatedAt": "2018-05-28T08:49:06.230Z",
+ },
+ ],
+ Array [
+ Object {
+ "children": Array [],
+ "content": "## Toys
+
+
+
+## Chive
+
+
+
+## Playsam Streamliner
+
+
+
+## Whisk beaters
+
+
+
+## SoSo Wall Clock
+
+
+
+## Hudson Wall Cup
+
+",
+ "id": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry___decontentTextNode",
+ "internal": Object {
+ "content": "## Toys
+
+
+
+## Chive
+
+
+
+## Playsam Streamliner
+
+
+
+## Whisk beaters
+
+
+
+## SoSo Wall Clock
+
+
+
+## Hudson Wall Cup
+
+",
+ "contentDigest": "2018-05-28T08:49:06.230Z",
+ "mediaType": "text/markdown",
+ "type": "contentfulRemarkTestContentTextNode",
+ },
+ "parent": "rocybtov1ozk___c4L2GhTsJtCseMYM8Wia64i___Entry___de",
+ "sys": Object {
+ "type": "Entry",
+ },
+ },
+ ],
+]
+`;
diff --git a/packages/gatsby-source-contentful/src/__tests__/normalize.js b/packages/gatsby-source-contentful/src/__tests__/normalize.js
index 41c9f8f5265bd..edcbbb8db6cca 100644
--- a/packages/gatsby-source-contentful/src/__tests__/normalize.js
+++ b/packages/gatsby-source-contentful/src/__tests__/normalize.js
@@ -57,6 +57,7 @@ describe(`Process contentful data (by name)`, () => {
it(`creates nodes for each entry`, () => {
const createNode = jest.fn()
const createNodeId = jest.fn(id => id)
+ const getNode = jest.fn(id => undefined) // All nodes are new
contentTypeItems.forEach((contentTypeItem, i) => {
normalize.createNodesForContentType({
contentTypeItem,
@@ -65,6 +66,7 @@ describe(`Process contentful data (by name)`, () => {
entries: entryList[i],
createNode,
createNodeId,
+ getNode,
resolvable,
foreignReferenceMap,
defaultLocale,
@@ -74,6 +76,177 @@ describe(`Process contentful data (by name)`, () => {
})
})
expect(createNode.mock.calls).toMatchSnapshot()
+
+ // Relevant to compare to compare warm and cold situation. Actual number not relevant.
+ expect(createNode.mock.calls.length).toBe(74) // "cold build entries" count
+ })
+
+ it(`creates nodes for each asset`, () => {
+ const createNode = jest.fn()
+ const createNodeId = jest.fn(id => id)
+ const assets = currentSyncData.assets
+ assets.forEach(assetItem => {
+ normalize.createAssetNodes({
+ assetItem,
+ createNode,
+ createNodeId,
+ defaultLocale,
+ locales,
+ space,
+ })
+ })
+ expect(createNode.mock.calls).toMatchSnapshot()
+ })
+})
+
+describe(`Skip existing nodes in warm build`, () => {
+ it(`creates nodes for each entry`, () => {
+ let entryList = normalize.buildEntryList({
+ mergedSyncData: currentSyncData,
+ contentTypeItems,
+ })
+
+ let resolvable = normalize.buildResolvableSet({
+ assets: currentSyncData.assets,
+ entryList,
+ defaultLocale,
+ locales,
+ })
+
+ let foreignReferenceMap = normalize.buildForeignReferenceMap({
+ contentTypeItems,
+ entryList,
+ resolvable,
+ defaultLocale,
+ locales,
+ space,
+ useNameForId: true,
+ })
+
+ const createNode = jest.fn()
+ const createNodeId = jest.fn(id => id)
+ let doReturn = true
+ const getNode = jest.fn(id => {
+ if (doReturn) {
+ doReturn = false
+ // Note: the relevant part for this test is that the same digest is returned
+ // so it skips generating the node and any of its children. Actual shape of
+ // returned is not relevant to test so update if anything breaks.
+ return {
+ id,
+ internal: { contentDigest: entryList[0][0].sys.updatedAt },
+ }
+ }
+ // All other nodes are new ("unknown")
+ return undefined
+ })
+ contentTypeItems.forEach((contentTypeItem, i) => {
+ normalize.createNodesForContentType({
+ contentTypeItem,
+ restrictedNodeFields,
+ conflictFieldPrefix,
+ entries: entryList[i],
+ createNode,
+ createNodeId,
+ getNode,
+ resolvable,
+ foreignReferenceMap,
+ defaultLocale,
+ locales,
+ space,
+ useNameForId: true,
+ })
+ })
+ expect(createNode.mock.calls).toMatchSnapshot()
+
+ // Relevant to compare to compare warm and cold situation. Actual number not relevant.
+ // This number ought to be less than the cold build
+ expect(createNode.mock.calls.length).toBe(71) // "warm build where entry was not changed" count
+ })
+
+ it(`creates nodes for each asset`, () => {
+ const createNode = jest.fn()
+ const createNodeId = jest.fn(id => id)
+ const assets = currentSyncData.assets
+ assets.forEach(assetItem => {
+ normalize.createAssetNodes({
+ assetItem,
+ createNode,
+ createNodeId,
+ defaultLocale,
+ locales,
+ space,
+ })
+ })
+ expect(createNode.mock.calls).toMatchSnapshot()
+ })
+})
+
+describe(`Process existing mutated nodes in warm build`, () => {
+ it(`creates nodes for each entry`, () => {
+ let entryList = normalize.buildEntryList({
+ mergedSyncData: currentSyncData,
+ contentTypeItems,
+ })
+
+ let resolvable = normalize.buildResolvableSet({
+ assets: currentSyncData.assets,
+ entryList,
+ defaultLocale,
+ locales,
+ })
+
+ let foreignReferenceMap = normalize.buildForeignReferenceMap({
+ contentTypeItems,
+ entryList,
+ resolvable,
+ defaultLocale,
+ locales,
+ space,
+ useNameForId: true,
+ })
+
+ const createNode = jest.fn()
+ const createNodeId = jest.fn(id => id)
+ let doReturn = true
+ const getNode = jest.fn(id => {
+ if (doReturn) {
+ doReturn = false
+ // Note: the relevant part for this test is that the same digest is returned
+ // so it skips generating the node and any of its children. Actual shape of
+ // returned is not relevant to test so update if anything breaks.
+ return {
+ id,
+ internal: {
+ contentDigest: entryList[0][0].sys.updatedAt + `changed`,
+ },
+ }
+ }
+ // All other nodes are new ("unknown")
+ return undefined
+ })
+ contentTypeItems.forEach((contentTypeItem, i) => {
+ normalize.createNodesForContentType({
+ contentTypeItem,
+ restrictedNodeFields,
+ conflictFieldPrefix,
+ entries: entryList[i],
+ createNode,
+ createNodeId,
+ getNode,
+ resolvable,
+ foreignReferenceMap,
+ defaultLocale,
+ locales,
+ space,
+ useNameForId: true,
+ })
+ })
+ expect(createNode.mock.calls).toMatchSnapshot()
+
+ // Relevant to compare to compare warm and cold situation. Actual number not relevant.
+ // This number ought to be the same as the cold build
+ expect(createNode.mock.calls.length).toBe(74) // "warm build where entry was changed" count
})
it(`creates nodes for each asset`, () => {
@@ -133,6 +306,7 @@ describe(`Process contentful data (by id)`, () => {
it(`creates nodes for each entry`, () => {
const createNode = jest.fn()
const createNodeId = jest.fn(id => id)
+ const getNode = jest.fn(id => undefined) // All nodes are new
contentTypeItems.forEach((contentTypeItem, i) => {
normalize.createNodesForContentType({
contentTypeItem,
@@ -141,6 +315,7 @@ describe(`Process contentful data (by id)`, () => {
entries: entryList[i],
createNode,
createNodeId,
+ getNode,
resolvable,
foreignReferenceMap,
defaultLocale,
diff --git a/packages/gatsby-source-contentful/src/gatsby-node.js b/packages/gatsby-source-contentful/src/gatsby-node.js
index 71e4b69c6bbc9..6e4ed0c5bfae8 100644
--- a/packages/gatsby-source-contentful/src/gatsby-node.js
+++ b/packages/gatsby-source-contentful/src/gatsby-node.js
@@ -589,6 +589,7 @@ exports.sourceNodes = async (
entries: entryList[i],
createNode,
createNodeId,
+ getNode,
resolvable,
foreignReferenceMap,
defaultLocale,
diff --git a/packages/gatsby-source-contentful/src/normalize.js b/packages/gatsby-source-contentful/src/normalize.js
index 9c5a5681a09d0..72a6468e341a7 100644
--- a/packages/gatsby-source-contentful/src/normalize.js
+++ b/packages/gatsby-source-contentful/src/normalize.js
@@ -180,10 +180,10 @@ exports.buildForeignReferenceMap = ({
return foreignReferenceMap
}
-function prepareTextNode(node, key, text, createNodeId) {
+function prepareTextNode(id, node, key, text) {
const str = _.isString(text) ? text : ``
const textNode = {
- id: createNodeId(`${node.id}${key}TextNode`),
+ id,
parent: node.id,
children: [],
[key]: str,
@@ -199,16 +199,16 @@ function prepareTextNode(node, key, text, createNodeId) {
},
}
- node.children = node.children.concat([textNode.id])
+ node.children = node.children.concat([id])
return textNode
}
-function prepareJSONNode(node, key, content, createNodeId, i = ``) {
+function prepareJSONNode(id, node, key, content) {
const str = JSON.stringify(content)
const JSONNode = {
...(_.isPlainObject(content) ? { ...content } : { content: content }),
- id: createNodeId(`${node.id}${key}${i}JSONNode`),
+ id,
parent: node.id,
children: [],
internal: {
@@ -223,7 +223,7 @@ function prepareJSONNode(node, key, content, createNodeId, i = ``) {
},
}
- node.children = node.children.concat([JSONNode.id])
+ node.children = node.children.concat([id])
return JSONNode
}
@@ -236,6 +236,7 @@ exports.createNodesForContentType = ({
entries,
createNode,
createNodeId,
+ getNode,
resolvable,
foreignReferenceMap,
defaultLocale,
@@ -281,257 +282,318 @@ exports.createNodesForContentType = ({
const childrenNodes = []
// First create nodes for each of the entries of that content type
- const entryNodes = entries.map(entryItem => {
- // Get localized fields.
- const entryItemFields = _.mapValues(entryItem.fields, (v, k) => {
- const fieldProps = contentTypeItem.fields.find(field => field.id === k)
+ const entryNodes = entries
+ .map(entryItem => {
+ const entryNodeId = mId(
+ space.sys.id,
+ entryItem.sys.id,
+ entryItem.sys.type
+ )
- const localizedField = fieldProps.localized
- ? getField(v)
- : v[defaultLocale]
+ const existingNode = getNode(entryNodeId)
+ if (existingNode?.internal?.contentDigest === entryItem.sys.updatedAt) {
+ // The Contentful model has `.sys.updatedAt` leading for an entry. If the updatedAt value
+ // of an entry did not change, then we can trust that none of its children were changed either.
+ return null
+ }
- return localizedField
- })
+ // Get localized fields.
+ const entryItemFields = _.mapValues(entryItem.fields, (v, k) => {
+ const fieldProps = contentTypeItem.fields.find(
+ field => field.id === k
+ )
- // Prefix any conflicting fields
- // https://github.com/gatsbyjs/gatsby/pull/1084#pullrequestreview-41662888
- conflictFields.forEach(conflictField => {
- entryItemFields[`${conflictFieldPrefix}${conflictField}`] =
- entryItemFields[conflictField]
- delete entryItemFields[conflictField]
- })
+ const localizedField = fieldProps.localized
+ ? getField(v)
+ : v[defaultLocale]
- // Add linkages to other nodes based on foreign references
- Object.keys(entryItemFields).forEach(entryItemFieldKey => {
- if (entryItemFields[entryItemFieldKey]) {
- const entryItemFieldValue = entryItemFields[entryItemFieldKey]
- if (Array.isArray(entryItemFieldValue)) {
- if (
- entryItemFieldValue[0] &&
- entryItemFieldValue[0].sys &&
- entryItemFieldValue[0].sys.type &&
- entryItemFieldValue[0].sys.id
+ return localizedField
+ })
+
+ // Prefix any conflicting fields
+ // https://github.com/gatsbyjs/gatsby/pull/1084#pullrequestreview-41662888
+ conflictFields.forEach(conflictField => {
+ entryItemFields[`${conflictFieldPrefix}${conflictField}`] =
+ entryItemFields[conflictField]
+ delete entryItemFields[conflictField]
+ })
+
+ // Add linkages to other nodes based on foreign references
+ Object.keys(entryItemFields).forEach(entryItemFieldKey => {
+ if (entryItemFields[entryItemFieldKey]) {
+ const entryItemFieldValue = entryItemFields[entryItemFieldKey]
+ if (Array.isArray(entryItemFieldValue)) {
+ if (
+ entryItemFieldValue[0] &&
+ entryItemFieldValue[0].sys &&
+ entryItemFieldValue[0].sys.type &&
+ entryItemFieldValue[0].sys.id
+ ) {
+ // Check if there are any values in entryItemFieldValue to prevent
+ // creating an empty node field in case when original key field value
+ // is empty due to links to missing entities
+ const resolvableEntryItemFieldValue = entryItemFieldValue
+ .filter(function (v) {
+ return resolvable.has(
+ `${v.sys.id}___${v.sys.linkType || v.sys.type}`
+ )
+ })
+ .map(function (v) {
+ return mId(
+ space.sys.id,
+ v.sys.id,
+ v.sys.linkType || v.sys.type
+ )
+ })
+ if (resolvableEntryItemFieldValue.length !== 0) {
+ entryItemFields[
+ `${entryItemFieldKey}___NODE`
+ ] = resolvableEntryItemFieldValue
+ }
+
+ delete entryItemFields[entryItemFieldKey]
+ }
+ } else if (
+ entryItemFieldValue &&
+ entryItemFieldValue.sys &&
+ entryItemFieldValue.sys.type &&
+ entryItemFieldValue.sys.id
) {
- // Check if there are any values in entryItemFieldValue to prevent
- // creating an empty node field in case when original key field value
- // is empty due to links to missing entities
- const resolvableEntryItemFieldValue = entryItemFieldValue
- .filter(function (v) {
- return resolvable.has(
- `${v.sys.id}___${v.sys.linkType || v.sys.type}`
- )
- })
- .map(function (v) {
- return mId(
- space.sys.id,
- v.sys.id,
- v.sys.linkType || v.sys.type
- )
- })
- if (resolvableEntryItemFieldValue.length !== 0) {
- entryItemFields[
- `${entryItemFieldKey}___NODE`
- ] = resolvableEntryItemFieldValue
+ if (
+ resolvable.has(
+ `${entryItemFieldValue.sys.id}___${
+ entryItemFieldValue.sys.linkType ||
+ entryItemFieldValue.sys.type
+ }`
+ )
+ ) {
+ entryItemFields[`${entryItemFieldKey}___NODE`] = mId(
+ space.sys.id,
+ entryItemFieldValue.sys.id,
+ entryItemFieldValue.sys.linkType ||
+ entryItemFieldValue.sys.type
+ )
}
-
delete entryItemFields[entryItemFieldKey]
}
- } else if (
- entryItemFieldValue &&
- entryItemFieldValue.sys &&
- entryItemFieldValue.sys.type &&
- entryItemFieldValue.sys.id
- ) {
- if (
- resolvable.has(
- `${entryItemFieldValue.sys.id}___${
- entryItemFieldValue.sys.linkType ||
- entryItemFieldValue.sys.type
- }`
- )
- ) {
- entryItemFields[`${entryItemFieldKey}___NODE`] = mId(
- space.sys.id,
- entryItemFieldValue.sys.id,
- entryItemFieldValue.sys.linkType || entryItemFieldValue.sys.type
- )
- }
- delete entryItemFields[entryItemFieldKey]
}
- }
- })
+ })
- // Add reverse linkages if there are any for this node
- const foreignReferences =
- foreignReferenceMap[`${entryItem.sys.id}___${entryItem.sys.type}`]
- if (foreignReferences) {
- foreignReferences.forEach(foreignReference => {
- const existingReference = entryItemFields[foreignReference.name]
- if (existingReference) {
- // If the existing reference is a string, we're dealing with a
- // many-to-one reference which has already been recorded, so we can
- // skip it. However, if it is an array, add it:
- if (Array.isArray(existingReference)) {
- entryItemFields[foreignReference.name].push(
+ // Add reverse linkages if there are any for this node
+ const foreignReferences =
+ foreignReferenceMap[`${entryItem.sys.id}___${entryItem.sys.type}`]
+ if (foreignReferences) {
+ foreignReferences.forEach(foreignReference => {
+ const existingReference = entryItemFields[foreignReference.name]
+ if (existingReference) {
+ // If the existing reference is a string, we're dealing with a
+ // many-to-one reference which has already been recorded, so we can
+ // skip it. However, if it is an array, add it:
+ if (Array.isArray(existingReference)) {
+ entryItemFields[foreignReference.name].push(
+ mId(
+ foreignReference.spaceId,
+ foreignReference.id,
+ foreignReference.type
+ )
+ )
+ }
+ } else {
+ // If there is one foreign reference, there can be many.
+ // Best to be safe and put it in an array to start with.
+ entryItemFields[foreignReference.name] = [
mId(
foreignReference.spaceId,
foreignReference.id,
foreignReference.type
- )
- )
+ ),
+ ]
}
- } else {
- // If there is one foreign reference, there can be many.
- // Best to be safe and put it in an array to start with.
- entryItemFields[foreignReference.name] = [
- mId(
- foreignReference.spaceId,
- foreignReference.id,
- foreignReference.type
- ),
- ]
- }
- })
- }
-
- let entryNode = {
- id: mId(space.sys.id, entryItem.sys.id, entryItem.sys.type),
- spaceId: space.sys.id,
- contentful_id: entryItem.sys.id,
- createdAt: entryItem.sys.createdAt,
- updatedAt: entryItem.sys.updatedAt,
- parent: contentTypeItemId,
- children: [],
- internal: {
- type: `${makeTypeName(contentTypeItemId)}`,
- },
- sys: {
- type: entryItem.sys.type,
- },
- }
+ })
+ }
- // Revision applies to entries, assets, and content types
- if (entryItem.sys.revision) {
- entryNode.sys.revision = entryItem.sys.revision
- }
+ let entryNode = {
+ id: entryNodeId,
+ spaceId: space.sys.id,
+ contentful_id: entryItem.sys.id,
+ createdAt: entryItem.sys.createdAt,
+ updatedAt: entryItem.sys.updatedAt,
+ parent: contentTypeItemId,
+ children: [],
+ internal: {
+ type: `${makeTypeName(contentTypeItemId)}`,
+ },
+ sys: {
+ type: entryItem.sys.type,
+ },
+ }
- // Content type applies to entries only
- if (entryItem.sys.contentType) {
- entryNode.sys.contentType = entryItem.sys.contentType
- }
+ // Revision applies to entries, assets, and content types
+ if (entryItem.sys.revision) {
+ entryNode.sys.revision = entryItem.sys.revision
+ }
- // Replace text fields with text nodes so we can process their markdown
- // into HTML.
- Object.keys(entryItemFields).forEach(entryItemFieldKey => {
- // Ignore fields with "___node" as they're already handled
- // and won't be a text field.
- if (entryItemFieldKey.split(`___`).length > 1) {
- return
+ // Content type applies to entries only
+ if (entryItem.sys.contentType) {
+ entryNode.sys.contentType = entryItem.sys.contentType
}
- const fieldType = contentTypeItem.fields.find(
- f =>
- (restrictedNodeFields.includes(f.id)
- ? `${conflictFieldPrefix}${f.id}`
- : f.id) === entryItemFieldKey
- ).type
- if (fieldType === `Text`) {
- const textNode = prepareTextNode(
- entryNode,
- entryItemFieldKey,
- entryItemFields[entryItemFieldKey],
- createNodeId
- )
+ // Replace text fields with text nodes so we can process their markdown
+ // into HTML.
+ Object.keys(entryItemFields).forEach(entryItemFieldKey => {
+ // Ignore fields with "___node" as they're already handled
+ // and won't be a text field.
+ if (entryItemFieldKey.includes(`___`)) {
+ return
+ }
+
+ const fieldType = contentTypeItem.fields.find(
+ f =>
+ (restrictedNodeFields.includes(f.id)
+ ? `${conflictFieldPrefix}${f.id}`
+ : f.id) === entryItemFieldKey
+ ).type
+ if (fieldType === `Text`) {
+ const textNodeId = createNodeId(
+ `${entryNodeId}${entryItemFieldKey}TextNode`
+ )
+
+ // The Contentful model has `.sys.updatedAt` leading for an entry. If the updatedAt value
+ // of an entry did not change, then we can trust that none of its children were changed either.
+ // (That's why child nodes use the updatedAt of the parent node as their digest, too)
+ const existingNode = getNode(textNodeId)
+ if (
+ existingNode?.internal?.contentDigest !== entryItem.sys.updatedAt
+ ) {
+ const textNode = prepareTextNode(
+ textNodeId,
+ entryNode,
+ entryItemFieldKey,
+ entryItemFields[entryItemFieldKey],
+ createNodeId
+ )
+
+ childrenNodes.push(textNode)
+ }
- childrenNodes.push(textNode)
- entryItemFields[`${entryItemFieldKey}___NODE`] = textNode.id
-
- delete entryItemFields[entryItemFieldKey]
- } else if (
- fieldType === `RichText` &&
- _.isPlainObject(entryItemFields[entryItemFieldKey])
- ) {
- const fieldValue = entryItemFields[entryItemFieldKey]
-
- const rawReferences = []
-
- // Locate all Contentful Links within the rich text data
- const traverse = obj => {
- for (let k in obj) {
- const v = obj[k]
- if (v && v.sys && v.sys.type === `Link`) {
- rawReferences.push(v)
- } else if (v && typeof v === `object`) {
- traverse(v)
+ entryItemFields[`${entryItemFieldKey}___NODE`] = textNodeId
+ delete entryItemFields[entryItemFieldKey]
+ } else if (
+ fieldType === `RichText` &&
+ _.isPlainObject(entryItemFields[entryItemFieldKey])
+ ) {
+ const fieldValue = entryItemFields[entryItemFieldKey]
+
+ const rawReferences = []
+
+ // Locate all Contentful Links within the rich text data
+ const traverse = obj => {
+ for (let k in obj) {
+ const v = obj[k]
+ if (v && v.sys && v.sys.type === `Link`) {
+ rawReferences.push(v)
+ } else if (v && typeof v === `object`) {
+ traverse(v)
+ }
}
}
- }
- traverse(fieldValue)
+ traverse(fieldValue)
- // Build up resolvable reference list
- const resolvableReferenceIds = new Set()
- rawReferences
- .filter(function (v) {
- return resolvable.has(
- `${v.sys.id}___${v.sys.linkType || v.sys.type}`
+ // Build up resolvable reference list
+ const resolvableReferenceIds = new Set()
+ rawReferences
+ .filter(function (v) {
+ return resolvable.has(
+ `${v.sys.id}___${v.sys.linkType || v.sys.type}`
+ )
+ })
+ .forEach(function (v) {
+ resolvableReferenceIds.add(
+ mId(space.sys.id, v.sys.id, v.sys.linkType || v.sys.type)
+ )
+ })
+
+ entryItemFields[entryItemFieldKey] = {
+ raw: stringify(fieldValue),
+ references___NODE: [...resolvableReferenceIds],
+ }
+ } else if (
+ fieldType === `Object` &&
+ _.isPlainObject(entryItemFields[entryItemFieldKey])
+ ) {
+ const jsonNodeId = createNodeId(
+ `${entryNodeId}${entryItemFieldKey}JSONNode`
+ )
+
+ // The Contentful model has `.sys.updatedAt` leading for an entry. If the updatedAt value
+ // of an entry did not change, then we can trust that none of its children were changed either.
+ // (That's why child nodes use the updatedAt of the parent node as their digest, too)
+ const existingNode = getNode(jsonNodeId)
+ if (
+ existingNode?.internal?.contentDigest !== entryItem.sys.updatedAt
+ ) {
+ const jsonNode = prepareJSONNode(
+ jsonNodeId,
+ entryNode,
+ entryItemFieldKey,
+ entryItemFields[entryItemFieldKey],
+ createNodeId
)
- })
- .forEach(function (v) {
- resolvableReferenceIds.add(
- mId(space.sys.id, v.sys.id, v.sys.linkType || v.sys.type)
+ childrenNodes.push(jsonNode)
+ }
+
+ entryItemFields[`${entryItemFieldKey}___NODE`] = jsonNodeId
+ delete entryItemFields[entryItemFieldKey]
+ } else if (
+ fieldType === `Object` &&
+ _.isArray(entryItemFields[entryItemFieldKey])
+ ) {
+ entryItemFields[`${entryItemFieldKey}___NODE`] = []
+
+ entryItemFields[entryItemFieldKey].forEach((obj, i) => {
+ const jsonNodeId = createNodeId(
+ `${entryNodeId}${entryItemFieldKey}${i}JSONNode`
)
- })
- entryItemFields[entryItemFieldKey] = {
- raw: stringify(fieldValue),
- references___NODE: [...resolvableReferenceIds],
- }
- } else if (
- fieldType === `Object` &&
- _.isPlainObject(entryItemFields[entryItemFieldKey])
- ) {
- const jsonNode = prepareJSONNode(
- entryNode,
- entryItemFieldKey,
- entryItemFields[entryItemFieldKey],
- createNodeId
- )
+ // The Contentful model has `.sys.updatedAt` leading for an entry. If the updatedAt value
+ // of an entry did not change, then we can trust that none of its children were changed either.
+ // (That's why child nodes use the updatedAt of the parent node as their digest, too)
+ const existingNode = getNode(jsonNodeId)
+ if (
+ existingNode?.internal?.contentDigest !==
+ entryItem.sys.updatedAt
+ ) {
+ const jsonNode = prepareJSONNode(
+ jsonNodeId,
+ entryNode,
+ entryItemFieldKey,
+ obj,
+ createNodeId,
+ i
+ )
+ childrenNodes.push(jsonNode)
+ }
- childrenNodes.push(jsonNode)
- entryItemFields[`${entryItemFieldKey}___NODE`] = jsonNode.id
-
- delete entryItemFields[entryItemFieldKey]
- } else if (
- fieldType === `Object` &&
- _.isArray(entryItemFields[entryItemFieldKey])
- ) {
- entryItemFields[`${entryItemFieldKey}___NODE`] = []
-
- entryItemFields[entryItemFieldKey].forEach((obj, i) => {
- const jsonNode = prepareJSONNode(
- entryNode,
- entryItemFieldKey,
- obj,
- createNodeId,
- i
- )
+ entryItemFields[`${entryItemFieldKey}___NODE`].push(jsonNodeId)
+ })
- childrenNodes.push(jsonNode)
- entryItemFields[`${entryItemFieldKey}___NODE`].push(jsonNode.id)
- })
+ delete entryItemFields[entryItemFieldKey]
+ }
+ })
- delete entryItemFields[entryItemFieldKey]
+ entryNode = {
+ ...entryItemFields,
+ ...entryNode,
+ node_locale: locale.code,
}
- })
- entryNode = { ...entryItemFields, ...entryNode, node_locale: locale.code }
+ // The content of an entry is guaranteed to be updated if and only if the .sys.updatedAt field changed
+ entryNode.internal.contentDigest = entryItem.sys.updatedAt
- // The content of an entry is guaranteed to be updated if and only if the .sys.updatedAt field changed
- entryNode.internal.contentDigest = entryItem.sys.updatedAt
-
- return entryNode
- })
+ return entryNode
+ })
+ .filter(Boolean)
// Create a node for each content type
const contentTypeNode = {
From 4021a5740c4ab7fd22ff9aec506c11504730d932 Mon Sep 17 00:00:00 2001
From: Vladimir Razuvaev
Date: Tue, 22 Dec 2020 18:20:37 +0700
Subject: [PATCH 26/37] chore(gatsby-source-graphql): docs on how to use apollo
links (#28686)
* chore(gatsby-source-graphql): docs on how to use apollo links
* add comment
* Update packages/gatsby-source-graphql/README.md
Co-authored-by: Megan Sullivan
* Update packages/gatsby-source-graphql/README.md
Co-authored-by: Megan Sullivan
* Update packages/gatsby-source-graphql/README.md
Co-authored-by: Megan Sullivan
* add suggested changes
* rename options to pluginOptions for clarity
* amend
Co-authored-by: Megan Sullivan
---
packages/gatsby-source-graphql/README.md | 58 ++++++++++++++++++++++++
1 file changed, 58 insertions(+)
diff --git a/packages/gatsby-source-graphql/README.md b/packages/gatsby-source-graphql/README.md
index dec7a6ff3c470..67a4b8975fc86 100644
--- a/packages/gatsby-source-graphql/README.md
+++ b/packages/gatsby-source-graphql/README.md
@@ -150,6 +150,64 @@ module.exports = {
}
```
+## Composing Apollo Links for production network setup
+
+Network requests can fail, return errors or take too long. Use [Apollo Link](https://www.apollographql.com/docs/link/) to
+add retries, error handling, logging and more to your GraphQL requests.
+
+Use the plugin's `createLink` option to add a custom Apollo Link to your GraphQL requests.
+
+You can compose different types of links, depending on the functionality you're trying to achieve.
+The most common links are:
+
+- `apollo-link-retry` for retrying queries that fail or time out
+- `apollo-link-error` for error handling
+- `apollo-link-http` for sending queries in http requests (used by default)
+
+For more explanation of how Apollo Links work together, check out this Medium article: [Productionizing Apollo Links](https://medium.com/@joanvila/productionizing-apollo-links-4cdc11d278eb).
+
+Here's an example of using the HTTP link with retries (using [apollo-link-retry](https://www.npmjs.com/package/apollo-link-retry)):
+
+```js
+// gatsby-config.js
+const { createHttpLink } = require(`apollo-link-http`)
+const { RetryLink } = require(`apollo-link-retry`)
+
+const retryLink = new RetryLink({
+ delay: {
+ initial: 100,
+ max: 2000,
+ jitter: true,
+ },
+ attempts: {
+ max: 5,
+ retryIf: (error, operation) =>
+ Boolean(error) && ![500, 400].includes(error.statusCode),
+ },
+})
+
+module.exports = {
+ plugins: [
+ {
+ resolve: "gatsby-source-graphql",
+ options: {
+ typeName: "SWAPI",
+ fieldName: "swapi",
+ url: "https://api.graphcms.com/simple/v1/swapi",
+
+ // `pluginOptions`: all plugin options
+ // (i.e. in this example object with keys `typeName`, `fieldName`, `url`, `createLink`)
+ createLink: pluginOptions =>
+ ApolloLink.from([
+ retryLink,
+ createHttpLink({ url: pluginOptions.url }),
+ ]),
+ },
+ },
+ ],
+}
+```
+
## Custom transform schema function (advanced)
It's possible to modify the remote schema, via a `transformSchema` option which customizes the way the default schema is transformed before it is merged on the Gatsby schema by the stitching process.
From 338ed78def6c6a70571b08476ed5f53b73bc5a09 Mon Sep 17 00:00:00 2001
From: Jarmo Isotalo
Date: Tue, 22 Dec 2020 23:42:53 +0200
Subject: [PATCH 27/37] chore(telemetry): add valueBoolean (#28734)
---
packages/gatsby-telemetry/src/telemetry.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/packages/gatsby-telemetry/src/telemetry.ts b/packages/gatsby-telemetry/src/telemetry.ts
index 1d16ca31346d8..283338e04c375 100644
--- a/packages/gatsby-telemetry/src/telemetry.ts
+++ b/packages/gatsby-telemetry/src/telemetry.ts
@@ -108,6 +108,7 @@ export interface ITelemetryTagsPayload {
valueString?: string
valueStringArray?: Array
valueInteger?: number
+ valueBoolean?: boolean
}
export interface IDefaultTelemetryTagsPayload extends ITelemetryTagsPayload {
From 3af7182c2ef92240ca1772375fb24ab9285ce3d6 Mon Sep 17 00:00:00 2001
From: Jarmo Isotalo
Date: Tue, 22 Dec 2020 23:43:24 +0200
Subject: [PATCH 28/37] chore(telemetry) improve github action and circle
detection (#28732)
* chore(telemetry) improve github action and circle detection
* Change order
* Make sure tests work in circle
---
packages/gatsby-core-utils/src/__tests__/ci.ts | 1 +
packages/gatsby-core-utils/src/ci.ts | 5 ++++-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/packages/gatsby-core-utils/src/__tests__/ci.ts b/packages/gatsby-core-utils/src/__tests__/ci.ts
index cd6fd2cce435f..f618d09e9b4f9 100644
--- a/packages/gatsby-core-utils/src/__tests__/ci.ts
+++ b/packages/gatsby-core-utils/src/__tests__/ci.ts
@@ -9,6 +9,7 @@ describe(`CI detection`, () => {
;[
`CI`,
`CIRCLECI`,
+ `CIRCLE_BRANCH`,
`CIRCLE_PULL_REQUEST`,
`SYSTEM_TEAMFOUNDATIONCOLLECTIONURI`,
`SYSTEM_PULLREQUEST_PULLREQUESTID`,
diff --git a/packages/gatsby-core-utils/src/ci.ts b/packages/gatsby-core-utils/src/ci.ts
index a69f117cbdea9..94b40c3517376 100644
--- a/packages/gatsby-core-utils/src/ci.ts
+++ b/packages/gatsby-core-utils/src/ci.ts
@@ -1,13 +1,16 @@
import ci from "ci-info"
const CI_DEFINITIONS = [
- envFromCIAndCIName,
getEnvDetect({ key: `NOW_BUILDER_ANNOTATE`, name: `ZEIT Now` }),
getEnvDetect({ key: `NOW_REGION`, name: `ZEIT Now v1` }),
getEnvDetect({ key: `VERCEL_URL`, name: `Vercel Now` }),
getEnvDetect({ key: `NOW_BUILDER`, name: `Vercel Now` }),
getEnvDetect({ key: `VERCEL_BUILDER`, name: `Vercel Now` }),
getEnvDetect({ key: `CODESANDBOX_SSE`, name: `CodeSandbox` }),
+ getEnvDetect({ key: `GITHUB_ACTIONS`, name: `GitHub Actions` }),
+ getEnvDetect({ key: `CIRCLE_BRANCH`, name: `CircleCI` }),
+ getEnvDetect({ key: `CIRCLECI`, name: `CircleCI` }),
+ envFromCIAndCIName,
herokuDetect,
getEnvFromCIInfo,
envFromCIWithNoName,
From 146b1975cc83f862c883b27415b914e152c708e8 Mon Sep 17 00:00:00 2001
From: Vladimir Razuvaev
Date: Wed, 23 Dec 2020 17:31:07 +0700
Subject: [PATCH 29/37] fix(gatsby): print childOf directive for implicit child
fields (#28483)
* fix(gatsby): print childOf directive for implicit child fields
* fix comments
* address review comments
* be more defensive
* Revert "be more defensive"
This reverts commit e1394864
* fix duplicate types printing in `childOf`
* fix invalid deprecation warning when mimeTypes is set
---
.../__tests__/__snapshots__/print.js.snap | 28 +++++
packages/gatsby/src/schema/__tests__/print.js | 44 ++++++-
.../extensions/__tests__/child-relations.js | 18 +++
packages/gatsby/src/schema/schema.js | 116 +++++++++++-------
4 files changed, 162 insertions(+), 44 deletions(-)
diff --git a/packages/gatsby/src/schema/__tests__/__snapshots__/print.js.snap b/packages/gatsby/src/schema/__tests__/__snapshots__/print.js.snap
index 81b5bdfe03dca..e7816e0482521 100644
--- a/packages/gatsby/src/schema/__tests__/__snapshots__/print.js.snap
+++ b/packages/gatsby/src/schema/__tests__/__snapshots__/print.js.snap
@@ -120,6 +120,14 @@ input Baz {
qux: Boolean
}
+type BarChild implements Node @childOf(types: [\\"Test\\"]) @dontInfer {
+ bar: String
+}
+
+type FooChild implements Node @childOf(types: [\\"Test\\"]) @dontInfer {
+ bar: String
+}
+
type Test implements Node @dontInfer {
foo: Int
}"
@@ -148,6 +156,10 @@ type Nested {
input Baz {
qux: Boolean
+}
+
+type BarChild implements Node @childOf(types: [\\"Test\\"]) @dontInfer {
+ bar: String
}"
`;
@@ -266,6 +278,14 @@ type OneMoreTest implements Node @dontInfer {
union ThisOrThat = AnotherTest | OneMoreTest
+type BarChild implements Node @childOf(types: [\\"Test\\"]) @dontInfer {
+ bar: String
+}
+
+type FooChild implements Node @childOf(types: [\\"Test\\"]) @dontInfer {
+ bar: String
+}
+
type Test implements Node @dontInfer {
foo: Int
}"
@@ -423,6 +443,14 @@ input Baz {
qux: Boolean
}
+type BarChild implements Node @childOf(types: [\\"Test\\"]) @dontInfer {
+ bar: String
+}
+
+type FooChild implements Node @childOf(types: [\\"Test\\"]) @dontInfer {
+ bar: String
+}
+
type Test implements Node @dontInfer {
foo: Int
}"
diff --git a/packages/gatsby/src/schema/__tests__/print.js b/packages/gatsby/src/schema/__tests__/print.js
index dfccfddac0b6b..3fd0938988530 100644
--- a/packages/gatsby/src/schema/__tests__/print.js
+++ b/packages/gatsby/src/schema/__tests__/print.js
@@ -2,6 +2,8 @@ const { build } = require(`..`)
import { buildObjectType } from "../types/type-builders"
const { store } = require(`../../redux`)
const { actions } = require(`../../redux/actions/restricted`)
+const { actions: publicActions } = require(`../../redux/actions/public`)
+const { createParentChildLink } = publicActions
const { printTypeDefinitions } = actions
jest.mock(`fs-extra`)
@@ -41,14 +43,35 @@ jest.spyOn(global.Date.prototype, `toISOString`).mockReturnValue(`2019-01-01`)
describe(`Print type definitions`, () => {
beforeEach(() => {
store.dispatch({ type: `DELETE_CACHE` })
- const node = {
+ const node1 = {
id: `test1`,
internal: {
type: `Test`,
},
+ children: [],
foo: 26,
}
- store.dispatch({ type: `CREATE_NODE`, payload: { ...node } })
+ const node2 = {
+ id: `test2`,
+ parent: `test1`,
+ internal: {
+ type: `FooChild`,
+ },
+ bar: `bar`,
+ }
+ const node3 = {
+ id: `test3`,
+ parent: `test1`,
+ internal: {
+ type: `BarChild`,
+ },
+ bar: `bar`,
+ }
+ store.dispatch({ type: `CREATE_NODE`, payload: { ...node1 } })
+ store.dispatch({ type: `CREATE_NODE`, payload: { ...node2 } })
+ store.dispatch({ type: `CREATE_NODE`, payload: { ...node3 } })
+ createParentChildLink({ parent: node1, child: node2 })
+ createParentChildLink({ parent: node1, child: node3 })
const typeDefs = []
typeDefs.push(`
type AnotherTest implements Node & ITest {
@@ -96,6 +119,18 @@ describe(`Print type definitions`, () => {
types: [`OneMoreTest`],
},
},
+ }),
+ buildObjectType({
+ name: `BarChild`,
+ fields: {
+ id: `ID!`,
+ },
+ interfaces: [`Node`],
+ extensions: {
+ childOf: {
+ types: [`Test`],
+ },
+ },
})
)
store.dispatch({
@@ -108,6 +143,11 @@ describe(`Print type definitions`, () => {
payload: typeDefs[1],
plugin: { name: `gatsby-plugin-another-test` },
})
+ store.dispatch({
+ type: `CREATE_TYPES`,
+ payload: typeDefs[2],
+ plugin: { name: `gatsby-plugin-another-test` },
+ })
})
it(`saves type definitions to default file`, async () => {
diff --git a/packages/gatsby/src/schema/extensions/__tests__/child-relations.js b/packages/gatsby/src/schema/extensions/__tests__/child-relations.js
index 07b865c374587..15ae28a4df983 100644
--- a/packages/gatsby/src/schema/extensions/__tests__/child-relations.js
+++ b/packages/gatsby/src/schema/extensions/__tests__/child-relations.js
@@ -186,6 +186,24 @@ describe(`Define parent-child relationships with field extensions`, () => {
)
})
+ it(`does not show deprecation warning for inferred child fields`, async () => {
+ dispatch(
+ createTypes(`
+ type Parent implements Node @dontInfer @mimeTypes(types: ["application/listenup"]) {
+ id: ID!
+ }
+ type Child implements Node @childOf(mimeTypes: ["application/listenup"]) {
+ id: ID!
+ }
+ type AnotherChild implements Node @childOf(types: ["Parent"]) {
+ id: ID!
+ }
+ `)
+ )
+ await buildSchema()
+ expect(report.warn).toBeCalledTimes(0)
+ })
+
it(`adds children[Field] field to parent type with childOf extension`, async () => {
dispatch(
createTypes(`
diff --git a/packages/gatsby/src/schema/schema.js b/packages/gatsby/src/schema/schema.js
index 00d1caee63e06..abaf7a482952d 100644
--- a/packages/gatsby/src/schema/schema.js
+++ b/packages/gatsby/src/schema/schema.js
@@ -146,6 +146,9 @@ const updateSchemaComposer = async ({
inferenceMetadata,
parentSpan: activity.span,
})
+ addInferredChildOfExtensions({
+ schemaComposer,
+ })
activity.end()
activity = report.phantomActivity(`Processing types`, {
@@ -202,11 +205,6 @@ const processTypeComposer = async ({
if (typeComposer.hasInterface(`Node`)) {
await addNodeInterfaceFields({ schemaComposer, typeComposer, parentSpan })
- await addImplicitConvenienceChildrenFields({
- schemaComposer,
- typeComposer,
- parentSpan,
- })
}
await determineSearchableFields({
schemaComposer,
@@ -999,15 +997,42 @@ const addConvenienceChildrenFields = ({ schemaComposer }) => {
})
}
-const addImplicitConvenienceChildrenFields = ({
- schemaComposer,
- typeComposer,
-}) => {
+const isExplicitChild = ({ typeComposer, childTypeComposer }) => {
+ if (!childTypeComposer.hasExtension(`childOf`)) {
+ return false
+ }
+ const childOfExtension = childTypeComposer.getExtension(`childOf`)
+ const { types: parentMimeTypes = [] } =
+ typeComposer.getExtension(`mimeTypes`) ?? {}
+
+ return (
+ childOfExtension?.types?.includes(typeComposer.getTypeName()) ||
+ childOfExtension?.mimeTypes?.some(mimeType =>
+ parentMimeTypes.includes(mimeType)
+ )
+ )
+}
+
+const addInferredChildOfExtensions = ({ schemaComposer }) => {
+ schemaComposer.forEach(typeComposer => {
+ if (
+ typeComposer instanceof ObjectTypeComposer &&
+ typeComposer.hasInterface(`Node`)
+ ) {
+ addInferredChildOfExtension({
+ schemaComposer,
+ typeComposer,
+ })
+ }
+ })
+}
+
+const addInferredChildOfExtension = ({ schemaComposer, typeComposer }) => {
const shouldInfer = typeComposer.getExtension(`infer`)
- // In Gatsby v3, when `@dontInfer` is set, children fields will not be
- // created for parent-child relations set by plugins with
+ // In Gatsby v3, when `@dontInfer` is set, `@childOf` extension will not be
+ // automatically created for parent-child relations set by plugins with
// `createParentChildLink`. With `@dontInfer`, only parent-child
- // relations explicitly set with the `childOf` extension will be added.
+ // relations explicitly set with the `@childOf` extension will be added.
// if (shouldInfer === false) return
const parentTypeName = typeComposer.getTypeName()
@@ -1016,39 +1041,46 @@ const addImplicitConvenienceChildrenFields = ({
const childNodesByType = groupChildNodesByType({ nodes })
Object.keys(childNodesByType).forEach(typeName => {
- // Adding children fields to types with the `@dontInfer` extension is deprecated
- if (shouldInfer === false) {
- const childTypeComposer = schemaComposer.getAnyTC(typeName)
- const childOfExtension = childTypeComposer.getExtension(`childOf`)
+ const childTypeComposer = schemaComposer.getAnyTC(typeName)
+ let childOfExtension = childTypeComposer.getExtension(`childOf`)
- // Only warn when the parent-child relation has not been explicitly set with
- if (
- !childOfExtension ||
- !childOfExtension.types.includes(parentTypeName)
- ) {
- const childField = fieldNames.convenienceChild(typeName)
- const childrenField = fieldNames.convenienceChildren(typeName)
- const childOfTypes = (childOfExtension?.types ?? [])
- .concat(parentTypeName)
- .map(name => `"${name}"`)
- .join(`,`)
-
- report.warn(
- `Deprecation warning: ` +
- `In Gatsby v3 fields \`${parentTypeName}.${childField}\` and \`${parentTypeName}.${childrenField}\` ` +
- `will not be added automatically because ` +
- `type \`${typeName}\` does not explicitly list type \`${parentTypeName}\` in \`childOf\` extension.\n` +
- `Add the following type definition to fix this:\n\n` +
- ` type ${typeName} implements Node @childOf(types: [${childOfTypes}]) {\n` +
- ` id: ID!\n` +
- ` }\n\n` +
- `https://www.gatsbyjs.com/docs/actions/#createTypes`
- )
- }
+ if (isExplicitChild({ typeComposer, childTypeComposer })) {
+ return
}
+ if (shouldInfer === false) {
+ // Adding children fields to types with the `@dontInfer` extension is deprecated
+ // Only warn when the parent-child relation has not been explicitly set with `childOf` directive
+ const childField = fieldNames.convenienceChild(typeName)
+ const childrenField = fieldNames.convenienceChildren(typeName)
+ const childOfTypes = (childOfExtension?.types ?? [])
+ .concat(parentTypeName)
+ .map(name => `"${name}"`)
+ .join(`,`)
- typeComposer.addFields(createChildrenField(typeName))
- typeComposer.addFields(createChildField(typeName))
+ report.warn(
+ `Deprecation warning: ` +
+ `In Gatsby v3 fields \`${parentTypeName}.${childField}\` and \`${parentTypeName}.${childrenField}\` ` +
+ `will not be added automatically because ` +
+ `type \`${typeName}\` does not explicitly list type \`${parentTypeName}\` in \`childOf\` extension.\n` +
+ `Add the following type definition to fix this:\n\n` +
+ ` type ${typeName} implements Node @childOf(types: [${childOfTypes}]) {\n` +
+ ` id: ID!\n` +
+ ` }\n\n` +
+ `https://www.gatsbyjs.com/docs/actions/#createTypes`
+ )
+ }
+ // Set `@childOf` extension automatically
+ // This will cause convenience children fields like `childImageSharp`
+ // to be added in `addConvenienceChildrenFields` method.
+ // Also required for proper printing of the `@childOf` directive in the snapshot plugin
+ if (!childOfExtension) {
+ childOfExtension = {}
+ }
+ if (!childOfExtension.types) {
+ childOfExtension.types = []
+ }
+ childOfExtension.types.push(parentTypeName)
+ childTypeComposer.setExtension(`childOf`, childOfExtension)
})
}
From 205877542a9447e5d48a83718f5c0a751e44738d Mon Sep 17 00:00:00 2001
From: Matt Kane
Date: Thu, 24 Dec 2020 10:13:34 +0000
Subject: [PATCH 30/37] feat: Add AVIF image support to beta image plugin
(#28742)
* Upgrade sharp
* Add avif support
* Add avif e2e tests
* Allow - but warn about - using just AVIF
* Add missing AVIF gql type
* Upgrade e2e test executor
---
.circleci/config.yml | 2 +-
.../cypress/integration/image.js | 2 +
... -- renders correctly on 1027x768.snap.png | Bin 0 -> 591559 bytes
...at -- renders correctly on ipad-2.snap.png | Bin 0 -> 304120 bytes
... -- renders correctly on iphone-6.snap.png | Bin 0 -> 69562 bytes
... -- renders correctly on 1027x768.snap.png | Bin 0 -> 591559 bytes
...at -- renders correctly on ipad-2.snap.png | Bin 0 -> 304120 bytes
... -- renders correctly on iphone-6.snap.png | Bin 0 -> 69562 bytes
.../src/pages/images/avif.js | 28 ++++++++++++
.../src/pages/static-images/avif.js | 22 ++++++++++
.../gatsby-plugin-image/src/babel-helpers.ts | 1 +
.../src/components/static-image.server.tsx | 1 +
.../gatsby-plugin-image/src/resolver-utils.ts | 5 ++-
packages/gatsby-plugin-manifest/package.json | 2 +-
packages/gatsby-plugin-sharp/package.json | 2 +-
.../gatsby-plugin-sharp/src/image-data.ts | 41 ++++++++++++++++--
.../package.json | 2 +-
.../gatsby-transformer-sharp/package.json | 2 +-
.../src/customize-schema.js | 5 +++
.../gatsby-transformer-sharp/src/types.ts | 18 ++++++++
yarn.lock | 20 ++++-----
21 files changed, 133 insertions(+), 20 deletions(-)
create mode 100644 e2e-tests/visual-regression/cypress/snapshots/image.js/GatsbyImage -- avif format -- renders correctly on 1027x768.snap.png
create mode 100644 e2e-tests/visual-regression/cypress/snapshots/image.js/GatsbyImage -- avif format -- renders correctly on ipad-2.snap.png
create mode 100644 e2e-tests/visual-regression/cypress/snapshots/image.js/GatsbyImage -- avif format -- renders correctly on iphone-6.snap.png
create mode 100644 e2e-tests/visual-regression/cypress/snapshots/image.js/StaticImage -- avif format -- renders correctly on 1027x768.snap.png
create mode 100644 e2e-tests/visual-regression/cypress/snapshots/image.js/StaticImage -- avif format -- renders correctly on ipad-2.snap.png
create mode 100644 e2e-tests/visual-regression/cypress/snapshots/image.js/StaticImage -- avif format -- renders correctly on iphone-6.snap.png
create mode 100644 e2e-tests/visual-regression/src/pages/images/avif.js
create mode 100644 e2e-tests/visual-regression/src/pages/static-images/avif.js
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 5cc28f2f5c0f9..b1c1c29d5af16 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -23,7 +23,7 @@ executors:
aliases:
e2e-executor: &e2e-executor
docker:
- - image: cypress/browsers:node10.16.0-chrome76
+ - image: cypress/browsers:node12.18.3-chrome87-ff82
restore_cache: &restore_cache
restore_cache:
diff --git a/e2e-tests/visual-regression/cypress/integration/image.js b/e2e-tests/visual-regression/cypress/integration/image.js
index 0f68dee9c5e60..5c29ae4f32377 100644
--- a/e2e-tests/visual-regression/cypress/integration/image.js
+++ b/e2e-tests/visual-regression/cypress/integration/image.js
@@ -3,12 +3,14 @@ const testCases = [
["fixed image smaller than requested size", "/images/fixed-too-big"],
["fluid image", "/images/fluid"],
["constrained image", "/images/constrained"],
+ ["avif format", "/images/avif"],
]
const staticImageTestCases = [
["fixed image", "/static-images/fixed"],
["fixed image smaller than requested size", "/static-images/fixed-too-big"],
["fluid image", "/static-images/fluid"],
["constrained image", "/static-images/constrained"],
+ ["avif format", "/static-images/avif"],
]
const sizes = [["iphone-6"], ["ipad-2"], [1027, 768]]
diff --git a/e2e-tests/visual-regression/cypress/snapshots/image.js/GatsbyImage -- avif format -- renders correctly on 1027x768.snap.png b/e2e-tests/visual-regression/cypress/snapshots/image.js/GatsbyImage -- avif format -- renders correctly on 1027x768.snap.png
new file mode 100644
index 0000000000000000000000000000000000000000..62c5ed33ec1a508a8cfa8753e49324005f734bd0
GIT binary patch
literal 591559
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