You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.5 KiB
55 lines
1.5 KiB
/** |
|
* @fileoverview Serialization utils. |
|
* @author Bryan Mishkin |
|
*/ |
|
|
|
"use strict"; |
|
|
|
/** |
|
* Check if a value is a primitive or plain object created by the Object constructor. |
|
* @param {any} val the value to check |
|
* @returns {boolean} true if so |
|
* @private |
|
*/ |
|
function isSerializablePrimitiveOrPlainObject(val) { |
|
return ( |
|
val === null || |
|
typeof val === "string" || |
|
typeof val === "boolean" || |
|
typeof val === "number" || |
|
(typeof val === "object" && val.constructor === Object) || |
|
Array.isArray(val) |
|
); |
|
} |
|
|
|
/** |
|
* Check if a value is serializable. |
|
* Functions or objects like RegExp cannot be serialized by JSON.stringify(). |
|
* Inspired by: https://stackoverflow.com/questions/30579940/reliable-way-to-check-if-objects-is-serializable-in-javascript |
|
* @param {any} val the value |
|
* @returns {boolean} true if the value is serializable |
|
*/ |
|
function isSerializable(val) { |
|
if (!isSerializablePrimitiveOrPlainObject(val)) { |
|
return false; |
|
} |
|
if (typeof val === "object") { |
|
for (const property in val) { |
|
if (Object.hasOwn(val, property)) { |
|
if (!isSerializablePrimitiveOrPlainObject(val[property])) { |
|
return false; |
|
} |
|
if (typeof val[property] === "object") { |
|
if (!isSerializable(val[property])) { |
|
return false; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
module.exports = { |
|
isSerializable |
|
};
|
|
|