build/azure-pipelines/mixin.ts/mixinClient
async function mixinClient(quality: string): Promise<void> {
	const productJsonFilter = filter(f => f.relative === 'product.json', { restore: true });

	fancyLog(ansiColors.blue('[mixin]'), `Mixing in client:`);

	return new Promise((c, e) => {
		vfs
			.src(`quality/${quality}/**`, { base: `quality/${quality}` })
			.pipe(filter(f => !f.isDirectory()))
			.pipe(filter(f => f.relative !== 'product.server.json'))
			.pipe(productJsonFilter)
			.pipe(buffer())
			.pipe(json((o: Product) => {
				const originalProduct = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'product.json'), 'utf8')) as OSSProduct;
				let builtInExtensions = originalProduct.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 { webBuiltInExtensions: originalProduct.webBuiltInExtensions, ...o, builtInExtensions };
			}))
			.pipe(productJsonFilter.restore)
			.pipe(es.mapSync((f: Vinyl) => {
				fancyLog(ansiColors.blue('[mixin]'), f.relative, ansiColors.green('✔︎'));
				return f;
			}))
			.pipe(vfs.dest('.'))
			.on('end', () => c())
			.on('error', (err: any) => e(err));
	});
}