Skip to content

Commit

Permalink
Fix vscode-stlite to use esbuild and be an ESM (#1293)
Browse files Browse the repository at this point in the history
* Modify stlite-vscode to be esbuild-based

* Fix vscode-stlite ESM

* Remove lint task from build command
  • Loading branch information
whitphx authored Jan 24, 2025
1 parent 7984aa9 commit 5e42a1d
Show file tree
Hide file tree
Showing 12 changed files with 231 additions and 623 deletions.
121 changes: 3 additions & 118 deletions packages/vscode-stlite/.gitignore
Original file line number Diff line number Diff line change
@@ -1,120 +1,5 @@
.vscode-test-web

### https://raw.github.com/github/gitignore/218a941be92679ce67d0484547e3e142b2f5f6f0/Node.gitignore

# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage
*.lcov

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Snowpack dependency directory (https://snowpack.dev/)
web_modules/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env
.env.test

# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache

# Next.js build output
.next
out

# Nuxt.js build / generate output
.nuxt
dist

# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public

# vuepress build output
.vuepress/dist

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

# TernJS port file
.tern-port

# Stores VSCode versions used for testing VSCode extensions
.vscode-test

# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
node_modules
.vscode-test-web/
*.vsix
6 changes: 5 additions & 1 deletion packages/vscode-stlite/.vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": ["dbaeumer.vscode-eslint", "amodio.tsl-problem-matcher"]
"recommendations": [
"dbaeumer.vscode-eslint",
"connor4312.esbuild-problem-matchers",
"ms-vscode.extension-test-runner"
]
}
8 changes: 4 additions & 4 deletions packages/vscode-stlite/.vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@
"configurations": [
{
"name": "Run Web Extension ",
"type": "pwa-extensionHost",
"type": "extensionHost",
"debugWebWorkerHost": true,
"request": "launch",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}",
"--extensionDevelopmentKind=web"
],
"outFiles": ["${workspaceFolder}/dist/web/**/*.js"],
"preLaunchTask": "npm: watch-web"
"preLaunchTask": "${defaultBuildTask}"
},
{
"name": "Extension Tests",
Expand All @@ -25,10 +25,10 @@
"args": [
"--extensionDevelopmentPath=${workspaceFolder}",
"--extensionDevelopmentKind=web",
"--extensionTestsPath=${workspaceFolder}/dist/web/test/suite/index"
"--extensionTestsPath=${workspaceFolder}/dist/web/test/suite/extensionTests"
],
"outFiles": ["${workspaceFolder}/dist/web/**/*.js"],
"preLaunchTask": "npm: watch-web"
"preLaunchTask": "${defaultBuildTask}"
}
]
}
4 changes: 2 additions & 2 deletions packages/vscode-stlite/.vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
// Place your settings in this file to overwrite default and user settings.
{
"files.exclude": {
"out": false // set this to true to hide the "out" folder with the compiled JS files
"dist": false // set this to true to hide the "dist" folder with the compiled JS files
},
"search.exclude": {
"out": true // set this to false to include "out" folder in search results
"dist": true // set this to false to include "dist" folder in search results
},
// Turn off tsc task auto detection since we have the necessary tasks as npm scripts
"typescript.tsc.autoDetect": "off"
Expand Down
37 changes: 31 additions & 6 deletions packages/vscode-stlite/.vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,45 @@
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "compile-web",
"label": "watch-web",
"dependsOn": ["npm: watch-web:tsc", "npm: watch-web:esbuild"],
"presentation": {
"reveal": "never"
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": ["$ts-webpack", "$tslint-webpack"]
}
},
{
"type": "npm",
"script": "watch-web",
"script": "watch-web:esbuild",
"group": "build",
"problemMatcher": "$esbuild-watch",
"isBackground": true,
"problemMatcher": ["$ts-webpack-watch", "$tslint-webpack-watch"]
"label": "npm: watch-web:esbuild",
"presentation": {
"group": "watch",
"reveal": "never"
}
},
{
"type": "npm",
"script": "watch-web:tsc",
"group": "build",
"problemMatcher": "$tsc-watch",
"isBackground": true,
"label": "npm: watch-web:tsc",
"presentation": {
"group": "watch",
"reveal": "never"
}
},
{
"label": "compile",
"type": "npm",
"script": "compile-web",
"problemMatcher": ["$tsc", "$esbuild"]
}
]
}
4 changes: 4 additions & 0 deletions packages/vscode-stlite/.vscodeignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,19 @@
src/**
out/**
node_modules/**
dist/**/test/**
.gitignore
.eslintignore
.prettierignore
.eslintcache
.lintstagedrc.json
vsc-extension-quickstart.md
webpack.config.js
esbuild.js
.yarnrc
**/tsconfig.json
**/.eslintrc.json
**/eslint.config.mjs
**/*.map
**/*.ts
**/.vscode-test.*
106 changes: 106 additions & 0 deletions packages/vscode-stlite/esbuild.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import esbuild from "esbuild";
import { glob } from "glob";
import path from "path";
import { polyfillNode } from "esbuild-plugin-polyfill-node";

const production = process.argv.includes("--production");
const watch = process.argv.includes("--watch");

/**
* This plugin hooks into the build process to print errors in a format that the problem matcher in
* Visual Studio Code can understand.
* @type {import('esbuild').Plugin}
*/
const esbuildProblemMatcherPlugin = {
name: "esbuild-problem-matcher",

setup(build) {
build.onStart(() => {
console.log("[watch] build started");
});
build.onEnd((result) => {
result.errors.forEach(({ text, location }) => {
console.error(`✘ [ERROR] ${text}`);
console.error(
` ${location.file}:${location.line}:${location.column}:`,
);
});
console.log("[watch] build finished");
});
},
};

/**
* For web extension, all tests, including the test runner, need to be bundled into
* a single module that has a exported `run` function .
* This plugin bundles implements a virtual file extensionTests.ts that bundles all these together.
* @type {import('esbuild').Plugin}
*/
const testBundlePlugin = {
name: "testBundlePlugin",
setup(build) {
build.onResolve({ filter: /[/\\]extensionTests\.ts$/ }, (args) => {
if (args.kind === "entry-point") {
return { path: path.resolve(args.path) };
}
});
build.onLoad({ filter: /[/\\]extensionTests\.ts$/ }, async (args) => {
const testsRoot = path.join(import.meta.dirname, "src/web/test/suite");
const files = await glob("*.test.{ts,tsx}", {
cwd: testsRoot,
posix: true,
});
return {
contents:
`export { run } from './mochaTestRunner.ts';` +
files.map((f) => `import('./${f}');`).join(""),
watchDirs: files.map((f) => path.dirname(path.resolve(testsRoot, f))),
watchFiles: files.map((f) => path.resolve(testsRoot, f)),
};
});
},
};

async function main() {
const ctx = await esbuild.context({
entryPoints: [
"src/web/extension.ts",
"src/web/test/suite/extensionTests.ts",
],
bundle: true,
format: "cjs",
minify: production,
sourcemap: !production,
sourcesContent: false,
platform: "browser",
outdir: "dist/web",
external: ["vscode"],
logLevel: "silent",
// Node.js global to browser globalThis
define: {
global: "globalThis",
STLITE_VERSION: JSON.stringify(process.env.npm_package_version),
},

plugins: [
polyfillNode({
process: true,
buffer: true,
path: true,
}),
testBundlePlugin,
esbuildProblemMatcherPlugin /* add to the end of plugins array */,
],
});
if (watch) {
await ctx.watch();
} else {
await ctx.rebuild();
await ctx.dispose();
}
}

main().catch((e) => {
console.error(e);
process.exit(1);
});
Loading

0 comments on commit 5e42a1d

Please sign in to comment.