# error.js

    const _ = require('underscore');

    /**
     * @class AV.Error
     */

    function AVError(code, message) {
      const error = new Error(message);
      error.code = code;
      return error;
    }

    _.extend(
      AVError,
      /** @lends AV.Error */ {
        /**
         * Error code indicating some error other than those enumerated here.
         * @constant
         */
        OTHER_CAUSE: -1,

        /**
         * Error code indicating that something has gone wrong with the server.
         * If you get this error code, it is AV's fault. Contact us at
         * https://avoscloud.com/help
         * @constant
         */
        INTERNAL_SERVER_ERROR: 1,

        /**
         * Error code indicating the connection to the AV servers failed.
         * @constant
         */
        CONNECTION_FAILED: 100,

        /**
         * Error code indicating the specified object doesn't exist.
         * @constant
         */
        OBJECT_NOT_FOUND: 101,

        /**
         * Error code indicating you tried to query with a datatype that doesn't
         * support it, like exact matching an array or object.
         * @constant
         */
        INVALID_QUERY: 102,

        /**
         * Error code indicating a missing or invalid classname. Classnames are
         * case-sensitive. They must start with a letter, and a-zA-Z0-9_ are the
         * only valid characters.
         * @constant
         */
        INVALID_CLASS_NAME: 103,

        /**
         * Error code indicating an unspecified object id.
         * @constant
         */
        MISSING_OBJECT_ID: 104,

        /**
         * Error code indicating an invalid key name. Keys are case-sensitive. They
         * must start with a letter, and a-zA-Z0-9_ are the only valid characters.
         * @constant
         */
        INVALID_KEY_NAME: 105,

        /**
         * Error code indicating a malformed pointer. You should not see this unless
         * you have been mucking about changing internal AV code.
         * @constant
         */
        INVALID_POINTER: 106,

        /**
         * Error code indicating that badly formed JSON was received upstream. This
         * either indicates you have done something unusual with modifying how
         * things encode to JSON, or the network is failing badly.
         * @constant
         */
        INVALID_JSON: 107,

        /**
         * Error code indicating that the feature you tried to access is only
         * available internally for testing purposes.
         * @constant
         */
        COMMAND_UNAVAILABLE: 108,

        /**
         * You must call AV.initialize before using the AV library.
         * @constant
         */
        NOT_INITIALIZED: 109,

        /**
         * Error code indicating that a field was set to an inconsistent type.
         * @constant
         */
        INCORRECT_TYPE: 111,

        /**
         * Error code indicating an invalid channel name. A channel name is either
         * an empty string (the broadcast channel) or contains only a-zA-Z0-9_
         * characters.
         * @constant
         */
        INVALID_CHANNEL_NAME: 112,

        /**
         * Error code indicating that push is misconfigured.
         * @constant
         */
        PUSH_MISCONFIGURED: 115,

        /**
         * Error code indicating that the object is too large.
         * @constant
         */
        OBJECT_TOO_LARGE: 116,

        /**
         * Error code indicating that the operation isn't allowed for clients.
         * @constant
         */
        OPERATION_FORBIDDEN: 119,

        /**
         * Error code indicating the result was not found in the cache.
         * @constant
         */
        CACHE_MISS: 120,

        /**
         * Error code indicating that an invalid key was used in a nested
         * JSONObject.
         * @constant
         */
        INVALID_NESTED_KEY: 121,

        /**
         * Error code indicating that an invalid filename was used for AVFile.
         * A valid file name contains only a-zA-Z0-9_. characters and is between 1
         * and 128 characters.
         * @constant
         */
        INVALID_FILE_NAME: 122,

        /**
         * Error code indicating an invalid ACL was provided.
         * @constant
         */
        INVALID_ACL: 123,

        /**
         * Error code indicating that the request timed out on the server. Typically
         * this indicates that the request is too expensive to run.
         * @constant
         */
        TIMEOUT: 124,

        /**
         * Error code indicating that the email address was invalid.
         * @constant
         */
        INVALID_EMAIL_ADDRESS: 125,

        /**
         * Error code indicating a missing content type.
         * @constant
         */
        MISSING_CONTENT_TYPE: 126,

        /**
         * Error code indicating a missing content length.
         * @constant
         */
        MISSING_CONTENT_LENGTH: 127,

        /**
         * Error code indicating an invalid content length.
         * @constant
         */
        INVALID_CONTENT_LENGTH: 128,

        /**
         * Error code indicating a file that was too large.
         * @constant
         */
        FILE_TOO_LARGE: 129,

        /**
         * Error code indicating an error saving a file.
         * @constant
         */
        FILE_SAVE_ERROR: 130,

        /**
         * Error code indicating an error deleting a file.
         * @constant
         */
        FILE_DELETE_ERROR: 153,

        /**
         * Error code indicating that a unique field was given a value that is
         * already taken.
         * @constant
         */
        DUPLICATE_VALUE: 137,

        /**
         * Error code indicating that a role's name is invalid.
         * @constant
         */
        INVALID_ROLE_NAME: 139,

        /**
         * Error code indicating that an application quota was exceeded.  Upgrade to
         * resolve.
         * @constant
         */
        EXCEEDED_QUOTA: 140,

        /**
         * Error code indicating that a Cloud Code script failed.
         * @constant
         */
        SCRIPT_FAILED: 141,

        /**
         * Error code indicating that a Cloud Code validation failed.
         * @constant
         */
        VALIDATION_ERROR: 142,

        /**
         * Error code indicating that invalid image data was provided.
         * @constant
         */
        INVALID_IMAGE_DATA: 150,

        /**
         * Error code indicating an unsaved file.
         * @constant
         */
        UNSAVED_FILE_ERROR: 151,

        /**
         * Error code indicating an invalid push time.
         */
        INVALID_PUSH_TIME_ERROR: 152,

        /**
         * Error code indicating that the username is missing or empty.
         * @constant
         */
        USERNAME_MISSING: 200,

        /**
         * Error code indicating that the password is missing or empty.
         * @constant
         */
        PASSWORD_MISSING: 201,

        /**
         * Error code indicating that the username has already been taken.
         * @constant
         */
        USERNAME_TAKEN: 202,

        /**
         * Error code indicating that the email has already been taken.
         * @constant
         */
        EMAIL_TAKEN: 203,

        /**
         * Error code indicating that the email is missing, but must be specified.
         * @constant
         */
        EMAIL_MISSING: 204,

        /**
         * Error code indicating that a user with the specified email was not found.
         * @constant
         */
        EMAIL_NOT_FOUND: 205,

        /**
         * Error code indicating that a user object without a valid session could
         * not be altered.
         * @constant
         */
        SESSION_MISSING: 206,

        /**
         * Error code indicating that a user can only be created through signup.
         * @constant
         */
        MUST_CREATE_USER_THROUGH_SIGNUP: 207,

        /**
         * Error code indicating that an an account being linked is already linked
         * to another user.
         * @constant
         */
        ACCOUNT_ALREADY_LINKED: 208,

        /**
         * Error code indicating that a user cannot be linked to an account because
         * that account's id could not be found.
         * @constant
         */
        LINKED_ID_MISSING: 250,

        /**
         * Error code indicating that a user with a linked (e.g. Facebook) account
         * has an invalid session.
         * @constant
         */
        INVALID_LINKED_SESSION: 251,

        /**
         * Error code indicating that a service being linked (e.g. Facebook or
         * Twitter) is unsupported.
         * @constant
         */
        UNSUPPORTED_SERVICE: 252,
        /**
         * Error code indicating a real error code is unavailable because
         * we had to use an XDomainRequest object to allow CORS requests in
         * Internet Explorer, which strips the body from HTTP responses that have
         * a non-2XX status code.
         * @constant
         */
        X_DOMAIN_REQUEST: 602,
      }
    );

    module.exports = AVError;