Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/build/azure-pipelines/distro/mixin-quality.ts
3520 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import fs from 'fs';
7
import path from 'path';
8
9
interface IBuiltInExtension {
10
readonly name: string;
11
readonly version: string;
12
readonly repo: string;
13
readonly metadata: any;
14
}
15
16
interface OSSProduct {
17
readonly builtInExtensions: IBuiltInExtension[];
18
readonly webBuiltInExtensions?: IBuiltInExtension[];
19
}
20
21
interface Product {
22
readonly builtInExtensions?: IBuiltInExtension[] | { 'include'?: IBuiltInExtension[]; 'exclude'?: string[] };
23
readonly webBuiltInExtensions?: IBuiltInExtension[];
24
}
25
26
function log(...args: any[]): void {
27
console.log(`[${new Date().toLocaleTimeString('en', { hour12: false })}]`, '[distro]', ...args);
28
}
29
30
function main() {
31
const quality = process.env['VSCODE_QUALITY'];
32
33
if (!quality) {
34
throw new Error('Missing VSCODE_QUALITY, skipping mixin');
35
}
36
37
log(`Mixing in distro quality...`);
38
39
const basePath = `.build/distro/mixin/${quality}`;
40
41
for (const name of fs.readdirSync(basePath)) {
42
const distroPath = path.join(basePath, name);
43
const ossPath = path.relative(basePath, distroPath);
44
45
if (ossPath === 'product.json') {
46
const distro = JSON.parse(fs.readFileSync(distroPath, 'utf8')) as Product;
47
const oss = JSON.parse(fs.readFileSync(ossPath, 'utf8')) as OSSProduct;
48
let builtInExtensions = oss.builtInExtensions;
49
50
if (Array.isArray(distro.builtInExtensions)) {
51
log('Overwriting built-in extensions:', distro.builtInExtensions.map(e => e.name));
52
53
builtInExtensions = distro.builtInExtensions;
54
} else if (distro.builtInExtensions) {
55
const include = distro.builtInExtensions['include'] ?? [];
56
const exclude = distro.builtInExtensions['exclude'] ?? [];
57
58
log('OSS built-in extensions:', builtInExtensions.map(e => e.name));
59
log('Including built-in extensions:', include.map(e => e.name));
60
log('Excluding built-in extensions:', exclude);
61
62
builtInExtensions = builtInExtensions.filter(ext => !include.find(e => e.name === ext.name) && !exclude.find(name => name === ext.name));
63
builtInExtensions = [...builtInExtensions, ...include];
64
65
log('Final built-in extensions:', builtInExtensions.map(e => e.name));
66
} else {
67
log('Inheriting OSS built-in extensions', builtInExtensions.map(e => e.name));
68
}
69
70
const result = { webBuiltInExtensions: oss.webBuiltInExtensions, ...distro, builtInExtensions };
71
fs.writeFileSync(ossPath, JSON.stringify(result, null, '\t'), 'utf8');
72
} else {
73
fs.cpSync(distroPath, ossPath, { force: true, recursive: true });
74
}
75
76
log(distroPath, '✔︎');
77
}
78
}
79
80
main();
81
82