async function bumpVersions(versionOptions = null) {
    if (versionOptions == null) {
        versionOptions = productionVersionOptions;
    } else if (
        versionOptions !== developmentVersionOptions &&
        versionOptions !== productionVersionOptions
    ) {
        versionOptions = merge({}, defaultVersionOptions, versionOptions);
    }

    const queue = new Map();

    /**
     * @async
     * @param  {object}         entry          - The entrypoint to process.
     * @param  {string}         entry.outfile  - The file to write to.
     * @param  {?string}        [entry.label]  - The task label.
     *     Defaults to the outfile name.
     * @param  {?string}        [entry.format] - The version number format.
     * @param  {?string}        [entry.key]    - The JSON field name assign the version number to.
     * @param  {?string|number} [entry.pretty] - The white space to use to format the JSON file.
     * @return {Promise}
     */
    loconfig.tasks.versions?.forEach(({
        outfile,
        label = null,
        ...options
    }) => {
        if (!label) {
            label = basename(outfile || 'undefined');
        }

        options.pretty = (options.pretty ?? versionOptions.prettyPrint);
        options.format = (options.format ?? versionOptions.versionFormat);
        options.key    = (options.key ?? versionOptions.versionKey);

        if (queue.has(outfile)) {
            queue.get(outfile).then(() => handleBumpVersion(outfile, label, options));
        } else {
            queue.set(outfile, handleBumpVersion(outfile, label, options));
        }
    });
}
Bumps version numbers in file.

@async
@param  {object} [versionOptions=null] - Customize the version options.
    If `null`, default production options are used.
@return {Promise}