add(type, options) {
    return new Promise((resolve) => {
      const canvas = this.getCanvas();
      const extendOption = this._extendOptions(options);

      const shapeObj = this._createInstance(type, extendOption);
      const objectProperties = this.graphics.createObjectProperties(shapeObj);

      this._bindEventOnShape(shapeObj);

      canvas.add(shapeObj).setActiveObject(shapeObj);

      this._resetPositionFillFilter(shapeObj);

      resolve(objectProperties);
    });
  }
Add the shape
@ignore
@param {string} type - Shape type (ex: 'rect', 'circle')
@param {Object} options - Shape options
     @param {(ShapeFillOption | string)} [options.fill] - ShapeFillOption or Shape foreground color (ex: '#fff', 'transparent') or ShapeFillOption object
     @param {string} [options.stroke] - Shape outline color
     @param {number} [options.strokeWidth] - Shape outline width
     @param {number} [options.width] - Width value (When type option is 'rect', this options can use)
     @param {number} [options.height] - Height value (When type option is 'rect', this options can use)
     @param {number} [options.rx] - Radius x value (When type option is 'circle', this options can use)
     @param {number} [options.ry] - Radius y value (When type option is 'circle', this options can use)
     @param {number} [options.isRegular] - Whether scaling shape has 1:1 ratio or not
@returns {Promise}