UNPKG

graphql-input-number

Version:

A configurable custom input number type for GraphQL with sanitization and validation.

132 lines (105 loc) 3.24 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _graphql = require('graphql'); var _error = require('graphql/error'); var _language = require('graphql/language'); function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } // https://github.com/graphql/graphql-js/blob/master/src/type/scalars.js var MAX_INT = 2147483647; var MIN_INT = -2147483648; function isSafeInteger(num) { return typeof num === 'number' && isFinite(num) && Math.floor(num) === num && num <= MAX_INT && num >= MIN_INT; } function coerceInt(value) { if (value != null) { var num = Number(value); if (isSafeInteger(num)) { return (num < 0 ? Math.ceil : Math.floor)(num); } } return null; } exports.default = function (_ref) { var error = _ref.error; var max = _ref.max; var min = _ref.min; var parse = _ref.parse; var sanitize = _ref.sanitize; var test = _ref.test; var name = _ref.name; var options = _objectWithoutProperties(_ref, ['error', 'max', 'min', 'parse', 'sanitize', 'test', 'name']); if (!name) { throw new Error('"name" is required'); } if (typeof error !== 'function') { error = function error(_ref2) { var value = _ref2.value; var ast = _ref2.ast; var message = _ref2.message; var more = message ? ' ' + message + '.' : ''; throw new _error.GraphQLError('Invalid value ' + JSON.stringify(value) + '.' + more, ast ? [ast] : []); }; } var parseValue = function parseValue(value, ast) { value = coerceInt(value); if (value == null) { return null; } // Sanitization Phase if (sanitize) { value = sanitize(value); if (!isSafeInteger(value)) { return null; } } // Validation Phase if (min != null && value < min) { return error({ type: 'min', value: value, min: min, message: 'Expected minimum "' + min + '"', ast: ast }); } if (max != null && value > max) { return error({ type: 'max', value: value, max: max, message: 'Expected maximum "' + max + '"', ast: ast }); } if (test && !test(value)) { return error({ type: 'test', value: value, test: test, ast: ast }); } // Parse Phase if (parse) { return parse(value); } return value; }; return new _graphql.GraphQLScalarType(_extends({ name: name, serialize: coerceInt, parseValue: parseValue, parseLiteral: function parseLiteral(ast) { var kind = ast.kind; var value = ast.value; if (kind === _language.Kind.INT) { return parseValue(value, ast); } return null; } }, options)); }; module.exports = exports['default'];