UNPKG

graphql-scalars

Version:

A collection of scalar types not included in base GraphQL.

104 lines 3.48 kB
"use strict"; 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