UNPKG

graphql-tag

Version:

A JavaScript template literal tag that parses GraphQL queries

121 lines 4.38 kB
import { __assign } from "tslib"; import { parse } from 'graphql'; var docCache = new Map(); var fragmentSourceMap = new Map(); var printFragmentWarnings = true; var experimentalFragmentVariables = false; function normalize(string) { return string.replace(/[\s,]+/g, ' ').trim(); } function cacheKeyFromLoc(loc) { return normalize(loc.source.body.substring(loc.start, loc.end)); } function processFragments(ast) { var seenKeys = new Set(); var definitions = []; ast.definitions.forEach(function (fragmentDefinition) { if (fragmentDefinition.kind === 'FragmentDefinition') { var fragmentName = fragmentDefinition.name.value; var sourceKey = cacheKeyFromLoc(fragmentDefinition.loc); var sourceKeySet = fragmentSourceMap.get(fragmentName); if (sourceKeySet && !sourceKeySet.has(sourceKey)) { if (printFragmentWarnings) { console.warn("Warning: fragment with name " + fragmentName + " already exists.\n" + "graphql-tag enforces all fragment names across your application to be unique; read more about\n" + "this in the docs: http://dev.apollodata.com/core/fragments.html#unique-names"); } } else if (!sourceKeySet) { fragmentSourceMap.set(fragmentName, sourceKeySet = new Set); } sourceKeySet.add(sourceKey); if (!seenKeys.has(sourceKey)) { seenKeys.add(sourceKey); definitions.push(fragmentDefinition); } } else { definitions.push(fragmentDefinition); } }); return __assign(__assign({}, ast), { definitions: definitions }); } function stripLoc(doc) { var workSet = new Set(doc.definitions); workSet.forEach(function (node) { if (node.loc) delete node.loc; Object.keys(node).forEach(function (key) { var value = node[key]; if (value && typeof value === 'object') { workSet.add(value); } }); }); var loc = doc.loc; if (loc) { delete loc.startToken; delete loc.endToken; } return doc; } function parseDocument(source) { var cacheKey = normalize(source); if (!docCache.has(cacheKey)) { var parsed = parse(source, { experimentalFragmentVariables: experimentalFragmentVariables, allowLegacyFragmentVariables: experimentalFragmentVariables }); if (!parsed || parsed.kind !== 'Document') { throw new Error('Not a valid GraphQL document.'); } docCache.set(cacheKey, stripLoc(processFragments(parsed))); } return docCache.get(cacheKey); } export function gql(literals) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } if (typeof literals === 'string') { literals = [literals]; } var result = literals[0]; args.forEach(function (arg, i) { if (arg && arg.kind === 'Document') { result += arg.loc.source.body; } else { result += arg; } result += literals[i + 1]; }); return parseDocument(result); } export function resetCaches() { docCache.clear(); fragmentSourceMap.clear(); } export function disableFragmentWarnings() { printFragmentWarnings = false; } export function enableExperimentalFragmentVariables() { experimentalFragmentVariables = true; } export function disableExperimentalFragmentVariables() { experimentalFragmentVariables = false; } var extras = { gql: gql, resetCaches: resetCaches, disableFragmentWarnings: disableFragmentWarnings, enableExperimentalFragmentVariables: enableExperimentalFragmentVariables, disableExperimentalFragmentVariables: disableExperimentalFragmentVariables }; (function (gql_1) { gql_1.gql = extras.gql, gql_1.resetCaches = extras.resetCaches, gql_1.disableFragmentWarnings = extras.disableFragmentWarnings, gql_1.enableExperimentalFragmentVariables = extras.enableExperimentalFragmentVariables, gql_1.disableExperimentalFragmentVariables = extras.disableExperimentalFragmentVariables; })(gql || (gql = {})); gql["default"] = gql; export default gql; //# sourceMappingURL=index.js.map