diff --git a/.gitignore b/.gitignore index 4929c46fb..1a0d00efd 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ release-packages/ release-gcp/ release-images/ node_modules +/lib/vscode/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..b12d9a864 100755 --- a/ci/build/npm-postinstall.sh +++ b/ci/build/npm-postinstall.sh @@ -41,6 +41,16 @@ main() { vscode_yarn() { cd lib/vscode yarn --production --frozen-lockfile + + # This is a copy of symlink_asar in ../lib.sh. Look there for details. + if [ ! -e node_modules.asar ]; then + if [ "${WINDIR-}" ]; then + mklink /J node_modules.asar node_modules + else + 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 e65541fd3..49f9ed951 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,22 @@ export OS # RELEASE_PATH is the destination directory for the release from the root. # Defaults to release RELEASE_PATH="${RELEASE_PATH-release}" + +# VS Code bundles some modules into an asar which is an archive format that +# works like tar. It then seems to get unpacked into node_modules.asar. +# +# I don't know why they do this but all the dependencies they bundle already +# exist in node_modules so just symlink it. We have to do this since not only VS +# Code itself but also extensions will look specifically in this directory for +# files (like the ripgrep binary or the oniguruma wasm). +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 d0cb4e33d..a5599794e 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",