add(text, options) {
    return new Promise((resolve) => {
      const canvas = this.getCanvas();
      let newText = null;
      let selectionStyle = fObjectOptions.SELECTION_STYLE;
      let styles = this._defaultStyles;

      this._setInitPos(options.position);

      if (options.styles) {
        styles = extend(styles, options.styles);
      }

      if (!isExisty(options.autofocus)) {
        options.autofocus = true;
      }

      newText = new fabric.IText(text, styles);
      selectionStyle = extend({}, selectionStyle, {
        originX: 'left',
        originY: 'top',
      });

      newText.set(selectionStyle);
      newText.on({
        mouseup: this._onFabricMouseUp.bind(this),
      });

      canvas.add(newText);

      if (options.autofocus) {
        newText.enterEditing();
        newText.selectAll();
      }

      if (!canvas.getActiveObject()) {
        canvas.setActiveObject(newText);
      }

      this.isPrevEditing = true;
      resolve(this.graphics.createObjectProperties(newText));
    });
  }
Add new text on canvas image
@param {string} text - Initial input text
@param {Object} options - Options for generating text
    @param {Object} [options.styles] Initial styles
        @param {string} [options.styles.fill] Color
        @param {string} [options.styles.fontFamily] Font type for text
        @param {number} [options.styles.fontSize] Size
        @param {string} [options.styles.fontStyle] Type of inclination (normal / italic)
        @param {string} [options.styles.fontWeight] Type of thicker or thinner looking (normal / bold)
        @param {string} [options.styles.textAlign] Type of text align (left / center / right)
        @param {string} [options.styles.textDecoration] Type of line (underline / line-through / overline)
    @param {{x: number, y: number}} [options.position] - Initial position
@returns {Promise}