static parseOptions(
    parentOptions,
    newOptions,
    allowDeletion = false,
    globalOptions = {},
    groupList
  ) {
    const fields = ["color", "fixed", "shadow"];
    selectiveNotDeepExtend(fields, parentOptions, newOptions, allowDeletion);

    Node.checkMass(newOptions);

    if (parentOptions.opacity !== undefined) {
      if (!Node.checkOpacity(parentOptions.opacity)) {
        console.error(
          "Invalid option for node opacity. Value must be between 0 and 1, found: " +
            parentOptions.opacity
        );
        parentOptions.opacity = undefined;
      }
    }

    if (newOptions.opacity !== undefined) {
      if (!Node.checkOpacity(newOptions.opacity)) {
        console.error(
          "Invalid option for node opacity. Value must be between 0 and 1, found: " +
            newOptions.opacity
        );
        newOptions.opacity = undefined;
      }
    }

    if (
      newOptions.shapeProperties &&
      !Node.checkCoordinateOrigin(newOptions.shapeProperties.coordinateOrigin)
    ) {
      console.error(
        "Invalid option for node coordinateOrigin, found: " +
          newOptions.shapeProperties.coordinateOrigin
      );
    }

    // merge the shadow options into the parent.
    mergeOptions(parentOptions, newOptions, "shadow", globalOptions);

    // individual shape newOptions
    if (newOptions.color !== undefined && newOptions.color !== null) {
      const parsedColor = parseColor(newOptions.color);
      fillIfDefined(parentOptions.color, parsedColor);
    } else if (allowDeletion === true && newOptions.color === null) {
      parentOptions.color = bridgeObject(globalOptions.color); // set the object back to the global options
    }

    // handle the fixed options
    if (newOptions.fixed !== undefined && newOptions.fixed !== null) {
      if (typeof newOptions.fixed === "boolean") {
        parentOptions.fixed.x = newOptions.fixed;
        parentOptions.fixed.y = newOptions.fixed;
      } else {
        if (
          newOptions.fixed.x !== undefined &&
          typeof newOptions.fixed.x === "boolean"
        ) {
          parentOptions.fixed.x = newOptions.fixed.x;
        }
        if (
          newOptions.fixed.y !== undefined &&
          typeof newOptions.fixed.y === "boolean"
        ) {
          parentOptions.fixed.y = newOptions.fixed.y;
        }
      }
    }

    if (allowDeletion === true && newOptions.font === null) {
      parentOptions.font = bridgeObject(globalOptions.font); // set the object back to the global options
    }

    Node.updateGroupOptions(parentOptions, newOptions, groupList);

    // handle the scaling options, specifically the label part
    if (newOptions.scaling !== undefined) {
      mergeOptions(
        parentOptions.scaling,
        newOptions.scaling,
        "label",
        globalOptions.scaling
      );
    }
  }
This process all possible shorthands in the new options and makes sure that the parentOptions are fully defined.
Static so it can also be used by the handler.
@param {object} parentOptions
@param {object} newOptions
@param {boolean} [allowDeletion]
@param {object} [globalOptions]
@param {object} [groupList]
@static