{
  "props": {
    "factory": {
      "type": "Function",
      "tsType": "QUploaderFactoryFn",
      "desc": "Function which should return an Object or a Promise resolving with an Object; For best performance, reference it from your scope and do not define it inline",
      "params": {
        "files": {
          "type": "Array",
          "desc": "Uploaded files"
        }
      },
      "returns": {
        "type": ["Object", "Promise<any>"],
        "desc": "Optional configuration for the upload process; You can override QUploader props in this Object (url, method, headers, formFields, fieldName, withCredentials, sendRaw); Props of these Object can also be Functions with the form of (file[s]) => value"
      },
      "category": "upload"
    },

    "url": {
      "type": ["String", "Function"],
      "desc": "URL or path to the server which handles the upload. Takes String or factory function, which returns String. Function is called right before upload; If using a function then for best performance, reference it from your scope and do not define it inline",
      "examples": [
        "'https://example.com/path'",
        "files => `https://example.com?count=${ files.length }`"
      ],
      "params": {
        "files": {
          "type": "Array",
          "desc": "Uploaded files"
        }
      },
      "returns": {
        "type": "String",
        "desc": "URL or path to the server which handles the upload"
      },
      "category": "upload"
    },

    "method": {
      "type": ["String", "Function"],
      "default": "'POST'",
      "desc": "HTTP method to use for upload; Takes String or factory function which returns a String; Function is called right before upload; If using a function then for best performance, reference it from your scope and do not define it inline",
      "values": ["'POST'", "'PUT'"],
      "examples": ["'POST'", "files => (files.length > 10 ? 'POST' : 'PUT')"],
      "params": {
        "files": {
          "type": "Array",
          "desc": "Uploaded files"
        }
      },
      "returns": {
        "type": "String",
        "desc": "HTTP method to use for upload"
      },
      "category": "upload"
    },

    "field-name": {
      "type": ["String", "Function"],
      "desc": "Field name for each file upload; This goes into the following header: 'Content-Disposition: form-data; name=\"__HERE__\"; filename=\"somefile.png\"; If using a function then for best performance, reference it from your scope and do not define it inline",
      "default": "file => file.name",
      "examples": ["'backgroundFile'", "file => ('background' + file.name)"],
      "params": {
        "files": {
          "type": "File",
          "desc": "The current file being processed"
        }
      },
      "returns": {
        "type": "String",
        "desc": "Field name for the current file upload"
      },
      "category": "upload"
    },

    "headers": {
      "type": ["Array", "Function"],
      "desc": "Array or a factory function which returns an array; Array consists of objects with header definitions; Function is called right before upload; If using a function then for best performance, reference it from your scope and do not define it inline",
      "definition": {
        "name": {
          "type": "String",
          "required": true,
          "desc": "Header name",
          "examples": ["'Content-Type'", "'Accept'", "'Cache-Control'"]
        },
        "value": {
          "type": "String",
          "required": true,
          "desc": "Header value",
          "examples": ["'application/json'", "'no-cache'"]
        }
      },
      "examples": [
        "[{ name: 'Content-Type', value: 'application/json' }, { name: 'Accept', value: 'application/json' }]",
        "() => [ { name: 'X-Custom-Timestamp', value: Date.now() }]",
        "files => [ { name: 'X-Custom-Count', value: files.length }]"
      ],
      "params": {
        "files": {
          "type": "Array",
          "desc": "Uploaded files"
        }
      },
      "returns": {
        "type": "String",
        "desc": "An array consisting of objects with header definitions"
      },
      "category": "upload"
    },

    "form-fields": {
      "type": ["Array", "Function"],
      "desc": "Array or a factory function which returns an array; Array consists of objects with additional fields definitions (used by Form to be uploaded); Function is called right before upload; If using a function then for best performance, reference it from your scope and do not define it inline",
      "definition": {
        "name": {
          "type": "String",
          "required": true,
          "desc": "Field name",
          "examples": ["'Some field'"]
        },
        "value": {
          "type": "String",
          "required": true,
          "desc": "Field value",
          "examples": ["'some-value'"]
        }
      },
      "examples": [
        "[{ name: 'my-field', value: 'my-value' }]",
        "() => [ { name: 'my-field', value: 'my-value' }]",
        "files => [ { name: 'my-field', value: 'my-value' + files.length }]"
      ],
      "params": {
        "files": {
          "type": "Array",
          "desc": "Uploaded files"
        }
      },
      "returns": {
        "type": "String",
        "desc": "An array consists of objects with additional fields definitions (used by Form to be uploaded)"
      },
      "category": "upload"
    },

    "with-credentials": {
      "type": ["Boolean", "Function"],
      "desc": "Sets withCredentials to true on the XHR that manages the upload; Takes boolean or factory function for Boolean; Function is called right before upload; If using a function then for best performance, reference it from your scope and do not define it inline",
      "examples": ["true", "files => (files.length === 2)"],
      "params": {
        "files": {
          "type": "Array",
          "desc": "Uploaded files"
        }
      },
      "returns": {
        "type": "Boolean",
        "desc": "If true, withCredentials will be set to true on the XHR that manages the upload"
      },
      "category": "upload"
    },

    "send-raw": {
      "type": ["Boolean", "Function"],
      "desc": "Send raw files without wrapping into a Form(); Takes boolean or factory function for Boolean; Function is called right before upload; If using a function then for best performance, reference it from your scope and do not define it inline",
      "examples": ["true", "files => (files.length > 2)"],
      "params": {
        "files": {
          "type": "Array",
          "desc": "Uploaded files"
        }
      },
      "returns": {
        "type": "Boolean",
        "desc": "If true, raw files will get sent without wrapping into a Form()"
      },
      "category": "upload"
    },

    "batch": {
      "type": ["Boolean", "Function"],
      "desc": "Upload files in batch (in one XHR request); Takes boolean or factory function for Boolean; Function is called right before upload; If using a function then for best performance, reference it from your scope and do not define it inline",
      "examples": ["files => files.length > 10"],
      "params": {
        "files": {
          "type": "Array",
          "desc": "Uploaded files"
        }
      },
      "returns": {
        "type": "Boolean",
        "desc": "If true, files will be uploaded in a batch (in one XHR request)"
      },
      "category": "upload"
    }
  },

  "events": {
    "uploaded": {
      "desc": "Emitted when file or batch of files is uploaded",
      "params": {
        "info": {
          "type": "Object",
          "desc": "Object containing information about the event",
          "definition": {
            "files": {
              "type": "Array",
              "required": true,
              "desc": "Uploaded files"
            },
            "xhr": {
              "type": "Object",
              "required": true,
              "desc": "XMLHttpRequest that has been used to upload this batch of files"
            }
          }
        }
      }
    },

    "failed": {
      "desc": "Emitted when file or batch of files has encountered error while uploading",
      "params": {
        "info": {
          "type": "Object",
          "desc": "Object containing information about the event",
          "definition": {
            "files": {
              "type": "Array",
              "required": true,
              "desc": "Files which encountered error"
            },
            "xhr": {
              "type": "Object",
              "required": true,
              "desc": "XMLHttpRequest that has been used to upload this batch of files"
            }
          }
        }
      }
    },

    "uploading": {
      "desc": "Emitted when file or batch of files started uploading",
      "params": {
        "info": {
          "type": "Object",
          "desc": "Object containing information about the event",
          "definition": {
            "files": {
              "type": "Array",
              "required": true,
              "desc": "Files which are now uploading"
            },
            "xhr": {
              "type": "Object",
              "required": true,
              "desc": "XMLHttpRequest used for uploading"
            }
          }
        }
      }
    },

    "factory-failed": {
      "desc": "Emitted when factory function is supplied with a Promise which is rejected",
      "params": {
        "err": {
          "type": "Error",
          "desc": "Error object which is the Promise rejection reason"
        },
        "files": {
          "type": "Array",
          "desc": "Files which were to get uploaded"
        }
      }
    }
  }
}
