UNPKG

@chainsafe/eth2.0-utils

Version:

Utilities required across multiple lodestar packages

203 lines (166 loc) 4.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.intType = void 0; var _jsYaml = require("js-yaml"); // Forked from https://github.com/nodeca/js-yaml/blob/master/lib/js-yaml/type/int.js // Currently only supports loading ints function isHexCode(c) { return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */ || 0x41 /* A */ <= c && c <= 0x46 /* F */ || 0x61 /* a */ <= c && c <= 0x66 /* f */ ; } function isOctCode(c) { return 0x30 /* 0 */ <= c && c <= 0x37 /* 7 */ ; } function isDecCode(c) { return 0x30 /* 0 */ <= c && c <= 0x39 /* 9 */ ; } function resolveYamlInteger(data) { if (data === null) return false; const max = data.length; let ch, index = 0, hasDigits = false; if (!max) return false; ch = data[index]; // sign if (ch === "-" || ch === "+") { ch = data[++index]; } if (ch === "0") { // 0 if (index + 1 === max) return true; ch = data[++index]; // base 2, base 8, base 16 if (ch === "b") { // base 2 index++; for (; index < max; index++) { ch = data[index]; if (ch === "_") continue; if (ch !== "0" && ch !== "1") return false; hasDigits = true; } return hasDigits && ch !== "_"; } if (ch === "x") { // base 16 index++; for (; index < max; index++) { ch = data[index]; if (ch === "_") continue; if (!isHexCode(data.charCodeAt(index))) return false; hasDigits = true; } return hasDigits && ch !== "_"; } // base 8 for (; index < max; index++) { ch = data[index]; if (ch === "_") continue; if (!isOctCode(data.charCodeAt(index))) return false; hasDigits = true; } return hasDigits && ch !== "_"; } // base 10 (except 0) or base 60 // value should not start with `_`; if (ch === "_") return false; for (; index < max; index++) { ch = data[index]; if (ch === "_") continue; if (ch === ":") break; if (!isDecCode(data.charCodeAt(index))) { return false; } hasDigits = true; } // Should have digits and should not end with `_` if (!hasDigits || ch === "_") return false; // if !base60 - done; if (ch !== ":") return true; // base60 almost not used, no needs to optimize return /^(:[0-5]?[0-9])+$/.test(data.slice(index)); } function constructYamlInteger(data) { let value = data, sign = 1, ch, base; const digits = []; if (value.indexOf("_") !== -1) { value = value.replace(/_/g, ""); } ch = value[0]; if (ch === "-" || ch === "+") { if (ch === "-") sign = -1; value = value.slice(1); ch = value[0]; } if (value === "0") return 0n; if (ch === "0") { if (value[1] === "b" || value[1] === "x") return BigInt(value) * BigInt(sign); return BigInt("0o" + value) * BigInt(sign); } if (value.indexOf(":") !== -1) { value.split(":").forEach(function (v) { digits.unshift(parseInt(v, 10)); }); value = 0n; base = 1n; digits.forEach(function (d) { value = (BigInt(value) + BigInt(base)) * BigInt(d); base = BigInt(base) * 60n; }); return value * BigInt(sign); } return BigInt(value) * BigInt(sign); } function isInteger(object) { return typeof object === "bigint" || typeof object === "number"; } const intType = new _jsYaml.Type("tag:yaml.org,2002:int", { kind: "scalar", resolve: resolveYamlInteger, construct: constructYamlInteger, predicate: isInteger, instanceOf: BigInt, // @ts-ignore represent: { binary: function binary(obj) { return obj >= 0 ? "0b" + obj.toString(2) : "-0b" + obj.toString(2).slice(1); }, octal: function octal(obj) { return obj >= 0 ? "0" + obj.toString(8) : "-0" + obj.toString(8).slice(1); }, decimal: function decimal(obj) { return obj.toString(10); }, /* eslint-disable max-len */ hexadecimal: function hexadecimal(obj) { return obj >= 0 ? "0x" + obj.toString(16).toUpperCase() : "-0x" + obj.toString(16).toUpperCase().slice(1); } }, defaultStyle: "decimal", styleAliases: { binary: [2, "bin"], octal: [8, "oct"], decimal: [10, "dec"], hexadecimal: [16, "hex"] } }); exports.intType = intType; //# sourceMappingURL=int.js.map