"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var visitor_1 = require("graphql/language/visitor"); var getFromAST_1 = require("./getFromAST"); var filterInPlace_1 = require("./util/filterInPlace"); var ts_invariant_1 = require("ts-invariant"); var storeUtils_1 = require("./storeUtils"); var TYPENAME_FIELD = { kind: 'Field', name: { kind: 'Name', value: '__typename', }, }; function isEmpty(op, fragments) { return op.selectionSet.selections.every(function (selection) { return selection.kind === 'FragmentSpread' && isEmpty(fragments[selection.name.value], fragments); }); } function nullIfDocIsEmpty(doc) { return isEmpty(getFromAST_1.getOperationDefinition(doc) || getFromAST_1.getFragmentDefinition(doc), getFromAST_1.createFragmentMap(getFromAST_1.getFragmentDefinitions(doc))) ? null : doc; } function getDirectiveMatcher(directives) { return function directiveMatcher(directive) { return directives.some(function (dir) { return (dir.name && dir.name === directive.name.value) || (dir.test && dir.test(directive)); }); }; } function removeDirectivesFromDocument(directives, doc) { var variablesInUse = Object.create(null); var variablesToRemove = []; var fragmentSpreadsInUse = Object.create(null); var fragmentSpreadsToRemove = []; var modifiedDoc = nullIfDocIsEmpty(visitor_1.visit(doc, { Variable: { enter: function (node, _key, parent) { if (parent.kind !== 'VariableDefinition') { variablesInUse[node.name.value] = true; } }, }, Field: { enter: function (node) { if (directives && node.directives) { var shouldRemoveField = directives.some(function (directive) { return directive.remove; }); if (shouldRemoveField && node.directives && node.directives.some(getDirectiveMatcher(directives))) { if (node.arguments) { node.arguments.forEach(function (arg) { if (arg.value.kind === 'Variable') { variablesToRemove.push({ name: arg.value.name.value, }); } }); } if (node.selectionSet) { getAllFragmentSpreadsFromSelectionSet(node.selectionSet).forEach(function (frag) { fragmentSpreadsToRemove.push({ name: frag.name.value, }); }); } return null; } } }, }, FragmentSpread: { enter: function (node) { fragmentSpreadsInUse[node.name.value] = true; }, }, Directive: { enter: function (node) { if (getDirectiveMatcher(directives)(node)) { return null; } }, }, })); if (modifiedDoc && filterInPlace_1.filterInPlace(variablesToRemove, function (v) { return !variablesInUse[v.name]; }).length) { modifiedDoc = removeArgumentsFromDocument(variablesToRemove, modifiedDoc); } if (modifiedDoc && filterInPlace_1.filterInPlace(fragmentSpreadsToRemove, function (fs) { return !fragmentSpreadsInUse[fs.name]; }) .length) { modifiedDoc = removeFragmentSpreadFromDocument(fragmentSpreadsToRemove, modifiedDoc); } return modifiedDoc; } exports.removeDirectivesFromDocument = removeDirectivesFromDocument; function addTypenameToDocument(doc) { return visitor_1.visit(getFromAST_1.checkDocument(doc), { SelectionSet: { enter: function (node, _key, parent) { if (parent && parent.kind === 'OperationDefinition') { return; } var selections = node.selections; if (!selections) { return; } var skip = selections.some(function (selection) { return (storeUtils_1.isField(selection) && (selection.name.value === '__typename' || selection.name.value.lastIndexOf('__', 0) === 0)); }); if (skip) { return; } var field = parent; if (storeUtils_1.isField(field) && field.directives && field.directives.some(function (d) { return d.name.value === 'export'; })) { return; } return tslib_1.__assign(tslib_1.__assign({}, node), { selections: tslib_1.__spreadArrays(selections, [TYPENAME_FIELD]) }); }, }, }); } exports.addTypenameToDocument = addTypenameToDocument; var connectionRemoveConfig = { test: function (directive) { var willRemove = directive.name.value === 'connection'; if (willRemove) { if (!directive.arguments || !directive.arguments.some(function (arg) { return arg.name.value === 'key'; })) { ts_invariant_1.invariant.warn('Removing an @connection directive even though it does not have a key. ' + 'You may want to use the key parameter to specify a store key.'); } } return willRemove; }, }; function removeConnectionDirectiveFromDocument(doc) { return removeDirectivesFromDocument([connectionRemoveConfig], getFromAST_1.checkDocument(doc)); } exports.removeConnectionDirectiveFromDocument = removeConnectionDirectiveFromDocument; function hasDirectivesInSelectionSet(directives, selectionSet, nestedCheck) { if (nestedCheck === void 0) { nestedCheck = true; } return (selectionSet && selectionSet.selections && selectionSet.selections.some(function (selection) { return hasDirectivesInSelection(directives, selection, nestedCheck); })); } function hasDirectivesInSelection(directives, selection, nestedCheck) { if (nestedCheck === void 0) { nestedCheck = true; } if (!storeUtils_1.isField(selection)) { return true; } if (!selection.directives) { return false; } return (selection.directives.some(getDirectiveMatcher(directives)) || (nestedCheck && hasDirectivesInSelectionSet(directives, selection.selectionSet, nestedCheck))); } function getDirectivesFromDocument(directives, doc) { getFromAST_1.checkDocument(doc); var parentPath; return nullIfDocIsEmpty(visitor_1.visit(doc, { SelectionSet: { enter: function (node, _key, _parent, path) { var currentPath = path.join('-'); if (!parentPath || currentPath === parentPath || !currentPath.startsWith(parentPath)) { if (node.selections) { var selectionsWithDirectives = node.selections.filter(function (selection) { return hasDirectivesInSelection(directives, selection); }); if (hasDirectivesInSelectionSet(directives, node, false)) { parentPath = currentPath; } return tslib_1.__assign(tslib_1.__assign({}, node), { selections: selectionsWithDirectives }); } else { return null; } } }, }, })); } exports.getDirectivesFromDocument = getDirectivesFromDocument; function getArgumentMatcher(config) { return function argumentMatcher(argument) { return config.some(function (aConfig) { return argument.value && argument.value.kind === 'Variable' && argument.value.name && (aConfig.name === argument.value.name.value || (aConfig.test && aConfig.test(argument))); }); }; } function removeArgumentsFromDocument(config, doc) { var argMatcher = getArgumentMatcher(config); return nullIfDocIsEmpty(visitor_1.visit(doc, { OperationDefinition: { enter: function (node) { return tslib_1.__assign(tslib_1.__assign({}, node), { variableDefinitions: node.variableDefinitions.filter(function (varDef) { return !config.some(function (arg) { return arg.name === varDef.variable.name.value; }); }) }); }, }, Field: { enter: function (node) { var shouldRemoveField = config.some(function (argConfig) { return argConfig.remove; }); if (shouldRemoveField) { var argMatchCount_1 = 0; node.arguments.forEach(function (arg) { if (argMatcher(arg)) { argMatchCount_1 += 1; } }); if (argMatchCount_1 === 1) { return null; } } }, }, Argument: { enter: function (node) { if (argMatcher(node)) { return null; } }, }, })); } exports.removeArgumentsFromDocument = removeArgumentsFromDocument; function removeFragmentSpreadFromDocument(config, doc) { function enter(node) { if (config.some(function (def) { return def.name === node.name.value; })) { return null; } } return nullIfDocIsEmpty(visitor_1.visit(doc, { FragmentSpread: { enter: enter }, FragmentDefinition: { enter: enter }, })); } exports.removeFragmentSpreadFromDocument = removeFragmentSpreadFromDocument; function getAllFragmentSpreadsFromSelectionSet(selectionSet) { var allFragments = []; selectionSet.selections.forEach(function (selection) { if ((storeUtils_1.isField(selection) || storeUtils_1.isInlineFragment(selection)) && selection.selectionSet) { getAllFragmentSpreadsFromSelectionSet(selection.selectionSet).forEach(function (frag) { return allFragments.push(frag); }); } else if (selection.kind === 'FragmentSpread') { allFragments.push(selection); } }); return allFragments; } function buildQueryFromSelectionSet(document) { var definition = getFromAST_1.getMainDefinition(document); var definitionOperation = definition.operation; if (definitionOperation === 'query') { return document; } var modifiedDoc = visitor_1.visit(document, { OperationDefinition: { enter: function (node) { return tslib_1.__assign(tslib_1.__assign({}, node), { operation: 'query' }); }, }, }); return modifiedDoc; } exports.buildQueryFromSelectionSet = buildQueryFromSelectionSet; function removeClientSetsFromDocument(document) { getFromAST_1.checkDocument(document); var modifiedDoc = removeDirectivesFromDocument([ { test: function (directive) { return directive.name.value === 'client'; }, remove: true, }, ], document); if (modifiedDoc) { modifiedDoc = visitor_1.visit(modifiedDoc, { FragmentDefinition: { enter: function (node) { if (node.selectionSet) { var isTypenameOnly = node.selectionSet.selections.every(function (selection) { return storeUtils_1.isField(selection) && selection.name.value === '__typename'; }); if (isTypenameOnly) { return null; } } }, }, }); } return modifiedDoc; } exports.removeClientSetsFromDocument = removeClientSetsFromDocument; //# sourceMappingURL=transform.js.map