Repository: eslint/eslint
File: lib/shared/serialization.js (JavaScript)

Code before:
/**
 * @fileoverview Object serialization utils.
 * @author Bryan Mishkin
 */

"use strict";

const isPlainObject = require("lodash.isplainobject");

/**
 * 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" || Array.isArray(val) || isPlainObject(val));
}

/**
 * Check if an object 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} obj the object
 * @returns {boolean} true if the object is serializable
 */
function isSerializable(obj) {
    if (!isSerializablePrimitiveOrPlainObject(obj)) {
        return false;
    }
    for (const property in obj) {
        if (Object.hasOwn(obj, property)) {
            if (!isSerializablePrimitiveOrPlainObject(obj[property])) {
                return false;
            }
            if (typeof obj[property] === "object") {
                if (!isSerializable(obj[property])) {
                    return false;
                }
            }
        }
    }
    return true;

Review comment (suggestion):
should check array/object recusively:
```js
function isSerializablePrimitiveOrPlainObject(val) {
  if (
    val === null ||
    val === undefined ||
    typeof val === "string" ||
    typeof val === "boolean" ||
    typeof val === "number"
  ) {
    return true;
  }
  if (Array.isArray(val)) {
    return val.every((item) => isSerializablePrimitiveOrPlainObject(item));
  }
  if (val.constructor === Object) {
    return Object.values(val).every((item) =>
      isSerializablePrimitiveOrPlainObject(item),
    );
  }
  return false;
}

```

Code after:
/**
 * @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])) {