| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.validate = validate; |
| exports.validateSDL = validateSDL; |
| exports.assertValidSDL = assertValidSDL; |
| exports.assertValidSDLExtension = assertValidSDLExtension; |
| |
| var _devAssert = _interopRequireDefault(require("../jsutils/devAssert")); |
| |
| var _GraphQLError = require("../error/GraphQLError"); |
| |
| var _visitor = require("../language/visitor"); |
| |
| var _validate = require("../type/validate"); |
| |
| var _TypeInfo = require("../utilities/TypeInfo"); |
| |
| var _specifiedRules = require("./specifiedRules"); |
| |
| var _ValidationContext = require("./ValidationContext"); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| /** |
| * Implements the "Validation" section of the spec. |
| * |
| * Validation runs synchronously, returning an array of encountered errors, or |
| * an empty array if no errors were encountered and the document is valid. |
| * |
| * A list of specific validation rules may be provided. If not provided, the |
| * default list of rules defined by the GraphQL specification will be used. |
| * |
| * Each validation rules is a function which returns a visitor |
| * (see the language/visitor API). Visitor methods are expected to return |
| * GraphQLErrors, or Arrays of GraphQLErrors when invalid. |
| * |
| * Optionally a custom TypeInfo instance may be provided. If not provided, one |
| * will be created from the provided schema. |
| */ |
| function validate(schema, documentAST) { |
| var rules = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _specifiedRules.specifiedRules; |
| var typeInfo = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new _TypeInfo.TypeInfo(schema); |
| var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : { |
| maxErrors: undefined |
| }; |
| documentAST || (0, _devAssert.default)(0, 'Must provide document.'); // If the schema used for validation is invalid, throw an error. |
| |
| (0, _validate.assertValidSchema)(schema); |
| var abortObj = Object.freeze({}); |
| var errors = []; |
| var context = new _ValidationContext.ValidationContext(schema, documentAST, typeInfo, function (error) { |
| if (options.maxErrors != null && errors.length >= options.maxErrors) { |
| errors.push(new _GraphQLError.GraphQLError('Too many validation errors, error limit reached. Validation aborted.')); |
| throw abortObj; |
| } |
| |
| errors.push(error); |
| }); // This uses a specialized visitor which runs multiple visitors in parallel, |
| // while maintaining the visitor skip and break API. |
| |
| var visitor = (0, _visitor.visitInParallel)(rules.map(function (rule) { |
| return rule(context); |
| })); // Visit the whole document with each instance of all provided rules. |
| |
| try { |
| (0, _visitor.visit)(documentAST, (0, _TypeInfo.visitWithTypeInfo)(typeInfo, visitor)); |
| } catch (e) { |
| if (e !== abortObj) { |
| throw e; |
| } |
| } |
| |
| return errors; |
| } |
| /** |
| * @internal |
| */ |
| |
| |
| function validateSDL(documentAST, schemaToExtend) { |
| var rules = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _specifiedRules.specifiedSDLRules; |
| var errors = []; |
| var context = new _ValidationContext.SDLValidationContext(documentAST, schemaToExtend, function (error) { |
| errors.push(error); |
| }); |
| var visitors = rules.map(function (rule) { |
| return rule(context); |
| }); |
| (0, _visitor.visit)(documentAST, (0, _visitor.visitInParallel)(visitors)); |
| return errors; |
| } |
| /** |
| * Utility function which asserts a SDL document is valid by throwing an error |
| * if it is invalid. |
| * |
| * @internal |
| */ |
| |
| |
| function assertValidSDL(documentAST) { |
| var errors = validateSDL(documentAST); |
| |
| if (errors.length !== 0) { |
| throw new Error(errors.map(function (error) { |
| return error.message; |
| }).join('\n\n')); |
| } |
| } |
| /** |
| * Utility function which asserts a SDL document is valid by throwing an error |
| * if it is invalid. |
| * |
| * @internal |
| */ |
| |
| |
| function assertValidSDLExtension(documentAST, schema) { |
| var errors = validateSDL(documentAST, schema); |
| |
| if (errors.length !== 0) { |
| throw new Error(errors.map(function (error) { |
| return error.message; |
| }).join('\n\n')); |
| } |
| } |