diff --git a/.devcontainer/README.md b/.devcontainer/README.md
new file mode 100644
index 000000000000..827166823d73
--- /dev/null
+++ b/.devcontainer/README.md
@@ -0,0 +1,101 @@
+# Code - OSS Development Container
+
+This repository includes configuration for a development container for working with Code - OSS in a local container or using [GitHub Codespaces](https://github.com/features/codespaces).
+
+> **Tip:** The default VNC password is `vscode`. The VNC server runs on port `5901` and a web client is available on port `6080`.
+
+## Quick start - local
+
+1. Install Docker Desktop or Docker for Linux on your local machine. (See [docs](https://aka.ms/vscode-remote/containers/getting-started) for additional details.)
+
+2. **Important**: Docker needs at least **4 Cores and 6 GB of RAM (8 GB recommended)** to run a full build. If you are on macOS, or are using the old Hyper-V engine for Windows, update these values for Docker Desktop by right-clicking on the Docker status bar item and going to **Preferences/Settings > Resources > Advanced**.
+
+ > **Note:** The [Resource Monitor](https://marketplace.visualstudio.com/items?itemName=mutantdino.resourcemonitor) extension is included in the container so you can keep an eye on CPU/Memory in the status bar.
+
+3. Install [Visual Studio Code Stable](https://code.visualstudio.com/) or [Insiders](https://code.visualstudio.com/insiders/) and the [Remote - Containers](https://aka.ms/vscode-remote/download/containers) extension.
+
+ ![Image of Remote - Containers extension](https://microsoft.github.io/vscode-remote-release/images/remote-containers-extn.png)
+
+ > **Note:** The Remote - Containers extension requires the Visual Studio Code distribution of Code - OSS. See the [FAQ](https://aka.ms/vscode-remote/faq/license) for details.
+
+4. Press Ctrl/Cmd + Shift + P or F1 and select **Remote-Containers: Clone Repository in Container Volume...**.
+
+ > **Tip:** While you can use your local source tree instead, operations like `yarn install` can be slow on macOS or when using the Hyper-V engine on Windows. We recommend the "clone repository in container" approach instead since it uses "named volume" rather than the local filesystem.
+
+5. Type `https://github.com/microsoft/vscode` (or a branch or PR URL) in the input box and press Enter.
+
+6. After the container is running, open a web browser and go to [http://localhost:6080](http://localhost:6080), or use a [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/) to connect to `localhost:5901` and enter `vscode` as the password.
+
+Anything you start in VS Code, or the integrated terminal, will appear here.
+
+Next: **[Try it out!](#try-it)**
+
+## Quick start - GitHub Codespaces
+
+1. From the [microsoft/vscode GitHub repository](https://github.com/microsoft/vscode), click on the **Code** dropdown, select **Open with Codespaces**, and then click on **New codespace**. If prompted, select the **Standard** machine size (which is also the default).
+
+ > **Note:** You will not see these options within GitHub if you are not in the Codespaces beta.
+
+2. After the codespace is up and running in your browser, press Ctrl/Cmd + Shift + P or F1 and select **Ports: Focus on Ports View**.
+
+3. You should see **VNC web client (6080)** under in the list of ports. Select the line and click on the globe icon to open it in a browser tab.
+
+ > **Tip:** If you do not see the port, Ctrl/Cmd + Shift + P or F1, select **Forward a Port** and enter port `6080`.
+
+4. In the new tab, you should see noVNC. Click **Connect** and enter `vscode` as the password.
+
+Anything you start in VS Code, or the integrated terminal, will appear here.
+
+Next: **[Try it out!](#try-it)**
+
+### Using VS Code with GitHub Codespaces
+
+You may see improved VNC responsiveness when accessing a codespace from VS Code client since you can use a [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/). Here's how to do it.
+
+1. Install [Visual Studio Code Stable](https://code.visualstudio.com/) or [Insiders](https://code.visualstudio.com/insiders/) and the the [GitHub Codespaces extension](https://marketplace.visualstudio.com/items?itemName=GitHub.codespaces).
+
+ > **Note:** The GitHub Codespaces extension requires the Visual Studio Code distribution of Code - OSS.
+
+2. After the VS Code is up and running, press Ctrl/Cmd + Shift + P or F1, choose **Codespaces: Create New Codespace**, and use the following settings:
+ - `microsoft/vscode` for the repository.
+ - Select any branch (e.g. **main**) - you select a different one later.
+ - Choose **Standard** (4-core, 8GB) as the size.
+
+4. After you have connected to the codespace, you can use a [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/) to connect to `localhost:5901` and enter `vscode` as the password.
+
+ > **Tip:** You may also need change your VNC client's **Picture Quaility** setting to **High** to get a full color desktop.
+
+5. Anything you start in VS Code, or the integrated terminal, will appear here.
+
+Next: **[Try it out!](#try-it)**
+
+## Try it!
+
+This container uses the [Fluxbox](http://fluxbox.org/) window manager to keep things lean. **Right-click on the desktop** to see menu options. It works with GNOME and GTK applications, so other tools can be installed if needed.
+
+> **Note:** You can also set the resolution from the command line by typing `set-resolution`.
+
+To start working with Code - OSS, follow these steps:
+
+1. In your local VS Code client, open a terminal (Ctrl/Cmd + Shift + \`) and type the following commands:
+
+ ```bash
+ yarn install
+ bash scripts/code.sh
+ ```
+
+2. After the build is complete, open a web browser or a [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/) to connect to the desktop environment as described in the quick start and enter `vscode` as the password.
+
+3. You should now see Code - OSS!
+
+Next, let's try debugging.
+
+1. Shut down Code - OSS by clicking the box in the upper right corner of the Code - OSS window through your browser or VNC viewer.
+
+2. Go to your local VS Code client, and use the **Run / Debug** view to launch the **VS Code** configuration. (Typically the default, so you can likely just press F5).
+
+ > **Note:** If launching times out, you can increase the value of `timeout` in the "VS Code", "Attach Main Process", "Attach Extension Host", and "Attach to Shared Process" configurations in [launch.json](../.vscode/launch.json). However, running `scripts/code.sh` first will set up Electron which will usually solve timeout issues.
+
+3. After a bit, Code - OSS will appear with the debugger attached!
+
+Enjoy!
diff --git a/lib/vscode/.devcontainer/cache/.gitignore b/.devcontainer/cache/.gitignore
similarity index 100%
rename from lib/vscode/.devcontainer/cache/.gitignore
rename to .devcontainer/cache/.gitignore
diff --git a/lib/vscode/.devcontainer/cache/before-cache.sh b/.devcontainer/cache/before-cache.sh
similarity index 100%
rename from lib/vscode/.devcontainer/cache/before-cache.sh
rename to .devcontainer/cache/before-cache.sh
diff --git a/lib/vscode/.devcontainer/cache/build-cache-image.sh b/.devcontainer/cache/build-cache-image.sh
similarity index 100%
rename from lib/vscode/.devcontainer/cache/build-cache-image.sh
rename to .devcontainer/cache/build-cache-image.sh
diff --git a/lib/vscode/.devcontainer/cache/cache-diff.sh b/.devcontainer/cache/cache-diff.sh
similarity index 100%
rename from lib/vscode/.devcontainer/cache/cache-diff.sh
rename to .devcontainer/cache/cache-diff.sh
diff --git a/lib/vscode/.devcontainer/cache/cache.Dockerfile b/.devcontainer/cache/cache.Dockerfile
similarity index 100%
rename from lib/vscode/.devcontainer/cache/cache.Dockerfile
rename to .devcontainer/cache/cache.Dockerfile
diff --git a/lib/vscode/.devcontainer/cache/restore-diff.sh b/.devcontainer/cache/restore-diff.sh
similarity index 100%
rename from lib/vscode/.devcontainer/cache/restore-diff.sh
rename to .devcontainer/cache/restore-diff.sh
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 000000000000..d66344eccf65
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,36 @@
+{
+ "name": "Code - OSS",
+
+ // Image contents: https://github.com/microsoft/vscode-dev-containers/blob/master/repository-containers/images/github.com/microsoft/vscode/.devcontainer/base.Dockerfile
+ "image": "mcr.microsoft.com/vscode/devcontainers/repos/microsoft/vscode:branch-main",
+ "overrideCommand": false,
+ "runArgs": [ "--init", "--security-opt", "seccomp=unconfined"],
+
+ "settings": {
+ "resmon.show.battery": false,
+ "resmon.show.cpufreq": false
+ },
+
+ // noVNC, VNC
+ "forwardPorts": [6080, 5901],
+ "portsAttributes": {
+ "6080": {
+ "label": "VNC web client (noVNC)",
+ "onAutoForward": "silent"
+ },
+ "5901": {
+ "label": "VNC TCP port",
+ "onAutoForward": "silent"
+ }
+ },
+
+ "extensions": [
+ "dbaeumer.vscode-eslint",
+ "mutantdino.resourcemonitor"
+ ],
+
+ // Optionally loads a cached yarn install for the repo
+ "postCreateCommand": ".devcontainer/cache/restore-diff.sh",
+
+ "remoteUser": "node"
+}
diff --git a/lib/vscode/.devcontainer/prepare.sh b/.devcontainer/prepare.sh
similarity index 100%
rename from lib/vscode/.devcontainer/prepare.sh
rename to .devcontainer/prepare.sh
diff --git a/.dockerignore b/.dockerignore
deleted file mode 100644
index 9bcce7a80897..000000000000
--- a/.dockerignore
+++ /dev/null
@@ -1,3 +0,0 @@
-**
-!release-packages
-!ci
diff --git a/.editorconfig b/.editorconfig
index 65705d954568..e7e99b5bcb52 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,6 +1,15 @@
+# EditorConfig is awesome: https://EditorConfig.org
+
+# top-most EditorConfig file
root = true
+# Tab indentation
[*]
-indent_style = space
+indent_style = tab
trim_trailing_whitespace = true
+
+# The indent size used in the `package.json` file cannot be changed
+# https://github.com/npm/npm/pull/3180#issuecomment-16336516
+[{*.yml,*.yaml,package.json}]
+indent_style = space
indent_size = 2
diff --git a/lib/vscode/.eslintignore b/.eslintignore
similarity index 80%
rename from lib/vscode/.eslintignore
rename to .eslintignore
index b67a816156a4..8b93a4199e5d 100644
--- a/lib/vscode/.eslintignore
+++ b/.eslintignore
@@ -16,7 +16,3 @@
**/extensions/markdown-language-features/notebook-out/**
**/extensions/typescript-basics/test/colorize-fixtures/**
**/extensions/**/dist/**
-# These are code-server code symlinks.
-src/vs/base/node/proxy_agent.ts
-src/vs/ipc.d.ts
-src/vs/server/common/util.ts
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 000000000000..a54964c17b67
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,1035 @@
+{
+ "root": true,
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "ecmaVersion": 6,
+ "sourceType": "module"
+ },
+ "plugins": [
+ "@typescript-eslint",
+ "jsdoc"
+ ],
+ "rules": {
+ "constructor-super": "warn",
+ "curly": "warn",
+ "eqeqeq": "warn",
+ "no-buffer-constructor": "warn",
+ "no-caller": "warn",
+ "no-debugger": "warn",
+ "no-duplicate-case": "warn",
+ "no-duplicate-imports": "warn",
+ "no-eval": "warn",
+ "no-extra-semi": "warn",
+ "no-new-wrappers": "warn",
+ "no-redeclare": "off",
+ "no-sparse-arrays": "warn",
+ "no-throw-literal": "warn",
+ "no-unsafe-finally": "warn",
+ "no-unused-labels": "warn",
+ "no-restricted-globals": [
+ "warn",
+ "name",
+ "length",
+ "event",
+ "closed",
+ "external",
+ "status",
+ "origin",
+ "orientation",
+ "context"
+ ], // non-complete list of globals that are easy to access unintentionally
+ "no-var": "warn",
+ "jsdoc/no-types": "warn",
+ "semi": "off",
+ "@typescript-eslint/semi": "warn",
+ "@typescript-eslint/naming-convention": [
+ "warn",
+ {
+ "selector": "class",
+ "format": [
+ "PascalCase"
+ ]
+ }
+ ],
+ "code-no-unused-expressions": [
+ "warn",
+ {
+ "allowTernary": true
+ }
+ ],
+ "code-translation-remind": "warn",
+ "code-no-nls-in-standalone-editor": "warn",
+ "code-no-standalone-editor": "warn",
+ "code-no-unexternalized-strings": "warn",
+ "code-layering": [
+ "warn",
+ {
+ "common": [],
+ "node": [
+ "common"
+ ],
+ "browser": [
+ "common"
+ ],
+ "electron-sandbox": [
+ "common",
+ "browser"
+ ],
+ "electron-browser": [
+ "common",
+ "browser",
+ "node",
+ "electron-sandbox"
+ ],
+ "electron-main": [
+ "common",
+ "node"
+ ]
+ }
+ ],
+ "code-import-patterns": [
+ "warn",
+ // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ // !!! Do not relax these rules !!!
+ // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ {
+ "target": "**/vs/base/common/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/common/**"
+ ]
+ },
+ {
+ "target": "**/vs/base/test/common/**",
+ "restrictions": [
+ "assert",
+ "sinon",
+ "vs/nls",
+ "**/vs/base/common/**",
+ "**/vs/base/test/common/**"
+ ]
+ },
+ {
+ "target": "**/vs/base/browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/vs/base/electron-sandbox/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser,electron-sandbox}/**"
+ ]
+ },
+ {
+ "target": "**/vs/base/node/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/{common,node}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ // vs/base/test/browser contains tests for vs/base/browser
+ "target": "**/vs/base/test/browser/**",
+ "restrictions": [
+ "assert",
+ "sinon",
+ "vs/nls",
+ "**/vs/base/{common,browser}/**",
+ "**/vs/base/test/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/vs/base/parts/*/common/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/common/**",
+ "**/vs/base/parts/*/common/**"
+ ]
+ },
+ {
+ "target": "**/vs/base/parts/*/browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser}/**",
+ "**/vs/base/parts/*/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/vs/base/parts/*/node/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/{common,node}/**",
+ "**/vs/base/parts/*/{common,node}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/base/parts/*/electron-sandbox/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser,electron-sandbox}/**",
+ "**/vs/base/parts/*/{common,browser,electron-sandbox}/**"
+ ]
+ },
+ {
+ "target": "**/vs/base/parts/*/electron-browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/base/parts/*/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/base/parts/*/electron-main/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/{common,node,electron-main}/**",
+ "**/vs/base/parts/*/{common,node,electron-main}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/platform/*/common/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/common/**",
+ "**/vs/base/parts/*/common/**",
+ "**/vs/platform/*/common/**"
+ ]
+ },
+ {
+ "target": "**/vs/platform/*/test/common/**",
+ "restrictions": [
+ "assert",
+ "sinon",
+ "vs/nls",
+ "**/vs/base/common/**",
+ "**/vs/base/parts/*/common/**",
+ "**/vs/base/test/common/**",
+ "**/vs/platform/*/common/**",
+ "**/vs/platform/*/test/common/**"
+ ]
+ },
+ {
+ "target": "**/vs/platform/*/browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser}/**",
+ "**/vs/base/parts/*/{common,browser}/**",
+ "**/vs/platform/*/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/vs/platform/*/node/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/{common,node}/**",
+ "**/vs/base/parts/*/{common,node}/**",
+ "**/vs/platform/*/{common,node}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/platform/*/electron-sandbox/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser,electron-sandbox}/**",
+ "**/vs/base/parts/*/{common,browser,electron-sandbox}/**",
+ "**/vs/platform/*/{common,browser,electron-sandbox}/**"
+ ]
+ },
+ {
+ "target": "**/vs/platform/*/electron-browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/base/parts/*/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/platform/*/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/platform/*/electron-main/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/{common,node,electron-main}/**",
+ "**/vs/base/parts/*/{common,node,electron-main}/**",
+ "**/vs/platform/*/{common,node,electron-main}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/platform/*/test/browser/**",
+ "restrictions": [
+ "assert",
+ "sinon",
+ "vs/nls",
+ "**/vs/base/{common,browser}/**",
+ "**/vs/base/parts/*/{common,browser}/**",
+ "**/vs/platform/*/{common,browser}/**",
+ "**/vs/platform/*/test/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/vs/editor/common/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/common/**",
+ "**/vs/base/worker/**",
+ "**/vs/platform/*/common/**",
+ "**/vs/editor/common/**"
+ ]
+ },
+ {
+ "target": "**/vs/editor/test/common/**",
+ "restrictions": [
+ "assert",
+ "sinon",
+ "vs/nls",
+ "**/vs/base/common/**",
+ "**/vs/platform/*/common/**",
+ "**/vs/platform/*/test/common/**",
+ "**/vs/editor/common/**",
+ "**/vs/editor/test/common/**"
+ ]
+ },
+ {
+ "target": "**/vs/editor/browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser}/**",
+ "**/vs/platform/*/{common,browser}/**",
+ "**/vs/editor/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/vs/editor/test/browser/**",
+ "restrictions": [
+ "assert",
+ "sinon",
+ "vs/nls",
+ "**/vs/base/{common,browser}/**",
+ "**/vs/platform/*/{common,browser}/**",
+ "**/vs/platform/*/test/{common,browser}/**",
+ "**/vs/editor/{common,browser}/**",
+ "**/vs/editor/test/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/vs/editor/standalone/common/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/common/**",
+ "**/vs/platform/*/common/**",
+ "**/vs/editor/common/**",
+ "**/vs/editor/standalone/common/**"
+ ]
+ },
+ {
+ "target": "**/vs/editor/standalone/test/common/**",
+ "restrictions": [
+ "assert",
+ "sinon",
+ "vs/nls",
+ "**/vs/base/common/**",
+ "**/vs/platform/*/common/**",
+ "**/vs/platform/*/test/common/**",
+ "**/vs/editor/common/**",
+ "**/vs/editor/test/common/**"
+ ]
+ },
+ {
+ "target": "**/vs/editor/standalone/browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser}/**",
+ "**/vs/base/parts/*/{common,browser}/**",
+ "**/vs/platform/*/{common,browser}/**",
+ "**/vs/editor/{common,browser}/**",
+ "**/vs/editor/contrib/**",
+ "**/vs/editor/standalone/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/vs/editor/standalone/test/browser/**",
+ "restrictions": [
+ "assert",
+ "sinon",
+ "vs/nls",
+ "**/vs/base/{common,browser}/**",
+ "**/vs/platform/*/{common,browser}/**",
+ "**/vs/platform/*/test/{common,browser}/**",
+ "**/vs/editor/{common,browser}/**",
+ "**/vs/editor/standalone/{common,browser}/**",
+ "**/vs/editor/test/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/vs/editor/contrib/*/test/**",
+ "restrictions": [
+ "assert",
+ "sinon",
+ "vs/nls",
+ "**/vs/base/{common,browser}/**",
+ "**/vs/base/test/{common,browser}/**",
+ "**/vs/base/parts/*/{common,browser}/**",
+ "**/vs/platform/*/{common,browser}/**",
+ "**/vs/platform/*/test/{common,browser}/**",
+ "**/vs/editor/{common,browser}/**",
+ "**/vs/editor/test/{common,browser}/**",
+ "**/vs/editor/contrib/**"
+ ]
+ },
+ {
+ "target": "**/vs/editor/contrib/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser}/**",
+ "**/vs/base/parts/*/{common,browser}/**",
+ "**/vs/platform/{common,browser}/**",
+ "**/vs/platform/*/{common,browser}/**",
+ "**/vs/editor/{common,browser}/**",
+ "**/vs/editor/contrib/**"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/common/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/common/**",
+ "**/vs/base/parts/*/common/**",
+ "**/vs/platform/*/common/**",
+ "**/vs/editor/common/**",
+ "**/vs/editor/contrib/*/common/**",
+ "**/vs/workbench/common/**",
+ "**/vs/workbench/services/*/common/**",
+ "assert"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser}/**",
+ "**/vs/base/parts/*/{common,browser}/**",
+ "**/vs/platform/*/{common,browser}/**",
+ "**/vs/editor/{common,browser}/**",
+ "**/vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention
+ "**/vs/workbench/workbench.web.api",
+ "**/vs/workbench/{common,browser}/**",
+ "**/vs/workbench/services/*/{common,browser}/**",
+ "assert"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/api/common/**",
+ "restrictions": [
+ "vscode",
+ "vs/nls",
+ "**/vs/base/common/**",
+ "**/vs/platform/*/common/**",
+ "**/vs/editor/common/**",
+ "**/vs/editor/contrib/*/common/**",
+ "**/vs/workbench/api/common/**",
+ "**/vs/workbench/common/**",
+ "**/vs/workbench/services/*/common/**",
+ "**/vs/workbench/contrib/*/common/**"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/api/worker/**",
+ "restrictions": [
+ "vscode",
+ "vs/nls",
+ "**/vs/**/{common,worker}/**"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/electron-sandbox/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser,electron-sandbox}/**",
+ "**/vs/base/parts/*/{common,browser,electron-sandbox}/**",
+ "**/vs/platform/*/{common,browser,electron-sandbox}/**",
+ "**/vs/editor/{common,browser,electron-sandbox}/**",
+ "**/vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention
+ "**/vs/workbench/{common,browser,electron-sandbox}/**",
+ "**/vs/workbench/api/{common,browser,electron-sandbox}/**",
+ "**/vs/workbench/services/*/{common,browser,electron-sandbox}/**"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/electron-browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/base/parts/*/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/platform/*/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/editor/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention
+ "**/vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/workbench/api/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/workbench/services/*/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/workbench/services/**/test/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**",
+ "**/vs/platform/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "vs/workbench/contrib/files/browser/editors/fileEditorInput",
+ "**/vs/workbench/services/**",
+ "**/vs/workbench/test/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/workbench/services/**/common/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/**/common/**",
+ "**/vs/platform/**/common/**",
+ "**/vs/editor/common/**",
+ "**/vs/workbench/workbench.web.api",
+ "**/vs/workbench/common/**",
+ "**/vs/workbench/services/**/common/**",
+ "**/vs/workbench/api/**/common/**",
+ "vscode-textmate",
+ "vscode-oniguruma",
+ "iconv-lite-umd",
+ "tas-client-umd",
+ "jschardet"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/services/**/worker/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/**/common/**",
+ "**/vs/platform/**/common/**",
+ "**/vs/editor/common/**",
+ "**/vs/workbench/**/common/**",
+ "**/vs/workbench/**/worker/**",
+ "**/vs/workbench/services/**/common/**",
+ "vscode"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/services/**/browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,browser,worker}/**",
+ "**/vs/platform/**/{common,browser}/**",
+ "**/vs/editor/{common,browser}/**",
+ "**/vs/workbench/workbench.web.api",
+ "**/vs/workbench/{common,browser}/**",
+ "**/vs/workbench/api/{common,browser}/**",
+ "**/vs/workbench/services/**/{common,browser}/**",
+ "vscode-textmate",
+ "vscode-oniguruma",
+ "iconv-lite-umd",
+ "jschardet"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/services/**/node/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/**/{common,node}/**",
+ "**/vs/platform/**/{common,node}/**",
+ "**/vs/editor/{common,node}/**",
+ "**/vs/workbench/{common,node}/**",
+ "**/vs/workbench/api/{common,node}/**",
+ "**/vs/workbench/services/**/{common,node}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/workbench/services/**/electron-sandbox/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,browser,worker,electron-sandbox}/**",
+ "**/vs/platform/**/{common,browser,electron-sandbox}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/{common,browser,electron-sandbox}/**",
+ "**/vs/workbench/api/{common,browser,electron-sandbox}/**",
+ "**/vs/workbench/services/**/{common,browser,electron-sandbox}/**",
+ "vscode-textmate",
+ "vscode-oniguruma",
+ "iconv-lite-umd",
+ "jschardet"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/services/**/electron-browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,browser,worker,node,electron-sandbox,electron-browser}/**",
+ "**/vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/workbench/api/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/workbench/services/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/workbench/contrib/**/test/**",
+ "restrictions": [
+ "assert",
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**",
+ "**/vs/platform/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/workbench/services/**",
+ "**/vs/workbench/contrib/**",
+ "**/vs/workbench/test/**",
+ "*"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/contrib/terminal/browser/**",
+ "restrictions": [
+ // xterm and its addons are strictly browser-only components
+ "xterm",
+ "xterm-addon-*",
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,browser}/**",
+ "**/vs/platform/**/{common,browser}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/{common,browser}/**",
+ "**/vs/workbench/contrib/**/{common,browser}/**",
+ "**/vs/workbench/services/**/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/contrib/extensions/browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,browser}/**",
+ "**/vs/platform/**/{common,browser}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/{common,browser}/**",
+ "**/vs/workbench/contrib/**/{common,browser}/**",
+ "**/vs/workbench/services/**/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/contrib/update/browser/update.ts",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,browser}/**",
+ "**/vs/platform/**/{common,browser}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/{common,browser}/**",
+ "**/vs/workbench/contrib/**/{common,browser}/**",
+ "**/vs/workbench/services/**/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/contrib/notebook/common/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,worker}/**",
+ "**/vs/platform/**/common/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/common/**",
+ "**/vs/workbench/api/common/**",
+ "**/vs/workbench/services/**/common/**",
+ "**/vs/workbench/contrib/**/common/**"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/contrib/**/common/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/common/**",
+ "**/vs/platform/**/common/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/common/**",
+ "**/vs/workbench/api/common/**",
+ "**/vs/workbench/services/**/common/**",
+ "**/vs/workbench/contrib/**/common/**"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/contrib/**/browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,browser}/**",
+ "**/vs/platform/**/{common,browser}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/{common,browser}/**",
+ "**/vs/workbench/api/{common,browser}/**",
+ "**/vs/workbench/services/**/{common,browser}/**",
+ "**/vs/workbench/contrib/**/{common,browser}/**",
+ "vscode-textmate",
+ "vscode-oniguruma",
+ "iconv-lite-umd",
+ "jschardet"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/contrib/**/node/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,node}/**",
+ "**/vs/platform/**/{common,node}/**",
+ "**/vs/editor/**/common/**",
+ "**/vs/workbench/{common,node}/**",
+ "**/vs/workbench/api/{common,node}/**",
+ "**/vs/workbench/services/**/{common,node}/**",
+ "**/vs/workbench/contrib/**/{common,node}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/workbench/contrib/**/electron-sandbox/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,browser,worker,electron-sandbox}/**",
+ "**/vs/platform/**/{common,browser,electron-sandbox}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/{common,browser,electron-sandbox}/**",
+ "**/vs/workbench/api/{common,browser,electron-sandbox}/**",
+ "**/vs/workbench/services/**/{common,browser,electron-sandbox}/**",
+ "**/vs/workbench/contrib/**/{common,browser,electron-sandbox}/**",
+ "vscode-textmate",
+ "vscode-oniguruma",
+ "iconv-lite-umd",
+ "jschardet"
+ ]
+ },
+ {
+ "target": "**/vs/workbench/contrib/**/electron-browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,browser,worker,node,electron-sandbox,electron-browser}/**",
+ "**/vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/workbench/api/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/workbench/services/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/workbench/contrib/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/code/browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,browser}/**",
+ "**/vs/base/parts/**/{common,browser}/**",
+ "**/vs/platform/**/{common,browser}/**",
+ "**/vs/code/**/{common,browser}/**",
+ "**/vs/workbench/workbench.web.api"
+ ]
+ },
+ {
+ "target": "**/vs/code/node/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/**/{common,node}/**",
+ "**/vs/base/parts/**/{common,node}/**",
+ "**/vs/platform/**/{common,node}/**",
+ "**/vs/code/**/{common,node}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/code/electron-browser/**",
+ "restrictions": [
+ "vs/nls",
+ "vs/css!./**/*",
+ "**/vs/base/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/base/parts/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/code/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/code/electron-main/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/**/{common,node,electron-main}/**",
+ "**/vs/base/parts/**/{common,node,electron-main}/**",
+ "**/vs/platform/**/{common,node,electron-main}/**",
+ "**/vs/code/**/{common,node,electron-main}/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/vs/server/**",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/**/{common,node}/**",
+ "**/vs/base/parts/**/{common,node}/**",
+ "**/vs/platform/**/{common,node}/**",
+ "**/vs/workbench/**/{common,node}/**",
+ "**/vs/server/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/src/vs/workbench/workbench.common.main.ts",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/**/{common,browser}/**",
+ "**/vs/base/parts/**/{common,browser}/**",
+ "**/vs/platform/**/{common,browser}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/**/{common,browser}/**"
+ ]
+ },
+ {
+ "target": "**/src/vs/workbench/workbench.web.main.ts",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/**/{common,browser}/**",
+ "**/vs/base/parts/**/{common,browser}/**",
+ "**/vs/platform/**/{common,browser}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/**/{common,browser}/**",
+ "**/vs/workbench/workbench.common.main"
+ ]
+ },
+ {
+ "target": "**/src/vs/workbench/workbench.web.api.ts",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/**/{common,browser}/**",
+ "**/vs/base/parts/**/{common,browser}/**",
+ "**/vs/platform/**/{common,browser}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/**/{common,browser}/**",
+ "**/vs/workbench/workbench.web.main"
+ ]
+ },
+ {
+ "target": "**/src/vs/workbench/workbench.sandbox.main.ts",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/**/{common,browser,electron-sandbox}/**",
+ "**/vs/base/parts/**/{common,browser,electron-sandbox}/**",
+ "**/vs/platform/**/{common,browser,electron-sandbox}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/**/{common,browser,electron-sandbox}/**",
+ "**/vs/workbench/workbench.common.main"
+ ]
+ },
+ {
+ "target": "**/src/vs/workbench/workbench.desktop.main.ts",
+ "restrictions": [
+ "vs/nls",
+ "**/vs/base/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/base/parts/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/platform/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/editor/**",
+ "**/vs/workbench/**/{common,browser,node,electron-sandbox,electron-browser}/**",
+ "**/vs/workbench/workbench.common.main",
+ "**/vs/workbench/workbench.sandbox.main"
+ ]
+ },
+ {
+ "target": "**/extensions/**",
+ "restrictions": "**/*"
+ },
+ {
+ "target": "**/test/smoke/**",
+ "restrictions": [
+ "**/test/smoke/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/test/automation/**",
+ "restrictions": [
+ "**/test/automation/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/test/integration/**",
+ "restrictions": [
+ "**/test/integration/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/test/monaco/**",
+ "restrictions": [
+ "**/test/monaco/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/api/**.test.ts",
+ "restrictions": [
+ "**/vs/**",
+ "assert",
+ "sinon",
+ "crypto",
+ "vscode"
+ ]
+ },
+ {
+ "target": "**/{node,electron-browser,electron-main}/**/*.test.ts",
+ "restrictions": [
+ "**/vs/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/{node,electron-browser,electron-main}/**/test/**",
+ "restrictions": [
+ "**/vs/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/test/{node,electron-browser,electron-main}/**",
+ "restrictions": [
+ "**/vs/**",
+ "*" // node modules
+ ]
+ },
+ {
+ "target": "**/**.test.ts",
+ "restrictions": [
+ "**/vs/**",
+ "assert",
+ "sinon",
+ "crypto",
+ "xterm*"
+ ]
+ },
+ {
+ "target": "**/test/**",
+ "restrictions": [
+ "**/vs/**",
+ "assert",
+ "sinon",
+ "crypto",
+ "xterm*"
+ ]
+ }
+ ]
+ },
+ "overrides": [
+ {
+ "files": [
+ "*.js"
+ ],
+ "rules": {
+ "jsdoc/no-types": "off"
+ }
+ },
+ {
+ "files": [
+ "**/vscode.d.ts",
+ "**/vscode.proposed.d.ts"
+ ],
+ "rules": {
+ "vscode-dts-create-func": "warn",
+ "vscode-dts-literal-or-types": "warn",
+ "vscode-dts-interface-naming": "warn",
+ "vscode-dts-cancellation": "warn",
+ "vscode-dts-use-thenable": "warn",
+ "vscode-dts-region-comments": "warn",
+ "vscode-dts-provider-naming": [
+ "warn",
+ {
+ "allowed": [
+ "FileSystemProvider",
+ "TreeDataProvider",
+ "TestProvider",
+ "CustomEditorProvider",
+ "CustomReadonlyEditorProvider",
+ "TerminalLinkProvider",
+ "AuthenticationProvider",
+ "NotebookContentProvider"
+ ]
+ }
+ ],
+ "vscode-dts-event-naming": [
+ "warn",
+ {
+ "allowed": [
+ "onCancellationRequested",
+ "event"
+ ],
+ "verbs": [
+ "accept",
+ "change",
+ "close",
+ "collapse",
+ "create",
+ "delete",
+ "discover",
+ "dispose",
+ "edit",
+ "end",
+ "expand",
+ "grant",
+ "hide",
+ "invalidate",
+ "open",
+ "override",
+ "receive",
+ "register",
+ "remove",
+ "rename",
+ "save",
+ "send",
+ "start",
+ "terminate",
+ "trigger",
+ "unregister",
+ "write"
+ ]
+ }
+ ]
+ }
+ }
+ ]
+}
diff --git a/.eslintrc.yaml b/.eslintrc.yaml
deleted file mode 100644
index b579a9a24671..000000000000
--- a/.eslintrc.yaml
+++ /dev/null
@@ -1,46 +0,0 @@
-parser: "@typescript-eslint/parser"
-env:
- browser: true
- es6: true # Map, etc.
- jest: true
- node: true
-
-parserOptions:
- ecmaVersion: 2018
- sourceType: module
-
-extends:
- - eslint:recommended
- - plugin:@typescript-eslint/recommended
- - plugin:import/recommended
- - plugin:import/typescript
- - plugin:prettier/recommended
- # Prettier should always be last
- # Removes eslint rules that conflict with prettier.
- - prettier
-
-rules:
- # Sometimes you need to add args to implement a function signature even
- # if they are unused.
- "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }]
- # For overloads.
- no-dupe-class-members: off
- "@typescript-eslint/no-use-before-define": off
- "@typescript-eslint/no-non-null-assertion": off
- "@typescript-eslint/ban-types": off
- "@typescript-eslint/no-var-requires": off
- "@typescript-eslint/explicit-module-boundary-types": off
- "@typescript-eslint/no-explicit-any": off
- "@typescript-eslint/no-extra-semi": off
- eqeqeq: error
- import/order:
- [error, { alphabetize: { order: "asc" }, groups: [["builtin", "external", "internal"], "parent", "sibling"] }]
- no-async-promise-executor: off
- # This isn't a real module, just types, which apparently doesn't resolve.
- import/no-unresolved: [error, { ignore: ["express-serve-static-core"] }]
-
-settings:
- # Does not work with CommonJS unfortunately.
- import/ignore:
- - env-paths
- - xdg-basedir
diff --git a/.gitattributes b/.gitattributes
index dc5caf936908..5a817c30b6d7 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,10 @@
-*.afdesign filter=lfs diff=lfs merge=lfs -text
+* text=auto
+
+LICENSE.txt eol=crlf
+ThirdPartyNotices.txt eol=crlf
+
+*.bat eol=crlf
+*.cmd eol=crlf
+*.ps1 eol=lf
+*.sh eol=lf
+*.rtf -text
\ No newline at end of file
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
deleted file mode 100644
index b7e6805b7f29..000000000000
--- a/.github/CODEOWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-* @cdr/code-server-reviewers
-
-ci/helm-chart @Matthew-Beckett @alexgorbatchev
diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md
deleted file mode 100644
index 4ec82a898d65..000000000000
--- a/.github/ISSUE_TEMPLATE/bug-report.md
+++ /dev/null
@@ -1,74 +0,0 @@
----
-name: Bug report
-about: Report a bug and help us improve
-title: ""
-labels: ""
-assignees: ""
----
-
-
-
-## OS/Web Information
-
-- Web Browser:
-- Local OS:
-- Remote OS:
-- Remote Architecture:
-- `code-server --version`:
-
-## Steps to Reproduce
-
-1.
-2.
-3.
-
-## Expected
-
-
-
-## Actual
-
-
-
-## Logs
-
-
-
-## Screenshot
-
-
-
-## Notes
-
-
-
-This issue can be reproduced in VS Code: Yes/No
diff --git a/lib/vscode/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
similarity index 99%
rename from lib/vscode/.github/ISSUE_TEMPLATE/bug_report.md
rename to .github/ISSUE_TEMPLATE/bug_report.md
index b40ba5ddd483..8a44ce8c7ac1 100644
--- a/lib/vscode/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -8,6 +8,11 @@ about: Create a report to help us improve
+
+Does this issue occur when all extensions are disabled?: Yes/No
+
+
+
- VS Code Version:
- OS Version:
@@ -15,9 +20,3 @@ Steps to Reproduce:
1.
2.
-
-
-Does this issue occur when all extensions are disabled?: Yes/No
-
-
-
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 2f567fce310b..51e7f3660431 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -1,8 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Question
- url: https://github.com/cdr/code-server/discussions/new?category_id=22503114
- about: Ask the community for help on our GitHub Discussions board
- - name: Chat
- about: Need immediate help or just want to talk? Hop in our Slack
- url: https://cdr.co/join-community
+ url: https://stackoverflow.com/questions/tagged/visual-studio-code
+ about: Please ask and answer questions here.
diff --git a/.github/ISSUE_TEMPLATE/doc.md b/.github/ISSUE_TEMPLATE/doc.md
deleted file mode 100644
index ba63b11bdf8f..000000000000
--- a/.github/ISSUE_TEMPLATE/doc.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-name: Documentation improvement
-about: Suggest a documentation improvement
-title: ""
-labels: "docs"
-assignees: ""
----
diff --git a/.github/ISSUE_TEMPLATE/extension-request.md b/.github/ISSUE_TEMPLATE/extension-request.md
deleted file mode 100644
index 97f6059ae045..000000000000
--- a/.github/ISSUE_TEMPLATE/extension-request.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-name: Extension request
-about: Request an extension missing from the code-server marketplace
-title: ""
-labels: extension-request
-assignees: ""
----
-
-
-
-- [ ] Extension name:
-- [ ] Extension GitHub or homepage:
diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md
deleted file mode 100644
index 3f7411eefb6b..000000000000
--- a/.github/ISSUE_TEMPLATE/feature-request.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-name: Feature request
-about: Suggest an idea
-title: ""
-labels: feature
-assignees: ""
----
-
-
diff --git a/lib/vscode/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
similarity index 100%
rename from lib/vscode/.github/ISSUE_TEMPLATE/feature_request.md
rename to .github/ISSUE_TEMPLATE/feature_request.md
diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
deleted file mode 100644
index 4cdeac9f7b66..000000000000
--- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
+++ /dev/null
@@ -1,6 +0,0 @@
-
diff --git a/.github/PULL_REQUEST_TEMPLATE/release_template.md b/.github/PULL_REQUEST_TEMPLATE/release_template.md
deleted file mode 100644
index a88b6de174b6..000000000000
--- a/.github/PULL_REQUEST_TEMPLATE/release_template.md
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-This PR is to generate a new release of `code-server` at `$CODE_SERVER_VERSION_TO_UPDATE`
-
-## Screenshot
-
-TODO
-
-## TODOs
-
-- [ ] test locally
-- [ ] upload assets to draft release
-- [ ] test one of the release packages locally
-- [ ] double-check github release tag is the commit with artifacts (_note gets messed up after uploading assets_)
-- [ ] publish release
-- [ ] merge PR
-- [ ] update the homebrew package
-- [ ] update the AUR package
diff --git a/lib/vscode/.github/calendar.yml b/.github/calendar.yml
similarity index 100%
rename from lib/vscode/.github/calendar.yml
rename to .github/calendar.yml
diff --git a/lib/vscode/.github/classifier.json b/.github/classifier.json
similarity index 93%
rename from lib/vscode/.github/classifier.json
rename to .github/classifier.json
index 5adabb9aa9c9..1783b82c8797 100644
--- a/lib/vscode/.github/classifier.json
+++ b/.github/classifier.json
@@ -1,16 +1,17 @@
{
"$schema": "https://raw.githubusercontent.com/microsoft/vscode-github-triage-actions/master/classifier-deep/apply/apply-labels/deep-classifier-config.schema.json",
- "vacation": [],
+ "vacation": ["RMacfarlane"],
"assignees": {
"JacksonKearl": {"accuracy": 0.5}
},
"labels": {
"L10N": {"assign": []},
"VIM": {"assign": []},
+ "accessibility": { "assign": ["isidorn"]},
"api": {"assign": ["jrieken"]},
"api-finalization": {"assign": []},
"api-proposal": {"assign": ["jrieken"]},
- "authentication": {"assign": ["RMacfarlane"]},
+ "authentication": {"assign": ["TylerLeonhardt"]},
"breadcrumbs": {"assign": ["jrieken"]},
"callhierarchy": {"assign": ["jrieken"]},
"code-lens": {"assign": ["jrieken"]},
@@ -20,8 +21,7 @@
"context-keys": {"assign": []},
"css-less-scss": {"assign": ["aeschli"]},
"custom-editors": {"assign": ["mjbvz"]},
- "debug": {"assign": ["isidorn"]},
- "debug-console": {"assign": ["isidorn"]},
+ "debug": {"assign": ["weinand"]},
"dialogs": {"assign": ["sbatten"]},
"diff-editor": {"assign": []},
"dropdown": {"assign": []},
@@ -81,14 +81,15 @@
"icon-brand": {"assign": []},
"icons-product": {"assign": ["misolori"]},
"install-update": {"assign": []},
- "integrated-terminal": {"assign": ["meganrogge"]},
- "integrated-terminal-conpty": {"assign": ["meganrogge"]},
- "integrated-terminal-links": {"assign": ["meganrogge"]},
+ "terminal": {"assign": ["meganrogge"]},
+ "terminal-conpty": {"assign": ["meganrogge"]},
+ "terminal-links": {"assign": ["meganrogge"]},
+ "terminal-external": {"assign": ["meganrogge"]},
"integration-test": {"assign": []},
"intellisense-config": {"assign": []},
"ipc": {"assign": ["joaomoreno"]},
"issue-bot": {"assign": ["chrmarti"]},
- "issue-reporter": {"assign": ["RMacfarlane"]},
+ "issue-reporter": {"assign": ["TylerLeonhardt"]},
"javascript": {"assign": ["mjbvz"]},
"json": {"assign": ["aeschli"]},
"keybindings": {"assign": []},
@@ -113,7 +114,7 @@
"php": {"assign": ["roblourens"]},
"portable-mode": {"assign": ["joaomoreno"]},
"proxy": {"assign": []},
- "quick-pick": {"assign": ["chrmarti"]},
+ "quick-pick": {"assign": ["TylerLeonhardt"]},
"references-viewlet": {"assign": ["jrieken"]},
"release-notes": {"assign": []},
"remote": {"assign": []},
@@ -152,7 +153,7 @@
"web": {"assign": ["bpasero"]},
"webview": {"assign": ["mjbvz"]},
"workbench-cli": {"assign": []},
- "workbench-diagnostics": {"assign": ["RMacfarlane"]},
+ "workbench-diagnostics": {"assign": ["Tyriar"]},
"workbench-dnd": {"assign": ["bpasero"]},
"workbench-editor-grid": {"assign": ["sbatten"]},
"workbench-editors": {"assign": ["bpasero"]},
diff --git a/.github/codeql-config.yml b/.github/codeql-config.yml
deleted file mode 100644
index 690b8e5a92e0..000000000000
--- a/.github/codeql-config.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-name: "code-server CodeQL config"
-
-paths-ignore:
- - lib/vscode
diff --git a/lib/vscode/.github/commands.json b/.github/commands.json
similarity index 97%
rename from lib/vscode/.github/commands.json
rename to .github/commands.json
index de0643d56c92..388a9c3dbb33 100644
--- a/lib/vscode/.github/commands.json
+++ b/.github/commands.json
@@ -90,7 +90,7 @@
"@author"
],
"action": "updateLabels",
- "addLabel": "z-author-verified",
+ "addLabel": "verified",
"removeLabel": "author-verification-requested",
"requireLabel": "author-verification-requested",
"disallowLabel": "unreleased"
@@ -133,6 +133,18 @@
"action": "updateLabels",
"addLabel": "~needs more info"
},
+ {
+ "type": "comment",
+ "name": "needsPerfInfo",
+ "allowUsers": [
+ "cleidigh",
+ "usernamehw",
+ "gjsjohnmurray",
+ "IllusionMH"
+ ],
+ "addLabel": "needs more info",
+ "comment": "Thanks for creating this issue regarding performance! Please follow this guide to help us diagnose performance issues: https://github.com/microsoft/vscode/wiki/Performance-Issues \n\nHappy Coding!"
+ },
{
"type": "comment",
"name": "jsDebugLogs",
diff --git a/lib/vscode/.github/commands.yml b/.github/commands.yml
similarity index 100%
rename from lib/vscode/.github/commands.yml
rename to .github/commands.yml
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index 4ec51d013758..000000000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-version: 2
-updates:
- - package-ecosystem: "github-actions"
- directory: "/"
- schedule:
- interval: "daily"
- time: "11:00"
- ignore:
- # GitHub always delivers the latest versions for each major
- # release tag, so handle updates manually
- - dependency-name: "actions/*"
- - dependency-name: "github/codeql-action/*"
-
- - package-ecosystem: "npm"
- directory: "/"
- schedule:
- interval: "daily"
- time: "11:00"
- ignore:
- - dependency-name: "@types/node"
- versions: ["15.x", "14.x", "13.x"]
- - dependency-name: "xdg-basedir"
- # 5.0.0 has breaking changes as they switch to named exports
- # and convert the module to ESM
- # We can't use it until we switch to ESM across the project
- # See release notes: https://github.com/sindresorhus/xdg-basedir/releases/tag/v5.0.0
- versions: ["5.x"]
diff --git a/lib/vscode/.github/endgame/insiders.yml b/.github/endgame/insiders.yml
similarity index 100%
rename from lib/vscode/.github/endgame/insiders.yml
rename to .github/endgame/insiders.yml
diff --git a/lib/vscode/.github/insiders.yml b/.github/insiders.yml
similarity index 100%
rename from lib/vscode/.github/insiders.yml
rename to .github/insiders.yml
diff --git a/.github/lock.yml b/.github/lock.yml
deleted file mode 100644
index 2dfb6cf38862..000000000000
--- a/.github/lock.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-# Configuration for Lock Threads - https://github.com/dessant/lock-threads-app
-
-# Number of days of inactivity before a closed issue or pull request is locked
-daysUntilLock: 90
-
-# Skip issues and pull requests created before a given timestamp. Timestamp must
-# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
-skipCreatedBefore: false
-
-# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
-exemptLabels: []
-
-# Label to add before locking, such as `outdated`. Set to `false` to disable
-lockLabel: false
-
-# Comment to post before locking. Set to `false` to disable
-lockComment: >
- This thread has been automatically locked since there has not been
- any recent activity after it was closed. Please open a new issue for
- related bugs.
-
-# Assign `resolved` as the reason for locking. Set to `false` to disable
-setLockReason: true
-# Limit to only `issues` or `pulls`
-# only: issues
-
-# Optionally, specify configuration settings just for `issues` or `pulls`
-# issues:
-# exemptLabels:
-# - help-wanted
-# lockLabel: outdated
-
-# pulls:
-# daysUntilLock: 30
-
-# Repository to extend settings from
-# _extends: repo
diff --git a/lib/vscode/.github/pull_request_template.md b/.github/pull_request_template.md
similarity index 100%
rename from lib/vscode/.github/pull_request_template.md
rename to .github/pull_request_template.md
diff --git a/.github/ranger.yml b/.github/ranger.yml
deleted file mode 100644
index ec029b19c261..000000000000
--- a/.github/ranger.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-# Configuration for the repo ranger bot
-# See docs: https://www.notion.so/Documentation-8d7627bb1f3c42b7b1820e8d6f157a57#9879d1374fab4d1f9c607c230fd5123d
-default:
- close:
- # Default time to wait before closing the label. Can either be a number in milliseconds
- # or a string specified by the `ms` package (https://www.npmjs.com/package/ms)
- delay: "2 days"
-
- # Default comment to post when an issue is first marked with a closing label
- comment: "โ ๏ธ This issue has been marked $LABEL and will be closed in $DELAY."
-
-labels:
- duplicate: close
- wontfix: close
- "squash when passing": merge
- "rebase when passing": merge
- "merge when passing": merge
- stale:
- action: close
- delay: 7 days
- comment: "โ ๏ธ This issue has been marked stale and will automatically be closed in $DELAY."
- "new contributor":
- action: comment
- delay: 5s
- message: "Thanks for making your first contribution! :slightly_smiling_face:"
- extension-request:
- action: close
- delay: 5s
- comment: >
- Thanks for opening an extension request!
- We are currently in the process of switching extension
- marketplaces and transitioning over to [Open VSX](https://open-vsx.org/).
- Once https://github.com/eclipse/openvsx/issues/249 is implemented, we
- can fully make this transition. Therefore, we are no longer accepting
- new requests for extension requests. We suggest installing the VSIX
- file and then installing into code-server as a temporary workaround.
- See [docs](https://github.com/cdr/code-server/blob/main/docs/FAQ.md#installing-vsix-extensions-via-the-command-line) for more info.
- "upstream:vscode":
- action: close
- delay: 5s
- comment: >
- This issue has been marked as 'upstream:vscode'.
- Please file this upstream: [link to open issue](https://github.com/microsoft/vscode/issues/new/choose)
-
- This issue will automatically close in $DELAY.
diff --git a/lib/vscode/.github/similarity.yml b/.github/similarity.yml
similarity index 100%
rename from lib/vscode/.github/similarity.yml
rename to .github/similarity.yml
diff --git a/.github/subscribers.json b/.github/subscribers.json
new file mode 100644
index 000000000000..25c676a47c74
--- /dev/null
+++ b/.github/subscribers.json
@@ -0,0 +1,10 @@
+{
+ "notebook": [
+ "claudiaregio",
+ "rchiodo",
+ "greazer",
+ "donjayamanne",
+ "jilljac",
+ "IanMatthewHuff"
+ ]
+}
diff --git a/lib/vscode/.github/workflows/author-verified.yml b/.github/workflows/author-verified.yml
similarity index 100%
rename from lib/vscode/.github/workflows/author-verified.yml
rename to .github/workflows/author-verified.yml
diff --git a/lib/vscode/.github/workflows/build-chat.yml b/.github/workflows/build-chat.yml
similarity index 100%
rename from lib/vscode/.github/workflows/build-chat.yml
rename to .github/workflows/build-chat.yml
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
deleted file mode 100644
index 8e6344db09e4..000000000000
--- a/.github/workflows/ci.yaml
+++ /dev/null
@@ -1,466 +0,0 @@
-name: ci
-
-on:
- push:
- branches:
- - main
- pull_request:
- branches:
- - main
-
-# Note: if: success() is used in several jobs -
-# this ensures that it only executes if all previous jobs succeeded.
-
-# if: steps.cache-yarn.outputs.cache-hit != 'true'
-# will skip running `yarn install` if it successfully fetched from cache
-
-jobs:
- prebuild:
- name: Pre-build checks
- runs-on: ubuntu-latest
- env:
- CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- steps:
- - name: Checkout repo
- uses: actions/checkout@v2
-
- - name: Install Node.js v12
- uses: actions/setup-node@v2
- with:
- node-version: "12"
-
- - name: Install helm
- uses: azure/setup-helm@v1.1
-
- - name: Fetch dependencies from cache
- id: cache-yarn
- uses: actions/cache@v2
- with:
- path: "**/node_modules"
- key: yarn-build-${{ hashFiles('**/yarn.lock') }}
-
- - name: Install dependencies
- if: steps.cache-yarn.outputs.cache-hit != 'true'
- run: yarn --frozen-lockfile
-
- - name: Audit for vulnerabilities
- run: yarn _audit
- if: success()
-
- - name: Run yarn fmt
- run: yarn fmt
- if: success()
-
- - name: Run yarn lint
- run: yarn lint
- if: success()
-
- - name: Run code-server unit tests
- run: yarn test:unit
- if: success()
-
- - name: Upload coverage report to Codecov
- run: yarn coverage
- if: success()
-
- build:
- name: Build
- needs: prebuild
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- with:
- fetch-depth: 0
-
- - name: Install Node.js v12
- uses: actions/setup-node@v2
- with:
- node-version: "12"
-
- - name: Fetch dependencies from cache
- id: cache-yarn
- uses: actions/cache@v2
- with:
- path: "**/node_modules"
- key: yarn-build-${{ hashFiles('**/yarn.lock') }}
-
- - name: Install dependencies
- if: steps.cache-yarn.outputs.cache-hit != 'true'
- run: yarn --frozen-lockfile
-
- - name: Build code-server
- run: yarn build
-
- # Parse the hash of the latest commit inside lib/vscode
- # use this to avoid rebuilding it if nothing changed
- # How it works: the `git log` command fetches the hash of the last commit
- # that changed a file inside `lib/vscode`. If a commit changes any file in there,
- # the hash returned will change, and we rebuild vscode. If the hash did not change,
- # (for example, a change to `src/` or `docs/`), we reuse the same build as last time.
- # This saves a lot of time in CI, as compiling VSCode can take anywhere from 5-10 minutes.
- - name: Get latest lib/vscode rev
- id: vscode-rev
- run: echo "::set-output name=rev::$(git log -1 --format='%H' ./lib/vscode)"
-
- - name: Attempt to fetch vscode build from cache
- id: cache-vscode
- uses: actions/cache@v2
- with:
- path: |
- lib/vscode/.build
- lib/vscode/out-build
- lib/vscode/out-vscode
- lib/vscode/out-vscode-min
- key: vscode-build-${{ steps.vscode-rev.outputs.rev }}
-
- - name: Build vscode
- if: steps.cache-vscode.outputs.cache-hit != 'true'
- run: yarn build:vscode
-
- # The release package does not contain any native modules
- # and is neutral to architecture/os/libc version.
- - name: Create release package
- run: yarn release
- if: success()
-
- # https://github.com/actions/upload-artifact/issues/38
- - name: Compress release package
- run: tar -czf package.tar.gz release
-
- - name: Upload npm package artifact
- uses: actions/upload-artifact@v2
- with:
- name: npm-package
- path: ./package.tar.gz
-
- # TODO: cache building yarn --production
- # possibly 2m30s of savings(?)
- # this requires refactoring our release scripts
- package-linux-amd64:
- name: x86-64 Linux build
- needs: build
- runs-on: ubuntu-latest
- container: "centos:7"
-
- steps:
- - uses: actions/checkout@v2
-
- - name: Install Node.js v12
- uses: actions/setup-node@v2
- with:
- node-version: "12"
-
- - name: Install development tools
- run: |
- yum install -y epel-release centos-release-scl
- yum install -y devtoolset-9-{make,gcc,gcc-c++} jq rsync
-
- - name: Install nfpm and envsubst
- run: |
- curl -sfL https://install.goreleaser.com/github.com/goreleaser/nfpm.sh | sh -s -- -b ~/.local/bin v2.3.1
- curl -L https://github.com/a8m/envsubst/releases/download/v1.1.0/envsubst-`uname -s`-`uname -m` -o envsubst
- chmod +x envsubst
- mv envsubst ~/.local/bin
- echo "$HOME/.local/bin" >> $GITHUB_PATH
-
- - name: Install yarn
- run: npm install -g yarn
-
- - name: Download npm package
- uses: actions/download-artifact@v2
- with:
- name: npm-package
-
- - name: Decompress npm package
- run: tar -xzf package.tar.gz
-
- # NOTE: && here is deliberate - GitHub puts each line in its own `.sh`
- # file when running inside a docker container.
- - name: Build standalone release
- run: source scl_source enable devtoolset-9 && yarn release:standalone
-
- - name: Sanity test standalone release
- run: yarn test:standalone-release
-
- - name: Build packages with nfpm
- run: yarn package
-
- - name: Upload release artifacts
- uses: actions/upload-artifact@v2
- with:
- name: release-packages
- path: ./release-packages
-
- # NOTE@oxy:
- # We use Ubuntu 16.04 here, so that our build is more compatible
- # with older libc versions. We used to (Q1'20) use CentOS 7 here,
- # but it has a full update EOL of Q4'20 and a 'critical security'
- # update EOL of 2024. We're dropping full support a few years before
- # the final EOL, but I don't believe CentOS 7 has a large arm64 userbase.
- # It is not feasible to cross-compile with CentOS.
-
- # Cross-compile notes: To compile native dependencies for arm64,
- # we install the aarch64 cross toolchain and then set it as the default
- # compiler/linker/etc. with the AR/CC/CXX/LINK environment variables.
- # qemu-user-static on ubuntu-16.04 currently doesn't run Node correctly,
- # so we just build with "native"/x86_64 node, then download arm64 node
- # and then put it in our release. We can't smoke test the arm64 build this way,
- # but this means we don't need to maintain a self-hosted runner!
- package-linux-arm64:
- name: Linux ARM64 cross-compile build
- needs: build
- runs-on: ubuntu-16.04
- env:
- AR: aarch64-linux-gnu-ar
- CC: aarch64-linux-gnu-gcc
- CXX: aarch64-linux-gnu-g++
- LINK: aarch64-linux-gnu-g++
- NPM_CONFIG_ARCH: arm64
-
- steps:
- - uses: actions/checkout@v2
-
- - name: Install Node.js v12
- uses: actions/setup-node@v2
- with:
- node-version: "12"
-
- - name: Install nfpm
- run: |
- curl -sfL https://install.goreleaser.com/github.com/goreleaser/nfpm.sh | sh -s -- -b ~/.local/bin v2.3.1
- echo "$HOME/.local/bin" >> $GITHUB_PATH
-
- - name: Install cross-compiler
- run: sudo apt install g++-aarch64-linux-gnu
-
- - name: Download npm package
- uses: actions/download-artifact@v2
- with:
- name: npm-package
-
- - name: Decompress npm package
- run: tar -xzf package.tar.gz
-
- - name: Build standalone release
- run: yarn release:standalone
-
- - name: Replace node with arm64 equivalent
- run: |
- wget https://nodejs.org/dist/v12.18.4/node-v12.18.4-linux-arm64.tar.gz
- tar -xzf node-v12.18.4-linux-arm64.tar.gz node-v12.18.4-linux-arm64/bin/node --strip-components=2
- mv ./node ./release-standalone/lib/node
-
- - name: Build packages with nfpm
- run: yarn package arm64
-
- - name: Upload release artifacts
- uses: actions/upload-artifact@v2
- with:
- name: release-packages
- path: ./release-packages
-
- package-macos-amd64:
- name: x86-64 macOS build
- needs: build
- runs-on: macos-latest
- steps:
- - uses: actions/checkout@v2
-
- - name: Install Node.js v12
- uses: actions/setup-node@v2
- with:
- node-version: "12"
-
- - name: Install nfpm
- run: |
- curl -sfL https://install.goreleaser.com/github.com/goreleaser/nfpm.sh | sh -s -- -b ~/.local/bin v2.3.1
- echo "$HOME/.local/bin" >> $GITHUB_PATH
-
- - name: Download npm package
- uses: actions/download-artifact@v2
- with:
- name: npm-package
-
- - name: Decompress npm package
- run: tar -xzf package.tar.gz
-
- - name: Build standalone release
- run: yarn release:standalone
-
- - name: Sanity test standalone release
- run: yarn test:standalone-release
-
- - name: Build packages with nfpm
- run: yarn package
-
- - name: Upload release artifacts
- uses: actions/upload-artifact@v2
- with:
- name: release-packages
- path: ./release-packages
-
- test-e2e:
- name: End-to-end tests
- needs: package-linux-amd64
- runs-on: ubuntu-latest
- env:
- PASSWORD: e45432jklfdsab
- CODE_SERVER_ADDRESS: http://localhost:8080
- steps:
- - uses: actions/checkout@v2
-
- - name: Install Node.js v12
- uses: actions/setup-node@v2
- with:
- node-version: "12"
-
- - name: Install playwright
- uses: microsoft/playwright-github-action@v1
-
- - name: Fetch dependencies from cache
- id: cache-yarn
- uses: actions/cache@v2
- with:
- path: "**/node_modules"
- key: yarn-build-${{ hashFiles('**/yarn.lock') }}
-
- - name: Download release packages
- uses: actions/download-artifact@v2
- with:
- name: release-packages
- path: ./release-packages
-
- - name: Untar code-server file
- run: |
- cd release-packages && tar -xzf code-server*-linux-amd64.tar.gz
-
- - name: Install dependencies
- if: steps.cache-yarn.outputs.cache-hit != 'true'
- run: yarn --frozen-lockfile
-
- # HACK: this shouldn't need to exist, but put it here anyway
- # in an attempt to solve Playwright cache failures.
- - name: Reinstall playwright
- if: steps.cache-yarn.outputs.cache-hit == 'true'
- run: |
- cd test/
- rm -r node_modules/playwright
- yarn install --check-files
-
- - name: Run end-to-end tests
- run: |
- ./release-packages/code-server*-linux-amd64/bin/code-server --log trace &
- yarn test:e2e
-
- - name: Upload test artifacts
- if: always()
- uses: actions/upload-artifact@v2
- with:
- name: failed-test-videos
- path: ./test/test-results
-
- - name: Remove release packages and test artifacts
- run: rm -rf ./release-packages ./test/test-results
-
- docker-amd64:
- runs-on: ubuntu-latest
- needs: package-linux-amd64
- steps:
- - uses: actions/checkout@v2
-
- - name: Download release package
- uses: actions/download-artifact@v2
- with:
- name: release-packages
- path: ./release-packages
-
- - name: Run ./ci/steps/build-docker-image.sh
- run: ./ci/steps/build-docker-image.sh
-
- - name: Upload release image
- uses: actions/upload-artifact@v2
- with:
- name: release-images
- path: ./release-images
-
- # TODO: this is the last place where we use our self-hosted arm64 runner.
- # In the future, consider switching to docker buildx + qemu,
- # thus removing the requirement for us to maintain the runner.
- docker-arm64:
- runs-on: ubuntu-arm64-latest
- needs: package-linux-arm64
- steps:
- - uses: actions/checkout@v2
-
- - name: Download release package
- uses: actions/download-artifact@v2
- with:
- name: release-packages
- path: ./release-packages
-
- - name: Run ./ci/steps/build-docker-image.sh
- run: ./ci/steps/build-docker-image.sh
-
- - name: Upload release image
- uses: actions/upload-artifact@v2
- with:
- name: release-images
- path: ./release-images
-
- trivy-scan-image:
- runs-on: ubuntu-20.04
- needs: docker-amd64
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v2
-
- - name: Download release images
- uses: actions/download-artifact@v2
- with:
- name: release-images
- path: ./release-images
-
- - name: Run Trivy vulnerability scanner in image mode
- # Commit SHA for v0.0.14
- uses: aquasecurity/trivy-action@b38389f8efef9798810fe0c5b5096ac198cffd54
- with:
- input: "./release-images/code-server-amd64-*.tar"
- scan-type: "image"
- ignore-unfixed: true
- format: "template"
- template: "@/contrib/sarif.tpl"
- output: "trivy-image-results.sarif"
- severity: "HIGH,CRITICAL"
-
- - name: Upload Trivy scan results to GitHub Security tab
- uses: github/codeql-action/upload-sarif@v1
- with:
- sarif_file: "trivy-image-results.sarif"
-
- # We have to use two trivy jobs
- # because GitHub only allows
- # codeql/upload-sarif action per job
- trivy-scan-repo:
- runs-on: ubuntu-20.04
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v2
-
- - name: Run Trivy vulnerability scanner in repo mode
- # Commit SHA for v0.0.14
- uses: aquasecurity/trivy-action@b38389f8efef9798810fe0c5b5096ac198cffd54
- with:
- scan-type: "fs"
- scan-ref: "."
- ignore-unfixed: true
- format: "template"
- template: "@/contrib/sarif.tpl"
- output: "trivy-repo-results.sarif"
- severity: "HIGH,CRITICAL"
-
- - name: Upload Trivy scan results to GitHub Security tab
- uses: github/codeql-action/upload-sarif@v1
- with:
- sarif_file: "trivy-repo-results.sarif"
diff --git a/lib/vscode/.github/workflows/ci.yml b/.github/workflows/ci.yml
similarity index 99%
rename from lib/vscode/.github/workflows/ci.yml
rename to .github/workflows/ci.yml
index d08dac3c03b9..faac7802508d 100644
--- a/lib/vscode/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -244,6 +244,9 @@ jobs:
- name: Run Valid Layers Checks
run: yarn valid-layers-check
+ - name: Compile /build/
+ run: yarn --cwd build compile
+
- name: Run Monaco Editor Checks
run: yarn monaco-compile-check
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
deleted file mode 100644
index 3b41e3d9b2ad..000000000000
--- a/.github/workflows/codeql-analysis.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-name: "Code Scanning"
-
-on:
- push:
- branches: [main]
- pull_request:
- # The branches below must be a subset of the branches above
- branches: [main]
- schedule:
- # Runs every Monday morning PST
- - cron: "17 15 * * 1"
-
-jobs:
- analyze:
- name: Analyze
- runs-on: ubuntu-20.04
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v2
-
- # Initializes the CodeQL tools for scanning.
- - name: Initialize CodeQL
- uses: github/codeql-action/init@v1
- with:
- config-file: ./.github/codeql-config.yml
- languages: javascript
-
- - name: Autobuild
- uses: github/codeql-action/autobuild@v1
-
- - name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v1
diff --git a/lib/vscode/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
similarity index 100%
rename from lib/vscode/.github/workflows/codeql.yml
rename to .github/workflows/codeql.yml
diff --git a/lib/vscode/.github/workflows/deep-classifier-monitor.yml b/.github/workflows/deep-classifier-monitor.yml
similarity index 100%
rename from lib/vscode/.github/workflows/deep-classifier-monitor.yml
rename to .github/workflows/deep-classifier-monitor.yml
diff --git a/lib/vscode/.github/workflows/deep-classifier-runner.yml b/.github/workflows/deep-classifier-runner.yml
similarity index 100%
rename from lib/vscode/.github/workflows/deep-classifier-runner.yml
rename to .github/workflows/deep-classifier-runner.yml
diff --git a/lib/vscode/.github/workflows/deep-classifier-scraper.yml b/.github/workflows/deep-classifier-scraper.yml
similarity index 100%
rename from lib/vscode/.github/workflows/deep-classifier-scraper.yml
rename to .github/workflows/deep-classifier-scraper.yml
diff --git a/lib/vscode/.github/workflows/devcontainer-cache.yml b/.github/workflows/devcontainer-cache.yml
similarity index 100%
rename from lib/vscode/.github/workflows/devcontainer-cache.yml
rename to .github/workflows/devcontainer-cache.yml
diff --git a/lib/vscode/.github/workflows/english-please.yml b/.github/workflows/english-please.yml
similarity index 100%
rename from lib/vscode/.github/workflows/english-please.yml
rename to .github/workflows/english-please.yml
diff --git a/lib/vscode/.github/workflows/feature-request.yml b/.github/workflows/feature-request.yml
similarity index 100%
rename from lib/vscode/.github/workflows/feature-request.yml
rename to .github/workflows/feature-request.yml
diff --git a/lib/vscode/.github/workflows/latest-release-monitor.yml b/.github/workflows/latest-release-monitor.yml
similarity index 100%
rename from lib/vscode/.github/workflows/latest-release-monitor.yml
rename to .github/workflows/latest-release-monitor.yml
diff --git a/lib/vscode/.github/workflows/locker.yml b/.github/workflows/locker.yml
similarity index 100%
rename from lib/vscode/.github/workflows/locker.yml
rename to .github/workflows/locker.yml
diff --git a/lib/vscode/.github/workflows/needs-more-info-closer.yml b/.github/workflows/needs-more-info-closer.yml
similarity index 100%
rename from lib/vscode/.github/workflows/needs-more-info-closer.yml
rename to .github/workflows/needs-more-info-closer.yml
diff --git a/lib/vscode/.github/workflows/no-yarn-lock-changes.yml b/.github/workflows/no-yarn-lock-changes.yml
similarity index 100%
rename from lib/vscode/.github/workflows/no-yarn-lock-changes.yml
rename to .github/workflows/no-yarn-lock-changes.yml
diff --git a/lib/vscode/.github/workflows/on-comment.yml b/.github/workflows/on-comment.yml
similarity index 100%
rename from lib/vscode/.github/workflows/on-comment.yml
rename to .github/workflows/on-comment.yml
diff --git a/lib/vscode/.github/workflows/on-label.yml b/.github/workflows/on-label.yml
similarity index 100%
rename from lib/vscode/.github/workflows/on-label.yml
rename to .github/workflows/on-label.yml
diff --git a/lib/vscode/.github/workflows/on-open.yml b/.github/workflows/on-open.yml
similarity index 100%
rename from lib/vscode/.github/workflows/on-open.yml
rename to .github/workflows/on-open.yml
diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml
deleted file mode 100644
index 361c47ae7c33..000000000000
--- a/.github/workflows/publish.yaml
+++ /dev/null
@@ -1,53 +0,0 @@
-name: publish
-
-on:
- # Shows the manual trigger in GitHub UI
- # helpful as a back-up in case the GitHub Actions Workflow fails
- workflow_dispatch:
-
- release:
- types: [published]
-
-jobs:
- # NOTE: this job requires curl, jq and yarn
- # All of them are included in ubuntu-latest.
- npm:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
-
- - name: Run ./ci/steps/publish-npm.sh
- run: ./ci/steps/publish-npm.sh
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
-
- # NOTE: this job requires curl, jq and docker
- # All of them are included in ubuntu-latest.
- docker:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
-
- - name: Run ./ci/steps/push-docker-manifest.sh
- run: ./ci/steps/push-docker-manifest.sh
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
- DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
-
- homebrew:
- # The newest version of code-server needs to be available on npm when this runs
- # otherwise, it will 404 and won't open a PR to bump version on homebrew/homebrew-core
- needs: npm
- runs-on: macos-latest
- steps:
- - uses: actions/checkout@v2
- - name: Configure git
- run: |
- git config user.name github-actions
- git config user.email github-actions@github.com
- - name: Bump code-server homebrew version
- env:
- HOMEBREW_GITHUB_API_TOKEN: ${{secrets.HOMEBREW_GITHUB_API_TOKEN}}
- run: ./ci/steps/brew-bump.sh
diff --git a/lib/vscode/.github/workflows/release-pipeline-labeler.yml b/.github/workflows/release-pipeline-labeler.yml
similarity index 100%
rename from lib/vscode/.github/workflows/release-pipeline-labeler.yml
rename to .github/workflows/release-pipeline-labeler.yml
diff --git a/lib/vscode/.github/workflows/rich-navigation.yml b/.github/workflows/rich-navigation.yml
similarity index 100%
rename from lib/vscode/.github/workflows/rich-navigation.yml
rename to .github/workflows/rich-navigation.yml
diff --git a/lib/vscode/.github/workflows/test-plan-item-validator.yml b/.github/workflows/test-plan-item-validator.yml
similarity index 100%
rename from lib/vscode/.github/workflows/test-plan-item-validator.yml
rename to .github/workflows/test-plan-item-validator.yml
diff --git a/.gitignore b/.gitignore
index 736e30c59648..11a7486bf533 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,20 +1,18 @@
-.tsbuildinfo
+.DS_Store
.cache
-dist*
-out*
-release/
-release-npm-package/
-release-standalone/
-release-packages/
-release-gcp/
-release-images/
-node_modules
-/lib/vscode/node_modules.asar
-node-*
-/plugins
-/lib/coder-cloud-agent
-.home
-coverage
-**/.DS_Store
-# Failed e2e test videos are saved here
-test/test-results
+npm-debug.log
+Thumbs.db
+node_modules/
+.build/
+extensions/**/dist/
+/out*/
+/extensions/**/out/
+src/vs/server
+resources/server
+build/node_modules
+coverage/
+test_data/
+test-results/
+yarn-error.log
+vscode.lsif
+vscode.db
diff --git a/lib/vscode/.mailmap b/.mailmap
similarity index 100%
rename from lib/vscode/.mailmap
rename to .mailmap
diff --git a/lib/vscode/.mention-bot b/.mention-bot
similarity index 100%
rename from lib/vscode/.mention-bot
rename to .mention-bot
diff --git a/.prettierrc.yaml b/.prettierrc.yaml
deleted file mode 100644
index a0634116d20d..000000000000
--- a/.prettierrc.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-printWidth: 120
-semi: false
-trailingComma: all
-arrowParens: always
diff --git a/.stylelintrc.yaml b/.stylelintrc.yaml
deleted file mode 100644
index af5c94bc4f3e..000000000000
--- a/.stylelintrc.yaml
+++ /dev/null
@@ -1,2 +0,0 @@
-extends:
- - stylelint-config-recommended
diff --git a/.tours/contributing.tour b/.tours/contributing.tour
deleted file mode 100644
index 1dd8e6b2ab8e..000000000000
--- a/.tours/contributing.tour
+++ /dev/null
@@ -1,151 +0,0 @@
-{
- "$schema": "https://aka.ms/codetour-schema",
- "title": "Contributing",
- "steps": [
- {
- "directory": "src",
- "line": 1,
- "description": "Hello world! code-server's source code lives here in `src` (see the explorer). It's broadly arranged into browser code, Node code, and code shared between both."
- },
- {
- "file": "src/node/entry.ts",
- "line": 157,
- "description": "code-server begins execution here. CLI arguments are parsed, special flags like --help are handled, then the HTTP server is started."
- },
- {
- "file": "src/node/cli.ts",
- "line": 28,
- "description": "This describes all of the code-server CLI options and how they will be parsed."
- },
- {
- "file": "src/node/cli.ts",
- "line": 233,
- "description": "Here's the actual CLI parser."
- },
- {
- "file": "src/node/settings.ts",
- "line": 1,
- "description": "code-server maintains a settings file that is read and written here."
- },
- {
- "file": "src/node/app.ts",
- "line": 11,
- "description": "The core of code-server are HTTP and web socket servers which are created here. They provide authentication, file access, an API, and serve web-based applications like VS Code."
- },
- {
- "file": "src/node/wsRouter.ts",
- "line": 38,
- "description": "This is an analog to Express's Router that handles web socket routes."
- },
- {
- "file": "src/node/http.ts",
- "line": 1,
- "description": "This file provides various HTTP utility functions."
- },
- {
- "file": "src/node/coder_cloud.ts",
- "line": 9,
- "description": "The cloud agent spawned here provides the --link functionality."
- },
- {
- "file": "src/node/heart.ts",
- "line": 7,
- "description": "code-server's heart beats to indicate recent activity.\n\nAlso documented here: [https://github.com/cdr/code-server/blob/master/docs/FAQ.md#heartbeat-file](https://github.com/cdr/code-server/blob/master/docs/FAQ.md#heartbeat-file)"
- },
- {
- "file": "src/node/socket.ts",
- "line": 13,
- "description": "We pass sockets to child processes, however we can't pass TLS sockets so when code-server is handling TLS (via --cert) we use this to create a proxy that can be passed to the child."
- },
- {
- "directory": "src/node/routes",
- "line": 1,
- "description": "code-server's routes live here in `src/node/routes` (see the explorer)."
- },
- {
- "file": "src/node/routes/index.ts",
- "line": 123,
- "description": "The architecture of code-server allows it to be extended with applications via plugins. Each application is registered at its own route and handles requests at and below that route. Currently we have only VS Code (although it is not yet actually split out into a plugin)."
- },
- {
- "file": "src/node/plugin.ts",
- "line": 103,
- "description": "The previously mentioned plugins are loaded here."
- },
- {
- "file": "src/node/routes/apps.ts",
- "line": 12,
- "description": "This provides a list of the applications registered with code-server."
- },
- {
- "file": "src/node/routes/domainProxy.ts",
- "line": 18,
- "description": "code-server provides a built-in proxy to help in developing web-based applications. This is the code for the domain-based proxy.\n\nAlso documented here: [https://github.com/cdr/code-server/blob/master/docs/FAQ.md#how-do-i-securely-access-web-services](https://github.com/cdr/code-server/blob/master/docs/FAQ.md#how-do-i-securely-access-web-services)"
- },
- {
- "file": "src/node/routes/pathProxy.ts",
- "line": 19,
- "description": "Here is the path-based version of the proxy.\n\nAlso documented here: [https://github.com/cdr/code-server/blob/master/docs/FAQ.md#how-do-i-securely-access-web-services](https://github.com/cdr/code-server/blob/master/docs/FAQ.md#how-do-i-securely-access-web-services)"
- },
- {
- "file": "src/node/proxy.ts",
- "line": 4,
- "description": "Both the domain and path proxy use the single proxy instance created here."
- },
- {
- "file": "src/node/routes/health.ts",
- "line": 5,
- "description": "A simple endpoint that lets you see if code-server is up.\n\nAlso documented here: [https://github.com/cdr/code-server/blob/master/docs/FAQ.md#healthz-endpoint](https://github.com/cdr/code-server/blob/master/docs/FAQ.md#healthz-endpoint)"
- },
- {
- "file": "src/node/routes/login.ts",
- "line": 46,
- "description": "code-server supports a password-based login here."
- },
- {
- "file": "src/node/routes/static.ts",
- "line": 16,
- "description": "This serves static assets. Anything under the code-server directory can be fetched. Anything outside requires authentication."
- },
- {
- "file": "src/node/routes/update.ts",
- "line": 10,
- "description": "This endpoint lets you query for the latest code-server version. It's used to power the update popup you see in VS Code."
- },
- {
- "file": "src/node/routes/vscode.ts",
- "line": 15,
- "description": "This is the endpoint that serves VS Code's HTML, handles VS Code's websockets, and handles a few VS Code-specific endpoints for fetching static files."
- },
- {
- "file": "src/node/vscode.ts",
- "line": 13,
- "description": "The actual VS Code spawn and initialization is handled here. VS Code runs in a separate child process. We communicate via IPC and by passing it web sockets."
- },
- {
- "file": "src/browser/serviceWorker.ts",
- "line": 1,
- "description": "The service worker only exists to provide PWA functionality."
- },
- {
- "directory": "src/browser/pages",
- "line": 1,
- "description": "HTML, CSS, and JavaScript for each page lives in here `src/browser/pages` (see the explorer). Currently our HTML uses a simple search and replace template system with variables that {{LOOK_LIKE_THIS}}."
- },
- {
- "file": "src/browser/pages/vscode.html",
- "line": 1,
- "description": "The VS Code HTML is based off VS Code's own `workbench.html`."
- },
- {
- "directory": "src/browser/media",
- "line": 1,
- "description": "Static images and the manifest live here in `src/browser/media` (see the explorer)."
- },
- {
- "directory": "lib/vscode",
- "line": 1,
- "description": "code-server makes use of VS Code's frontend web/remote support. Most of the modifications implement the remote server since that portion of the code is closed source and not released with VS Code.\n\nWe also have a few bug fixes and have added some features (like client-side extensions). See [https://github.com/cdr/code-server/blob/master/docs/CONTRIBUTING.md#modifications-to-vs-code](https://github.com/cdr/code-server/blob/master/docs/CONTRIBUTING.md#modifications-to-vs-code) for a list.\n\nWe make an effort to keep the modifications as few as possible."
- }
- ]
-}
\ No newline at end of file
diff --git a/.tours/start-development.tour b/.tours/start-development.tour
deleted file mode 100644
index 4df15077d36f..000000000000
--- a/.tours/start-development.tour
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "$schema": "https://aka.ms/codetour-schema",
- "title": "Start Development",
- "steps": [
- {
- "file": "package.json",
- "line": 31,
- "description": "## Commands\n\nTo start developing, make sure you have Node 12+ and the [required dependencies](https://github.com/Microsoft/vscode/wiki/How-to-Contribute#prerequisites) installed. Then, run the following commands:\n\n1. Install dependencies:\n>> yarn\n\n3. Start development mode (and watch for changes):\n>> yarn watch"
- },
- {
- "file": "src/node/app.ts",
- "line": 68,
- "description": "## Visit the web server\n\nIf all goes well, you should see something like this in your terminal. code-server should be live in development mode.\n\n---\n```bash\n[2020-12-09T21:03:37.156Z] info code-server 3.7.4 development\n[2020-12-09T21:03:37.157Z] info Using user-data-dir ~/.local/share/code-server\n[2020-12-09T21:03:37.165Z] info Using config file ~/.config/code-server/config.yaml\n[2020-12-09T21:03:37.165Z] info HTTP server listening on http://127.0.0.1:8080 \n[2020-12-09T21:03:37.165Z] info - Authentication is enabled\n[2020-12-09T21:03:37.165Z] info - Using password from ~/.config/code-server/config.yaml\n[2020-12-09T21:03:37.165Z] info - Not serving HTTPS\n```\n\n---\n\nIf you have the default configuration, you can access it at [http://localhost:8080](http://localhost:8080)."
- },
- {
- "file": "src/browser/pages/login.html",
- "line": 26,
- "description": "## Make a change\n\nThis is the login page, let's make a change and see it update on our web server! Perhaps change the text :)\n\n```html\n
Modifying the login page ๐จ๐ผโ๐ป
\n```\n\nReminder, you can likely preview at [http://localhost:8080](http://localhost:8080)"
- },
- {
- "file": "src/node/app.ts",
- "line": 62,
- "description": "## That's it!\n\n\nThat's all there is to it! When this tour ends, your terminal session may stop, but just use `yarn watch` to start developing from here on out!\n\n\nIf you haven't already, be sure to check out these resources:\n- [Tour: Contributing](command:codetour.startTourByTitle?[\"Contributing\")\n- [Docs: FAQ.md](https://github.com/cdr/code-server/blob/master/docs/FAQ.md)\n- [Docs: CONTRIBUTING.md](https://github.com/cdr/code-server/blob/master/docs/CONTRIBUTING.md)\n- [Community: GitHub Discussions](https://github.com/cdr/code-server/discussions)\n- [Community: Slack](https://community.coder.com)"
- }
- ]
-}
diff --git a/lib/vscode/.vscode/cglicenses.schema.json b/.vscode/cglicenses.schema.json
similarity index 100%
rename from lib/vscode/.vscode/cglicenses.schema.json
rename to .vscode/cglicenses.schema.json
diff --git a/lib/vscode/.vscode/cgmanifest.schema.json b/.vscode/cgmanifest.schema.json
similarity index 100%
rename from lib/vscode/.vscode/cgmanifest.schema.json
rename to .vscode/cgmanifest.schema.json
diff --git a/lib/vscode/.vscode/extensions.json b/.vscode/extensions.json
similarity index 100%
rename from lib/vscode/.vscode/extensions.json
rename to .vscode/extensions.json
diff --git a/lib/vscode/.vscode/launch.json b/.vscode/launch.json
similarity index 100%
rename from lib/vscode/.vscode/launch.json
rename to .vscode/launch.json
diff --git a/.vscode/notebooks/api.github-issues b/.vscode/notebooks/api.github-issues
new file mode 100644
index 000000000000..112920287601
--- /dev/null
+++ b/.vscode/notebooks/api.github-issues
@@ -0,0 +1,32 @@
+[
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "#### Config"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$repo=repo:microsoft/vscode\n$milestone=milestone:\"May 2021\""
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "### Finalization"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$repo $milestone label:api-finalization"
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "### Proposals"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$repo $milestone is:open label:api-proposal "
+ }
+]
\ No newline at end of file
diff --git a/lib/vscode/.vscode/notebooks/endgame.github-issues b/.vscode/notebooks/endgame.github-issues
similarity index 99%
rename from lib/vscode/.vscode/notebooks/endgame.github-issues
rename to .vscode/notebooks/endgame.github-issues
index 881af2c14b43..bc2fba29ddf1 100644
--- a/lib/vscode/.vscode/notebooks/endgame.github-issues
+++ b/.vscode/notebooks/endgame.github-issues
@@ -7,7 +7,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "$REPOS=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-js-debug repo:microsoft/vscode-remote-release repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-remotehub\n\n$MILESTONE=milestone:\"April 2021\""
+ "value": "$REPOS=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-js-debug repo:microsoft/vscode-remote-release repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-remotehub\n\n$MILESTONE=milestone:\"May 2021\""
},
{
"kind": 1,
diff --git a/lib/vscode/.vscode/notebooks/grooming-delta.github-issues b/.vscode/notebooks/grooming-delta.github-issues
similarity index 100%
rename from lib/vscode/.vscode/notebooks/grooming-delta.github-issues
rename to .vscode/notebooks/grooming-delta.github-issues
diff --git a/lib/vscode/.vscode/notebooks/grooming.github-issues b/.vscode/notebooks/grooming.github-issues
similarity index 100%
rename from lib/vscode/.vscode/notebooks/grooming.github-issues
rename to .vscode/notebooks/grooming.github-issues
diff --git a/lib/vscode/.vscode/notebooks/inbox.github-issues b/.vscode/notebooks/inbox.github-issues
similarity index 100%
rename from lib/vscode/.vscode/notebooks/inbox.github-issues
rename to .vscode/notebooks/inbox.github-issues
diff --git a/lib/vscode/.vscode/notebooks/my-endgame.github-issues b/.vscode/notebooks/my-endgame.github-issues
similarity index 98%
rename from lib/vscode/.vscode/notebooks/my-endgame.github-issues
rename to .vscode/notebooks/my-endgame.github-issues
index c435ee77500b..aad3a8db3a90 100644
--- a/lib/vscode/.vscode/notebooks/my-endgame.github-issues
+++ b/.vscode/notebooks/my-endgame.github-issues
@@ -7,7 +7,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "$REPOS=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-js-debug repo:microsoft/vscode-remote-release repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-remotehub\n\n$MILESTONE=milestone:\"April 2021\"\n\n$MINE=assignee:@me"
+ "value": "$REPOS=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-js-debug repo:microsoft/vscode-remote-release repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-remotehub\n\n$MILESTONE=milestone:\"May 2021\"\n\n$MINE=assignee:@me"
},
{
"kind": 1,
@@ -157,7 +157,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "$REPOS $MILESTONE -$MINE is:issue is:closed sort:updated-asc label:bug -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found -author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:bamurtaugh -author:bpasero -author:btholt -author:chrisdias -author:chrmarti -author:Chuxel -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:eamodio -author:egamma -author:fiveisprime -author:gregvanl -author:isidorn -author:ItalyPaleAle -author:JacksonKearl -author:joaomoreno -author:jrieken -author:kieferrm -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:ornellaalt -author:orta -author:rebornix -author:RMacfarlane -author:roblourens -author:rzhao271 -author:sana-ajani -author:sandy081 -author:sbatten -author:stevencl -author:Tyriar -author:weinand -author:TylerLeonhardt -author:lramos15"
+ "value": "$REPOS $MILESTONE -$MINE is:issue is:closed sort:updated-asc label:bug -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found -author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:bamurtaugh -author:bpasero -author:btholt -author:chrisdias -author:chrmarti -author:Chuxel -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:eamodio -author:egamma -author:fiveisprime -author:gregvanl -author:isidorn -author:ItalyPaleAle -author:JacksonKearl -author:joaomoreno -author:jrieken -author:kieferrm -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:ornellaalt -author:orta -author:rebornix -author:RMacfarlane -author:roblourens -author:rzhao271 -author:sana-ajani -author:sandy081 -author:sbatten -author:stevencl -author:Tyriar -author:weinand -author:TylerLeonhardt -author:lramos15 -author:hediet"
},
{
"kind": 1,
diff --git a/.vscode/notebooks/my-work.github-issues b/.vscode/notebooks/my-work.github-issues
new file mode 100644
index 000000000000..77ca0e0443b5
--- /dev/null
+++ b/.vscode/notebooks/my-work.github-issues
@@ -0,0 +1,97 @@
+[
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "##### `Config`: This should be changed every month/milestone"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "// list of repos we work in\n$repos=repo:microsoft/vscode repo:microsoft/vscode-remote-release repo:microsoft/vscode-js-debug repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-internalbacklog\n\n// current milestone name\n$milestone=milestone:\"May 2021\""
+ },
+ {
+ "kind": 1,
+ "language": "github-issues",
+ "value": "## Milestone Work"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$repos $milestone assignee:@me is:open"
+ },
+ {
+ "kind": 1,
+ "language": "github-issues",
+ "value": "## Bugs, Debt, Features..."
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "#### My Bugs"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$repos assignee:@me is:open label:bug"
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "#### Debt & Engineering"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$repos assignee:@me is:open label:debt OR $repos assignee:@me is:open label:engineering"
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "#### Performance ๐ ๐ ๐"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$repos assignee:@me is:open label:perf OR $repos assignee:@me is:open label:perf-startup OR $repos assignee:@me is:open label:perf-bloat OR $repos assignee:@me is:open label:freeze-slow-crash-leak"
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "#### Feature Requests"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$repos assignee:@me is:open label:feature-request milestone:Backlog sort:reactions-+1-desc"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$repos assignee:@me is:open milestone:\"Backlog Candidates\""
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "### Personal Inbox\n"
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "\n#### Missing Type label"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$repos assignee:@me is:open type:issue -label:bug -label:\"needs more info\" -label:feature-request -label:under-discussion -label:debt -label:plan-item -label:upstream"
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "#### Not Actionable"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$repos assignee:@me is:open label:\"needs more info\""
+ }
+]
\ No newline at end of file
diff --git a/lib/vscode/.vscode/notebooks/papercuts.github-issues b/.vscode/notebooks/papercuts.github-issues
similarity index 100%
rename from lib/vscode/.vscode/notebooks/papercuts.github-issues
rename to .vscode/notebooks/papercuts.github-issues
diff --git a/lib/vscode/.vscode/notebooks/verification.github-issues b/.vscode/notebooks/verification.github-issues
similarity index 100%
rename from lib/vscode/.vscode/notebooks/verification.github-issues
rename to .vscode/notebooks/verification.github-issues
diff --git a/lib/vscode/.vscode/searches/TrustedTypes.code-search b/.vscode/searches/TrustedTypes.code-search
similarity index 100%
rename from lib/vscode/.vscode/searches/TrustedTypes.code-search
rename to .vscode/searches/TrustedTypes.code-search
diff --git a/lib/vscode/.vscode/searches/ts36031.code-search b/.vscode/searches/ts36031.code-search
similarity index 100%
rename from lib/vscode/.vscode/searches/ts36031.code-search
rename to .vscode/searches/ts36031.code-search
diff --git a/lib/vscode/.vscode/settings.json b/.vscode/settings.json
similarity index 100%
rename from lib/vscode/.vscode/settings.json
rename to .vscode/settings.json
diff --git a/lib/vscode/.vscode/shared.code-snippets b/.vscode/shared.code-snippets
similarity index 100%
rename from lib/vscode/.vscode/shared.code-snippets
rename to .vscode/shared.code-snippets
diff --git a/lib/vscode/.vscode/tasks.json b/.vscode/tasks.json
similarity index 80%
rename from lib/vscode/.vscode/tasks.json
rename to .vscode/tasks.json
index 8fb5cb440b79..c0b290afa729 100644
--- a/lib/vscode/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -55,39 +55,11 @@
}
}
},
- {
- "type": "npm",
- "script": "watch-extension-mediad",
- "label": "Ext Media - Build",
- "isBackground": true,
- "presentation": {
- "reveal": "never",
- "group": "buildWatchers"
- },
- "problemMatcher": {
- "owner": "typescript",
- "applyTo": "closedDocuments",
- "fileLocation": [
- "absolute"
- ],
- "pattern": {
- "regexp": "Error: ([^(]+)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\): (.*)$",
- "file": 1,
- "location": 2,
- "message": 3
- },
- "background": {
- "beginsPattern": "Starting compilation",
- "endsPattern": "Finished compilation"
- }
- }
- },
{
"label": "VS Code - Build",
"dependsOn": [
"Core - Build",
- "Ext - Build",
- "Ext Media - Build",
+ "Ext - Build"
],
"group": {
"kind": "build",
@@ -102,7 +74,8 @@
"group": "build",
"presentation": {
"reveal": "never",
- "group": "buildKillers"
+ "group": "buildKillers",
+ "close": true
},
"problemMatcher": "$tsc"
},
@@ -113,18 +86,8 @@
"group": "build",
"presentation": {
"reveal": "never",
- "group": "buildKillers"
- },
- "problemMatcher": "$tsc"
- },
- {
- "type": "npm",
- "script": "kill-watch-extension-mediad",
- "label": "Kill Ext Media - Build",
- "group": "build",
- "presentation": {
- "reveal": "never",
- "group": "buildKillers"
+ "group": "buildKillers",
+ "close": true
},
"problemMatcher": "$tsc"
},
@@ -132,8 +95,7 @@
"label": "Kill VS Code - Build",
"dependsOn": [
"Kill Core - Build",
- "Kill Ext - Build",
- "Kill Ext Media - Build",
+ "Kill Ext - Build"
],
"group": "build",
"problemMatcher": []
@@ -238,7 +200,8 @@
"command": "node build/lib/preLaunch.js",
"label": "Ensure Prelaunch Dependencies",
"presentation": {
- "reveal": "silent"
+ "reveal": "silent",
+ "close": true
}
},
{
diff --git a/lib/vscode/.yarnrc b/.yarnrc
similarity index 78%
rename from lib/vscode/.yarnrc
rename to .yarnrc
index 1965e671993f..ba290809667b 100644
--- a/lib/vscode/.yarnrc
+++ b/.yarnrc
@@ -1,3 +1,3 @@
disturl "https://electronjs.org/headers"
-target "12.0.4"
+target "12.0.9"
runtime "electron"
diff --git a/lib/vscode/CONTRIBUTING.md b/CONTRIBUTING.md
similarity index 100%
rename from lib/vscode/CONTRIBUTING.md
rename to CONTRIBUTING.md
diff --git a/LICENSE.txt b/LICENSE.txt
index 0270469f3670..0ac28ee234d2 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,20 +1,21 @@
-The MIT License
+MIT License
-Copyright (c) 2019 Coder Technologies Inc.
+Copyright (c) 2015 - present Microsoft Corporation
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index d472c33f8322..ac7f2194233f 100644
--- a/README.md
+++ b/README.md
@@ -1,77 +1,75 @@
-# code-server · [!["GitHub Discussions"](https://img.shields.io/badge/%20GitHub-%20Discussions-gray.svg?longCache=true&logo=github&colorB=purple)](https://github.com/cdr/code-server/discussions) [!["Join us on Slack"](https://img.shields.io/badge/join-us%20on%20slack-gray.svg?longCache=true&logo=slack&colorB=brightgreen)](https://cdr.co/join-community) [![Twitter Follow](https://img.shields.io/twitter/follow/CoderHQ?label=%40CoderHQ&style=social)](https://twitter.com/coderhq)
+# 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)
-[![codecov](https://codecov.io/gh/cdr/code-server/branch/main/graph/badge.svg?token=5iM9farjnC)](https://codecov.io/gh/cdr/code-server)
-[![See latest docs](https://img.shields.io/static/v1?label=Docs&message=see%20latest%20&color=blue)](https://github.com/cdr/code-server/tree/v3.9.3/docs)
+## The Repository
-Run [VS Code](https://github.com/Microsoft/vscode) on any machine anywhere and access it in the browser.
+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).
-![Screenshot](./docs/assets/screenshot.png)
+## Visual Studio Code
-## Highlights
+
+
+
-- Code on any device with a consistent development environment
-- Use cloud servers to speed up tests, compilations, downloads, and more
-- Preserve battery life when you're on the go; all intensive tasks run on your server
+[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/).
-## Requirements
+[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.
-For a good experience, we recommend at least:
+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).
-- 1 GB of RAM
-- 2 cores
+## Contributing
-You can use whatever linux distribution floats your boat but in our [guide](./docs/guide.md) we assume Debian on Google Cloud.
+There are many ways in which you can participate in this project, for example:
-## Getting Started
+* [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
-There are three ways you can get started:
+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:
-1. Using the [install script](./install.sh), which automates most of the process. The script uses the system package manager (if possible)
-2. Manually installing code-server; see [Installation](./docs/install.md) for instructions applicable to most use cases
-3. Use our one-click buttons and guides to [deploy code-server to a popular cloud provider](https://github.com/cdr/deploy-code-server) โก
+* [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)
-If you choose to use the install script, you can preview what occurs during the install process:
+## Feedback
-```bash
-curl -fsSL https://code-server.dev/install.sh | sh -s -- --dry-run
-```
+* 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)
+* Follow [@code](https://twitter.com/code) and let us know what you think!
-To install, run:
+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.
-```bash
-curl -fsSL https://code-server.dev/install.sh | sh
-```
+## Related Projects
-When done, the install script prints out instructions for running and starting code-server.
+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) have their own repositories. 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).
-We also have an in-depth [setup and configuration](./docs/guide.md) guide.
+## Bundled Extensions
-### code-server --link
+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` provides rich language support for `JSON`.
-We're working on a cloud platform that makes deploying and managing code-server easier.
-Consider running code-server with the beta flag `--link` if you don't want to worry about
+## Development Container
-- TLS
-- Authentication
-- Port Forwarding
+This repository includes a Visual Studio Code Remote - Containers / GitHub Codespaces development container.
-```bash
-$ code-server --link
-Proxying code-server, you can access your IDE at https://valmar-jon.cdr.co
-```
+- For [Remote - Containers](https://aka.ms/vscode-remote/download/containers), use the **Remote-Containers: Clone Repository in Container Volume...** command which creates a Docker volume for better disk I/O on macOS and Windows.
+- For Codespaces, install the [Github Codespaces](https://marketplace.visualstudio.com/items?itemName=GitHub.codespacese) extension in VS Code, and use the **Codespaces: Create New Codespace** command.
-## FAQ
+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.
-See [./docs/FAQ.md](./docs/FAQ.md).
+## Code of Conduct
-## Want to help?
+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.
-See [CONTRIBUTING](./docs/CONTRIBUTING.md) for details.
+## License
-## Hiring
+Copyright (c) Microsoft Corporation. All rights reserved.
-Interested in [working at Coder](https://coder.com)? Check out [our open positions](https://jobs.lever.co/coder)!
-
-## For Organizations
-
-Visit [our website](https://coder.com) for more information about remote development for your organization or enterprise.
+Licensed under the [MIT](LICENSE.txt) license.
diff --git a/lib/vscode/SECURITY.md b/SECURITY.md
similarity index 100%
rename from lib/vscode/SECURITY.md
rename to SECURITY.md
diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt
index fd6f420e235e..d929c6b59e78 100644
--- a/ThirdPartyNotices.txt
+++ b/ThirdPartyNotices.txt
@@ -1,22 +1,2886 @@
-code-server
+microsoft-vscode
THIRD-PARTY SOFTWARE NOTICES AND INFORMATION
Do Not Translate or Localize
-1. Microsoft/vscode version 1.47.0 (https://github.com/Microsoft/vscode)
+This project incorporates components from the projects listed below. The original copyright notices and the licenses under which Microsoft received such components are set forth below. Microsoft reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise.
-%% Microsoft/vscode NOTICES AND INFORMATION BEGIN HERE
+1. atom/language-clojure version 0.22.7 (https://github.com/atom/language-clojure)
+2. atom/language-coffee-script version 0.49.3 (https://github.com/atom/language-coffee-script)
+3. atom/language-css version 0.44.4 (https://github.com/atom/language-css)
+4. atom/language-java version 0.32.1 (https://github.com/atom/language-java)
+5. atom/language-sass version 0.62.1 (https://github.com/atom/language-sass)
+6. atom/language-shellscript version 0.26.0 (https://github.com/atom/language-shellscript)
+7. atom/language-xml version 0.35.2 (https://github.com/atom/language-xml)
+8. better-go-syntax version 1.0.0 (https://github.com/jeff-hykin/better-go-syntax/ )
+9. Colorsublime-Themes version 0.1.0 (https://github.com/Colorsublime/Colorsublime-Themes)
+10. daaain/Handlebars version 1.8.0 (https://github.com/daaain/Handlebars)
+11. dart-lang/dart-syntax-highlight (https://github.com/dart-lang/dart-syntax-highlight)
+12. davidrios/pug-tmbundle (https://github.com/davidrios/pug-tmbundle)
+13. definitelytyped (https://github.com/DefinitelyTyped/DefinitelyTyped)
+14. demyte/language-cshtml version 0.3.0 (https://github.com/demyte/language-cshtml)
+15. Document Object Model version 4.0.0 (https://www.w3.org/DOM/)
+16. dotnet/csharp-tmLanguage version 0.1.0 (https://github.com/dotnet/csharp-tmLanguage)
+17. expand-abbreviation version 0.5.8 (https://github.com/emmetio/expand-abbreviation)
+18. fadeevab/make.tmbundle (https://github.com/fadeevab/make.tmbundle)
+19. freebroccolo/atom-language-swift (https://github.com/freebroccolo/atom-language-swift)
+20. HTML 5.1 W3C Working Draft version 08 October 2015 (http://www.w3.org/TR/2015/WD-html51-20151008/)
+21. Ikuyadeu/vscode-R version 1.3.0 (https://github.com/Ikuyadeu/vscode-R)
+22. insane version 2.6.2 (https://github.com/bevacqua/insane)
+23. Ionic documentation version 1.2.4 (https://github.com/ionic-team/ionic-site)
+24. ionide/ionide-fsgrammar (https://github.com/ionide/ionide-fsgrammar)
+25. jeff-hykin/cpp-textmate-grammar version 1.12.11 (https://github.com/jeff-hykin/cpp-textmate-grammar)
+26. jeff-hykin/cpp-textmate-grammar version 1.15.5 (https://github.com/jeff-hykin/cpp-textmate-grammar)
+27. js-beautify version 1.6.8 (https://github.com/beautify-web/js-beautify)
+28. JuliaEditorSupport/atom-language-julia version 0.21.0 (https://github.com/JuliaEditorSupport/atom-language-julia)
+29. Jxck/assert version 1.0.0 (https://github.com/Jxck/assert)
+30. language-docker (https://github.com/moby/moby)
+31. language-less version 0.34.2 (https://github.com/atom/language-less)
+32. language-php version 0.46.2 (https://github.com/atom/language-php)
+33. MagicStack/MagicPython version 1.1.1 (https://github.com/MagicStack/MagicPython)
+34. marked version 1.1.0 (https://github.com/markedjs/marked)
+35. mdn-data version 1.1.12 (https://github.com/mdn/data)
+36. microsoft/TypeScript-TmLanguage version 0.0.1 (https://github.com/microsoft/TypeScript-TmLanguage)
+37. microsoft/vscode-JSON.tmLanguage (https://github.com/microsoft/vscode-JSON.tmLanguage)
+38. microsoft/vscode-markdown-tm-grammar version 1.0.0 (https://github.com/microsoft/vscode-markdown-tm-grammar)
+39. microsoft/vscode-mssql version 1.9.0 (https://github.com/microsoft/vscode-mssql)
+40. mmims/language-batchfile version 0.7.6 (https://github.com/mmims/language-batchfile)
+41. NVIDIA/cuda-cpp-grammar (https://github.com/NVIDIA/cuda-cpp-grammar)
+42. PowerShell/EditorSyntax version 1.0.0 (https://github.com/PowerShell/EditorSyntax)
+43. rust-syntax version 0.4.3 (https://github.com/dustypomerleau/rust-syntax)
+44. seti-ui version 0.1.0 (https://github.com/jesseweed/seti-ui)
+45. shaders-tmLanguage version 0.1.0 (https://github.com/tgjones/shaders-tmLanguage)
+46. textmate/asp.vb.net.tmbundle (https://github.com/textmate/asp.vb.net.tmbundle)
+47. textmate/c.tmbundle (https://github.com/textmate/c.tmbundle)
+48. textmate/diff.tmbundle (https://github.com/textmate/diff.tmbundle)
+49. textmate/git.tmbundle (https://github.com/textmate/git.tmbundle)
+50. textmate/groovy.tmbundle (https://github.com/textmate/groovy.tmbundle)
+51. textmate/html.tmbundle (https://github.com/textmate/html.tmbundle)
+52. textmate/ini.tmbundle (https://github.com/textmate/ini.tmbundle)
+53. textmate/javascript.tmbundle (https://github.com/textmate/javascript.tmbundle)
+54. textmate/lua.tmbundle (https://github.com/textmate/lua.tmbundle)
+55. textmate/markdown.tmbundle (https://github.com/textmate/markdown.tmbundle)
+56. textmate/perl.tmbundle (https://github.com/textmate/perl.tmbundle)
+57. textmate/ruby.tmbundle (https://github.com/textmate/ruby.tmbundle)
+58. textmate/yaml.tmbundle (https://github.com/textmate/yaml.tmbundle)
+59. TypeScript-TmLanguage version 0.1.8 (https://github.com/microsoft/TypeScript-TmLanguage)
+60. TypeScript-TmLanguage version 1.0.0 (https://github.com/microsoft/TypeScript-TmLanguage)
+61. Unicode version 12.0.0 (https://home.unicode.org/)
+62. vscode-codicons version 0.0.14 (https://github.com/microsoft/vscode-codicons)
+63. vscode-logfile-highlighter version 2.11.0 (https://github.com/emilast/vscode-logfile-highlighter)
+64. vscode-swift version 0.0.1 (https://github.com/owensd/vscode-swift)
+65. Web Background Synchronization (https://github.com/WICG/background-sync)
+
+
+%% atom/language-clojure NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) 2014 GitHub Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+This package was derived from a TextMate bundle located at
+https://github.com/mmcgrana/textmate-clojure and distributed under the
+following license, located in `LICENSE.md`:
+
+The MIT License (MIT)
+
+Copyright (c) 2010- Mark McGranaghan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+=========================================
+END OF atom/language-clojure NOTICES AND INFORMATION
+
+%% atom/language-coffee-script NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2014 GitHub Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+This package was derived from a TextMate bundle located at
+https://github.com/jashkenas/coffee-script-tmbundle and distributed under the
+following license, located in `LICENSE`:
+
+Copyright (c) 2009-2014 Jeremy Ashkenas
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF atom/language-coffee-script NOTICES AND INFORMATION
+
+%% atom/language-css NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) 2014 GitHub Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+--------------------------------------------------------------------
+
+This package was derived from a TextMate bundle located at
+https://github.com/textmate/css.tmbundle and distributed under the following
+license, located in `README.mdown`:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+=========================================
+END OF atom/language-css NOTICES AND INFORMATION
+
+%% atom/language-java NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2014 GitHub Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+This package was derived from a TextMate bundle located at
+https://github.com/textmate/java.tmbundle and distributed under the following
+license, located in `README.mdown`:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+=========================================
+END OF atom/language-java NOTICES AND INFORMATION
+
+%% atom/language-sass NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2014 GitHub Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+This package was derived from a TextMate bundle located at
+https://github.com/alexsancho/Sass.tmbundle and distributed under the following
+license, located in `LICENSE.md`:
+
+Copyright (c) 2012 Alex Sancho, http://alexsancho.name/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF atom/language-sass NOTICES AND INFORMATION
+
+%% atom/language-shellscript NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2014 GitHub Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+This package was derived from a TextMate bundle located at
+https://github.com/textmate/shellscript.tmbundle and distributed under the
+following license, located in `README.mdown`:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+=========================================
+END OF atom/language-shellscript NOTICES AND INFORMATION
+
+%% atom/language-xml NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2014 GitHub Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+This package was derived from a TextMate bundle located at
+https://github.com/textmate/xml.tmbundle and distributed under the following
+license, located in `README.mdown`:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+=========================================
+END OF atom/language-xml NOTICES AND INFORMATION
+
+%% better-go-syntax NOTICES AND INFORMATION BEGIN HERE
+=========================================
+MIT License
+
+Copyright (c) 2019 Jeff Hykin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+=========================================
+END OF better-go-syntax NOTICES AND INFORMATION
+
+%% Colorsublime-Themes NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) 2015 Colorsublime.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+=========================================
+END OF Colorsublime-Themes NOTICES AND INFORMATION
+
+%% daaain/Handlebars NOTICES AND INFORMATION BEGIN HERE
+=========================================
+-- Credits
+
+Adapted from the great sublime-text-handlebars package by Nicholas Westlake.
+
+Thanks a lot to all the generous contributors (in alphabetical order): @bittersweetryan, @bradcliffe, @calumbrodie, @duncanbeevers, @hlvnst, @jonschlinkert, @Krutius, @samselikoff, @utkarshkukreti, @zeppelin
+
+-- License
+
+(The MIT License)
+
+Copyright (c) daaain/Handlebars project authors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF daaain/Handlebars NOTICES AND INFORMATION
+
+%% dart-lang/dart-syntax-highlight NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright 2020, the Dart project authors.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google LLC nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+=========================================
+END OF dart-lang/dart-syntax-highlight NOTICES AND INFORMATION
+
+%% davidrios/pug-tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2016 David Rios
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF davidrios/pug-tmbundle NOTICES AND INFORMATION
+
+%% definitelytyped NOTICES AND INFORMATION BEGIN HERE
+=========================================
+This project is licensed under the MIT license.
+Copyrights are respective of each contributor listed at the beginning of each definition file.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF definitelytyped NOTICES AND INFORMATION
+
+%% demyte/language-cshtml NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2014 James Summerton
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF demyte/language-cshtml NOTICES AND INFORMATION
+
+%% Document Object Model NOTICES AND INFORMATION BEGIN HERE
+=========================================
+W3C License
+This work is being provided by the copyright holders under the following license.
+By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.
+Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following
+on ALL copies of the work or portions thereof, including modifications:
+* The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.
+* Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included.
+* Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived
+from Document Object Model. Copyright ยฉ 2015 W3Cยฎ (MIT, ERCIM, Keio, Beihang)."
+Disclaimers
+THIS WORK IS PROVIDED "AS IS
+ AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR
+FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT.
+The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission.
+Title to copyright in this work will at all times remain with copyright holders.
+=========================================
+END OF Document Object Model NOTICES AND INFORMATION
+
+%% dotnet/csharp-tmLanguage NOTICES AND INFORMATION BEGIN HERE
+=========================================
+MIT License
+
+Copyright (c) 2016 .NET Foundation
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+=========================================
+END OF dotnet/csharp-tmLanguage NOTICES AND INFORMATION
+
+%% expand-abbreviation NOTICES AND INFORMATION BEGIN HERE
+=========================================
+MIT License
+
+Copyright (c) 2017 Emmet.io
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+=========================================
+END OF expand-abbreviation NOTICES AND INFORMATION
+
+%% fadeevab/make.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) textmate-make.tmbundle project authors
+
+If not otherwise specified (see below), files in this repository fall under the following license:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+
+An exception is made for files in readable text which contain their own license information,
+or files where an accompanying file exists (in the same directory) with a "-license" suffix added
+to the base-name name of the original file, and an extension of txt, html, or similar. For example
+"tidy" is accompanied by "tidy-license.txt".
+=========================================
+END OF fadeevab/make.tmbundle NOTICES AND INFORMATION
+
+%% freebroccolo/atom-language-swift NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2014 Darin Morrison
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF freebroccolo/atom-language-swift NOTICES AND INFORMATION
+
+%% HTML 5.1 W3C Working Draft NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright ยฉ 2015 W3Cยฎ (MIT, ERCIM, Keio, Beihang). This software or document includes material copied
+from or derived from HTML 5.1 W3C Working Draft (http://www.w3.org/TR/2015/WD-html51-20151008/.)
+
+THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT
+NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF
+THE DOCUMENT ARE SUITABLE FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY THIRD PARTY
+PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE
+DOCUMENT OR THE PERFORMANCE OR IMPLEMENTATION OF THE CONTENTS THEREOF.
+
+The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to this document or its contents
+without specific, written prior permission. Title to copyright in this document will at all times remain with copyright holders.
+=========================================
+END OF HTML 5.1 W3C Working Draft NOTICES AND INFORMATION
+
+%% Ikuyadeu/vscode-R NOTICES AND INFORMATION BEGIN HERE
+=========================================
+MIT License
+
+Copyright (c) 2019 Yuki Ueda
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+=========================================
+END OF Ikuyadeu/vscode-R NOTICES AND INFORMATION
+
+%% insane NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright ยฉ 2015 Nicolas Bevacqua
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF insane NOTICES AND INFORMATION
+
+%% Ionic documentation NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright Drifty Co. http://drifty.com/.
+
+Apache License
+
+Version 2.0, January 2004
+
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of this License; and
+
+You must cause any modified files to carry prominent notices stating that You changed the files; and
+
+You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
+
+If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+=========================================
+END OF Ionic documentation NOTICES AND INFORMATION
+
+%% ionide/ionide-fsgrammar NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2015 Krzysztof Cieslak
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+=========================================
+END OF ionide/ionide-fsgrammar NOTICES AND INFORMATION
+
+%% jeff-hykin/cpp-textmate-grammar NOTICES AND INFORMATION BEGIN HERE
+=========================================
+MIT License
+
+Copyright (c) 2019 Jeff Hykin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+=========================================
+END OF jeff-hykin/cpp-textmate-grammar NOTICES AND INFORMATION
+
+%% js-beautify NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF js-beautify NOTICES AND INFORMATION
+
+%% JuliaEditorSupport/atom-language-julia NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The atom-language-julia package is licensed under the MIT "Expat" License:
+
+> Copyright (c) 2015
+>
+> Permission is hereby granted, free of charge, to any person obtaining
+> a copy of this software and associated documentation files (the
+> "Software"), to deal in the Software without restriction, including
+> without limitation the rights to use, copy, modify, merge, publish,
+> distribute, sublicense, and/or sell copies of the Software, and to
+> permit persons to whom the Software is furnished to do so, subject to
+> the following conditions:
+>
+> The above copyright notice and this permission notice shall be
+> included in all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF JuliaEditorSupport/atom-language-julia NOTICES AND INFORMATION
+
+%% Jxck/assert NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2011 Jxck
+
+Originally from node.js (http://nodejs.org)
+Copyright Joyent, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF Jxck/assert NOTICES AND INFORMATION
+
+%% language-docker NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Apache License
+ Version 2.0, January 2004
+ https://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ Copyright 2013-2018 Docker, Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+=========================================
+END OF language-docker NOTICES AND INFORMATION
+
+%% language-less NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2014 GitHub Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+This package was derived from a TextMate bundle located at
+https://github.com/textmate/less.tmbundle and distributed under the following
+license, located in `LICENSE.md`:
+
+Copyright (c) 2010 Scott Kyle and Rasmus Andersson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+=========================================
+END OF language-less NOTICES AND INFORMATION
+
+%% language-php NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2014 GitHub Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+This package was derived from a TextMate bundle located at
+https://github.com/textmate/php.tmbundle and distributed under the following
+license, located in `README.mdown`:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+=========================================
+END OF language-php NOTICES AND INFORMATION
+
+%% MagicStack/MagicPython NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License
+
+Copyright (c) 2015-present MagicStack Inc. http://magic.io
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+=========================================
+END OF MagicStack/MagicPython NOTICES AND INFORMATION
+
+%% marked NOTICES AND INFORMATION BEGIN HERE
+=========================================
+information
+
+## Contribution License Agreement
+
+If you contribute code to this project, you are implicitly allowing your code
+to be distributed under the MIT license. You are also implicitly verifying that
+all code is your original work. ``
+
+## Marked
+
+Copyright (c) 2018+, MarkedJS (https://github.com/markedjs/)
+Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+## Markdown
+
+Copyright ยฉ 2004, John Gruber
+http://daringfireball.net/
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+* Neither the name "Markdown" nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+This software is provided by the copyright holders and contributors "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright owner or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.
+=========================================
+END OF marked NOTICES AND INFORMATION
+
+%% mdn-data NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Mozilla Public License Version 2.0
+
+Copyright (c) 2018 Mozilla Corporation
+
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
+=========================================
+END OF mdn-data NOTICES AND INFORMATION
+
+%% microsoft/TypeScript-TmLanguage NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) Microsoft Corporation
+All rights reserved.
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+=========================================
+END OF microsoft/TypeScript-TmLanguage NOTICES AND INFORMATION
+
+%% microsoft/vscode-JSON.tmLanguage NOTICES AND INFORMATION BEGIN HERE
+=========================================
+vscode-JSON.tmLanguage
+
+Copyright (c) Microsoft Corporation
+
+All rights reserved.
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
+documentation files (the ""Software""), to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
+and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF microsoft/vscode-JSON.tmLanguage NOTICES AND INFORMATION
+
+%% microsoft/vscode-markdown-tm-grammar NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) Microsoft 2018
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+=========================================
+END OF microsoft/vscode-markdown-tm-grammar NOTICES AND INFORMATION
+
+%% microsoft/vscode-mssql NOTICES AND INFORMATION BEGIN HERE
+=========================================
+------------------------------------------ START OF LICENSE -----------------------------------------
+vscode-mssql
+Copyright (c) Microsoft Corporation
+All rights reserved.
+MIT License
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+Copyright (c) 2016 Microsoft
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+----------------------------------------------- END OF LICENSE -----------------------------------------
+=========================================
+END OF microsoft/vscode-mssql NOTICES AND INFORMATION
+
+%% mmims/language-batchfile NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2021 Michael Mims
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+=========================================
+END OF mmims/language-batchfile NOTICES AND INFORMATION
+
+%% NVIDIA/cuda-cpp-grammar NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright 2021 NVIDIA Corporation
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF NVIDIA/cuda-cpp-grammar NOTICES AND INFORMATION
+
+%% PowerShell/EditorSyntax NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) Microsoft Corporation
+
+All rights reserved.
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+=========================================
+END OF PowerShell/EditorSyntax NOTICES AND INFORMATION
+
+%% rust-syntax NOTICES AND INFORMATION BEGIN HERE
+=========================================
+MIT License
+
+Copyright (c) 2020 Dustin Pomerleau
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+=========================================
+END OF rust-syntax NOTICES AND INFORMATION
+
+%% seti-ui NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) 2014 Jesse Weed
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF seti-ui NOTICES AND INFORMATION
+
+%% shaders-tmLanguage NOTICES AND INFORMATION BEGIN HERE
+=========================================
+MIT License
+
+Copyright (c) 2017 Tim Jones
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+=========================================
+END OF shaders-tmLanguage NOTICES AND INFORMATION
+
+%% textmate/asp.vb.net.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) textmate-asp.vb.net.tmbundle project authors
+
+If not otherwise specified (see below), files in this folder fall under the following license:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+
+An exception is made for files in readable text which contain their own license information,
+or files where an accompanying file exists (in the same directory) with a "-license" suffix added
+to the base-name name of the original file, and an extension of txt, html, or similar. For example
+"tidy" is accompanied by "tidy-license.txt".
+=========================================
+END OF textmate/asp.vb.net.tmbundle NOTICES AND INFORMATION
+
+%% textmate/c.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) textmate-c.tmbundle authors
+
+If not otherwise specified (see below), files in this repository fall under the following license:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+
+An exception is made for files in readable text which contain their own license information,
+or files where an accompanying file exists (in the same directory) with a "-license" suffix added
+to the base-name name of the original file, and an extension of txt, html, or similar. For example
+"tidy" is accompanied by "tidy-license.txt".
+=========================================
+END OF textmate/c.tmbundle NOTICES AND INFORMATION
+
+%% textmate/diff.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) textmate-diff.tmbundle project authors
+
+If not otherwise specified (see below), files in this repository fall under the following license:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+
+An exception is made for files in readable text which contain their own license information,
+or files where an accompanying file exists (in the same directory) with a "-license" suffix added
+to the base-name name of the original file, and an extension of txt, html, or similar. For example
+"tidy" is accompanied by "tidy-license.txt".
+=========================================
+END OF textmate/diff.tmbundle NOTICES AND INFORMATION
+
+%% textmate/git.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2008 Tim Harper
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the"
+Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF textmate/git.tmbundle NOTICES AND INFORMATION
+
+%% textmate/groovy.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) textmate-groovy.tmbundle project authors
+
+If not otherwise specified (see below), files in this repository fall under the following license:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+
+An exception is made for files in readable text which contain their own license information,
+or files where an accompanying file exists (in the same directory) with a "-license" suffix added
+to the base-name name of the original file, and an extension of txt, html, or similar. For example
+"tidy" is accompanied by "tidy-license.txt".
+=========================================
+END OF textmate/groovy.tmbundle NOTICES AND INFORMATION
+
+%% textmate/html.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) textmate-html.tmbundle project authors
+
+If not otherwise specified (see below), files in this repository fall under the following license:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+
+An exception is made for files in readable text which contain their own license information,
+or files where an accompanying file exists (in the same directory) with a "-license" suffix added
+to the base-name name of the original file, and an extension of txt, html, or similar. For example
+"tidy" is accompanied by "tidy-license.txt".
+=========================================
+END OF textmate/html.tmbundle NOTICES AND INFORMATION
+
+%% textmate/ini.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) textmate-ini.tmbundle project authors
+
+If not otherwise specified (see below), files in this folder fall under the following license:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+
+An exception is made for files in readable text which contain their own license information,
+or files where an accompanying file exists (in the same directory) with a "-license" suffix added
+to the base-name name of the original file, and an extension of txt, html, or similar. For example
+"tidy" is accompanied by "tidy-license.txt".
+=========================================
+END OF textmate/ini.tmbundle NOTICES AND INFORMATION
+
+%% textmate/javascript.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) textmate-javascript.tmbundle project authors
+
+If not otherwise specified (see below), files in this repository fall under the following license:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+
+An exception is made for files in readable text which contain their own license information,
+or files where an accompanying file exists (in the same directory) with a "-license" suffix added
+to the base-name name of the original file, and an extension of txt, html, or similar. For example
+"tidy" is accompanied by "tidy-license.txt".
+=========================================
+END OF textmate/javascript.tmbundle NOTICES AND INFORMATION
+
+%% textmate/lua.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) textmate-lua.tmbundle project authors
+
+If not otherwise specified (see below), files in this repository fall under the following license:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+
+An exception is made for files in readable text which contain their own license information,
+or files where an accompanying file exists (in the same directory) with a "-license" suffix added
+to the base-name name of the original file, and an extension of txt, html, or similar. For example
+"tidy" is accompanied by "tidy-license.txt".
+=========================================
+END OF textmate/lua.tmbundle NOTICES AND INFORMATION
+
+%% textmate/markdown.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) markdown.tmbundle authors
+
+If not otherwise specified (see below), files in this repository fall under the following license:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+
+An exception is made for files in readable text which contain their own license information,
+or files where an accompanying file exists (in the same directory) with a "-license" suffix added
+to the base-name name of the original file, and an extension of txt, html, or similar. For example
+"tidy" is accompanied by "tidy-license.txt".
+=========================================
+END OF textmate/markdown.tmbundle NOTICES AND INFORMATION
+
+%% textmate/perl.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) textmate-perl.tmbundle project authors
+
+If not otherwise specified (see below), files in this repository fall under the following license:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+
+An exception is made for files in readable text which contain their own license information,
+or files where an accompanying file exists (in the same directory) with a "-license" suffix added
+to the base-name name of the original file, and an extension of txt, html, or similar. For example
+"tidy" is accompanied by "tidy-license.txt".
+=========================================
+END OF textmate/perl.tmbundle NOTICES AND INFORMATION
+
+%% textmate/ruby.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) textmate-ruby.tmbundle project authors
+
+If not otherwise specified (see below), files in this folder fall under the following license:
+
+Permission to copy, use, modify, sell and distribute this
+software is granted. This software is provided "as is" without
+express or implied warranty, and with no claim as to its
+suitability for any purpose.
+
+An exception is made for files in readable text which contain their own license information,
+or files where an accompanying file exists (in the same directory) with a "-license" suffix added
+to the base-name name of the original file, and an extension of txt, html, or similar. For example
+"tidy" is accompanied by "tidy-license.txt".
+=========================================
+END OF textmate/ruby.tmbundle NOTICES AND INFORMATION
+
+%% textmate/yaml.tmbundle NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) 2015 FichteFoll
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF textmate/yaml.tmbundle NOTICES AND INFORMATION
+
+%% TypeScript-TmLanguage NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Copyright (c) Microsoft Corporation
+All rights reserved.
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+=========================================
+END OF TypeScript-TmLanguage NOTICES AND INFORMATION
+
+%% Unicode NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Unicode Data Files include all data files under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/,
+http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and
+http://www.unicode.org/utility/trac/browser/.
+
+Unicode Data Files do not include PDF online code charts under the
+directory http://www.unicode.org/Public/.
+
+Software includes any source code published in the Unicode Standard
+or under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/,
+http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and
+http://www.unicode.org/utility/trac/browser/.
+
+NOTICE TO USER: Carefully read the following legal agreement.
+BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S
+DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"),
+YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
+TERMS AND CONDITIONS OF THIS AGREEMENT.
+IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE
+THE DATA FILES OR SOFTWARE.
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1991-2017 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+=========================================
+END OF Unicode NOTICES AND INFORMATION
+
+%% vscode-codicons NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Attribution 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+ Considerations for licensors: Our public licenses are
+ intended for use by those authorized to give the public
+ permission to use material in ways otherwise restricted by
+ copyright and certain other rights. Our licenses are
+ irrevocable. Licensors should read and understand the terms
+ and conditions of the license they choose before applying it.
+ Licensors should also secure all rights necessary before
+ applying our licenses so that the public can reuse the
+ material as expected. Licensors should clearly mark any
+ material not subject to the license. This includes other CC-
+ licensed material, or material used under an exception or
+ limitation to copyright. More considerations for licensors:
+ wiki.creativecommons.org/Considerations_for_licensors
+
+ Considerations for the public: By using one of our public
+ licenses, a licensor grants the public permission to use the
+ licensed material under specified terms and conditions. If
+ the licensor's permission is not necessary for any reason--for
+ example, because of any applicable exception or limitation to
+ copyright--then that use is not regulated by the license. Our
+ licenses grant only permissions under copyright and certain
+ other rights that a licensor has authority to grant. Use of
+ the licensed material may still be restricted for other
+ reasons, including because others have copyright or other
+ rights in the material. A licensor may make special requests,
+ such as asking that all changes be marked or described.
+ Although not required by our licenses, you are encouraged to
+ respect those requests where reasonable. More_considerations
+ for the public:
+ wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution 4.0 International Public License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution 4.0 International Public License ("Public License"). To the
+extent this Public License may be interpreted as a contract, You are
+granted the Licensed Rights in consideration of Your acceptance of
+these terms and conditions, and the Licensor grants You such rights in
+consideration of benefits the Licensor receives from making the
+Licensed Material available under these terms and conditions.
+
+
+Section 1 -- Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Adapter's License means the license You apply to Your Copyright
+ and Similar Rights in Your contributions to Adapted Material in
+ accordance with the terms and conditions of this Public License.
+
+ c. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ d. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ e. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ f. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ g. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ h. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ i. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ j. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ k. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ a. reproduce and Share the Licensed Material, in whole or
+ in part; and
+
+ b. produce, reproduce, and Share Adapted Material.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with
+ its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in
+ all media and formats whether now known or hereafter created,
+ and to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including
+ technical modifications necessary to circumvent Effective
+ Technological Measures. For purposes of this Public License,
+ simply making modifications authorized by this Section 2(a)
+ (4) never produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ a. Offer from the Licensor -- Licensed Material. Every
+ recipient of the Licensed Material automatically
+ receives an offer from the Licensor to exercise the
+ Licensed Rights under the terms and conditions of this
+ Public License.
+
+ b. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed
+ Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not
+ licensed under this Public License, nor are publicity,
+ privacy, and/or other similar personality rights; however, to
+ the extent possible, the Licensor waives and/or agrees not to
+ assert any such rights held by the Licensor to the limited
+ extent necessary to allow You to exercise the Licensed
+ Rights, but not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this
+ Public License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society
+ under any voluntary or waivable statutory or compulsory
+ licensing scheme. In all other cases the Licensor expressly
+ reserves any right to collect such royalties.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material (including in modified
+ form), You must:
+
+ a. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by
+ the Licensor (including by pseudonym if
+ designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of
+ warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ b. indicate if You modified the Licensed Material and
+ retain an indication of any previous modifications; and
+
+ c. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+ 4. If You Share Adapted Material You produce, the Adapter's
+ License You apply must not prevent recipients of the Adapted
+ Material from complying with this Public License.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material; and
+
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+ a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+ EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+ AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+ ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+ IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+ WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+ KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+ ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+ b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+ TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+ NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+ COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+ USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+ DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+ IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the
+ violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
+
+
+=======================================================================
+
+Creative Commons is not a party to its public
+licenses. Notwithstanding, Creative Commons may elect to apply one of
+its public licenses to material it publishes and in those instances
+will be considered the "Licensor." The text of the Creative Commons
+public licenses is dedicated to the public domain under the CC0 Public
+Domain Dedication. Except for the limited purpose of indicating that
+material is shared under a Creative Commons public license or as
+otherwise permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the
+public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
+=========================================
+END OF vscode-codicons NOTICES AND INFORMATION
+
+%% vscode-logfile-highlighter NOTICES AND INFORMATION BEGIN HERE
+=========================================
+The MIT License (MIT)
+
+Copyright (c) 2015 emilast
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+=========================================
+END OF vscode-logfile-highlighter NOTICES AND INFORMATION
+
+%% vscode-swift NOTICES AND INFORMATION BEGIN HERE
=========================================
-MIT License
+The MIT License (MIT)
+Copyright (c) 2015 David Owens II
-Copyright (c) 2015 - present Microsoft Corporation
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+=========================================
+END OF vscode-swift NOTICES AND INFORMATION
+
+%% Web Background Synchronization NOTICES AND INFORMATION BEGIN HERE
+=========================================
+Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+=========================================
+END OF Web Background Synchronization NOTICES AND INFORMATION
\ No newline at end of file
diff --git a/lib/vscode/build/.cachesalt b/build/.cachesalt
similarity index 100%
rename from lib/vscode/build/.cachesalt
rename to build/.cachesalt
diff --git a/lib/vscode/build/.gitattributes b/build/.gitattributes
similarity index 100%
rename from lib/vscode/build/.gitattributes
rename to build/.gitattributes
diff --git a/lib/vscode/build/.moduleignore b/build/.moduleignore
similarity index 100%
rename from lib/vscode/build/.moduleignore
rename to build/.moduleignore
diff --git a/lib/vscode/build/.webignore b/build/.webignore
similarity index 100%
rename from lib/vscode/build/.webignore
rename to build/.webignore
diff --git a/lib/vscode/build/azure-pipelines/common/computeNodeModulesCacheKey.js b/build/azure-pipelines/common/computeNodeModulesCacheKey.js
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/computeNodeModulesCacheKey.js
rename to build/azure-pipelines/common/computeNodeModulesCacheKey.js
diff --git a/lib/vscode/build/azure-pipelines/common/computeNodeModulesCacheKey.ts b/build/azure-pipelines/common/computeNodeModulesCacheKey.ts
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/computeNodeModulesCacheKey.ts
rename to build/azure-pipelines/common/computeNodeModulesCacheKey.ts
diff --git a/build/azure-pipelines/common/createAsset.js b/build/azure-pipelines/common/createAsset.js
new file mode 100644
index 000000000000..340c6fd7e5d9
--- /dev/null
+++ b/build/azure-pipelines/common/createAsset.js
@@ -0,0 +1,197 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+'use strict';
+Object.defineProperty(exports, "__esModule", { value: true });
+const fs = require("fs");
+const url = require("url");
+const crypto = require("crypto");
+const azure = require("azure-storage");
+const mime = require("mime");
+const cosmos_1 = require("@azure/cosmos");
+const retry_1 = require("./retry");
+if (process.argv.length !== 8) {
+ console.error('Usage: node createAsset.js PRODUCT OS ARCH TYPE NAME FILE');
+ process.exit(-1);
+}
+// Contains all of the logic for mapping details to our actual product names in CosmosDB
+function getPlatform(product, os, arch, type) {
+ switch (os) {
+ case 'win32':
+ switch (product) {
+ case 'client':
+ const asset = arch === 'ia32' ? 'win32' : `win32-${arch}`;
+ switch (type) {
+ case 'archive':
+ return `${asset}-archive`;
+ case 'setup':
+ return asset;
+ case 'user-setup':
+ return `${asset}-user`;
+ default:
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ case 'server':
+ if (arch === 'arm64') {
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ return arch === 'ia32' ? 'server-win32' : `server-win32-${arch}`;
+ case 'web':
+ if (arch === 'arm64') {
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ return arch === 'ia32' ? 'server-win32-web' : `server-win32-${arch}-web`;
+ default:
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ case 'linux':
+ switch (type) {
+ case 'snap':
+ return `linux-snap-${arch}`;
+ case 'archive-unsigned':
+ switch (product) {
+ case 'client':
+ return `linux-${arch}`;
+ case 'server':
+ return `server-linux-${arch}`;
+ case 'web':
+ return arch === 'standalone' ? 'web-standalone' : `server-linux-${arch}-web`;
+ default:
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ case 'deb-package':
+ return `linux-deb-${arch}`;
+ case 'rpm-package':
+ return `linux-rpm-${arch}`;
+ default:
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ case 'darwin':
+ switch (product) {
+ case 'client':
+ if (arch === 'x64') {
+ return 'darwin';
+ }
+ return `darwin-${arch}`;
+ case 'server':
+ return 'server-darwin';
+ case 'web':
+ if (arch !== 'x64') {
+ throw `What should the platform be?: ${product} ${os} ${arch} ${type}`;
+ }
+ return 'server-darwin-web';
+ default:
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ default:
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+}
+// Contains all of the logic for mapping types to our actual types in CosmosDB
+function getRealType(type) {
+ switch (type) {
+ case 'user-setup':
+ return 'setup';
+ case 'deb-package':
+ case 'rpm-package':
+ return 'package';
+ default:
+ return type;
+ }
+}
+function hashStream(hashName, stream) {
+ return new Promise((c, e) => {
+ const shasum = crypto.createHash(hashName);
+ stream
+ .on('data', shasum.update.bind(shasum))
+ .on('error', e)
+ .on('close', () => c(shasum.digest('hex')));
+ });
+}
+async function doesAssetExist(blobService, quality, blobName) {
+ const existsResult = await new Promise((c, e) => blobService.doesBlobExist(quality, blobName, (err, r) => err ? e(err) : c(r)));
+ return existsResult.exists;
+}
+async function uploadBlob(blobService, quality, blobName, filePath, fileName) {
+ const blobOptions = {
+ contentSettings: {
+ contentType: mime.lookup(filePath),
+ contentDisposition: `attachment; filename="${fileName}"`,
+ cacheControl: 'max-age=31536000, public'
+ }
+ };
+ await new Promise((c, e) => blobService.createBlockBlobFromLocalFile(quality, blobName, filePath, blobOptions, err => err ? e(err) : c()));
+}
+function getEnv(name) {
+ const result = process.env[name];
+ if (typeof result === 'undefined') {
+ throw new Error('Missing env: ' + name);
+ }
+ return result;
+}
+async function main() {
+ const [, , product, os, arch, unprocessedType, fileName, filePath] = process.argv;
+ // getPlatform needs the unprocessedType
+ const platform = getPlatform(product, os, arch, unprocessedType);
+ const type = getRealType(unprocessedType);
+ const quality = getEnv('VSCODE_QUALITY');
+ const commit = getEnv('BUILD_SOURCEVERSION');
+ console.log('Creating asset...');
+ const stat = await new Promise((c, e) => fs.stat(filePath, (err, stat) => err ? e(err) : c(stat)));
+ const size = stat.size;
+ console.log('Size:', size);
+ const stream = fs.createReadStream(filePath);
+ const [sha1hash, sha256hash] = await Promise.all([hashStream('sha1', stream), hashStream('sha256', stream)]);
+ console.log('SHA1:', sha1hash);
+ console.log('SHA256:', sha256hash);
+ const blobName = commit + '/' + fileName;
+ const storageAccount = process.env['AZURE_STORAGE_ACCOUNT_2'];
+ const blobService = azure.createBlobService(storageAccount, process.env['AZURE_STORAGE_ACCESS_KEY_2'])
+ .withFilter(new azure.ExponentialRetryPolicyFilter(20));
+ const blobExists = await doesAssetExist(blobService, quality, blobName);
+ if (blobExists) {
+ console.log(`Blob ${quality}, ${blobName} already exists, not publishing again.`);
+ return;
+ }
+ const mooncakeBlobService = azure.createBlobService(storageAccount, process.env['MOONCAKE_STORAGE_ACCESS_KEY'], `${storageAccount}.blob.core.chinacloudapi.cn`)
+ .withFilter(new azure.ExponentialRetryPolicyFilter(20));
+ // mooncake is fussy and far away, this is needed!
+ blobService.defaultClientRequestTimeoutInMs = 10 * 60 * 1000;
+ mooncakeBlobService.defaultClientRequestTimeoutInMs = 10 * 60 * 1000;
+ console.log('Uploading blobs to Azure storage and Mooncake Azure storage...');
+ await retry_1.retry(() => Promise.all([
+ uploadBlob(blobService, quality, blobName, filePath, fileName),
+ uploadBlob(mooncakeBlobService, quality, blobName, filePath, fileName)
+ ]));
+ console.log('Blobs successfully uploaded.');
+ // TODO: Understand if blobName and blobPath are the same and replace blobPath with blobName if so.
+ const assetUrl = `${process.env['AZURE_CDN_URL']}/${quality}/${blobName}`;
+ const blobPath = url.parse(assetUrl).path;
+ const mooncakeUrl = `${process.env['MOONCAKE_CDN_URL']}${blobPath}`;
+ const asset = {
+ platform,
+ type,
+ url: assetUrl,
+ hash: sha1hash,
+ mooncakeUrl,
+ sha256hash,
+ size
+ };
+ // Remove this if we ever need to rollback fast updates for windows
+ if (/win32/.test(platform)) {
+ asset.supportsFastUpdate = true;
+ }
+ console.log('Asset:', JSON.stringify(asset, null, ' '));
+ const client = new cosmos_1.CosmosClient({ endpoint: process.env['AZURE_DOCUMENTDB_ENDPOINT'], key: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
+ const scripts = client.database('builds').container(quality).scripts;
+ await retry_1.retry(() => scripts.storedProcedure('createAsset').execute('', [commit, asset, true]));
+ console.log(` Done โ๏ธ`);
+}
+main().then(() => {
+ console.log('Asset successfully created');
+ process.exit(0);
+}, err => {
+ console.error(err);
+ process.exit(1);
+});
diff --git a/build/azure-pipelines/common/createAsset.ts b/build/azure-pipelines/common/createAsset.ts
new file mode 100644
index 000000000000..5fe93c566bb1
--- /dev/null
+++ b/build/azure-pipelines/common/createAsset.ts
@@ -0,0 +1,243 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+'use strict';
+
+import * as fs from 'fs';
+import * as url from 'url';
+import { Readable } from 'stream';
+import * as crypto from 'crypto';
+import * as azure from 'azure-storage';
+import * as mime from 'mime';
+import { CosmosClient } from '@azure/cosmos';
+import { retry } from './retry';
+
+interface Asset {
+ platform: string;
+ type: string;
+ url: string;
+ mooncakeUrl?: string;
+ hash: string;
+ sha256hash: string;
+ size: number;
+ supportsFastUpdate?: boolean;
+}
+
+if (process.argv.length !== 8) {
+ console.error('Usage: node createAsset.js PRODUCT OS ARCH TYPE NAME FILE');
+ process.exit(-1);
+}
+
+// Contains all of the logic for mapping details to our actual product names in CosmosDB
+function getPlatform(product: string, os: string, arch: string, type: string): string {
+ switch (os) {
+ case 'win32':
+ switch (product) {
+ case 'client':
+ const asset = arch === 'ia32' ? 'win32' : `win32-${arch}`;
+ switch (type) {
+ case 'archive':
+ return `${asset}-archive`;
+ case 'setup':
+ return asset;
+ case 'user-setup':
+ return `${asset}-user`;
+ default:
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ case 'server':
+ if (arch === 'arm64') {
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ return arch === 'ia32' ? 'server-win32' : `server-win32-${arch}`;
+ case 'web':
+ if (arch === 'arm64') {
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ return arch === 'ia32' ? 'server-win32-web' : `server-win32-${arch}-web`;
+ default:
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ case 'linux':
+ switch (type) {
+ case 'snap':
+ return `linux-snap-${arch}`;
+ case 'archive-unsigned':
+ switch (product) {
+ case 'client':
+ return `linux-${arch}`;
+ case 'server':
+ return `server-linux-${arch}`;
+ case 'web':
+ return arch === 'standalone' ? 'web-standalone' : `server-linux-${arch}-web`;
+ default:
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ case 'deb-package':
+ return `linux-deb-${arch}`;
+ case 'rpm-package':
+ return `linux-rpm-${arch}`;
+ default:
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ case 'darwin':
+ switch (product) {
+ case 'client':
+ if (arch === 'x64') {
+ return 'darwin';
+ }
+ return `darwin-${arch}`;
+ case 'server':
+ return 'server-darwin';
+ case 'web':
+ if (arch !== 'x64') {
+ throw `What should the platform be?: ${product} ${os} ${arch} ${type}`;
+ }
+ return 'server-darwin-web';
+ default:
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+ default:
+ throw `Unrecognized: ${product} ${os} ${arch} ${type}`;
+ }
+}
+
+// Contains all of the logic for mapping types to our actual types in CosmosDB
+function getRealType(type: string) {
+ switch (type) {
+ case 'user-setup':
+ return 'setup';
+ case 'deb-package':
+ case 'rpm-package':
+ return 'package';
+ default:
+ return type;
+ }
+}
+
+function hashStream(hashName: string, stream: Readable): Promise {
+ return new Promise((c, e) => {
+ const shasum = crypto.createHash(hashName);
+
+ stream
+ .on('data', shasum.update.bind(shasum))
+ .on('error', e)
+ .on('close', () => c(shasum.digest('hex')));
+ });
+}
+
+async function doesAssetExist(blobService: azure.BlobService, quality: string, blobName: string): Promise {
+ const existsResult = await new Promise((c, e) => blobService.doesBlobExist(quality, blobName, (err, r) => err ? e(err) : c(r)));
+ return existsResult.exists;
+}
+
+async function uploadBlob(blobService: azure.BlobService, quality: string, blobName: string, filePath: string, fileName: string): Promise {
+ const blobOptions: azure.BlobService.CreateBlockBlobRequestOptions = {
+ contentSettings: {
+ contentType: mime.lookup(filePath),
+ contentDisposition: `attachment; filename="${fileName}"`,
+ cacheControl: 'max-age=31536000, public'
+ }
+ };
+
+ await new Promise((c, e) => blobService.createBlockBlobFromLocalFile(quality, blobName, filePath, blobOptions, err => err ? e(err) : c()));
+}
+
+function getEnv(name: string): string {
+ const result = process.env[name];
+
+ if (typeof result === 'undefined') {
+ throw new Error('Missing env: ' + name);
+ }
+
+ return result;
+}
+
+async function main(): Promise {
+ const [, , product, os, arch, unprocessedType, fileName, filePath] = process.argv;
+ // getPlatform needs the unprocessedType
+ const platform = getPlatform(product, os, arch, unprocessedType);
+ const type = getRealType(unprocessedType);
+ const quality = getEnv('VSCODE_QUALITY');
+ const commit = getEnv('BUILD_SOURCEVERSION');
+
+ console.log('Creating asset...');
+
+ const stat = await new Promise((c, e) => fs.stat(filePath, (err, stat) => err ? e(err) : c(stat)));
+ const size = stat.size;
+
+ console.log('Size:', size);
+
+ const stream = fs.createReadStream(filePath);
+ const [sha1hash, sha256hash] = await Promise.all([hashStream('sha1', stream), hashStream('sha256', stream)]);
+
+ console.log('SHA1:', sha1hash);
+ console.log('SHA256:', sha256hash);
+
+ const blobName = commit + '/' + fileName;
+ const storageAccount = process.env['AZURE_STORAGE_ACCOUNT_2']!;
+
+ const blobService = azure.createBlobService(storageAccount, process.env['AZURE_STORAGE_ACCESS_KEY_2']!)
+ .withFilter(new azure.ExponentialRetryPolicyFilter(20));
+
+ const blobExists = await doesAssetExist(blobService, quality, blobName);
+
+ if (blobExists) {
+ console.log(`Blob ${quality}, ${blobName} already exists, not publishing again.`);
+ return;
+ }
+
+ const mooncakeBlobService = azure.createBlobService(storageAccount, process.env['MOONCAKE_STORAGE_ACCESS_KEY']!, `${storageAccount}.blob.core.chinacloudapi.cn`)
+ .withFilter(new azure.ExponentialRetryPolicyFilter(20));
+
+ // mooncake is fussy and far away, this is needed!
+ blobService.defaultClientRequestTimeoutInMs = 10 * 60 * 1000;
+ mooncakeBlobService.defaultClientRequestTimeoutInMs = 10 * 60 * 1000;
+
+ console.log('Uploading blobs to Azure storage and Mooncake Azure storage...');
+
+ await retry(() => Promise.all([
+ uploadBlob(blobService, quality, blobName, filePath, fileName),
+ uploadBlob(mooncakeBlobService, quality, blobName, filePath, fileName)
+ ]));
+
+ console.log('Blobs successfully uploaded.');
+
+ // TODO: Understand if blobName and blobPath are the same and replace blobPath with blobName if so.
+ const assetUrl = `${process.env['AZURE_CDN_URL']}/${quality}/${blobName}`;
+ const blobPath = url.parse(assetUrl).path;
+ const mooncakeUrl = `${process.env['MOONCAKE_CDN_URL']}${blobPath}`;
+
+ const asset: Asset = {
+ platform,
+ type,
+ url: assetUrl,
+ hash: sha1hash,
+ mooncakeUrl,
+ sha256hash,
+ size
+ };
+
+ // Remove this if we ever need to rollback fast updates for windows
+ if (/win32/.test(platform)) {
+ asset.supportsFastUpdate = true;
+ }
+
+ console.log('Asset:', JSON.stringify(asset, null, ' '));
+
+ const client = new CosmosClient({ endpoint: process.env['AZURE_DOCUMENTDB_ENDPOINT']!, key: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
+ const scripts = client.database('builds').container(quality).scripts;
+ await retry(() => scripts.storedProcedure('createAsset').execute('', [commit, asset, true]));
+
+ console.log(` Done โ๏ธ`);
+}
+
+main().then(() => {
+ console.log('Asset successfully created');
+ process.exit(0);
+}, err => {
+ console.error(err);
+ process.exit(1);
+});
diff --git a/lib/vscode/build/azure-pipelines/common/createBuild.js b/build/azure-pipelines/common/createBuild.js
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/createBuild.js
rename to build/azure-pipelines/common/createBuild.js
diff --git a/lib/vscode/build/azure-pipelines/common/createBuild.ts b/build/azure-pipelines/common/createBuild.ts
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/createBuild.ts
rename to build/azure-pipelines/common/createBuild.ts
diff --git a/lib/vscode/build/azure-pipelines/common/extract-telemetry.sh b/build/azure-pipelines/common/extract-telemetry.sh
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/extract-telemetry.sh
rename to build/azure-pipelines/common/extract-telemetry.sh
diff --git a/lib/vscode/build/azure-pipelines/common/installPlaywright.js b/build/azure-pipelines/common/installPlaywright.js
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/installPlaywright.js
rename to build/azure-pipelines/common/installPlaywright.js
diff --git a/lib/vscode/build/azure-pipelines/common/installPlaywright.ts b/build/azure-pipelines/common/installPlaywright.ts
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/installPlaywright.ts
rename to build/azure-pipelines/common/installPlaywright.ts
diff --git a/lib/vscode/build/azure-pipelines/common/listNodeModules.js b/build/azure-pipelines/common/listNodeModules.js
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/listNodeModules.js
rename to build/azure-pipelines/common/listNodeModules.js
diff --git a/lib/vscode/build/azure-pipelines/common/listNodeModules.ts b/build/azure-pipelines/common/listNodeModules.ts
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/listNodeModules.ts
rename to build/azure-pipelines/common/listNodeModules.ts
diff --git a/lib/vscode/build/azure-pipelines/common/publish-webview.js b/build/azure-pipelines/common/publish-webview.js
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/publish-webview.js
rename to build/azure-pipelines/common/publish-webview.js
diff --git a/lib/vscode/build/azure-pipelines/common/publish-webview.sh b/build/azure-pipelines/common/publish-webview.sh
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/publish-webview.sh
rename to build/azure-pipelines/common/publish-webview.sh
diff --git a/lib/vscode/build/azure-pipelines/common/publish-webview.ts b/build/azure-pipelines/common/publish-webview.ts
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/publish-webview.ts
rename to build/azure-pipelines/common/publish-webview.ts
diff --git a/lib/vscode/build/azure-pipelines/common/releaseBuild.js b/build/azure-pipelines/common/releaseBuild.js
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/releaseBuild.js
rename to build/azure-pipelines/common/releaseBuild.js
diff --git a/lib/vscode/build/azure-pipelines/common/releaseBuild.ts b/build/azure-pipelines/common/releaseBuild.ts
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/releaseBuild.ts
rename to build/azure-pipelines/common/releaseBuild.ts
diff --git a/lib/vscode/build/azure-pipelines/common/retry.js b/build/azure-pipelines/common/retry.js
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/retry.js
rename to build/azure-pipelines/common/retry.js
diff --git a/lib/vscode/build/azure-pipelines/common/retry.ts b/build/azure-pipelines/common/retry.ts
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/retry.ts
rename to build/azure-pipelines/common/retry.ts
diff --git a/lib/vscode/build/azure-pipelines/common/telemetry-config.json b/build/azure-pipelines/common/telemetry-config.json
similarity index 100%
rename from lib/vscode/build/azure-pipelines/common/telemetry-config.json
rename to build/azure-pipelines/common/telemetry-config.json
diff --git a/lib/vscode/build/azure-pipelines/darwin/app-entitlements.plist b/build/azure-pipelines/darwin/app-entitlements.plist
similarity index 100%
rename from lib/vscode/build/azure-pipelines/darwin/app-entitlements.plist
rename to build/azure-pipelines/darwin/app-entitlements.plist
diff --git a/lib/vscode/build/azure-pipelines/darwin/helper-gpu-entitlements.plist b/build/azure-pipelines/darwin/helper-gpu-entitlements.plist
similarity index 100%
rename from lib/vscode/build/azure-pipelines/darwin/helper-gpu-entitlements.plist
rename to build/azure-pipelines/darwin/helper-gpu-entitlements.plist
diff --git a/lib/vscode/build/azure-pipelines/darwin/helper-renderer-entitlements.plist b/build/azure-pipelines/darwin/helper-renderer-entitlements.plist
similarity index 100%
rename from lib/vscode/build/azure-pipelines/darwin/helper-renderer-entitlements.plist
rename to build/azure-pipelines/darwin/helper-renderer-entitlements.plist
diff --git a/lib/vscode/build/azure-pipelines/darwin/product-build-darwin-sign.yml b/build/azure-pipelines/darwin/product-build-darwin-sign.yml
similarity index 80%
rename from lib/vscode/build/azure-pipelines/darwin/product-build-darwin-sign.yml
rename to build/azure-pipelines/darwin/product-build-darwin-sign.yml
index 4ad8349c51a8..49f74b55c933 100644
--- a/lib/vscode/build/azure-pipelines/darwin/product-build-darwin-sign.yml
+++ b/build/azure-pipelines/darwin/product-build-darwin-sign.yml
@@ -35,13 +35,13 @@ steps:
displayName: Restore modules for just build folder and compile it
- download: current
- artifact: vscode-darwin-$(VSCODE_ARCH)
+ artifact: unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive
displayName: Download $(VSCODE_ARCH) artifact
- script: |
set -e
- unzip $(Pipeline.Workspace)/vscode-darwin-$(VSCODE_ARCH)/VSCode-darwin-$(VSCODE_ARCH).zip -d $(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)
- mv $(Pipeline.Workspace)/vscode-darwin-$(VSCODE_ARCH)/VSCode-darwin-$(VSCODE_ARCH).zip $(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH).zip
+ unzip $(Pipeline.Workspace)/unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip -d $(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)
+ mv $(Pipeline.Workspace)/unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip $(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH).zip
displayName: Unzip & move
- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
@@ -108,22 +108,18 @@ steps:
condition: and(succeeded(), ne(variables['VSCODE_ARCH'], 'arm64'))
- script: |
- set -e
-
# For legacy purposes, arch for x64 is just 'darwin'
case $VSCODE_ARCH in
x64) ASSET_ID="darwin" ;;
arm64) ASSET_ID="darwin-arm64" ;;
universal) ASSET_ID="darwin-universal" ;;
esac
+ echo "##vso[task.setvariable variable=ASSET_ID]$ASSET_ID"
+ displayName: Set asset id variable
+
+ - script: mv $(agent.builddirectory)/VSCode-darwin-x64.zip $(agent.builddirectory)/VSCode-darwin.zip
+ displayName: Rename x64 build to it's legacy name
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'))
- VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
- AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
- AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
- AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
- node build/azure-pipelines/common/createAsset.js \
- "$ASSET_ID" \
- archive \
- "VSCode-$ASSET_ID.zip" \
- ../VSCode-darwin-$(VSCODE_ARCH).zip
- displayName: Publish Clients
+ - publish: $(Agent.BuildDirectory)/VSCode-$(ASSET_ID).zip
+ artifact: vscode_client_darwin_$(VSCODE_ARCH)_archive
diff --git a/lib/vscode/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml
similarity index 92%
rename from lib/vscode/build/azure-pipelines/darwin/product-build-darwin.yml
rename to build/azure-pipelines/darwin/product-build-darwin.yml
index 186920fe96d6..566eeb805229 100644
--- a/lib/vscode/build/azure-pipelines/darwin/product-build-darwin.yml
+++ b/build/azure-pipelines/darwin/product-build-darwin.yml
@@ -138,19 +138,19 @@ steps:
condition: and(succeeded(), ne(variables['VSCODE_ARCH'], 'universal'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
- download: current
- artifact: vscode-darwin-x64
+ artifact: unsigned_vscode_client_darwin_x64_archive
displayName: Download x64 artifact
condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'universal'))
- download: current
- artifact: vscode-darwin-arm64
+ artifact: unsigned_vscode_client_darwin_arm64_archive
displayName: Download arm64 artifact
condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'universal'))
- script: |
set -e
- cp $(Pipeline.Workspace)/vscode-darwin-x64/VSCode-darwin-x64.zip $(agent.builddirectory)/VSCode-darwin-x64.zip
- cp $(Pipeline.Workspace)/vscode-darwin-arm64/VSCode-darwin-arm64.zip $(agent.builddirectory)/VSCode-darwin-arm64.zip
+ cp $(Pipeline.Workspace)/unsigned_vscode_client_darwin_x64_archive/VSCode-darwin-x64.zip $(agent.builddirectory)/VSCode-darwin-x64.zip
+ cp $(Pipeline.Workspace)/unsigned_vscode_client_darwin_arm64_archive/VSCode-darwin-arm64.zip $(agent.builddirectory)/VSCode-darwin-arm64.zip
unzip $(agent.builddirectory)/VSCode-darwin-x64.zip -d $(agent.builddirectory)/VSCode-darwin-x64
unzip $(agent.builddirectory)/VSCode-darwin-arm64.zip -d $(agent.builddirectory)/VSCode-darwin-arm64
DEBUG=* node build/darwin/create-universal-app.js
@@ -280,26 +280,27 @@ steps:
- script: |
set -e
- VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
- AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
- AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
- AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
- VSCODE_ARCH="$(VSCODE_ARCH)" ./build/azure-pipelines/darwin/publish-server.sh
- displayName: Publish Servers
+
+ # package Remote Extension Host
+ pushd .. && mv vscode-reh-darwin vscode-server-darwin && zip -Xry vscode-server-darwin.zip vscode-server-darwin && popd
+
+ # package Remote Extension Host (Web)
+ pushd .. && mv vscode-reh-web-darwin vscode-server-darwin-web && zip -Xry vscode-server-darwin-web.zip vscode-server-darwin-web && popd
+ displayName: Prepare to publish servers
condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/VSCode-darwin-$(VSCODE_ARCH).zip
- artifact: vscode-darwin-$(VSCODE_ARCH)
+ artifact: unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive
displayName: Publish client archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/vscode-server-darwin.zip
- artifact: vscode-server-darwin-$(VSCODE_ARCH)
+ artifact: vscode_server_darwin_$(VSCODE_ARCH)_archive-unsigned
displayName: Publish server archive
condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/vscode-server-darwin-web.zip
- artifact: vscode-server-darwin-$(VSCODE_ARCH)-web
+ artifact: vscode_web_darwin_$(VSCODE_ARCH)_archive-unsigned
displayName: Publish web server archive
condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), ne(variables['VSCODE_PUBLISH'], 'false'))
@@ -308,5 +309,5 @@ steps:
VSCODE_ARCH="$(VSCODE_ARCH)" \
yarn gulp upload-vscode-configuration
displayName: Upload configuration (for Bing settings search)
- condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'))
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), ne(variables['VSCODE_PUBLISH'], 'false'))
continueOnError: true
diff --git a/lib/vscode/build/azure-pipelines/distro-build.yml b/build/azure-pipelines/distro-build.yml
similarity index 100%
rename from lib/vscode/build/azure-pipelines/distro-build.yml
rename to build/azure-pipelines/distro-build.yml
diff --git a/lib/vscode/build/azure-pipelines/exploration-build.yml b/build/azure-pipelines/exploration-build.yml
similarity index 100%
rename from lib/vscode/build/azure-pipelines/exploration-build.yml
rename to build/azure-pipelines/exploration-build.yml
diff --git a/lib/vscode/build/azure-pipelines/linux/.gitignore b/build/azure-pipelines/linux/.gitignore
similarity index 100%
rename from lib/vscode/build/azure-pipelines/linux/.gitignore
rename to build/azure-pipelines/linux/.gitignore
diff --git a/lib/vscode/build/azure-pipelines/linux/alpine/install-dependencies.sh b/build/azure-pipelines/linux/alpine/install-dependencies.sh
similarity index 100%
rename from lib/vscode/build/azure-pipelines/linux/alpine/install-dependencies.sh
rename to build/azure-pipelines/linux/alpine/install-dependencies.sh
diff --git a/build/azure-pipelines/linux/prepare-publish.sh b/build/azure-pipelines/linux/prepare-publish.sh
new file mode 100755
index 000000000000..891fa8024ef5
--- /dev/null
+++ b/build/azure-pipelines/linux/prepare-publish.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+set -e
+REPO="$(pwd)"
+ROOT="$REPO/.."
+
+# Publish tarball
+PLATFORM_LINUX="linux-$VSCODE_ARCH"
+BUILDNAME="VSCode-$PLATFORM_LINUX"
+BUILD_VERSION="$(date +%s)"
+[ -z "$VSCODE_QUALITY" ] && TARBALL_FILENAME="code-$VSCODE_ARCH-$BUILD_VERSION.tar.gz" || TARBALL_FILENAME="code-$VSCODE_QUALITY-$VSCODE_ARCH-$BUILD_VERSION.tar.gz"
+TARBALL_PATH="$ROOT/$TARBALL_FILENAME"
+
+rm -rf $ROOT/code-*.tar.*
+(cd $ROOT && tar -czf $TARBALL_PATH $BUILDNAME)
+
+# Publish Remote Extension Host
+LEGACY_SERVER_BUILD_NAME="vscode-reh-$PLATFORM_LINUX"
+SERVER_BUILD_NAME="vscode-server-$PLATFORM_LINUX"
+SERVER_TARBALL_FILENAME="vscode-server-$PLATFORM_LINUX.tar.gz"
+SERVER_TARBALL_PATH="$ROOT/$SERVER_TARBALL_FILENAME"
+
+rm -rf $ROOT/vscode-server-*.tar.*
+(cd $ROOT && mv $LEGACY_SERVER_BUILD_NAME $SERVER_BUILD_NAME && tar --owner=0 --group=0 -czf $SERVER_TARBALL_PATH $SERVER_BUILD_NAME)
+
+# Publish Remote Extension Host (Web)
+LEGACY_SERVER_BUILD_NAME="vscode-reh-web-$PLATFORM_LINUX"
+SERVER_BUILD_NAME="vscode-server-$PLATFORM_LINUX-web"
+SERVER_TARBALL_FILENAME="vscode-server-$PLATFORM_LINUX-web.tar.gz"
+SERVER_TARBALL_PATH="$ROOT/$SERVER_TARBALL_FILENAME"
+
+rm -rf $ROOT/vscode-server-*-web.tar.*
+(cd $ROOT && mv $LEGACY_SERVER_BUILD_NAME $SERVER_BUILD_NAME && tar --owner=0 --group=0 -czf $SERVER_TARBALL_PATH $SERVER_BUILD_NAME)
+
+# Publish DEB
+case $VSCODE_ARCH in
+ x64) DEB_ARCH="amd64" ;;
+ *) DEB_ARCH="$VSCODE_ARCH" ;;
+esac
+
+PLATFORM_DEB="linux-deb-$VSCODE_ARCH"
+DEB_FILENAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/)"
+DEB_PATH="$REPO/.build/linux/deb/$DEB_ARCH/deb/$DEB_FILENAME"
+
+# Publish RPM
+case $VSCODE_ARCH in
+ x64) RPM_ARCH="x86_64" ;;
+ armhf) RPM_ARCH="armv7hl" ;;
+ arm64) RPM_ARCH="aarch64" ;;
+ *) RPM_ARCH="$VSCODE_ARCH" ;;
+esac
+
+PLATFORM_RPM="linux-rpm-$VSCODE_ARCH"
+RPM_FILENAME="$(ls $REPO/.build/linux/rpm/$RPM_ARCH/ | grep .rpm)"
+RPM_PATH="$REPO/.build/linux/rpm/$RPM_ARCH/$RPM_FILENAME"
+
+# Publish Snap
+# Pack snap tarball artifact, in order to preserve file perms
+mkdir -p $REPO/.build/linux/snap-tarball
+SNAP_TARBALL_PATH="$REPO/.build/linux/snap-tarball/snap-$VSCODE_ARCH.tar.gz"
+rm -rf $SNAP_TARBALL_PATH
+(cd .build/linux && tar -czf $SNAP_TARBALL_PATH snap)
+
+# Export DEB_PATH, RPM_PATH
+echo "##vso[task.setvariable variable=DEB_PATH]$DEB_PATH"
+echo "##vso[task.setvariable variable=RPM_PATH]$RPM_PATH"
+echo "##vso[task.setvariable variable=TARBALL_PATH]$TARBALL_PATH"
diff --git a/lib/vscode/build/azure-pipelines/linux/product-build-alpine.yml b/build/azure-pipelines/linux/product-build-alpine.yml
similarity index 77%
rename from lib/vscode/build/azure-pipelines/linux/product-build-alpine.yml
rename to build/azure-pipelines/linux/product-build-alpine.yml
index 8376c079ce88..ed0c35346c70 100644
--- a/lib/vscode/build/azure-pipelines/linux/product-build-alpine.yml
+++ b/build/azure-pipelines/linux/product-build-alpine.yml
@@ -117,19 +117,37 @@ steps:
- script: |
set -e
- AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
- AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
- VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
- ./build/azure-pipelines/linux/alpine/publish.sh
- displayName: Publish
+ REPO="$(pwd)"
+ ROOT="$REPO/.."
+
+ PLATFORM_LINUX="linux-alpine"
+
+ # Publish Remote Extension Host
+ LEGACY_SERVER_BUILD_NAME="vscode-reh-$PLATFORM_LINUX"
+ SERVER_BUILD_NAME="vscode-server-$PLATFORM_LINUX"
+ SERVER_TARBALL_FILENAME="vscode-server-$PLATFORM_LINUX.tar.gz"
+ SERVER_TARBALL_PATH="$ROOT/$SERVER_TARBALL_FILENAME"
+
+ rm -rf $ROOT/vscode-server-*.tar.*
+ (cd $ROOT && mv $LEGACY_SERVER_BUILD_NAME $SERVER_BUILD_NAME && tar --owner=0 --group=0 -czf $SERVER_TARBALL_PATH $SERVER_BUILD_NAME)
+
+ # Publish Remote Extension Host (Web)
+ LEGACY_SERVER_BUILD_NAME="vscode-reh-web-$PLATFORM_LINUX"
+ SERVER_BUILD_NAME="vscode-server-$PLATFORM_LINUX-web"
+ SERVER_TARBALL_FILENAME="vscode-server-$PLATFORM_LINUX-web.tar.gz"
+ SERVER_TARBALL_PATH="$ROOT/$SERVER_TARBALL_FILENAME"
+
+ rm -rf $ROOT/vscode-server-*-web.tar.*
+ (cd $ROOT && mv $LEGACY_SERVER_BUILD_NAME $SERVER_BUILD_NAME && tar --owner=0 --group=0 -czf $SERVER_TARBALL_PATH $SERVER_BUILD_NAME)
+ displayName: Prepare for publish
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/vscode-server-linux-alpine.tar.gz
- artifact: vscode-server-linux-alpine
+ artifact: vscode_server_linux_alpine_archive-unsigned
displayName: Publish server archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/vscode-server-linux-alpine-web.tar.gz
- artifact: vscode-server-linux-alpine-web
+ artifact: vscode_web_linux_alpine_archive-unsigned
displayName: Publish web server archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
diff --git a/lib/vscode/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml
similarity index 94%
rename from lib/vscode/build/azure-pipelines/linux/product-build-linux.yml
rename to build/azure-pipelines/linux/product-build-linux.yml
index cb06bf6a7249..8181083d1f25 100644
--- a/lib/vscode/build/azure-pipelines/linux/product-build-linux.yml
+++ b/build/azure-pipelines/linux/product-build-linux.yml
@@ -245,27 +245,32 @@ steps:
AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
VSCODE_ARCH="$(VSCODE_ARCH)" \
- ./build/azure-pipelines/linux/publish.sh
- displayName: Publish
+ ./build/azure-pipelines/linux/prepare-publish.sh
+ displayName: Prepare for Publish
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(DEB_PATH)
- artifact: vscode-linux-deb-$(VSCODE_ARCH)
+ artifact: vscode_client_linux_$(VSCODE_ARCH)_deb-package
displayName: Publish deb package
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(RPM_PATH)
- artifact: vscode-linux-rpm-$(VSCODE_ARCH)
+ artifact: vscode_client_linux_$(VSCODE_ARCH)_rpm-package
displayName: Publish rpm package
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
+ - publish: $(TARBALL_PATH)
+ artifact: vscode_client_linux_$(VSCODE_ARCH)_archive-unsigned
+ displayName: Publish client archive
+ condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
+
- publish: $(Agent.BuildDirectory)/vscode-server-linux-$(VSCODE_ARCH).tar.gz
- artifact: vscode-server-linux-$(VSCODE_ARCH)
+ artifact: vscode_server_linux_$(VSCODE_ARCH)_archive-unsigned
displayName: Publish server archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(Agent.BuildDirectory)/vscode-server-linux-$(VSCODE_ARCH)-web.tar.gz
- artifact: vscode-server-linux-$(VSCODE_ARCH)-web
+ artifact: vscode_web_linux_$(VSCODE_ARCH)_archive-unsigned
displayName: Publish web server archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
diff --git a/lib/vscode/build/azure-pipelines/linux/snap-build-linux.yml b/build/azure-pipelines/linux/snap-build-linux.yml
similarity index 84%
rename from lib/vscode/build/azure-pipelines/linux/snap-build-linux.yml
rename to build/azure-pipelines/linux/snap-build-linux.yml
index f5e0288f0b92..f7af900e1d0d 100644
--- a/lib/vscode/build/azure-pipelines/linux/snap-build-linux.yml
+++ b/build/azure-pipelines/linux/snap-build-linux.yml
@@ -50,15 +50,11 @@ steps:
esac
(cd $SNAP_ROOT/code-* && sudo --preserve-env snapcraft prime $SNAPCRAFT_TARGET_ARGS && snap pack prime --compression=lzo --filename="$SNAP_PATH")
- # Publish snap package
- AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
- AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
- node build/azure-pipelines/common/createAsset.js "linux-snap-$(VSCODE_ARCH)" package "$SNAP_FILENAME" "$SNAP_PATH"
-
# Export SNAP_PATH
echo "##vso[task.setvariable variable=SNAP_PATH]$SNAP_PATH"
+ displayName: Prepare for publish
- publish: $(SNAP_PATH)
- artifact: vscode-linux-snap-$(VSCODE_ARCH)
+ artifact: vscode_client_linux_$(VSCODE_ARCH)_snap
displayName: Publish snap package
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
diff --git a/lib/vscode/build/azure-pipelines/linux/xvfb.init b/build/azure-pipelines/linux/xvfb.init
similarity index 100%
rename from lib/vscode/build/azure-pipelines/linux/xvfb.init
rename to build/azure-pipelines/linux/xvfb.init
diff --git a/lib/vscode/build/azure-pipelines/mixin.js b/build/azure-pipelines/mixin.js
similarity index 100%
rename from lib/vscode/build/azure-pipelines/mixin.js
rename to build/azure-pipelines/mixin.js
diff --git a/lib/vscode/build/azure-pipelines/mixin.ts b/build/azure-pipelines/mixin.ts
similarity index 100%
rename from lib/vscode/build/azure-pipelines/mixin.ts
rename to build/azure-pipelines/mixin.ts
diff --git a/lib/vscode/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml
similarity index 89%
rename from lib/vscode/build/azure-pipelines/product-build.yml
rename to build/azure-pipelines/product-build.yml
index fd698a0e7dfc..2c475b9deddd 100644
--- a/lib/vscode/build/azure-pipelines/product-build.yml
+++ b/build/azure-pipelines/product-build.yml
@@ -86,6 +86,8 @@ variables:
value: ${{ eq(parameters.ENABLE_TERRAPIN, true) }}
- name: VSCODE_QUALITY
value: ${{ parameters.VSCODE_QUALITY }}
+ - name: VSCODE_RELEASE
+ value: ${{ parameters.VSCODE_RELEASE }}
- name: VSCODE_BUILD_STAGE_WINDOWS
value: ${{ or(eq(parameters.VSCODE_BUILD_WIN32, true), eq(parameters.VSCODE_BUILD_WIN32_32BIT, true), eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}
- name: VSCODE_BUILD_STAGE_LINUX
@@ -301,37 +303,30 @@ stages:
steps:
- template: darwin/product-build-darwin-sign.yml
- - ${{ if and(eq(variables['VSCODE_PUBLISH'], true), eq(parameters.VSCODE_COMPILE_ONLY, false)) }}:
- - stage: Mooncake
+ - ${{ if and(eq(parameters.VSCODE_COMPILE_ONLY, false), ne(variables['VSCODE_PUBLISH'], 'false')) }}:
+ - stage: Publish
dependsOn:
- - ${{ if eq(variables['VSCODE_BUILD_STAGE_WINDOWS'], true) }}:
- - Windows
- - ${{ if eq(variables['VSCODE_BUILD_STAGE_LINUX'], true) }}:
- - Linux
- - ${{ if eq(variables['VSCODE_BUILD_STAGE_MACOS'], true) }}:
- - macOS
- condition: succeededOrFailed()
+ - Compile
pool:
vmImage: "Ubuntu-18.04"
+ variables:
+ - name: BUILDS_API_URL
+ value: $(System.CollectionUri)$(System.TeamProject)/_apis/build/builds/$(Build.BuildId)/
jobs:
- - job: SyncMooncake
- displayName: Sync Mooncake
+ - job: PublishBuild
+ timeoutInMinutes: 180
+ displayName: Publish Build
steps:
- - template: sync-mooncake.yml
+ - template: product-publish.yml
- - ${{ if and(eq(parameters.VSCODE_COMPILE_ONLY, false), or(eq(parameters.VSCODE_RELEASE, true), and(in(parameters.VSCODE_QUALITY, 'insider', 'exploration'), eq(variables['VSCODE_SCHEDULEDBUILD'], true)))) }}:
- - stage: Release
- dependsOn:
- - ${{ if eq(variables['VSCODE_BUILD_STAGE_WINDOWS'], true) }}:
- - Windows
- - ${{ if eq(variables['VSCODE_BUILD_STAGE_LINUX'], true) }}:
- - Linux
- - ${{ if eq(variables['VSCODE_BUILD_STAGE_MACOS'], true) }}:
- - macOS
- pool:
- vmImage: "Ubuntu-18.04"
- jobs:
- - job: ReleaseBuild
- displayName: Release Build
- steps:
- - template: release.yml
+ - ${{ if or(eq(parameters.VSCODE_RELEASE, true), and(in(parameters.VSCODE_QUALITY, 'insider', 'exploration'), eq(variables['VSCODE_SCHEDULEDBUILD'], true))) }}:
+ - stage: Release
+ dependsOn:
+ - Publish
+ pool:
+ vmImage: "Ubuntu-18.04"
+ jobs:
+ - job: ReleaseBuild
+ displayName: Release Build
+ steps:
+ - template: product-release.yml
diff --git a/lib/vscode/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml
similarity index 93%
rename from lib/vscode/build/azure-pipelines/product-compile.yml
rename to build/azure-pipelines/product-compile.yml
index 52c7758cfdee..18c17639b830 100644
--- a/lib/vscode/build/azure-pipelines/product-compile.yml
+++ b/build/azure-pipelines/product-compile.yml
@@ -118,14 +118,6 @@ steps:
displayName: Publish Webview
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- - script: |
- set -e
- VERSION=`node -p "require(\"./package.json\").version"`
- AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
- node build/azure-pipelines/common/createBuild.js $VERSION
- displayName: Create build
- condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
-
# we gotta tarball everything in order to preserve file permissions
- script: |
set -e
diff --git a/build/azure-pipelines/product-publish.ps1 b/build/azure-pipelines/product-publish.ps1
new file mode 100644
index 000000000000..339002ab0c17
--- /dev/null
+++ b/build/azure-pipelines/product-publish.ps1
@@ -0,0 +1,114 @@
+. build/azure-pipelines/win32/exec.ps1
+$ErrorActionPreference = 'Stop'
+$ProgressPreference = 'SilentlyContinue'
+$ARTIFACT_PROCESSED_WILDCARD_PATH = "$env:PIPELINE_WORKSPACE/artifacts_processed_*/artifacts_processed_*"
+$ARTIFACT_PROCESSED_FILE_PATH = "$env:PIPELINE_WORKSPACE/artifacts_processed_$env:SYSTEM_STAGEATTEMPT/artifacts_processed_$env:SYSTEM_STAGEATTEMPT.txt"
+
+function Get-PipelineArtifact {
+ param($Name = '*')
+ try {
+ $res = Invoke-RestMethod "$($env:BUILDS_API_URL)artifacts?api-version=6.0" -Headers @{
+ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
+ } -MaximumRetryCount 5 -RetryIntervalSec 1
+
+ if (!$res) {
+ return
+ }
+
+ $res.value | Where-Object { $_.name -Like $Name }
+ } catch {
+ Write-Warning $_
+ }
+}
+
+# This set will keep track of which artifacts have already been processed
+$set = [System.Collections.Generic.HashSet[string]]::new()
+
+if (Test-Path $ARTIFACT_PROCESSED_WILDCARD_PATH) {
+ # Grab the latest artifact_processed text file and load all assets already processed from that.
+ # This means that the latest artifact_processed_*.txt file has all of the contents of the previous ones.
+ # Note: The kusto-like syntax only works in PS7+ and only in scripts, not at the REPL.
+ Get-ChildItem $ARTIFACT_PROCESSED_WILDCARD_PATH
+ | Sort-Object
+ | Select-Object -Last 1
+ | Get-Content
+ | ForEach-Object {
+ $set.Add($_) | Out-Null
+ Write-Host "Already processed artifact: $_"
+ }
+}
+
+# Create the artifact file that will be used for this run
+New-Item -Path $ARTIFACT_PROCESSED_FILE_PATH -Force | Out-Null
+
+# Determine which stages we need to watch
+$stages = @(
+ if ($env:VSCODE_BUILD_STAGE_WINDOWS -eq 'True') { 'Windows' }
+ if ($env:VSCODE_BUILD_STAGE_LINUX -eq 'True') { 'Linux' }
+ if ($env:VSCODE_BUILD_STAGE_MACOS -eq 'True') { 'macOS' }
+)
+
+do {
+ Start-Sleep -Seconds 10
+
+ $artifacts = Get-PipelineArtifact -Name 'vscode_*'
+ if (!$artifacts) {
+ continue
+ }
+
+ $artifacts | ForEach-Object {
+ $artifactName = $_.name
+ if($set.Add($artifactName)) {
+ Write-Host "Processing artifact: '$artifactName. Downloading from: $($_.resource.downloadUrl)"
+
+ try {
+ Invoke-RestMethod $_.resource.downloadUrl -OutFile "$env:AGENT_TEMPDIRECTORY/$artifactName.zip" -Headers @{
+ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
+ } -MaximumRetryCount 5 -RetryIntervalSec 1 | Out-Null
+
+ Expand-Archive -Path "$env:AGENT_TEMPDIRECTORY/$artifactName.zip" -DestinationPath $env:AGENT_TEMPDIRECTORY | Out-Null
+ } catch {
+ Write-Warning $_
+ $set.Remove($artifactName) | Out-Null
+ continue
+ }
+
+ $null,$product,$os,$arch,$type = $artifactName -split '_'
+ $asset = Get-ChildItem -rec "$env:AGENT_TEMPDIRECTORY/$artifactName"
+ Write-Host "Processing artifact with the following values:"
+ # turning in into an object just to log nicely
+ @{
+ product = $product
+ os = $os
+ arch = $arch
+ type = $type
+ asset = $asset.Name
+ } | Format-Table
+
+ exec { node build/azure-pipelines/common/createAsset.js $product $os $arch $type $asset.Name $asset.FullName }
+ $artifactName >> $ARTIFACT_PROCESSED_FILE_PATH
+ }
+ }
+
+ # Get the timeline and see if it says the other stage completed
+ try {
+ $timeline = Invoke-RestMethod "$($env:BUILDS_API_URL)timeline?api-version=6.0" -Headers @{
+ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
+ } -MaximumRetryCount 5 -RetryIntervalSec 1
+ } catch {
+ Write-Warning $_
+ continue
+ }
+
+ foreach ($stage in $stages) {
+ $otherStageFinished = $timeline.records | Where-Object { $_.name -eq $stage -and $_.type -eq 'stage' -and $_.state -eq 'completed' }
+ if (!$otherStageFinished) {
+ break
+ }
+ }
+
+ $artifacts = Get-PipelineArtifact -Name 'vscode_*'
+ $artifactsStillToProcess = $artifacts.Count -ne $set.Count
+} while (!$otherStageFinished -or $artifactsStillToProcess)
+
+Write-Host "Processed $($set.Count) artifacts."
diff --git a/build/azure-pipelines/product-publish.yml b/build/azure-pipelines/product-publish.yml
new file mode 100644
index 000000000000..de8cb216b8a1
--- /dev/null
+++ b/build/azure-pipelines/product-publish.yml
@@ -0,0 +1,89 @@
+steps:
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.x"
+
+ - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
+ inputs:
+ versionSpec: "1.x"
+
+ - task: AzureKeyVault@1
+ displayName: "Azure Key Vault: Get Secrets"
+ inputs:
+ azureSubscription: "vscode-builds-subscription"
+ KeyVaultName: vscode
+
+ - pwsh: |
+ . build/azure-pipelines/win32/exec.ps1
+ cd build
+ exec { yarn }
+ displayName: Install dependencies
+
+ - download: current
+ patterns: '**/artifacts_processed_*.txt'
+ displayName: Download all artifacts_processed text files
+
+ - pwsh: |
+ . build/azure-pipelines/win32/exec.ps1
+
+ if (Test-Path "$(Pipeline.Workspace)/artifacts_processed_*/artifacts_processed_*.txt") {
+ Write-Host "Artifacts already processed so a build must have already been created."
+ return
+ }
+
+ $env:AZURE_DOCUMENTDB_MASTERKEY = "$(builds-docdb-key-readwrite)"
+ $VERSION = node -p "require('./package.json').version"
+ Write-Host "Creating build with version: $VERSION"
+ exec { node build/azure-pipelines/common/createBuild.js $VERSION }
+ displayName: Create build if it hasn't been created before
+
+ - pwsh: |
+ $env:VSCODE_MIXIN_PASSWORD = "$(github-distro-mixin-password)"
+ $env:AZURE_DOCUMENTDB_MASTERKEY = "$(builds-docdb-key-readwrite)"
+ $env:AZURE_STORAGE_ACCESS_KEY = "$(ticino-storage-key)"
+ $env:AZURE_STORAGE_ACCESS_KEY_2 = "$(vscode-storage-key)"
+ $env:MOONCAKE_STORAGE_ACCESS_KEY = "$(vscode-mooncake-storage-key)"
+ build/azure-pipelines/product-publish.ps1
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+ displayName: Process artifacts
+
+ - publish: $(Pipeline.Workspace)/artifacts_processed_$(System.StageAttempt)/artifacts_processed_$(System.StageAttempt).txt
+ artifact: artifacts_processed_$(System.StageAttempt)
+ displayName: Publish what artifacts were published for this stage attempt
+
+ - pwsh: |
+ $ErrorActionPreference = 'Stop'
+
+ # Determine which stages we need to watch
+ $stages = @(
+ if ($env:VSCODE_BUILD_STAGE_WINDOWS -eq 'True') { 'Windows' }
+ if ($env:VSCODE_BUILD_STAGE_LINUX -eq 'True') { 'Linux' }
+ if ($env:VSCODE_BUILD_STAGE_MACOS -eq 'True') { 'macOS' }
+ )
+ Write-Host "Stages to check: $stages"
+
+ # Get the timeline and see if it says the other stage completed
+ $timeline = Invoke-RestMethod "$($env:BUILDS_API_URL)timeline?api-version=6.0" -Headers @{
+ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
+ } -MaximumRetryCount 5 -RetryIntervalSec 1
+
+ $failedStages = @()
+ foreach ($stage in $stages) {
+ $didStageFail = $timeline.records | Where-Object {
+ $_.name -eq $stage -and $_.type -eq 'stage' -and $_.result -ne 'succeeded' -and $_.result -ne 'succeededWithIssues'
+ }
+
+ if($didStageFail) {
+ $failedStages += $stage
+ } else {
+ Write-Host "'$stage' did not fail."
+ }
+ }
+
+ if ($failedStages.Length) {
+ throw "Failed stages: $($failedStages -join ', '). This stage will now fail so that it is easier to retry failed jobs."
+ }
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+ displayName: Determine if stage should succeed
diff --git a/lib/vscode/build/azure-pipelines/release.yml b/build/azure-pipelines/product-release.yml
similarity index 100%
rename from lib/vscode/build/azure-pipelines/release.yml
rename to build/azure-pipelines/product-release.yml
diff --git a/lib/vscode/build/azure-pipelines/publish-types/check-version.js b/build/azure-pipelines/publish-types/check-version.js
similarity index 100%
rename from lib/vscode/build/azure-pipelines/publish-types/check-version.js
rename to build/azure-pipelines/publish-types/check-version.js
diff --git a/lib/vscode/build/azure-pipelines/publish-types/check-version.ts b/build/azure-pipelines/publish-types/check-version.ts
similarity index 100%
rename from lib/vscode/build/azure-pipelines/publish-types/check-version.ts
rename to build/azure-pipelines/publish-types/check-version.ts
diff --git a/lib/vscode/build/azure-pipelines/publish-types/publish-types.yml b/build/azure-pipelines/publish-types/publish-types.yml
similarity index 100%
rename from lib/vscode/build/azure-pipelines/publish-types/publish-types.yml
rename to build/azure-pipelines/publish-types/publish-types.yml
diff --git a/lib/vscode/build/azure-pipelines/publish-types/update-types.js b/build/azure-pipelines/publish-types/update-types.js
similarity index 100%
rename from lib/vscode/build/azure-pipelines/publish-types/update-types.js
rename to build/azure-pipelines/publish-types/update-types.js
diff --git a/lib/vscode/build/azure-pipelines/publish-types/update-types.ts b/build/azure-pipelines/publish-types/update-types.ts
similarity index 100%
rename from lib/vscode/build/azure-pipelines/publish-types/update-types.ts
rename to build/azure-pipelines/publish-types/update-types.ts
diff --git a/lib/vscode/build/azure-pipelines/upload-cdn.js b/build/azure-pipelines/upload-cdn.js
similarity index 100%
rename from lib/vscode/build/azure-pipelines/upload-cdn.js
rename to build/azure-pipelines/upload-cdn.js
diff --git a/lib/vscode/build/azure-pipelines/upload-cdn.ts b/build/azure-pipelines/upload-cdn.ts
similarity index 100%
rename from lib/vscode/build/azure-pipelines/upload-cdn.ts
rename to build/azure-pipelines/upload-cdn.ts
diff --git a/lib/vscode/build/azure-pipelines/upload-sourcemaps.js b/build/azure-pipelines/upload-sourcemaps.js
similarity index 100%
rename from lib/vscode/build/azure-pipelines/upload-sourcemaps.js
rename to build/azure-pipelines/upload-sourcemaps.js
diff --git a/lib/vscode/build/azure-pipelines/upload-sourcemaps.ts b/build/azure-pipelines/upload-sourcemaps.ts
similarity index 100%
rename from lib/vscode/build/azure-pipelines/upload-sourcemaps.ts
rename to build/azure-pipelines/upload-sourcemaps.ts
diff --git a/lib/vscode/build/azure-pipelines/web/product-build-web.yml b/build/azure-pipelines/web/product-build-web.yml
similarity index 90%
rename from lib/vscode/build/azure-pipelines/web/product-build-web.yml
rename to build/azure-pipelines/web/product-build-web.yml
index 772fe1c05abd..45dedea1b4c6 100644
--- a/lib/vscode/build/azure-pipelines/web/product-build-web.yml
+++ b/build/azure-pipelines/web/product-build-web.yml
@@ -119,13 +119,19 @@ steps:
- script: |
set -e
- AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
- AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
- VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
- ./build/azure-pipelines/web/publish.sh
- displayName: Publish
+ REPO="$(pwd)"
+ ROOT="$REPO/.."
+
+ WEB_BUILD_NAME="vscode-web"
+ WEB_TARBALL_FILENAME="vscode-web.tar.gz"
+ WEB_TARBALL_PATH="$ROOT/$WEB_TARBALL_FILENAME"
+
+ rm -rf $ROOT/vscode-web.tar.*
+
+ cd $ROOT && tar --owner=0 --group=0 -czf $WEB_TARBALL_PATH $WEB_BUILD_NAME
+ displayName: Prepare for publish
- publish: $(Agent.BuildDirectory)/vscode-web.tar.gz
- artifact: vscode-web-standalone
+ artifact: vscode_web_linux_standalone_archive-unsigned
displayName: Publish web archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
diff --git a/lib/vscode/build/azure-pipelines/win32/ESRPClient/NuGet.config b/build/azure-pipelines/win32/ESRPClient/NuGet.config
similarity index 100%
rename from lib/vscode/build/azure-pipelines/win32/ESRPClient/NuGet.config
rename to build/azure-pipelines/win32/ESRPClient/NuGet.config
diff --git a/lib/vscode/build/azure-pipelines/win32/ESRPClient/packages.config b/build/azure-pipelines/win32/ESRPClient/packages.config
similarity index 100%
rename from lib/vscode/build/azure-pipelines/win32/ESRPClient/packages.config
rename to build/azure-pipelines/win32/ESRPClient/packages.config
diff --git a/lib/vscode/build/azure-pipelines/win32/exec.ps1 b/build/azure-pipelines/win32/exec.ps1
similarity index 100%
rename from lib/vscode/build/azure-pipelines/win32/exec.ps1
rename to build/azure-pipelines/win32/exec.ps1
diff --git a/lib/vscode/build/azure-pipelines/win32/import-esrp-auth-cert.ps1 b/build/azure-pipelines/win32/import-esrp-auth-cert.ps1
similarity index 100%
rename from lib/vscode/build/azure-pipelines/win32/import-esrp-auth-cert.ps1
rename to build/azure-pipelines/win32/import-esrp-auth-cert.ps1
diff --git a/build/azure-pipelines/win32/prepare-publish.ps1 b/build/azure-pipelines/win32/prepare-publish.ps1
new file mode 100644
index 000000000000..f80e1ca0ce9a
--- /dev/null
+++ b/build/azure-pipelines/win32/prepare-publish.ps1
@@ -0,0 +1,43 @@
+. build/azure-pipelines/win32/exec.ps1
+$ErrorActionPreference = "Stop"
+
+$Arch = "$env:VSCODE_ARCH"
+
+exec { yarn gulp "vscode-win32-$Arch-archive" "vscode-win32-$Arch-system-setup" "vscode-win32-$Arch-user-setup" --sign }
+
+$Repo = "$(pwd)"
+$Root = "$Repo\.."
+$SystemExe = "$Repo\.build\win32-$Arch\system-setup\VSCodeSetup.exe"
+$UserExe = "$Repo\.build\win32-$Arch\user-setup\VSCodeSetup.exe"
+$Zip = "$Repo\.build\win32-$Arch\archive\VSCode-win32-$Arch.zip"
+$LegacyServer = "$Root\vscode-reh-win32-$Arch"
+$Server = "$Root\vscode-server-win32-$Arch"
+$ServerZip = "$Repo\.build\vscode-server-win32-$Arch.zip"
+$LegacyWeb = "$Root\vscode-reh-web-win32-$Arch"
+$Web = "$Root\vscode-server-win32-$Arch-web"
+$WebZip = "$Repo\.build\vscode-server-win32-$Arch-web.zip"
+$Build = "$Root\VSCode-win32-$Arch"
+
+# Create server archive
+if ("$Arch" -ne "arm64") {
+ exec { xcopy $LegacyServer $Server /H /E /I }
+ exec { .\node_modules\7zip\7zip-lite\7z.exe a -tzip $ServerZip $Server -r }
+ exec { xcopy $LegacyWeb $Web /H /E /I }
+ exec { .\node_modules\7zip\7zip-lite\7z.exe a -tzip $WebZip $Web -r }
+}
+
+# get version
+$PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json
+$Version = $PackageJson.version
+
+$ARCHIVE_NAME = "VSCode-win32-$Arch-$Version.zip"
+$SYSTEM_SETUP_NAME = "VSCodeSetup-$Arch-$Version.exe"
+$USER_SETUP_NAME = "VSCodeUserSetup-$Arch-$Version.exe"
+
+# Set variables for upload
+Move-Item $Zip "$Repo\.build\win32-$Arch\archive\$ARCHIVE_NAME"
+Write-Host "##vso[task.setvariable variable=ARCHIVE_NAME]$ARCHIVE_NAME"
+Move-Item $SystemExe "$Repo\.build\win32-$Arch\system-setup\$SYSTEM_SETUP_NAME"
+Write-Host "##vso[task.setvariable variable=SYSTEM_SETUP_NAME]$SYSTEM_SETUP_NAME"
+Move-Item $UserExe "$Repo\.build\win32-$Arch\user-setup\$USER_SETUP_NAME"
+Write-Host "##vso[task.setvariable variable=USER_SETUP_NAME]$USER_SETUP_NAME"
diff --git a/lib/vscode/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml
similarity index 96%
rename from lib/vscode/build/azure-pipelines/win32/product-build-win32.yml
rename to build/azure-pipelines/win32/product-build-win32.yml
index 2dcaf8b2e010..1f8514ae7e3e 100644
--- a/lib/vscode/build/azure-pipelines/win32/product-build-win32.yml
+++ b/build/azure-pipelines/win32/product-build-win32.yml
@@ -295,31 +295,31 @@ steps:
$env:AZURE_STORAGE_ACCESS_KEY_2 = "$(vscode-storage-key)"
$env:AZURE_DOCUMENTDB_MASTERKEY = "$(builds-docdb-key-readwrite)"
$env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)"
- .\build\azure-pipelines\win32\publish.ps1
+ .\build\azure-pipelines\win32\prepare-publish.ps1
displayName: Publish
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- - publish: $(System.DefaultWorkingDirectory)\.build\win32-$(VSCODE_ARCH)\archive\VSCode-win32-$(VSCODE_ARCH).zip
- artifact: vscode-win32-$(VSCODE_ARCH)
+ - publish: $(System.DefaultWorkingDirectory)\.build\win32-$(VSCODE_ARCH)\archive\$(ARCHIVE_NAME)
+ artifact: vscode_client_win32_$(VSCODE_ARCH)_archive
displayName: Publish archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- - publish: $(System.DefaultWorkingDirectory)\.build\win32-$(VSCODE_ARCH)\system-setup\VSCodeSetup.exe
- artifact: vscode-win32-$(VSCODE_ARCH)-setup
+ - publish: $(System.DefaultWorkingDirectory)\.build\win32-$(VSCODE_ARCH)\system-setup\$(SYSTEM_SETUP_NAME)
+ artifact: vscode_client_win32_$(VSCODE_ARCH)_setup
displayName: Publish system setup
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- - publish: $(System.DefaultWorkingDirectory)\.build\win32-$(VSCODE_ARCH)\user-setup\VSCodeSetup.exe
- artifact: vscode-win32-$(VSCODE_ARCH)-user-setup
+ - publish: $(System.DefaultWorkingDirectory)\.build\win32-$(VSCODE_ARCH)\user-setup\$(USER_SETUP_NAME)
+ artifact: vscode_client_win32_$(VSCODE_ARCH)_user-setup
displayName: Publish user setup
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'))
- publish: $(System.DefaultWorkingDirectory)\.build\vscode-server-win32-$(VSCODE_ARCH).zip
- artifact: vscode-server-win32-$(VSCODE_ARCH)
+ artifact: vscode_server_win32_$(VSCODE_ARCH)_archive
displayName: Publish server archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64'))
- publish: $(System.DefaultWorkingDirectory)\.build\vscode-server-win32-$(VSCODE_ARCH)-web.zip
- artifact: vscode-server-win32-$(VSCODE_ARCH)-web
+ artifact: vscode_web_win32_$(VSCODE_ARCH)_archive
displayName: Publish web server archive
condition: and(succeeded(), ne(variables['VSCODE_PUBLISH'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64'))
diff --git a/lib/vscode/build/azure-pipelines/win32/retry.ps1 b/build/azure-pipelines/win32/retry.ps1
similarity index 100%
rename from lib/vscode/build/azure-pipelines/win32/retry.ps1
rename to build/azure-pipelines/win32/retry.ps1
diff --git a/lib/vscode/build/azure-pipelines/win32/sign.ps1 b/build/azure-pipelines/win32/sign.ps1
similarity index 100%
rename from lib/vscode/build/azure-pipelines/win32/sign.ps1
rename to build/azure-pipelines/win32/sign.ps1
diff --git a/lib/vscode/build/builtin/.eslintrc b/build/builtin/.eslintrc
similarity index 100%
rename from lib/vscode/build/builtin/.eslintrc
rename to build/builtin/.eslintrc
diff --git a/lib/vscode/build/builtin/browser-main.js b/build/builtin/browser-main.js
similarity index 100%
rename from lib/vscode/build/builtin/browser-main.js
rename to build/builtin/browser-main.js
diff --git a/lib/vscode/build/builtin/index.html b/build/builtin/index.html
similarity index 100%
rename from lib/vscode/build/builtin/index.html
rename to build/builtin/index.html
diff --git a/lib/vscode/build/builtin/main.js b/build/builtin/main.js
similarity index 100%
rename from lib/vscode/build/builtin/main.js
rename to build/builtin/main.js
diff --git a/lib/vscode/build/builtin/package.json b/build/builtin/package.json
similarity index 100%
rename from lib/vscode/build/builtin/package.json
rename to build/builtin/package.json
diff --git a/lib/vscode/build/darwin/create-universal-app.js b/build/darwin/create-universal-app.js
similarity index 96%
rename from lib/vscode/build/darwin/create-universal-app.js
rename to build/darwin/create-universal-app.js
index d455a5cef703..d91064d41a60 100644
--- a/lib/vscode/build/darwin/create-universal-app.js
+++ b/build/darwin/create-universal-app.js
@@ -33,7 +33,7 @@ async function main() {
'Credits.rtf',
'CodeResources',
'fsevents.node',
- 'Info.plist', // TODO@deepak1556: regressed with 11.4.2 internal builds
+ 'Info.plist',
'.npmrc'
],
outAppPath,
diff --git a/lib/vscode/build/darwin/create-universal-app.ts b/build/darwin/create-universal-app.ts
similarity index 100%
rename from lib/vscode/build/darwin/create-universal-app.ts
rename to build/darwin/create-universal-app.ts
diff --git a/lib/vscode/build/darwin/sign.js b/build/darwin/sign.js
similarity index 100%
rename from lib/vscode/build/darwin/sign.js
rename to build/darwin/sign.js
diff --git a/lib/vscode/build/darwin/sign.ts b/build/darwin/sign.ts
similarity index 100%
rename from lib/vscode/build/darwin/sign.ts
rename to build/darwin/sign.ts
diff --git a/lib/vscode/build/eslint.js b/build/eslint.js
similarity index 100%
rename from lib/vscode/build/eslint.js
rename to build/eslint.js
diff --git a/lib/vscode/build/filters.js b/build/filters.js
similarity index 100%
rename from lib/vscode/build/filters.js
rename to build/filters.js
diff --git a/lib/vscode/build/gulpfile.compile.js b/build/gulpfile.compile.js
similarity index 100%
rename from lib/vscode/build/gulpfile.compile.js
rename to build/gulpfile.compile.js
diff --git a/lib/vscode/build/gulpfile.editor.js b/build/gulpfile.editor.js
similarity index 100%
rename from lib/vscode/build/gulpfile.editor.js
rename to build/gulpfile.editor.js
diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js
new file mode 100644
index 000000000000..cbb7c486b13d
--- /dev/null
+++ b/build/gulpfile.extensions.js
@@ -0,0 +1,244 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+// Increase max listeners for event emitters
+require('events').EventEmitter.defaultMaxListeners = 100;
+
+const gulp = require('gulp');
+const path = require('path');
+const nodeUtil = require('util');
+const es = require('event-stream');
+const filter = require('gulp-filter');
+const util = require('./lib/util');
+const task = require('./lib/task');
+const watcher = require('./lib/watch');
+const createReporter = require('./lib/reporter').createReporter;
+const glob = require('glob');
+const root = path.dirname(__dirname);
+const commit = util.getVersion(root);
+const plumber = require('gulp-plumber');
+const ext = require('./lib/extensions');
+
+const extensionsPath = path.join(path.dirname(__dirname), 'extensions');
+
+// To save 250ms for each gulp startup, we are caching the result here
+// const compilations = glob.sync('**/tsconfig.json', {
+// cwd: extensionsPath,
+// ignore: ['**/out/**', '**/node_modules/**']
+// });
+const compilations = [
+ 'configuration-editing/build/tsconfig.json',
+ 'configuration-editing/tsconfig.json',
+ 'css-language-features/client/tsconfig.json',
+ 'css-language-features/server/tsconfig.json',
+ 'debug-auto-launch/tsconfig.json',
+ 'debug-server-ready/tsconfig.json',
+ 'emmet/tsconfig.json',
+ 'extension-editing/tsconfig.json',
+ 'git/tsconfig.json',
+ 'github-authentication/tsconfig.json',
+ 'github/tsconfig.json',
+ 'grunt/tsconfig.json',
+ 'gulp/tsconfig.json',
+ 'html-language-features/client/tsconfig.json',
+ 'html-language-features/server/tsconfig.json',
+ 'image-preview/tsconfig.json',
+ 'jake/tsconfig.json',
+ 'json-language-features/client/tsconfig.json',
+ 'json-language-features/server/tsconfig.json',
+ 'markdown-language-features/preview-src/tsconfig.json',
+ 'markdown-language-features/tsconfig.json',
+ 'merge-conflict/tsconfig.json',
+ 'microsoft-authentication/tsconfig.json',
+ 'npm/tsconfig.json',
+ 'php-language-features/tsconfig.json',
+ 'search-result/tsconfig.json',
+ 'simple-browser/tsconfig.json',
+ 'testing-editor-contributions/tsconfig.json',
+ 'typescript-language-features/test-workspace/tsconfig.json',
+ 'typescript-language-features/tsconfig.json',
+ 'vscode-api-tests/tsconfig.json',
+ 'vscode-colorize-tests/tsconfig.json',
+ 'vscode-custom-editor-tests/tsconfig.json',
+ 'vscode-notebook-tests/tsconfig.json',
+ 'vscode-test-resolver/tsconfig.json'
+];
+
+const getBaseUrl = out => `https://ticino.blob.core.windows.net/sourcemaps/${commit}/${out}`;
+
+const tasks = compilations.map(function (tsconfigFile) {
+ const absolutePath = path.join(extensionsPath, tsconfigFile);
+ const relativeDirname = path.dirname(tsconfigFile);
+
+ const overrideOptions = {};
+ overrideOptions.sourceMap = true;
+
+ const name = relativeDirname.replace(/\//g, '-');
+
+ const root = path.join('extensions', relativeDirname);
+ const srcBase = path.join(root, 'src');
+ const src = path.join(srcBase, '**');
+ const srcOpts = { cwd: path.dirname(__dirname), base: srcBase };
+
+ const out = path.join(root, 'out');
+ const baseUrl = getBaseUrl(out);
+
+ let headerId, headerOut;
+ let index = relativeDirname.indexOf('/');
+ if (index < 0) {
+ headerId = 'vscode.' + relativeDirname;
+ headerOut = 'out';
+ } else {
+ headerId = 'vscode.' + relativeDirname.substr(0, index);
+ headerOut = relativeDirname.substr(index + 1) + '/out';
+ }
+
+ function createPipeline(build, emitError) {
+ const nlsDev = require('vscode-nls-dev');
+ const tsb = require('gulp-tsb');
+ const sourcemaps = require('gulp-sourcemaps');
+
+ const reporter = createReporter('extensions');
+
+ overrideOptions.inlineSources = Boolean(build);
+ overrideOptions.base = path.dirname(absolutePath);
+
+ const compilation = tsb.create(absolutePath, overrideOptions, false, err => reporter(err.toString()));
+
+ const pipeline = function () {
+ const input = es.through();
+ const tsFilter = filter(['**/*.ts', '!**/lib/lib*.d.ts', '!**/node_modules/**'], { restore: true });
+ const output = input
+ .pipe(plumber({
+ errorHandler: function (err) {
+ if (err && !err.__reporter__) {
+ reporter(err);
+ }
+ }
+ }))
+ .pipe(tsFilter)
+ .pipe(util.loadSourcemaps())
+ .pipe(compilation())
+ .pipe(build ? nlsDev.rewriteLocalizeCalls() : es.through())
+ .pipe(build ? util.stripSourceMappingURL() : es.through())
+ .pipe(sourcemaps.write('.', {
+ sourceMappingURL: !build ? null : f => `${baseUrl}/${f.relative}.map`,
+ addComment: !!build,
+ includeContent: !!build,
+ sourceRoot: '../src'
+ }))
+ .pipe(tsFilter.restore)
+ .pipe(build ? nlsDev.bundleMetaDataFiles(headerId, headerOut) : es.through())
+ // Filter out *.nls.json file. We needed them only to bundle meta data file.
+ .pipe(filter(['**', '!**/*.nls.json']))
+ .pipe(reporter.end(emitError));
+
+ return es.duplex(input, output);
+ };
+
+ // add src-stream for project files
+ pipeline.tsProjectSrc = () => {
+ return compilation.src(srcOpts);
+ };
+ return pipeline;
+ }
+
+ const cleanTask = task.define(`clean-extension-${name}`, util.rimraf(out));
+
+ const compileTask = task.define(`compile-extension:${name}`, task.series(cleanTask, () => {
+ const pipeline = createPipeline(false, true);
+ const nonts = gulp.src(src, srcOpts).pipe(filter(['**', '!**/*.ts']));
+ const input = es.merge(nonts, pipeline.tsProjectSrc());
+
+ return input
+ .pipe(pipeline())
+ .pipe(gulp.dest(out));
+ }));
+
+ const watchTask = task.define(`watch-extension:${name}`, task.series(cleanTask, () => {
+ const pipeline = createPipeline(false);
+ const nonts = gulp.src(src, srcOpts).pipe(filter(['**', '!**/*.ts']));
+ const input = es.merge(nonts, pipeline.tsProjectSrc());
+ const watchInput = watcher(src, { ...srcOpts, ...{ readDelay: 200 } });
+
+ return watchInput
+ .pipe(util.incremental(pipeline, input))
+ .pipe(gulp.dest(out));
+ }));
+
+ const compileBuildTask = task.define(`compile-build-extension-${name}`, task.series(cleanTask, () => {
+ const pipeline = createPipeline(true, true);
+ const nonts = gulp.src(src, srcOpts).pipe(filter(['**', '!**/*.ts']));
+ const input = es.merge(nonts, pipeline.tsProjectSrc());
+
+ return input
+ .pipe(pipeline())
+ .pipe(gulp.dest(out));
+ }));
+
+ // Tasks
+ gulp.task(compileTask);
+ gulp.task(watchTask);
+
+ return { compileTask, watchTask, compileBuildTask };
+});
+
+const compileExtensionsTask = task.define('compile-extensions', task.parallel(...tasks.map(t => t.compileTask)));
+gulp.task(compileExtensionsTask);
+exports.compileExtensionsTask = compileExtensionsTask;
+
+const watchExtensionsTask = task.define('watch-extensions', task.parallel(...tasks.map(t => t.watchTask)));
+gulp.task(watchExtensionsTask);
+exports.watchExtensionsTask = watchExtensionsTask;
+
+const compileExtensionsBuildLegacyTask = task.define('compile-extensions-build-legacy', task.parallel(...tasks.map(t => t.compileBuildTask)));
+gulp.task(compileExtensionsBuildLegacyTask);
+
+//#region Extension media
+
+const compileExtensionMediaTask = task.define('compile-extension-media', () => ext.buildExtensionMedia(false));
+gulp.task(compileExtensionMediaTask);
+exports.compileExtensionMediaTask = compileExtensionMediaTask;
+
+const watchExtensionMedia = task.define('watch-extension-media', () => ext.buildExtensionMedia(true));
+gulp.task(watchExtensionMedia);
+exports.watchExtensionMedia = watchExtensionMedia;
+
+const compileExtensionMediaBuildTask = task.define('compile-extension-media-build', () => ext.buildExtensionMedia(false, '.build/extensions'));
+gulp.task(compileExtensionMediaBuildTask);
+
+//#endregion
+
+//#region Azure Pipelines
+
+const cleanExtensionsBuildTask = task.define('clean-extensions-build', util.rimraf('.build/extensions'));
+const compileExtensionsBuildTask = task.define('compile-extensions-build', task.series(
+ cleanExtensionsBuildTask,
+ task.define('bundle-extensions-build', () => ext.packageLocalExtensionsStream(false).pipe(gulp.dest('.build'))),
+ task.define('bundle-marketplace-extensions-build', () => ext.packageMarketplaceExtensionsStream(false).pipe(gulp.dest('.build'))),
+));
+
+gulp.task(compileExtensionsBuildTask);
+gulp.task(task.define('extensions-ci', task.series(compileExtensionsBuildTask, compileExtensionMediaBuildTask)));
+
+exports.compileExtensionsBuildTask = compileExtensionsBuildTask;
+
+//#endregion
+
+const compileWebExtensionsTask = task.define('compile-web', () => buildWebExtensions(false));
+gulp.task(compileWebExtensionsTask);
+exports.compileWebExtensionsTask = compileWebExtensionsTask;
+
+const watchWebExtensionsTask = task.define('watch-web', () => buildWebExtensions(true));
+gulp.task(watchWebExtensionsTask);
+exports.watchWebExtensionsTask = watchWebExtensionsTask;
+
+async function buildWebExtensions(isWatch) {
+ const webpackConfigLocations = await nodeUtil.promisify(glob)(
+ path.join(extensionsPath, '**', 'extension-browser.webpack.config.js'),
+ { ignore: ['**/node_modules'] }
+ );
+ return ext.webpackExtensions('packaging web extension', isWatch, webpackConfigLocations.map(configPath => ({ configPath })));
+}
diff --git a/lib/vscode/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js
similarity index 100%
rename from lib/vscode/build/gulpfile.hygiene.js
rename to build/gulpfile.hygiene.js
diff --git a/lib/vscode/build/gulpfile.js b/build/gulpfile.js
similarity index 100%
rename from lib/vscode/build/gulpfile.js
rename to build/gulpfile.js
diff --git a/lib/vscode/build/gulpfile.reh.js b/build/gulpfile.reh.js
similarity index 99%
rename from lib/vscode/build/gulpfile.reh.js
rename to build/gulpfile.reh.js
index 6230916a1dc8..387a54cbbfea 100644
--- a/lib/vscode/build/gulpfile.reh.js
+++ b/build/gulpfile.reh.js
@@ -42,7 +42,6 @@ BUILD_TARGETS.forEach(({ platform, arch }) => {
});
function getNodeVersion() {
- return process.versions.node;
const yarnrc = fs.readFileSync(path.join(REPO_ROOT, 'remote', '.yarnrc'), 'utf8');
const target = /^target "(.*)"$/m.exec(yarnrc)[1];
return target;
diff --git a/lib/vscode/build/gulpfile.vscode.js b/build/gulpfile.vscode.js
similarity index 97%
rename from lib/vscode/build/gulpfile.vscode.js
rename to build/gulpfile.vscode.js
index 3eeba69d2581..a6e043f122cb 100644
--- a/lib/vscode/build/gulpfile.vscode.js
+++ b/build/gulpfile.vscode.js
@@ -228,7 +228,14 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
.pipe(jsFilter)
.pipe(util.rewriteSourceMappingURL(sourceMappingURLBase))
.pipe(jsFilter.restore)
- .pipe(createAsar(path.join(process.cwd(), 'node_modules'), ['**/*.node', '**/vscode-ripgrep/bin/*', '**/node-pty/build/Release/*', '**/*.wasm'], 'node_modules.asar'));
+ .pipe(createAsar(path.join(process.cwd(), 'node_modules'), [
+ '**/*.node',
+ '**/vscode-ripgrep/bin/*',
+ '**/node-pty/build/Release/*',
+ '**/node-pty/lib/worker/conoutSocketWorker.js',
+ '**/node-pty/lib/shared/conout.js',
+ '**/*.wasm'
+ ], 'node_modules.asar'));
let all = es.merge(
packageJsonStream,
@@ -383,8 +390,6 @@ BUILD_TARGETS.forEach(buildTarget => {
}
});
-// Transifex Localizations
-
const innoSetupConfig = {
'zh-cn': { codePage: 'CP936', defaultInfo: { name: 'Simplified Chinese', id: '$0804', } },
'zh-tw': { codePage: 'CP950', defaultInfo: { name: 'Traditional Chinese', id: '$0404' } },
@@ -400,6 +405,8 @@ const innoSetupConfig = {
'tr': { codePage: 'CP1254' }
};
+// Transifex Localizations
+
const apiHostname = process.env.TRANSIFEX_API_URL;
const apiName = process.env.TRANSIFEX_API_NAME;
const apiToken = process.env.TRANSIFEX_API_TOKEN;
@@ -434,7 +441,7 @@ gulp.task(task.define(
function () {
const pathToMetadata = './out-vscode/nls.metadata.json';
const pathToExtensions = '.build/extensions/*';
- const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}';
+ const pathToSetup = 'build/win32/i18n/messages.en.isl';
return es.merge(
gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()),
@@ -460,8 +467,8 @@ gulp.task('vscode-translations-import', function () {
}
});
return es.merge([...i18n.defaultLanguages, ...i18n.extraLanguages].map(language => {
- let id = language.transifexId || language.id;
- return gulp.src(`${options.location}/${id}/setup/*/*.xlf`)
+ let id = language.id;
+ return gulp.src(`${options.location}/${id}/vscode-setup/messages.xlf`)
.pipe(i18n.prepareIslFiles(language, innoSetupConfig[language.id]))
.pipe(vfs.dest(`./build/win32/i18n`));
}));
diff --git a/lib/vscode/build/gulpfile.vscode.linux.js b/build/gulpfile.vscode.linux.js
similarity index 100%
rename from lib/vscode/build/gulpfile.vscode.linux.js
rename to build/gulpfile.vscode.linux.js
diff --git a/lib/vscode/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js
similarity index 100%
rename from lib/vscode/build/gulpfile.vscode.web.js
rename to build/gulpfile.vscode.web.js
diff --git a/lib/vscode/build/gulpfile.vscode.win32.js b/build/gulpfile.vscode.win32.js
similarity index 100%
rename from lib/vscode/build/gulpfile.vscode.win32.js
rename to build/gulpfile.vscode.win32.js
diff --git a/lib/vscode/build/hygiene.js b/build/hygiene.js
similarity index 100%
rename from lib/vscode/build/hygiene.js
rename to build/hygiene.js
diff --git a/lib/vscode/build/jsconfig.json b/build/jsconfig.json
similarity index 100%
rename from lib/vscode/build/jsconfig.json
rename to build/jsconfig.json
diff --git a/lib/vscode/build/lib/asar.js b/build/lib/asar.js
similarity index 100%
rename from lib/vscode/build/lib/asar.js
rename to build/lib/asar.js
diff --git a/lib/vscode/build/lib/asar.ts b/build/lib/asar.ts
similarity index 100%
rename from lib/vscode/build/lib/asar.ts
rename to build/lib/asar.ts
diff --git a/lib/vscode/build/lib/builtInExtensions.js b/build/lib/builtInExtensions.js
similarity index 97%
rename from lib/vscode/build/lib/builtInExtensions.js
rename to build/lib/builtInExtensions.js
index 9b8bcc9e0009..d851a6ee5f9a 100644
--- a/lib/vscode/build/lib/builtInExtensions.js
+++ b/build/lib/builtInExtensions.js
@@ -18,8 +18,8 @@ const ansiColors = require("ansi-colors");
const mkdirp = require('mkdirp');
const root = path.dirname(path.dirname(__dirname));
const productjson = JSON.parse(fs.readFileSync(path.join(__dirname, '../../product.json'), 'utf8'));
-const builtInExtensions = productjson.builtInExtensions;
-const webBuiltInExtensions = productjson.webBuiltInExtensions;
+const builtInExtensions = productjson.builtInExtensions || [];
+const webBuiltInExtensions = productjson.webBuiltInExtensions || [];
const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json');
const ENABLE_LOGGING = !process.env['VSCODE_BUILD_BUILTIN_EXTENSIONS_SILENCE_PLEASE'];
function log(...messages) {
diff --git a/lib/vscode/build/lib/builtInExtensions.ts b/build/lib/builtInExtensions.ts
similarity index 99%
rename from lib/vscode/build/lib/builtInExtensions.ts
rename to build/lib/builtInExtensions.ts
index af444defab88..2c1cb3abba2c 100644
--- a/lib/vscode/build/lib/builtInExtensions.ts
+++ b/build/lib/builtInExtensions.ts
@@ -36,8 +36,8 @@ export interface IExtensionDefinition {
const root = path.dirname(path.dirname(__dirname));
const productjson = JSON.parse(fs.readFileSync(path.join(__dirname, '../../product.json'), 'utf8'));
-const builtInExtensions = productjson.builtInExtensions;
-const webBuiltInExtensions = productjson.webBuiltInExtensions;
+const builtInExtensions = productjson.builtInExtensions || [];
+const webBuiltInExtensions = productjson.webBuiltInExtensions || [];
const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json');
const ENABLE_LOGGING = !process.env['VSCODE_BUILD_BUILTIN_EXTENSIONS_SILENCE_PLEASE'];
diff --git a/lib/vscode/build/lib/builtInExtensionsCG.js b/build/lib/builtInExtensionsCG.js
similarity index 96%
rename from lib/vscode/build/lib/builtInExtensionsCG.js
rename to build/lib/builtInExtensionsCG.js
index 10bf38f8c8e2..679663724c8b 100644
--- a/lib/vscode/build/lib/builtInExtensionsCG.js
+++ b/build/lib/builtInExtensionsCG.js
@@ -12,8 +12,8 @@ const ansiColors = require("ansi-colors");
const root = path.dirname(path.dirname(__dirname));
const rootCG = path.join(root, 'extensionsCG');
const productjson = JSON.parse(fs.readFileSync(path.join(__dirname, '../../product.json'), 'utf8'));
-const builtInExtensions = productjson.builtInExtensions;
-const webBuiltInExtensions = productjson.webBuiltInExtensions;
+const builtInExtensions = productjson.builtInExtensions || [];
+const webBuiltInExtensions = productjson.webBuiltInExtensions || [];
const token = process.env['VSCODE_MIXIN_PASSWORD'] || process.env['GITHUB_TOKEN'] || undefined;
const contentBasePath = 'raw.githubusercontent.com';
const contentFileNames = ['package.json', 'package-lock.json', 'yarn.lock'];
diff --git a/lib/vscode/build/lib/builtInExtensionsCG.ts b/build/lib/builtInExtensionsCG.ts
similarity index 98%
rename from lib/vscode/build/lib/builtInExtensionsCG.ts
rename to build/lib/builtInExtensionsCG.ts
index 45785529b66d..2b758da5c912 100644
--- a/lib/vscode/build/lib/builtInExtensionsCG.ts
+++ b/build/lib/builtInExtensionsCG.ts
@@ -13,8 +13,8 @@ import { IExtensionDefinition } from './builtInExtensions';
const root = path.dirname(path.dirname(__dirname));
const rootCG = path.join(root, 'extensionsCG');
const productjson = JSON.parse(fs.readFileSync(path.join(__dirname, '../../product.json'), 'utf8'));
-const builtInExtensions = productjson.builtInExtensions;
-const webBuiltInExtensions = productjson.webBuiltInExtensions;
+const builtInExtensions = productjson.builtInExtensions || [];
+const webBuiltInExtensions = productjson.webBuiltInExtensions || [];
const token = process.env['VSCODE_MIXIN_PASSWORD'] || process.env['GITHUB_TOKEN'] || undefined;
const contentBasePath = 'raw.githubusercontent.com';
diff --git a/lib/vscode/build/lib/bundle.js b/build/lib/bundle.js
similarity index 100%
rename from lib/vscode/build/lib/bundle.js
rename to build/lib/bundle.js
diff --git a/lib/vscode/build/lib/bundle.ts b/build/lib/bundle.ts
similarity index 100%
rename from lib/vscode/build/lib/bundle.ts
rename to build/lib/bundle.ts
diff --git a/lib/vscode/build/lib/compilation.js b/build/lib/compilation.js
similarity index 100%
rename from lib/vscode/build/lib/compilation.js
rename to build/lib/compilation.js
diff --git a/lib/vscode/build/lib/compilation.ts b/build/lib/compilation.ts
similarity index 100%
rename from lib/vscode/build/lib/compilation.ts
rename to build/lib/compilation.ts
diff --git a/lib/vscode/build/lib/dependencies.js b/build/lib/dependencies.js
similarity index 100%
rename from lib/vscode/build/lib/dependencies.js
rename to build/lib/dependencies.js
diff --git a/lib/vscode/build/lib/dependencies.ts b/build/lib/dependencies.ts
similarity index 100%
rename from lib/vscode/build/lib/dependencies.ts
rename to build/lib/dependencies.ts
diff --git a/lib/vscode/build/lib/electron.js b/build/lib/electron.js
similarity index 100%
rename from lib/vscode/build/lib/electron.js
rename to build/lib/electron.js
diff --git a/lib/vscode/build/lib/electron.ts b/build/lib/electron.ts
similarity index 100%
rename from lib/vscode/build/lib/electron.ts
rename to build/lib/electron.ts
diff --git a/lib/vscode/build/lib/eslint/code-import-patterns.js b/build/lib/eslint/code-import-patterns.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-import-patterns.js
rename to build/lib/eslint/code-import-patterns.js
diff --git a/lib/vscode/build/lib/eslint/code-import-patterns.ts b/build/lib/eslint/code-import-patterns.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-import-patterns.ts
rename to build/lib/eslint/code-import-patterns.ts
diff --git a/lib/vscode/build/lib/eslint/code-layering.js b/build/lib/eslint/code-layering.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-layering.js
rename to build/lib/eslint/code-layering.js
diff --git a/lib/vscode/build/lib/eslint/code-layering.ts b/build/lib/eslint/code-layering.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-layering.ts
rename to build/lib/eslint/code-layering.ts
diff --git a/lib/vscode/build/lib/eslint/code-no-nls-in-standalone-editor.js b/build/lib/eslint/code-no-nls-in-standalone-editor.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-no-nls-in-standalone-editor.js
rename to build/lib/eslint/code-no-nls-in-standalone-editor.js
diff --git a/lib/vscode/build/lib/eslint/code-no-nls-in-standalone-editor.ts b/build/lib/eslint/code-no-nls-in-standalone-editor.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-no-nls-in-standalone-editor.ts
rename to build/lib/eslint/code-no-nls-in-standalone-editor.ts
diff --git a/lib/vscode/build/lib/eslint/code-no-standalone-editor.js b/build/lib/eslint/code-no-standalone-editor.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-no-standalone-editor.js
rename to build/lib/eslint/code-no-standalone-editor.js
diff --git a/lib/vscode/build/lib/eslint/code-no-standalone-editor.ts b/build/lib/eslint/code-no-standalone-editor.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-no-standalone-editor.ts
rename to build/lib/eslint/code-no-standalone-editor.ts
diff --git a/lib/vscode/build/lib/eslint/code-no-unexternalized-strings.js b/build/lib/eslint/code-no-unexternalized-strings.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-no-unexternalized-strings.js
rename to build/lib/eslint/code-no-unexternalized-strings.js
diff --git a/lib/vscode/build/lib/eslint/code-no-unexternalized-strings.ts b/build/lib/eslint/code-no-unexternalized-strings.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-no-unexternalized-strings.ts
rename to build/lib/eslint/code-no-unexternalized-strings.ts
diff --git a/lib/vscode/build/lib/eslint/code-no-unused-expressions.js b/build/lib/eslint/code-no-unused-expressions.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-no-unused-expressions.js
rename to build/lib/eslint/code-no-unused-expressions.js
diff --git a/lib/vscode/build/lib/eslint/code-no-unused-expressions.ts b/build/lib/eslint/code-no-unused-expressions.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-no-unused-expressions.ts
rename to build/lib/eslint/code-no-unused-expressions.ts
diff --git a/lib/vscode/build/lib/eslint/code-translation-remind.js b/build/lib/eslint/code-translation-remind.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-translation-remind.js
rename to build/lib/eslint/code-translation-remind.js
diff --git a/lib/vscode/build/lib/eslint/code-translation-remind.ts b/build/lib/eslint/code-translation-remind.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/code-translation-remind.ts
rename to build/lib/eslint/code-translation-remind.ts
diff --git a/lib/vscode/build/lib/eslint/utils.js b/build/lib/eslint/utils.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/utils.js
rename to build/lib/eslint/utils.js
diff --git a/lib/vscode/build/lib/eslint/utils.ts b/build/lib/eslint/utils.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/utils.ts
rename to build/lib/eslint/utils.ts
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-cancellation.js b/build/lib/eslint/vscode-dts-cancellation.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-cancellation.js
rename to build/lib/eslint/vscode-dts-cancellation.js
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-cancellation.ts b/build/lib/eslint/vscode-dts-cancellation.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-cancellation.ts
rename to build/lib/eslint/vscode-dts-cancellation.ts
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-create-func.js b/build/lib/eslint/vscode-dts-create-func.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-create-func.js
rename to build/lib/eslint/vscode-dts-create-func.js
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-create-func.ts b/build/lib/eslint/vscode-dts-create-func.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-create-func.ts
rename to build/lib/eslint/vscode-dts-create-func.ts
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-event-naming.js b/build/lib/eslint/vscode-dts-event-naming.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-event-naming.js
rename to build/lib/eslint/vscode-dts-event-naming.js
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-event-naming.ts b/build/lib/eslint/vscode-dts-event-naming.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-event-naming.ts
rename to build/lib/eslint/vscode-dts-event-naming.ts
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-interface-naming.js b/build/lib/eslint/vscode-dts-interface-naming.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-interface-naming.js
rename to build/lib/eslint/vscode-dts-interface-naming.js
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-interface-naming.ts b/build/lib/eslint/vscode-dts-interface-naming.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-interface-naming.ts
rename to build/lib/eslint/vscode-dts-interface-naming.ts
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-literal-or-types.js b/build/lib/eslint/vscode-dts-literal-or-types.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-literal-or-types.js
rename to build/lib/eslint/vscode-dts-literal-or-types.js
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-literal-or-types.ts b/build/lib/eslint/vscode-dts-literal-or-types.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-literal-or-types.ts
rename to build/lib/eslint/vscode-dts-literal-or-types.ts
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-provider-naming.js b/build/lib/eslint/vscode-dts-provider-naming.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-provider-naming.js
rename to build/lib/eslint/vscode-dts-provider-naming.js
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-provider-naming.ts b/build/lib/eslint/vscode-dts-provider-naming.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-provider-naming.ts
rename to build/lib/eslint/vscode-dts-provider-naming.ts
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-region-comments.js b/build/lib/eslint/vscode-dts-region-comments.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-region-comments.js
rename to build/lib/eslint/vscode-dts-region-comments.js
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-region-comments.ts b/build/lib/eslint/vscode-dts-region-comments.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-region-comments.ts
rename to build/lib/eslint/vscode-dts-region-comments.ts
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-use-thenable.js b/build/lib/eslint/vscode-dts-use-thenable.js
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-use-thenable.js
rename to build/lib/eslint/vscode-dts-use-thenable.js
diff --git a/lib/vscode/build/lib/eslint/vscode-dts-use-thenable.ts b/build/lib/eslint/vscode-dts-use-thenable.ts
similarity index 100%
rename from lib/vscode/build/lib/eslint/vscode-dts-use-thenable.ts
rename to build/lib/eslint/vscode-dts-use-thenable.ts
diff --git a/build/lib/extensions.js b/build/lib/extensions.js
new file mode 100644
index 000000000000..3d6a2906178c
--- /dev/null
+++ b/build/lib/extensions.js
@@ -0,0 +1,460 @@
+"use strict";
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.buildExtensionMedia = exports.webpackExtensions = exports.translatePackageJSON = exports.scanBuiltinExtensions = exports.packageMarketplaceExtensionsStream = exports.packageLocalExtensionsStream = exports.fromMarketplace = void 0;
+const es = require("event-stream");
+const fs = require("fs");
+const cp = require("child_process");
+const glob = require("glob");
+const gulp = require("gulp");
+const path = require("path");
+const File = require("vinyl");
+const stats_1 = require("./stats");
+const util2 = require("./util");
+const vzip = require('gulp-vinyl-zip');
+const filter = require("gulp-filter");
+const rename = require("gulp-rename");
+const fancyLog = require("fancy-log");
+const ansiColors = require("ansi-colors");
+const buffer = require('gulp-buffer');
+const jsoncParser = require("jsonc-parser");
+const util = require('./util');
+const root = path.dirname(path.dirname(__dirname));
+const commit = util.getVersion(root);
+const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
+function minifyExtensionResources(input) {
+ const jsonFilter = filter(['**/*.json', '**/*.code-snippets'], { restore: true });
+ return input
+ .pipe(jsonFilter)
+ .pipe(buffer())
+ .pipe(es.mapSync((f) => {
+ const errors = [];
+ const value = jsoncParser.parse(f.contents.toString('utf8'), errors);
+ if (errors.length === 0) {
+ // file parsed OK => just stringify to drop whitespace and comments
+ f.contents = Buffer.from(JSON.stringify(value));
+ }
+ return f;
+ }))
+ .pipe(jsonFilter.restore);
+}
+function updateExtensionPackageJSON(input, update) {
+ const packageJsonFilter = filter('extensions/*/package.json', { restore: true });
+ return input
+ .pipe(packageJsonFilter)
+ .pipe(buffer())
+ .pipe(es.mapSync((f) => {
+ const data = JSON.parse(f.contents.toString('utf8'));
+ f.contents = Buffer.from(JSON.stringify(update(data)));
+ return f;
+ }))
+ .pipe(packageJsonFilter.restore);
+}
+function fromLocal(extensionPath, forWeb) {
+ const webpackConfigFileName = forWeb ? 'extension-browser.webpack.config.js' : 'extension.webpack.config.js';
+ const isWebPacked = fs.existsSync(path.join(extensionPath, webpackConfigFileName));
+ let input = isWebPacked
+ ? fromLocalWebpack(extensionPath, webpackConfigFileName)
+ : fromLocalNormal(extensionPath);
+ if (isWebPacked) {
+ input = updateExtensionPackageJSON(input, (data) => {
+ delete data.scripts;
+ delete data.dependencies;
+ delete data.devDependencies;
+ if (data.main) {
+ data.main = data.main.replace('/out/', /dist/);
+ }
+ return data;
+ });
+ }
+ return input;
+}
+function fromLocalWebpack(extensionPath, webpackConfigFileName) {
+ const result = es.through();
+ const packagedDependencies = [];
+ const packageJsonConfig = require(path.join(extensionPath, 'package.json'));
+ if (packageJsonConfig.dependencies) {
+ const webpackRootConfig = require(path.join(extensionPath, webpackConfigFileName));
+ for (const key in webpackRootConfig.externals) {
+ if (key in packageJsonConfig.dependencies) {
+ packagedDependencies.push(key);
+ }
+ }
+ }
+ const vsce = require('vsce');
+ const webpack = require('webpack');
+ const webpackGulp = require('webpack-stream');
+ vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn, packagedDependencies }).then(fileNames => {
+ const files = fileNames
+ .map(fileName => path.join(extensionPath, fileName))
+ .map(filePath => new File({
+ path: filePath,
+ stat: fs.statSync(filePath),
+ base: extensionPath,
+ contents: fs.createReadStream(filePath)
+ }));
+ // check for a webpack configuration files, then invoke webpack
+ // and merge its output with the files stream.
+ const webpackConfigLocations = glob.sync(path.join(extensionPath, '**', webpackConfigFileName), { ignore: ['**/node_modules'] });
+ const webpackStreams = webpackConfigLocations.map(webpackConfigPath => {
+ const webpackDone = (err, stats) => {
+ fancyLog(`Bundled extension: ${ansiColors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`);
+ if (err) {
+ result.emit('error', err);
+ }
+ const { compilation } = stats;
+ if (compilation.errors.length > 0) {
+ result.emit('error', compilation.errors.join('\n'));
+ }
+ if (compilation.warnings.length > 0) {
+ result.emit('error', compilation.warnings.join('\n'));
+ }
+ };
+ const webpackConfig = Object.assign(Object.assign({}, require(webpackConfigPath)), { mode: 'production' });
+ const relativeOutputPath = path.relative(extensionPath, webpackConfig.output.path);
+ return webpackGulp(webpackConfig, webpack, webpackDone)
+ .pipe(es.through(function (data) {
+ data.stat = data.stat || {};
+ data.base = extensionPath;
+ this.emit('data', data);
+ }))
+ .pipe(es.through(function (data) {
+ // source map handling:
+ // * rewrite sourceMappingURL
+ // * save to disk so that upload-task picks this up
+ const contents = data.contents.toString('utf8');
+ data.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, function (_m, g1) {
+ return `\n//# sourceMappingURL=${sourceMappingURLBase}/extensions/${path.basename(extensionPath)}/${relativeOutputPath}/${g1}`;
+ }), 'utf8');
+ this.emit('data', data);
+ }));
+ });
+ es.merge(...webpackStreams, es.readArray(files))
+ // .pipe(es.through(function (data) {
+ // // debug
+ // console.log('out', data.path, data.contents.length);
+ // this.emit('data', data);
+ // }))
+ .pipe(result);
+ }).catch(err => {
+ console.error(extensionPath);
+ console.error(packagedDependencies);
+ result.emit('error', err);
+ });
+ return result.pipe(stats_1.createStatsStream(path.basename(extensionPath)));
+}
+function fromLocalNormal(extensionPath) {
+ const result = es.through();
+ const vsce = require('vsce');
+ vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn })
+ .then(fileNames => {
+ const files = fileNames
+ .map(fileName => path.join(extensionPath, fileName))
+ .map(filePath => new File({
+ path: filePath,
+ stat: fs.statSync(filePath),
+ base: extensionPath,
+ contents: fs.createReadStream(filePath)
+ }));
+ es.readArray(files).pipe(result);
+ })
+ .catch(err => result.emit('error', err));
+ return result.pipe(stats_1.createStatsStream(path.basename(extensionPath)));
+}
+const baseHeaders = {
+ 'X-Market-Client-Id': 'VSCode Build',
+ 'User-Agent': 'VSCode Build',
+ 'X-Market-User-Id': '291C1CD0-051A-4123-9B4B-30D60EF52EE2',
+};
+function fromMarketplace(extensionName, version, metadata) {
+ const remote = require('gulp-remote-retry-src');
+ const json = require('gulp-json-editor');
+ const [publisher, name] = extensionName.split('.');
+ const url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${publisher}/vsextensions/${name}/${version}/vspackage`;
+ fancyLog('Downloading extension:', ansiColors.yellow(`${extensionName}@${version}`), '...');
+ const options = {
+ base: url,
+ requestOptions: {
+ gzip: true,
+ headers: baseHeaders
+ }
+ };
+ const packageJsonFilter = filter('package.json', { restore: true });
+ return remote('', options)
+ .pipe(vzip.src())
+ .pipe(filter('extension/**'))
+ .pipe(rename(p => p.dirname = p.dirname.replace(/^extension\/?/, '')))
+ .pipe(packageJsonFilter)
+ .pipe(buffer())
+ .pipe(json({ __metadata: metadata }))
+ .pipe(packageJsonFilter.restore);
+}
+exports.fromMarketplace = fromMarketplace;
+const excludedExtensions = [
+ 'vscode-api-tests',
+ 'vscode-colorize-tests',
+ 'vscode-test-resolver',
+ 'ms-vscode.node-debug',
+ 'ms-vscode.node-debug2',
+ 'vscode-notebook-tests',
+ 'vscode-custom-editor-tests',
+];
+const marketplaceWebExtensionsExclude = new Set([
+ 'ms-vscode.node-debug',
+ 'ms-vscode.node-debug2',
+ 'ms-vscode.js-debug-companion',
+ 'ms-vscode.js-debug',
+ 'ms-vscode.vscode-js-profile-table'
+]);
+const productJson = JSON.parse(fs.readFileSync(path.join(__dirname, '../../product.json'), 'utf8'));
+const builtInExtensions = productJson.builtInExtensions || [];
+const webBuiltInExtensions = productJson.webBuiltInExtensions || [];
+/**
+ * Loosely based on `getExtensionKind` from `src/vs/workbench/services/extensions/common/extensionsUtil.ts`
+ */
+function isWebExtension(manifest) {
+ if (typeof manifest.extensionKind !== 'undefined') {
+ const extensionKind = Array.isArray(manifest.extensionKind) ? manifest.extensionKind : [manifest.extensionKind];
+ return (extensionKind.indexOf('web') >= 0);
+ }
+ return (!Boolean(manifest.main) || Boolean(manifest.browser));
+}
+function packageLocalExtensionsStream(forWeb) {
+ const localExtensionsDescriptions = (glob.sync('extensions/*/package.json')
+ .map(manifestPath => {
+ const absoluteManifestPath = path.join(root, manifestPath);
+ const extensionPath = path.dirname(path.join(root, manifestPath));
+ const extensionName = path.basename(extensionPath);
+ return { name: extensionName, path: extensionPath, manifestPath: absoluteManifestPath };
+ })
+ .filter(({ name }) => excludedExtensions.indexOf(name) === -1)
+ .filter(({ name }) => builtInExtensions.every(b => b.name !== name))
+ .filter(({ manifestPath }) => (forWeb ? isWebExtension(require(manifestPath)) : true)));
+ const localExtensionsStream = minifyExtensionResources(es.merge(...localExtensionsDescriptions.map(extension => {
+ return fromLocal(extension.path, forWeb)
+ .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
+ })));
+ let result;
+ if (forWeb) {
+ result = localExtensionsStream;
+ }
+ else {
+ // also include shared node modules
+ result = es.merge(localExtensionsStream, gulp.src('extensions/node_modules/**', { base: '.' }));
+ }
+ return (result
+ .pipe(util2.setExecutableBit(['**/*.sh'])));
+}
+exports.packageLocalExtensionsStream = packageLocalExtensionsStream;
+function packageMarketplaceExtensionsStream(forWeb) {
+ const marketplaceExtensionsDescriptions = [
+ ...builtInExtensions.filter(({ name }) => (forWeb ? !marketplaceWebExtensionsExclude.has(name) : true)),
+ ...(forWeb ? webBuiltInExtensions : [])
+ ];
+ const marketplaceExtensionsStream = minifyExtensionResources(es.merge(...marketplaceExtensionsDescriptions
+ .map(extension => {
+ const input = fromMarketplace(extension.name, extension.version, extension.metadata)
+ .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
+ return updateExtensionPackageJSON(input, (data) => {
+ delete data.scripts;
+ delete data.dependencies;
+ delete data.devDependencies;
+ return data;
+ });
+ })));
+ return (marketplaceExtensionsStream
+ .pipe(util2.setExecutableBit(['**/*.sh'])));
+}
+exports.packageMarketplaceExtensionsStream = packageMarketplaceExtensionsStream;
+function scanBuiltinExtensions(extensionsRoot, exclude = []) {
+ const scannedExtensions = [];
+ try {
+ const extensionsFolders = fs.readdirSync(extensionsRoot);
+ for (const extensionFolder of extensionsFolders) {
+ if (exclude.indexOf(extensionFolder) >= 0) {
+ continue;
+ }
+ const packageJSONPath = path.join(extensionsRoot, extensionFolder, 'package.json');
+ if (!fs.existsSync(packageJSONPath)) {
+ continue;
+ }
+ let packageJSON = JSON.parse(fs.readFileSync(packageJSONPath).toString('utf8'));
+ if (!isWebExtension(packageJSON)) {
+ continue;
+ }
+ const children = fs.readdirSync(path.join(extensionsRoot, extensionFolder));
+ const packageNLSPath = children.filter(child => child === 'package.nls.json')[0];
+ const packageNLS = packageNLSPath ? JSON.parse(fs.readFileSync(path.join(extensionsRoot, extensionFolder, packageNLSPath)).toString()) : undefined;
+ const readme = children.filter(child => /^readme(\.txt|\.md|)$/i.test(child))[0];
+ const changelog = children.filter(child => /^changelog(\.txt|\.md|)$/i.test(child))[0];
+ scannedExtensions.push({
+ extensionPath: extensionFolder,
+ packageJSON,
+ packageNLS,
+ readmePath: readme ? path.join(extensionFolder, readme) : undefined,
+ changelogPath: changelog ? path.join(extensionFolder, changelog) : undefined,
+ });
+ }
+ return scannedExtensions;
+ }
+ catch (ex) {
+ return scannedExtensions;
+ }
+}
+exports.scanBuiltinExtensions = scanBuiltinExtensions;
+function translatePackageJSON(packageJSON, packageNLSPath) {
+ const CharCode_PC = '%'.charCodeAt(0);
+ const packageNls = JSON.parse(fs.readFileSync(packageNLSPath).toString());
+ const translate = (obj) => {
+ for (let key in obj) {
+ const val = obj[key];
+ if (Array.isArray(val)) {
+ val.forEach(translate);
+ }
+ else if (val && typeof val === 'object') {
+ translate(val);
+ }
+ else if (typeof val === 'string' && val.charCodeAt(0) === CharCode_PC && val.charCodeAt(val.length - 1) === CharCode_PC) {
+ const translated = packageNls[val.substr(1, val.length - 2)];
+ if (translated) {
+ obj[key] = translated;
+ }
+ }
+ }
+ };
+ translate(packageJSON);
+ return packageJSON;
+}
+exports.translatePackageJSON = translatePackageJSON;
+const extensionsPath = path.join(root, 'extensions');
+// Additional projects to webpack. These typically build code for webviews
+const webpackMediaConfigFiles = [
+ 'markdown-language-features/webpack.config.js',
+ 'simple-browser/webpack.config.js',
+];
+// Additional projects to run esbuild on. These typically build code for webviews
+const esbuildMediaScripts = [
+ 'markdown-language-features/esbuild.js',
+ 'notebook-markdown-extensions/esbuild.js',
+];
+async function webpackExtensions(taskName, isWatch, webpackConfigLocations) {
+ const webpack = require('webpack');
+ const webpackConfigs = [];
+ for (const { configPath, outputRoot } of webpackConfigLocations) {
+ const configOrFnOrArray = require(configPath);
+ function addConfig(configOrFn) {
+ let config;
+ if (typeof configOrFn === 'function') {
+ config = configOrFn({}, {});
+ webpackConfigs.push(config);
+ }
+ else {
+ config = configOrFn;
+ }
+ if (outputRoot) {
+ config.output.path = path.join(outputRoot, path.relative(path.dirname(configPath), config.output.path));
+ }
+ webpackConfigs.push(configOrFn);
+ }
+ addConfig(configOrFnOrArray);
+ }
+ function reporter(fullStats) {
+ if (Array.isArray(fullStats.children)) {
+ for (const stats of fullStats.children) {
+ const outputPath = stats.outputPath;
+ if (outputPath) {
+ const relativePath = path.relative(extensionsPath, outputPath).replace(/\\/g, '/');
+ const match = relativePath.match(/[^\/]+(\/server|\/client)?/);
+ fancyLog(`Finished ${ansiColors.green(taskName)} ${ansiColors.cyan(match[0])} with ${stats.errors.length} errors.`);
+ }
+ if (Array.isArray(stats.errors)) {
+ stats.errors.forEach((error) => {
+ fancyLog.error(error);
+ });
+ }
+ if (Array.isArray(stats.warnings)) {
+ stats.warnings.forEach((warning) => {
+ fancyLog.warn(warning);
+ });
+ }
+ }
+ }
+ }
+ return new Promise((resolve, reject) => {
+ if (isWatch) {
+ webpack(webpackConfigs).watch({}, (err, stats) => {
+ if (err) {
+ reject();
+ }
+ else {
+ reporter(stats.toJson());
+ }
+ });
+ }
+ else {
+ webpack(webpackConfigs).run((err, stats) => {
+ if (err) {
+ fancyLog.error(err);
+ reject();
+ }
+ else {
+ reporter(stats.toJson());
+ resolve();
+ }
+ });
+ }
+ });
+}
+exports.webpackExtensions = webpackExtensions;
+async function esbuildExtensions(taskName, isWatch, scripts) {
+ function reporter(stdError, script) {
+ const matches = (stdError || '').match(/\> (.+): error: (.+)?/g);
+ fancyLog(`Finished ${ansiColors.green(taskName)} ${script} with ${matches ? matches.length : 0} errors.`);
+ for (const match of matches || []) {
+ fancyLog.error(match);
+ }
+ }
+ const tasks = scripts.map(({ script, outputRoot }) => {
+ return new Promise((resolve, reject) => {
+ const args = [script];
+ if (isWatch) {
+ args.push('--watch');
+ }
+ if (outputRoot) {
+ args.push('--outputRoot', outputRoot);
+ }
+ const proc = cp.execFile(process.argv[0], args, {}, (error, _stdout, stderr) => {
+ if (error) {
+ return reject(error);
+ }
+ reporter(stderr, script);
+ if (stderr) {
+ return reject();
+ }
+ return resolve();
+ });
+ proc.stdout.on('data', (data) => {
+ fancyLog(`${ansiColors.green(taskName)}: ${data.toString('utf8')}`);
+ });
+ });
+ });
+ return Promise.all(tasks);
+}
+async function buildExtensionMedia(isWatch, outputRoot) {
+ return Promise.all([
+ webpackExtensions('webpacking extension media', isWatch, webpackMediaConfigFiles.map(p => {
+ return {
+ configPath: path.join(extensionsPath, p),
+ outputRoot: outputRoot ? path.join(root, outputRoot, path.dirname(p)) : undefined
+ };
+ })),
+ esbuildExtensions('esbuilding extension media', isWatch, esbuildMediaScripts.map(p => ({
+ script: path.join(extensionsPath, p),
+ outputRoot: outputRoot ? path.join(root, outputRoot, path.dirname(p)) : undefined
+ }))),
+ ]);
+}
+exports.buildExtensionMedia = buildExtensionMedia;
diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts
new file mode 100644
index 000000000000..6c55569b9731
--- /dev/null
+++ b/build/lib/extensions.ts
@@ -0,0 +1,542 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as es from 'event-stream';
+import * as fs from 'fs';
+import * as cp from 'child_process';
+import * as glob from 'glob';
+import * as gulp from 'gulp';
+import * as path from 'path';
+import { Stream } from 'stream';
+import * as File from 'vinyl';
+import { createStatsStream } from './stats';
+import * as util2 from './util';
+const vzip = require('gulp-vinyl-zip');
+import filter = require('gulp-filter');
+import rename = require('gulp-rename');
+import * as fancyLog from 'fancy-log';
+import * as ansiColors from 'ansi-colors';
+const buffer = require('gulp-buffer');
+import * as jsoncParser from 'jsonc-parser';
+import webpack = require('webpack');
+const util = require('./util');
+const root = path.dirname(path.dirname(__dirname));
+const commit = util.getVersion(root);
+const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
+
+function minifyExtensionResources(input: Stream): Stream {
+ const jsonFilter = filter(['**/*.json', '**/*.code-snippets'], { restore: true });
+ return input
+ .pipe(jsonFilter)
+ .pipe(buffer())
+ .pipe(es.mapSync((f: File) => {
+ const errors: jsoncParser.ParseError[] = [];
+ const value = jsoncParser.parse(f.contents.toString('utf8'), errors);
+ if (errors.length === 0) {
+ // file parsed OK => just stringify to drop whitespace and comments
+ f.contents = Buffer.from(JSON.stringify(value));
+ }
+ return f;
+ }))
+ .pipe(jsonFilter.restore);
+}
+
+function updateExtensionPackageJSON(input: Stream, update: (data: any) => any): Stream {
+ const packageJsonFilter = filter('extensions/*/package.json', { restore: true });
+ return input
+ .pipe(packageJsonFilter)
+ .pipe(buffer())
+ .pipe(es.mapSync((f: File) => {
+ const data = JSON.parse(f.contents.toString('utf8'));
+ f.contents = Buffer.from(JSON.stringify(update(data)));
+ return f;
+ }))
+ .pipe(packageJsonFilter.restore);
+}
+
+function fromLocal(extensionPath: string, forWeb: boolean): Stream {
+ const webpackConfigFileName = forWeb ? 'extension-browser.webpack.config.js' : 'extension.webpack.config.js';
+
+ const isWebPacked = fs.existsSync(path.join(extensionPath, webpackConfigFileName));
+ let input = isWebPacked
+ ? fromLocalWebpack(extensionPath, webpackConfigFileName)
+ : fromLocalNormal(extensionPath);
+
+ if (isWebPacked) {
+ input = updateExtensionPackageJSON(input, (data: any) => {
+ delete data.scripts;
+ delete data.dependencies;
+ delete data.devDependencies;
+ if (data.main) {
+ data.main = data.main.replace('/out/', /dist/);
+ }
+ return data;
+ });
+ }
+
+ return input;
+}
+
+
+function fromLocalWebpack(extensionPath: string, webpackConfigFileName: string): Stream {
+ const result = es.through();
+
+ const packagedDependencies: string[] = [];
+ const packageJsonConfig = require(path.join(extensionPath, 'package.json'));
+ if (packageJsonConfig.dependencies) {
+ const webpackRootConfig = require(path.join(extensionPath, webpackConfigFileName));
+ for (const key in webpackRootConfig.externals) {
+ if (key in packageJsonConfig.dependencies) {
+ packagedDependencies.push(key);
+ }
+ }
+ }
+
+ const vsce = require('vsce') as typeof import('vsce');
+ const webpack = require('webpack');
+ const webpackGulp = require('webpack-stream');
+
+ vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn, packagedDependencies }).then(fileNames => {
+ const files = fileNames
+ .map(fileName => path.join(extensionPath, fileName))
+ .map(filePath => new File({
+ path: filePath,
+ stat: fs.statSync(filePath),
+ base: extensionPath,
+ contents: fs.createReadStream(filePath) as any
+ }));
+
+ // check for a webpack configuration files, then invoke webpack
+ // and merge its output with the files stream.
+ const webpackConfigLocations = (glob.sync(
+ path.join(extensionPath, '**', webpackConfigFileName),
+ { ignore: ['**/node_modules'] }
+ ));
+
+ const webpackStreams = webpackConfigLocations.map(webpackConfigPath => {
+
+ const webpackDone = (err: any, stats: any) => {
+ fancyLog(`Bundled extension: ${ansiColors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`);
+ if (err) {
+ result.emit('error', err);
+ }
+ const { compilation } = stats;
+ if (compilation.errors.length > 0) {
+ result.emit('error', compilation.errors.join('\n'));
+ }
+ if (compilation.warnings.length > 0) {
+ result.emit('error', compilation.warnings.join('\n'));
+ }
+ };
+
+ const webpackConfig = {
+ ...require(webpackConfigPath),
+ ...{ mode: 'production' }
+ };
+ const relativeOutputPath = path.relative(extensionPath, webpackConfig.output.path);
+
+ return webpackGulp(webpackConfig, webpack, webpackDone)
+ .pipe(es.through(function (data) {
+ data.stat = data.stat || {};
+ data.base = extensionPath;
+ this.emit('data', data);
+ }))
+ .pipe(es.through(function (data: File) {
+ // source map handling:
+ // * rewrite sourceMappingURL
+ // * save to disk so that upload-task picks this up
+ const contents = (data.contents).toString('utf8');
+ data.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, function (_m, g1) {
+ return `\n//# sourceMappingURL=${sourceMappingURLBase}/extensions/${path.basename(extensionPath)}/${relativeOutputPath}/${g1}`;
+ }), 'utf8');
+
+ this.emit('data', data);
+ }));
+ });
+
+ es.merge(...webpackStreams, es.readArray(files))
+ // .pipe(es.through(function (data) {
+ // // debug
+ // console.log('out', data.path, data.contents.length);
+ // this.emit('data', data);
+ // }))
+ .pipe(result);
+
+ }).catch(err => {
+ console.error(extensionPath);
+ console.error(packagedDependencies);
+ result.emit('error', err);
+ });
+
+ return result.pipe(createStatsStream(path.basename(extensionPath)));
+}
+
+function fromLocalNormal(extensionPath: string): Stream {
+ const result = es.through();
+
+ const vsce = require('vsce') as typeof import('vsce');
+
+ vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn })
+ .then(fileNames => {
+ const files = fileNames
+ .map(fileName => path.join(extensionPath, fileName))
+ .map(filePath => new File({
+ path: filePath,
+ stat: fs.statSync(filePath),
+ base: extensionPath,
+ contents: fs.createReadStream(filePath) as any
+ }));
+
+ es.readArray(files).pipe(result);
+ })
+ .catch(err => result.emit('error', err));
+
+ return result.pipe(createStatsStream(path.basename(extensionPath)));
+}
+
+const baseHeaders = {
+ 'X-Market-Client-Id': 'VSCode Build',
+ 'User-Agent': 'VSCode Build',
+ 'X-Market-User-Id': '291C1CD0-051A-4123-9B4B-30D60EF52EE2',
+};
+
+export function fromMarketplace(extensionName: string, version: string, metadata: any): Stream {
+ const remote = require('gulp-remote-retry-src');
+ const json = require('gulp-json-editor') as typeof import('gulp-json-editor');
+
+ const [publisher, name] = extensionName.split('.');
+ const url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${publisher}/vsextensions/${name}/${version}/vspackage`;
+
+ fancyLog('Downloading extension:', ansiColors.yellow(`${extensionName}@${version}`), '...');
+
+ const options = {
+ base: url,
+ requestOptions: {
+ gzip: true,
+ headers: baseHeaders
+ }
+ };
+
+ const packageJsonFilter = filter('package.json', { restore: true });
+
+ return remote('', options)
+ .pipe(vzip.src())
+ .pipe(filter('extension/**'))
+ .pipe(rename(p => p.dirname = p.dirname!.replace(/^extension\/?/, '')))
+ .pipe(packageJsonFilter)
+ .pipe(buffer())
+ .pipe(json({ __metadata: metadata }))
+ .pipe(packageJsonFilter.restore);
+}
+const excludedExtensions = [
+ 'vscode-api-tests',
+ 'vscode-colorize-tests',
+ 'vscode-test-resolver',
+ 'ms-vscode.node-debug',
+ 'ms-vscode.node-debug2',
+ 'vscode-notebook-tests',
+ 'vscode-custom-editor-tests',
+];
+
+const marketplaceWebExtensionsExclude = new Set([
+ 'ms-vscode.node-debug',
+ 'ms-vscode.node-debug2',
+ 'ms-vscode.js-debug-companion',
+ 'ms-vscode.js-debug',
+ 'ms-vscode.vscode-js-profile-table'
+]);
+
+interface IBuiltInExtension {
+ name: string;
+ version: string;
+ repo: string;
+ metadata: any;
+}
+
+const productJson = JSON.parse(fs.readFileSync(path.join(__dirname, '../../product.json'), 'utf8'));
+const builtInExtensions: IBuiltInExtension[] = productJson.builtInExtensions || [];
+const webBuiltInExtensions: IBuiltInExtension[] = productJson.webBuiltInExtensions || [];
+
+type ExtensionKind = 'ui' | 'workspace' | 'web';
+interface IExtensionManifest {
+ main: string;
+ browser: string;
+ extensionKind?: ExtensionKind | ExtensionKind[];
+}
+/**
+ * Loosely based on `getExtensionKind` from `src/vs/workbench/services/extensions/common/extensionsUtil.ts`
+ */
+function isWebExtension(manifest: IExtensionManifest): boolean {
+ if (typeof manifest.extensionKind !== 'undefined') {
+ const extensionKind = Array.isArray(manifest.extensionKind) ? manifest.extensionKind : [manifest.extensionKind];
+ return (extensionKind.indexOf('web') >= 0);
+ }
+ return (!Boolean(manifest.main) || Boolean(manifest.browser));
+}
+
+export function packageLocalExtensionsStream(forWeb: boolean): Stream {
+ const localExtensionsDescriptions = (
+ (glob.sync('extensions/*/package.json'))
+ .map(manifestPath => {
+ const absoluteManifestPath = path.join(root, manifestPath);
+ const extensionPath = path.dirname(path.join(root, manifestPath));
+ const extensionName = path.basename(extensionPath);
+ return { name: extensionName, path: extensionPath, manifestPath: absoluteManifestPath };
+ })
+ .filter(({ name }) => excludedExtensions.indexOf(name) === -1)
+ .filter(({ name }) => builtInExtensions.every(b => b.name !== name))
+ .filter(({ manifestPath }) => (forWeb ? isWebExtension(require(manifestPath)) : true))
+ );
+ const localExtensionsStream = minifyExtensionResources(
+ es.merge(
+ ...localExtensionsDescriptions.map(extension => {
+ return fromLocal(extension.path, forWeb)
+ .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
+ })
+ )
+ );
+
+ let result: Stream;
+ if (forWeb) {
+ result = localExtensionsStream;
+ } else {
+ // also include shared node modules
+ result = es.merge(localExtensionsStream, gulp.src('extensions/node_modules/**', { base: '.' }));
+ }
+
+ return (
+ result
+ .pipe(util2.setExecutableBit(['**/*.sh']))
+ );
+}
+
+export function packageMarketplaceExtensionsStream(forWeb: boolean): Stream {
+ const marketplaceExtensionsDescriptions = [
+ ...builtInExtensions.filter(({ name }) => (forWeb ? !marketplaceWebExtensionsExclude.has(name) : true)),
+ ...(forWeb ? webBuiltInExtensions : [])
+ ];
+ const marketplaceExtensionsStream = minifyExtensionResources(
+ es.merge(
+ ...marketplaceExtensionsDescriptions
+ .map(extension => {
+ const input = fromMarketplace(extension.name, extension.version, extension.metadata)
+ .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
+ return updateExtensionPackageJSON(input, (data: any) => {
+ delete data.scripts;
+ delete data.dependencies;
+ delete data.devDependencies;
+ return data;
+ });
+ })
+ )
+ );
+
+ return (
+ marketplaceExtensionsStream
+ .pipe(util2.setExecutableBit(['**/*.sh']))
+ );
+}
+
+export interface IScannedBuiltinExtension {
+ extensionPath: string;
+ packageJSON: any;
+ packageNLS?: any;
+ readmePath?: string;
+ changelogPath?: string;
+}
+
+export function scanBuiltinExtensions(extensionsRoot: string, exclude: string[] = []): IScannedBuiltinExtension[] {
+ const scannedExtensions: IScannedBuiltinExtension[] = [];
+
+ try {
+ const extensionsFolders = fs.readdirSync(extensionsRoot);
+ for (const extensionFolder of extensionsFolders) {
+ if (exclude.indexOf(extensionFolder) >= 0) {
+ continue;
+ }
+ const packageJSONPath = path.join(extensionsRoot, extensionFolder, 'package.json');
+ if (!fs.existsSync(packageJSONPath)) {
+ continue;
+ }
+ let packageJSON = JSON.parse(fs.readFileSync(packageJSONPath).toString('utf8'));
+ if (!isWebExtension(packageJSON)) {
+ continue;
+ }
+ const children = fs.readdirSync(path.join(extensionsRoot, extensionFolder));
+ const packageNLSPath = children.filter(child => child === 'package.nls.json')[0];
+ const packageNLS = packageNLSPath ? JSON.parse(fs.readFileSync(path.join(extensionsRoot, extensionFolder, packageNLSPath)).toString()) : undefined;
+ const readme = children.filter(child => /^readme(\.txt|\.md|)$/i.test(child))[0];
+ const changelog = children.filter(child => /^changelog(\.txt|\.md|)$/i.test(child))[0];
+
+ scannedExtensions.push({
+ extensionPath: extensionFolder,
+ packageJSON,
+ packageNLS,
+ readmePath: readme ? path.join(extensionFolder, readme) : undefined,
+ changelogPath: changelog ? path.join(extensionFolder, changelog) : undefined,
+ });
+ }
+ return scannedExtensions;
+ } catch (ex) {
+ return scannedExtensions;
+ }
+}
+
+export function translatePackageJSON(packageJSON: string, packageNLSPath: string) {
+ const CharCode_PC = '%'.charCodeAt(0);
+ const packageNls = JSON.parse(fs.readFileSync(packageNLSPath).toString());
+ const translate = (obj: any) => {
+ for (let key in obj) {
+ const val = obj[key];
+ if (Array.isArray(val)) {
+ val.forEach(translate);
+ } else if (val && typeof val === 'object') {
+ translate(val);
+ } else if (typeof val === 'string' && val.charCodeAt(0) === CharCode_PC && val.charCodeAt(val.length - 1) === CharCode_PC) {
+ const translated = packageNls[val.substr(1, val.length - 2)];
+ if (translated) {
+ obj[key] = translated;
+ }
+ }
+ }
+ };
+ translate(packageJSON);
+ return packageJSON;
+}
+
+const extensionsPath = path.join(root, 'extensions');
+
+// Additional projects to webpack. These typically build code for webviews
+const webpackMediaConfigFiles = [
+ 'markdown-language-features/webpack.config.js',
+ 'simple-browser/webpack.config.js',
+];
+
+// Additional projects to run esbuild on. These typically build code for webviews
+const esbuildMediaScripts = [
+ 'markdown-language-features/esbuild.js',
+ 'notebook-markdown-extensions/esbuild.js',
+];
+
+export async function webpackExtensions(taskName: string, isWatch: boolean, webpackConfigLocations: { configPath: string, outputRoot?: string }[]) {
+ const webpack = require('webpack') as typeof import('webpack');
+
+ const webpackConfigs: webpack.Configuration[] = [];
+
+ for (const { configPath, outputRoot } of webpackConfigLocations) {
+ const configOrFnOrArray = require(configPath);
+ function addConfig(configOrFn: webpack.Configuration | Function) {
+ let config;
+ if (typeof configOrFn === 'function') {
+ config = configOrFn({}, {});
+ webpackConfigs.push(config);
+ } else {
+ config = configOrFn;
+ }
+
+ if (outputRoot) {
+ config.output.path = path.join(outputRoot, path.relative(path.dirname(configPath), config.output.path));
+ }
+
+ webpackConfigs.push(configOrFn);
+ }
+ addConfig(configOrFnOrArray);
+ }
+ function reporter(fullStats: any) {
+ if (Array.isArray(fullStats.children)) {
+ for (const stats of fullStats.children) {
+ const outputPath = stats.outputPath;
+ if (outputPath) {
+ const relativePath = path.relative(extensionsPath, outputPath).replace(/\\/g, '/');
+ const match = relativePath.match(/[^\/]+(\/server|\/client)?/);
+ fancyLog(`Finished ${ansiColors.green(taskName)} ${ansiColors.cyan(match![0])} with ${stats.errors.length} errors.`);
+ }
+ if (Array.isArray(stats.errors)) {
+ stats.errors.forEach((error: any) => {
+ fancyLog.error(error);
+ });
+ }
+ if (Array.isArray(stats.warnings)) {
+ stats.warnings.forEach((warning: any) => {
+ fancyLog.warn(warning);
+ });
+ }
+ }
+ }
+ }
+ return new Promise((resolve, reject) => {
+ if (isWatch) {
+ webpack(webpackConfigs).watch({}, (err, stats) => {
+ if (err) {
+ reject();
+ } else {
+ reporter(stats.toJson());
+ }
+ });
+ } else {
+ webpack(webpackConfigs).run((err, stats) => {
+ if (err) {
+ fancyLog.error(err);
+ reject();
+ } else {
+ reporter(stats.toJson());
+ resolve();
+ }
+ });
+ }
+ });
+}
+
+async function esbuildExtensions(taskName: string, isWatch: boolean, scripts: { script: string, outputRoot?: string }[]) {
+ function reporter(stdError: string, script: string) {
+ const matches = (stdError || '').match(/\> (.+): error: (.+)?/g);
+ fancyLog(`Finished ${ansiColors.green(taskName)} ${script} with ${matches ? matches.length : 0} errors.`);
+ for (const match of matches || []) {
+ fancyLog.error(match);
+ }
+ }
+
+ const tasks = scripts.map(({ script, outputRoot }) => {
+ return new Promise((resolve, reject) => {
+ const args = [script];
+ if (isWatch) {
+ args.push('--watch');
+ }
+ if (outputRoot) {
+ args.push('--outputRoot', outputRoot);
+ }
+ const proc = cp.execFile(process.argv[0], args, {}, (error, _stdout, stderr) => {
+ if (error) {
+ return reject(error);
+ }
+ reporter(stderr, script);
+ if (stderr) {
+ return reject();
+ }
+ return resolve();
+ });
+
+ proc.stdout!.on('data', (data) => {
+ fancyLog(`${ansiColors.green(taskName)}: ${data.toString('utf8')}`);
+ });
+ });
+ });
+ return Promise.all(tasks);
+}
+
+export async function buildExtensionMedia(isWatch: boolean, outputRoot?: string) {
+ return Promise.all([
+ webpackExtensions('webpacking extension media', isWatch, webpackMediaConfigFiles.map(p => {
+ return {
+ configPath: path.join(extensionsPath, p),
+ outputRoot: outputRoot ? path.join(root, outputRoot, path.dirname(p)) : undefined
+ };
+ })),
+ esbuildExtensions('esbuilding extension media', isWatch, esbuildMediaScripts.map(p => ({
+ script: path.join(extensionsPath, p),
+ outputRoot: outputRoot ? path.join(root, outputRoot, path.dirname(p)) : undefined
+ }))),
+ ]);
+}
diff --git a/lib/vscode/build/lib/git.js b/build/lib/git.js
similarity index 100%
rename from lib/vscode/build/lib/git.js
rename to build/lib/git.js
diff --git a/lib/vscode/build/lib/git.ts b/build/lib/git.ts
similarity index 100%
rename from lib/vscode/build/lib/git.ts
rename to build/lib/git.ts
diff --git a/build/lib/i18n.js b/build/lib/i18n.js
new file mode 100644
index 000000000000..4c7c5c32eb44
--- /dev/null
+++ b/build/lib/i18n.js
@@ -0,0 +1,1163 @@
+"use strict";
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.prepareIslFiles = exports.prepareI18nPackFiles = exports.prepareI18nFiles = exports.pullSetupXlfFiles = exports.findObsoleteResources = exports.pushXlfFiles = exports.createXlfFilesForIsl = exports.createXlfFilesForExtensions = exports.createXlfFilesForCoreBundle = exports.getResource = exports.processNlsFiles = exports.Limiter = exports.XLF = exports.Line = exports.externalExtensionsWithTranslations = exports.extraLanguages = exports.defaultLanguages = void 0;
+const path = require("path");
+const fs = require("fs");
+const event_stream_1 = require("event-stream");
+const File = require("vinyl");
+const Is = require("is");
+const xml2js = require("xml2js");
+const https = require("https");
+const gulp = require("gulp");
+const fancyLog = require("fancy-log");
+const ansiColors = require("ansi-colors");
+const iconv = require("iconv-lite-umd");
+const NUMBER_OF_CONCURRENT_DOWNLOADS = 4;
+function log(message, ...rest) {
+ fancyLog(ansiColors.green('[i18n]'), message, ...rest);
+}
+exports.defaultLanguages = [
+ { id: 'zh-tw', folderName: 'cht', translationId: 'zh-hant' },
+ { id: 'zh-cn', folderName: 'chs', translationId: 'zh-hans' },
+ { id: 'ja', folderName: 'jpn' },
+ { id: 'ko', folderName: 'kor' },
+ { id: 'de', folderName: 'deu' },
+ { id: 'fr', folderName: 'fra' },
+ { id: 'es', folderName: 'esn' },
+ { id: 'ru', folderName: 'rus' },
+ { id: 'it', folderName: 'ita' }
+];
+// languages requested by the community to non-stable builds
+exports.extraLanguages = [
+ { id: 'pt-br', folderName: 'ptb' },
+ { id: 'hu', folderName: 'hun' },
+ { id: 'tr', folderName: 'trk' }
+];
+// non built-in extensions also that are transifex and need to be part of the language packs
+exports.externalExtensionsWithTranslations = {
+ 'vscode-chrome-debug': 'msjsdiag.debugger-for-chrome',
+ 'vscode-node-debug': 'ms-vscode.node-debug',
+ 'vscode-node-debug2': 'ms-vscode.node-debug2'
+};
+var LocalizeInfo;
+(function (LocalizeInfo) {
+ function is(value) {
+ let candidate = value;
+ return Is.defined(candidate) && Is.string(candidate.key) && (Is.undef(candidate.comment) || (Is.array(candidate.comment) && candidate.comment.every(element => Is.string(element))));
+ }
+ LocalizeInfo.is = is;
+})(LocalizeInfo || (LocalizeInfo = {}));
+var BundledFormat;
+(function (BundledFormat) {
+ function is(value) {
+ if (Is.undef(value)) {
+ return false;
+ }
+ let candidate = value;
+ let length = Object.keys(value).length;
+ return length === 3 && Is.defined(candidate.keys) && Is.defined(candidate.messages) && Is.defined(candidate.bundles);
+ }
+ BundledFormat.is = is;
+})(BundledFormat || (BundledFormat = {}));
+var PackageJsonFormat;
+(function (PackageJsonFormat) {
+ function is(value) {
+ if (Is.undef(value) || !Is.object(value)) {
+ return false;
+ }
+ return Object.keys(value).every(key => {
+ let element = value[key];
+ return Is.string(element) || (Is.object(element) && Is.defined(element.message) && Is.defined(element.comment));
+ });
+ }
+ PackageJsonFormat.is = is;
+})(PackageJsonFormat || (PackageJsonFormat = {}));
+class Line {
+ constructor(indent = 0) {
+ this.buffer = [];
+ if (indent > 0) {
+ this.buffer.push(new Array(indent + 1).join(' '));
+ }
+ }
+ append(value) {
+ this.buffer.push(value);
+ return this;
+ }
+ toString() {
+ return this.buffer.join('');
+ }
+}
+exports.Line = Line;
+class TextModel {
+ constructor(contents) {
+ this._lines = contents.split(/\r\n|\r|\n/);
+ }
+ get lines() {
+ return this._lines;
+ }
+}
+class XLF {
+ constructor(project) {
+ this.project = project;
+ this.buffer = [];
+ this.files = Object.create(null);
+ this.numberOfMessages = 0;
+ }
+ toString() {
+ this.appendHeader();
+ const files = Object.keys(this.files).sort();
+ for (const file of files) {
+ this.appendNewLine(``, 2);
+ const items = this.files[file].sort((a, b) => {
+ return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
+ });
+ for (const item of items) {
+ this.addStringItem(file, item);
+ }
+ this.appendNewLine('');
+ }
+ this.appendFooter();
+ return this.buffer.join('\r\n');
+ }
+ addFile(original, keys, messages) {
+ if (keys.length === 0) {
+ console.log('No keys in ' + original);
+ return;
+ }
+ if (keys.length !== messages.length) {
+ throw new Error(`Unmatching keys(${keys.length}) and messages(${messages.length}).`);
+ }
+ this.numberOfMessages += keys.length;
+ this.files[original] = [];
+ let existingKeys = new Set();
+ for (let i = 0; i < keys.length; i++) {
+ let key = keys[i];
+ let realKey;
+ let comment;
+ if (Is.string(key)) {
+ realKey = key;
+ comment = undefined;
+ }
+ else if (LocalizeInfo.is(key)) {
+ realKey = key.key;
+ if (key.comment && key.comment.length > 0) {
+ comment = key.comment.map(comment => encodeEntities(comment)).join('\r\n');
+ }
+ }
+ if (!realKey || existingKeys.has(realKey)) {
+ continue;
+ }
+ existingKeys.add(realKey);
+ let message = encodeEntities(messages[i]);
+ this.files[original].push({ id: realKey, message: message, comment: comment });
+ }
+ }
+ addStringItem(file, item) {
+ if (!item.id || item.message === undefined || item.message === null) {
+ throw new Error(`No item ID or value specified: ${JSON.stringify(item)}. File: ${file}`);
+ }
+ if (item.message.length === 0) {
+ log(`Item with id ${item.id} in file ${file} has an empty message.`);
+ }
+ this.appendNewLine(``, 4);
+ this.appendNewLine(``, 6);
+ if (item.comment) {
+ this.appendNewLine(`${item.comment}`, 6);
+ }
+ this.appendNewLine('', 4);
+ }
+ appendHeader() {
+ this.appendNewLine('', 0);
+ this.appendNewLine('', 0);
+ }
+ appendFooter() {
+ this.appendNewLine('', 0);
+ }
+ appendNewLine(content, indent) {
+ let line = new Line(indent);
+ line.append(content);
+ this.buffer.push(line.toString());
+ }
+}
+exports.XLF = XLF;
+XLF.parsePseudo = function (xlfString) {
+ return new Promise((resolve) => {
+ let parser = new xml2js.Parser();
+ let files = [];
+ parser.parseString(xlfString, function (_err, result) {
+ const fileNodes = result['xliff']['file'];
+ fileNodes.forEach(file => {
+ const originalFilePath = file.$.original;
+ const messages = {};
+ const transUnits = file.body[0]['trans-unit'];
+ if (transUnits) {
+ transUnits.forEach((unit) => {
+ const key = unit.$.id;
+ const val = pseudify(unit.source[0]['_'].toString());
+ if (key && val) {
+ messages[key] = decodeEntities(val);
+ }
+ });
+ files.push({ messages: messages, originalFilePath: originalFilePath, language: 'ps' });
+ }
+ });
+ resolve(files);
+ });
+ });
+};
+XLF.parse = function (xlfString) {
+ return new Promise((resolve, reject) => {
+ let parser = new xml2js.Parser();
+ let files = [];
+ parser.parseString(xlfString, function (err, result) {
+ if (err) {
+ reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`));
+ }
+ const fileNodes = result['xliff']['file'];
+ if (!fileNodes) {
+ reject(new Error(`XLF parsing error: XLIFF file does not contain "xliff" or "file" node(s) required for parsing.`));
+ }
+ fileNodes.forEach((file) => {
+ const originalFilePath = file.$.original;
+ if (!originalFilePath) {
+ reject(new Error(`XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.`));
+ }
+ let language = file.$['target-language'];
+ if (!language) {
+ reject(new Error(`XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.`));
+ }
+ const messages = {};
+ const transUnits = file.body[0]['trans-unit'];
+ if (transUnits) {
+ transUnits.forEach((unit) => {
+ const key = unit.$.id;
+ if (!unit.target) {
+ return; // No translation available
+ }
+ let val = unit.target[0];
+ if (typeof val !== 'string') {
+ // We allow empty source values so support them for translations as well.
+ val = val._ ? val._ : '';
+ }
+ if (!key) {
+ reject(new Error(`XLF parsing error: trans-unit ${JSON.stringify(unit, undefined, 0)} defined in file ${originalFilePath} is missing the ID attribute.`));
+ return;
+ }
+ messages[key] = decodeEntities(val);
+ });
+ files.push({ messages: messages, originalFilePath: originalFilePath, language: language.toLowerCase() });
+ }
+ });
+ resolve(files);
+ });
+ });
+};
+class Limiter {
+ constructor(maxDegreeOfParalellism) {
+ this.maxDegreeOfParalellism = maxDegreeOfParalellism;
+ this.outstandingPromises = [];
+ this.runningPromises = 0;
+ }
+ queue(factory) {
+ return new Promise((c, e) => {
+ this.outstandingPromises.push({ factory, c, e });
+ this.consume();
+ });
+ }
+ consume() {
+ while (this.outstandingPromises.length && this.runningPromises < this.maxDegreeOfParalellism) {
+ const iLimitedTask = this.outstandingPromises.shift();
+ this.runningPromises++;
+ const promise = iLimitedTask.factory();
+ promise.then(iLimitedTask.c).catch(iLimitedTask.e);
+ promise.then(() => this.consumed()).catch(() => this.consumed());
+ }
+ }
+ consumed() {
+ this.runningPromises--;
+ this.consume();
+ }
+}
+exports.Limiter = Limiter;
+function sortLanguages(languages) {
+ return languages.sort((a, b) => {
+ return a.id < b.id ? -1 : (a.id > b.id ? 1 : 0);
+ });
+}
+function stripComments(content) {
+ /**
+ * First capturing group matches double quoted string
+ * Second matches single quotes string
+ * Third matches block comments
+ * Fourth matches line comments
+ */
+ const regexp = /("(?:[^\\\"]*(?:\\.)?)*")|('(?:[^\\\']*(?:\\.)?)*')|(\/\*(?:\r?\n|.)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g;
+ let result = content.replace(regexp, (match, _m1, _m2, m3, m4) => {
+ // Only one of m1, m2, m3, m4 matches
+ if (m3) {
+ // A block comment. Replace with nothing
+ return '';
+ }
+ else if (m4) {
+ // A line comment. If it ends in \r?\n then keep it.
+ let length = m4.length;
+ if (length > 2 && m4[length - 1] === '\n') {
+ return m4[length - 2] === '\r' ? '\r\n' : '\n';
+ }
+ else {
+ return '';
+ }
+ }
+ else {
+ // We match a string
+ return match;
+ }
+ });
+ return result;
+}
+function escapeCharacters(value) {
+ const result = [];
+ for (let i = 0; i < value.length; i++) {
+ const ch = value.charAt(i);
+ switch (ch) {
+ case '\'':
+ result.push('\\\'');
+ break;
+ case '"':
+ result.push('\\"');
+ break;
+ case '\\':
+ result.push('\\\\');
+ break;
+ case '\n':
+ result.push('\\n');
+ break;
+ case '\r':
+ result.push('\\r');
+ break;
+ case '\t':
+ result.push('\\t');
+ break;
+ case '\b':
+ result.push('\\b');
+ break;
+ case '\f':
+ result.push('\\f');
+ break;
+ default:
+ result.push(ch);
+ }
+ }
+ return result.join('');
+}
+function processCoreBundleFormat(fileHeader, languages, json, emitter) {
+ let keysSection = json.keys;
+ let messageSection = json.messages;
+ let bundleSection = json.bundles;
+ let statistics = Object.create(null);
+ let defaultMessages = Object.create(null);
+ let modules = Object.keys(keysSection);
+ modules.forEach((module) => {
+ let keys = keysSection[module];
+ let messages = messageSection[module];
+ if (!messages || keys.length !== messages.length) {
+ emitter.emit('error', `Message for module ${module} corrupted. Mismatch in number of keys and messages.`);
+ return;
+ }
+ let messageMap = Object.create(null);
+ defaultMessages[module] = messageMap;
+ keys.map((key, i) => {
+ if (typeof key === 'string') {
+ messageMap[key] = messages[i];
+ }
+ else {
+ messageMap[key.key] = messages[i];
+ }
+ });
+ });
+ let languageDirectory = path.join(__dirname, '..', '..', '..', 'vscode-loc', 'i18n');
+ if (!fs.existsSync(languageDirectory)) {
+ log(`No VS Code localization repository found. Looking at ${languageDirectory}`);
+ log(`To bundle translations please check out the vscode-loc repository as a sibling of the vscode repository.`);
+ }
+ let sortedLanguages = sortLanguages(languages);
+ sortedLanguages.forEach((language) => {
+ if (process.env['VSCODE_BUILD_VERBOSE']) {
+ log(`Generating nls bundles for: ${language.id}`);
+ }
+ statistics[language.id] = 0;
+ let localizedModules = Object.create(null);
+ let languageFolderName = language.translationId || language.id;
+ let i18nFile = path.join(languageDirectory, `vscode-language-pack-${languageFolderName}`, 'translations', 'main.i18n.json');
+ let allMessages;
+ if (fs.existsSync(i18nFile)) {
+ let content = stripComments(fs.readFileSync(i18nFile, 'utf8'));
+ allMessages = JSON.parse(content);
+ }
+ modules.forEach((module) => {
+ let order = keysSection[module];
+ let moduleMessage;
+ if (allMessages) {
+ moduleMessage = allMessages.contents[module];
+ }
+ if (!moduleMessage) {
+ if (process.env['VSCODE_BUILD_VERBOSE']) {
+ log(`No localized messages found for module ${module}. Using default messages.`);
+ }
+ moduleMessage = defaultMessages[module];
+ statistics[language.id] = statistics[language.id] + Object.keys(moduleMessage).length;
+ }
+ let localizedMessages = [];
+ order.forEach((keyInfo) => {
+ let key = null;
+ if (typeof keyInfo === 'string') {
+ key = keyInfo;
+ }
+ else {
+ key = keyInfo.key;
+ }
+ let message = moduleMessage[key];
+ if (!message) {
+ if (process.env['VSCODE_BUILD_VERBOSE']) {
+ log(`No localized message found for key ${key} in module ${module}. Using default message.`);
+ }
+ message = defaultMessages[module][key];
+ statistics[language.id] = statistics[language.id] + 1;
+ }
+ localizedMessages.push(message);
+ });
+ localizedModules[module] = localizedMessages;
+ });
+ Object.keys(bundleSection).forEach((bundle) => {
+ let modules = bundleSection[bundle];
+ let contents = [
+ fileHeader,
+ `define("${bundle}.nls.${language.id}", {`
+ ];
+ modules.forEach((module, index) => {
+ contents.push(`\t"${module}": [`);
+ let messages = localizedModules[module];
+ if (!messages) {
+ emitter.emit('error', `Didn't find messages for module ${module}.`);
+ return;
+ }
+ messages.forEach((message, index) => {
+ contents.push(`\t\t"${escapeCharacters(message)}${index < messages.length ? '",' : '"'}`);
+ });
+ contents.push(index < modules.length - 1 ? '\t],' : '\t]');
+ });
+ contents.push('});');
+ emitter.queue(new File({ path: bundle + '.nls.' + language.id + '.js', contents: Buffer.from(contents.join('\n'), 'utf-8') }));
+ });
+ });
+ Object.keys(statistics).forEach(key => {
+ let value = statistics[key];
+ log(`${key} has ${value} untranslated strings.`);
+ });
+ sortedLanguages.forEach(language => {
+ let stats = statistics[language.id];
+ if (Is.undef(stats)) {
+ log(`\tNo translations found for language ${language.id}. Using default language instead.`);
+ }
+ });
+}
+function processNlsFiles(opts) {
+ return event_stream_1.through(function (file) {
+ let fileName = path.basename(file.path);
+ if (fileName === 'nls.metadata.json') {
+ let json = null;
+ if (file.isBuffer()) {
+ json = JSON.parse(file.contents.toString('utf8'));
+ }
+ else {
+ this.emit('error', `Failed to read component file: ${file.relative}`);
+ return;
+ }
+ if (BundledFormat.is(json)) {
+ processCoreBundleFormat(opts.fileHeader, opts.languages, json, this);
+ }
+ }
+ this.queue(file);
+ });
+}
+exports.processNlsFiles = processNlsFiles;
+const editorProject = 'vscode-editor', workbenchProject = 'vscode-workbench', extensionsProject = 'vscode-extensions', setupProject = 'vscode-setup';
+function getResource(sourceFile) {
+ let resource;
+ if (/^vs\/platform/.test(sourceFile)) {
+ return { name: 'vs/platform', project: editorProject };
+ }
+ else if (/^vs\/editor\/contrib/.test(sourceFile)) {
+ return { name: 'vs/editor/contrib', project: editorProject };
+ }
+ else if (/^vs\/editor/.test(sourceFile)) {
+ return { name: 'vs/editor', project: editorProject };
+ }
+ else if (/^vs\/base/.test(sourceFile)) {
+ return { name: 'vs/base', project: editorProject };
+ }
+ else if (/^vs\/code/.test(sourceFile)) {
+ return { name: 'vs/code', project: workbenchProject };
+ }
+ else if (/^vs\/workbench\/contrib/.test(sourceFile)) {
+ resource = sourceFile.split('/', 4).join('/');
+ return { name: resource, project: workbenchProject };
+ }
+ else if (/^vs\/workbench\/services/.test(sourceFile)) {
+ resource = sourceFile.split('/', 4).join('/');
+ return { name: resource, project: workbenchProject };
+ }
+ else if (/^vs\/workbench/.test(sourceFile)) {
+ return { name: 'vs/workbench', project: workbenchProject };
+ }
+ throw new Error(`Could not identify the XLF bundle for ${sourceFile}`);
+}
+exports.getResource = getResource;
+function createXlfFilesForCoreBundle() {
+ return event_stream_1.through(function (file) {
+ const basename = path.basename(file.path);
+ if (basename === 'nls.metadata.json') {
+ if (file.isBuffer()) {
+ const xlfs = Object.create(null);
+ const json = JSON.parse(file.contents.toString('utf8'));
+ for (let coreModule in json.keys) {
+ const projectResource = getResource(coreModule);
+ const resource = projectResource.name;
+ const project = projectResource.project;
+ const keys = json.keys[coreModule];
+ const messages = json.messages[coreModule];
+ if (keys.length !== messages.length) {
+ this.emit('error', `There is a mismatch between keys and messages in ${file.relative} for module ${coreModule}`);
+ return;
+ }
+ else {
+ let xlf = xlfs[resource];
+ if (!xlf) {
+ xlf = new XLF(project);
+ xlfs[resource] = xlf;
+ }
+ xlf.addFile(`src/${coreModule}`, keys, messages);
+ }
+ }
+ for (let resource in xlfs) {
+ const xlf = xlfs[resource];
+ const filePath = `${xlf.project}/${resource.replace(/\//g, '_')}.xlf`;
+ const xlfFile = new File({
+ path: filePath,
+ contents: Buffer.from(xlf.toString(), 'utf8')
+ });
+ this.queue(xlfFile);
+ }
+ }
+ else {
+ this.emit('error', new Error(`File ${file.relative} is not using a buffer content`));
+ return;
+ }
+ }
+ else {
+ this.emit('error', new Error(`File ${file.relative} is not a core meta data file.`));
+ return;
+ }
+ });
+}
+exports.createXlfFilesForCoreBundle = createXlfFilesForCoreBundle;
+function createXlfFilesForExtensions() {
+ let counter = 0;
+ let folderStreamEnded = false;
+ let folderStreamEndEmitted = false;
+ return event_stream_1.through(function (extensionFolder) {
+ const folderStream = this;
+ const stat = fs.statSync(extensionFolder.path);
+ if (!stat.isDirectory()) {
+ return;
+ }
+ let extensionName = path.basename(extensionFolder.path);
+ if (extensionName === 'node_modules') {
+ return;
+ }
+ counter++;
+ let _xlf;
+ function getXlf() {
+ if (!_xlf) {
+ _xlf = new XLF(extensionsProject);
+ }
+ return _xlf;
+ }
+ gulp.src([`.build/extensions/${extensionName}/package.nls.json`, `.build/extensions/${extensionName}/**/nls.metadata.json`], { allowEmpty: true }).pipe(event_stream_1.through(function (file) {
+ if (file.isBuffer()) {
+ const buffer = file.contents;
+ const basename = path.basename(file.path);
+ if (basename === 'package.nls.json') {
+ const json = JSON.parse(buffer.toString('utf8'));
+ const keys = Object.keys(json);
+ const messages = keys.map((key) => {
+ const value = json[key];
+ if (Is.string(value)) {
+ return value;
+ }
+ else if (value) {
+ return value.message;
+ }
+ else {
+ return `Unknown message for key: ${key}`;
+ }
+ });
+ getXlf().addFile(`extensions/${extensionName}/package`, keys, messages);
+ }
+ else if (basename === 'nls.metadata.json') {
+ const json = JSON.parse(buffer.toString('utf8'));
+ const relPath = path.relative(`.build/extensions/${extensionName}`, path.dirname(file.path));
+ for (let file in json) {
+ const fileContent = json[file];
+ getXlf().addFile(`extensions/${extensionName}/${relPath}/${file}`, fileContent.keys, fileContent.messages);
+ }
+ }
+ else {
+ this.emit('error', new Error(`${file.path} is not a valid extension nls file`));
+ return;
+ }
+ }
+ }, function () {
+ if (_xlf) {
+ let xlfFile = new File({
+ path: path.join(extensionsProject, extensionName + '.xlf'),
+ contents: Buffer.from(_xlf.toString(), 'utf8')
+ });
+ folderStream.queue(xlfFile);
+ }
+ this.queue(null);
+ counter--;
+ if (counter === 0 && folderStreamEnded && !folderStreamEndEmitted) {
+ folderStreamEndEmitted = true;
+ folderStream.queue(null);
+ }
+ }));
+ }, function () {
+ folderStreamEnded = true;
+ if (counter === 0) {
+ folderStreamEndEmitted = true;
+ this.queue(null);
+ }
+ });
+}
+exports.createXlfFilesForExtensions = createXlfFilesForExtensions;
+function createXlfFilesForIsl() {
+ return event_stream_1.through(function (file) {
+ let projectName, resourceFile;
+ if (path.basename(file.path) === 'messages.en.isl') {
+ projectName = setupProject;
+ resourceFile = 'messages.xlf';
+ }
+ else {
+ throw new Error(`Unknown input file ${file.path}`);
+ }
+ let xlf = new XLF(projectName), keys = [], messages = [];
+ let model = new TextModel(file.contents.toString());
+ let inMessageSection = false;
+ model.lines.forEach(line => {
+ if (line.length === 0) {
+ return;
+ }
+ let firstChar = line.charAt(0);
+ switch (firstChar) {
+ case ';':
+ // Comment line;
+ return;
+ case '[':
+ inMessageSection = '[Messages]' === line || '[CustomMessages]' === line;
+ return;
+ }
+ if (!inMessageSection) {
+ return;
+ }
+ let sections = line.split('=');
+ if (sections.length !== 2) {
+ throw new Error(`Badly formatted message found: ${line}`);
+ }
+ else {
+ let key = sections[0];
+ let value = sections[1];
+ if (key.length > 0 && value.length > 0) {
+ keys.push(key);
+ messages.push(value);
+ }
+ }
+ });
+ const originalPath = file.path.substring(file.cwd.length + 1, file.path.split('.')[0].length).replace(/\\/g, '/');
+ xlf.addFile(originalPath, keys, messages);
+ // Emit only upon all ISL files combined into single XLF instance
+ const newFilePath = path.join(projectName, resourceFile);
+ const xlfFile = new File({ path: newFilePath, contents: Buffer.from(xlf.toString(), 'utf-8') });
+ this.queue(xlfFile);
+ });
+}
+exports.createXlfFilesForIsl = createXlfFilesForIsl;
+function pushXlfFiles(apiHostname, username, password) {
+ let tryGetPromises = [];
+ let updateCreatePromises = [];
+ return event_stream_1.through(function (file) {
+ const project = path.dirname(file.relative);
+ const fileName = path.basename(file.path);
+ const slug = fileName.substr(0, fileName.length - '.xlf'.length);
+ const credentials = `${username}:${password}`;
+ // Check if resource already exists, if not, then create it.
+ let promise = tryGetResource(project, slug, apiHostname, credentials);
+ tryGetPromises.push(promise);
+ promise.then(exists => {
+ if (exists) {
+ promise = updateResource(project, slug, file, apiHostname, credentials);
+ }
+ else {
+ promise = createResource(project, slug, file, apiHostname, credentials);
+ }
+ updateCreatePromises.push(promise);
+ });
+ }, function () {
+ // End the pipe only after all the communication with Transifex API happened
+ Promise.all(tryGetPromises).then(() => {
+ Promise.all(updateCreatePromises).then(() => {
+ this.queue(null);
+ }).catch((reason) => { throw new Error(reason); });
+ }).catch((reason) => { throw new Error(reason); });
+ });
+}
+exports.pushXlfFiles = pushXlfFiles;
+function getAllResources(project, apiHostname, username, password) {
+ return new Promise((resolve, reject) => {
+ const credentials = `${username}:${password}`;
+ const options = {
+ hostname: apiHostname,
+ path: `/api/2/project/${project}/resources`,
+ auth: credentials,
+ method: 'GET'
+ };
+ const request = https.request(options, (res) => {
+ let buffer = [];
+ res.on('data', (chunk) => buffer.push(chunk));
+ res.on('end', () => {
+ if (res.statusCode === 200) {
+ let json = JSON.parse(Buffer.concat(buffer).toString());
+ if (Array.isArray(json)) {
+ resolve(json.map(o => o.slug));
+ return;
+ }
+ reject(`Unexpected data format. Response code: ${res.statusCode}.`);
+ }
+ else {
+ reject(`No resources in ${project} returned no data. Response code: ${res.statusCode}.`);
+ }
+ });
+ });
+ request.on('error', (err) => {
+ reject(`Failed to query resources in ${project} with the following error: ${err}. ${options.path}`);
+ });
+ request.end();
+ });
+}
+function findObsoleteResources(apiHostname, username, password) {
+ let resourcesByProject = Object.create(null);
+ resourcesByProject[extensionsProject] = [].concat(exports.externalExtensionsWithTranslations); // clone
+ return event_stream_1.through(function (file) {
+ const project = path.dirname(file.relative);
+ const fileName = path.basename(file.path);
+ const slug = fileName.substr(0, fileName.length - '.xlf'.length);
+ let slugs = resourcesByProject[project];
+ if (!slugs) {
+ resourcesByProject[project] = slugs = [];
+ }
+ slugs.push(slug);
+ this.push(file);
+ }, function () {
+ const json = JSON.parse(fs.readFileSync('./build/lib/i18n.resources.json', 'utf8'));
+ let i18Resources = [...json.editor, ...json.workbench].map((r) => r.project + '/' + r.name.replace(/\//g, '_'));
+ let extractedResources = [];
+ for (let project of [workbenchProject, editorProject]) {
+ for (let resource of resourcesByProject[project]) {
+ if (resource !== 'setup_messages') {
+ extractedResources.push(project + '/' + resource);
+ }
+ }
+ }
+ if (i18Resources.length !== extractedResources.length) {
+ console.log(`[i18n] Obsolete resources in file 'build/lib/i18n.resources.json': JSON.stringify(${i18Resources.filter(p => extractedResources.indexOf(p) === -1)})`);
+ console.log(`[i18n] Missing resources in file 'build/lib/i18n.resources.json': JSON.stringify(${extractedResources.filter(p => i18Resources.indexOf(p) === -1)})`);
+ }
+ let promises = [];
+ for (let project in resourcesByProject) {
+ promises.push(getAllResources(project, apiHostname, username, password).then(resources => {
+ let expectedResources = resourcesByProject[project];
+ let unusedResources = resources.filter(resource => resource && expectedResources.indexOf(resource) === -1);
+ if (unusedResources.length) {
+ console.log(`[transifex] Obsolete resources in project '${project}': ${unusedResources.join(', ')}`);
+ }
+ }));
+ }
+ return Promise.all(promises).then(_ => {
+ this.push(null);
+ }).catch((reason) => { throw new Error(reason); });
+ });
+}
+exports.findObsoleteResources = findObsoleteResources;
+function tryGetResource(project, slug, apiHostname, credentials) {
+ return new Promise((resolve, reject) => {
+ const options = {
+ hostname: apiHostname,
+ path: `/api/2/project/${project}/resource/${slug}/?details`,
+ auth: credentials,
+ method: 'GET'
+ };
+ const request = https.request(options, (response) => {
+ if (response.statusCode === 404) {
+ resolve(false);
+ }
+ else if (response.statusCode === 200) {
+ resolve(true);
+ }
+ else {
+ reject(`Failed to query resource ${project}/${slug}. Response: ${response.statusCode} ${response.statusMessage}`);
+ }
+ });
+ request.on('error', (err) => {
+ reject(`Failed to get ${project}/${slug} on Transifex: ${err}`);
+ });
+ request.end();
+ });
+}
+function createResource(project, slug, xlfFile, apiHostname, credentials) {
+ return new Promise((_resolve, reject) => {
+ const data = JSON.stringify({
+ 'content': xlfFile.contents.toString(),
+ 'name': slug,
+ 'slug': slug,
+ 'i18n_type': 'XLIFF'
+ });
+ const options = {
+ hostname: apiHostname,
+ path: `/api/2/project/${project}/resources`,
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Content-Length': Buffer.byteLength(data)
+ },
+ auth: credentials,
+ method: 'POST'
+ };
+ let request = https.request(options, (res) => {
+ if (res.statusCode === 201) {
+ log(`Resource ${project}/${slug} successfully created on Transifex.`);
+ }
+ else {
+ reject(`Something went wrong in the request creating ${slug} in ${project}. ${res.statusCode}`);
+ }
+ });
+ request.on('error', (err) => {
+ reject(`Failed to create ${project}/${slug} on Transifex: ${err}`);
+ });
+ request.write(data);
+ request.end();
+ });
+}
+/**
+ * The following link provides information about how Transifex handles updates of a resource file:
+ * https://dev.befoolish.co/tx-docs/public/projects/updating-content#what-happens-when-you-update-files
+ */
+function updateResource(project, slug, xlfFile, apiHostname, credentials) {
+ return new Promise((resolve, reject) => {
+ const data = JSON.stringify({ content: xlfFile.contents.toString() });
+ const options = {
+ hostname: apiHostname,
+ path: `/api/2/project/${project}/resource/${slug}/content`,
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Content-Length': Buffer.byteLength(data)
+ },
+ auth: credentials,
+ method: 'PUT'
+ };
+ let request = https.request(options, (res) => {
+ if (res.statusCode === 200) {
+ res.setEncoding('utf8');
+ let responseBuffer = '';
+ res.on('data', function (chunk) {
+ responseBuffer += chunk;
+ });
+ res.on('end', () => {
+ const response = JSON.parse(responseBuffer);
+ log(`Resource ${project}/${slug} successfully updated on Transifex. Strings added: ${response.strings_added}, updated: ${response.strings_added}, deleted: ${response.strings_added}`);
+ resolve();
+ });
+ }
+ else {
+ reject(`Something went wrong in the request updating ${slug} in ${project}. ${res.statusCode}`);
+ }
+ });
+ request.on('error', (err) => {
+ reject(`Failed to update ${project}/${slug} on Transifex: ${err}`);
+ });
+ request.write(data);
+ request.end();
+ });
+}
+function pullSetupXlfFiles(apiHostname, username, password, language, includeDefault) {
+ let setupResources = [{ name: 'setup_messages', project: workbenchProject }];
+ if (includeDefault) {
+ setupResources.push({ name: 'setup_default', project: setupProject });
+ }
+ return pullXlfFiles(apiHostname, username, password, language, setupResources);
+}
+exports.pullSetupXlfFiles = pullSetupXlfFiles;
+function pullXlfFiles(apiHostname, username, password, language, resources) {
+ const credentials = `${username}:${password}`;
+ let expectedTranslationsCount = resources.length;
+ let translationsRetrieved = 0, called = false;
+ return event_stream_1.readable(function (_count, callback) {
+ // Mark end of stream when all resources were retrieved
+ if (translationsRetrieved === expectedTranslationsCount) {
+ return this.emit('end');
+ }
+ if (!called) {
+ called = true;
+ const stream = this;
+ resources.map(function (resource) {
+ retrieveResource(language, resource, apiHostname, credentials).then((file) => {
+ if (file) {
+ stream.emit('data', file);
+ }
+ translationsRetrieved++;
+ }).catch(error => { throw new Error(error); });
+ });
+ }
+ callback();
+ });
+}
+const limiter = new Limiter(NUMBER_OF_CONCURRENT_DOWNLOADS);
+function retrieveResource(language, resource, apiHostname, credentials) {
+ return limiter.queue(() => new Promise((resolve, reject) => {
+ const slug = resource.name.replace(/\//g, '_');
+ const project = resource.project;
+ let transifexLanguageId = language.id === 'ps' ? 'en' : language.translationId || language.id;
+ const options = {
+ hostname: apiHostname,
+ path: `/api/2/project/${project}/resource/${slug}/translation/${transifexLanguageId}?file&mode=onlyreviewed`,
+ auth: credentials,
+ port: 443,
+ method: 'GET'
+ };
+ console.log('[transifex] Fetching ' + options.path);
+ let request = https.request(options, (res) => {
+ let xlfBuffer = [];
+ res.on('data', (chunk) => xlfBuffer.push(chunk));
+ res.on('end', () => {
+ if (res.statusCode === 200) {
+ resolve(new File({ contents: Buffer.concat(xlfBuffer), path: `${project}/${slug}.xlf` }));
+ }
+ else if (res.statusCode === 404) {
+ console.log(`[transifex] ${slug} in ${project} returned no data.`);
+ resolve(null);
+ }
+ else {
+ reject(`${slug} in ${project} returned no data. Response code: ${res.statusCode}.`);
+ }
+ });
+ });
+ request.on('error', (err) => {
+ reject(`Failed to query resource ${slug} with the following error: ${err}. ${options.path}`);
+ });
+ request.end();
+ }));
+}
+function prepareI18nFiles() {
+ let parsePromises = [];
+ return event_stream_1.through(function (xlf) {
+ let stream = this;
+ let parsePromise = XLF.parse(xlf.contents.toString());
+ parsePromises.push(parsePromise);
+ parsePromise.then(resolvedFiles => {
+ resolvedFiles.forEach(file => {
+ let translatedFile = createI18nFile(file.originalFilePath, file.messages);
+ stream.queue(translatedFile);
+ });
+ });
+ }, function () {
+ Promise.all(parsePromises)
+ .then(() => { this.queue(null); })
+ .catch(reason => { throw new Error(reason); });
+ });
+}
+exports.prepareI18nFiles = prepareI18nFiles;
+function createI18nFile(originalFilePath, messages) {
+ let result = Object.create(null);
+ result[''] = [
+ '--------------------------------------------------------------------------------------------',
+ 'Copyright (c) Microsoft Corporation. All rights reserved.',
+ 'Licensed under the MIT License. See License.txt in the project root for license information.',
+ '--------------------------------------------------------------------------------------------',
+ 'Do not edit this file. It is machine generated.'
+ ];
+ for (let key of Object.keys(messages)) {
+ result[key] = messages[key];
+ }
+ let content = JSON.stringify(result, null, '\t');
+ if (process.platform === 'win32') {
+ content = content.replace(/\n/g, '\r\n');
+ }
+ return new File({
+ path: path.join(originalFilePath + '.i18n.json'),
+ contents: Buffer.from(content, 'utf8')
+ });
+}
+const i18nPackVersion = '1.0.0';
+function prepareI18nPackFiles(externalExtensions, resultingTranslationPaths, pseudo = false) {
+ let parsePromises = [];
+ let mainPack = { version: i18nPackVersion, contents: {} };
+ let extensionsPacks = {};
+ let errors = [];
+ return event_stream_1.through(function (xlf) {
+ let project = path.basename(path.dirname(path.dirname(xlf.relative)));
+ let resource = path.basename(xlf.relative, '.xlf');
+ let contents = xlf.contents.toString();
+ log(`Found ${project}: ${resource}`);
+ let parsePromise = pseudo ? XLF.parsePseudo(contents) : XLF.parse(contents);
+ parsePromises.push(parsePromise);
+ parsePromise.then(resolvedFiles => {
+ resolvedFiles.forEach(file => {
+ const path = file.originalFilePath;
+ const firstSlash = path.indexOf('/');
+ if (project === extensionsProject) {
+ let extPack = extensionsPacks[resource];
+ if (!extPack) {
+ extPack = extensionsPacks[resource] = { version: i18nPackVersion, contents: {} };
+ }
+ const externalId = externalExtensions[resource];
+ if (!externalId) { // internal extension: remove 'extensions/extensionId/' segnent
+ const secondSlash = path.indexOf('/', firstSlash + 1);
+ extPack.contents[path.substr(secondSlash + 1)] = file.messages;
+ }
+ else {
+ extPack.contents[path] = file.messages;
+ }
+ }
+ else {
+ mainPack.contents[path.substr(firstSlash + 1)] = file.messages;
+ }
+ });
+ }).catch(reason => {
+ errors.push(reason);
+ });
+ }, function () {
+ Promise.all(parsePromises)
+ .then(() => {
+ if (errors.length > 0) {
+ throw errors;
+ }
+ const translatedMainFile = createI18nFile('./main', mainPack);
+ resultingTranslationPaths.push({ id: 'vscode', resourceName: 'main.i18n.json' });
+ this.queue(translatedMainFile);
+ for (let extension in extensionsPacks) {
+ const translatedExtFile = createI18nFile(`extensions/${extension}`, extensionsPacks[extension]);
+ this.queue(translatedExtFile);
+ const externalExtensionId = externalExtensions[extension];
+ if (externalExtensionId) {
+ resultingTranslationPaths.push({ id: externalExtensionId, resourceName: `extensions/${extension}.i18n.json` });
+ }
+ else {
+ resultingTranslationPaths.push({ id: `vscode.${extension}`, resourceName: `extensions/${extension}.i18n.json` });
+ }
+ }
+ this.queue(null);
+ })
+ .catch((reason) => {
+ this.emit('error', reason);
+ });
+ });
+}
+exports.prepareI18nPackFiles = prepareI18nPackFiles;
+function prepareIslFiles(language, innoSetupConfig) {
+ let parsePromises = [];
+ return event_stream_1.through(function (xlf) {
+ let stream = this;
+ let parsePromise = XLF.parse(xlf.contents.toString());
+ parsePromises.push(parsePromise);
+ parsePromise.then(resolvedFiles => {
+ resolvedFiles.forEach(file => {
+ let translatedFile = createIslFile(file.originalFilePath, file.messages, language, innoSetupConfig);
+ stream.queue(translatedFile);
+ });
+ }).catch(reason => {
+ this.emit('error', reason);
+ });
+ }, function () {
+ Promise.all(parsePromises)
+ .then(() => { this.queue(null); })
+ .catch(reason => {
+ this.emit('error', reason);
+ });
+ });
+}
+exports.prepareIslFiles = prepareIslFiles;
+function createIslFile(originalFilePath, messages, language, innoSetup) {
+ let content = [];
+ let originalContent;
+ if (path.basename(originalFilePath) === 'Default') {
+ originalContent = new TextModel(fs.readFileSync(originalFilePath + '.isl', 'utf8'));
+ }
+ else {
+ originalContent = new TextModel(fs.readFileSync(originalFilePath + '.en.isl', 'utf8'));
+ }
+ originalContent.lines.forEach(line => {
+ if (line.length > 0) {
+ let firstChar = line.charAt(0);
+ if (firstChar === '[' || firstChar === ';') {
+ content.push(line);
+ }
+ else {
+ let sections = line.split('=');
+ let key = sections[0];
+ let translated = line;
+ if (key) {
+ let translatedMessage = messages[key];
+ if (translatedMessage) {
+ translated = `${key}=${translatedMessage}`;
+ }
+ }
+ content.push(translated);
+ }
+ }
+ });
+ const basename = path.basename(originalFilePath);
+ const filePath = `${basename}.${language.id}.isl`;
+ const encoded = iconv.encode(Buffer.from(content.join('\r\n'), 'utf8').toString(), innoSetup.codePage);
+ return new File({
+ path: filePath,
+ contents: Buffer.from(encoded),
+ });
+}
+function encodeEntities(value) {
+ let result = [];
+ for (let i = 0; i < value.length; i++) {
+ let ch = value[i];
+ switch (ch) {
+ case '<':
+ result.push('<');
+ break;
+ case '>':
+ result.push('>');
+ break;
+ case '&':
+ result.push('&');
+ break;
+ default:
+ result.push(ch);
+ }
+ }
+ return result.join('');
+}
+function decodeEntities(value) {
+ return value.replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&');
+}
+function pseudify(message) {
+ return '\uFF3B' + message.replace(/[aouei]/g, '$&$&') + '\uFF3D';
+}
diff --git a/lib/vscode/build/lib/i18n.resources.json b/build/lib/i18n.resources.json
similarity index 100%
rename from lib/vscode/build/lib/i18n.resources.json
rename to build/lib/i18n.resources.json
diff --git a/lib/vscode/build/lib/i18n.ts b/build/lib/i18n.ts
similarity index 93%
rename from lib/vscode/build/lib/i18n.ts
rename to build/lib/i18n.ts
index 746c481b262d..5e00e9d6c6e6 100644
--- a/lib/vscode/build/lib/i18n.ts
+++ b/build/lib/i18n.ts
@@ -10,7 +10,6 @@ import { through, readable, ThroughStream } from 'event-stream';
import * as File from 'vinyl';
import * as Is from 'is';
import * as xml2js from 'xml2js';
-import * as glob from 'glob';
import * as https from 'https';
import * as gulp from 'gulp';
import * as fancyLog from 'fancy-log';
@@ -31,10 +30,6 @@ export interface Language {
export interface InnoSetup {
codePage: string; //code page for encoding (http://www.jrsoftware.org/ishelp/index.php?topic=langoptionssection)
- defaultInfo?: {
- name: string; // inno setup language name
- id: string; // locale identifier (https://msdn.microsoft.com/en-us/library/dd318693.aspx)
- };
}
export const defaultLanguages: Language[] = [
@@ -198,14 +193,17 @@ export class XLF {
public toString(): string {
this.appendHeader();
- for (let file in this.files) {
+ const files = Object.keys(this.files).sort();
+ for (const file of files) {
this.appendNewLine(``, 2);
- for (let item of this.files[file]) {
+ const items = this.files[file].sort((a: Item, b: Item) => {
+ return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
+ });
+ for (const item of items) {
this.addStringItem(file, item);
}
- this.appendNewLine('', 2);
+ this.appendNewLine('