From 5a55352cf7f8a4f582c57849eaa209a31621b841 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 9 Jun 2023 14:55:05 -0700 Subject: [PATCH] Combine esbuild scripts (#184531) * Combine esbuild scripts This combines the various build scripts used for building webview/notebook content. This should make it easier to update settings for them As part of this, I also fixed the script so that on watch it restarts automatically on syntax errors instead of exiting * Migrate other build script * Fixing math build script --- extensions/esbuild-webview-common.js | 91 +++++++++++++++++++ extensions/ipynb/esbuild.js | 49 ++-------- .../esbuild-notebook.js | 44 ++------- .../esbuild-preview.js | 45 ++------- extensions/markdown-math/esbuild.js | 46 ++-------- extensions/notebook-renderers/esbuild.js | 43 ++------- extensions/simple-browser/esbuild-preview.js | 49 +++------- 7 files changed, 145 insertions(+), 222 deletions(-) create mode 100644 extensions/esbuild-webview-common.js diff --git a/extensions/esbuild-webview-common.js b/extensions/esbuild-webview-common.js new file mode 100644 index 00000000000..8a2a7d07a2d --- /dev/null +++ b/extensions/esbuild-webview-common.js @@ -0,0 +1,91 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// @ts-check + +/** + * @fileoverview Common build script for extension scripts used in in webviews. + */ + +const path = require('path'); +const esbuild = require('esbuild'); + +/** + * @typedef {Partial & { + * entryPoints: string[] | Record | { in: string, out: string }[]; + * outdir: string; + * }} BuildOptions + */ + +/** + * Build the source code once using esbuild. + * + * @param {BuildOptions} options + * @param {(outDir: string) => unknown} [didBuild] + */ +async function build(options, didBuild) { + await esbuild.build({ + bundle: true, + minify: true, + sourcemap: false, + format: 'esm', + platform: 'browser', + target: ['es2020'], + ...options, + }); + + await didBuild?.(options.outdir); +} + +/** + * Build the source code once using esbuild, logging errors instead of throwing. + * + * @param {BuildOptions} options + * @param {(outDir: string) => unknown} [didBuild] + */ +async function tryBuild(options, didBuild) { + try { + await build(options, didBuild); + } catch (err) { + console.error(err); + } +} + +/** + * @param {{ + * srcDir: string; + * outdir: string; + * entryPoints: string[] | Record | { in: string, out: string }[]; + * additionalOptions?: Partial + * }} config + * @param {string[]} args + * @param {(outDir: string) => unknown} [didBuild] + */ +module.exports.run = function (config, args, didBuild) { + let outdir = config.outdir; + + const outputRootIndex = args.indexOf('--outputRoot'); + if (outputRootIndex >= 0) { + const outputRoot = args[outputRootIndex + 1]; + const outputDirName = path.basename(outdir); + outdir = path.join(outputRoot, outputDirName); + } + + /** @type {BuildOptions} */ + const resolvedOptions = { + entryPoints: config.entryPoints, + outdir, + ...(config.additionalOptions || {}), + }; + + const isWatch = args.indexOf('--watch') >= 0; + if (isWatch) { + tryBuild(resolvedOptions); + + const watcher = require('@parcel/watcher'); + watcher.subscribe(config.srcDir, () => tryBuild(resolvedOptions, didBuild)); + } else { + return build(resolvedOptions, didBuild).catch(() => process.exit(1)); + } +}; diff --git a/extensions/ipynb/esbuild.js b/extensions/ipynb/esbuild.js index 28000f1ebf9..64b58109fec 100644 --- a/extensions/ipynb/esbuild.js +++ b/extensions/ipynb/esbuild.js @@ -5,47 +5,14 @@ //@ts-check const path = require('path'); -const fse = require('fs-extra'); -const esbuild = require('esbuild'); - -const args = process.argv.slice(2); - -const isWatch = args.indexOf('--watch') >= 0; - -let outputRoot = __dirname; -const outputRootIndex = args.indexOf('--outputRoot'); -if (outputRootIndex >= 0) { - outputRoot = args[outputRootIndex + 1]; -} const srcDir = path.join(__dirname, 'notebook-src'); -const outDir = path.join(outputRoot, 'notebook-out'); +const outDir = path.join(__dirname, 'notebook-out'); -async function build() { - await esbuild.build({ - entryPoints: [ - path.join(srcDir, 'cellAttachmentRenderer.ts'), - ], - bundle: true, - minify: false, - sourcemap: false, - format: 'esm', - outdir: outDir, - platform: 'browser', - target: ['es2020'], - }); -} - - -build().catch(() => process.exit(1)); - -if (isWatch) { - const watcher = require('@parcel/watcher'); - watcher.subscribe(srcDir, async () => { - try { - await build(); - } catch (e) { - console.error(e); - } - }); -} +require('../esbuild-webview-common').run({ + entryPoints: [ + path.join(srcDir, 'cellAttachmentRenderer.ts'), + ], + srcDir, + outdir: outDir, +}, process.argv); diff --git a/extensions/markdown-language-features/esbuild-notebook.js b/extensions/markdown-language-features/esbuild-notebook.js index fb32a3e986e..87275940f4c 100644 --- a/extensions/markdown-language-features/esbuild-notebook.js +++ b/extensions/markdown-language-features/esbuild-notebook.js @@ -4,42 +4,14 @@ *--------------------------------------------------------------------------------------------*/ // @ts-check const path = require('path'); -const esbuild = require('esbuild'); - -const args = process.argv.slice(2); - -const isWatch = args.indexOf('--watch') >= 0; - -let outputRoot = __dirname; -const outputRootIndex = args.indexOf('--outputRoot'); -if (outputRootIndex >= 0) { - outputRoot = args[outputRootIndex + 1]; -} const srcDir = path.join(__dirname, 'notebook'); -const outDir = path.join(outputRoot, 'notebook-out'); +const outDir = path.join(__dirname, 'notebook-out'); -function build() { - return esbuild.build({ - entryPoints: [ - path.join(__dirname, 'notebook', 'index.ts'), - ], - bundle: true, - minify: true, - sourcemap: false, - format: 'esm', - outdir: outDir, - platform: 'browser', - target: ['es2020'], - }); -} - - -build().catch(() => process.exit(1)); - -if (isWatch) { - const watcher = require('@parcel/watcher'); - watcher.subscribe(srcDir, () => { - return build(); - }); -} +require('../esbuild-webview-common').run({ + entryPoints: [ + path.join(srcDir, 'index.ts'), + ], + srcDir, + outdir: outDir, +}, process.argv); diff --git a/extensions/markdown-language-features/esbuild-preview.js b/extensions/markdown-language-features/esbuild-preview.js index c25dab4dbae..5a2e51cca09 100644 --- a/extensions/markdown-language-features/esbuild-preview.js +++ b/extensions/markdown-language-features/esbuild-preview.js @@ -4,42 +4,15 @@ *--------------------------------------------------------------------------------------------*/ // @ts-check const path = require('path'); -const esbuild = require('esbuild'); - -const args = process.argv.slice(2); - -const isWatch = args.indexOf('--watch') >= 0; - -let outputRoot = __dirname; -const outputRootIndex = args.indexOf('--outputRoot'); -if (outputRootIndex >= 0) { - outputRoot = args[outputRootIndex + 1]; -} const srcDir = path.join(__dirname, 'preview-src'); -const outDir = path.join(outputRoot, 'media'); +const outDir = path.join(__dirname, 'media'); -function build() { - return esbuild.build({ - entryPoints: [ - path.join(srcDir, 'index.ts'), - path.join(srcDir, 'pre'), - ], - bundle: true, - minify: true, - sourcemap: false, - format: 'iife', - outdir: outDir, - platform: 'browser', - target: ['es2020'], - }); -} - -build().catch(() => process.exit(1)); - -if (isWatch) { - const watcher = require('@parcel/watcher'); - watcher.subscribe(srcDir, () => { - return build(); - }); -} +require('../esbuild-webview-common').run({ + entryPoints: [ + path.join(srcDir, 'index.ts'), + path.join(srcDir, 'pre'), + ], + srcDir, + outdir: outDir, +}, process.argv); diff --git a/extensions/markdown-math/esbuild.js b/extensions/markdown-math/esbuild.js index 88475257524..f8196075a69 100644 --- a/extensions/markdown-math/esbuild.js +++ b/extensions/markdown-math/esbuild.js @@ -6,35 +6,13 @@ const path = require('path'); const fse = require('fs-extra'); -const esbuild = require('esbuild'); const args = process.argv.slice(2); -const isWatch = args.indexOf('--watch') >= 0; - -let outputRoot = __dirname; -const outputRootIndex = args.indexOf('--outputRoot'); -if (outputRootIndex >= 0) { - outputRoot = args[outputRootIndex + 1]; -} - const srcDir = path.join(__dirname, 'notebook'); -const outDir = path.join(outputRoot, 'notebook-out'); - -async function build() { - await esbuild.build({ - entryPoints: [ - path.join(srcDir, 'katex.ts'), - ], - bundle: true, - minify: true, - sourcemap: false, - format: 'esm', - outdir: outDir, - platform: 'browser', - target: ['es2020'], - }); +const outDir = path.join(__dirname, 'notebook-out'); +function postBuild(outDir) { fse.copySync( path.join(__dirname, 'node_modules', 'katex', 'dist', 'katex.min.css'), path.join(outDir, 'katex.min.css')); @@ -51,16 +29,10 @@ async function build() { } } - -build().catch(() => process.exit(1)); - -if (isWatch) { - const watcher = require('@parcel/watcher'); - watcher.subscribe(srcDir, async () => { - try { - await build(); - } catch (e) { - console.error(e); - } - }); -} +require('../esbuild-webview-common').run({ + entryPoints: [ + path.join(srcDir, 'katex.ts'), + ], + srcDir, + outdir: outDir, +}, process.argv, postBuild); diff --git a/extensions/notebook-renderers/esbuild.js b/extensions/notebook-renderers/esbuild.js index c374cc5fc1c..55d462f8bc3 100644 --- a/extensions/notebook-renderers/esbuild.js +++ b/extensions/notebook-renderers/esbuild.js @@ -4,41 +4,14 @@ *--------------------------------------------------------------------------------------------*/ // @ts-check const path = require('path'); -const esbuild = require('esbuild'); - -const args = process.argv.slice(2); - -const isWatch = args.indexOf('--watch') >= 0; - -let outputRoot = __dirname; -const outputRootIndex = args.indexOf('--outputRoot'); -if (outputRootIndex >= 0) { - outputRoot = args[outputRootIndex + 1]; -} const srcDir = path.join(__dirname, 'src'); -const outDir = path.join(outputRoot, 'renderer-out'); +const outDir = path.join(__dirname, 'renderer-out'); -function build() { - return esbuild.build({ - entryPoints: [ - path.join(srcDir, 'index.ts'), - ], - bundle: true, - minify: false, - sourcemap: false, - format: 'esm', - outdir: outDir, - platform: 'browser', - target: ['es2020'], - }); -} - -build().catch(() => process.exit(1)); - -if (isWatch) { - const watcher = require('@parcel/watcher'); - watcher.subscribe(srcDir, () => { - return build(); - }); -} +require('../esbuild-webview-common').run({ + entryPoints: [ + path.join(srcDir, 'index.ts'), + ], + srcDir, + outdir: outDir, +}, process.argv); diff --git a/extensions/simple-browser/esbuild-preview.js b/extensions/simple-browser/esbuild-preview.js index 3133283f6b9..cf6e99ca6cb 100644 --- a/extensions/simple-browser/esbuild-preview.js +++ b/extensions/simple-browser/esbuild-preview.js @@ -4,45 +4,20 @@ *--------------------------------------------------------------------------------------------*/ // @ts-check const path = require('path'); -const esbuild = require('esbuild'); - -const args = process.argv.slice(2); - -const isWatch = args.indexOf('--watch') >= 0; - -let outputRoot = __dirname; -const outputRootIndex = args.indexOf('--outputRoot'); -if (outputRootIndex >= 0) { - outputRoot = args[outputRootIndex + 1]; -} const srcDir = path.join(__dirname, 'preview-src'); -const outDir = path.join(outputRoot, 'media'); +const outDir = path.join(__dirname, 'media'); -async function build() { - await esbuild.build({ - entryPoints: { - 'index': path.join(srcDir, 'index.ts'), - 'codicon': path.join(__dirname, 'node_modules', 'vscode-codicons', 'dist', 'codicon.css'), - }, +require('../esbuild-webview-common').run({ + entryPoints: { + 'index': path.join(srcDir, 'index.ts'), + 'codicon': path.join(__dirname, 'node_modules', 'vscode-codicons', 'dist', 'codicon.css'), + }, + srcDir, + outdir: outDir, + additionalOptions: { loader: { '.ttf': 'dataurl', - }, - bundle: true, - minify: true, - sourcemap: false, - format: 'esm', - outdir: outDir, - platform: 'browser', - target: ['es2020'], - }); -} - -build().catch(() => process.exit(1)); - -if (isWatch) { - const watcher = require('@parcel/watcher'); - watcher.subscribe(srcDir, () => { - return build(); - }); -} + } + } +}, process.argv);