From f272e51947457c5bda28d2ebf658d6b8b61a663e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 7 Aug 2025 20:04:44 -0700 Subject: [PATCH] Convert esbuild scripts to modules Planning to convert to typescript but want to do it in a few smaller steps --- eslint.config.js | 3 +-- extensions/esbuild-webview-common.js | 13 +++++-------- extensions/ipynb/{esbuild.js => esbuild.mjs} | 12 ++++++------ extensions/ipynb/package.json | 2 +- .../esbuild-notebook.mjs} | 9 +++++---- .../{esbuild-preview.js => esbuild-preview.mjs} | 9 +++++---- .../markdown-language-features/package.json | 6 +++--- .../markdown-math/{esbuild.js => esbuild.mjs} | 15 ++++++++------- extensions/markdown-math/package.json | 2 +- .../esbuild.mjs} | 9 +++++---- extensions/notebook-renderers/package.json | 2 +- extensions/package.json | 1 + .../{esbuild-preview.js => esbuild-preview.mjs} | 11 ++++++----- extensions/simple-browser/package.json | 2 +- 14 files changed, 49 insertions(+), 47 deletions(-) rename extensions/ipynb/{esbuild.js => esbuild.mjs} (67%) rename extensions/{notebook-renderers/esbuild.js => markdown-language-features/esbuild-notebook.mjs} (69%) rename extensions/markdown-language-features/{esbuild-preview.js => esbuild-preview.mjs} (70%) rename extensions/markdown-math/{esbuild.js => esbuild.mjs} (67%) rename extensions/{markdown-language-features/esbuild-notebook.js => notebook-renderers/esbuild.mjs} (69%) rename extensions/simple-browser/{esbuild-preview.js => esbuild-preview.mjs} (63%) diff --git a/eslint.config.js b/eslint.config.js index b1e83f734e8..b3c8970f034 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -15,8 +15,7 @@ import pluginJsdoc from 'eslint-plugin-jsdoc'; import pluginHeader from 'eslint-plugin-header'; pluginHeader.rules.header.meta.schema = false; -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const ignores = fs.readFileSync(path.join(__dirname, '.eslint-ignore'), 'utf8') +const ignores = fs.readFileSync(path.join(import.meta.dirname, '.eslint-ignore'), 'utf8') .toString() .split(/\r\n|\n/) .filter(line => line && !line.startsWith('#')); diff --git a/extensions/esbuild-webview-common.js b/extensions/esbuild-webview-common.js index 12cd1c58875..76d03abad7d 100644 --- a/extensions/esbuild-webview-common.js +++ b/extensions/esbuild-webview-common.js @@ -3,13 +3,11 @@ * 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'); +import path from 'node:path'; +import esbuild from 'esbuild'; /** * @typedef {Partial & { @@ -62,7 +60,7 @@ async function tryBuild(options, didBuild) { * @param {string[]} args * @param {(outDir: string) => unknown} [didBuild] */ -module.exports.run = async function (config, args, didBuild) { +export async function run(config, args, didBuild) { let outdir = config.outdir; const outputRootIndex = args.indexOf('--outputRoot'); if (outputRootIndex >= 0) { @@ -84,10 +82,9 @@ module.exports.run = async function (config, args, didBuild) { const isWatch = args.indexOf('--watch') >= 0; if (isWatch) { await tryBuild(resolvedOptions, didBuild); - - const watcher = require('@parcel/watcher'); + const watcher = await import('@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.mjs similarity index 67% rename from extensions/ipynb/esbuild.js rename to extensions/ipynb/esbuild.mjs index 64b58109fec..e7e270c8265 100644 --- a/extensions/ipynb/esbuild.js +++ b/extensions/ipynb/esbuild.mjs @@ -2,14 +2,14 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -//@ts-check +// @ts-check +import path from 'node:path'; +import { run } from '../esbuild-webview-common.js'; -const path = require('path'); +const srcDir = path.join(import.meta.dirname, 'notebook-src'); +const outDir = path.join(import.meta.dirname, 'notebook-out'); -const srcDir = path.join(__dirname, 'notebook-src'); -const outDir = path.join(__dirname, 'notebook-out'); - -require('../esbuild-webview-common').run({ +run({ entryPoints: [ path.join(srcDir, 'cellAttachmentRenderer.ts'), ], diff --git a/extensions/ipynb/package.json b/extensions/ipynb/package.json index beb65118eb7..69f458bc7d4 100644 --- a/extensions/ipynb/package.json +++ b/extensions/ipynb/package.json @@ -158,7 +158,7 @@ "scripts": { "compile": "npx gulp compile-extension:ipynb && npm run build-notebook", "watch": "npx gulp watch-extension:ipynb", - "build-notebook": "node ./esbuild" + "build-notebook": "node ./esbuild.mjs" }, "dependencies": { "@enonic/fnv-plus": "^1.3.0", diff --git a/extensions/notebook-renderers/esbuild.js b/extensions/markdown-language-features/esbuild-notebook.mjs similarity index 69% rename from extensions/notebook-renderers/esbuild.js rename to extensions/markdown-language-features/esbuild-notebook.mjs index 55d462f8bc3..837673ad322 100644 --- a/extensions/notebook-renderers/esbuild.js +++ b/extensions/markdown-language-features/esbuild-notebook.mjs @@ -3,12 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // @ts-check -const path = require('path'); +import path from 'path'; +import { run } from '../esbuild-webview-common.js'; -const srcDir = path.join(__dirname, 'src'); -const outDir = path.join(__dirname, 'renderer-out'); +const srcDir = path.join(import.meta.dirname, 'notebook'); +const outDir = path.join(import.meta.dirname, 'notebook-out'); -require('../esbuild-webview-common').run({ +run({ entryPoints: [ path.join(srcDir, 'index.ts'), ], diff --git a/extensions/markdown-language-features/esbuild-preview.js b/extensions/markdown-language-features/esbuild-preview.mjs similarity index 70% rename from extensions/markdown-language-features/esbuild-preview.js rename to extensions/markdown-language-features/esbuild-preview.mjs index 5a2e51cca09..0e1ccd93762 100644 --- a/extensions/markdown-language-features/esbuild-preview.js +++ b/extensions/markdown-language-features/esbuild-preview.mjs @@ -3,12 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // @ts-check -const path = require('path'); +import path from 'path'; +import { run } from '../esbuild-webview-common.js'; -const srcDir = path.join(__dirname, 'preview-src'); -const outDir = path.join(__dirname, 'media'); +const srcDir = path.join(import.meta.dirname, 'preview-src'); +const outDir = path.join(import.meta.dirname, 'media'); -require('../esbuild-webview-common').run({ +run({ entryPoints: [ path.join(srcDir, 'index.ts'), path.join(srcDir, 'pre'), diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index da79dca2a4d..922fe087af5 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -760,10 +760,10 @@ "watch": "npm run build-preview && gulp watch-extension:markdown-language-features watch-extension:markdown-language-features-languageService", "vscode:prepublish": "npm run build-ext && npm run build-preview", "build-ext": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:markdown-language-features ./tsconfig.json", - "build-notebook": "node ./esbuild-notebook", - "build-preview": "node ./esbuild-preview", + "build-notebook": "node ./esbuild-notebook.mjs", + "build-preview": "node ./esbuild-preview.mjs", "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", - "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" + "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch" }, "dependencies": { "@vscode/extension-telemetry": "^0.9.8", diff --git a/extensions/markdown-math/esbuild.js b/extensions/markdown-math/esbuild.mjs similarity index 67% rename from extensions/markdown-math/esbuild.js rename to extensions/markdown-math/esbuild.mjs index f8196075a69..408cf8e057f 100644 --- a/extensions/markdown-math/esbuild.js +++ b/extensions/markdown-math/esbuild.mjs @@ -4,20 +4,21 @@ *--------------------------------------------------------------------------------------------*/ //@ts-check -const path = require('path'); -const fse = require('fs-extra'); +import path from 'path'; +import fse from 'fs-extra'; +import { run } from '../esbuild-webview-common.js'; const args = process.argv.slice(2); -const srcDir = path.join(__dirname, 'notebook'); -const outDir = path.join(__dirname, 'notebook-out'); +const srcDir = path.join(import.meta.dirname, 'notebook'); +const outDir = path.join(import.meta.dirname, 'notebook-out'); function postBuild(outDir) { fse.copySync( - path.join(__dirname, 'node_modules', 'katex', 'dist', 'katex.min.css'), + path.join(import.meta.dirname, 'node_modules', 'katex', 'dist', 'katex.min.css'), path.join(outDir, 'katex.min.css')); - const fontsDir = path.join(__dirname, 'node_modules', 'katex', 'dist', 'fonts'); + const fontsDir = path.join(import.meta.dirname, 'node_modules', 'katex', 'dist', 'fonts'); const fontsOutDir = path.join(outDir, 'fonts/'); fse.mkdirSync(fontsOutDir, { recursive: true }); @@ -29,7 +30,7 @@ function postBuild(outDir) { } } -require('../esbuild-webview-common').run({ +run({ entryPoints: [ path.join(srcDir, 'katex.ts'), ], diff --git a/extensions/markdown-math/package.json b/extensions/markdown-math/package.json index 27b5047527f..5af72e0b513 100644 --- a/extensions/markdown-math/package.json +++ b/extensions/markdown-math/package.json @@ -108,7 +108,7 @@ "scripts": { "compile": "npm run build-notebook", "watch": "npm run build-notebook", - "build-notebook": "node ./esbuild" + "build-notebook": "node ./esbuild.mjs" }, "devDependencies": { "@types/markdown-it": "^0.0.0", diff --git a/extensions/markdown-language-features/esbuild-notebook.js b/extensions/notebook-renderers/esbuild.mjs similarity index 69% rename from extensions/markdown-language-features/esbuild-notebook.js rename to extensions/notebook-renderers/esbuild.mjs index 87275940f4c..de4e9572b9d 100644 --- a/extensions/markdown-language-features/esbuild-notebook.js +++ b/extensions/notebook-renderers/esbuild.mjs @@ -3,12 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // @ts-check -const path = require('path'); +import path from 'path'; +import { run } from '../esbuild-webview-common.js'; -const srcDir = path.join(__dirname, 'notebook'); -const outDir = path.join(__dirname, 'notebook-out'); +const srcDir = path.join(import.meta.dirname, 'src'); +const outDir = path.join(import.meta.dirname, 'renderer-out'); -require('../esbuild-webview-common').run({ +run({ entryPoints: [ path.join(srcDir, 'index.ts'), ], diff --git a/extensions/notebook-renderers/package.json b/extensions/notebook-renderers/package.json index d6ece35af11..b4a5236f7d8 100644 --- a/extensions/notebook-renderers/package.json +++ b/extensions/notebook-renderers/package.json @@ -44,7 +44,7 @@ "scripts": { "compile": "npx gulp compile-extension:notebook-renderers && npm run build-notebook", "watch": "npx gulp compile-watch:notebook-renderers", - "build-notebook": "node ./esbuild" + "build-notebook": "node ./esbuild.mjs" }, "dependencies": {}, "devDependencies": { diff --git a/extensions/package.json b/extensions/package.json index f0d7f2818de..e89178c1e73 100644 --- a/extensions/package.json +++ b/extensions/package.json @@ -1,6 +1,7 @@ { "name": "vscode-extensions", "version": "0.0.1", + "type": "module", "license": "MIT", "description": "Dependencies shared by all extensions", "dependencies": { diff --git a/extensions/simple-browser/esbuild-preview.js b/extensions/simple-browser/esbuild-preview.mjs similarity index 63% rename from extensions/simple-browser/esbuild-preview.js rename to extensions/simple-browser/esbuild-preview.mjs index 9c94a67d56f..25f8504af14 100644 --- a/extensions/simple-browser/esbuild-preview.js +++ b/extensions/simple-browser/esbuild-preview.mjs @@ -3,15 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // @ts-check -const path = require('path'); +import path from 'path'; +import { run } from '../esbuild-webview-common.js'; -const srcDir = path.join(__dirname, 'preview-src'); -const outDir = path.join(__dirname, 'media'); +const srcDir = path.join(import.meta.dirname, 'preview-src'); +const outDir = path.join(import.meta.dirname, 'media'); -require('../esbuild-webview-common').run({ +run({ entryPoints: { 'index': path.join(srcDir, 'index.ts'), - 'codicon': path.join(__dirname, 'node_modules', '@vscode', 'codicons', 'dist', 'codicon.css'), + 'codicon': path.join(import.meta.dirname, 'node_modules', '@vscode', 'codicons', 'dist', 'codicon.css'), }, srcDir, outdir: outDir, diff --git a/extensions/simple-browser/package.json b/extensions/simple-browser/package.json index 9aba9ad2503..789de38deb3 100644 --- a/extensions/simple-browser/package.json +++ b/extensions/simple-browser/package.json @@ -61,7 +61,7 @@ "watch": "npm run build-preview && gulp watch-extension:markdown-language-features", "vscode:prepublish": "npm run build-ext && npm run build-preview", "build-ext": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:markdown-language-features ./tsconfig.json", - "build-preview": "node ./esbuild-preview", + "build-preview": "node ./esbuild-preview.mjs", "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" },