/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
const json = require("gulp-json-editor");
const buffer = require('gulp-buffer');
const filter = require("gulp-filter");
const es = require("event-stream");
const vfs = require("vinyl-fs");
const fancyLog = require("fancy-log");
const ansiColors = require("ansi-colors");
const fs = require("fs");
const path = require("path");
function main() {
    const quality = process.env['VSCODE_QUALITY'];
    if (!quality) {
        console.log('Missing VSCODE_QUALITY, skipping mixin');
        return;
    }
    const productJsonFilter = filter(f => f.relative === 'product.json', { restore: true });
    fancyLog(ansiColors.blue('[mixin]'), `Mixing in sources:`);
    return vfs
        .src(`quality/${quality}/**`, { base: `quality/${quality}` })
        .pipe(filter(f => !f.isDirectory()))
        .pipe(productJsonFilter)
        .pipe(buffer())
        .pipe(json((o) => {
        const ossProduct = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'product.json'), 'utf8'));
        let builtInExtensions = ossProduct.builtInExtensions;
        if (Array.isArray(o.builtInExtensions)) {
            fancyLog(ansiColors.blue('[mixin]'), 'Overwriting built-in extensions:', o.builtInExtensions.map(e => e.name));
            builtInExtensions = o.builtInExtensions;
        }
        else if (o.builtInExtensions) {
            const include = o.builtInExtensions['include'] || [];
            const exclude = o.builtInExtensions['exclude'] || [];
            fancyLog(ansiColors.blue('[mixin]'), 'OSS built-in extensions:', builtInExtensions.map(e => e.name));
            fancyLog(ansiColors.blue('[mixin]'), 'Including built-in extensions:', include.map(e => e.name));
            fancyLog(ansiColors.blue('[mixin]'), 'Excluding built-in extensions:', exclude);
            builtInExtensions = builtInExtensions.filter(ext => !include.find(e => e.name === ext.name) && !exclude.find(name => name === ext.name));
            builtInExtensions = [...builtInExtensions, ...include];
            fancyLog(ansiColors.blue('[mixin]'), 'Final built-in extensions:', builtInExtensions.map(e => e.name));
        }
        else {
            fancyLog(ansiColors.blue('[mixin]'), 'Inheriting OSS built-in extensions', builtInExtensions.map(e => e.name));
        }
        return Object.assign(Object.assign({ webBuiltInExtensions: ossProduct.webBuiltInExtensions }, o), { builtInExtensions });
    }))
        .pipe(productJsonFilter.restore)
        .pipe(es.mapSync(function (f) {
        fancyLog(ansiColors.blue('[mixin]'), f.relative, ansiColors.green('✔︎'));
        return f;
    }))
        .pipe(vfs.dest('.'));
}
main();
