diff --git a/src/index.js b/src/index.js index 325fd44c..f52711e4 100644 --- a/src/index.js +++ b/src/index.js @@ -118,6 +118,7 @@ function stripLoc(doc, removeLocAtThisLevel) { return doc; } +var experimentalFragmentVariables = false; function parseDocument(doc) { var cacheKey = normalize(doc); @@ -125,7 +126,7 @@ function parseDocument(doc) { return docCache[cacheKey]; } - var parsed = parse(doc); + var parsed = parse(doc, { experimentalFragmentVariables: experimentalFragmentVariables }); if (!parsed || parsed.kind !== 'Document') { throw new Error('Not a valid GraphQL document.'); } @@ -139,6 +140,14 @@ function parseDocument(doc) { return parsed; } +function enableExperimentalFragmentVariables() { + experimentalFragmentVariables = true; +} + +function disableExperimentalFragmentVariables() { + experimentalFragmentVariables = false; +} + // XXX This should eventually disallow arbitrary string interpolation, like Relay does function gql(/* arguments */) { var args = Array.prototype.slice.call(arguments); @@ -165,5 +174,7 @@ function gql(/* arguments */) { gql.default = gql; gql.resetCaches = resetCaches; gql.disableFragmentWarnings = disableFragmentWarnings; +gql.enableExperimentalFragmentVariables = enableExperimentalFragmentVariables; +gql.disableExperimentalFragmentVariables = disableExperimentalFragmentVariables; module.exports = gql; diff --git a/test/graphql.js b/test/graphql.js index 19cb7e36..726e3918 100644 --- a/test/graphql.js +++ b/test/graphql.js @@ -83,6 +83,16 @@ const assert = require('chai').assert; assert.equal(module.exports.Q2.definitions.length, 1); }); + it('parses fragments with variable definitions', () => { + gql.enableExperimentalFragmentVariables(); + + const parsed = gql`fragment A ($arg: String!) on Type { testQuery }`; + assert.equal(parsed.kind, 'Document'); + assert.exists(parsed.definitions[0].variableDefinitions); + + gql.disableExperimentalFragmentVariables() + }); + // see https://github.com/apollographql/graphql-tag/issues/168 it('does not nest queries needlessly in named exports', () => { const jsSource = loader.call({ cacheable() {} }, `