"use strict"; const isTemporalTime = require("./value-checks/temporal/is-compatible-time"); const isTemporalDuration = require("./value-checks/temporal/is-duration"); // NOTE: We use custom type-checking implementations here (instead of existing libraries) because we want the type names and checks to *exactly* match up with our internal storage rules, and third-party validation libraries typically don't provide such strong guarantees module.exports = function getValueType(value) { let primitiveType = typeof value; switch (primitiveType) { case "string": case "boolean": case "symbol": case "function": return primitiveType; case "undefined": return "null"; case "number": if (Number.isInteger(value)) { return "integer"; } else { return "float"; } case "bigint": return "bigint"; default: if (value == null) { return "null"; } else if (Buffer.isBuffer(value)) { // FIXME: Utf8Array and friends? return "bytes"; } else if (Array.isArray(value)) { return "array"; } else if (value instanceof Date) { return "date"; } else if (isTemporalTime(value)) { return "temporalTime"; } else if (isTemporalDuration(value)) { // FIXME: Balancing is needed for these, prior to storage! return "temporalDuration"; } else { return "object"; } } };