diff --git a/.gitignore b/.gitignore index 4929c46fb..dc3aaf790 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ release-packages/ release-gcp/ release-images/ node_modules +node_modules.asar node-* /plugins /lib/coder-cloud-agent diff --git a/ci/build/build-release.sh b/ci/build/build-release.sh index 3b88ed7e9..c87645d34 100755 --- a/ci/build/build-release.sh +++ b/ci/build/build-release.sh @@ -96,6 +96,10 @@ EOF # yarn to fetch node_modules if necessary without build scripts running. # We cannot use --no-scripts because we still want dependent package scripts to run. jq 'del(.scripts)' < "$VSCODE_SRC_PATH/package.json" > "$VSCODE_OUT_PATH/package.json" + + pushd "$VSCODE_OUT_PATH" + symlink_asar + popd } main "$@" diff --git a/ci/build/npm-postinstall.sh b/ci/build/npm-postinstall.sh index 743b549ff..d4d30233c 100755 --- a/ci/build/npm-postinstall.sh +++ b/ci/build/npm-postinstall.sh @@ -41,6 +41,19 @@ main() { vscode_yarn() { cd lib/vscode yarn --production --frozen-lockfile + + # VS Code needs a node_modules.asar but that's just a duplicate of stuff we + # already have in node_modules. + if [ ! -e node_modules.asar ]; then + if [ "${WINDIR-}" ]; then + # mklink takes the link name first. + mklink /J node_modules.asar node_modules + else + # ln takes the link name second. + ln -s node_modules node_modules.asar + fi + fi + cd extensions yarn --production --frozen-lockfile for ext in */; do diff --git a/ci/dev/postinstall.sh b/ci/dev/postinstall.sh new file mode 100755 index 000000000..2ca2e0591 --- /dev/null +++ b/ci/dev/postinstall.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -euo pipefail + +main() { + cd "$(dirname "$0")/../.." + source ./ci/lib.sh + + cd lib/vscode + yarn ${CI+--frozen-lockfile} + + symlink_asar +} + +main "$@" diff --git a/ci/lib.sh b/ci/lib.sh index d58c29cb1..dae06c6d9 100755 --- a/ci/lib.sh +++ b/ci/lib.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +set -euo pipefail pushd() { builtin pushd "$@" > /dev/null @@ -93,3 +94,17 @@ export OS # RELEASE_PATH is the destination directory for the release from the root. # Defaults to release RELEASE_PATH="${RELEASE_PATH-release}" + +# Symlink node_modules.asar to node_modules. VS Code needs a node_modules.asar +# but that's just a duplicate of stuff we already have in node_modules. +symlink_asar() { + if [ ! -e node_modules.asar ]; then + if [ "${WINDIR-}" ]; then + # mklink takes the link name first. + mklink /J node_modules.asar node_modules + else + # ln takes the link name second. + ln -s node_modules node_modules.asar + fi + fi +} diff --git a/lib/vscode/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts b/lib/vscode/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts index 5529222b2..98c59ef1b 100644 --- a/lib/vscode/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts +++ b/lib/vscode/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts @@ -58,13 +58,12 @@ const args = minimist(process.argv.slice(2), { const Module = require.__$__nodeRequire('module') as any; const originalLoad = Module._load; - Module._load = function (request: string, parent: object, isMain: boolean) { + Module._load = function (request: string) { if (request === 'natives') { throw new Error('Either the extension or a NPM dependency is using the "natives" node module which is unsupported as it can cause a crash of the extension host. Click [here](https://go.microsoft.com/fwlink/?linkid=871887) to find out more'); } - // NOTE@coder: Map node_module.asar requests to regular node_modules. - return originalLoad.apply(this, [request.replace(/node_modules\.asar(\.unpacked)?/, 'node_modules'), parent, isMain]); + return originalLoad.apply(this, arguments); }; })(); diff --git a/package.json b/package.json index bb25d9da7..92173f0ac 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "release:github-assets": "./ci/build/release-github-assets.sh", "test:standalone-release": "./ci/build/test-standalone-release.sh", "package": "./ci/build/build-packages.sh", - "postinstall": "cd lib/vscode && yarn ${CI+--frozen-lockfile}", + "postinstall": "./ci/dev/postinstall.sh", "_____": "", "fmt": "./ci/dev/fmt.sh", "lint": "./ci/dev/lint.sh",