@cran/gql.core
Version:
Cran/GraphQL Core Utilities
66 lines (65 loc) • 2.15 kB
JavaScript
;
/* eslint-disable prefer-template */
Object.defineProperty(exports, "__esModule", { value: true });
exports.RealScalar = exports.Int8Scalar = exports.Int4Scalar = exports.Int2Scalar = void 0;
const createScalar_1 = require("../utilities/createScalar");
// Simplification of logic is possible due to Number
// and BigInt internal error mechanisms
function castInt(value) {
switch (typeof value) {
case "string":
if ((/e/iu).test(value)) {
value = "" + Number(value);
}
// Parse float down to an integer
// TODO configuration allow strict
return value.replace(/\.\d*$/u, "");
case "number":
return value | 0;
default:
// invariant
return undefined;
}
}
function createAsInt(bits) {
function asInt(value, invalid) {
const bigint = BigInt(castInt(value));
const clamped = BigInt.asIntN(bits, bigint);
// TODO config allow clamping
if (bigint !== clamped) {
return invalid("range");
}
return "" + value;
}
return {
string: asInt,
number: asInt,
boolean(value) {
return "" + (+value);
},
};
}
exports.Int2Scalar = (0, createScalar_1.createScalar)("int2", "small-range integer", createAsInt(16));
exports.Int4Scalar = (0, createScalar_1.createScalar)("int4", "integer", createAsInt(32));
exports.Int8Scalar = (0, createScalar_1.createScalar)("int8", "large-range integer", createAsInt(64));
exports.RealScalar = (0, createScalar_1.createScalar)("real", "variable-precision, exact", {
string(value, invalid) {
if ((/e/iu).test(value)) {
const number = Number(value);
if (isNaN(number)) {
invalid();
}
return "" + number;
}
if (!(/[+-]?\d+(\.\d+)?/u).test(value)) {
invalid();
}
return invalid();
},
number(value, invalid) {
return isNaN(value) ? invalid() : ("" + value);
},
boolean(value) {
return "" + (+value);
},
});