From 91e8043cc3436b7ffe5a26c65dbe39ae700ca2d3 Mon Sep 17 00:00:00 2001 From: Mikhail Novikov Date: Tue, 5 Feb 2019 09:14:45 +0200 Subject: [PATCH 1/6] Fix issue with Relay serialization --- .../relay-compiler/core/GraphQLIRPrinter.js | 7 ++-- .../core/__tests__/GraphQLIRVisitor-test.js | 14 ++++++-- .../GraphQLIRVisitor-test.js.snap | 4 +-- .../__snapshots__/RelayPrinter-test.js.snap | 4 +-- .../fixtures/printer/kitchen-sink.graphql | 2 +- packages/relay-test-utils/RelayTestSchema.js | 36 +++++++++++++++++-- packages/relay-test-utils/package.json | 1 + packages/relay-test-utils/testschema.graphql | 20 ++++++++++- 8 files changed, 74 insertions(+), 14 deletions(-) diff --git a/packages/relay-compiler/core/GraphQLIRPrinter.js b/packages/relay-compiler/core/GraphQLIRPrinter.js index 4b246e4d6023a..c55196708f3ac 100644 --- a/packages/relay-compiler/core/GraphQLIRPrinter.js +++ b/packages/relay-compiler/core/GraphQLIRPrinter.js @@ -304,13 +304,14 @@ function printLiteral(value: mixed, type: ?GraphQLInputType): string { type = type.ofType; } if (type instanceof GraphQLEnumType) { + const result = type.serialize(value); invariant( - typeof value === 'string', - 'GraphQLIRPrinter: Expected value of type %s to be a string, got `%s`.', + typeof result === 'string', + 'GraphQLIRPrinter: Expected value of type %s to be a valid enum value, got `%s`.', type.name, value, ); - return value; + return result; } if (Array.isArray(value)) { invariant( diff --git a/packages/relay-compiler/core/__tests__/GraphQLIRVisitor-test.js b/packages/relay-compiler/core/__tests__/GraphQLIRVisitor-test.js index 70e3acec3b658..ed6424ae04277 100644 --- a/packages/relay-compiler/core/__tests__/GraphQLIRVisitor-test.js +++ b/packages/relay-compiler/core/__tests__/GraphQLIRVisitor-test.js @@ -95,11 +95,21 @@ describe('GraphQLIRVisitor', () => { }, Literal: { leave(node: Literal) { + const mutator = value => { + // Keep enums valid + if (value === 'WEB') { + return 'MOBILE'; + } else if (value === 'HELPFUL') { + return 'DERISIVE'; + } else { + return String(value) + '_mutated'; + } + }; return { ...node, value: Array.isArray(node.value) - ? node.value.map(item => String(node.value) + '_mutated') - : String(node.value) + '_mutated', + ? node.value.map(mutator) + : mutator(node.value), }; }, }, diff --git a/packages/relay-compiler/core/__tests__/__snapshots__/GraphQLIRVisitor-test.js.snap b/packages/relay-compiler/core/__tests__/__snapshots__/GraphQLIRVisitor-test.js.snap index 1ed72b96473e7..ed2848f7a7551 100644 --- a/packages/relay-compiler/core/__tests__/__snapshots__/GraphQLIRVisitor-test.js.snap +++ b/packages/relay-compiler/core/__tests__/__snapshots__/GraphQLIRVisitor-test.js.snap @@ -79,10 +79,10 @@ fragment UserFragment_mutated on User @argumentDefinitions( ... on Mutated @include(if: $cond_mutated) { id_mutated __typename_mutated - checkins_mutated(environments_mutated: [WEB_mutated]) { + checkins_mutated(environments_mutated: [MOBILE]) { __typename_mutated } - friends_mutated(after_mutated: $after_mutated, first_mutated: $first_mutated, traits_mutated: [HELPFUL_mutated]) { + friends_mutated(after_mutated: $after_mutated, first_mutated: $first_mutated, traits_mutated: [DERISIVE]) { count_mutated } ... on Mutated @skip(if: $cond_mutated) { diff --git a/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap b/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap index cc6afc6a5ad92..09f8058f8dd6a 100644 --- a/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap +++ b/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap @@ -38,7 +38,7 @@ fragment UserFragment on User @argumentDefinitions( } name @include(if: $cond) otherName: name @customDirective(level: 3) - thumbnail: profilePicture(size: 32) { + thumbnail: profilePicture(size: 32, cropPosition: CENTER, fileExtension: PNG) { height width src: uri @@ -90,7 +90,7 @@ fragment UserFragment on User @argumentDefinitions( } name @include(if: $cond) otherName: name @customDirective(level: 3) - thumbnail: profilePicture(size: 32) { + thumbnail: profilePicture(size: 32, cropPosition: CENTER, fileExtension: PNG) { height width src: uri diff --git a/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql b/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql index 4520680400202..e9fbfff44f81c 100644 --- a/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql +++ b/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql @@ -34,7 +34,7 @@ fragment UserFragment on User @argumentDefinitions( } name @include(if: $cond) otherName: name @customDirective(level: 3) - thumbnail: profilePicture(size: 32) { + thumbnail: profilePicture(size: 32, cropPosition: CENTER, fileExtension: PNG) { height width src: uri diff --git a/packages/relay-test-utils/RelayTestSchema.js b/packages/relay-test-utils/RelayTestSchema.js index dfdc4cbfb60e9..2cdefd308a233 100644 --- a/packages/relay-test-utils/RelayTestSchema.js +++ b/packages/relay-test-utils/RelayTestSchema.js @@ -15,7 +15,37 @@ const RelayTestSchemaPath = require('./RelayTestSchemaPath'); const fs = require('fs'); const {buildASTSchema, parse} = require('graphql'); +const {SchemaComposer} = require('graphql-compose'); -module.exports = buildASTSchema( - parse(fs.readFileSync(RelayTestSchemaPath, 'utf8'), {assumeValid: true}), -); +function buildSchema() { + // Compose upstream is going to add AST directives soon, making this simpler + const composer = new SchemaComposer(); + const initialSchema = buildASTSchema( + parse(fs.readFileSync(RelayTestSchemaPath, 'utf8'), {assumeValid: true}), + ); + + Object.keys(initialSchema.getTypeMap()).forEach(typeName => { + const type = initialSchema.getType(typeName); + composer.add(type); + }); + + const CropPositionETC = composer.getETC('CropPosition'); + CropPositionETC.setFields({ + TOP: {value: 1}, + CENTER: {value: 2}, + BOTTOM: {value: 3}, + LEFT: {value: 4}, + RIGHT: {value: 5}, + }); + const FileExtensionETC = composer.getETC('FileExtension'); + FileExtensionETC.setFields({ + JPG: {value: 'jpg'}, + PNG: {value: 'png'}, + }); + + return composer.buildSchema({ + directives: initialSchema.getDirectives(), + }); +} + +module.exports = buildSchema(); diff --git a/packages/relay-test-utils/package.json b/packages/relay-test-utils/package.json index 2aedcb96ae888..6d27d75724bd9 100644 --- a/packages/relay-test-utils/package.json +++ b/packages/relay-test-utils/package.json @@ -13,6 +13,7 @@ "dependencies": { "@babel/runtime": "^7.0.0", "fbjs": "^1.0.0", + "graphql-compose": "^5.8.0", "iterall": "^1.2.1", "prop-types": "^15.5.8", "relay-compiler": "2.0.0", diff --git a/packages/relay-test-utils/testschema.graphql b/packages/relay-test-utils/testschema.graphql index fbbdbb5d6bfe8..0a50292e9dd99 100644 --- a/packages/relay-test-utils/testschema.graphql +++ b/packages/relay-test-utils/testschema.graphql @@ -744,7 +744,12 @@ type User implements Named & Node & Actor { nameRenderer(supported: [String!]!): UserNameRenderer storySearch(query: StorySearchInput): [Story] storyCommentSearch(query: StoryCommentSearchInput): [Comment] - profilePicture(size: [Int], preset: PhotoSize): Image + profilePicture( + size: [Int], + preset: PhotoSize, + cropPosition: CropPosition, + fileExtension: FileExtension + ): Image profile_picture(scale: Float): Image segments(first: Int): Segments screennames: [Screenname] @@ -838,6 +843,19 @@ enum TopLevelCommentsOrdering { toplevel } +enum CropPosition { + TOP + CENTER + BOTTOM + LEFT + RIGHT +} + +enum FileExtension { + JPG + PNG +} + type Settings { cache_id: ID notificationSounds: Boolean From 7bb0b263b0faa31f7d089ca92ce9538115dfc550 Mon Sep 17 00:00:00 2001 From: Mikhail Novikov Date: Wed, 6 Feb 2019 14:02:26 +0200 Subject: [PATCH 2/6] Simplify test code and push scalar serialization --- gulpfile.js | 1 + package.json | 1 + packages/relay-compiler/core/GraphQLIRPrinter.js | 5 +++++ .../core/__tests__/GraphQLIRVisitor-test.js | 2 ++ .../__snapshots__/GraphQLIRVisitor-test.js.snap | 2 +- .../__snapshots__/RelayPrinter-test.js.snap | 6 ++++++ .../fixtures/printer/kitchen-sink.graphql | 3 +++ .../RefineOperationVariablesTransform-test.js.snap | 2 +- packages/relay-test-utils/RelayTestSchema.js | 14 ++------------ packages/relay-test-utils/package.json | 2 +- 10 files changed, 23 insertions(+), 15 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index ce025a515b9e6..631e7c9ecfe72 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -59,6 +59,7 @@ const babelOptions = require('./scripts/getBabelOptions')({ 'fb-watchman': 'fb-watchman', fs: 'fs', graphql: 'graphql', + 'graphql-compose': 'graphql-compose', immutable: 'immutable', iterall: 'iterall', net: 'net', diff --git a/package.json b/package.json index a144e850214f8..f75a54f2c551f 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "fbjs-scripts": "^1.0.0", "flow-bin": "^0.92.0", "graphql": "^14.1.0", + "graphql-compose": "^5.9.1", "gulp": "4.0.0", "gulp-babel": "8.0.0", "gulp-chmod": "2.0.0", diff --git a/packages/relay-compiler/core/GraphQLIRPrinter.js b/packages/relay-compiler/core/GraphQLIRPrinter.js index c55196708f3ac..e1fc53809a561 100644 --- a/packages/relay-compiler/core/GraphQLIRPrinter.js +++ b/packages/relay-compiler/core/GraphQLIRPrinter.js @@ -16,6 +16,7 @@ const {DEFAULT_HANDLE_KEY} = require('../util/DefaultHandleKey'); const { GraphQLEnumType, GraphQLInputObjectType, + GraphQLScalarType, GraphQLList, GraphQLNonNull, } = require('graphql'); @@ -313,6 +314,10 @@ function printLiteral(value: mixed, type: ?GraphQLInputType): string { ); return result; } + if (type instanceof GraphQLScalarType) { + const result = type.serialize(value); + return JSON.stringify(result); + } if (Array.isArray(value)) { invariant( type instanceof GraphQLList, diff --git a/packages/relay-compiler/core/__tests__/GraphQLIRVisitor-test.js b/packages/relay-compiler/core/__tests__/GraphQLIRVisitor-test.js index ed6424ae04277..529d23e0fad9a 100644 --- a/packages/relay-compiler/core/__tests__/GraphQLIRVisitor-test.js +++ b/packages/relay-compiler/core/__tests__/GraphQLIRVisitor-test.js @@ -101,6 +101,8 @@ describe('GraphQLIRVisitor', () => { return 'MOBILE'; } else if (value === 'HELPFUL') { return 'DERISIVE'; + } else if (typeof value === 'number') { + return value + 10; } else { return String(value) + '_mutated'; } diff --git a/packages/relay-compiler/core/__tests__/__snapshots__/GraphQLIRVisitor-test.js.snap b/packages/relay-compiler/core/__tests__/__snapshots__/GraphQLIRVisitor-test.js.snap index ed2848f7a7551..1f98c8db900c5 100644 --- a/packages/relay-compiler/core/__tests__/__snapshots__/GraphQLIRVisitor-test.js.snap +++ b/packages/relay-compiler/core/__tests__/__snapshots__/GraphQLIRVisitor-test.js.snap @@ -88,7 +88,7 @@ fragment UserFragment_mutated on User @argumentDefinitions( ... on Mutated @skip(if: $cond_mutated) { name_mutated } - thumbnail: profilePicture_mutated(size_mutated: "32_mutated") { + thumbnail: profilePicture_mutated(size_mutated: 42) { height_mutated width_mutated src: uri_mutated diff --git a/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap b/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap index 09f8058f8dd6a..1655343c02a97 100644 --- a/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap +++ b/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap @@ -36,6 +36,9 @@ fragment UserFragment on User @argumentDefinitions( friends(after: $after, first: $first, traits: [HELPFUL]) { count } + secondFriends: friends(first: 10) { + count + } name @include(if: $cond) otherName: name @customDirective(level: 3) thumbnail: profilePicture(size: 32, cropPosition: CENTER, fileExtension: PNG) { @@ -88,6 +91,9 @@ fragment UserFragment on User @argumentDefinitions( friends(after: $after, first: $first, traits: [HELPFUL]) { count } + secondFriends: friends(first: 10) { + count + } name @include(if: $cond) otherName: name @customDirective(level: 3) thumbnail: profilePicture(size: 32, cropPosition: CENTER, fileExtension: PNG) { diff --git a/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql b/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql index e9fbfff44f81c..8881028768b99 100644 --- a/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql +++ b/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql @@ -32,6 +32,9 @@ fragment UserFragment on User @argumentDefinitions( friends(after: $after, first: $first, traits: [HELPFUL]) { count } + secondFriends: friends(first: 10) { + count + } name @include(if: $cond) otherName: name @customDirective(level: 3) thumbnail: profilePicture(size: 32, cropPosition: CENTER, fileExtension: PNG) { diff --git a/packages/relay-compiler/transforms/__tests__/__snapshots__/RefineOperationVariablesTransform-test.js.snap b/packages/relay-compiler/transforms/__tests__/__snapshots__/RefineOperationVariablesTransform-test.js.snap index e1fb6156c1c39..5806f27b41971 100644 --- a/packages/relay-compiler/transforms/__tests__/__snapshots__/RefineOperationVariablesTransform-test.js.snap +++ b/packages/relay-compiler/transforms/__tests__/__snapshots__/RefineOperationVariablesTransform-test.js.snap @@ -63,7 +63,7 @@ query TestQuery( query TestQuery2( $usedInTestQuery2: Boolean! ) { - node(id: 4) { + node(id: "4") { ... on Actor { id @skip(if: $usedInTestQuery2) } diff --git a/packages/relay-test-utils/RelayTestSchema.js b/packages/relay-test-utils/RelayTestSchema.js index 2cdefd308a233..17a9d4571c887 100644 --- a/packages/relay-test-utils/RelayTestSchema.js +++ b/packages/relay-test-utils/RelayTestSchema.js @@ -18,16 +18,8 @@ const {buildASTSchema, parse} = require('graphql'); const {SchemaComposer} = require('graphql-compose'); function buildSchema() { - // Compose upstream is going to add AST directives soon, making this simpler const composer = new SchemaComposer(); - const initialSchema = buildASTSchema( - parse(fs.readFileSync(RelayTestSchemaPath, 'utf8'), {assumeValid: true}), - ); - - Object.keys(initialSchema.getTypeMap()).forEach(typeName => { - const type = initialSchema.getType(typeName); - composer.add(type); - }); + composer.addTypeDefs(fs.readFileSync(RelayTestSchemaPath, 'utf8')); const CropPositionETC = composer.getETC('CropPosition'); CropPositionETC.setFields({ @@ -43,9 +35,7 @@ function buildSchema() { PNG: {value: 'png'}, }); - return composer.buildSchema({ - directives: initialSchema.getDirectives(), - }); + return composer.buildSchema(); } module.exports = buildSchema(); diff --git a/packages/relay-test-utils/package.json b/packages/relay-test-utils/package.json index 6d27d75724bd9..955fb27d9ff14 100644 --- a/packages/relay-test-utils/package.json +++ b/packages/relay-test-utils/package.json @@ -13,7 +13,7 @@ "dependencies": { "@babel/runtime": "^7.0.0", "fbjs": "^1.0.0", - "graphql-compose": "^5.8.0", + "graphql-compose": "^5.9.1", "iterall": "^1.2.1", "prop-types": "^15.5.8", "relay-compiler": "2.0.0", From 186d5eaf6df4d79e1662904789bb7b36473f301e Mon Sep 17 00:00:00 2001 From: Mikhail Novikov Date: Fri, 8 Feb 2019 09:55:54 +0200 Subject: [PATCH 3/6] Use extend schema to do the test --- gulpfile.js | 1 - package.json | 1 - .../__snapshots__/RelayPrinter-test.js.snap | 4 +- .../fixtures/printer/kitchen-sink.graphql | 2 +- packages/relay-test-utils/RelayTestSchema.js | 62 +++++++++++++------ packages/relay-test-utils/package.json | 1 - packages/relay-test-utils/testschema.graphql | 36 ++++++----- 7 files changed, 68 insertions(+), 39 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 631e7c9ecfe72..ce025a515b9e6 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -59,7 +59,6 @@ const babelOptions = require('./scripts/getBabelOptions')({ 'fb-watchman': 'fb-watchman', fs: 'fs', graphql: 'graphql', - 'graphql-compose': 'graphql-compose', immutable: 'immutable', iterall: 'iterall', net: 'net', diff --git a/package.json b/package.json index f75a54f2c551f..a144e850214f8 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,6 @@ "fbjs-scripts": "^1.0.0", "flow-bin": "^0.92.0", "graphql": "^14.1.0", - "graphql-compose": "^5.9.1", "gulp": "4.0.0", "gulp-babel": "8.0.0", "gulp-chmod": "2.0.0", diff --git a/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap b/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap index 1655343c02a97..a58aa0b42d572 100644 --- a/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap +++ b/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap @@ -41,7 +41,7 @@ fragment UserFragment on User @argumentDefinitions( } name @include(if: $cond) otherName: name @customDirective(level: 3) - thumbnail: profilePicture(size: 32, cropPosition: CENTER, fileExtension: PNG) { + thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG) { height width src: uri @@ -96,7 +96,7 @@ fragment UserFragment on User @argumentDefinitions( } name @include(if: $cond) otherName: name @customDirective(level: 3) - thumbnail: profilePicture(size: 32, cropPosition: CENTER, fileExtension: PNG) { + thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG) { height width src: uri diff --git a/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql b/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql index 8881028768b99..6c8dd702c0e68 100644 --- a/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql +++ b/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql @@ -37,7 +37,7 @@ fragment UserFragment on User @argumentDefinitions( } name @include(if: $cond) otherName: name @customDirective(level: 3) - thumbnail: profilePicture(size: 32, cropPosition: CENTER, fileExtension: PNG) { + thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG) { height width src: uri diff --git a/packages/relay-test-utils/RelayTestSchema.js b/packages/relay-test-utils/RelayTestSchema.js index 17a9d4571c887..0805ebe0dff8c 100644 --- a/packages/relay-test-utils/RelayTestSchema.js +++ b/packages/relay-test-utils/RelayTestSchema.js @@ -14,28 +14,54 @@ const RelayTestSchemaPath = require('./RelayTestSchemaPath'); const fs = require('fs'); -const {buildASTSchema, parse} = require('graphql'); -const {SchemaComposer} = require('graphql-compose'); +const { + buildASTSchema, + parse, + GraphQLEnumType, + GraphQLSchema, + extendSchema, +} = require('graphql'); function buildSchema() { - const composer = new SchemaComposer(); - composer.addTypeDefs(fs.readFileSync(RelayTestSchemaPath, 'utf8')); - - const CropPositionETC = composer.getETC('CropPosition'); - CropPositionETC.setFields({ - TOP: {value: 1}, - CENTER: {value: 2}, - BOTTOM: {value: 3}, - LEFT: {value: 4}, - RIGHT: {value: 5}, + const CropPosition = new GraphQLEnumType({ + name: 'CropPosition', + values: { + TOP: {value: 1}, + CENTER: {value: 2}, + BOTTOM: {value: 3}, + LEFT: {value: 4}, + RIGHT: {value: 5}, + }, }); - const FileExtensionETC = composer.getETC('FileExtension'); - FileExtensionETC.setFields({ - JPG: {value: 'jpg'}, - PNG: {value: 'png'}, + const FileExtension = new GraphQLEnumType({ + name: 'FileExtension', + values: { + JPG: {value: 'jpg'}, + PNG: {value: 'png'}, + }, }); - - return composer.buildSchema(); + let schema = new GraphQLSchema({ + types: [CropPosition, FileExtension], + }); + schema = extendSchema( + schema, + parse(fs.readFileSync(RelayTestSchemaPath, 'utf8')), + ); + // AST Builder doesn't allow things undefined in AST to be argument types it + // seems + return extendSchema( + schema, + parse(` + extend type User { + profilePicture2( + size: [Int], + preset: PhotoSize, + cropPosition: CropPosition, + fileExtension: FileExtension + ): Image + } + `), + ); } module.exports = buildSchema(); diff --git a/packages/relay-test-utils/package.json b/packages/relay-test-utils/package.json index 955fb27d9ff14..2aedcb96ae888 100644 --- a/packages/relay-test-utils/package.json +++ b/packages/relay-test-utils/package.json @@ -13,7 +13,6 @@ "dependencies": { "@babel/runtime": "^7.0.0", "fbjs": "^1.0.0", - "graphql-compose": "^5.9.1", "iterall": "^1.2.1", "prop-types": "^15.5.8", "relay-compiler": "2.0.0", diff --git a/packages/relay-test-utils/testschema.graphql b/packages/relay-test-utils/testschema.graphql index 0a50292e9dd99..d7c2e46354a0a 100644 --- a/packages/relay-test-utils/testschema.graphql +++ b/packages/relay-test-utils/testschema.graphql @@ -206,6 +206,13 @@ type Comment implements Node { message: Text name: String profilePicture(size: [Int], preset: PhotoSize): Image + # This is added in RelayTestSchema + # profilePicture2( + # size: [Int], + # preset: PhotoSize, + # cropPosition: CropPosition, + # fileExtension: FileExtension + # ): Image segments(first: Int): Segments screennames: [Screenname] subscribeStatus: String @@ -746,9 +753,7 @@ type User implements Named & Node & Actor { storyCommentSearch(query: StoryCommentSearchInput): [Comment] profilePicture( size: [Int], - preset: PhotoSize, - cropPosition: CropPosition, - fileExtension: FileExtension + preset: PhotoSize ): Image profile_picture(scale: Float): Image segments(first: Int): Segments @@ -843,18 +848,19 @@ enum TopLevelCommentsOrdering { toplevel } -enum CropPosition { - TOP - CENTER - BOTTOM - LEFT - RIGHT -} - -enum FileExtension { - JPG - PNG -} +# This is added in RelayTestSchema +# enum CropPosition { +# TOP +# CENTER +# BOTTOM +# LEFT +# RIGHT +# } +# +# enum FileExtension { +# JPG +# PNG +# } type Settings { cache_id: ID From dea43d51124b79ffdcaed39a02e2dbb5410a3b37 Mon Sep 17 00:00:00 2001 From: Mikhail Novikov Date: Tue, 12 Feb 2019 15:51:41 +0200 Subject: [PATCH 4/6] Add additional regression case for JSON scalar returning different error --- .../__snapshots__/RelayPrinter-test.js.snap | 6 +-- .../fixtures/printer/kitchen-sink.graphql | 2 +- packages/relay-test-utils/RelayTestSchema.js | 49 ++++++++++++++++++- packages/relay-test-utils/testschema.graphql | 3 +- 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap b/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap index a58aa0b42d572..42fa9c0a2f314 100644 --- a/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap +++ b/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap @@ -41,10 +41,10 @@ fragment UserFragment on User @argumentDefinitions( } name @include(if: $cond) otherName: name @customDirective(level: 3) - thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG) { + thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG, additionalParameters: { filter: "Boston" }) { height width - src: uri + src: uri, } profilePicture(size: $size) @include(if: $cond) @skip(if: $foo) { height @@ -96,7 +96,7 @@ fragment UserFragment on User @argumentDefinitions( } name @include(if: $cond) otherName: name @customDirective(level: 3) - thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG) { + thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG, additionalParameters: {"filter":"Boston"}) { height width src: uri diff --git a/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql b/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql index 6c8dd702c0e68..032f16108302f 100644 --- a/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql +++ b/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql @@ -37,7 +37,7 @@ fragment UserFragment on User @argumentDefinitions( } name @include(if: $cond) otherName: name @customDirective(level: 3) - thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG) { + thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG, additionalParameters: { filter: "Boston" }) { height width src: uri diff --git a/packages/relay-test-utils/RelayTestSchema.js b/packages/relay-test-utils/RelayTestSchema.js index 0805ebe0dff8c..4ce493eda929c 100644 --- a/packages/relay-test-utils/RelayTestSchema.js +++ b/packages/relay-test-utils/RelayTestSchema.js @@ -19,6 +19,8 @@ const { parse, GraphQLEnumType, GraphQLSchema, + GraphQLScalarType, + Kind, extendSchema, } = require('graphql'); @@ -41,7 +43,7 @@ function buildSchema() { }, }); let schema = new GraphQLSchema({ - types: [CropPosition, FileExtension], + types: [CropPosition, FileExtension, GraphQLJSONType], }); schema = extendSchema( schema, @@ -58,10 +60,55 @@ function buildSchema() { preset: PhotoSize, cropPosition: CropPosition, fileExtension: FileExtension + additionalParameters: JSON ): Image } `), ); } +function identity(value) { + return value; +} + +function parseLiteral(ast, variables) { + switch (ast.kind) { + case Kind.STRING: + case Kind.BOOLEAN: + return ast.value; + case Kind.INT: + case Kind.FLOAT: + return parseFloat(ast.value); + case Kind.OBJECT: { + const value = Object.create(null); + ast.fields.forEach(field => { + value[field.name.value] = parseLiteral(field.value, variables); + }); + + return value; + } + case Kind.LIST: + return ast.values.map(n => parseLiteral(n, variables)); + case Kind.NULL: + return null; + case Kind.VARIABLE: { + const name = ast.name.value; + return variables ? variables[name] : undefined; + } + default: + return undefined; + } +} + +const GraphQLJSONType = new GraphQLScalarType({ + name: 'JSON', + description: + 'The `JSON` scalar type represents JSON values as specified by ' + + '[ECMA-404](http://www.ecma-international.org/' + + 'publications/files/ECMA-ST/ECMA-404.pdf).', + serialize: identity, + parseValue: identity, + parseLiteral, +}); + module.exports = buildSchema(); diff --git a/packages/relay-test-utils/testschema.graphql b/packages/relay-test-utils/testschema.graphql index d7c2e46354a0a..9f1e0fc3a2c3d 100644 --- a/packages/relay-test-utils/testschema.graphql +++ b/packages/relay-test-utils/testschema.graphql @@ -211,7 +211,8 @@ type Comment implements Node { # size: [Int], # preset: PhotoSize, # cropPosition: CropPosition, - # fileExtension: FileExtension + # fileExtension: FileExtension, + # additionalParameters: JSON # ): Image segments(first: Int): Segments screennames: [Screenname] From 3c32028e36d4744352ecbdc3e369d26a0fb133c1 Mon Sep 17 00:00:00 2001 From: Mikhail Novikov Date: Tue, 12 Feb 2019 17:22:10 +0200 Subject: [PATCH 5/6] Fix stray comma --- .../core/__tests__/__snapshots__/RelayPrinter-test.js.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap b/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap index 42fa9c0a2f314..d823ce50d3042 100644 --- a/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap +++ b/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap @@ -44,7 +44,7 @@ fragment UserFragment on User @argumentDefinitions( thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG, additionalParameters: { filter: "Boston" }) { height width - src: uri, + src: uri } profilePicture(size: $size) @include(if: $cond) @skip(if: $foo) { height From a68d585157ed8f04152bd65189d10b24d30a58db Mon Sep 17 00:00:00 2001 From: Mikhail Novikov Date: Thu, 14 Feb 2019 15:17:01 +0200 Subject: [PATCH 6/6] Fixed bug and added additional repro --- packages/relay-compiler/core/GraphQLIRPrinter.js | 2 +- .../core/__tests__/__snapshots__/RelayPrinter-test.js.snap | 4 ++-- .../core/__tests__/fixtures/printer/kitchen-sink.graphql | 2 +- packages/relay-test-utils/RelayTestSchema.js | 5 +++++ 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/relay-compiler/core/GraphQLIRPrinter.js b/packages/relay-compiler/core/GraphQLIRPrinter.js index e1fc53809a561..9ce10a1b33b97 100644 --- a/packages/relay-compiler/core/GraphQLIRPrinter.js +++ b/packages/relay-compiler/core/GraphQLIRPrinter.js @@ -314,7 +314,7 @@ function printLiteral(value: mixed, type: ?GraphQLInputType): string { ); return result; } - if (type instanceof GraphQLScalarType) { + if (type instanceof GraphQLScalarType && value != null) { const result = type.serialize(value); return JSON.stringify(result); } diff --git a/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap b/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap index d823ce50d3042..345f7c8db100e 100644 --- a/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap +++ b/packages/relay-compiler/core/__tests__/__snapshots__/RelayPrinter-test.js.snap @@ -41,7 +41,7 @@ fragment UserFragment on User @argumentDefinitions( } name @include(if: $cond) otherName: name @customDirective(level: 3) - thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG, additionalParameters: { filter: "Boston" }) { + thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG, additionalParameters: { filter: "Boston" }, options: { newName: null}) { height width src: uri @@ -96,7 +96,7 @@ fragment UserFragment on User @argumentDefinitions( } name @include(if: $cond) otherName: name @customDirective(level: 3) - thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG, additionalParameters: {"filter":"Boston"}) { + thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG, additionalParameters: {"filter":"Boston"}, options: {newName: null}) { height width src: uri diff --git a/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql b/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql index 032f16108302f..17be69a83cef3 100644 --- a/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql +++ b/packages/relay-compiler/core/__tests__/fixtures/printer/kitchen-sink.graphql @@ -37,7 +37,7 @@ fragment UserFragment on User @argumentDefinitions( } name @include(if: $cond) otherName: name @customDirective(level: 3) - thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG, additionalParameters: { filter: "Boston" }) { + thumbnail: profilePicture2(size: 32, cropPosition: CENTER, fileExtension: PNG, additionalParameters: { filter: "Boston" }, options: { newName: null}) { height width src: uri diff --git a/packages/relay-test-utils/RelayTestSchema.js b/packages/relay-test-utils/RelayTestSchema.js index 4ce493eda929c..4b437c8eb6a1d 100644 --- a/packages/relay-test-utils/RelayTestSchema.js +++ b/packages/relay-test-utils/RelayTestSchema.js @@ -54,6 +54,10 @@ function buildSchema() { return extendSchema( schema, parse(` + input ProfilePictureOptions { + newName: String + } + extend type User { profilePicture2( size: [Int], @@ -61,6 +65,7 @@ function buildSchema() { cropPosition: CropPosition, fileExtension: FileExtension additionalParameters: JSON + options: ProfilePictureOptions ): Image } `),