Files
apps.apple.com/node_modules/@jet/environment/json/reader/coercion.js
2025-11-04 05:03:50 +08:00

139 lines
4.5 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.valueAsNumber = exports.valueAsString = exports.valueAsBoolean = void 0;
const optional_1 = require("../../types/optional");
const validation = require("../validation");
/**
* Attempt to coerce the given value to a boolean.
*
* @see asBoolean
* @param value - the value to coerce
* @param policy - determines when validation errors are added to the current validation context
* @param path - an optional string appended to validation errors to identify where this value originated
* @returns a boolean if the value was a boolean or coercible to a boolean, otherwise null
*/
function valueAsBoolean(value, policy = "coercible", path) {
if (!(0, optional_1.isSome)(value)) {
return value;
}
if (typeof value === "boolean") {
return value;
}
// Handle string coercion
if (typeof value === "string") {
if (value === "true") {
return true;
}
else if (value === "false") {
return false;
}
}
// Else coerce.
const coercedValue = Boolean(value);
switch (policy) {
case "strict": {
validation.context("asBoolean", () => {
validation.unexpectedType("coercedValue", "boolean", value, path);
});
break;
}
case "coercible": {
if ((0, optional_1.isNothing)(coercedValue)) {
validation.context("asBoolean", () => {
validation.unexpectedType("coercedValue", "boolean", value, path);
});
return null;
}
break;
}
case "none":
default: {
break;
}
}
return coercedValue;
}
exports.valueAsBoolean = valueAsBoolean;
/**
* Attempt to coerce the given value to a string.
*
* @see asString
* @param value - the value to coerce
* @param policy - determines when validation errors are added to the current validation context
* @param path - an optional string appended to validation errors to identify where this value originated
* @returns a string if the value was a string or coercible to a string, otherwise null
*/
function valueAsString(value, policy = "coercible", path) {
if (!(0, optional_1.isSome)(value)) {
return value;
}
if (typeof value === "string") {
return value;
}
// We don't consider arbitrary objects as convertable to strings even through they will result in some value
const coercedValue = typeof value === "object" ? null : String(value);
switch (policy) {
case "strict": {
validation.context("asString", () => {
validation.unexpectedType("coercedValue", "string", value, path);
});
break;
}
case "coercible": {
if ((0, optional_1.isNothing)(coercedValue)) {
validation.context("asString", () => {
validation.unexpectedType("coercedValue", "string", value, path);
});
}
break;
}
case "none":
default: {
break;
}
}
return coercedValue;
}
exports.valueAsString = valueAsString;
/**
* Attempt to coerce the given value to a number.
*
* @see asNumber
* @param value - the value to coerce
* @param policy - determines when validation errors are added to the current validation context
* @param path - an optional string appended to validation errors to identify where this value originated
* @returns a number if the value was a number or coercible to a number, otherwise null
*/
function valueAsNumber(value, policy = "coercible", path) {
if (!(0, optional_1.isSome)(value)) {
return value;
}
if (typeof value === "number") {
return value;
}
const coercedValue = Number(value);
switch (policy) {
case "strict": {
validation.context("asNumber", () => {
validation.unexpectedType("coercedValue", "number", value, path);
});
break;
}
case "coercible": {
if (isNaN(coercedValue)) {
validation.context("asNumber", () => {
validation.unexpectedType("coercedValue", "number", value, path);
});
return null;
}
break;
}
case "none":
default: {
break;
}
}
return coercedValue;
}
exports.valueAsNumber = valueAsNumber;
//# sourceMappingURL=coercion.js.map