From 81c88eb4ad95c0e4048101927016eaec30f6d667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Tue, 26 Oct 2021 16:48:41 +0000 Subject: [PATCH 1/9] code web server initial commit --- .gitpod.Dockerfile | 21 + .gitpod.yml | 28 + README.md | 127 ++-- build/gulpfile.js | 2 + build/lib/compilation.js | 16 +- build/lib/compilation.ts | 15 + package.json | 4 +- product.json | 650 +++++++++++++++++- scripts/sync-helper.js | 221 ++++++ scripts/sync-with-upstream.sh | 89 +++ src/server-main.js | 6 +- src/vs/code/browser/workbench/workbench.ts | 11 +- .../common/extensionsProposedApi.ts | 2 +- 13 files changed, 1106 insertions(+), 86 deletions(-) create mode 100644 .gitpod.Dockerfile create mode 100644 .gitpod.yml create mode 100644 scripts/sync-helper.js create mode 100755 scripts/sync-with-upstream.sh diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile new file mode 100644 index 0000000000000..e98ad04da9ad4 --- /dev/null +++ b/.gitpod.Dockerfile @@ -0,0 +1,21 @@ +FROM gitpod/workspace-full:latest + +USER gitpod + +# We use latest major version of Node.js distributed VS Code. (see about dialog in your local VS Code) +RUN bash -c ". .nvm/nvm.sh \ + && nvm install 16 \ + && nvm use 16 \ + && nvm alias default 16" + +RUN echo "nvm use default &>/dev/null" >> ~/.bashrc.d/51-nvm-fix + +# Install dependencies +RUN sudo apt-get update \ + && sudo apt-get install -y --no-install-recommends \ + xvfb x11vnc fluxbox dbus-x11 x11-utils x11-xserver-utils xdg-utils \ + fbautostart xterm eterm gnome-terminal gnome-keyring seahorse nautilus \ + libx11-dev libxkbfile-dev libsecret-1-dev libnotify4 libnss3 libxss1 \ + libasound2 libgbm1 xfonts-base xfonts-terminus fonts-noto fonts-wqy-microhei \ + fonts-droid-fallback vim-tiny nano libgconf2-dev libgtk-3-dev twm \ + && sudo apt-get clean && sudo rm -rf /var/cache/apt/* && sudo rm -rf /var/lib/apt/lists/* && sudo rm -rf /tmp/* diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 0000000000000..2013d9fa74b70 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,28 @@ +image: + file: .gitpod.Dockerfile +ports: + - port: 9888 + onOpen: open-browser +tasks: + - init: | + yarn + yarn server:init + command: | + gp sync-done init + export NODE_ENV=development + export VSCODE_DEV=1 + yarn gulp watch-init + name: watch app + - command: | + export NODE_ENV=development + export VSCODE_DEV=1 + gp sync-await init + ./scripts/code-server.sh --without-connection-token + name: run app + openMode: split-right +github: + prebuilds: + pullRequestsFromForks: true +vscode: + extensions: + - dbaeumer.vscode-eslint diff --git a/README.md b/README.md index 0c7c6236c42c6..7dab715b166f7 100644 --- a/README.md +++ b/README.md @@ -1,77 +1,106 @@ -# Visual Studio Code - Open Source ("Code - OSS") -[![Feature Requests](https://img.shields.io/github/issues/microsoft/vscode/feature-request.svg)](https://github.com/microsoft/vscode/issues?q=is%3Aopen+is%3Aissue+label%3Afeature-request+sort%3Areactions-%2B1-desc) -[![Bugs](https://img.shields.io/github/issues/microsoft/vscode/bug.svg)](https://github.com/microsoft/vscode/issues?utf8=✓&q=is%3Aissue+is%3Aopen+label%3Abug) -[![Gitter](https://img.shields.io/badge/chat-on%20gitter-yellow.svg)](https://gitter.im/Microsoft/vscode) +# OpenVSCode Server -## The Repository +[![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-908a85?logo=gitpod)](https://gitpod.io/from-referrer) +[![GitHub](https://img.shields.io/github/license/gitpod-io/openvscode-server)](https://github.com/gitpod-io/openvscode-server/blob/main/LICENSE.txt) +[![Discord](https://img.shields.io/discord/816244985187008514)](https://www.gitpod.io/chat) -This repository ("`Code - OSS`") is where we (Microsoft) develop the [Visual Studio Code](https://code.visualstudio.com) product together with the community. Not only do we work on code and issues here, we also publish our [roadmap](https://github.com/microsoft/vscode/wiki/Roadmap), [monthly iteration plans](https://github.com/microsoft/vscode/wiki/Iteration-Plans), and our [endgame plans](https://github.com/microsoft/vscode/wiki/Running-the-Endgame). This source code is available to everyone under the standard [MIT license](https://github.com/microsoft/vscode/blob/main/LICENSE.txt). +## What is this? -## Visual Studio Code +This project provides a version of VS Code that runs a server on a remote machine and allows access through a modern web browser. It's based on the very same architecture used by [Gitpod](https://www.gitpod.io) or [GitHub Codespaces](https://github.com/features/codespaces) at scale. -

- VS Code in action -

+Screenshot 2021-09-02 at 08 39 26 -[Visual Studio Code](https://code.visualstudio.com) is a distribution of the `Code - OSS` repository with Microsoft-specific customizations released under a traditional [Microsoft product license](https://code.visualstudio.com/License/). +## Why? -[Visual Studio Code](https://code.visualstudio.com) combines the simplicity of a code editor with what developers need for their core edit-build-debug cycle. It provides comprehensive code editing, navigation, and understanding support along with lightweight debugging, a rich extensibility model, and lightweight integration with existing tools. +VS Code has traditionally been a desktop IDE built with web technologies. A few years back, people started patching it in order to run it in a remote context and to make it accessible through web browsers. These efforts have been complex and error prone, because many changes had to be made across the large code base of VS Code. -Visual Studio Code is updated monthly with new features and bug fixes. You can download it for Windows, macOS, and Linux on [Visual Studio Code's website](https://code.visualstudio.com/Download). To get the latest releases every day, install the [Insiders build](https://code.visualstudio.com/insiders). +Luckily, in 2019 the VS Code team started to refactor its architecture to support a browser-based working mode. While this architecture has been adopted by Gitpod and GitHub, the important bits have not been open-sourced, until now. As a result, many people in the community still use the old, hard to maintain and error-prone approach. -## Contributing +At Gitpod, we've been asked a lot about how we do it. So we thought we might as well share the minimal set of changes needed so people can rely on the latest version of VS Code, have a straightforward upgrade path and low maintenance effort. + +## Getting started + +### Docker + +- Start the server: +```bash +docker run -it --init -p 3000:3000 -v "$(pwd):/home/workspace:cached" gitpod/openvscode-server +``` +- Visit the URL printed in your terminal. + + +_Note_: Feel free to use the `nightly` tag to test the latest version, i.e. `gitpod/openvscode-server:nightly`. + +#### Custom Environment +- If you want to add dependencies to this Docker image, here is a template to help: + ```Dockerfile + + FROM gitpod/openvscode-server:latest -There are many ways in which you can participate in this project, for example: + USER root # to get permissions to install packages and such + RUN # the installation process for software needed + USER openvscode-server # to restore permissions for the web interface -* [Submit bugs and feature requests](https://github.com/microsoft/vscode/issues), and help us verify as they are checked in -* Review [source code changes](https://github.com/microsoft/vscode/pulls) -* Review the [documentation](https://github.com/microsoft/vscode-docs) and make pull requests for anything from typos to additional and new content + ``` +- For additional possibilities, please consult the `Dockerfile` for OpenVSCode Server at https://github.com/gitpod-io/openvscode-releases/ -If you are interested in fixing issues and contributing directly to the code base, -please see the document [How to Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute), which covers the following: +### Linux -* [How to build and run from source](https://github.com/microsoft/vscode/wiki/How-to-Contribute) -* [The development workflow, including debugging and running tests](https://github.com/microsoft/vscode/wiki/How-to-Contribute#debugging) -* [Coding guidelines](https://github.com/microsoft/vscode/wiki/Coding-Guidelines) -* [Submitting pull requests](https://github.com/microsoft/vscode/wiki/How-to-Contribute#pull-requests) -* [Finding an issue to work on](https://github.com/microsoft/vscode/wiki/How-to-Contribute#where-to-contribute) -* [Contributing to translations](https://aka.ms/vscodeloc) +- [Download the latest release](https://github.com/gitpod-io/openvscode-server/releases/latest) +- Untar and run the server + ```bash + tar -xzf openvscode-server-v${OPENVSCODE_SERVER_VERSION}.tar.gz + cd openvscode-server-v${OPENVSCODE_SERVER_VERSION} + ./bin/openvscode-server # you can add arguments here, use --help to list all of the possible options + ``` -## Feedback + From the possible entrypoint arguments, the most notable ones are + - `--port` - the port number to start the server on, this is 3000 by default + - `--without-connection-token` - used by default in the docker image + - `--connection-token` & `--connection-secret` for securing access to the IDE, you can read more about it in [Securing access to your IDE](#securing-access-to-your-ide). + - `--host` - determines the host the server is listening on. It defaults to `localhost`, so for accessing remotely it's a good idea to add `--host 0.0.0.0` to your launch arguments. -* Ask a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/vscode) -* [Request a new feature](CONTRIBUTING.md) -* Upvote [popular feature requests](https://github.com/microsoft/vscode/issues?q=is%3Aopen+is%3Aissue+label%3Afeature-request+sort%3Areactions-%2B1-desc) -* [File an issue](https://github.com/microsoft/vscode/issues) -* Connect with the extension author community on [GitHub Discussions](https://github.com/microsoft/vscode-discussions/discussions) or [Slack](https://aka.ms/vscode-dev-community) -* Follow [@code](https://twitter.com/code) and let us know what you think! +- Visit the URL printed in your terminal. -See our [wiki](https://github.com/microsoft/vscode/wiki/Feedback-Channels) for a description of each of these channels and information on some other available community-driven channels. +_Note_: You can use [pre-releases](https://github.com/gitpod-io/openvscode-server/releases) to test nightly changes. -## Related Projects +### Securing access to your IDE -Many of the core components and extensions to VS Code live in their own repositories on GitHub. For example, the [node debug adapter](https://github.com/microsoft/vscode-node-debug) and the [mono debug adapter](https://github.com/microsoft/vscode-mono-debug) repositories are separate from each other. For a complete list, please visit the [Related Projects](https://github.com/microsoft/vscode/wiki/Related-Projects) page on our [wiki](https://github.com/microsoft/vscode/wiki). +Since OpenVSCode Server v1.64, you can access the Web UI without authentication (anyone can access the IDE using just the hostname and port), if you need some kind of basic authentication then you can start the server with `--connection-token YOUR_TOKEN`, the provided `YOUR_TOKEN` will be used and the authenticated URL will be displayed in your terminal once you start the server. You can also create a plaintext file with the desired token as its contents and provide it to the server with `--connection-secret YOUR_SECRET_FILE`. -## Bundled Extensions +If you want to use a connection token and are working with OpenVSCode Server via [the Docker image](https://hub.docker.com/r/gitpod/openvscode-server), you will have to edit the `ENTRYPOINT` in [the Dockerfile](https://github.com/gitpod-io/openvscode-releases/blob/eb59ab37e23f8d17532b4af4de37eafaf48037a5/Dockerfile#L64) or modify it with the [`entrypoint` option](https://docs.docker.com/compose/compose-file/compose-file-v3/#entrypoint) when working with `docker-compose`. -VS Code includes a set of built-in extensions located in the [extensions](extensions) folder, including grammars and snippets for many languages. Extensions that provide rich language support (code completion, Go to Definition) for a language have the suffix `language-features`. For example, the `json` extension provides coloring for `JSON` and the `json-language-features` extension provides rich language support for `JSON`. +### Deployment guides -## Development Container +Please refer to [Guides](https://github.com/gitpod-io/openvscode-server/tree/docs/guides) to learn how to deploy OpenVSCode Server to your cloud provider of choice. -This repository includes a Visual Studio Code Dev Containers / GitHub Codespaces development container. +## The scope of this project + +This project only adds minimal bits required to run VS Code in a server scenario. We have no intention of changing VS Code in any way or to add additional features to VS Code itself. Please report feature requests, bug fixes, etc. in the upstream repository. + +> **For any feature requests, bug reports, or contributions that are not specific to running VS Code in a server context, please go to [Visual Studio Code - Open Source "OSS"](https://github.com/microsoft/vscode)** + +## Documentation + +All documentation is available in [the `docs` branch](https://github.com/gitpod-io/openvscode-server/tree/docs) of this project. + +## Supporters + +The project is supported by companies such as [GitLab](https://gitlab.com/), [VMware](https://www.vmware.com/), [Uber](https://www.uber.com/), [SAP](https://www.sap.com/), [Sourcegraph](https://sourcegraph.com/), [RStudio](https://www.rstudio.com/), [SUSE](https://rancher.com/), [Tabnine](https://www.tabnine.com/), [Render](https://render.com/) and [TypeFox](https://www.typefox.io/). + +## Contributing -- For [Dev Containers](https://aka.ms/vscode-remote/download/containers), use the **Dev Containers: Clone Repository in Container Volume...** command which creates a Docker volume for better disk I/O on macOS and Windows. - - If you already have VS Code and Docker installed, you can also click [here](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/microsoft/vscode) to get started. This will cause VS Code to automatically install the Dev Containers extension if needed, clone the source code into a container volume, and spin up a dev container for use. -- For Codespaces, install the [GitHub Codespaces](https://marketplace.visualstudio.com/items?itemName=GitHub.codespaces) extension in VS Code, and use the **Codespaces: Create New Codespace** command. +Thanks for your interest in contributing to the project 🙏. You can start a development environment with the following button: -Docker / the Codespace should have at least **4 Cores and 6 GB of RAM (8 GB recommended)** to run full build. See the [development container README](.devcontainer/README.md) for more information. +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/from-referrer) -## Code of Conduct +To learn about the code structure and other topics related to contributing, please refer to the [development docs](https://github.com/gitpod-io/openvscode-server/blob/docs/development.md). -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. +## Community & Feedback -## License +To learn what others are up to and to provide feedback, please head over to the [Discussions](https://github.com/gitpod-io/openvscode-server/discussions). -Copyright (c) Microsoft Corporation. All rights reserved. +You can also follow us on Twitter [@gitpod](https://twitter.com/gitpod) or come [chat with us](https://www.gitpod.io/chat). -Licensed under the [MIT](LICENSE.txt) license. +## Legal +This project is not affiliated with Microsoft Corporation. diff --git a/build/gulpfile.js b/build/gulpfile.js index e945c06eed45d..d8bc2987d5d75 100644 --- a/build/gulpfile.js +++ b/build/gulpfile.js @@ -34,6 +34,8 @@ gulp.task(compileClientTask); const watchClientTask = task.define('watch-client', task.series(util.rimraf('out'), util.buildWebNodePaths('out'), task.parallel(watchTask('out', false), watchApiProposalNamesTask))); gulp.task(watchClientTask); +gulp.task(task.define('watch-init', require('./lib/compilation').watchTask('out', false))); + // All const _compileTask = task.define('compile', task.parallel(monacoTypecheckTask, compileClientTask, compileExtensionsTask, compileExtensionMediaTask)); gulp.task(_compileTask); diff --git a/build/lib/compilation.js b/build/lib/compilation.js index 63ddeb2eabd3f..5a471a870f6f1 100644 --- a/build/lib/compilation.js +++ b/build/lib/compilation.js @@ -21,6 +21,9 @@ const File = require("vinyl"); const task = require("./task"); const mangleTypeScript_1 = require("./mangleTypeScript"); const watch = require('./watch'); +const packageJson = require('../../package.json'); +const productJson = require('../../product.json'); +const replace = require('gulp-replace'); // --- gulp-tsb: compile and transpile -------------------------------- const reporter = (0, reporter_1.createReporter)(); function getTypeScriptCompilerOptions(src) { @@ -56,8 +59,19 @@ function createCompile(src, build, emitError, transpileOnly) { const isUtf8Test = (f) => /(\/|\\)test(\/|\\).*utf8/.test(f.path); const isRuntimeJs = (f) => f.path.endsWith('.js') && !f.path.includes('fixtures'); const noDeclarationsFilter = util.filter(data => !(/\.d\.ts$/.test(data.path))); + const productJsFilter = util.filter(data => !build && data.path.endsWith('vs/platform/product/common/product.ts')); + const productConfiguration = JSON.stringify({ + ...productJson, + version: `${packageJson.version}-dev`, + nameShort: `${productJson.nameShort} Dev`, + nameLong: `${productJson.nameLong} Dev`, + dataFolderName: `${productJson.dataFolderName}-dev` + }); const input = es.through(); const output = input + .pipe(productJsFilter) + .pipe(replace(/{\s*\/\*BUILD->INSERT_PRODUCT_CONFIGURATION\*\/\s*}/, productConfiguration, { skipBinary: true })) + .pipe(productJsFilter.restore) .pipe(util.$if(isUtf8Test, bom())) // this is required to preserve BOM in test files that loose it otherwise .pipe(util.$if(!build && isRuntimeJs, util.appendOwnPathSourceURL())) .pipe(tsFilter) @@ -281,4 +295,4 @@ exports.watchApiProposalNamesTask = task.define('watch-api-proposal-names', () = .pipe(util.debounce(task)) .pipe(gulp.dest('src')); }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb21waWxhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztnR0FHZ0c7OztBQUVoRyxtQ0FBbUM7QUFDbkMseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsMENBQTBDO0FBQzFDLDZCQUE2QjtBQUM3Qix5Q0FBNEM7QUFDNUMsK0JBQStCO0FBQy9CLHNDQUFzQztBQUN0QywwQ0FBMEM7QUFDMUMseUJBQXlCO0FBQ3pCLGlDQUFrQztBQUNsQyw4QkFBOEI7QUFDOUIsK0JBQStCO0FBQy9CLHlEQUE2QztBQUU3QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7QUFHakMsdUVBQXVFO0FBRXZFLE1BQU0sUUFBUSxHQUFHLElBQUEseUJBQWMsR0FBRSxDQUFDO0FBRWxDLFNBQVMsNEJBQTRCLENBQUMsR0FBVztJQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDckQsTUFBTSxPQUFPLEdBQXVCLEVBQUUsQ0FBQztJQUN2QyxPQUFPLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN4QixPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN6QixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLHNDQUFzQztRQUMvRSxPQUFPLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztLQUMxQjtJQUNELE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQzFCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQzFCLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxPQUFPLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJ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 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb21waWxhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztnR0FHZ0c7OztBQUVoRyxtQ0FBbUM7QUFDbkMseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsMENBQTBDO0FBQzFDLDZCQUE2QjtBQUM3Qix5Q0FBNEM7QUFDNUMsK0JBQStCO0FBQy9CLHNDQUFzQztBQUN0QywwQ0FBMEM7QUFDMUMseUJBQXlCO0FBQ3pCLGlDQUFrQztBQUNsQyw4QkFBOEI7QUFDOUIsK0JBQStCO0FBQy9CLHlEQUE2QztBQUU3QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDakMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDbEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDbEQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBR3hDLHVFQUF1RTtBQUV2RSxNQUFNLFFBQVEsR0FBRyxJQUFBLHlCQUFjLEdBQUUsQ0FBQztBQUVsQyxTQUFTLDRCQUE0QixDQUFDLEdBQVc7SUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sT0FBTyxHQUF1QixFQUFFLENBQUM7SUFDdkMsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDeEIsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDekIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxzQ0FBc0M7UUFDL0UsT0FBTyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7S0FDMUI7SUFDRCxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8s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 \ No newline at end of file diff --git a/build/lib/compilation.ts b/build/lib/compilation.ts index d5cd1966221de..ccfc68f3a1a21 100644 --- a/build/lib/compilation.ts +++ b/build/lib/compilation.ts @@ -20,6 +20,9 @@ import * as task from './task'; import { Mangler } from './mangleTypeScript'; import { RawSourceMap } from 'source-map'; const watch = require('./watch'); +const packageJson = require('../../package.json'); +const productJson = require('../../product.json'); +const replace = require('gulp-replace'); // --- gulp-tsb: compile and transpile -------------------------------- @@ -66,8 +69,20 @@ function createCompile(src: string, build: boolean, emitError: boolean, transpil const isRuntimeJs = (f: File) => f.path.endsWith('.js') && !f.path.includes('fixtures'); const noDeclarationsFilter = util.filter(data => !(/\.d\.ts$/.test(data.path))); + const productJsFilter = util.filter(data => !build && data.path.endsWith('vs/platform/product/common/product.ts')); + const productConfiguration = JSON.stringify({ + ...productJson, + version: `${packageJson.version}-dev`, + nameShort: `${productJson.nameShort} Dev`, + nameLong: `${productJson.nameLong} Dev`, + dataFolderName: `${productJson.dataFolderName}-dev` + }); + const input = es.through(); const output = input + .pipe(productJsFilter) + .pipe(replace(/{\s*\/\*BUILD->INSERT_PRODUCT_CONFIGURATION\*\/\s*}/, productConfiguration, { skipBinary: true })) + .pipe(productJsFilter.restore) .pipe(util.$if(isUtf8Test, bom())) // this is required to preserve BOM in test files that loose it otherwise .pipe(util.$if(!build && isRuntimeJs, util.appendOwnPathSourceURL())) .pipe(tsFilter) diff --git a/package.json b/package.json index 0241a3e6e969a..37046abcf59d8 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,9 @@ "hygiene": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js hygiene", "core-ci": "node --max_old_space_size=8095 ./node_modules/gulp/bin/gulp.js core-ci", "extensions-ci": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js extensions-ci", - "perf": "node scripts/code-perf.js" + "perf": "node scripts/code-perf.js", + "server:init": "yarn --cwd ./build compile && yarn compile && yarn download-builtin-extensions", + "server:smoketest": "yarn --cwd ./test/smoke compile && yarn smoketest-no-compile --web --verbose --headless --electronArgs=\"--disable-dev-shm-usage --use-gl=swiftshader\"" }, "dependencies": { "@microsoft/1ds-core-js": "^3.2.2", diff --git a/product.json b/product.json index f801597290e45..526495cb4007f 100644 --- a/product.json +++ b/product.json @@ -1,37 +1,613 @@ { - "nameShort": "Code - OSS", - "nameLong": "Code - OSS", - "applicationName": "code-oss", - "dataFolderName": ".vscode-oss", - "win32MutexName": "vscodeoss", - "licenseName": "MIT", - "licenseUrl": "https://github.com/microsoft/vscode/blob/main/LICENSE.txt", - "serverLicenseUrl": "https://github.com/microsoft/vscode/blob/main/LICENSE.txt", - "serverGreeting": [], - "serverLicense": [], - "serverLicensePrompt": "", - "serverApplicationName": "code-server-oss", - "serverDataFolderName": ".vscode-server-oss", - "tunnelApplicationName": "code-tunnel-oss", - "win32DirName": "Microsoft Code OSS", - "win32NameVersion": "Microsoft Code OSS", - "win32RegValueName": "CodeOSS", - "win32AppId": "{{E34003BB-9E10-4501-8C11-BE3FAA83F23F}", - "win32x64AppId": "{{D77B7E06-80BA-4137-BCF4-654B95CCEBC5}", - "win32arm64AppId": "{{D1ACE434-89C5-48D1-88D3-E2991DF85475}", - "win32UserAppId": "{{C6065F05-9603-4FC4-8101-B9781A25D88E}", - "win32x64UserAppId": "{{CC6B787D-37A0-49E8-AE24-8559A032BE0C}", - "win32arm64UserAppId": "{{3AEBF0C8-F733-4AD4-BADE-FDB816D53D7B}", - "win32AppUserModelId": "Microsoft.CodeOSS", - "win32ShellNameShort": "C&ode - OSS", - "win32TunnelServiceMutex": "vscodeoss-tunnelservice", - "win32TunnelMutex": "vscodeoss-tunnel", - "darwinBundleIdentifier": "com.visualstudio.code.oss", - "linuxIconName": "code-oss", + "nameShort": "OpenVSCode Server", + "nameLong": "OpenVSCode Server", + "applicationName": "openvscode-server", + "dataFolderName": ".openvscode-server", + "win32MutexName": "openvscodeserver", + "licenseName": "MIT", + "licenseUrl": "https://github.com/gitpod-io/openvscode-server/blob/main/LICENSE.txt", + "serverLicenseUrl": "https://github.com/gitpod-io/openvscode-server/blob/main/LICENSE.txt", + "serverGreeting": [], + "serverLicense": [], + "serverLicensePrompt": "", + "serverApplicationName": "openvscode-server", + "serverDataFolderName": ".openvscode-server", + "tunnelApplicationName": "openvscode-server-tunnel", + "win32DirName": "OpenVSCode Server", + "win32NameVersion": "OpenVSCode Server", + "win32RegValueName": "OpenVSCodeServer", + "win32AppId": "{{E34003BB-9E10-4501-8C11-BE3FAA83F23F}", + "win32x64AppId": "{{D77B7E06-80BA-4137-BCF4-654B95CCEBC5}", + "win32arm64AppId": "{{D1ACE434-89C5-48D1-88D3-E2991DF85475}", + "win32UserAppId": "{{C6065F05-9603-4FC4-8101-B9781A25D88E}", + "win32x64UserAppId": "{{CC6B787D-37A0-49E8-AE24-8559A032BE0C}", + "win32arm64UserAppId": "{{3AEBF0C8-F733-4AD4-BADE-FDB816D53D7B}", + "win32AppUserModelId": "OpenVSCode Server", + "win32ShellNameShort": "OpenVSC&ode Server", + "win32TunnelServiceMutex": "openvscode.server-tunnelservice", + "win32TunnelMutex": "openvscode.server-tunnel", + "darwinBundleIdentifier": "openvscode.server", + "linuxIconName": "openvscode.server", "licenseFileName": "LICENSE.txt", - "reportIssueUrl": "https://github.com/microsoft/vscode/issues/new", - "urlProtocol": "code-oss", + "twitterUrl": "https://twitter.com/gitpod", + "reportIssueUrl": "https://github.com/gitpod-io/openvscode-server/issues/new", + "requestFeatureUrl": "https://github.com/gitpod-io/openvscode-server/issues", + "reportMarketplaceIssueUrl": "https://github.com/eclipse/openvsx/issues", + "sendASmile": { + "reportIssueUrl": "https://github.com/gitpod-io/openvscode-server/issues/new", + "requestFeatureUrl": "https://github.com/gitpod-io/openvscode-server/issues" + }, + "urlProtocol": "openvscode-server", + "embedderIdentifier": "openvscode-server", "webviewContentExternalBaseUrlTemplate": "https://{{uuid}}.vscode-cdn.net/insider/ef65ac1ba57f57f2a3961bfe94aa20481caca4c6/out/vs/workbench/contrib/webview/browser/pre/", + "extensionTips": { + "muhammad-sammy.csharp": "{**/*.cs,**/project.json,**/global.json,**/*.csproj,**/*.cshtml,**/*.sln,**/appsettings.json}", + "firefox-devtools.vscode-firefox-debug": "{**/*.ts,**/*.tsx,**/*.js,**/*.jsx,**/*.es6,**/.babelrc}", + "ms-edgedevtools.vscode-edge-devtools": "{**/*.ts,**/*.tsx,**/*.js,**/*.css,**/*.html}", + "golang.Go": "**/*.go", + "ms-vscode.PowerShell": "{**/*.ps1,**/*.psd1,**/*.psm1,**/*.ps.config,**/*.ps1.config}", + "Ionide.Ionide-fsharp": "{**/*.fsx,**/*.fsi,**/*.fs,**/*.ml,**/*.mli}", + "dbaeumer.vscode-eslint": "{**/*.js,**/*.jsx,**/*.es6,**/.eslintrc.*,**/.eslintrc,**/.babelrc,**/jsconfig.json}", + "ms-vscode.vscode-typescript-tslint-plugin": "{**/tslint.json}", + "bmewburn.vscode-intelephense-client": "{**/*.php,**/php.ini}", + "xdebug.php-debug": "{**/*.php,**/php.ini}", + "rust-lang.rust-analyzer": "{**/*.rs,**/*.rslib}", + "DavidAnson.vscode-markdownlint": "{**/*.md}", + "ms-azuretools.vscode-docker": "{**/dockerfile,**/Dockerfile,**/docker-compose.yml,**/docker-compose.*.yml,**/*.cs,**/project.json,**/global.json,**/*.csproj,**/*.cshtml,**/*.sln,**/appsettings.json,**/*.py,**/*.ipynb,**/*.js,**/*.ts,**/package.json}", + "EditorConfig.EditorConfig": "{**/.editorconfig}", + "HookyQR.beautify": "{**/.jsbeautifyrc}", + "donjayamanne.githistory": "{**/.gitignore,**/.git}", + "felipecaputo.git-project-manager": "{**/.gitignore,**/.git}", + "eamodio.gitlens": "{**/.gitignore,**/.git}", + "rebornix.Ruby": "{**/*.rb,**/*.erb,**/*.reek,**/.fasterer.yml,**/ruby-lint.yml,**/.rubocop.yml}", + "DotJoshJohnson.xml": "{**/*.xml}", + "stylelint.vscode-stylelint": "{**/.stylelintrc,**/stylelint.config.js}", + "ms-mssql.mssql": "{**/*.sql}", + "mtxr.sqltools": "{**/*.sql}", + "ms-vscode.sublime-keybindings": "{**/.sublime-project,**/.sublime-workspace}", + "k--kato.intellij-idea-keybindings": "{**/.idea}", + "christian-kohler.npm-intellisense": "{**/package.json}", + "vue.volar": "{**/*.vue}", + "ms-python.python": "{**/*.py,**/*.ipynb}", + "ms-toolsai.jupyter": "{**/*.ipynb}", + "cake-build.cake-vscode": "{**/build.cake}", + "Angular.ng-template": "{**/.angular-cli.json,**/angular.json,**/*.ng.html,**/*.ng,**/*.ngml}", + "vscjava.vscode-maven": "**/pom.xml", + "HashiCorp.terraform": "**/*.tf", + "vsciot-vscode.vscode-arduino": "**/*.ino", + "ms-kubernetes-tools.vscode-kubernetes-tools": "{**/Chart.yaml}", + "GoogleCloudTools.cloudcode": "{**/skaffold.yaml}", + "Oracle.oracledevtools": "{**/*.sql}", + "ms-vscode.vscode-github-issue-notebooks": "{**/*.github-issues}", + "REditorSupport.r": "**/*.r" + }, + "extensionImportantTips": { + "muhammad-sammy.csharp": { + "name": "C#", + "languages": [ + "csharp" + ], + "pattern": "{**/*.cs,**/global.json,**/*.csproj,**/*.cshtml,**/*.sln}" + }, + "ms-python.python": { + "name": "Python", + "languages": [ + "python" + ], + "pattern": "{**/*.py}" + }, + "golang.Go": { + "name": "Go", + "languages": [ + "go" + ], + "pattern": "**/*.go" + }, + "vscjava.vscode-java-pack": { + "name": "Java", + "languages": [ + "java" + ], + "pattern": "{**/*.java}", + "isExtensionPack": true, + "whenNotInstalled": [ + "ASF.apache-netbeans-java" + ] + }, + "ms-vscode.PowerShell": { + "name": "PowerShell", + "languages": [ + "powershell" + ], + "pattern": "{**/*.ps1,**/*.psd1,**/*.psm1}" + }, + "ms-azuretools.vscode-docker": { + "name": "Docker", + "languages": [ + "dockerfile" + ], + "pattern": "{**/dockerfile,**/Dockerfile,**/docker-compose.yml,**/docker-compose.*.yml}" + }, + "vue.volar": { + "name": "Vetur", + "languages": [ + "vue" + ], + "pattern": "{**/*.vue}" + }, + "ms-vscode.makefile-tools": { + "name": "Makefile Tools", + "languages": [ + "makefile" + ], + "pattern": "{**/makefile,**/Makefile}" + }, + "ms-vscode.cmake-tools": { + "name": "CMake Tools", + "pattern": "{**/CMakeLists.txt}" + }, + "svelte.svelte-vscode": { + "name": "Svelte", + "pattern": "{**/*.svelte}" + }, + "ms-vscode.vscode-github-issue-notebooks": { + "name": "GitHub Issue Notebooks", + "pattern": "{**/*.github-issues}" + }, + "ms-playwright.playwright": { + "name": "Playwright", + "pattern": "{**/*playwright*.config.ts,**/*playwright*.config.js,**/*playwright*.config.mjs}" + }, + "REditorSupport.r": { + "name": "R", + "languages": [ + "r" + ], + "pattern": "{**/*.r}" + } + }, + "keymapExtensionTips": [ + "vscodevim.vim", + "ms-vscode.sublime-keybindings", + "ms-vscode.atom-keybindings", + "ms-vscode.brackets-keybindings", + "ms-vscode.vs-keybindings", + "ms-vscode.notepadplusplus-keybindings", + "k--kato.intellij-idea-keybindings", + "lfs.vscode-emacs-friendly", + "alphabotsec.vscode-eclipse-keybindings", + "alefragnani.delphi-keybindings" + ], + "languageExtensionTips": [ + "ms-python.python", + "muhammad-sammy.csharp", + "ms-toolsai.jupyter", + "vscjava.vscode-java-pack", + "ecmel.vscode-html-css", + "vue.volar", + "bmewburn.vscode-intelephense-client", + "dsznajder.es7-react-js-snippets", + "golang.go", + "ms-vscode.powershell", + "dart-code.dart-code", + "rust-lang.rust-analyzer", + "rebornix.ruby" + ], + "configBasedExtensionTips": { + "git": { + "configPath": ".git/config", + "configName": "Git", + "recommendations": { + "github.vscode-pull-request-github": { + "name": "GitHub Pull Request", + "remotes": [ + "github.com" + ] + }, + "eamodio.gitlens": { + "name": "GitLens" + } + } + }, + "maven": { + "configPath": "pom.xml", + "configName": "Maven", + "recommendations": { + "vscjava.vscode-java-pack": { + "name": "Java", + "important": true, + "isExtensionPack": true, + "whenNotInstalled": [ + "ASF.apache-netbeans-java" + ] + }, + "Pivotal.vscode-boot-dev-pack": { + "name": "Spring Boot Extension Pack", + "isExtensionPack": true + } + } + }, + "gradle": { + "configPath": "build.gradle", + "configName": "Gradle", + "recommendations": { + "vscjava.vscode-java-pack": { + "name": "Java", + "important": true, + "isExtensionPack": true, + "whenNotInstalled": [ + "ASF.apache-netbeans-java" + ] + } + } + }, + "github-pull-request": { + "configPath": ".vscode/.github-pull-request.rec", + "configName": "GitHub", + "configScheme": "vscode-vfs", + "recommendations": { + "github.vscode-pull-request-github": { + "name": "GitHub Pull Request", + "important": true + } + } + } + }, + "extensionKeywords": { + "md": [ + "Markdown" + ], + "js": [ + "JavaScript" + ], + "jsx": [ + "JavaScript" + ], + "es6": [ + "JavaScript" + ], + "html": [ + "Html" + ], + "ts": [ + "TypeScript" + ], + "tsx": [ + "TypeScript" + ], + "css": [ + "CSS" + ], + "scss": [ + "SASS" + ], + "txt": [ + "Text" + ], + "php": [ + "PHP" + ], + "php3": [ + "PHP" + ], + "php4": [ + "PHP" + ], + "ph3": [ + "PHP" + ], + "ph4": [ + "PHP" + ], + "xml": [ + "XML" + ], + "py": [ + "Python" + ], + "pyc": [ + "Python" + ], + "pyd": [ + "Python" + ], + "pyo": [ + "Python" + ], + "pyw": [ + "Python" + ], + "pyz": [ + "Python" + ], + "java": [ + "Java" + ], + "class": [ + "Java" + ], + "jar": [ + "Java" + ], + "c": [ + "c", + "objective c", + "objective-c" + ], + "m": [ + "objective c", + "objective-c" + ], + "mm": [ + "objective c", + "objective-c" + ], + "cpp": [ + "cpp", + "c plus plus", + "c", + "c++" + ], + "cc": [ + "cpp", + "c plus plus", + "c", + "c++" + ], + "cxx": [ + "cpp", + "c plus plus", + "c++" + ], + "hh": [ + "cpp", + "c plus plus", + "c++" + ], + "hpp": [ + "cpp", + "c++" + ], + "h": [ + "cpp", + "c plus plus", + "c++", + "c", + "objective c", + "objective-c" + ], + "sql": [ + "sql" + ], + "sh": [ + "bash" + ], + "bash": [ + "bash" + ], + "zsh": [ + "bash", + "zshell" + ], + "cs": [ + "c#", + "csharp" + ], + "csproj": [ + "c#", + "csharp" + ], + "sln": [ + "c#", + "csharp" + ], + "go": [ + "go" + ], + "sty": [ + "latex" + ], + "tex": [ + "latex" + ], + "ps": [ + "powershell" + ], + "ps1": [ + "powershell" + ], + "rs": [ + "rust" + ], + "rslib": [ + "rust" + ], + "hs": [ + "haskell" + ], + "lhs": [ + "haskell" + ], + "scm": [ + "scheme" + ], + "ss": [ + "scheme" + ], + "clj": [ + "clojure" + ], + "cljs": [ + "clojure" + ], + "cljc": [ + "clojure" + ], + "edn": [ + "clojure" + ], + "erl": [ + "erlang" + ], + "hrl": [ + "erlang" + ], + "scala": [ + "scala" + ], + "sc": [ + "scala" + ], + "pl": [ + "perl" + ], + "pm": [ + "perl" + ], + "t": [ + "perl" + ], + "pod": [ + "perl" + ], + "groovy": [ + "groovy" + ], + "swift": [ + "swift" + ], + "rb": [ + "ruby" + ], + "rbw": [ + "ruby" + ], + "jl": [ + "julia" + ], + "f": [ + "fortran" + ], + "for": [ + "fortran" + ], + "f90": [ + "fortran" + ], + "f95": [ + "fortran" + ], + "coffee": [ + "CoffeeScript" + ], + "litcoffee": [ + "CoffeeScript" + ], + "yaml": [ + "yaml" + ], + "yml": [ + "yaml" + ], + "dart": [ + "dart" + ], + "json": [ + "json" + ] + }, + "extensionAllowedBadgeProviders": [ + "api.bintray.com", + "api.travis-ci.com", + "api.travis-ci.org", + "app.fossa.io", + "badge.buildkite.com", + "badge.fury.io", + "badge.waffle.io", + "badgen.net", + "badges.frapsoft.com", + "badges.gitter.im", + "badges.greenkeeper.io", + "cdn.travis-ci.com", + "cdn.travis-ci.org", + "ci.appveyor.com", + "circleci.com", + "cla.opensource.microsoft.com", + "codacy.com", + "codeclimate.com", + "codecov.io", + "coveralls.io", + "david-dm.org", + "deepscan.io", + "dev.azure.com", + "docs.rs", + "flat.badgen.net", + "gemnasium.com", + "githost.io", + "gitlab.com", + "godoc.org", + "goreportcard.com", + "img.shields.io", + "isitmaintained.com", + "marketplace.visualstudio.com", + "nodesecurity.io", + "opencollective.com", + "snyk.io", + "travis-ci.com", + "travis-ci.org", + "visualstudio.com", + "vsmarketplacebadge.apphb.com", + "www.bithound.io", + "www.versioneye.com" + ], + "extensionAllowedBadgeProvidersRegex": [ + "^https:\\/\\/github\\.com\\/[^/]+\\/[^/]+\\/(actions\\/)?workflows\\/.*badge\\.svg" + ], + "extensionKind": { + "Shan.code-settings-sync": [ + "ui" + ], + "shalldie.background": [ + "ui" + ], + "techer.open-in-browser": [ + "ui" + ], + "CoenraadS.bracket-pair-colorizer-2": [ + "ui" + ], + "CoenraadS.bracket-pair-colorizer": [ + "ui", + "workspace" + ], + "hiro-sun.vscode-emacs": [ + "ui", + "workspace" + ], + "hnw.vscode-auto-open-markdown-preview": [ + "ui", + "workspace" + ], + "wayou.vscode-todo-highlight": [ + "ui", + "workspace" + ], + "aaron-bond.better-comments": [ + "ui", + "workspace" + ], + "vscodevim.vim": [ + "ui" + ], + "ollyhayes.colmak-vim": [ + "ui" + ] + }, + "extensionPointExtensionKind": { + "typescriptServerPlugins": [ + "workspace" + ] + }, "builtInExtensions": [ { "name": "ms-vscode.js-debug-companion", @@ -78,5 +654,17 @@ "publisherDisplayName": "Microsoft" } } + ], + "extensionsGallery": { + "serviceUrl": "https://open-vsx.org/vscode/gallery", + "itemUrl": "https://open-vsx.org/vscode/item", + "resourceUrlTemplate": "https://open-vsx.org/vscode/unpkg/{publisher}/{name}/{version}/{path}", + "controlUrl": "", + "recommendationsUrl": "", + "nlsBaseUrl": "", + "publisherUrl": "" + }, + "linkProtectionTrustedDomains": [ + "https://open-vsx.org" ] } diff --git a/scripts/sync-helper.js b/scripts/sync-helper.js new file mode 100644 index 0000000000000..9f49f8dfa1575 --- /dev/null +++ b/scripts/sync-helper.js @@ -0,0 +1,221 @@ +/* eslint-disable header/header */ + +const path = require('path'); +const fs = require('fs'); +const https = require('https'); + +const pickKeys = [ + 'extensionTips', + 'extensionImportantTips', + 'keymapExtensionTips', + 'configBasedExtensionTips', + 'extensionKeywords', + 'extensionAllowedBadgeProviders', + 'extensionAllowedBadgeProvidersRegex', + 'extensionAllowedProposedApi', + 'extensionEnabledApiProposals', + 'extensionKind', + 'languageExtensionTips' +]; + +const AllowMissKeys = [ + 'win32SetupExeBasename', + 'darwinCredits', + 'darwinExecutable', + 'downloadUrl', + 'updateUrl', + 'webEndpointUrl', + 'webEndpointUrlTemplate', + 'quality', + 'exeBasedExtensionTips', + 'webExtensionTips', + 'remoteExtensionTips', + 'crashReporter', + 'appCenter', + 'enableTelemetry', + 'aiConfig', + 'msftInternalDomains', + 'sendASmile', + 'documentationUrl', + 'releaseNotesUrl', + 'keyboardShortcutsUrlMac', + 'keyboardShortcutsUrlLinux', + 'keyboardShortcutsUrlWin', + 'introductoryVideosUrl', + 'tipsAndTricksUrl', + 'newsletterSignupUrl', + 'twitterUrl', + 'requestFeatureUrl', + 'reportMarketplaceIssueUrl', + 'privacyStatementUrl', + 'showTelemetryOptOut', + 'npsSurveyUrl', + 'cesSurveyUrl', + 'checksumFailMoreInfoUrl', + 'electronRepository', + 'settingsSearchUrl', + 'surveys', + 'tasConfig', + 'experimentsUrl', + 'extensionSyncedKeys', + 'extensionVirtualWorkspacesSupport', + 'auth', + 'configurationSync.store', + 'commit', + 'date', + 'checksums', + 'settingsSearchBuildId', + 'darwinUniversalAssetId', +]; + +const propiertaryExtension = [ + 'ms-vscode-remote.remote-containers', + 'ms-dotnettools.csharp', + 'ms-vscode.cpptools-extension-pack', + 'ms-azure-devops.azure-pipelines', + 'msazurermtools.azurerm-vscode-tools', + 'ms-azuretools.vscode-bicep', + 'usqlextpublisher.usql-vscode-ext', + 'ms-azuretools.vscode-azureterraform', + 'VisualStudioExptTeam.vscodeintellicode-completions', + 'ms-vsliveshare.vsliveshare', + 'ms-toolsai.vscode-ai-remote', + 'GitHub.codespaces', + 'ms-vscode.azure-repos', + 'ms-vscode.remote-repositories', + 'ms-vscode-remote.remote-wsl', + 'ms-vscode-remote.remote-ssh', + 'ms-vscode.remote-server', + 'GitHub.copilot', + 'GitHub.copilot-nightly', + 'GitHub.remotehub', + 'GitHub.remotehub-insiders', + 'ms-python.vscode-pylance', + 'ms-vscode.azure-sphere-tools-ui', + 'ms-azuretools.vscode-azureappservice', +]; + +const openvsxExtensionMap = { + 'ms-dotnettools.csharp': 'muhammad-sammy.csharp' +}; + +function filterObj(obj, predicate) { + const result = Object.create(null); + for (const [key, value] of Object.entries(obj)) { + if (predicate(key, value)) { + result[key] = value; + } + } + return result; +} + +function renameObjKey(obj, predicate) { + const result = Object.create(null); + for (const [key, value] of Object.entries(obj)) { + const newKey = predicate(key, value) ?? key; + result[newKey] = value; + } + return result; +} + +async function start() { + const localPath = path.join(__dirname, '../product.json'); + const releasePath = path.join(__dirname, '../product-release.json'); + if (!fs.existsSync(releasePath)) { + console.error('product-release.json is not exists, please copy product.json from VSCode Desktop Stable'); + return; + } + + const branchProduct = JSON.parse(await fs.promises.readFile(localPath, { encoding: 'utf8' })); + const releaseProduct = JSON.parse(await fs.promises.readFile(releasePath, { encoding: 'utf8' })); + const tmpProductPath = path.join(__dirname, '../product-tmp.json'); + for (let key of pickKeys) { + let newValue = releaseProduct[key]; + if (Array.isArray(newValue) && newValue.length && typeof newValue[0] === 'string') { + newValue = newValue.map(v => openvsxExtensionMap[v] ?? v).filter(v => !propiertaryExtension.includes(v)); + } else if (typeof newValue === 'object' && newValue !== null) { + newValue = renameObjKey(newValue, k => openvsxExtensionMap[k] ?? k); + newValue = filterObj(newValue, k => !propiertaryExtension.includes(k)); + } + branchProduct[key] = newValue; + } + + await fs.promises.writeFile(tmpProductPath, JSON.stringify(branchProduct, null, '\t')); + + if (keysDiff(branchProduct, releaseProduct)) { + // allow-any-unicode-next-line + console.log('📦 check if you need these keys or not'); + } + await checkProductExtensions(branchProduct); + // allow-any-unicode-next-line + console.log('📦 you can copy product-tmp.json file to product.json file and resolve logs above by yourself'); + // allow-any-unicode-next-line + console.log('✅ done'); +} + +function keysDiff(branch, release) { + const toMap = (ret, e) => { + ret[e] = true; + return ret; + }; + const map1 = Object.keys(branch).reduce(toMap, {}); + const map2 = Object.keys(release).reduce(toMap, {}); + let changed = false; + for (let key in branch) { + if (!!!map2[key]) { + changed = true; + // allow-any-unicode-next-line + console.log(`🟠 Remove key: ${key}`); + } + } + for (let key in release) { + if (!!!map1[key] && !AllowMissKeys.includes(key)) { + changed = true; + // allow-any-unicode-next-line + console.log(`🟠 Add key: ${key}`); + } + } + return changed; +} + +async function checkProductExtensions(product) { + const uniqueExtIds = new Set(); + // Allow extension that downloaded from ms marketplace by users to use proposed api + // uniqueExtIds.push(...product.extensionAllowedProposedApi); + + // Check recommand extension tips + for (let key in product.configBasedExtensionTips) { + Object.keys(product.configBasedExtensionTips[key].recommendations ?? {}).forEach(id => uniqueExtIds.add(id)); + } + Object.keys(product.extensionImportantTips).forEach(id => uniqueExtIds.add(id)); + Object.keys(product.extensionTips).forEach(id => uniqueExtIds.add(id)); + Object.keys(product.extensionEnabledApiProposals).forEach(id => uniqueExtIds.add(id)); + product.keymapExtensionTips.forEach(id => uniqueExtIds.add(id)); + product.languageExtensionTips.forEach(id => uniqueExtIds.add(id)); + + // Check if extensions exists in openvsx + for (let id of uniqueExtIds) { + if (propiertaryExtension.includes(id)) { + continue; + } + + const openvsxUrl = `https://open-vsx.org/api/${id.replace(/\./g, '/')}`; + const ok = await urlExists(openvsxUrl); + if (!ok) { + // allow-any-unicode-next-line + console.error(`🔴 Extension not exists: ${id}`); + } + } +} + +async function urlExists(url) { + return new Promise((resolve, reject) => { + https.get(url, res => { + resolve(res.statusCode === 200); + }).on('error', error => { + reject(error); + }); + }); +} + +start().catch(console.error); diff --git a/scripts/sync-with-upstream.sh b/scripts/sync-with-upstream.sh new file mode 100755 index 0000000000000..4f0fe912064c0 --- /dev/null +++ b/scripts/sync-with-upstream.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +echo "Syncing openvscode-server with upstream" + +upstream_url="https://github.com/microsoft/vscode.git" +upstream_branch=${1:-"upstream/main"} +local_branch=${2:-"main"} +base_commit_msg=${3:-"code web server initial commit"} +only_sync=${4:-"true"} + +exit_script() { + reason=$1 + echo "Update script ended unsucessfully" + echo "Reason: $reason" + exit 1 +} + +if [[ "$OSTYPE" == "darwin"* ]]; then + realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } + ROOT=$(dirname $(dirname $(realpath "$0"))) +else + ROOT=$(dirname $(dirname $(readlink -f $0))) + # --disable-dev-shm-usage --use-gl=swiftshader: when run on docker containers where size of /dev/shm + # partition < 64MB which causes OOM failure for chromium compositor that uses the partition for shared memory + LINUX_EXTRA_ARGS="--disable-dev-shm-usage --use-gl=swiftshader" +fi + +# Checks is there's an upstream remote repository and if not +# set it to $upstream_url +check_upstream() { + git remote -v | grep --quiet upstream + if [[ $? -ne 0 ]]; then + echo "Upstream repository not configured" + echo "Setting upstream URL to ${upstream_url}" + git remote add upstream $upstream_url + fi +} + +# Gets the base commit +get_base_commit() { + local base_commit=$(git log --pretty="%H" --max-count=1 --grep "$base_commit_msg") + if [[ -z $base_commit ]]; then + exit_script "Could not find base commit" + fi + echo $base_commit +} + +# Fetch updates from upstream and rebase +sync() { + echo "Shallow fetching upstream..." + git fetch upstream + git checkout $local_branch + echo "Rebasing $local_branch branch onto $upstream_branch from upstream" + git rebase --onto=$upstream_branch $(get_base_commit)~ $local_branch + if [[ $? -ne 0 ]]; then + echo "There are merge conflicts doing the rebase." + echo "Please resolve them or abort the rebase." + exit_script "Could not rebase succesfully" + fi + echo "$local_branch sucessfully updated" +} + +cd $ROOT + +# Sync +check_upstream +sync + +if [[ "$only_sync" == "true" ]]; then + exit 0 +fi + +# Clean and build +# git clean -dfx +yarn && yarn server:init +if [[ $? -ne 0 ]]; then + exit_script "There are some errors during compilation" +fi + +# Configuration +export NODE_ENV=development +export VSCODE_DEV=1 +export VSCODE_CLI=1 + +# Run smoke tests +yarn smoketest --web --headless --verbose --electronArgs=$LINUX_EXTRA_ARGS +if [[ $? -ne 0 ]]; then + exit_script "Some smoke test are failing" +fi diff --git a/src/server-main.js b/src/server-main.js index 5167527baed2c..f151b1ecc3eeb 100644 --- a/src/server-main.js +++ b/src/server-main.js @@ -175,7 +175,9 @@ function sanitizeStringArg(val) { * then find a free port in that range. Throw error if no * free port available in range. * - * In absence of specified ports, connect to port 8000. + * If only `--port` is provided then connect to that port. + * + * In absence of specified ports, connect to port 3000. * @param {string | undefined} host * @param {string | undefined} strPort * @returns {Promise} @@ -200,7 +202,7 @@ async function parsePort(host, strPort) { process.exit(1); } } - return 8000; + return 3000; } /** diff --git a/src/vs/code/browser/workbench/workbench.ts b/src/vs/code/browser/workbench/workbench.ts index 62a0406d7f59e..e1d00ab80728a 100644 --- a/src/vs/code/browser/workbench/workbench.ts +++ b/src/vs/code/browser/workbench/workbench.ts @@ -495,13 +495,22 @@ function doCreateUri(path: string, queryValues: Map): URI { if (!configElement || !configElementAttribute) { throw new Error('Missing web configuration element'); } - const config: IWorkbenchConstructionOptions & { folderUri?: UriComponents; workspaceUri?: UriComponents; callbackRoute: string } = JSON.parse(configElementAttribute); + const originalConfig: IWorkbenchConstructionOptions & { folderUri?: UriComponents; workspaceUri?: UriComponents; callbackRoute: string } = JSON.parse(configElementAttribute); + const config: IWorkbenchConstructionOptions & { folderUri?: UriComponents; workspaceUri?: UriComponents; callbackRoute: string } = { + remoteAuthority: window.location.host, + developmentOptions: originalConfig.developmentOptions, + settingsSyncOptions: originalConfig.settingsSyncOptions, + folderUri: originalConfig.folderUri, + workspaceUri: originalConfig.workspaceUri, + callbackRoute: originalConfig.callbackRoute + }; // Create workbench create(document.body, { ...config, windowIndicator: config.windowIndicator ?? { label: '$(remote)', tooltip: `${product.nameShort} Web` }, settingsSyncOptions: config.settingsSyncOptions ? { enabled: config.settingsSyncOptions.enabled, } : undefined, + developmentOptions: { ...config.developmentOptions }, 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() diff --git a/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts b/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts index e92c5e0a50ef3..feb3d37a7bc25 100644 --- a/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts +++ b/src/vs/workbench/services/extensions/common/extensionsProposedApi.ts @@ -24,7 +24,7 @@ export class ExtensionsProposedApi { this._envEnabledExtensions = new Set((_environmentService.extensionEnabledProposedApi ?? []).map(id => ExtensionIdentifier.toKey(id))); - this._envEnablesProposedApiForAll = + this._envEnablesProposedApiForAll = true || // always enable proposed API !_environmentService.isBuilt || // always allow proposed API when running out of sources (_environmentService.isExtensionDevelopment && productService.quality !== 'stable') || // do not allow proposed API against stable builds when developing an extension (this._envEnabledExtensions.size === 0 && Array.isArray(_environmentService.extensionEnabledProposedApi)); // always allow proposed API if --enable-proposed-api is provided without extension ID From 4843c1317047e3392949d3316268fd714a115416 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Tron=C3=AD=C4=8Dek?= Date: Thu, 28 Oct 2021 15:58:23 +0000 Subject: [PATCH 2/9] Don't test the Feedback component --- test/smoke/src/areas/statusbar/statusbar.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/smoke/src/areas/statusbar/statusbar.test.ts b/test/smoke/src/areas/statusbar/statusbar.test.ts index d6b7069afd6ff..721ccf3a9476e 100644 --- a/test/smoke/src/areas/statusbar/statusbar.test.ts +++ b/test/smoke/src/areas/statusbar/statusbar.test.ts @@ -16,9 +16,11 @@ export function setup(logger: Logger) { it('verifies presence of all default status bar elements', async function () { const app = this.app as Application; await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.BRANCH_STATUS); - if (app.quality !== Quality.Dev && app.quality !== Quality.OSS) { + /* + if (app.quality !== Quality.Dev) { await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.FEEDBACK_ICON); } + */ await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.SYNC_STATUS); await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.PROBLEMS_STATUS); @@ -67,7 +69,7 @@ export function setup(logger: Logger) { await app.workbench.statusbar.waitForEOL('CRLF'); }); - it(`verifies that 'Tweet us feedback' pop-up appears when clicking on 'Feedback' icon`, async function () { + it.skip(`verifies that 'Tweet us feedback' pop-up appears when clicking on 'Feedback' icon`, async function () { const app = this.app as Application; if (app.quality === Quality.Dev || app.quality === Quality.OSS) { return this.skip(); From 3502944eafafeafa1cae57de36da4d97d2b0cd2e Mon Sep 17 00:00:00 2001 From: Anton Kosyakov Date: Tue, 30 Aug 2022 14:37:52 +0200 Subject: [PATCH 3/9] enable prebuilds for all branches --- .gitpod.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitpod.yml b/.gitpod.yml index 2013d9fa74b70..90932a95d2597 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -22,6 +22,7 @@ tasks: openMode: split-right github: prebuilds: + branches: true pullRequestsFromForks: true vscode: extensions: From 578aa515fe73cad2787112696ca424877bc9dc06 Mon Sep 17 00:00:00 2001 From: AXON Date: Tue, 17 Jan 2023 16:58:24 +0000 Subject: [PATCH 4/9] Add example guide for pre-installing vscode extensions with docker installation --- README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/README.md b/README.md index 7dab715b166f7..89e847714fcbc 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,39 @@ _Note_: Feel free to use the `nightly` tag to test the latest version, i.e. `git ``` - For additional possibilities, please consult the `Dockerfile` for OpenVSCode Server at https://github.com/gitpod-io/openvscode-releases/ +#### Pre-installing VSCode extensions + +You can pre-install vscode extensions in such a way: + +```dockerfile +FROM gitpod/openvscode-server:latest + +ENV OPENVSCODE_SERVER_ROOT="/home/.openvscode-server" +ENV OPENVSCODE="${OPENVSCODE_SERVER_ROOT}/bin/openvscode-server" + +SHELL ["/bin/bash", "-c"] +RUN \ + # Direct download links to external .vsix not available on https://open-vsx.org/ + # The two links here are just used as example, they are actually available on https://open-vsx.org/ + urls=(\ + https://github.com/rust-lang/rust-analyzer/releases/download/2022-12-26/rust-analyzer-linux-x64.vsix \ + https://github.com/VSCodeVim/Vim/releases/download/v1.24.3/vim-1.24.3.vsix \ + )\ + # Create a tmp dir for downloading + && tdir=/tmp/exts && mkdir -p "${tdir}" && cd "${tdir}" \ + # Download via wget from $urls array. + && wget "${urls[@]}" && \ + # List the extensions in this array + exts=(\ + # From https://open-vsx.org/ registry directly + gitpod.gitpod-theme \ + # From filesystem, .vsix that we downloaded (using bash wildcard '*') + "${tdir}"/* \ + )\ + # Install the $exts + && for ext in "${exts[@]}"; do ${OPENVSCODE} --install-extension "${ext}"; done +``` + ### Linux - [Download the latest release](https://github.com/gitpod-io/openvscode-server/releases/latest) From 5109ac48e3e25f14dd91c7a4995009aeca12d54b Mon Sep 17 00:00:00 2001 From: Jean Pierre Date: Tue, 31 Jan 2023 14:23:58 -0500 Subject: [PATCH 5/9] :lipstick: --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 89e847714fcbc..363bd79839f7e 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,7 @@ _Note_: You can use [pre-releases](https://github.com/gitpod-io/openvscode-serve Since OpenVSCode Server v1.64, you can access the Web UI without authentication (anyone can access the IDE using just the hostname and port), if you need some kind of basic authentication then you can start the server with `--connection-token YOUR_TOKEN`, the provided `YOUR_TOKEN` will be used and the authenticated URL will be displayed in your terminal once you start the server. You can also create a plaintext file with the desired token as its contents and provide it to the server with `--connection-secret YOUR_SECRET_FILE`. -If you want to use a connection token and are working with OpenVSCode Server via [the Docker image](https://hub.docker.com/r/gitpod/openvscode-server), you will have to edit the `ENTRYPOINT` in [the Dockerfile](https://github.com/gitpod-io/openvscode-releases/blob/eb59ab37e23f8d17532b4af4de37eafaf48037a5/Dockerfile#L64) or modify it with the [`entrypoint` option](https://docs.docker.com/compose/compose-file/compose-file-v3/#entrypoint) when working with `docker-compose`. +If you want to use a connection token and are working with OpenVSCode Server via [the Docker image](https://hub.docker.com/r/gitpod/openvscode-server), you will have to edit the `ENTRYPOINT` in [the Dockerfile](https://github.com/gitpod-io/openvscode-releases/blob/main/Dockerfile) or modify it with the [`entrypoint` option](https://docs.docker.com/compose/compose-file/compose-file-v3/#entrypoint) when working with `docker-compose`. ### Deployment guides From be24c90258463c828758a80d9925cbfb9c20e0aa Mon Sep 17 00:00:00 2001 From: Bjarne Sievers Date: Tue, 18 Apr 2023 13:39:29 +0200 Subject: [PATCH 6/9] Update deprecated example in README Option 'connection-secret' is deprecated: Use connection-token-file instead. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 363bd79839f7e..ac4ec807ecc34 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ RUN \ From the possible entrypoint arguments, the most notable ones are - `--port` - the port number to start the server on, this is 3000 by default - `--without-connection-token` - used by default in the docker image - - `--connection-token` & `--connection-secret` for securing access to the IDE, you can read more about it in [Securing access to your IDE](#securing-access-to-your-ide). + - `--connection-token` & `--connection-token-file` for securing access to the IDE, you can read more about it in [Securing access to your IDE](#securing-access-to-your-ide). - `--host` - determines the host the server is listening on. It defaults to `localhost`, so for accessing remotely it's a good idea to add `--host 0.0.0.0` to your launch arguments. - Visit the URL printed in your terminal. @@ -99,7 +99,7 @@ _Note_: You can use [pre-releases](https://github.com/gitpod-io/openvscode-serve ### Securing access to your IDE -Since OpenVSCode Server v1.64, you can access the Web UI without authentication (anyone can access the IDE using just the hostname and port), if you need some kind of basic authentication then you can start the server with `--connection-token YOUR_TOKEN`, the provided `YOUR_TOKEN` will be used and the authenticated URL will be displayed in your terminal once you start the server. You can also create a plaintext file with the desired token as its contents and provide it to the server with `--connection-secret YOUR_SECRET_FILE`. +Since OpenVSCode Server v1.64, you can access the Web UI without authentication (anyone can access the IDE using just the hostname and port), if you need some kind of basic authentication then you can start the server with `--connection-token YOUR_TOKEN`, the provided `YOUR_TOKEN` will be used and the authenticated URL will be displayed in your terminal once you start the server. You can also create a plaintext file with the desired token as its contents and provide it to the server with `--connection-token-file YOUR_SECRET_TOKEN_FILE`. If you want to use a connection token and are working with OpenVSCode Server via [the Docker image](https://hub.docker.com/r/gitpod/openvscode-server), you will have to edit the `ENTRYPOINT` in [the Dockerfile](https://github.com/gitpod-io/openvscode-releases/blob/main/Dockerfile) or modify it with the [`entrypoint` option](https://docs.docker.com/compose/compose-file/compose-file-v3/#entrypoint) when working with `docker-compose`. From 1309fce9573ba0db0a2c13e73581ecfaf1b8f2d1 Mon Sep 17 00:00:00 2001 From: Jean Pierre Date: Thu, 4 May 2023 17:22:42 -0500 Subject: [PATCH 7/9] Patch yarnInstall for openvscode-release --- build/npm/postinstall.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js index d9280ffb1eb87..d23d97bf26b31 100644 --- a/build/npm/postinstall.js +++ b/build/npm/postinstall.js @@ -53,7 +53,7 @@ function yarnInstall(dir, opts) { console.log(`Installing dependencies in ${dir} inside container ${process.env['VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME']}...`); opts.cwd = root; - run('docker', ['run', '-e', 'GITHUB_TOKEN', '-e', 'npm_config_arch', '-v', `/mnt/vss/_work/1/s:/root/vscode`, '-v', `/mnt/vss/_work/1/s/.build/.netrc:/root/.netrc`, process.env['VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME'], 'yarn', '--cwd', dir, ...args], opts); + run('docker', ['run', '-e', 'GITHUB_TOKEN', '-e', 'npm_config_arch', '-v', `.:/root/vscode`, process.env['VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME'], 'yarn', '--cwd', dir, ...args], opts); run('sudo', ['chown', '-R', `${userinfo.uid}:${userinfo.gid}`, `${dir}/node_modules`], opts); } else { console.log(`Installing dependencies in ${dir}...`); From d10f0ff7fdf57641a11addd2f20ff78b2298dc2b Mon Sep 17 00:00:00 2001 From: Pol Dellaiera Date: Wed, 17 May 2023 07:06:49 +0200 Subject: [PATCH 8/9] fix: make sure `user-data-dir` command line parameter is customizable The `--user-data-dir` command-line parameter is currently unusable. Its functionality is hampered due to an automatically appended `/data` directory, rendering the parameter completely ineffective. The proposed minor modification allows users to accurately customize this variable, enhancing its utility. --- src/vs/server/node/server.main.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/server/node/server.main.ts b/src/vs/server/node/server.main.ts index 469671e5745b0..071230aa6817a 100644 --- a/src/vs/server/node/server.main.ts +++ b/src/vs/server/node/server.main.ts @@ -37,14 +37,14 @@ const errorReporter: ErrorReporter = { const args = parseArgs(process.argv.slice(2), serverOptions, errorReporter); const REMOTE_DATA_FOLDER = args['server-data-dir'] || process.env['VSCODE_AGENT_FOLDER'] || join(os.homedir(), product.serverDataFolderName || '.vscode-remote'); -const USER_DATA_PATH = join(REMOTE_DATA_FOLDER, 'data'); +const USER_DATA_PATH = args['user-data-dir'] || join(REMOTE_DATA_FOLDER, 'data'); const APP_SETTINGS_HOME = join(USER_DATA_PATH, 'User'); const GLOBAL_STORAGE_HOME = join(APP_SETTINGS_HOME, 'globalStorage'); const LOCAL_HISTORY_HOME = join(APP_SETTINGS_HOME, 'History'); const MACHINE_SETTINGS_HOME = join(USER_DATA_PATH, 'Machine'); -args['user-data-dir'] = USER_DATA_PATH; const APP_ROOT = dirname(FileAccess.asFileUri('').fsPath); const BUILTIN_EXTENSIONS_FOLDER_PATH = join(APP_ROOT, 'extensions'); +args['user-data-dir'] = USER_DATA_PATH; args['builtin-extensions-dir'] = BUILTIN_EXTENSIONS_FOLDER_PATH; args['extensions-dir'] = args['extensions-dir'] || join(REMOTE_DATA_FOLDER, 'extensions'); From db4b217c71bda51b74e620df33f9e2afc73d986c Mon Sep 17 00:00:00 2001 From: gitname Date: Mon, 12 Jun 2023 18:11:43 -0700 Subject: [PATCH 9/9] Fix typos in variable name --- scripts/sync-helper.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/sync-helper.js b/scripts/sync-helper.js index 9f49f8dfa1575..7c67d8f5aa1f8 100644 --- a/scripts/sync-helper.js +++ b/scripts/sync-helper.js @@ -68,7 +68,7 @@ const AllowMissKeys = [ 'darwinUniversalAssetId', ]; -const propiertaryExtension = [ +const proprietaryExtensions = [ 'ms-vscode-remote.remote-containers', 'ms-dotnettools.csharp', 'ms-vscode.cpptools-extension-pack', @@ -132,10 +132,10 @@ async function start() { for (let key of pickKeys) { let newValue = releaseProduct[key]; if (Array.isArray(newValue) && newValue.length && typeof newValue[0] === 'string') { - newValue = newValue.map(v => openvsxExtensionMap[v] ?? v).filter(v => !propiertaryExtension.includes(v)); + newValue = newValue.map(v => openvsxExtensionMap[v] ?? v).filter(v => !proprietaryExtensions.includes(v)); } else if (typeof newValue === 'object' && newValue !== null) { newValue = renameObjKey(newValue, k => openvsxExtensionMap[k] ?? k); - newValue = filterObj(newValue, k => !propiertaryExtension.includes(k)); + newValue = filterObj(newValue, k => !proprietaryExtensions.includes(k)); } branchProduct[key] = newValue; } @@ -195,7 +195,7 @@ async function checkProductExtensions(product) { // Check if extensions exists in openvsx for (let id of uniqueExtIds) { - if (propiertaryExtension.includes(id)) { + if (proprietaryExtensions.includes(id)) { continue; }