From 5eebdd38b7e20b4c267484602dc2fb57ba547994 Mon Sep 17 00:00:00 2001 From: Kevin Sullivan Date: Fri, 5 Oct 2018 23:04:14 -0500 Subject: [PATCH 1/2] Fix error when printing a `FieldDefinition` AST node without arguments --- src/language/printer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/language/printer.js b/src/language/printer.js index 949f7c22c7..66783a87f9 100644 --- a/src/language/printer.js +++ b/src/language/printer.js @@ -134,7 +134,7 @@ const printDocASTReducer = { ), FieldDefinition: addDescription( - ({ name, arguments: args, type, directives }) => + ({ name, arguments: args = [], type, directives }) => name + (args.every(arg => arg.indexOf('\n') === -1) ? wrap('(', join(args, ', '), ')') From 16fdfd7f7dc0c6bbc7c20f8e48a96d8eb1c3aab2 Mon Sep 17 00:00:00 2001 From: Ivan Goncharov Date: Tue, 9 Oct 2018 17:56:11 +0300 Subject: [PATCH 2/2] Generalize solution --- src/language/printer.js | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/language/printer.js b/src/language/printer.js index 66783a87f9..6ade5f6235 100644 --- a/src/language/printer.js +++ b/src/language/printer.js @@ -134,11 +134,11 @@ const printDocASTReducer = { ), FieldDefinition: addDescription( - ({ name, arguments: args = [], type, directives }) => + ({ name, arguments: args, type, directives }) => name + - (args.every(arg => arg.indexOf('\n') === -1) - ? wrap('(', join(args, ', '), ')') - : wrap('(\n', indent(join(args, '\n')), '\n)')) + + (hasMultilineItems(args) + ? wrap('(\n', indent(join(args, '\n')), '\n)') + : wrap('(', join(args, ', '), ')')) + ': ' + type + wrap(' ', join(directives, ' ')), @@ -184,9 +184,9 @@ const printDocASTReducer = { ({ name, arguments: args, locations }) => 'directive @' + name + - (args.every(arg => arg.indexOf('\n') === -1) - ? wrap('(', join(args, ', '), ')') - : wrap('(\n', indent(join(args, '\n')), '\n)')) + + (hasMultilineItems(args) + ? wrap('(\n', indent(join(args, '\n')), '\n)') + : wrap('(', join(args, ', '), ')')) + ' on ' + join(locations, ' | '), ), @@ -264,6 +264,14 @@ function indent(maybeString) { return maybeString && ' ' + maybeString.replace(/\n/g, '\n '); } +function isMultiline(string) { + return string.indexOf('\n') !== -1; +} + +function hasMultilineItems(maybeArray) { + return maybeArray && maybeArray.some(isMultiline); +} + /** * Print a block string in the indented block form by adding a leading and * trailing blank line. However, if a block string starts with whitespace and is @@ -271,7 +279,7 @@ function indent(maybeString) { */ function printBlockString(value, isDescription) { const escaped = value.replace(/"""/g, '\\"""'); - return (value[0] === ' ' || value[0] === '\t') && value.indexOf('\n') === -1 - ? `"""${escaped.replace(/"$/, '"\n')}"""` - : `"""\n${isDescription ? escaped : indent(escaped)}\n"""`; + return isMultiline(value) || (value[0] !== ' ' && value[0] !== '\t') + ? `"""\n${isDescription ? escaped : indent(escaped)}\n"""` + : `"""${escaped.replace(/"$/, '"\n')}"""`; }