
* Update Code to 1.94.2 * Convert from yarn to npm This is to match VS Code. We were already partially using npm for the releases so this is some nice alignment. * Update caniuse-lite This was complaining on every unit test. * Update eslint I was having a bunch of dependency conflicts and eslint seemed to be the culprit so I just removed it and set it up again, since it seems things have changed quite a bit. * Update test dependencies I was getting oom when running the unit tests...updating seems to work. * Remove package.json `scripts` property in release The new pre-install script was being included, which is dev-only. This was always the intent; did not realize jq's merge was recursive. * Remove jest and devDependencies in release as well * Update test extension dependencies This appears to be conflicting with the root dependencies. * Fix playwright exec npm does not let you run binaries like yarn does, as far as I know. * Fix import of server-main.js * Fix several tests by waiting for selectors
144 lines
4.1 KiB
TypeScript
144 lines
4.1 KiB
TypeScript
import { spawn, ChildProcess } from "child_process"
|
|
import * as path from "path"
|
|
import { onLine, OnLineCallback } from "../../src/node/util"
|
|
|
|
interface DevelopmentCompilers {
|
|
[key: string]: ChildProcess | undefined
|
|
vscode: ChildProcess
|
|
vscodeWebExtensions: ChildProcess
|
|
codeServer: ChildProcess
|
|
plugins: ChildProcess | undefined
|
|
}
|
|
|
|
class Watcher {
|
|
private rootPath = path.resolve(process.cwd())
|
|
private readonly paths = {
|
|
/** Path to uncompiled VS Code source. */
|
|
vscodeDir: path.join(this.rootPath, "lib/vscode"),
|
|
pluginDir: process.env.PLUGIN_DIR,
|
|
}
|
|
|
|
//#region Web Server
|
|
|
|
/** Development web server. */
|
|
private webServer: ChildProcess | undefined
|
|
|
|
private reloadWebServer = (): void => {
|
|
if (this.webServer) {
|
|
this.webServer.kill()
|
|
}
|
|
|
|
// Pass CLI args, save for `node` and the initial script name.
|
|
const args = process.argv.slice(2)
|
|
this.webServer = spawn("node", [path.join(this.rootPath, "out/node/entry.js"), ...args])
|
|
onLine(this.webServer, (line) => console.log("[code-server]", line))
|
|
const { pid } = this.webServer
|
|
|
|
this.webServer.on("exit", () => console.log("[code-server]", `Web process ${pid} exited`))
|
|
|
|
console.log("\n[code-server]", `Spawned web server process ${pid}`)
|
|
}
|
|
|
|
//#endregion
|
|
|
|
//#region Compilers
|
|
|
|
private readonly compilers: DevelopmentCompilers = {
|
|
codeServer: spawn("tsc", ["--watch", "--pretty", "--preserveWatchOutput"], { cwd: this.rootPath }),
|
|
vscode: spawn("npm", ["run", "watch"], { cwd: this.paths.vscodeDir }),
|
|
vscodeWebExtensions: spawn("npm", ["run", "watch-web"], { cwd: this.paths.vscodeDir }),
|
|
plugins: this.paths.pluginDir
|
|
? spawn("npm", ["run", "build", "--watch"], { cwd: this.paths.pluginDir })
|
|
: undefined,
|
|
}
|
|
|
|
public async initialize(): Promise<void> {
|
|
for (const event of ["SIGINT", "SIGTERM"]) {
|
|
process.on(event, () => this.dispose(0))
|
|
}
|
|
|
|
for (const [processName, devProcess] of Object.entries(this.compilers)) {
|
|
if (!devProcess) continue
|
|
|
|
devProcess.on("exit", (code) => {
|
|
console.log(`[${processName}]`, "Terminated unexpectedly")
|
|
this.dispose(code)
|
|
})
|
|
|
|
if (devProcess.stderr) {
|
|
devProcess.stderr.on("data", (d: string | Uint8Array) => process.stderr.write(d))
|
|
}
|
|
}
|
|
|
|
onLine(this.compilers.vscode, this.parseVSCodeLine)
|
|
onLine(this.compilers.codeServer, this.parseCodeServerLine)
|
|
|
|
if (this.compilers.plugins) {
|
|
onLine(this.compilers.plugins, this.parsePluginLine)
|
|
}
|
|
}
|
|
|
|
//#endregion
|
|
|
|
//#region Line Parsers
|
|
|
|
private parseVSCodeLine: OnLineCallback = (strippedLine, originalLine) => {
|
|
if (!strippedLine.length) return
|
|
|
|
console.log("[Code OSS]", originalLine)
|
|
|
|
if (strippedLine.includes("Finished compilation with")) {
|
|
console.log("[Code OSS] ✨ Finished compiling! ✨", "(Refresh your web browser ♻️)")
|
|
this.reloadWebServer()
|
|
}
|
|
}
|
|
|
|
private parseCodeServerLine: OnLineCallback = (strippedLine, originalLine) => {
|
|
if (!strippedLine.length) return
|
|
|
|
console.log("[Compiler][code-server]", originalLine)
|
|
|
|
if (strippedLine.includes("Watching for file changes")) {
|
|
console.log("[Compiler][code-server]", "Finished compiling!", "(Refresh your web browser ♻️)")
|
|
this.reloadWebServer()
|
|
}
|
|
}
|
|
|
|
private parsePluginLine: OnLineCallback = (strippedLine, originalLine) => {
|
|
if (!strippedLine.length) return
|
|
|
|
console.log("[Compiler][Plugin]", originalLine)
|
|
|
|
if (strippedLine.includes("Watching for file changes...")) {
|
|
this.reloadWebServer()
|
|
}
|
|
}
|
|
|
|
//#endregion
|
|
|
|
//#region Utilities
|
|
|
|
private dispose(code: number | null): void {
|
|
for (const [processName, devProcess] of Object.entries(this.compilers)) {
|
|
console.log(`[${processName}]`, "Killing...\n")
|
|
devProcess?.removeAllListeners()
|
|
devProcess?.kill()
|
|
}
|
|
process.exit(typeof code === "number" ? code : 0)
|
|
}
|
|
|
|
//#endregion
|
|
}
|
|
|
|
async function main(): Promise<void> {
|
|
try {
|
|
const watcher = new Watcher()
|
|
await watcher.initialize()
|
|
} catch (error: any) {
|
|
console.error(error.message)
|
|
process.exit(1)
|
|
}
|
|
}
|
|
|
|
main()
|