import * as esbuild from 'esbuild';
|
|
import { sassPlugin } from 'esbuild-sass-plugin';
|
|
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
import { minify } from 'terser';
|
|
import { URL } from 'url';
|
|
|
|
const __dirname = new URL('.', import.meta.url).pathname.substring(1);
|
|
|
|
const args = process.argv.slice(2);
|
|
|
|
let index = args.indexOf('--mode');
|
|
const mode = (index >= 0 ? args[index + 1] : undefined) || 'none';
|
|
|
|
const watch = args.includes('--watch');
|
|
const check = !args.includes('--no-check');
|
|
|
|
/**
|
|
* @param { 'node' | 'webworker' } target
|
|
* @param { 'production' | 'development' | 'none' } mode
|
|
*/
|
|
async function buildExtension(target, mode) {
|
|
let plugins = [];
|
|
|
|
// let TypeCheckerPlugin;
|
|
// if (check) {
|
|
// ({ EsbuildPlugin: TypeCheckerPlugin } = require('vite-esbuild-typescript-checker'));
|
|
// plugins.push(
|
|
// TypeCheckerPlugin({
|
|
// checker: {
|
|
// async: false,
|
|
// eslint: {
|
|
// enabled: true,
|
|
// files: 'src/**/*.ts',
|
|
// options: {
|
|
// // cache: true,
|
|
// cacheLocation: path.join(
|
|
// __dirname,
|
|
// target === 'webworker' ? '.eslintcache.browser' : '.eslintcache',
|
|
// ),
|
|
// overrideConfigFile: path.join(
|
|
// __dirname,
|
|
// target === 'webworker' ? '.eslintrc.browser.json' : '.eslintrc.json',
|
|
// ),
|
|
// },
|
|
// },
|
|
// formatter: 'basic',
|
|
// typescript: {
|
|
// configFile: target === 'webworker' ? 'tsconfig.browser.json' : 'tsconfig.json',
|
|
// },
|
|
// },
|
|
// }),
|
|
// );
|
|
// }
|
|
|
|
const alias = {
|
|
'@env': path.resolve(__dirname, 'src', 'env', target === 'webworker' ? 'browser' : target),
|
|
// Stupid dependency that is used by `http[s]-proxy-agent`
|
|
debug: path.resolve(__dirname, 'patches', 'debug.js'),
|
|
// This dependency is very large, and isn't needed for our use-case
|
|
tr46: path.resolve(__dirname, 'patches', 'tr46.js'),
|
|
// This dependency is unnecessary for our use-case
|
|
'whatwg-url': path.resolve(__dirname, 'patches', 'whatwg-url.js'),
|
|
};
|
|
|
|
if (target === 'webworker') {
|
|
alias.path = 'path-browserify';
|
|
alias.os = 'os-browserify/browser';
|
|
}
|
|
|
|
const out = target === 'webworker' ? 'dist/browser' : 'dist';
|
|
|
|
const result = await esbuild.build({
|
|
bundle: true,
|
|
entryPoints: ['src/extension.ts'],
|
|
entryNames: '[dir]/gitlens',
|
|
alias: alias,
|
|
drop: ['debugger'],
|
|
external: ['vscode'],
|
|
format: 'esm',
|
|
keepNames: true,
|
|
legalComments: 'none',
|
|
logLevel: 'info',
|
|
mainFields: target === 'webworker' ? ['browser', 'module', 'main'] : ['module', 'main'],
|
|
metafile: true,
|
|
minify: mode === 'production',
|
|
outdir: out,
|
|
platform: target === 'webworker' ? 'browser' : target,
|
|
sourcemap: mode !== 'production',
|
|
// splitting: target !== 'webworker',
|
|
// chunkNames: 'feature-[name]-[hash]',
|
|
target: ['es2022', 'chrome102', 'node16.14.2'],
|
|
treeShaking: true,
|
|
tsconfig: target === 'webworker' ? 'tsconfig.browser.json' : 'tsconfig.json',
|
|
// watch: watch,
|
|
plugins: plugins,
|
|
});
|
|
|
|
if (!fs.existsSync(path.join('dist', 'meta'))) {
|
|
fs.mkdirSync(path.join('dist', 'meta'));
|
|
}
|
|
fs.writeFileSync(
|
|
path.join('dist', 'meta', `gitlens${target === 'webworker' ? '.browser' : ''}.json`),
|
|
JSON.stringify(result.metafile),
|
|
);
|
|
|
|
if (mode === 'production') {
|
|
const file = path.join(out, 'gitlens.js');
|
|
console.log(`Minifying ${file}...`);
|
|
|
|
const code = fs.readFileSync(file, 'utf8');
|
|
const result = await minify(code, {
|
|
compress: {
|
|
drop_debugger: true,
|
|
ecma: 2020,
|
|
module: true,
|
|
},
|
|
ecma: 2020,
|
|
format: {
|
|
comments: false,
|
|
ecma: 2020,
|
|
},
|
|
// Keep the class names otherwise @log won't provide a useful name
|
|
keep_classnames: true,
|
|
module: true,
|
|
});
|
|
|
|
fs.writeFileSync(file, result.code);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param { 'production' | 'development' | 'none' } mode
|
|
*/
|
|
async function buildGraphWebview(mode) {
|
|
let plugins = [sassPlugin()];
|
|
|
|
const out = 'dist/webviews';
|
|
|
|
const result = await esbuild.build({
|
|
bundle: true,
|
|
entryPoints: ['src/webviews/apps/plus/graph/graph.tsx'],
|
|
entryNames: '[dir]/graph',
|
|
alias: {
|
|
'@env': path.resolve(__dirname, 'src', 'env', 'browser'),
|
|
tslib: path.resolve(__dirname, 'node_modules/tslib/tslib.es6.js'),
|
|
'@microsoft/fast-foundation': path.resolve(
|
|
__dirname,
|
|
'node_modules/@microsoft/fast-foundation/dist/esm/index.js',
|
|
),
|
|
'@microsoft/fast-react-wrapper': path.resolve(
|
|
__dirname,
|
|
'node_modules/@microsoft/fast-react-wrapper/dist/esm/index.js',
|
|
),
|
|
},
|
|
drop: ['debugger'],
|
|
external: ['vscode'],
|
|
format: 'esm',
|
|
legalComments: 'none',
|
|
logLevel: 'info',
|
|
mainFields: ['browser', 'module', 'main'],
|
|
metafile: true,
|
|
minify: mode === 'production' ? true : false,
|
|
outdir: out,
|
|
platform: 'browser',
|
|
sourcemap: true,
|
|
target: ['es2022', 'chrome102'],
|
|
treeShaking: true,
|
|
tsconfig: 'src/webviews/apps/tsconfig.json',
|
|
// watch: watch,
|
|
plugins: plugins,
|
|
});
|
|
|
|
fs.writeFileSync(path.join('dist', 'meta', 'graph.json'), JSON.stringify(result.metafile));
|
|
|
|
if (mode === 'production') {
|
|
const file = path.join(out, 'graph.js');
|
|
console.log(`Minifying ${file}...`);
|
|
|
|
const code = fs.readFileSync(file, 'utf8');
|
|
const result = await minify(code, {
|
|
compress: {
|
|
drop_debugger: true,
|
|
ecma: 2020,
|
|
module: true,
|
|
},
|
|
ecma: 2020,
|
|
format: {
|
|
comments: false,
|
|
ecma: 2020,
|
|
},
|
|
module: true,
|
|
});
|
|
|
|
fs.writeFileSync(file, result.code);
|
|
}
|
|
}
|
|
|
|
try {
|
|
await Promise.allSettled([
|
|
buildExtension('node', mode),
|
|
buildExtension('webworker', mode),
|
|
buildGraphWebview(mode),
|
|
]);
|
|
} catch (ex) {
|
|
console.error(ex);
|
|
process.exit(1);
|
|
}
|