Skip to content

@leebyron leebyron released this Dec 16, 2017 · 825 commits to master since this release

🎁 Happy Holidays, GraphQL.js v0.12.0 is brings some of the biggest new changes of the year 🎉

This release includes new spec-compliance to existing experimental features, dramatically improves the quality of flow types, and introduces a number of new features and improved behaviors. As a result, there are a number of breaking changes to be aware of, especially for those building tools with GraphQL.js. A huge thank you to everyone who contributes to and uses GraphQL.js.

For a complete list of everything new, see the comparison to the last release.

New and Potentially Breaking:

  • Schema is now validated as part of a new exported function validateSchema() instead of during construction. (#1124)

    This exciting change allows the creating GraphQLSchema instances which are not yet valid, for example: representing types which don't yet have fields. This is very useful for those building schema directly from the new schema definition language. The new function validateSchema(), much like the existing validate(), will return an Array of GraphQLError describing all issues with a schema. This also now includes blame sites in the original schema definition language, allowing much more helpful error messages when a schema is invalid. This might be breaking if your codebase relied on GraphQLSchema or any of the GraphQL type definition classes

  • Validation errors for value literals (and variable values) are greatly improved, doing so results in a change to the standard set of validation rules. (#1126, #1133, #1144, #1153)

    Code which relied on repeating the standard validation rules, or filtered them down using whitelists or blacklists may need to be updated. The rules ArgumentsOfCorrectTypeRule and DefaultValuesOfCorrectTypeRule have been removed and are replaced with two new rules ValuesOfCorrectTypeRule and VariablesDefaultValueAllowedRule. While the quality of validation errors are improved by this change, this does not actually cause any existing valid documents to become invalid or vice-versa.

  • GraphQL can now execute synchronously if all resolvers are synchronous functions. This means execute() may no longer return a Promise if execution completed synchronously. The graphql() function will still always return a Promise, but a new graphqlSync() function guarantees synchronous completion (or throws if any resolver does not complete). This unlocks exciting new use cases for querying over static data-sets and caches. (#1115, #1120)

  • Update to match Schema definition language latest specification. (#1102, #1117, #1139)

    The schema definition language has some slight changes from the original experimental version through the standardization process. New extend forms were added and previously valid forms which omit fields like type Foo {} are now syntax errors and can be replaced with type Foo to indicate that fields are not yet defined.

  • Descriptions in the schema definition language are now represented as preceding strings rather than comments. (#927)

    This change follows the latest updates to the spec proposal (graphql/graphql-spec#90) after a long discussion between the merits of comments vs. literals as descriptions. To ease the migration to this latest change, existing comment-descriptions can still be used by providing options to the relevant functions. To read a SDL that uses comments as descriptions, buildASTSchema(document, { commentDescriptions: true }); to write an SDL using comments as descriptions, printSchema(schema, { commentDescriptions: true }).

  • Allow serializing scalars as null. (#1104)

    Since null is a potentially valid value for a scalar to serialize to in some rare conditions, this change ensures that scalars which serialize to null no longer produce errors. This is breaking since custom scalars which relied on returning null to indicate failure should now either return undefined or throw an Error.

  • Flow types for the parsed GraphQL AST and GraphQL Errors are now read only. This may result in new flow errors being detected in your codebase if you manipulate ASTs and Errors. (#1116, #1121, #1122)

New & Improved:

  • Flow types have been added to visit(). As with any flow type improvement, this could expose real issues with your existing codebase. (#1155)
  • New predicate functions are exported for all GraphQL types. This should remove the need to use instanceof for any use of GraphQL.js (#1137)
  • The Wrapping Types GraphQLNonNull and GraphQLList are now flow typed as covariant and operate like a function instead of a class. This means that you should no longer type new GraphQLList(someType) and instead favor GraphQLList(someType). (#1136)
  • A new function printError() is exported which highlights any blame lines from the original sources. Useful for printing errors to consoles. (#1129, #1131)
  • Improved aggregate NullableType and InputType flow types. As with any flow type improvement, this could expose real issues with your existing codebase. (#1128)
  • A new function getIntrospectionQuery() is exported, and the existing introspectionQuery constant is deprecated. This helps improve the flow types and allows for some flexibility and options. (#1113)
  • Export ES6 modules so tools like Rollup and Webpack can use "tree shaking" for smaller builds. (#1105)
  • More strict flow typing for Introspection results. (#1082)
  • Improve error quality when receiving bad introspection data. (#1063)
  • Ability to extend GraphQL errors with additional "extensions" properties. (#928)
  • New value literal "Block String" for writing long-form text (#926)
  • New predicate functions isSpecifiedScalarType, isIntrospectionType, and isSpecifiedDirective (#924).
  • Better coverage for findBreakingChanges() and findDangerousChanges()
    • Detect breaking changes within directives (#1152)
    • Detect added nullable input field or added nullable argument. (#1096)
    • Adding an interface to a type is a dangerous change. (#992)


  • Fix path argument for visit() for leaving visitors. (#1149)
  • Errors concerning multiple instances of GraphQL.js being in use at the same time are now reported much more clearly and in more scenarios. (73b804b)
  • The GraphQLArgs flow type is now exported. (#1118)
  • Fix a possible infinite loop during validation for invalid queries in the OverlappingFields rule. (#1111)
  • Subscriptions now ensure resolver errors are reported properly during initialization. (#1106, #1107)
  • Ensure uniform parsing of named queries and anonymous queries (#1094)
  • Fix elasticsearch errors being mistaken for GraphQL errors. (#1090)
  • Avoid process is undefined error when used in the browser. (#1058)
  • Fix mistake in how TypeInfo handles inline fragments without type (#1041)
  • Fix mistake in how TypeInfo collects input types (#1143)
  • Check isDeprecated instead of deprecationReason in printDeprecated() (#1035)
  • Fix flow types for 'path' & 'parentType' of GraphQLResolveInfo (#1033)
  • Fix utilization of argument default values in buildASTSchema(), extendSchema() and buildClientSchema(). (#903)
Assets 2
You can’t perform that action at this time.