graphql-scalars
Version:
A collection of scalar types not included in base GraphQL.
104 lines • 3.48 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var VALUE_RANGES;
(function (VALUE_RANGES) {
VALUE_RANGES[VALUE_RANGES["NEGATIVE"] = 0] = "NEGATIVE";
VALUE_RANGES[VALUE_RANGES["NON_NEGATIVE"] = 1] = "NON_NEGATIVE";
VALUE_RANGES[VALUE_RANGES["POSITIVE"] = 2] = "POSITIVE";
VALUE_RANGES[VALUE_RANGES["NON_POSITIVE"] = 3] = "NON_POSITIVE";
})(VALUE_RANGES || (VALUE_RANGES = {}));
var VALUE_TYPES;
(function (VALUE_TYPES) {
VALUE_TYPES[VALUE_TYPES["INT"] = 0] = "INT";
VALUE_TYPES[VALUE_TYPES["FLOAT"] = 1] = "FLOAT";
})(VALUE_TYPES || (VALUE_TYPES = {}));
const VALIDATIONS = {
NonPositiveInt: {
range: VALUE_RANGES.NON_POSITIVE,
type: VALUE_TYPES.INT,
},
PositiveInt: {
range: VALUE_RANGES.POSITIVE,
type: VALUE_TYPES.INT,
},
NonNegativeInt: {
range: VALUE_RANGES.NON_NEGATIVE,
type: VALUE_TYPES.INT,
},
NegativeInt: {
range: VALUE_RANGES.NEGATIVE,
type: VALUE_TYPES.INT,
},
NonPositiveFloat: {
range: VALUE_RANGES.NON_POSITIVE,
type: VALUE_TYPES.FLOAT,
},
PositiveFloat: {
range: VALUE_RANGES.POSITIVE,
type: VALUE_TYPES.FLOAT,
},
NonNegativeFloat: {
range: VALUE_RANGES.NON_NEGATIVE,
type: VALUE_TYPES.FLOAT,
},
NegativeFloat: {
range: VALUE_RANGES.NEGATIVE,
type: VALUE_TYPES.FLOAT,
},
};
exports.VALIDATIONS = VALIDATIONS;
// TODO: Consider implementing coercion like this...
// See: https://github.com/graphql/graphql-js/blob/master/src/type/scalars.js#L13
// See: https://github.com/graphql/graphql-js/blob/master/src/type/scalars.js#L60
function _validateInt(value) {
if (!Number.isFinite(value)) {
throw new TypeError(`Value is not a finite number: ${value}`);
}
if (!Number.isInteger(value)) {
throw new TypeError(`Value is not an integer: ${value}`);
}
if (!Number.isSafeInteger(value)) {
throw new TypeError(`Value is not a safe integer: ${value}`);
}
}
function _validateFloat(value) {
if (!Number.isFinite(value)) {
throw new TypeError(`Value is not a finite number: ${value}`);
}
}
function processValue(value, validation) {
const { range, type } = validation;
/* eslint-disable no-restricted-globals */
if (value === null ||
typeof value === 'undefined' ||
isNaN(value) ||
Number.isNaN(value) ||
value === Number.NaN) {
throw new TypeError(`Value is not a number: ${value}`);
}
/* eslint-enable */
let parsedValue;
switch (type) {
case VALUE_TYPES.FLOAT:
parsedValue = parseFloat(value);
_validateFloat(parsedValue);
break;
case VALUE_TYPES.INT:
parsedValue = parseInt(value, 10);
_validateInt(parsedValue);
break;
default:
// no -op, return undefined
}
if ((range === VALUE_RANGES.NEGATIVE && !(parsedValue < 0)) ||
(range === VALUE_RANGES.NON_NEGATIVE && !(parsedValue >= 0)) ||
(range === VALUE_RANGES.POSITIVE && !(parsedValue > 0)) ||
(range === VALUE_RANGES.NON_POSITIVE && !(parsedValue <= 0))) {
throw new TypeError(`Value is not a ${VALUE_RANGES[range]
.toLowerCase()
.replace('_', '-')} number: ${value}`);
}
return parsedValue;
}
exports.processValue = processValue;
//# sourceMappingURL=utilities.js.map