From 79a95ea5de228d0f80e31cc258f18486179b4f3d Mon Sep 17 00:00:00 2001 From: Vladimir Razuvaev Date: Tue, 8 Dec 2020 17:54:43 +0700 Subject: [PATCH 1/5] fix(gatsby): better text for missing extension --- .../src/schema/infer/__tests__/infer.js | 41 +++++++++++++++++++ .../src/schema/infer/add-inferred-fields.js | 5 ++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/packages/gatsby/src/schema/infer/__tests__/infer.js b/packages/gatsby/src/schema/infer/__tests__/infer.js index 392f887bb4c43..3cdfe3005ba90 100644 --- a/packages/gatsby/src/schema/infer/__tests__/infer.js +++ b/packages/gatsby/src/schema/infer/__tests__/infer.js @@ -36,6 +36,7 @@ jest.mock(`gatsby-cli/lib/reporter`, () => { const report = require(`gatsby-cli/lib/reporter`) afterEach(() => { report.error.mockClear() + report.warn.mockClear() }) const makeNodes = () => [ @@ -1385,4 +1386,44 @@ Object { ) }) }) + + describe(`missing extension warning`, () => { + it(`warns when inferred extension is missing in type definition`, async () => { + const nodes = [ + { + date: `2012-11-01`, + internal: { type: `Test` }, + id: `1`, + }, + { + linked___NODE: `foo`, + internal: { type: `Test` }, + id: `2`, + }, + + // linked node: + { id: `foo`, internal: { type: `Foo` } }, + ] + const typeDefs = [ + { + typeOrTypeDef: ` + type Test implements Node { + linked: Foo + date: Date + } + `, + }, + ] + await buildTestSchema(nodes, {}, typeDefs) + expect(report.warn.mock.calls.length).toEqual(2) + expect(report.warn.mock.calls[0][0]).toEqual( + `Deprecation warning - adding inferred extension {"dateformat":{}} for field Test.date. ` + + `In Gatsby v3, only fields with an explicit directive/extension will get a resolver.` + ) + expect(report.warn.mock.calls[1][0]).toEqual( + `Deprecation warning - adding inferred extension {"link":{"by":"id","from":"linked___NODE"}} for field Test.linked. ` + + `In Gatsby v3, only fields with an explicit directive/extension will get a resolver.` + ) + }) + }) }) diff --git a/packages/gatsby/src/schema/infer/add-inferred-fields.js b/packages/gatsby/src/schema/infer/add-inferred-fields.js index df53ec155d315..d12b364d02651 100644 --- a/packages/gatsby/src/schema/infer/add-inferred-fields.js +++ b/packages/gatsby/src/schema/infer/add-inferred-fields.js @@ -120,8 +120,11 @@ const addInferredFieldsImpl = ({ .forEach(name => { if (!typeComposer.hasFieldExtension(key, name)) { typeComposer.setFieldExtension(key, name, extensions[name]) + const prettified = JSON.stringify({ + [name]: extensions[name], + }) report.warn( - `Deprecation warning - adding inferred resolver for field ` + + `Deprecation warning - adding inferred extension ${prettified} for field ` + `${typeComposer.getTypeName()}.${key}. In Gatsby v3, ` + `only fields with an explicit directive/extension will ` + `get a resolver.` From 5f4be1df741b6a48e66af0608b8ff72785b8c0e6 Mon Sep 17 00:00:00 2001 From: Vladimir Razuvaev Date: Tue, 8 Dec 2020 19:28:38 +0700 Subject: [PATCH 2/5] add SDL example on how to fix the problem --- .../src/schema/infer/__tests__/infer.js | 16 ++++++++++---- .../src/schema/infer/add-inferred-fields.js | 22 +++++++++++++------ packages/gatsby/src/schema/print.js | 1 + 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/packages/gatsby/src/schema/infer/__tests__/infer.js b/packages/gatsby/src/schema/infer/__tests__/infer.js index 3cdfe3005ba90..fe1032fa6d84c 100644 --- a/packages/gatsby/src/schema/infer/__tests__/infer.js +++ b/packages/gatsby/src/schema/infer/__tests__/infer.js @@ -1417,12 +1417,20 @@ Object { await buildTestSchema(nodes, {}, typeDefs) expect(report.warn.mock.calls.length).toEqual(2) expect(report.warn.mock.calls[0][0]).toEqual( - `Deprecation warning - adding inferred extension {"dateformat":{}} for field Test.date. ` + - `In Gatsby v3, only fields with an explicit directive/extension will get a resolver.` + `Deprecation warning: adding inferred extension \`dateformat\` for field \`Test.date\`.\n` + + `In Gatsby v3, only fields with an explicit directive/extension will be resolved correctly.\n` + + `Add the following type definition to fix this:\n\n` + + ` type Test implements Node {\n` + + ` date: Date @dateformat\n` + + ` }` ) expect(report.warn.mock.calls[1][0]).toEqual( - `Deprecation warning - adding inferred extension {"link":{"by":"id","from":"linked___NODE"}} for field Test.linked. ` + - `In Gatsby v3, only fields with an explicit directive/extension will get a resolver.` + `Deprecation warning: adding inferred extension \`link\` for field \`Test.linked\`.\n` + + `In Gatsby v3, only fields with an explicit directive/extension will be resolved correctly.\n` + + `Add the following type definition to fix this:\n\n` + + ` type Test implements Node {\n` + + ` linked: Foo @link(by: "id", from: "linked___NODE")\n` + + ` }` ) }) }) diff --git a/packages/gatsby/src/schema/infer/add-inferred-fields.js b/packages/gatsby/src/schema/infer/add-inferred-fields.js index d12b364d02651..896b905fb31ff 100644 --- a/packages/gatsby/src/schema/infer/add-inferred-fields.js +++ b/packages/gatsby/src/schema/infer/add-inferred-fields.js @@ -8,6 +8,7 @@ import { isFile } from "./is-file" import { isDate } from "../types/date" import { addDerivedType } from "../types/derived-types" import { is32BitInteger } from "../../utils/is-32-bit-integer" +import { printDirectives } from "../print" const { getNode, getNodes } = require(`../../redux/nodes`) const addInferredFields = ({ @@ -120,14 +121,21 @@ const addInferredFieldsImpl = ({ .forEach(name => { if (!typeComposer.hasFieldExtension(key, name)) { typeComposer.setFieldExtension(key, name, extensions[name]) - const prettified = JSON.stringify({ - [name]: extensions[name], - }) + + const typeName = typeComposer.getTypeName() + const implementsNode = + unsanitizedFieldPath.length === 1 ? `implements Node ` : `` + const extension = printDirectives( + { [name]: extensions[name] }, + schemaComposer.getDirectives() + ) report.warn( - `Deprecation warning - adding inferred extension ${prettified} for field ` + - `${typeComposer.getTypeName()}.${key}. In Gatsby v3, ` + - `only fields with an explicit directive/extension will ` + - `get a resolver.` + `Deprecation warning: adding inferred extension \`${name}\` for field \`${typeName}.${key}\`.\n` + + `In Gatsby v3, only fields with an explicit directive/extension will be resolved correctly.\n` + + `Add the following type definition to fix this:\n\n` + + ` type ${typeComposer.getTypeName()} ${implementsNode} {\n` + + ` ${key}: ${field.type.toString()}${extension}\n` + + ` }` ) } }) diff --git a/packages/gatsby/src/schema/print.js b/packages/gatsby/src/schema/print.js index 8ad426cdbabad..3e8ede4ce9943 100644 --- a/packages/gatsby/src/schema/print.js +++ b/packages/gatsby/src/schema/print.js @@ -402,4 +402,5 @@ const breakLine = (line, maxLen) => { module.exports = { printTypeDefinitions, + printDirectives, } From 1a5a0347398662d701aa1e11dd0b920bcaaffded Mon Sep 17 00:00:00 2001 From: Vladimir Razuvaev Date: Tue, 8 Dec 2020 19:30:29 +0700 Subject: [PATCH 3/5] fix typo --- packages/gatsby/src/schema/infer/__tests__/infer.js | 4 ++-- packages/gatsby/src/schema/infer/add-inferred-fields.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/gatsby/src/schema/infer/__tests__/infer.js b/packages/gatsby/src/schema/infer/__tests__/infer.js index fe1032fa6d84c..00a45dea0e094 100644 --- a/packages/gatsby/src/schema/infer/__tests__/infer.js +++ b/packages/gatsby/src/schema/infer/__tests__/infer.js @@ -1420,7 +1420,7 @@ Object { `Deprecation warning: adding inferred extension \`dateformat\` for field \`Test.date\`.\n` + `In Gatsby v3, only fields with an explicit directive/extension will be resolved correctly.\n` + `Add the following type definition to fix this:\n\n` + - ` type Test implements Node {\n` + + ` type Test implements Node {\n` + ` date: Date @dateformat\n` + ` }` ) @@ -1428,7 +1428,7 @@ Object { `Deprecation warning: adding inferred extension \`link\` for field \`Test.linked\`.\n` + `In Gatsby v3, only fields with an explicit directive/extension will be resolved correctly.\n` + `Add the following type definition to fix this:\n\n` + - ` type Test implements Node {\n` + + ` type Test implements Node {\n` + ` linked: Foo @link(by: "id", from: "linked___NODE")\n` + ` }` ) diff --git a/packages/gatsby/src/schema/infer/add-inferred-fields.js b/packages/gatsby/src/schema/infer/add-inferred-fields.js index 896b905fb31ff..cc0ba087f8a4a 100644 --- a/packages/gatsby/src/schema/infer/add-inferred-fields.js +++ b/packages/gatsby/src/schema/infer/add-inferred-fields.js @@ -133,7 +133,7 @@ const addInferredFieldsImpl = ({ `Deprecation warning: adding inferred extension \`${name}\` for field \`${typeName}.${key}\`.\n` + `In Gatsby v3, only fields with an explicit directive/extension will be resolved correctly.\n` + `Add the following type definition to fix this:\n\n` + - ` type ${typeComposer.getTypeName()} ${implementsNode} {\n` + + ` type ${typeComposer.getTypeName()} ${implementsNode}{\n` + ` ${key}: ${field.type.toString()}${extension}\n` + ` }` ) From 9fbfa5d16342a6f2ac3c9d146fd183aee3b5e3a5 Mon Sep 17 00:00:00 2001 From: Vladimir Razuvaev Date: Tue, 8 Dec 2020 19:56:40 +0700 Subject: [PATCH 4/5] Add a link to createTypes docs --- packages/gatsby/src/schema/infer/__tests__/infer.js | 6 ++++-- packages/gatsby/src/schema/infer/add-inferred-fields.js | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/gatsby/src/schema/infer/__tests__/infer.js b/packages/gatsby/src/schema/infer/__tests__/infer.js index 00a45dea0e094..40110ab7995eb 100644 --- a/packages/gatsby/src/schema/infer/__tests__/infer.js +++ b/packages/gatsby/src/schema/infer/__tests__/infer.js @@ -1422,7 +1422,8 @@ Object { `Add the following type definition to fix this:\n\n` + ` type Test implements Node {\n` + ` date: Date @dateformat\n` + - ` }` + ` }\n` + + `https://www.gatsbyjs.com/docs/actions/#createTypes` ) expect(report.warn.mock.calls[1][0]).toEqual( `Deprecation warning: adding inferred extension \`link\` for field \`Test.linked\`.\n` + @@ -1430,7 +1431,8 @@ Object { `Add the following type definition to fix this:\n\n` + ` type Test implements Node {\n` + ` linked: Foo @link(by: "id", from: "linked___NODE")\n` + - ` }` + ` }\n` + + `https://www.gatsbyjs.com/docs/actions/#createTypes` ) }) }) diff --git a/packages/gatsby/src/schema/infer/add-inferred-fields.js b/packages/gatsby/src/schema/infer/add-inferred-fields.js index cc0ba087f8a4a..3620bf604212d 100644 --- a/packages/gatsby/src/schema/infer/add-inferred-fields.js +++ b/packages/gatsby/src/schema/infer/add-inferred-fields.js @@ -135,7 +135,8 @@ const addInferredFieldsImpl = ({ `Add the following type definition to fix this:\n\n` + ` type ${typeComposer.getTypeName()} ${implementsNode}{\n` + ` ${key}: ${field.type.toString()}${extension}\n` + - ` }` + ` }\n` + + `https://www.gatsbyjs.com/docs/actions/#createTypes` ) } }) From 9fba1108e7709e216af83f8a85de2cb838190f60 Mon Sep 17 00:00:00 2001 From: Vladimir Razuvaev Date: Tue, 8 Dec 2020 19:58:28 +0700 Subject: [PATCH 5/5] formatting --- packages/gatsby/src/schema/infer/__tests__/infer.js | 4 ++-- packages/gatsby/src/schema/infer/add-inferred-fields.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/gatsby/src/schema/infer/__tests__/infer.js b/packages/gatsby/src/schema/infer/__tests__/infer.js index 40110ab7995eb..3cf0403ccffc0 100644 --- a/packages/gatsby/src/schema/infer/__tests__/infer.js +++ b/packages/gatsby/src/schema/infer/__tests__/infer.js @@ -1422,7 +1422,7 @@ Object { `Add the following type definition to fix this:\n\n` + ` type Test implements Node {\n` + ` date: Date @dateformat\n` + - ` }\n` + + ` }\n\n` + `https://www.gatsbyjs.com/docs/actions/#createTypes` ) expect(report.warn.mock.calls[1][0]).toEqual( @@ -1431,7 +1431,7 @@ Object { `Add the following type definition to fix this:\n\n` + ` type Test implements Node {\n` + ` linked: Foo @link(by: "id", from: "linked___NODE")\n` + - ` }\n` + + ` }\n\n` + `https://www.gatsbyjs.com/docs/actions/#createTypes` ) }) diff --git a/packages/gatsby/src/schema/infer/add-inferred-fields.js b/packages/gatsby/src/schema/infer/add-inferred-fields.js index 3620bf604212d..f4d82265ecc65 100644 --- a/packages/gatsby/src/schema/infer/add-inferred-fields.js +++ b/packages/gatsby/src/schema/infer/add-inferred-fields.js @@ -135,7 +135,7 @@ const addInferredFieldsImpl = ({ `Add the following type definition to fix this:\n\n` + ` type ${typeComposer.getTypeName()} ${implementsNode}{\n` + ` ${key}: ${field.type.toString()}${extension}\n` + - ` }\n` + + ` }\n\n` + `https://www.gatsbyjs.com/docs/actions/#createTypes` ) }