diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 24177a763..2c53f182c 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -50,11 +50,11 @@ jobs: files: | docs/** - - name: Install Node.js v16 + - name: Install Node.js v18 if: steps.changed-files.outputs.any_changed == 'true' uses: actions/setup-node@v3 with: - node-version: "16" + node-version: "18" cache: "yarn" - name: Install doctoc @@ -115,11 +115,11 @@ jobs: files_ignore: | lib/vscode/** - - name: Install Node.js v16 + - name: Install Node.js v18 if: steps.changed-files.outputs.any_changed == 'true' uses: actions/setup-node@v3 with: - node-version: "16" + node-version: "18" - name: Fetch dependencies from cache if: steps.changed-files.outputs.any_changed == 'true' @@ -170,11 +170,11 @@ jobs: files_ignore: | lib/vscode/** - - name: Install Node.js v16 + - name: Install Node.js v18 if: steps.changed-files.outputs.any_changed == 'true' uses: actions/setup-node@v3 with: - node-version: "16" + node-version: "18" - name: Fetch dependencies from cache if: steps.changed-files.outputs.any_changed == 'true' @@ -212,6 +212,9 @@ jobs: with: submodules: true + - name: Install system dependencies + run: sudo apt update && sudo apt install -y libkrb5-dev + - name: Install quilt uses: awalsh128/cache-apt-pkgs-action@latest with: @@ -221,10 +224,10 @@ jobs: - name: Patch Code run: quilt push -a - - name: Install Node.js v16 + - name: Install Node.js v18 uses: actions/setup-node@v3 with: - node-version: "16" + node-version: "18" - name: Fetch dependencies from cache id: cache-node-modules @@ -292,10 +295,13 @@ jobs: - name: Checkout repo uses: actions/checkout@v3 - - name: Install Node.js v16 + - name: Install system dependencies + run: sudo apt update && sudo apt install -y libkrb5-dev + + - name: Install Node.js v18 uses: actions/setup-node@v3 with: - node-version: "16" + node-version: "18" - name: Fetch dependencies from cache id: cache-node-modules @@ -348,10 +354,13 @@ jobs: - name: Checkout repo uses: actions/checkout@v3 - - name: Install Node.js v16 + - name: Install system dependencies + run: sudo apt update && sudo apt install -y libkrb5-dev + + - name: Install Node.js v18 uses: actions/setup-node@v3 with: - node-version: "16" + node-version: "18" - name: Fetch dependencies from cache id: cache-node-modules diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index ac99c6de5..90f9d114d 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -35,10 +35,10 @@ jobs: - name: Checkout repo uses: actions/checkout@v3 - - name: Install Node.js v16 + - name: Install Node.js v18 uses: actions/setup-node@v3 with: - node-version: "16" + node-version: "18" - name: Install development tools run: | @@ -46,6 +46,8 @@ jobs: yum install -y devtoolset-9-{make,gcc,gcc-c++} jq rsync python3 # for keytar yum install -y libsecret-devel + # for kerberos + yum install -y krb5-devel - name: Install nfpm and envsubst run: | @@ -140,16 +142,16 @@ jobs: CXX: ${{ format('{0}-g++', matrix.prefix) }} LINK: ${{ format('{0}-g++', matrix.prefix) }} NPM_CONFIG_ARCH: ${{ matrix.arch }} - NODE_VERSION: v16.13.0 + NODE_VERSION: v18.15.0 steps: - name: Checkout repo uses: actions/checkout@v3 - - name: Install Node.js v16 + - name: Install Node.js v18 uses: actions/setup-node@v3 with: - node-version: "16" + node-version: "18" - name: Install nfpm run: | @@ -157,8 +159,8 @@ jobs: curl -sSfL https://github.com/goreleaser/nfpm/releases/download/v2.3.1/nfpm_2.3.1_`uname -s`_`uname -m`.tar.gz | tar -C ~/.local/bin -zxv nfpm echo "$HOME/.local/bin" >> $GITHUB_PATH - - name: Install cross-compiler - run: sudo apt update && sudo apt install $PACKAGE + - name: Install cross-compiler and system dependencies + run: sudo apt update && sudo apt install -y $PACKAGE libkrb5-dev env: PACKAGE: ${{ format('g++-{0}', matrix.prefix) }} @@ -208,10 +210,10 @@ jobs: - name: Checkout repo uses: actions/checkout@v3 - - name: Install Node.js v16 + - name: Install Node.js v18 uses: actions/setup-node@v3 with: - node-version: "16" + node-version: "18" - name: Install nfpm run: | @@ -305,7 +307,7 @@ jobs: npm version --prefix release "$VERSION" echo "Updating version in lib/vscode/product.json" - tmp=$(mktemp) + tmp=$(mktemp) jq ".codeServerVersion = \"$VERSION\"" release/lib/vscode/product.json > "$tmp" && mv "$tmp" release/lib/vscode/product.json # Ensure it has the same permissions as before chmod 644 release/lib/vscode/product.json diff --git a/.github/workflows/security.yaml b/.github/workflows/security.yaml index 7bb342241..9024e7a3c 100644 --- a/.github/workflows/security.yaml +++ b/.github/workflows/security.yaml @@ -29,10 +29,10 @@ jobs: with: fetch-depth: 0 - - name: Install Node.js v16 + - name: Install Node.js v18 uses: actions/setup-node@v3 with: - node-version: "16" + node-version: "18" - name: Fetch dependencies from cache id: cache-yarn diff --git a/ci/build/npm-postinstall.sh b/ci/build/npm-postinstall.sh index ee4d34913..028c1bad6 100755 --- a/ci/build/npm-postinstall.sh +++ b/ci/build/npm-postinstall.sh @@ -68,8 +68,8 @@ main() { echo "USE AT YOUR OWN RISK!" fi - if [ "$major_node_version" -ne "${FORCE_NODE_VERSION:-16}" ]; then - echo "ERROR: code-server currently requires node v16." + if [ "$major_node_version" -ne "${FORCE_NODE_VERSION:-18}" ]; then + echo "ERROR: code-server currently requires node v18." if [ -n "$FORCE_NODE_VERSION" ]; then echo "However, you have overrided the version check to use v$FORCE_NODE_VERSION." fi diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 5b3df599a..41c72a80c 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -37,7 +37,7 @@ for [VS Code](https://github.com/Microsoft/vscode/wiki/How-to-Contribute#prerequisites). Here is what is needed: -- `node` v16.x +- `node` v18.x - `git` v2.x or greater - [`git-lfs`](https://git-lfs.github.com) - [`yarn`](https://classic.yarnpkg.com/en/) @@ -63,7 +63,7 @@ Here is what is needed: If you're developing code-server on Linux, make sure you have installed or install the following dependencies: ```shell -sudo apt-get install build-essential g++ libx11-dev libxkbfile-dev libsecret-1-dev python-is-python3 +sudo apt-get install build-essential g++ libx11-dev libxkbfile-dev libsecret-1-dev libkrb5-dev python-is-python3 ``` These are required by Code. See [their Wiki](https://github.com/microsoft/vscode/wiki/How-to-Contribute#prerequisites) for more information. diff --git a/docs/android.md b/docs/android.md index c53028353..9479276e0 100644 --- a/docs/android.md +++ b/docs/android.md @@ -11,11 +11,11 @@ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash ``` 6. Exit the terminal using `exit` and then reopen the terminal -7. Install and use Node.js 16: +7. Install and use Node.js 18: ```shell -nvm install 16 -nvm use 16 +nvm install 18 +nvm use 18 ``` 8. Install code-server globally on device with: `npm install --global code-server --unsafe-perm` diff --git a/docs/npm.md b/docs/npm.md index 5d3d3f88e..12064e3b0 100644 --- a/docs/npm.md +++ b/docs/npm.md @@ -30,7 +30,7 @@ includes installing instructions based on your operating system. ## Node.js version We use the same major version of Node.js shipped with Code's remote, which is -currently `16.x`. VS Code also [lists Node.js +currently `18.x`. VS Code also [lists Node.js requirements](https://github.com/microsoft/vscode/wiki/How-to-Contribute#prerequisites). Using other versions of Node.js [may lead to unexpected @@ -79,7 +79,7 @@ Proceed to [installing](#installing) ## FreeBSD ```sh -pkg install -y git python npm-node16 pkgconf +pkg install -y git python npm-node18 pkgconf pkg install -y libinotify ``` diff --git a/docs/termux.md b/docs/termux.md index 9c19a9e42..82aa995ad 100644 --- a/docs/termux.md +++ b/docs/termux.md @@ -56,7 +56,7 @@ npm config set python python3 node -v ``` -you will get node version `v16.15.0` +you will get Node version `v18` 5. Now install code-server following our guide on [installing with npm](./npm.md) diff --git a/flake.nix b/flake.nix index 543f74384..37e5062c1 100644 --- a/flake.nix +++ b/flake.nix @@ -7,14 +7,14 @@ flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; - nodejs = pkgs.nodejs-16_x; + nodejs = pkgs.nodejs-18_x; yarn' = pkgs.yarn.override { inherit nodejs; }; in { devShells.default = pkgs.mkShell { nativeBuildInputs = with pkgs; [ nodejs yarn' python3 pkg-config git rsync jq moreutils quilt bats ]; - buildInputs = with pkgs; (lib.optionals (!stdenv.isDarwin) [ libsecret ] + buildInputs = with pkgs; (lib.optionals (!stdenv.isDarwin) [ libsecret libkrb5 ] ++ (with xorg; [ libX11 libxkbfile ]) ++ lib.optionals stdenv.isDarwin (with pkgs.darwin.apple_sdk.frameworks; [ AppKit Cocoa CoreServices Security xcbuild diff --git a/install.sh b/install.sh index d9bed9a4b..5cbd8222b 100755 --- a/install.sh +++ b/install.sh @@ -441,7 +441,7 @@ install_npm() { return fi echoerr "Please install npm to install code-server!" - echoerr "You will need at least node v12 and a few C dependencies." + echoerr "You will need at least node v18 and a few C dependencies." echoerr "See the docs https://coder.com/docs/code-server/latest/install#npm" exit 1 diff --git a/lib/vscode b/lib/vscode index 2ccd690cb..abd2f3db4 160000 --- a/lib/vscode +++ b/lib/vscode @@ -1 +1 @@ -Subproject commit 2ccd690cbff1569e4a83d7c43d45101f817401dc +Subproject commit abd2f3db4bdb28f9e95536dfa84d8479f1eb312d diff --git a/package.json b/package.json index 1db50e43c..9649c1e2c 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@types/express": "^4.17.8", "@types/http-proxy": "^1.17.4", "@types/js-yaml": "^4.0.0", - "@types/node": "^16.0.0", + "@types/node": "^18.0.0", "@types/pem": "^1.9.5", "@types/proxy-from-env": "^1.0.1", "@types/safe-compare": "^1.1.0", @@ -82,7 +82,7 @@ "nanoid": "^3.1.31", "minimist": "npm:minimist-lite@2.2.1", "glob-parent": "^6.0.1", - "@types/node": "^16.0.0", + "@types/node": "^18.0.0", "qs": "^6.7.3" }, "dependencies": { @@ -120,7 +120,7 @@ "remote-development" ], "engines": { - "node": "16" + "node": "18" }, "jest": { "transform": { diff --git a/patches/base-path.diff b/patches/base-path.diff index d997798cb..4ed778243 100644 --- a/patches/base-path.diff +++ b/patches/base-path.diff @@ -111,7 +111,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -268,16 +268,15 @@ export class WebClientServer { +@@ -269,16 +269,15 @@ export class WebClientServer { return void res.end(); } @@ -133,7 +133,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts ); if (!remoteAuthority) { return serveError(req, res, 400, `Bad request.`); -@@ -304,8 +303,12 @@ export class WebClientServer { +@@ -305,8 +304,12 @@ export class WebClientServer { scopes: [['user:email'], ['repo']] } : undefined; @@ -146,7 +146,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts embedderIdentifier: 'server-distro', extensionsGallery: this._webExtensionResourceUrlTemplate ? { ...this._productService.extensionsGallery, -@@ -340,8 +343,10 @@ export class WebClientServer { +@@ -341,8 +344,10 @@ export class WebClientServer { const values: { [key: string]: string } = { WORKBENCH_WEB_CONFIGURATION: asJSON(workbenchWebConfiguration), WORKBENCH_AUTH_SESSION: authSessionInfo ? asJSON(authSessionInfo) : '', @@ -159,7 +159,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts }; if (useTestResolver) { -@@ -366,7 +371,7 @@ export class WebClientServer { +@@ -367,7 +372,7 @@ export class WebClientServer { 'default-src \'self\';', 'img-src \'self\' https: data: blob:;', 'media-src \'self\';', @@ -168,7 +168,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts 'child-src \'self\';', `frame-src 'self' https://*.vscode-cdn.net data:;`, 'worker-src \'self\' data: blob:;', -@@ -439,3 +444,70 @@ export class WebClientServer { +@@ -440,3 +445,70 @@ export class WebClientServer { return void res.end(data); } } @@ -255,23 +255,25 @@ Index: code-server/lib/vscode/src/vs/code/browser/workbench/workbench.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/code/browser/workbench/workbench.ts +++ code-server/lib/vscode/src/vs/code/browser/workbench/workbench.ts -@@ -484,6 +484,7 @@ function doCreateUri(path: string, query - }); +@@ -304,7 +304,8 @@ class LocalStorageURLCallbackProvider ex + this.startListening(); + } + +- return URI.parse(window.location.href).with({ path: this._callbackRoute, query: queryParams.join('&') }); ++ const path = (window.location.pathname + "/" + this._callbackRoute).replace(/\/\/+/g, "/"); ++ return URI.parse(window.location.href).with({ path: path, query: queryParams.join('&') }); } -+ path = (window.location.pathname + "/" + path).replace(/\/\/+/g, "/") - return URI.parse(window.location.href).with({ path, query }); - } - -@@ -495,7 +496,7 @@ function doCreateUri(path: string, query + private startListening(): void { +@@ -569,7 +570,7 @@ function readCookie(name: string): strin if (!configElement || !configElementAttribute) { throw new Error('Missing web configuration element'); } - const config: IWorkbenchConstructionOptions & { folderUri?: UriComponents; workspaceUri?: UriComponents; callbackRoute: string } = JSON.parse(configElementAttribute); + const config: IWorkbenchConstructionOptions & { folderUri?: UriComponents; workspaceUri?: UriComponents; callbackRoute: string } = { ...JSON.parse(configElementAttribute), remoteAuthority: location.host } - - // Create workbench - create(document.body, { + const secretStorageKeyPath = readCookie('vscode-secret-key-path'); + const secretStorageCrypto = secretStorageKeyPath && ServerKeyedAESCrypto.supported() + ? new ServerKeyedAESCrypto(secretStorageKeyPath) : new TransparentCrypto(); Index: code-server/lib/vscode/src/vs/platform/extensionResourceLoader/common/extensionResourceLoader.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/platform/extensionResourceLoader/common/extensionResourceLoader.ts diff --git a/patches/cli-window-open.diff b/patches/cli-window-open.diff index 69717d78f..e6d4040ef 100644 --- a/patches/cli-window-open.diff +++ b/patches/cli-window-open.diff @@ -17,7 +17,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/terminal/browser/remoteTe =================================================================== --- code-server.orig/lib/vscode/src/vs/workbench/contrib/terminal/browser/remoteTerminalBackend.ts +++ code-server/lib/vscode/src/vs/workbench/contrib/terminal/browser/remoteTerminalBackend.ts -@@ -103,10 +103,14 @@ class RemoteTerminalBackend extends Base +@@ -104,10 +104,14 @@ class RemoteTerminalBackend extends Base } const reqId = e.reqId; const commandId = e.commandId; diff --git a/patches/disable-builtin-ext-update.diff b/patches/disable-builtin-ext-update.diff index e518de074..575f8d1ed 100644 --- a/patches/disable-builtin-ext-update.diff +++ b/patches/disable-builtin-ext-update.diff @@ -7,7 +7,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/extensions/browser/extens =================================================================== --- code-server.orig/lib/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ code-server/lib/vscode/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts -@@ -243,6 +243,10 @@ export class Extension implements IExten +@@ -244,6 +244,10 @@ export class Extension implements IExten if (this.type === ExtensionType.System && this.productService.quality === 'stable') { return false; } diff --git a/patches/disable-downloads.diff b/patches/disable-downloads.diff index 0514de8a5..10565d899 100644 --- a/patches/disable-downloads.diff +++ b/patches/disable-downloads.diff @@ -58,7 +58,7 @@ Index: code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/serverEnvironmentService.ts +++ code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts -@@ -14,6 +14,7 @@ export const serverOptions: OptionDescri +@@ -16,6 +16,7 @@ export const serverOptions: OptionDescri /* ----- code-server ----- */ 'disable-update-check': { type: 'boolean' }, 'auth': { type: 'string' }, @@ -66,7 +66,7 @@ Index: code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts /* ----- server setup ----- */ -@@ -95,6 +96,7 @@ export interface ServerParsedArgs { +@@ -97,6 +98,7 @@ export interface ServerParsedArgs { /* ----- code-server ----- */ 'disable-update-check'?: boolean; 'auth'?: string @@ -78,7 +78,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -331,6 +331,7 @@ export class WebClientServer { +@@ -332,6 +332,7 @@ export class WebClientServer { remoteAuthority, webviewEndpoint: vscodeBase + this._staticRoute + '/out/vs/workbench/contrib/webview/browser/pre', userDataPath: this._environmentService.userDataPath, @@ -94,9 +94,9 @@ Index: code-server/lib/vscode/src/vs/workbench/browser/contextkeys.ts import { Disposable } from 'vs/base/common/lifecycle'; import { IContextKeyService, IContextKey, setConstant as setConstantContextKey } from 'vs/platform/contextkey/common/contextkey'; import { InputFocusedContext, IsMacContext, IsLinuxContext, IsWindowsContext, IsWebContext, IsMacNativeContext, IsDevelopmentContext, IsIOSContext, ProductQualityContext, IsMobileContext } from 'vs/platform/contextkey/common/contextkeys'; --import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, ActiveEditorCanToggleReadonlyContext } from 'vs/workbench/common/contextkeys'; -+import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, IsEnabledFileDownloads, ActiveEditorCanToggleReadonlyContext } from 'vs/workbench/common/contextkeys'; - import { TEXT_DIFF_EDITOR_ID, EditorInputCapabilities, SIDE_BY_SIDE_EDITOR_ID, DEFAULT_EDITOR_ASSOCIATION, EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor'; +-import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, ActiveEditorCanToggleReadonlyContext, applyAvailableEditorIds } from 'vs/workbench/common/contextkeys'; ++import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, IsEnabledFileDownloads, ActiveEditorCanToggleReadonlyContext, applyAvailableEditorIds } from 'vs/workbench/common/contextkeys'; + import { TEXT_DIFF_EDITOR_ID, EditorInputCapabilities, SIDE_BY_SIDE_EDITOR_ID, EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor'; import { trackFocus, addDisposableListener, EventType } from 'vs/base/browser/dom'; import { preferredSideBySideGroupDirection, GroupDirection, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -105,7 +105,7 @@ Index: code-server/lib/vscode/src/vs/workbench/browser/contextkeys.ts import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { WorkbenchState, IWorkspaceContextService, isTemporaryWorkspace } from 'vs/platform/workspace/common/workspace'; import { IWorkbenchLayoutService, Parts, positionToString } from 'vs/workbench/services/layout/browser/layoutService'; -@@ -80,7 +80,7 @@ export class WorkbenchContextKeysHandler +@@ -79,7 +79,7 @@ export class WorkbenchContextKeysHandler @IContextKeyService private readonly contextKeyService: IContextKeyService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @IConfigurationService private readonly configurationService: IConfigurationService, @@ -114,7 +114,7 @@ Index: code-server/lib/vscode/src/vs/workbench/browser/contextkeys.ts @IProductService private readonly productService: IProductService, @IEditorService private readonly editorService: IEditorService, @IEditorResolverService private readonly editorResolverService: IEditorResolverService, -@@ -210,6 +210,9 @@ export class WorkbenchContextKeysHandler +@@ -209,6 +209,9 @@ export class WorkbenchContextKeysHandler this.auxiliaryBarVisibleContext = AuxiliaryBarVisibleContext.bindTo(this.contextKeyService); this.auxiliaryBarVisibleContext.set(this.layoutService.isVisible(Parts.AUXILIARYBAR_PART)); @@ -165,7 +165,7 @@ Index: code-server/lib/vscode/src/vs/workbench/common/contextkeys.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/workbench/common/contextkeys.ts +++ code-server/lib/vscode/src/vs/workbench/common/contextkeys.ts -@@ -35,6 +35,8 @@ export const HasWebFileSystemAccess = ne +@@ -38,6 +38,8 @@ export const HasWebFileSystemAccess = ne export const EmbedderIdentifierContext = new RawContextKey('embedderIdentifier', undefined, localize('embedderIdentifier', 'The identifier of the embedder according to the product service, if one is defined')); diff --git a/patches/display-language.diff b/patches/display-language.diff index a2e5d08e3..f57c40b87 100644 --- a/patches/display-language.diff +++ b/patches/display-language.diff @@ -21,7 +21,7 @@ Index: code-server/lib/vscode/src/vs/server/node/serverServices.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/serverServices.ts +++ code-server/lib/vscode/src/vs/server/node/serverServices.ts -@@ -230,6 +230,9 @@ export async function setupServerService +@@ -231,6 +231,9 @@ export async function setupServerService const channel = new ExtensionManagementChannel(extensionManagementService, (ctx: RemoteAgentConnectionContext) => getUriTransformer(ctx.remoteAuthority)); socketServer.registerChannel('extensions', channel); @@ -89,10 +89,10 @@ Index: code-server/lib/vscode/src/vs/code/browser/workbench/workbench.html -@@ -46,15 +49,26 @@ - // Set up nls if the user is not using the default language (English) - const nlsConfig = {}; - const locale = window.localStorage.getItem('vscode.nls.locale') || navigator.language; +@@ -48,15 +51,26 @@ + // Normalize locale to lowercase because translationServiceUrl is case-sensitive. + // ref: https://github.com/microsoft/vscode/issues/187795 + const locale = window.localStorage.getItem('vscode.nls.locale') || navigator.language.toLowerCase(); - if (!locale.startsWith('en')) { - nlsConfig['vs/nls'] = { - availableLanguages: { @@ -203,7 +203,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -26,6 +26,7 @@ import { URI } from 'vs/base/common/uri' +@@ -27,6 +27,7 @@ import { URI } from 'vs/base/common/uri' import { streamToBuffer } from 'vs/base/common/buffer'; import { IProductConfiguration } from 'vs/base/common/product'; import { isString } from 'vs/base/common/types'; @@ -211,7 +211,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts import { CharCode } from 'vs/base/common/charCode'; import { getRemoteServerRootPath } from 'vs/platform/remote/common/remoteHosts'; import { IExtensionManifest } from 'vs/platform/extensions/common/extensions'; -@@ -343,6 +344,8 @@ export class WebClientServer { +@@ -344,6 +345,8 @@ export class WebClientServer { callbackRoute: this._callbackRoute }; @@ -220,7 +220,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts const nlsBaseUrl = this._productService.extensionsGallery?.nlsBaseUrl; const values: { [key: string]: string } = { WORKBENCH_WEB_CONFIGURATION: asJSON(workbenchWebConfiguration), -@@ -351,6 +354,7 @@ export class WebClientServer { +@@ -352,6 +355,7 @@ export class WebClientServer { WORKBENCH_NLS_BASE_URL: vscodeBase + (nlsBaseUrl ? `${nlsBaseUrl}${!nlsBaseUrl.endsWith('/') ? '/' : ''}${this._productService.commit}/${this._productService.version}/` : ''), BASE: base, VS_BASE: vscodeBase, @@ -232,7 +232,7 @@ Index: code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/serverEnvironmentService.ts +++ code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts -@@ -15,6 +15,7 @@ export const serverOptions: OptionDescri +@@ -17,6 +17,7 @@ export const serverOptions: OptionDescri 'disable-update-check': { type: 'boolean' }, 'auth': { type: 'string' }, 'disable-file-downloads': { type: 'boolean' }, @@ -240,7 +240,7 @@ Index: code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts /* ----- server setup ----- */ -@@ -97,6 +98,7 @@ export interface ServerParsedArgs { +@@ -99,6 +100,7 @@ export interface ServerParsedArgs { 'disable-update-check'?: boolean; 'auth'?: string 'disable-file-downloads'?: boolean; @@ -339,7 +339,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/extensions/browser/extens =================================================================== --- code-server.orig/lib/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ code-server/lib/vscode/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts -@@ -337,9 +337,6 @@ export class InstallAction extends Exten +@@ -321,9 +321,6 @@ export class InstallAction extends Exten if (this.extension.isBuiltin) { return; } @@ -349,7 +349,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/extensions/browser/extens if (this.extension.state === ExtensionState.Uninstalled && await this.extensionsWorkbenchService.canInstall(this.extension)) { this.enabled = this.options.installPreReleaseVersion ? this.extension.hasPreReleaseVersion : this.extension.hasReleaseVersion; this.updateLabel(); -@@ -607,7 +604,7 @@ export abstract class InstallInOtherServ +@@ -591,7 +588,7 @@ export abstract class InstallInOtherServ } if (isLanguagePackExtension(this.extension.local.manifest)) { @@ -358,7 +358,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/extensions/browser/extens } // Prefers to run on UI -@@ -1695,17 +1692,6 @@ export class SetLanguageAction extends E +@@ -1683,17 +1680,6 @@ export class SetLanguageAction extends E update(): void { this.enabled = false; this.class = SetLanguageAction.DisabledClass; @@ -376,7 +376,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/extensions/browser/extens } override async run(): Promise { -@@ -1722,7 +1708,6 @@ export class ClearLanguageAction extends +@@ -1710,7 +1696,6 @@ export class ClearLanguageAction extends private static readonly DisabledClass = `${ClearLanguageAction.EnabledClass} disabled`; constructor( @@ -384,7 +384,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/extensions/browser/extens @ILocaleService private readonly localeService: ILocaleService, ) { super(ClearLanguageAction.ID, ClearLanguageAction.TITLE.value, ClearLanguageAction.DisabledClass, false); -@@ -1732,17 +1717,6 @@ export class ClearLanguageAction extends +@@ -1720,17 +1705,6 @@ export class ClearLanguageAction extends update(): void { this.enabled = false; this.class = ClearLanguageAction.DisabledClass; diff --git a/patches/getting-started.diff b/patches/getting-started.diff index 8b79e85ca..47e598202 100644 --- a/patches/getting-started.diff +++ b/patches/getting-started.diff @@ -28,7 +28,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/welcomeGettingStarted/bro import { OpenFolderAction, OpenFileFolderAction, OpenFolderViaWorkspaceAction } from 'vs/workbench/browser/actions/workspaceActions'; import { OpenRecentAction } from 'vs/workbench/browser/actions/windowActions'; import { Toggle } from 'vs/base/browser/ui/toggle/toggle'; -@@ -782,6 +782,72 @@ export class GettingStartedPage extends +@@ -783,6 +783,72 @@ export class GettingStartedPage extends $('p.subtitle.description', {}, localize({ key: 'gettingStarted.editingEvolved', comment: ['Shown as subtitle on the Welcome page.'] }, "Editing evolved")) ); @@ -101,7 +101,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/welcomeGettingStarted/bro const leftColumn = $('.categories-column.categories-column-left', {},); const rightColumn = $('.categories-column.categories-column-right', {},); -@@ -831,6 +897,9 @@ export class GettingStartedPage extends +@@ -832,6 +898,9 @@ export class GettingStartedPage extends recentList.setLimit(5); reset(leftColumn, startList.getDomElement(), recentList.getDomElement()); } @@ -181,7 +181,7 @@ Index: code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/serverEnvironmentService.ts +++ code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts -@@ -16,6 +16,7 @@ export const serverOptions: OptionDescri +@@ -18,6 +18,7 @@ export const serverOptions: OptionDescri 'auth': { type: 'string' }, 'disable-file-downloads': { type: 'boolean' }, 'locale': { type: 'string' }, @@ -189,7 +189,7 @@ Index: code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts /* ----- server setup ----- */ -@@ -99,6 +100,7 @@ export interface ServerParsedArgs { +@@ -101,6 +102,7 @@ export interface ServerParsedArgs { 'auth'?: string 'disable-file-downloads'?: boolean; 'locale'?: string @@ -201,7 +201,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -334,6 +334,7 @@ export class WebClientServer { +@@ -335,6 +335,7 @@ export class WebClientServer { webviewEndpoint: vscodeBase + this._staticRoute + '/out/vs/workbench/contrib/webview/browser/pre', userDataPath: this._environmentService.userDataPath, isEnabledFileDownloads: !this._environmentService.args['disable-file-downloads'], @@ -217,12 +217,12 @@ Index: code-server/lib/vscode/src/vs/workbench/browser/contextkeys.ts import { Disposable } from 'vs/base/common/lifecycle'; import { IContextKeyService, IContextKey, setConstant as setConstantContextKey } from 'vs/platform/contextkey/common/contextkey'; import { InputFocusedContext, IsMacContext, IsLinuxContext, IsWindowsContext, IsWebContext, IsMacNativeContext, IsDevelopmentContext, IsIOSContext, ProductQualityContext, IsMobileContext } from 'vs/platform/contextkey/common/contextkeys'; --import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, IsEnabledFileDownloads, ActiveEditorCanToggleReadonlyContext } from 'vs/workbench/common/contextkeys'; -+import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, IsEnabledFileDownloads, IsEnabledCoderGettingStarted, ActiveEditorCanToggleReadonlyContext } from 'vs/workbench/common/contextkeys'; - import { TEXT_DIFF_EDITOR_ID, EditorInputCapabilities, SIDE_BY_SIDE_EDITOR_ID, DEFAULT_EDITOR_ASSOCIATION, EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor'; +-import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, IsEnabledFileDownloads, ActiveEditorCanToggleReadonlyContext, applyAvailableEditorIds } from 'vs/workbench/common/contextkeys'; ++import { SplitEditorsVertically, InEditorZenModeContext, ActiveEditorCanRevertContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, SideBySideEditorActiveContext, AuxiliaryBarVisibleContext, SideBarVisibleContext, PanelAlignmentContext, PanelMaximizedContext, PanelVisibleContext, ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, EmbedderIdentifierContext, EditorTabsVisibleContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorReadonlyContext, EditorAreaVisibleContext, ActiveEditorAvailableEditorIdsContext, DirtyWorkingCopiesContext, EmptyWorkspaceSupportContext, EnterMultiRootWorkspaceSupportContext, HasWebFileSystemAccess, IsFullscreenContext, OpenFolderWorkspaceSupportContext, RemoteNameContext, VirtualWorkspaceContext, WorkbenchStateContext, WorkspaceFolderCountContext, PanelPositionContext, TemporaryWorkspaceContext, IsEnabledFileDownloads, IsEnabledCoderGettingStarted, ActiveEditorCanToggleReadonlyContext, applyAvailableEditorIds } from 'vs/workbench/common/contextkeys'; + import { TEXT_DIFF_EDITOR_ID, EditorInputCapabilities, SIDE_BY_SIDE_EDITOR_ID, EditorResourceAccessor, SideBySideEditor } from 'vs/workbench/common/editor'; import { trackFocus, addDisposableListener, EventType } from 'vs/base/browser/dom'; import { preferredSideBySideGroupDirection, GroupDirection, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; -@@ -212,6 +212,7 @@ export class WorkbenchContextKeysHandler +@@ -211,6 +211,7 @@ export class WorkbenchContextKeysHandler // code-server IsEnabledFileDownloads.bindTo(this.contextKeyService).set(this.environmentService.isEnabledFileDownloads ?? true) @@ -234,7 +234,7 @@ Index: code-server/lib/vscode/src/vs/workbench/common/contextkeys.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/workbench/common/contextkeys.ts +++ code-server/lib/vscode/src/vs/workbench/common/contextkeys.ts -@@ -36,6 +36,7 @@ export const HasWebFileSystemAccess = ne +@@ -39,6 +39,7 @@ export const HasWebFileSystemAccess = ne export const EmbedderIdentifierContext = new RawContextKey('embedderIdentifier', undefined, localize('embedderIdentifier', 'The identifier of the embedder according to the product service, if one is defined')); export const IsEnabledFileDownloads = new RawContextKey('isEnabledFileDownloads', true, true); diff --git a/patches/integration.diff b/patches/integration.diff index cdbffa8fd..868f18f94 100644 --- a/patches/integration.diff +++ b/patches/integration.diff @@ -184,7 +184,7 @@ Index: code-server/lib/vscode/src/vs/workbench/browser/web.main.ts import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IProgressService } from 'vs/platform/progress/common/progress'; import { DelayedLogChannel } from 'vs/workbench/services/output/common/delayedLogChannel'; -@@ -127,6 +128,9 @@ export class BrowserMain extends Disposa +@@ -132,6 +133,9 @@ export class BrowserMain extends Disposa // Startup const instantiationService = workbench.startup(); @@ -264,7 +264,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -305,6 +305,7 @@ export class WebClientServer { +@@ -306,6 +306,7 @@ export class WebClientServer { } : undefined; const productConfiguration = >{ diff --git a/patches/local-storage.diff b/patches/local-storage.diff index 0bef4555d..2a183bb18 100644 --- a/patches/local-storage.diff +++ b/patches/local-storage.diff @@ -20,7 +20,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -326,6 +326,7 @@ export class WebClientServer { +@@ -327,6 +327,7 @@ export class WebClientServer { const workbenchWebConfiguration = { remoteAuthority, webviewEndpoint: vscodeBase + this._staticRoute + '/out/vs/workbench/contrib/webview/browser/pre', diff --git a/patches/logout.diff b/patches/logout.diff index bccad6856..c163e18ad 100644 --- a/patches/logout.diff +++ b/patches/logout.diff @@ -20,7 +20,7 @@ Index: code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/serverEnvironmentService.ts +++ code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts -@@ -13,6 +13,7 @@ import { IEnvironmentService, INativeEnv +@@ -15,6 +15,7 @@ import { URI } from 'vs/base/common/uri' export const serverOptions: OptionDescriptions> = { /* ----- code-server ----- */ 'disable-update-check': { type: 'boolean' }, @@ -28,7 +28,7 @@ Index: code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts /* ----- server setup ----- */ -@@ -93,6 +94,7 @@ export const serverOptions: OptionDescri +@@ -95,6 +96,7 @@ export const serverOptions: OptionDescri export interface ServerParsedArgs { /* ----- code-server ----- */ 'disable-update-check'?: boolean; @@ -40,7 +40,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -310,6 +310,7 @@ export class WebClientServer { +@@ -311,6 +311,7 @@ export class WebClientServer { codeServerVersion: this._productService.codeServerVersion, rootEndpoint: base, updateEndpoint: !this._environmentService.args['disable-update-check'] ? base + '/update/check' : undefined, diff --git a/patches/marketplace.diff b/patches/marketplace.diff index 8b2cfd98f..a82f58ec2 100644 --- a/patches/marketplace.diff +++ b/patches/marketplace.diff @@ -40,7 +40,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -112,7 +112,7 @@ export class WebClientServer { +@@ -113,7 +113,7 @@ export class WebClientServer { const serverRootPath = getRemoteServerRootPath(_productService); this._staticRoute = `${serverRootPath}/static`; this._callbackRoute = `${serverRootPath}/callback`; @@ -49,7 +49,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts } /** -@@ -310,14 +310,7 @@ export class WebClientServer { +@@ -311,14 +311,7 @@ export class WebClientServer { codeServerVersion: this._productService.codeServerVersion, rootEndpoint: base, embedderIdentifier: 'server-distro', diff --git a/patches/proxy-uri.diff b/patches/proxy-uri.diff index 2f9ae9877..21b36f978 100644 --- a/patches/proxy-uri.diff +++ b/patches/proxy-uri.diff @@ -71,7 +71,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -311,6 +311,7 @@ export class WebClientServer { +@@ -312,6 +312,7 @@ export class WebClientServer { rootEndpoint: base, updateEndpoint: !this._environmentService.args['disable-update-check'] ? base + '/update/check' : undefined, logoutEndpoint: this._environmentService.args['auth'] && this._environmentService.args['auth'] !== "none" ? base + '/logout' : undefined, @@ -96,20 +96,18 @@ Index: code-server/lib/vscode/src/vs/code/browser/workbench/workbench.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/code/browser/workbench/workbench.ts +++ code-server/lib/vscode/src/vs/code/browser/workbench/workbench.ts -@@ -21,6 +21,7 @@ import type { ICredentialsProvider } fro - import type { IURLCallbackProvider } from 'vs/workbench/services/url/browser/urlService'; +@@ -19,6 +19,7 @@ import { isFolderToOpen, isWorkspaceToOp import type { IWorkbenchConstructionOptions } from 'vs/workbench/browser/web.api'; + import { AuthenticationSessionInfo } from 'vs/workbench/services/authentication/browser/authenticationService'; import type { IWorkspace, IWorkspaceProvider } from 'vs/workbench/services/host/browser/browserHostService'; +import { extractLocalHostUriMetaDataForPortMapping, TunnelOptions, TunnelCreationOptions } from 'vs/platform/tunnel/common/tunnel'; + import type { IURLCallbackProvider } from 'vs/workbench/services/url/browser/urlService'; + import { create } from 'vs/workbench/workbench.web.main'; - interface ICredential { - service: string; -@@ -505,6 +506,39 @@ function doCreateUri(path: string, query +@@ -582,6 +583,39 @@ function readCookie(name: string): strin settingsSyncOptions: config.settingsSyncOptions ? { enabled: config.settingsSyncOptions.enabled, } : undefined, workspaceProvider: WorkspaceProvider.create(config), urlCallbackProvider: new LocalStorageURLCallbackProvider(config.callbackRoute), -- credentialsProvider: config.remoteAuthority ? undefined /* with a remote, we don't use a local credentials provider */ : new LocalStorageCredentialsProvider() -+ credentialsProvider: config.remoteAuthority ? undefined /* with a remote, we don't use a local credentials provider */ : new LocalStorageCredentialsProvider(), + resolveExternalUri: (uri: URI): Promise => { + let resolvedUri = uri + const localhostMatch = extractLocalHostUriMetaDataForPortMapping(resolvedUri) @@ -142,19 +140,20 @@ Index: code-server/lib/vscode/src/vs/code/browser/workbench/workbench.ts + } + }) + } -+ } - }); - })(); ++ }, + secretStorageProvider: config.remoteAuthority && !secretStorageKeyPath + ? undefined /* with a remote without embedder-preferred storage, store on the remote */ + : new LocalStorageSecretStorageProvider(secretStorageCrypto), Index: code-server/lib/vscode/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts +++ code-server/lib/vscode/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts -@@ -74,7 +74,7 @@ export class ForwardedPortsView extends +@@ -76,7 +76,7 @@ export class ForwardedPortsView extends this.contextKeyListener = undefined; } - const viewEnabled: boolean = !!forwardedPortsViewEnabled.getValue(this.contextKeyService); + const viewEnabled: boolean = true; - if (this.environmentService.remoteAuthority && viewEnabled) { + if (viewEnabled) { const viewContainer = await this.getViewContainer(); diff --git a/patches/safari.diff b/patches/safari.diff new file mode 100644 index 000000000..5feb7bc78 --- /dev/null +++ b/patches/safari.diff @@ -0,0 +1,68 @@ +Revert back to es2020 + +es2022 outputs static blocks when using static properties that are not +compatible with Safari, or at least not older versions of Safari. + +Index: code-server/lib/vscode/src/tsconfig.base.json +=================================================================== +--- code-server.orig/lib/vscode/src/tsconfig.base.json ++++ code-server/lib/vscode/src/tsconfig.base.json +@@ -17,9 +17,30 @@ + "./vs/*" + ] + }, +- "target": "es2022", +- "useDefineForClassFields": false, ++ "target": "es2020", + "lib": [ ++ "ES2016", ++ "ES2017.Object", ++ "ES2017.String", ++ "ES2017.Intl", ++ "ES2017.TypedArrays", ++ "ES2018.AsyncIterable", ++ "ES2018.AsyncGenerator", ++ "ES2018.Promise", ++ "ES2018.Regexp", ++ "ES2018.Intl", ++ "ES2019.Array", ++ "ES2019.Object", ++ "ES2019.String", ++ "ES2019.Symbol", ++ "ES2020.BigInt", ++ "ES2020.Promise", ++ "ES2020.String", ++ "ES2020.Symbol.WellKnown", ++ "ES2020.Intl", ++ "ES2021.Promise", ++ "ES2021.String", ++ "ES2021.WeakRef", + "ES2022", + "DOM", + "DOM.Iterable", +Index: code-server/lib/vscode/build/lib/tsb/transpiler.js +=================================================================== +--- code-server.orig/lib/vscode/build/lib/tsb/transpiler.js ++++ code-server/lib/vscode/build/lib/tsb/transpiler.js +@@ -293,7 +293,7 @@ class SwcTranspiler { + tsx: false, + decorators: true + }, +- target: 'es2022', ++ target: 'es2020', + loose: false, + minify: { + compress: false, +Index: code-server/lib/vscode/build/lib/tsb/transpiler.ts +=================================================================== +--- code-server.orig/lib/vscode/build/lib/tsb/transpiler.ts ++++ code-server/lib/vscode/build/lib/tsb/transpiler.ts +@@ -376,7 +376,7 @@ export class SwcTranspiler implements IT + tsx: false, + decorators: true + }, +- target: 'es2022', ++ target: 'es2020', + loose: false, + minify: { + compress: false, diff --git a/patches/series b/patches/series index 1b11c07a1..dba2e20a3 100644 --- a/patches/series +++ b/patches/series @@ -19,3 +19,4 @@ telemetry.diff display-language.diff cli-window-open.diff getting-started.diff +safari.diff diff --git a/patches/service-worker.diff b/patches/service-worker.diff index fa20acc1c..2da74097d 100644 --- a/patches/service-worker.diff +++ b/patches/service-worker.diff @@ -54,7 +54,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -312,6 +312,10 @@ export class WebClientServer { +@@ -313,6 +313,10 @@ export class WebClientServer { updateEndpoint: !this._environmentService.args['disable-update-check'] ? base + '/update/check' : undefined, logoutEndpoint: this._environmentService.args['auth'] && this._environmentService.args['auth'] !== "none" ? base + '/logout' : undefined, proxyEndpointTemplate: process.env.VSCODE_PROXY_URI ?? base + '/proxy/{{port}}/', diff --git a/patches/sourcemaps.diff b/patches/sourcemaps.diff index d5089a925..be9e4c67d 100644 --- a/patches/sourcemaps.diff +++ b/patches/sourcemaps.diff @@ -10,7 +10,7 @@ Index: code-server/lib/vscode/build/gulpfile.reh.js =================================================================== --- code-server.orig/lib/vscode/build/gulpfile.reh.js +++ code-server/lib/vscode/build/gulpfile.reh.js -@@ -242,8 +242,7 @@ function packageTask(type, platform, arc +@@ -238,8 +238,7 @@ function packageTask(type, platform, arc const src = gulp.src(sourceFolderName + '/**', { base: '.' }) .pipe(rename(function (path) { path.dirname = path.dirname.replace(new RegExp('^' + sourceFolderName), 'out'); })) @@ -20,7 +20,7 @@ Index: code-server/lib/vscode/build/gulpfile.reh.js const workspaceExtensionPoints = ['debuggers', 'jsonValidation']; const isUIExtension = (manifest) => { -@@ -282,9 +281,9 @@ function packageTask(type, platform, arc +@@ -278,9 +277,9 @@ function packageTask(type, platform, arc .map(name => `.build/extensions/${name}/**`); const extensions = gulp.src(extensionPaths, { base: '.build', dot: true }); @@ -32,7 +32,7 @@ Index: code-server/lib/vscode/build/gulpfile.reh.js let version = packageJson.version; const quality = product.quality; -@@ -431,7 +430,7 @@ function tweakProductForServerWeb(produc +@@ -427,7 +426,7 @@ function tweakProductForServerWeb(produc const minifyTask = task.define(`minify-vscode-${type}`, task.series( optimizeTask, util.rimraf(`out-vscode-${type}-min`), diff --git a/patches/telemetry.diff b/patches/telemetry.diff index 57dbff0e8..4d54482fc 100644 --- a/patches/telemetry.diff +++ b/patches/telemetry.diff @@ -20,22 +20,18 @@ Index: code-server/lib/vscode/src/vs/server/node/serverServices.ts import { NullPolicyService } from 'vs/platform/policy/common/policy'; import { OneDataSystemAppender } from 'vs/platform/telemetry/node/1dsAppender'; import { LoggerService } from 'vs/platform/log/node/loggerService'; -@@ -149,10 +150,13 @@ export async function setupServerService +@@ -150,7 +151,10 @@ export async function setupServerService let oneDsAppender: ITelemetryAppender = NullAppender; const isInternal = isInternalTelemetry(productService, configurationService); if (supportsTelemetry(productService, environmentService)) { - if (productService.aiConfig && productService.aiConfig.ariaKey) { + const telemetryEndpoint = process.env.CS_TELEMETRY_URL || "https://v1.telemetry.coder.com/track"; + if (telemetryEndpoint) { -+ oneDsAppender = new OneDataSystemAppender(false, eventPrefix, null, () => new TelemetryClient(telemetryEndpoint)); ++ oneDsAppender = new OneDataSystemAppender(requestService, false, eventPrefix, null, () => new TelemetryClient(telemetryEndpoint)); + } else if (productService.aiConfig && productService.aiConfig.ariaKey) { - oneDsAppender = new OneDataSystemAppender(isInternal, eventPrefix, null, productService.aiConfig.ariaKey); -- disposables.add(toDisposable(() => oneDsAppender?.flush())); // Ensure the AI appender is disposed so that it flushes remaining data + oneDsAppender = new OneDataSystemAppender(requestService, isInternal, eventPrefix, null, productService.aiConfig.ariaKey); + disposables.add(toDisposable(() => oneDsAppender?.flush())); // Ensure the AI appender is disposed so that it flushes remaining data } -+ disposables.add(toDisposable(() => oneDsAppender?.flush())); // Ensure the AI appender is disposed so that it flushes remaining data - - const config: ITelemetryServiceConfig = { - appenders: [oneDsAppender], Index: code-server/lib/vscode/src/vs/server/node/telemetryClient.ts =================================================================== --- /dev/null @@ -94,7 +90,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -316,6 +316,7 @@ export class WebClientServer { +@@ -317,6 +317,7 @@ export class WebClientServer { scope: vscodeBase + '/', path: base + '/_static/out/browser/serviceWorker.js', }, diff --git a/patches/update-check.diff b/patches/update-check.diff index 14ab35a22..7ecdfade9 100644 --- a/patches/update-check.diff +++ b/patches/update-check.diff @@ -105,7 +105,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -309,6 +309,7 @@ export class WebClientServer { +@@ -310,6 +310,7 @@ export class WebClientServer { const productConfiguration = >{ codeServerVersion: this._productService.codeServerVersion, rootEndpoint: base, @@ -117,8 +117,8 @@ Index: code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/serverEnvironmentService.ts +++ code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts -@@ -11,6 +11,8 @@ import { refineServiceDecorator } from ' - import { IEnvironmentService, INativeEnvironmentService } from 'vs/platform/environment/common/environment'; +@@ -13,6 +13,8 @@ import { memoize } from 'vs/base/common/ + import { URI } from 'vs/base/common/uri'; export const serverOptions: OptionDescriptions> = { + /* ----- code-server ----- */ @@ -126,7 +126,7 @@ Index: code-server/lib/vscode/src/vs/server/node/serverEnvironmentService.ts /* ----- server setup ----- */ -@@ -89,6 +91,8 @@ export const serverOptions: OptionDescri +@@ -91,6 +93,8 @@ export const serverOptions: OptionDescri }; export interface ServerParsedArgs { diff --git a/patches/webview.diff b/patches/webview.diff index c39f56901..a14c1af70 100644 --- a/patches/webview.diff +++ b/patches/webview.diff @@ -54,7 +54,7 @@ Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts =================================================================== --- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts +++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts -@@ -322,6 +322,7 @@ export class WebClientServer { +@@ -323,6 +323,7 @@ export class WebClientServer { const workbenchWebConfiguration = { remoteAuthority, @@ -70,12 +70,12 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/webview/browser/pre/index -+ content="default-src 'none'; script-src 'sha256-h057XKGlOvyFweE9mchggtfdly92LQuQ9vKfYvNy7us=' 'self'; frame-src 'self'; style-src 'unsafe-inline';"> +- content="default-src 'none'; script-src 'sha256-QA1gXilHYAUFCvp7MpjgcmyBCFzSKV0SpiecMU8aUVc=' 'self'; frame-src 'self'; style-src 'unsafe-inline';"> ++ content="default-src 'none'; script-src 'sha256-5X5RiKYn8NTJVx919WStPrAmsV80rIIBbePhKquPcAQ=' 'self'; frame-src 'self'; style-src 'unsafe-inline';">