scripts/utils/browser_jobs.mjs (81 lines of code) (raw):

import path from 'node:path'; import { createRequire } from 'node:module'; import esbuild from 'esbuild'; import { ENVIRONMENTS } from '../constants.mjs'; import { root, run } from './run_utils.mjs'; import { createBrowserPackageJson } from './packages.mjs'; import { prepareWebviews, generateAssets, writePackageJson, commonJobs } from './common_jobs.mjs'; const browserWebviews = { vue3: [], vue2: ['gitlab_duo_chat', 'security_finding'], }; function typecheck(signal) { return run('tsc', ['-p', root, '--noEmit'], { cancelSignal: signal }); } const require = createRequire(import.meta.url); /** @type {import('esbuild').Plugin} */ const pathImportPlugin = { name: 'pathImport', setup(build) { build.onResolve({ filter: /^path$/ }, resolveObj => { console.log( `[pathImportPlugin] using path-browserify instead of node:path for ${JSON.stringify(resolveObj)}`, ); // For the browser, resolve to the path-browserify module const resolvedPath = require.resolve('path-browserify'); return { path: resolvedPath, namespace: 'file', }; }); }, }; /** * Build the extension for browser environment * @param {string[]} [args=[]] - Build arguments * @param {AbortSignal} [signal] - Optional abort signal to cancel the operation * @returns {Promise<void>} */ async function buildExtension(args = [], signal) { await typecheck(signal); /** @type {import('esbuild').BuildOptions} */ const config = { entryPoints: [path.join(root, 'src/browser/browser.js')], bundle: true, outfile: 'dist-browser/browser.js', external: [ 'vscode', // For the fs fix, see: // https://github.com/tree-sitter/tree-sitter/tree/660481dbf71413eba5a928b0b0ab8da50c1109e0/lib/binding_web#cant-resolve-fs-in-node_modulesweb-tree-sitter 'fs', // `graceful-fs` is a dependency of `enhanced-resolve`, used in the LS. The dependency is not needed, as the LS supplies our own fsClient, so we prevent it from being included in the bundle 'graceful-fs', ], format: 'cjs', sourcemap: true, loader: { '.html': 'text' }, plugins: [pathImportPlugin], ...args.reduce((acc, arg) => { if (arg === '--minify') { acc.minify = true; } return acc; }, {}), }; if (signal) { config.signal = signal; } await esbuild.build(config); } export async function buildBrowser() { const packageJson = createBrowserPackageJson(); await commonJobs(ENVIRONMENTS.BROWSER); await Promise.all([ prepareWebviews(browserWebviews, ENVIRONMENTS.BROWSER), writePackageJson(packageJson, ENVIRONMENTS.BROWSER), buildExtension(['--minify']), generateAssets(packageJson, ENVIRONMENTS.BROWSER), ]); } // eslint-disable-next-line import/no-default-export export default {};