function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } import { visit, visitWithTypeInfo } from '../language/visitor'; import { Kind } from '../language/kinds'; import { TypeInfo } from '../utilities/TypeInfo'; /** * An instance of this class is passed as the "this" context to all validators, * allowing access to commonly useful contextual information from within a * validation rule. */ export var ASTValidationContext = /*#__PURE__*/ function () { function ASTValidationContext(ast) { this._ast = ast; this._errors = []; this._fragments = undefined; this._fragmentSpreads = new Map(); this._recursivelyReferencedFragments = new Map(); } var _proto = ASTValidationContext.prototype; _proto.reportError = function reportError(error) { this._errors.push(error); }; _proto.getErrors = function getErrors() { return this._errors; }; _proto.getDocument = function getDocument() { return this._ast; }; _proto.getFragment = function getFragment(name) { var fragments = this._fragments; if (!fragments) { this._fragments = fragments = this.getDocument().definitions.reduce(function (frags, statement) { if (statement.kind === Kind.FRAGMENT_DEFINITION) { frags[statement.name.value] = statement; } return frags; }, Object.create(null)); } return fragments[name]; }; _proto.getFragmentSpreads = function getFragmentSpreads(node) { var spreads = this._fragmentSpreads.get(node); if (!spreads) { spreads = []; var setsToVisit = [node]; while (setsToVisit.length !== 0) { var set = setsToVisit.pop(); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = set.selections[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var selection = _step.value; if (selection.kind === Kind.FRAGMENT_SPREAD) { spreads.push(selection); } else if (selection.selectionSet) { setsToVisit.push(selection.selectionSet); } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } this._fragmentSpreads.set(node, spreads); } return spreads; }; _proto.getRecursivelyReferencedFragments = function getRecursivelyReferencedFragments(operation) { var fragments = this._recursivelyReferencedFragments.get(operation); if (!fragments) { fragments = []; var collectedNames = Object.create(null); var nodesToVisit = [operation.selectionSet]; while (nodesToVisit.length !== 0) { var node = nodesToVisit.pop(); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = this.getFragmentSpreads(node)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var spread = _step2.value; var fragName = spread.name.value; if (collectedNames[fragName] !== true) { collectedNames[fragName] = true; var fragment = this.getFragment(fragName); if (fragment) { fragments.push(fragment); nodesToVisit.push(fragment.selectionSet); } } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return != null) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } } this._recursivelyReferencedFragments.set(operation, fragments); } return fragments; }; return ASTValidationContext; }(); export var SDLValidationContext = /*#__PURE__*/ function (_ASTValidationContext) { _inheritsLoose(SDLValidationContext, _ASTValidationContext); function SDLValidationContext(ast, schema) { var _this; _this = _ASTValidationContext.call(this, ast) || this; _this._schema = schema; return _this; } var _proto2 = SDLValidationContext.prototype; _proto2.getSchema = function getSchema() { return this._schema; }; return SDLValidationContext; }(ASTValidationContext); export var ValidationContext = /*#__PURE__*/ function (_ASTValidationContext2) { _inheritsLoose(ValidationContext, _ASTValidationContext2); function ValidationContext(schema, ast, typeInfo) { var _this2; _this2 = _ASTValidationContext2.call(this, ast) || this; _this2._schema = schema; _this2._typeInfo = typeInfo; _this2._variableUsages = new Map(); _this2._recursiveVariableUsages = new Map(); return _this2; } var _proto3 = ValidationContext.prototype; _proto3.getSchema = function getSchema() { return this._schema; }; _proto3.getVariableUsages = function getVariableUsages(node) { var usages = this._variableUsages.get(node); if (!usages) { var newUsages = []; var typeInfo = new TypeInfo(this._schema); visit(node, visitWithTypeInfo(typeInfo, { VariableDefinition: function VariableDefinition() { return false; }, Variable: function Variable(variable) { newUsages.push({ node: variable, type: typeInfo.getInputType(), defaultValue: typeInfo.getDefaultValue() }); } })); usages = newUsages; this._variableUsages.set(node, usages); } return usages; }; _proto3.getRecursiveVariableUsages = function getRecursiveVariableUsages(operation) { var usages = this._recursiveVariableUsages.get(operation); if (!usages) { usages = this.getVariableUsages(operation); var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = this.getRecursivelyReferencedFragments(operation)[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var frag = _step3.value; usages = usages.concat(this.getVariableUsages(frag)); } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return != null) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } this._recursiveVariableUsages.set(operation, usages); } return usages; }; _proto3.getType = function getType() { return this._typeInfo.getType(); }; _proto3.getParentType = function getParentType() { return this._typeInfo.getParentType(); }; _proto3.getInputType = function getInputType() { return this._typeInfo.getInputType(); }; _proto3.getParentInputType = function getParentInputType() { return this._typeInfo.getParentInputType(); }; _proto3.getFieldDef = function getFieldDef() { return this._typeInfo.getFieldDef(); }; _proto3.getDirective = function getDirective() { return this._typeInfo.getDirective(); }; _proto3.getArgument = function getArgument() { return this._typeInfo.getArgument(); }; return ValidationContext; }(ASTValidationContext);