From 94ceeceee89f98602a6314cb044cbf72359439b6 Mon Sep 17 00:00:00 2001 From: Joe Previte Date: Wed, 9 Jun 2021 15:59:58 -0700 Subject: [PATCH 1/5] refactor: reference /src stylesheets in pages/*.html --- src/browser/pages/error.html | 3 ++- src/browser/pages/login.html | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/browser/pages/error.html b/src/browser/pages/error.html index 73a9599bd6bc..93be58fd9696 100644 --- a/src/browser/pages/error.html +++ b/src/browser/pages/error.html @@ -16,7 +16,8 @@ - + + diff --git a/src/browser/pages/login.html b/src/browser/pages/login.html index ef3f16a40700..f9f3763e58c9 100644 --- a/src/browser/pages/login.html +++ b/src/browser/pages/login.html @@ -16,7 +16,8 @@ - + + From 16bcf86d2487700f09bcb92b30a98e97e2ca6647 Mon Sep 17 00:00:00 2001 From: Joe Previte Date: Wed, 9 Jun 2021 16:00:35 -0700 Subject: [PATCH 2/5] refactor: remove css imports from register.ts --- src/browser/register.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/browser/register.ts b/src/browser/register.ts index b4f4dc6c8876..0c3d779045a7 100644 --- a/src/browser/register.ts +++ b/src/browser/register.ts @@ -1,10 +1,6 @@ import { logger } from "@coder/logger" import { getOptions, normalize, logError } from "../common/util" -import "./pages/error.css" -import "./pages/global.css" -import "./pages/login.css" - export async function registerServiceWorker(): Promise { const options = getOptions() logger.level = options.logLevel From 3524f03d4076f7ae8c14fb2f0925f8177df9b707 Mon Sep 17 00:00:00 2001 From: Joe Previte Date: Wed, 9 Jun 2021 16:01:48 -0700 Subject: [PATCH 3/5] refactor: bundle pages/*css in release --- ci/build/build-release.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/build/build-release.sh b/ci/build/build-release.sh index ffad55380418..6e01fe2ac16b 100755 --- a/ci/build/build-release.sh +++ b/ci/build/build-release.sh @@ -35,6 +35,7 @@ bundle_code_server() { rsync src/browser/media/ "$RELEASE_PATH/src/browser/media" mkdir -p "$RELEASE_PATH/src/browser/pages" rsync src/browser/pages/*.html "$RELEASE_PATH/src/browser/pages" + rsync src/browser/pages/*.css "$RELEASE_PATH/src/browser/pages" rsync src/browser/robots.txt "$RELEASE_PATH/src/browser" # Add typings for plugins From c4e7ee304e9ba9a08c75b0dd231e3ca3a5491391 Mon Sep 17 00:00:00 2001 From: Joe Previte Date: Thu, 10 Jun 2021 14:44:12 -0700 Subject: [PATCH 4/5] feat: add tests for pages/login.ts --- CHANGELOG.md | 1 + test/browser/pages/login.test.ts | 69 ++++++++++++++++++++++++++++++++ yarn.lock | 6 +-- 3 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 test/browser/pages/login.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index f63d3d4c65a0..2b7ba2851c6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,7 @@ VS Code v0.00.0 ### Development - fix(publish): update cdrci fork in brew-bump.sh #3468 @jsjoeio +- chore(dev): migrate away from parcel #3578 @jsjoeio ## 3.10.2 diff --git a/test/browser/pages/login.test.ts b/test/browser/pages/login.test.ts new file mode 100644 index 000000000000..7f77d9665999 --- /dev/null +++ b/test/browser/pages/login.test.ts @@ -0,0 +1,69 @@ +import { JSDOM } from "jsdom" +import { LocationLike } from "../../unit/util.test" + +describe("login", () => { + describe("there is an element with id 'base'", () => { + beforeEach(() => { + const dom = new JSDOM() + global.document = dom.window.document + + const location: LocationLike = { + pathname: "/healthz", + origin: "http://localhost:8080", + } + + global.location = location as Location + }) + afterEach(() => { + // Reset the global.document + global.document = undefined as any as Document + global.location = undefined as any as Location + }) + it("should set the value to options.base", () => { + // Mock getElementById + const spy = jest.spyOn(document, "getElementById") + // Create a fake element and set the attribute + const mockElement = document.createElement("input") + mockElement.setAttribute("id", "base") + mockElement.setAttribute( + "data-settings", + '{"base":"./hello-world","csStaticBase":"./static/development/Users/jp/Dev/code-server","logLevel":2,"disableTelemetry":false,"disableUpdateCheck":false}', + ) + document.body.appendChild(mockElement) + spy.mockImplementation(() => mockElement) + // Load file + require("../../../src/browser/pages/login") + + const el: HTMLInputElement | null = document.querySelector("input#base") + expect(el?.value).toBe("/hello-world") + }) + }) + + describe("there is no element with id 'base'", () => { + let initialDom: Document + beforeEach(() => { + const dom = new JSDOM() + initialDom = dom.window.document + global.document = dom.window.document + + const location: LocationLike = { + pathname: "/healthz", + origin: "http://localhost:8080", + } + + global.location = location as Location + }) + afterEach(() => { + // Reset the global.document + global.document = undefined as any as Document + global.location = undefined as any as Location + }) + + it("should not change the DOM", () => { + // Load file + require("../../../src/browser/pages/login") + const currentDom = global.document + expect(initialDom).toBe(currentDom) + }) + }) +}) diff --git a/yarn.lock b/yarn.lock index 300a165ea14d..b3fb59e5e2bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6435,9 +6435,9 @@ postcss-normalize-string@^4.0.2: postcss-value-parser "^3.0.0" postcss-normalize-string@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.0.tgz#2ea08ff4cb8817ce160755e9fdc7e6ef6d495002" - integrity sha512-wSO4pf7GNcDZpmelREWYADF1+XZWrAcbFLQCOqoE92ZwYgaP/RLumkUTaamEzdT2YKRZAH8eLLKGWotU/7FNPw== + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0" + integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA== dependencies: postcss-value-parser "^4.1.0" From 5d4e08e390f14ebdd62a6595a1851897a1377273 Mon Sep 17 00:00:00 2001 From: Joe Previte Date: Mon, 21 Jun 2021 15:08:43 -0700 Subject: [PATCH 5/5] refactor: remove parcel parent c4e7ee304e9ba9a08c75b0dd231e3ca3a5491391 author Joe Previte 1624313323 -0700 committer Joe Previte 1624386904 -0700 gpgsig -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE6XoH+XX6Zt5LBiiaLJFZDGt0LCQFAmDSLVgACgkQLJFZDGt0 LCRIsw/8C35RO8Yr/gLs2PDeYXdmfBgB96dj71eZFeUxiURY+6xGkFLWff+Dm7P/ tN36AQSMkL8Ia8+r5XEQK1q92lQrsJfJKRRJ4OW/Xn2ZF8D0YRZWomhVjKHQRozs TPMt3IOeFjmCpF2M8veI3KgbF/p29YTwQ6PcKE2dsodF3CUoEzW9ciswKOinxAev iliSgbHuu35hX+OHtAm5ZJh5WOxhr23o9vwuJSLw2+/285sqPPwRO3wwZuLLh6wA KYFer3/vfS6+EIs0ushajeeDYsaMYtr55Yc9OI4otcQoT1GQFuGe5D/ISN6XYtmB N9RKKkiWVnG959eKQ7ycnDXrt1KQphxkaMR3o3DGsX1FPK6WAxOuDHN+VHZXelLM S8ZhmVblbfu8bkkLO8+xb5I1iz4NnV7QDI3q/1dqcq+ZTzRfu0b19RpPSxyZJ5dx 9g3KFZ29qzovb5aH5+9yQvJlGtflzsL6eIbOYdv7LuslEhE8Ks9Oa2zSjbQ8K/4q DAWfj6wR80yg36eL55gH9IJeMT0g+W3oUxRa0Um7PAgNAoFcaBI0jpAPuf1W7Rzd 2asHTkpENQUHe5fZkUpzVVmkqf2LzhjChAd5cKkdS4pp+ne8sfy6+sJRBoIUmwXy zQ8ZYJnsWXLrC/ijiOzFzrTskgr875vj7oEczmjfcyvNutskTG8= =kJgg -----END PGP SIGNATURE----- refactor: remove parcel refactor: upgrade to parcel v2 fix: css-what and normalize-url refactor: update parcel settings in build-code-server.sh feat: add .parcel-cache to .gitignore refactor: reference /src stylesheets in pages/*.html refactor: remove css imports from register.ts refactor: bundle pages/*css in release refactor: upgrade to parcel v2 --- .gitignore | 1 - ci/build/build-code-server.sh | 14 +- ci/build/build-release.sh | 2 +- ci/dev/watch.ts | 60 +- package.json | 9 +- src/browser/pages/error.html | 2 +- src/browser/pages/login.html | 3 +- src/browser/pages/login.ts | 1 + src/browser/pages/vscode.html | 3 +- src/browser/pages/vscode.ts | 5 +- tsconfig.json | 4 +- yarn.lock | 4352 ++++----------------------------- 12 files changed, 518 insertions(+), 3938 deletions(-) diff --git a/.gitignore b/.gitignore index 96e946346122..8ac5641036d5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ .tsbuildinfo .cache -dist* /out*/ release/ release-npm-package/ diff --git a/ci/build/build-code-server.sh b/ci/build/build-code-server.sh index c465f7e4a0c4..c17725393435 100755 --- a/ci/build/build-code-server.sh +++ b/ci/build/build-code-server.sh @@ -3,9 +3,6 @@ set -euo pipefail # Builds code-server into out and the frontend into dist. -# MINIFY controls whether parcel minifies dist. -MINIFY=${MINIFY-true} - main() { cd "$(dirname "${0}")/../.." @@ -32,14 +29,9 @@ main() { set -e fi - parcel build \ - --public-url "." \ - --out-dir dist \ - $([[ $MINIFY ]] || echo --no-minify) \ - src/browser/register.ts \ - src/browser/serviceWorker.ts \ - src/browser/pages/login.ts \ - src/browser/pages/vscode.ts + yarn browserify out/browser/register.js -o out/browser/register.browserified.js + yarn browserify out/browser/pages/login.js -o out/browser/pages/login.browserified.js + yarn browserify out/browser/pages/vscode.js -o out/browser/pages/vscode.browserified.js } main "$@" diff --git a/ci/build/build-release.sh b/ci/build/build-release.sh index 6e01fe2ac16b..fb5edc3bdeee 100755 --- a/ci/build/build-release.sh +++ b/ci/build/build-release.sh @@ -28,7 +28,7 @@ main() { } bundle_code_server() { - rsync out dist "$RELEASE_PATH" + rsync out "$RELEASE_PATH" # For source maps and images. mkdir -p "$RELEASE_PATH/src/browser" diff --git a/ci/dev/watch.ts b/ci/dev/watch.ts index 646da328b3f8..714a12f7e139 100644 --- a/ci/dev/watch.ts +++ b/ci/dev/watch.ts @@ -1,5 +1,6 @@ +import browserify from "browserify" import * as cp from "child_process" -import Bundler from "parcel-bundler" +import * as fs from "fs" import * as path from "path" async function main(): Promise { @@ -40,7 +41,6 @@ class Watcher { const plugin = process.env.PLUGIN_DIR ? cp.spawn("yarn", ["build", "--watch"], { cwd: process.env.PLUGIN_DIR }) : undefined - const bundler = this.createBundler() const cleanup = (code?: number | null): void => { Watcher.log("killing vs code watcher") @@ -63,7 +63,7 @@ class Watcher { server.kill() } - Watcher.log("killing bundler") + Watcher.log("killing watch") process.exit(code || 0) } @@ -84,16 +84,6 @@ class Watcher { cleanup(code) }) } - const bundle = bundler.bundle().catch(() => { - Watcher.log("parcel watcher terminated unexpectedly") - cleanup(1) - }) - bundler.on("buildEnd", () => { - console.log("[parcel] bundled") - }) - bundler.on("buildError", (error) => { - console.error("[parcel]", error) - }) vscode.stderr.on("data", (d) => process.stderr.write(d)) tsc.stderr.on("data", (d) => process.stderr.write(d)) @@ -101,6 +91,12 @@ class Watcher { plugin.stderr.on("data", (d) => process.stderr.write(d)) } + const browserFiles = [ + path.join(this.rootPath, "out/browser/register.js"), + path.join(this.rootPath, "out/browser/pages/login.js"), + path.join(this.rootPath, "out/browser/pages/vscode.js"), + ] + // From https://github.com/chalk/ansi-regex const pattern = [ "[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", @@ -143,7 +139,7 @@ class Watcher { startingVscode = true } else if (startingVscode && line.includes("Finished compilation")) { if (startedVscode) { - bundle.then(restartServer) + restartServer() } startedVscode = true } @@ -155,7 +151,8 @@ class Watcher { console.log("[tsc]", original) } if (line.includes("Watching for file changes")) { - bundle.then(restartServer) + bundleBrowserCode(browserFiles) + restartServer() } }) @@ -166,29 +163,26 @@ class Watcher { console.log("[plugin]", original) } if (line.includes("Watching for file changes")) { - bundle.then(restartServer) + restartServer() } }) } } +} - private createBundler(out = "dist"): Bundler { - return new Bundler( - [ - path.join(this.rootPath, "src/browser/register.ts"), - path.join(this.rootPath, "src/browser/serviceWorker.ts"), - path.join(this.rootPath, "src/browser/pages/login.ts"), - path.join(this.rootPath, "src/browser/pages/vscode.ts"), - ], - { - outDir: path.join(this.rootPath, out), - cacheDir: path.join(this.rootPath, ".cache"), - minify: !!process.env.MINIFY, - logLevel: 1, - publicUrl: ".", - }, - ) - } +function bundleBrowserCode(inputFiles: string[]) { + console.log(`[browser] bundling...`) + inputFiles.forEach(async (path: string) => { + const outputPath = path.replace(".js", ".browserified.js") + browserify() + .add(path) + .bundle() + .on("error", function (error: Error) { + console.error(error.toString()) + }) + .pipe(fs.createWriteStream(outputPath)) + }) + console.log(`[browser] done bundling`) } main() diff --git a/package.json b/package.json index 6baa5ce51746..074098253511 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "lint": "./ci/dev/lint.sh", "test": "echo 'Run yarn test:unit or yarn test:e2e' && exit 1", "ci": "./ci/dev/ci.sh", - "watch": "VSCODE_IPC_HOOK_CLI= NODE_OPTIONS=--max_old_space_size=32384 ts-node ./ci/dev/watch.ts", + "watch": "VSCODE_IPC_HOOK_CLI= NODE_OPTIONS='--max_old_space_size=32384 --trace-warnings' ts-node ./ci/dev/watch.ts", "icons": "./ci/dev/gen_icons.sh", "coverage": "codecov" }, @@ -37,13 +37,13 @@ "devDependencies": { "@schemastore/package": "^0.0.6", "@types/body-parser": "^1.19.0", + "@types/browserify": "^12.0.36", "@types/compression": "^1.7.0", "@types/cookie-parser": "^1.4.2", "@types/express": "^4.17.8", "@types/http-proxy": "^1.17.4", "@types/js-yaml": "^4.0.0", "@types/node": "^14.17.1", - "@types/parcel-bundler": "^1.12.1", "@types/pem": "^1.9.5", "@types/proxy-from-env": "^1.0.1", "@types/safe-compare": "^1.1.0", @@ -56,6 +56,7 @@ "@typescript-eslint/eslint-plugin": "^4.7.0", "@typescript-eslint/parser": "^4.7.0", "audit-ci": "^4.0.0", + "browserify": "^17.0.0", "codecov": "^3.8.1", "doctoc": "^2.0.0", "eslint": "^7.7.0", @@ -64,7 +65,6 @@ "eslint-plugin-import": "^2.18.2", "eslint-plugin-prettier": "^3.1.0", "leaked-handles": "^5.2.0", - "parcel-bundler": "^1.12.5", "prettier": "^2.2.1", "prettier-plugin-sh": "^0.6.0", "shellcheck": "^1.0.0", @@ -79,9 +79,6 @@ "doctoc/underscore": "^1.13.1", "doctoc/**/trim": "^1.0.0", "postcss": "^8.2.1", - "parcel-bundler/cssnano": "^5.0.2", - "parcel-bundler/ws": "^7.4.6", - "parcel-bundler/htmlnano/uncss/jsdom/ws": "^7.4.6", "browserslist": "^4.16.5", "safe-buffer": "^5.1.1", "vfile-message": "^2.0.2" diff --git a/src/browser/pages/error.html b/src/browser/pages/error.html index 93be58fd9696..56e03e27a628 100644 --- a/src/browser/pages/error.html +++ b/src/browser/pages/error.html @@ -30,6 +30,6 @@

{{ERROR_HEADER}}

- + diff --git a/src/browser/pages/login.html b/src/browser/pages/login.html index f9f3763e58c9..896927e3812c 100644 --- a/src/browser/pages/login.html +++ b/src/browser/pages/login.html @@ -49,6 +49,5 @@

Welcome to code-server

- - + diff --git a/src/browser/pages/login.ts b/src/browser/pages/login.ts index c7fc92d4a0e7..cd3fd0d16542 100644 --- a/src/browser/pages/login.ts +++ b/src/browser/pages/login.ts @@ -1,4 +1,5 @@ import { getOptions } from "../../common/util" +import "../register" const options = getOptions() const el = document.getElementById("base") as HTMLInputElement diff --git a/src/browser/pages/vscode.html b/src/browser/pages/vscode.html index 48a3469940a3..aaae0f691e9a 100644 --- a/src/browser/pages/vscode.html +++ b/src/browser/pages/vscode.html @@ -39,8 +39,7 @@ - - +