function init(files, options, callback) {
    if (!options && !callback) {
        options = {};
    }

    if (_.isFunction(options)) {
        /* There were no options, this argument is actually the callback */
        callback = options;
        options = {};
    }

    /* Try and read options from the specified uncssrc file */
    if (options.uncssrc) {
        try {
            /* Manually-specified options take precedence over uncssrc options */
            options = _.merge(utility.parseUncssrc(options.uncssrc), options);
        } catch (err) {
            const wrappedErr =
                err instanceof SyntaxError ? new SyntaxError('UnCSS: uncssrc file is invalid JSON.') : err;

            if (callback) {
                return callback(wrappedErr);
            }

            throw wrappedErr;
        }
    }

    /* Assign default values to options, unless specified */
    options = _.merge(
        {
            banner: true,
            csspath: '',
            html: files,
            htmlRoot: null,
            ignore: [],
            ignoreSheets: [],
            inject: null,
            jsdom: jsdom.defaultOptions(),
            media: [],
            raw: null,
            report: false,
            stylesheets: null,
            timeout: 0,
            uncssrc: null,
            userAgent: 'uncss',
        },
        options
    );

    const resultPromise = process(options);
    if (!callback) {
        return resultPromise.then(([css, report]) => ({ css, report }));
    }

    resultPromise.then(([css, report]) => callback(null, css, report), callback);
}
Main exposed function.
Here we check the options and callback, then run the files through jsdom.
@param  {Array}    files     Array of filenames
@param  {Object}   [options] options
@param  {Function} callback  (Error, String, Object)