diff --git a/CHANGELOG.unreleased.md b/CHANGELOG.unreleased.md index bb4ea1b0..3281eabc 100644 --- a/CHANGELOG.unreleased.md +++ b/CHANGELOG.unreleased.md @@ -239,6 +239,21 @@ Examples:
``` +- GraphQL: Support GraphQL fragment variables ([#6016] by [@adek05]) + + ``` + // Input + fragment F($var: Int) on Type { node } + + // Output (Prettier stable) + // Fails to parse + + // Output (Prettier master) + fragment F($var: Int) on Type { + node + } + ``` + - TypeScript: Support `readonly` operator ([#6027] by [@ikatyang]) diff --git a/src/language-graphql/parser-graphql.js b/src/language-graphql/parser-graphql.js index 9aafc271..4d930d47 100644 --- a/src/language-graphql/parser-graphql.js +++ b/src/language-graphql/parser-graphql.js @@ -36,10 +36,15 @@ function removeTokens(node) { } function fallbackParser(parse, source) { + const parserOptions = { + allowLegacySDLImplementsInterfaces: false, + experimentalFragmentVariables: true + }; try { - return parse(source, { allowLegacySDLImplementsInterfaces: false }); + return parse(source, parserOptions); } catch (_) { - return parse(source, { allowLegacySDLImplementsInterfaces: true }); + parserOptions.allowLegacySDLImplementsInterfaces = true; + return parse(source, parserOptions); } } diff --git a/src/language-graphql/printer-graphql.js b/src/language-graphql/printer-graphql.js index 289a0ea9..78768137 100644 --- a/src/language-graphql/printer-graphql.js +++ b/src/language-graphql/printer-graphql.js @@ -73,6 +73,24 @@ function genericPrint(path, options, print) { return concat([ "fragment ", path.call(print, "name"), + n.variableDefinitions && n.variableDefinitions.length + ? group( + concat([ + "(", + indent( + concat([ + softline, + join( + concat([ifBreak("", ", "), softline]), + path.map(print, "variableDefinitions") + ) + ]) + ), + softline, + ")" + ]) + ) + : "", " on ", path.call(print, "typeCondition"), printDirectives(path, print, n), diff --git a/tests/graphql_fragment_variables/__snapshots__/jsfmt.spec.js.snap b/tests/graphql_fragment_variables/__snapshots__/jsfmt.spec.js.snap new file mode 100644 index 00000000..b89bfbd3 --- /dev/null +++ b/tests/graphql_fragment_variables/__snapshots__/jsfmt.spec.js.snap @@ -0,0 +1,29 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`fragment_variables.graphql 1`] = ` +====================================options===================================== +parsers: ["graphql"] +printWidth: 80 + | printWidth +=====================================input====================================== +fragment F($var: Int) on Type { + field +} + +fragment G($first_variable: Int, $second_variable: String = "Very complex default argument value") on Type { + field +} +=====================================output===================================== +fragment F($var: Int) on Type { + field +} + +fragment G( + $first_variable: Int + $second_variable: String = "Very complex default argument value" +) on Type { + field +} + +================================================================================ +`; diff --git a/tests/graphql_fragment_variables/fragment_variables.graphql b/tests/graphql_fragment_variables/fragment_variables.graphql new file mode 100644 index 00000000..02fe672e --- /dev/null +++ b/tests/graphql_fragment_variables/fragment_variables.graphql @@ -0,0 +1,7 @@ +fragment F($var: Int) on Type { + field +} + +fragment G($first_variable: Int, $second_variable: String = "Very complex default argument value") on Type { + field +} \ No newline at end of file diff --git a/tests/graphql_fragment_variables/jsfmt.spec.js b/tests/graphql_fragment_variables/jsfmt.spec.js new file mode 100644 index 00000000..4612e6ac --- /dev/null +++ b/tests/graphql_fragment_variables/jsfmt.spec.js @@ -0,0 +1 @@ +run_spec(__dirname, ["graphql"]); diff --git a/tests_integration/__tests__/__snapshots__/format.js.snap b/tests_integration/__tests__/__snapshots__/format.js.snap index 405a972b..e25b72a3 100644 --- a/tests_integration/__tests__/__snapshots__/format.js.snap +++ b/tests_integration/__tests__/__snapshots__/format.js.snap @@ -4,8 +4,6 @@ exports[`html parser should handle CRLF correctly 1`] = `"\\"