Flatten mixins for not support native behavior or Page mixins

@inner
@param {Array.<string|Object>} mixins the mixins
@param {Object} target the target component or behavior
@param {Object=} opts the mixin options
function flattenMixins(mixins, target, opts) {
    mixins.forEach(item => {
        if (typeof item === 'function') {
            item = item(true, opts); // return okam mixin definition
        }

        if (!item || typeof item !== 'object') {
            return;
        }

        let submixins = item.mixins;
        if (Array.isArray(submixins) && submixins.length) {
            item = Object.assign({}, item);
            flattenMixins(submixins, item, opts);
        }

        Object.keys(item).forEach(
            k => doMixin(target, item, k, opts)
        );
    });
}