summaryrefslogtreecommitdiff
path: root/node_modules/@jet/environment/json/reader/coercion.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/@jet/environment/json/reader/coercion.js')
-rw-r--r--node_modules/@jet/environment/json/reader/coercion.js139
1 files changed, 139 insertions, 0 deletions
diff --git a/node_modules/@jet/environment/json/reader/coercion.js b/node_modules/@jet/environment/json/reader/coercion.js
new file mode 100644
index 0000000..6f84fcf
--- /dev/null
+++ b/node_modules/@jet/environment/json/reader/coercion.js
@@ -0,0 +1,139 @@
+"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 \ No newline at end of file