graphql-input-number
Version:
A configurable custom input number type for GraphQL with sanitization and validation.
132 lines (105 loc) • 3.24 kB
JavaScript
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'];
;