mixins/PropType.js

import { instanceTypes, is } from "../util/helpers/instances"

/**
 * Provides a way to handle prop types and validation
 *
 * @class PropType
 */
class PropType {
    props = {}

    /**
     * @constructor
     * @param {string} type | Type of the property, refeers to {instanceTypes}
     * @memberof PropType
     */
    constructor(type) {
        this.type = type
        this.required = false
        this.isRequired = this.isRequired.bind(this)
        this.isValid = this.isValid.bind(this)
    }

    /**
     * Data type
     *
     * @memberof PropType
     */
    get type() {
        return this.props.type
    }

    set type(value) {
        this.props.type = value
    }

    /**
     * Wether the property is required
     *
     * @memberof PropType
     */
    get required() {
        return this.props.required
    }

    set required(value) {
        this.props.required = value
    }

    /**
     * Sets the required property to true
     * @memberof PropType
     */
    isRequired() {
        this.required = true
        return this
    }

    /**
     * Checks the type validity of the value
     *
     * @param {any} value | the value of the property that needs to be validated
     * @returns {boolean} | validity of the prop
     * @memberof PropType
     */
    isValid(value) {
        return is(this.type, value)
    }
}

/**
 * Default instance for type string
 *
 * @memberof PropType
 */
PropType.string = () => new PropType(instanceTypes.string)
/**
 * Default instance for type array
 *
 * @memberof PropType
 */
PropType.array = () => new PropType(instanceTypes.array)
/**
 * Default instance for type number
 *
 * @memberof PropType
 */
PropType.number = () => new PropType(instanceTypes.number)
/**
 * Default instance for type bool
 *
 * @memberof PropType
 */
PropType.bool = () => new PropType(instanceTypes.bool)
/**
 * Default instance for type date
 *
 * @memberof PropType
 */
PropType.date = () => new PropType(instanceTypes.date)
/**
 * Default instance for type func
 *
 * @memberof PropType
 */
PropType.func = () => new PropType(instanceTypes.func)
/**
 * Default instance for type object
 *
 * @memberof PropType
 */
PropType.object = () => new PropType(instanceTypes.object)
/**
 * Default instance for type regExp
 *
 * @memberof PropType
 */
PropType.regExp = () => new PropType(instanceTypes.regExp)

export default PropType