register(src, output = '', babel = false) {
        // Do we need to perform compilation?
        babel = babel || this.caller === 'babel';

        const sources = concat([], src);
        const hasOutputPath = output !== undefined && output !== '';

        if (hasOutputPath) {
            this.context.addTask(
                this.createTask({
                    src: sources,
                    dst: output,
                    babel
                })
            );

            return;
        }

        if (this.caller !== 'minify') {
            throw new Error(
                `An output file path is required when using mix.${this.caller}()`
            );
        }

        // We've we're minifying an array of files then the output is the same as the input with a .min extension added
        for (const source of sources) {
            this.context.addTask(
                this.createTask({
                    src: source,
                    dst: source.replace(/\.([a-z]{2,})$/i, '.min.$1'),
                    babel
                })
            );
        }
    }
Register the component.

@param {string|string[]} src
@param {string} [output]
@param {boolean} babel