/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/4// @ts-check5/**6* @fileoverview Common build script for extension scripts used in in webviews.7*/8import path from 'node:path';9import esbuild from 'esbuild';1011/**12* @typedef {Partial<import('esbuild').BuildOptions> & {13* entryPoints: string[] | Record<string, string> | { in: string, out: string }[];14* outdir: string;15* }} BuildOptions16*/1718/**19* Build the source code once using esbuild.20*21* @param {BuildOptions} options22* @param {(outDir: string) => unknown} [didBuild]23*/24async function build(options, didBuild) {25await esbuild.build({26bundle: true,27minify: true,28sourcemap: false,29format: 'esm',30platform: 'browser',31target: ['es2024'],32...options,33});3435await didBuild?.(options.outdir);36}3738/**39* Build the source code once using esbuild, logging errors instead of throwing.40*41* @param {BuildOptions} options42* @param {(outDir: string) => unknown} [didBuild]43*/44async function tryBuild(options, didBuild) {45try {46await build(options, didBuild);47} catch (err) {48console.error(err);49}50}5152/**53* @param {{54* srcDir: string;55* outdir: string;56* entryPoints: string[] | Record<string, string> | { in: string, out: string }[];57* additionalOptions?: Partial<import('esbuild').BuildOptions>58* }} config59* @param {string[]} args60* @param {(outDir: string) => unknown} [didBuild]61*/62export async function run(config, args, didBuild) {63let outdir = config.outdir;64const outputRootIndex = args.indexOf('--outputRoot');65if (outputRootIndex >= 0) {66const outputRoot = args[outputRootIndex + 1];67const outputDirName = path.basename(outdir);68outdir = path.join(outputRoot, outputDirName);69}7071/** @type {BuildOptions} */72const resolvedOptions = {73entryPoints: config.entryPoints,74outdir,75logOverride: {76'import-is-undefined': 'error',77},78...(config.additionalOptions || {}),79};8081const isWatch = args.indexOf('--watch') >= 0;82if (isWatch) {83await tryBuild(resolvedOptions, didBuild);84const watcher = await import('@parcel/watcher');85watcher.subscribe(config.srcDir, () => tryBuild(resolvedOptions, didBuild));86} else {87return build(resolvedOptions, didBuild).catch(() => process.exit(1));88}89}909192