diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
deleted file mode 100644
index 504e4cebfe..0000000000
--- a/.devcontainer/Dockerfile
+++ /dev/null
@@ -1,122 +0,0 @@
-#-------------------------------------------------------------------------------------------------------------
-# Copyright (c) Microsoft Corporation. All rights reserved.
-# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information.
-#-------------------------------------------------------------------------------------------------------------
-
-FROM mcr.microsoft.com/vscode/devcontainers/typescript-node:0-12
-
-ARG TARGET_DISPLAY=":1"
-
-# VNC options
-ARG MAX_VNC_RESOLUTION=1920x1080x16
-ARG TARGET_VNC_RESOLUTION=1920x1080
-ARG TARGET_VNC_DPI=72
-ARG TARGET_VNC_PORT=5901
-ARG VNC_PASSWORD="vscode"
-
-# noVNC (VNC web client) options
-ARG INSTALL_NOVNC="true"
-ARG NOVNC_VERSION=1.1.0
-ARG TARGET_NOVNC_PORT=6080
-ARG WEBSOCKETIFY_VERSION=0.9.0
-
-# Firefox is useful for testing things like browser launch events, but optional
-ARG INSTALL_FIREFOX="false"
-
-# Expected non-root username from base image
-ARG USERNAME=node
-
-# Core environment variables for X11, VNC, and fluxbox
-ENV DBUS_SESSION_BUS_ADDRESS="autolaunch:" \
- MAX_VNC_RESOLUTION="${MAX_VNC_RESOLUTION}" \
- VNC_RESOLUTION="${TARGET_VNC_RESOLUTION}" \
- VNC_DPI="${TARGET_VNC_DPI}" \
- VNC_PORT="${TARGET_VNC_PORT}" \
- NOVNC_PORT="${TARGET_NOVNC_PORT}" \
- DISPLAY="${TARGET_DISPLAY}" \
- LANG="en_US.UTF-8" \
- LANGUAGE="en_US.UTF-8" \
- VISUAL="nano" \
- EDITOR="nano"
-
-# Configure apt and install packages
-RUN apt-get update \
- && export DEBIAN_FRONTEND=noninteractive \
- #
- # Install the Cascadia Code fonts - https://github.com/microsoft/cascadia-code
- && curl -sSL https://github.com/microsoft/cascadia-code/releases/download/v2004.30/CascadiaCode_2004.30.zip -o /tmp/cascadia-fonts.zip \
- && unzip /tmp/cascadia-fonts.zip -d /tmp/cascadia-fonts \
- && mkdir -p /usr/share/fonts/truetype/cascadia \
- && mv /tmp/cascadia-fonts/ttf/* /usr/share/fonts/truetype/cascadia/ \
- && rm -rf /tmp/cascadia-fonts.zip /tmp/cascadia-fonts \
- #
- # Install X11, fluxbox and VS Code dependencies
- && apt-get -y install --no-install-recommends \
- xvfb \
- x11vnc \
- fluxbox \
- dbus-x11 \
- x11-utils \
- x11-xserver-utils \
- xdg-utils \
- fbautostart \
- xterm \
- eterm \
- gnome-terminal \
- gnome-keyring \
- seahorse \
- nautilus \
- libx11-dev \
- libxkbfile-dev \
- libsecret-1-dev \
- libnotify4 \
- libnss3 \
- libxss1 \
- libasound2 \
- libgbm1 \
- xfonts-base \
- xfonts-terminus \
- fonts-noto \
- fonts-wqy-microhei \
- fonts-droid-fallback \
- vim-tiny \
- nano \
- #
- # [Optional] Install noVNC
- && if [ "${INSTALL_NOVNC}" = "true" ]; then \
- mkdir -p /usr/local/novnc \
- && curl -sSL https://github.com/novnc/noVNC/archive/v${NOVNC_VERSION}.zip -o /tmp/novnc-install.zip \
- && unzip /tmp/novnc-install.zip -d /usr/local/novnc \
- && cp /usr/local/novnc/noVNC-${NOVNC_VERSION}/vnc_lite.html /usr/local/novnc/noVNC-${NOVNC_VERSION}/index.html \
- && rm /tmp/novnc-install.zip \
- && curl -sSL https://github.com/novnc/websockify/archive/v${WEBSOCKETIFY_VERSION}.zip -o /tmp/websockify-install.zip \
- && unzip /tmp/websockify-install.zip -d /usr/local/novnc \
- && apt-get -y install --no-install-recommends python-numpy \
- && ln -s /usr/local/novnc/websockify-${WEBSOCKETIFY_VERSION} /usr/local/novnc/noVNC-${NOVNC_VERSION}/utils/websockify \
- && rm /tmp/websockify-install.zip; \
- fi \
- #
- # [Optional] Install Firefox
- && if [ "${INSTALL_FIREFOX}" = "true" ]; then \
- apt-get -y install --no-install-recommends firefox-esr; \
- fi \
- #
- # Clean up
- && apt-get autoremove -y \
- && apt-get clean -y \
- && rm -rf /var/lib/apt/lists/*
-
-COPY bin/init-dev-container.sh /usr/local/share/
-COPY bin/set-resolution /usr/local/bin/
-COPY fluxbox/* /root/.fluxbox/
-COPY fluxbox/* /home/${USERNAME}/.fluxbox/
-
-# Update privs, owners of config files
-RUN mkdir -p /var/run/dbus /root/.vnc /home/${USERNAME}/.vnc \
- && touch /root/.Xmodmap /home/${USERNAME}/.Xmodmap \
- && echo "${VNC_PASSWORD}" | tee /root/.vnc/passwd > /home/${USERNAME}/.vnc/passwd \
- && chown -R ${USERNAME}:${USERNAME} /home/${USERNAME}/.Xmodmap /home/${USERNAME}/.fluxbox /home/${USERNAME}/.vnc \
- && chmod +x /usr/local/share/init-dev-container.sh /usr/local/bin/set-resolution
-
-ENTRYPOINT ["/usr/local/share/init-dev-container.sh"]
-CMD ["sleep", "infinity"]
diff --git a/.devcontainer/README.md b/.devcontainer/README.md
index e16795062d..8008d9db98 100644
--- a/.devcontainer/README.md
+++ b/.devcontainer/README.md
@@ -1,8 +1,8 @@
# Code - OSS Development Container
-This repository includes configuration for a development container for working with Code - OSS in an isolated local container or using [Visual Studio Codespaces](https://aka.ms/vso).
+This repository includes configuration for a development container for working with Code - OSS in an isolated 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` with a web client at `6080`. For better performance, we recommend using a [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/). Applications like the macOS Screen Sharing app will not perform as well. [Chicken](https://sourceforge.net/projects/chicken/) is a good macOS alternative.
+> **Tip:** The default VNC password is `vscode`. The VNC server runs on port `5901` with a web client at `6080`. For better performance, we recommend using a [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/). Applications like the macOS Screen Sharing app will not perform as well.
## Quick start - local
@@ -30,25 +30,41 @@ Anything you start in VS Code or the integrated terminal will appear here.
Next: **[Try it out!](#try-it)**
-## Quick start - Codespaces
+## Quick start - GitHub Codespaces
->Note that the Codespaces browser-based editor cannot currently access the desktop environment in this container (due to a [missing feature](https://github.com/MicrosoftDocs/vsonline/issues/117)). We recommend using Visual Studio Code from the desktop to connect instead in the near term.
+> **IMPORTANT:** The current free user beta for GitHub Codespaces uses a "Basic" sized codespace which does not have enough RAM to run a full build of VS Code and will be considerably slower during codespace start and running VS Code. You'll soon be able to use a "Standard" sized codespace (4-core, 8GB) that will be better suited for this purpose (along with even larger sizes should you need it).
-1. Install [Visual Studio Code Stable](https://code.visualstudio.com/) or [Insiders](https://code.visualstudio.com/insiders/) and the [Visual Studio Codespaces](https://aka.ms/vscs-ext-vscode) extension.
+1. From the [microsoft/vscode GitHub repository](https://github.com/microsoft/vscode), click on the **Code** dropdown, select **Open with Codespaces**, and the **New codespace**
- 
+ > Note that you will not see these options if you are not in the beta yet.
- > Note that the Visual Studio Codespaces extension requires the Visual Studio Code distribution of Code - OSS.
+2. After the codespace is up and running in your browser, press Ctrl/Cmd + Shift + P and select **View: Show Remote Explorer**.
-2. Sign in by pressing Ctrl/Cmd + Shift + P and selecting **Codespaces: Sign In**. You may also need to use the **Codespaces: Create Plan** if you do not have a plan. See the [Codespaces docs](https://aka.ms/vso-docs/vscode) for details.
+3. You should see port `6080` under **Forwarded Ports**. Select the line and click on the globe icon to open it in a browser tab.
-3. Press Ctrl/Cmd + Shift + P and select **Codespaces: Create New Codespace**.
+ > If you do not see port `6080`, press Ctrl/Cmd + Shift + P, select **Forward a Port** and enter port `6080`.
-4. Use default settings (which should include **Standard** 4 core, 8 GB RAM Codespace), select a plan, and then enter the repository URL `https://github.com/microsoft/vscode` (or a branch or PR URL) in the input box when prompted.
+4. In the new tab, you should see noVNC. Click **Connect** and enter `vscode` as the password.
-5. 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.
-6. 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 will likely see better performance when accessing the codespace you created from VS Code since you can use a[VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/). Here's how to do it.
+
+1. [Create a codespace](#quick-start---github-codespaces) if you have not already.
+
+2. Set up [VS Code for use with GitHub Codespaces](https://docs.github.com/github/developing-online-with-codespaces/using-codespaces-in-visual-studio-code)
+
+3. After the VS Code is up and running, press Ctrl/Cmd + Shift + P, choose **Codespaces: Connect to Codespace**, and select the codespace you created.
+
+4. After you've connected to the codespace, use a [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/) to connect to `localhost:5901` and enter `vscode` as the password.
+
+5. Anything you start in VS Code or the integrated terminal will appear here.
+
+Next: **[Try it out!](#try-it)**
## Try it!
@@ -65,7 +81,9 @@ To start working with Code - OSS, follow these steps:
bash scripts/code.sh
```
-2. After the build is complete, 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.
+ Note that a previous run of `yarn install` will already be cached, so this step should simply pick up any recent differences.
+
+2. After the build is complete, open a web browser or a [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/) to the desktop environnement as described in the quick start and enter `vscode` as the password.
3. You should now see Code - OSS!
diff --git a/.devcontainer/bin/init-dev-container.sh b/.devcontainer/bin/init-dev-container.sh
deleted file mode 100644
index 260cc27592..0000000000
--- a/.devcontainer/bin/init-dev-container.sh
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/bin/bash
-
-NONROOT_USER=node
-LOG=/tmp/container-init.log
-
-# Execute the command it not already running
-startInBackgroundIfNotRunning()
-{
- log "Starting $1."
- echo -e "\n** $(date) **" | sudoIf tee -a /tmp/$1.log > /dev/null
- if ! pidof $1 > /dev/null; then
- keepRunningInBackground "$@"
- while ! pidof $1 > /dev/null; do
- sleep 1
- done
- log "$1 started."
- else
- echo "$1 is already running." | sudoIf tee -a /tmp/$1.log > /dev/null
- log "$1 is already running."
- fi
-}
-
-# Keep command running in background
-keepRunningInBackground()
-{
- ($2 sh -c "while :; do echo [\$(date)] Process started.; $3; echo [\$(date)] Process exited!; sleep 5; done 2>&1" | sudoIf tee -a /tmp/$1.log > /dev/null & echo "$!" | sudoIf tee /tmp/$1.pid > /dev/null)
-}
-
-# Use sudo to run as root when required
-sudoIf()
-{
- if [ "$(id -u)" -ne 0 ]; then
- sudo "$@"
- else
- "$@"
- fi
-}
-
-# Use sudo to run as non-root user if not already running
-sudoUserIf()
-{
- if [ "$(id -u)" -eq 0 ]; then
- sudo -u ${NONROOT_USER} "$@"
- else
- "$@"
- fi
-}
-
-# Log messages
-log()
-{
- echo -e "[$(date)] $@" | sudoIf tee -a $LOG > /dev/null
-}
-
-log "** SCRIPT START **"
-
-# Start dbus.
-log 'Running "/etc/init.d/dbus start".'
-if [ -f "/var/run/dbus/pid" ] && ! pidof dbus-daemon > /dev/null; then
- sudoIf rm -f /var/run/dbus/pid
-fi
-sudoIf /etc/init.d/dbus start 2>&1 | sudoIf tee -a /tmp/dbus-daemon-system.log > /dev/null
-while ! pidof dbus-daemon > /dev/null; do
- sleep 1
-done
-
-# Set up Xvfb.
-startInBackgroundIfNotRunning "Xvfb" sudoIf "Xvfb ${DISPLAY:-:1} +extension RANDR -screen 0 ${MAX_VNC_RESOLUTION:-1920x1080x16}"
-
-# Start fluxbox as a light weight window manager.
-startInBackgroundIfNotRunning "fluxbox" sudoUserIf "dbus-launch startfluxbox"
-
-# Start x11vnc
-startInBackgroundIfNotRunning "x11vnc" sudoIf "x11vnc -display ${DISPLAY:-:1} -rfbport ${VNC_PORT:-5901} -localhost -no6 -xkb -shared -forever -passwdfile $HOME/.vnc/passwd"
-
-# Set resolution
-/usr/local/bin/set-resolution ${VNC_RESOLUTION:-1280x720} ${VNC_DPI:-72}
-
-
-# Spin up noVNC if installed and not runnning.
-if [ -d "/usr/local/novnc" ] && [ "$(ps -ef | grep /usr/local/novnc/noVNC*/utils/launch.sh | grep -v grep)" = "" ]; then
- keepRunningInBackground "noVNC" sudoIf "/usr/local/novnc/noVNC*/utils/launch.sh --listen ${NOVNC_PORT:-6080} --vnc localhost:${VNC_PORT:-5901}"
- log "noVNC started."
-else
- log "noVNC is already running or not installed."
-fi
-
-# Run whatever was passed in
-log "Executing \"$@\"."
-"$@"
-log "** SCRIPT EXIT **"
diff --git a/.devcontainer/bin/set-resolution b/.devcontainer/bin/set-resolution
deleted file mode 100644
index 5b4ca79f51..0000000000
--- a/.devcontainer/bin/set-resolution
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-RESOLUTION=${1:-${VNC_RESOLUTION:-1920x1080}}
-DPI=${2:-${VNC_DPI:-72}}
-if [ -z "$1" ]; then
- echo -e "**Current Settings **\n"
- xrandr
- echo -n -e "\nEnter new resolution (WIDTHxHEIGHT, blank for ${RESOLUTION}, Ctrl+C to abort).\n> "
- read NEW_RES
- if [ "${NEW_RES}" != "" ]; then
- RESOLUTION=${NEW_RES}
- fi
- if [ -z "$2" ]; then
- echo -n -e "\nEnter new DPI (blank for ${DPI}, Ctrl+C to abort).\n> "
- read NEW_DPI
- if [ "${NEW_DPI}" != "" ]; then
- DPI=${NEW_DPI}
- fi
- fi
-fi
-
-xrandr --fb ${RESOLUTION} --dpi ${DPI} > /dev/null 2>&1
-
-echo -e "\n**New Settings **\n"
-xrandr
-echo
diff --git a/.devcontainer/cache/.gitignore b/.devcontainer/cache/.gitignore
new file mode 100644
index 0000000000..4f96ddff40
--- /dev/null
+++ b/.devcontainer/cache/.gitignore
@@ -0,0 +1 @@
+*.manifest
diff --git a/.devcontainer/cache/before-cache.sh b/.devcontainer/cache/before-cache.sh
new file mode 100755
index 0000000000..cfa7acc9d9
--- /dev/null
+++ b/.devcontainer/cache/before-cache.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# This file establishes a basline for the reposuitory before any steps in the "prepare.sh"
+# are run. Its just a find command that filters out a few things we don't need to watch.
+
+set -e
+
+SCRIPT_PATH="$(cd "$(dirname $0)" && pwd)"
+SOURCE_FOLDER="${1:-"."}"
+
+cd "${SOURCE_FOLDER}"
+echo "[$(date)] Generating ""before"" manifest..."
+find -L . -not -path "*/.git/*" -and -not -path "${SCRIPT_PATH}/*.manifest" -type f > "${SCRIPT_PATH}/before.manifest"
+echo "[$(date)] Done!"
+
diff --git a/.devcontainer/cache/build-cache-image.sh b/.devcontainer/cache/build-cache-image.sh
new file mode 100755
index 0000000000..78d0fbfdf0
--- /dev/null
+++ b/.devcontainer/cache/build-cache-image.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# This file simply wraps the dockeer build command used to build the image with the
+# cached result of the commands from "prepare.sh" and pushes it to the specified
+# container image registry.
+
+set -e
+
+SCRIPT_PATH="$(cd "$(dirname $0)" && pwd)"
+CONTAINER_IMAGE_REPOSITORY="$1"
+BRANCH="${2:-"master"}"
+
+if [ "${CONTAINER_IMAGE_REPOSITORY}" = "" ]; then
+ echo "Container repository not specified!"
+ exit 1
+fi
+
+TAG="branch-${BRANCH//\//-}"
+echo "[$(date)] ${BRANCH} => ${TAG}"
+cd "${SCRIPT_PATH}/../.."
+
+echo "[$(date)] Starting image build..."
+docker build -t ${CONTAINER_IMAGE_REPOSITORY}:"${TAG}" -f "${SCRIPT_PATH}/cache.Dockerfile" .
+echo "[$(date)] Image build complete."
+
+echo "[$(date)] Pushing image..."
+docker push ${CONTAINER_IMAGE_REPOSITORY}:"${TAG}"
+echo "[$(date)] Done!"
diff --git a/.devcontainer/cache/cache-diff.sh b/.devcontainer/cache/cache-diff.sh
new file mode 100755
index 0000000000..362337ce6e
--- /dev/null
+++ b/.devcontainer/cache/cache-diff.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# This file is used to archive off a copy of any differences in the source tree into another location
+# in the image. Once the codespace is up, this will be restored into its proper location (which is
+# quick and happens parallel to other startup activities)
+
+set -e
+
+SCRIPT_PATH="$(cd "$(dirname $0)" && pwd)"
+SOURCE_FOLDER="${1:-"."}"
+CACHE_FOLDER="${2:-"/usr/local/etc/devcontainer-cache"}"
+
+echo "[$(date)] Starting cache operation..."
+cd "${SOURCE_FOLDER}"
+echo "[$(date)] Determining diffs..."
+find -L . -not -path "*/.git/*" -and -not -path "${SCRIPT_PATH}/*.manifest" -type f > "${SCRIPT_PATH}/after.manifest"
+grep -Fxvf "${SCRIPT_PATH}/before.manifest" "${SCRIPT_PATH}/after.manifest" > "${SCRIPT_PATH}/cache.manifest"
+echo "[$(date)] Archiving diffs..."
+mkdir -p "${CACHE_FOLDER}"
+tar -cf "${CACHE_FOLDER}/cache.tar" --totals --files-from "${SCRIPT_PATH}/cache.manifest"
+echo "[$(date)] Done! $(du -h "${CACHE_FOLDER}/cache.tar")"
diff --git a/.devcontainer/cache/cache.Dockerfile b/.devcontainer/cache/cache.Dockerfile
new file mode 100644
index 0000000000..79af3ee8a3
--- /dev/null
+++ b/.devcontainer/cache/cache.Dockerfile
@@ -0,0 +1,14 @@
+# This dockerfile is used to build up from a base image to create an image with cached results of running "prepare.sh".
+# Other image contents: https://github.com/microsoft/vscode-dev-containers/blob/master/repository-containers/images/github.com/microsoft/vscode/.devcontainer/base.Dockerfile
+FROM mcr.microsoft.com/vscode/devcontainers/repos/microsoft/vscode:dev
+
+ARG USERNAME=node
+COPY --chown=${USERNAME}:${USERNAME} . /repo-source-tmp/
+RUN mkdir /usr/local/etc/devcontainer-cache \
+ && chown ${USERNAME} /usr/local/etc/devcontainer-cache /repo-source-tmp \
+ && su ${USERNAME} -c "\
+ cd /repo-source-tmp \
+ && .devcontainer/cache/before-cache.sh \
+ && .devcontainer/prepare.sh \
+ && .devcontainer/cache/cache-diff.sh" \
+ && rm -rf /repo-source-tmp
diff --git a/.devcontainer/cache/restore-diff.sh b/.devcontainer/cache/restore-diff.sh
new file mode 100755
index 0000000000..2f418d8748
--- /dev/null
+++ b/.devcontainer/cache/restore-diff.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+# This file restores the results of the "prepare.sh" into their proper locations
+# once the container has been created. It runs as a postCreateCommand which
+# in GitHub Codespaces occurs parallel to other startup activities and does not
+# really add to the overal startup time given how quick the operation ends up being.
+
+set -e
+
+SOURCE_FOLDER="$(cd "${1:-"."}" && pwd)"
+CACHE_FOLDER="${2:-"/usr/local/etc/devcontainer-cache"}"
+
+if [ ! -d "${CACHE_FOLDER}" ]; then
+ echo "No cache folder found."
+ exit 0
+fi
+
+echo "[$(date)] Expanding $(du -h "${CACHE_FOLDER}/cache.tar") file to ${SOURCE_FOLDER}..."
+cd "${SOURCE_FOLDER}"
+tar -xf "${CACHE_FOLDER}/cache.tar"
+rm -f "${CACHE_FOLDER}/cache.tar"
+echo "[$(date)] Done!"
+
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 722bace6df..cd632e134e 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -1,45 +1,30 @@
{
"name": "Code - OSS",
- "build": {
- "dockerfile": "Dockerfile",
- "args": {
- "MAX_VNC_RESOLUTION": "1920x1080x16",
- "TARGET_VNC_RESOLUTION": "1280x768",
- "TARGET_VNC_PORT": "5901",
- "TARGET_NOVNC_PORT": "6080",
- "VNC_PASSWORD": "vscode",
- "INSTALL_FIREFOX": "true"
- }
- },
+
+ // 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-master",
+
+ "workspaceMount": "source=${localWorkspaceFolder},target=/home/node/workspace/vscode,type=bind,consistency=cached",
+ "workspaceFolder": "/home/node/workspace/vscode",
"overrideCommand": false,
- "runArgs": [
- "--init",
- // seccomp=unconfined is required for Chrome sandboxing
- "--security-opt", "seccomp=unconfined"
- ],
+ "runArgs": [ "--init", "--security-opt", "seccomp=unconfined"],
"settings": {
- // zsh is also available
"terminal.integrated.shell.linux": "/bin/bash",
"resmon.show.battery": false,
- "resmon.show.cpufreq": false,
- "remote.extensionKind": {
- "ms-vscode.js-debug-nightly": "workspace",
- "msjsdiag.debugger-for-chrome": "workspace"
- },
- "debug.chrome.useV3": true
+ "resmon.show.cpufreq": false
},
- // noVNC, VNC ports
- "forwardPorts": [6080, 5901],
+ // noVNC, VNC, debug ports
+ "forwardPorts": [6080, 5901, 9222],
"extensions": [
"dbaeumer.vscode-eslint",
- "EditorConfig.EditorConfig",
- "msjsdiag.debugger-for-chrome",
- "mutantdino.resourcemonitor",
- "GitHub.vscode-pull-request-github"
+ "mutantdino.resourcemonitor"
],
+ // Optionally loads a cached yarn install for the repo
+ "postCreateCommand": ".devcontainer/cache/restore-diff.sh",
+
"remoteUser": "node"
}
diff --git a/.devcontainer/fluxbox/apps b/.devcontainer/fluxbox/apps
deleted file mode 100644
index d43f05e9e2..0000000000
--- a/.devcontainer/fluxbox/apps
+++ /dev/null
@@ -1,9 +0,0 @@
-[app] (name=code-oss-dev)
- [Position] (CENTER) {0 0}
- [Maximized] {yes}
- [Dimensions] {100% 100%}
-[end]
-[transient] (role=GtkFileChooserDialog)
- [Position] (CENTER) {0 0}
- [Dimensions] {70% 70%}
-[end]
diff --git a/.devcontainer/fluxbox/init b/.devcontainer/fluxbox/init
deleted file mode 100644
index a6b8d73fa7..0000000000
--- a/.devcontainer/fluxbox/init
+++ /dev/null
@@ -1,9 +0,0 @@
-session.menuFile: ~/.fluxbox/menu
-session.keyFile: ~/.fluxbox/keys
-session.styleFile: /usr/share/fluxbox/styles//Squared_for_Debian
-session.configVersion: 13
-session.screen0.workspaces: 1
-session.screen0.workspacewarping: false
-session.screen0.toolbar.widthPercent: 100
-session.screen0.strftimeFormat: %d %b, %a %02k:%M:%S
-session.screen0.toolbar.tools: prevworkspace, workspacename, nextworkspace, clock, prevwindow, nextwindow, iconbar, systemtray
diff --git a/.devcontainer/fluxbox/menu b/.devcontainer/fluxbox/menu
deleted file mode 100644
index ff5955a2fe..0000000000
--- a/.devcontainer/fluxbox/menu
+++ /dev/null
@@ -1,16 +0,0 @@
-[begin] ( Code - OSS Development Container )
- [exec] (File Manager) { nautilus ~ } <>
- [exec] (Terminal) {/usr/bin/gnome-terminal --working-directory=~ } <>
- [exec] (Start Code - OSS) { x-terminal-emulator -T "Code - OSS Build" -e bash /workspaces/vscode*/scripts/code.sh } <>
- [submenu] (System >) {}
- [exec] (Set Resolution) { x-terminal-emulator -T "Set Resolution" -e bash /usr/local/bin/set-resolution } <>
- [exec] (Passwords and Keys) { seahorse } <>
- [exec] (Top) { x-terminal-emulator -T "Top" -e /usr/bin/top } <>
- [exec] (Editres) {editres} <>
- [exec] (Xfontsel) {xfontsel} <>
- [exec] (Xkill) {xkill} <>
- [exec] (Xrefresh) {xrefresh} <>
- [end]
- [config] (Configuration >)
- [workspaces] (Workspaces >)
-[end]
diff --git a/.devcontainer/prepare.sh b/.devcontainer/prepare.sh
new file mode 100755
index 0000000000..47a77a533a
--- /dev/null
+++ b/.devcontainer/prepare.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+# This file contains the steps that should be run when creating the intermediary image that contains
+# contents for that should be in the image by default. It will be used to build up from the base image
+# to create an image that speeds up first time use of the dev container by "caching" the results
+# of these commands. Developers can still run these commands without an issue once the container is
+# up, but only differences will be processed which also speeds up the first time these operations occur.
+
+yarn install
+yarn electron
diff --git a/.eslintignore b/.eslintignore
index c47bb92a31..b2c4a5b6ef 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -5,7 +5,7 @@
**/vs/loader.js
**/insane/**
**/marked/**
-**/markjs/**
+**/semver/**
**/test/**/*.js
**/node_modules/**
**/vscode-api-tests/testWorkspace/**
diff --git a/.eslintrc.json b/.eslintrc.json
index e9ee311e14..cf754b6584 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -7,7 +7,8 @@
},
"plugins": [
"@typescript-eslint",
- "jsdoc"
+ "jsdoc",
+ "mocha"
],
"rules": {
"constructor-super": "warn",
@@ -41,6 +42,7 @@
"no-var": "warn",
"jsdoc/no-types": "warn",
"semi": "off",
+ "mocha/no-exclusive-tests": "warn",
"@typescript-eslint/semi": "warn",
"@typescript-eslint/naming-convention": [
"warn",
@@ -544,7 +546,8 @@
"vscode-textmate",
"vscode-oniguruma",
"iconv-lite-umd",
- "semver-umd"
+ "tas-client-umd",
+ "jschardet"
]
},
{
@@ -605,7 +608,11 @@
"**/{vs,sql}/editor/**",
"**/{vs,sql}/workbench/{common,browser,electron-sandbox}/**",
"**/{vs,sql}/workbench/api/{common,browser,electron-sandbox}/**",
- "**/{vs,sql}/workbench/services/**/{common,browser,electron-sandbox}/**"
+ "**/{vs,sql}/workbench/services/**/{common,browser,electron-sandbox}/**",
+ "vscode-textmate",
+ "vscode-oniguruma",
+ "iconv-lite-umd",
+ "jschardet"
]
},
{
@@ -733,7 +740,11 @@
"angular2-grid",
"html-query-plan",
"turndown",
- "mark.js"
+ "mark.js",
+ "vscode-textmate",
+ "vscode-oniguruma",
+ "iconv-lite-umd",
+ "jschardet"
]
},
{
@@ -762,7 +773,11 @@
"**/{vs,sql}/workbench/{common,browser,electron-sandbox}/**",
"**/{vs,sql}/workbench/api/{common,browser,electron-sandbox}/**",
"**/{vs,sql}/workbench/services/**/{common,browser,electron-sandbox}/**",
- "**/{vs,sql}/workbench/contrib/**/{common,browser,electron-sandbox}/**"
+ "**/{vs,sql}/workbench/contrib/**/{common,browser,electron-sandbox}/**",
+ "vscode-textmate",
+ "vscode-oniguruma",
+ "iconv-lite-umd",
+ "jschardet"
]
},
{
@@ -1024,6 +1039,7 @@
"collapse",
"create",
"delete",
+ "discover",
"dispose",
"edit",
"end",
diff --git a/.github/commands.yml b/.github/commands.yml
index 967ef134c0..5cf4cf2371 100644
--- a/.github/commands.yml
+++ b/.github/commands.yml
@@ -1,11 +1,12 @@
{
perform: true,
- commands: [
- {
- type: 'label',
- name: 'Needs Logs',
- action: 'comment',
- comment: "We need more info to debug your particular issue. If you could attach your logs to the issue (ensure no private data is in them), it would help us fix the issue much faster.\n\nTo find your logs:\n\n- Open command palette (Click **View** -> **Command Palette**)\n- Run the command: **`Developer: Open Logs Folder`**\n\nThis will open the log file locally. Please include renderer.log"
- }
- ]
+ commands:
+ [
+ {
+ type: "label",
+ name: "Needs Logs",
+ action: "comment",
+ comment: "We need more info to debug your particular issue. If you could attach your logs to the issue (ensure no private data is in them), it would help us fix the issue much faster.\n\nTo find your logs:\n\n- Open command palette (Click **View** -> **Command Palette**)\n- Run the command: **`Developer: Open Logs Folder`**\n\nThis will open the log file locally. Please include renderer.log",
+ },
+ ],
}
diff --git a/.github/similarity.yml b/.github/similarity.yml
index 802fd8cd7b..f0e1f29dcd 100644
--- a/.github/similarity.yml
+++ b/.github/similarity.yml
@@ -1,5 +1,5 @@
{
perform: true,
whenCreatedByTeam: true,
- comment: "Thanks for submitting this issue. Please also check if it is already covered by an existing one, like:\n${potentialDuplicates}"
+ comment: "Thanks for submitting this issue. Please also check if it is already covered by an existing one, like:\n${potentialDuplicates}",
}
diff --git a/.github/subscribers.json b/.github/subscribers.json
index 89dee80d4a..7ee6e5cdad 100644
--- a/.github/subscribers.json
+++ b/.github/subscribers.json
@@ -1,7 +1,9 @@
{
- "label-to-subscribe-to": [
- "list of usernames to subscribe",
- "such as:",
- "JacksonKearl"
+ "notebook": [
+ "claudiaregio",
+ "rchiodo",
+ "greazer",
+ "donjayamanne",
+ "jilljac"
]
}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index fbb2501544..8764d2bbb3 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -17,51 +17,51 @@ jobs:
CHILD_CONCURRENCY: "1"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- - uses: actions/checkout@v2.2.0
- # TODO: rename azure-pipelines/linux/xvfb.init to github-actions
- - run: |
- sudo apt-get update
- sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libkrb5-dev # {{SQL CARBON EDIT}} add kerberos dep
- sudo cp build/azure-pipelines/linux/xvfb.init /etc/init.d/xvfb
- sudo chmod +x /etc/init.d/xvfb
- sudo update-rc.d xvfb defaults
- sudo service xvfb start
- name: Setup Build Environment
- - uses: actions/setup-node@v1
- with:
- node-version: 10
- # TODO: cache node modules
- # Increase timeout to get around latency issues when fetching certain packages
- - run: |
- yarn config set network-timeout 300000
- yarn --frozen-lockfile
- name: Install Dependencies
- - run: yarn electron x64
- name: Download Electron
- - run: yarn gulp hygiene
- name: Run Hygiene Checks
- - run: yarn strict-vscode # {{SQL CARBON EDIT}} add step
- name: Run Strict Compile Options
- # - run: yarn monaco-compile-check {{SQL CARBON EDIT}} remove step
- # name: Run Monaco Editor Checks
- - run: yarn valid-layers-check
- name: Run Valid Layers Checks
- - run: yarn compile
- name: Compile Sources
- # - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
- # name: Download Built-in Extensions
- - run: DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests" --coverage --runGlob "**/sql/**/*.test.js"
- name: Run Unit Tests (Electron)
- - run: DISPLAY=:10 ./scripts/test-extensions-unit.sh
- name: Run Extension Unit Tests (Electron)
- # {{SQL CARBON EDIT}} Add coveralls. We merge first to get around issue where parallel builds weren't being combined correctly
- - run: node test/combineCoverage
- name: Combine code coverage files
- - name: Upload Code Coverage
- uses: coverallsapp/github-action@v1.1.1
- with:
- github-token: ${{ secrets.GITHUB_TOKEN }}
- path-to-lcov: 'test/coverage/lcov.info'
+ - uses: actions/checkout@v2.2.0
+ # TODO: rename azure-pipelines/linux/xvfb.init to github-actions
+ - run: |
+ sudo apt-get update
+ sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libkrb5-dev # {{SQL CARBON EDIT}} add kerberos dep
+ sudo cp build/azure-pipelines/linux/xvfb.init /etc/init.d/xvfb
+ sudo chmod +x /etc/init.d/xvfb
+ sudo update-rc.d xvfb defaults
+ sudo service xvfb start
+ name: Setup Build Environment
+ - uses: actions/setup-node@v1
+ with:
+ node-version: 10
+ # TODO: cache node modules
+ # Increase timeout to get around latency issues when fetching certain packages
+ - run: |
+ yarn config set network-timeout 300000
+ yarn --frozen-lockfile
+ name: Install Dependencies
+ - run: yarn electron x64
+ name: Download Electron
+ - run: yarn gulp hygiene
+ name: Run Hygiene Checks
+ - run: yarn strict-vscode # {{SQL CARBON EDIT}} add step
+ name: Run Strict Compile Options
+ # - run: yarn monaco-compile-check {{SQL CARBON EDIT}} remove step
+ # name: Run Monaco Editor Checks
+ - run: yarn valid-layers-check
+ name: Run Valid Layers Checks
+ - run: yarn compile
+ name: Compile Sources
+ # - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
+ # name: Download Built-in Extensions
+ - run: DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests" --coverage --runGlob "**/sql/**/*.test.js"
+ name: Run Unit Tests (Electron)
+ - run: DISPLAY=:10 ./scripts/test-extensions-unit.sh
+ name: Run Extension Unit Tests (Electron)
+ # {{SQL CARBON EDIT}} Add coveralls. We merge first to get around issue where parallel builds weren't being combined correctly
+ - run: node test/combineCoverage
+ name: Combine code coverage files
+ - name: Upload Code Coverage
+ uses: coverallsapp/github-action@v1.1.1
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ path-to-lcov: "test/coverage/lcov.info"
# Fails with cryptic error (e.g. https://github.com/microsoft/vscode/pull/90292/checks?check_run_id=433681926#step:13:9)
# - run: DISPLAY=:10 yarn test-browser --browser chromium
@@ -75,34 +75,34 @@ jobs:
CHILD_CONCURRENCY: "1"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- - uses: actions/checkout@v2.2.0
- - uses: actions/setup-node@v1
- with:
- node-version: 10
- - uses: actions/setup-python@v1
- with:
- python-version: '2.x'
- # Increase timeout to get around latency issues when fetching certain packages
- - run: |
- yarn config set network-timeout 300000
- yarn --frozen-lockfile
- name: Install Dependencies
- - run: yarn electron
- name: Download Electron
- - run: yarn gulp hygiene
- name: Run Hygiene Checks
- - run: yarn strict-vscode # {{SQL CARBON EDIT}} add step
- name: Run Strict Compile Options
- # - run: yarn monaco-compile-check {{SQL CARBON EDIT}} remove step
- # name: Run Monaco Editor Checks
- - run: yarn valid-layers-check
- name: Run Valid Layers Checks
- - run: yarn compile
- name: Compile Sources
- # - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
- # name: Download Built-in Extensions
- - run: .\scripts\test.bat --tfs "Unit Tests"
- name: Run Unit Tests (Electron)
+ - uses: actions/checkout@v2.2.0
+ - uses: actions/setup-node@v1
+ with:
+ node-version: 10
+ - uses: actions/setup-python@v1
+ with:
+ python-version: "2.x"
+ # Increase timeout to get around latency issues when fetching certain packages
+ - run: |
+ yarn config set network-timeout 300000
+ yarn --frozen-lockfile
+ name: Install Dependencies
+ - run: yarn electron
+ name: Download Electron
+ - run: yarn gulp hygiene
+ name: Run Hygiene Checks
+ - run: yarn strict-vscode # {{SQL CARBON EDIT}} add step
+ name: Run Strict Compile Options
+ # - run: yarn monaco-compile-check {{SQL CARBON EDIT}} remove step
+ # name: Run Monaco Editor Checks
+ - run: yarn valid-layers-check
+ name: Run Valid Layers Checks
+ - run: yarn compile
+ name: Compile Sources
+ # - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
+ # name: Download Built-in Extensions
+ - run: .\scripts\test.bat --tfs "Unit Tests"
+ name: Run Unit Tests (Electron)
# - run: yarn test-browser --browser chromium {{SQL CARBON EDIT}} disable for now @TODO @anthonydresser
# name: Run Unit Tests (Browser)
# - run: .\scripts\test-integration.bat --tfs "Integration Tests" {{SQL CARBON EDIT}} remove step
@@ -114,31 +114,31 @@ jobs:
CHILD_CONCURRENCY: "1"
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- - uses: actions/checkout@v2.2.0
- - uses: actions/setup-node@v1
- with:
- node-version: 10
- # Increase timeout to get around latency issues when fetching certain packages
- - run: |
- yarn config set network-timeout 300000
- yarn --frozen-lockfile
- name: Install Dependencies
- - run: yarn electron x64
- name: Download Electron
- - run: yarn gulp hygiene
- name: Run Hygiene Checks
- - run: yarn strict-vscode # {{SQL CARBON EDIT}} add step
- name: Run Strict Compile Options
- # - run: yarn monaco-compile-check {{SQL CARBON EDIT}} remove step
- # name: Run Monaco Editor Checks
- - run: yarn valid-layers-check
- name: Run Valid Layers Checks
- - run: yarn compile
- name: Compile Sources
- # - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
- # name: Download Built-in Extensions
- - run: ./scripts/test.sh --tfs "Unit Tests"
- name: Run Unit Tests (Electron)
+ - uses: actions/checkout@v2.2.0
+ - uses: actions/setup-node@v1
+ with:
+ node-version: 10
+ # Increase timeout to get around latency issues when fetching certain packages
+ - run: |
+ yarn config set network-timeout 300000
+ yarn --frozen-lockfile
+ name: Install Dependencies
+ - run: yarn electron x64
+ name: Download Electron
+ - run: yarn gulp hygiene
+ name: Run Hygiene Checks
+ - run: yarn strict-vscode # {{SQL CARBON EDIT}} add step
+ name: Run Strict Compile Options
+ # - run: yarn monaco-compile-check {{SQL CARBON EDIT}} remove step
+ # name: Run Monaco Editor Checks
+ - run: yarn valid-layers-check
+ name: Run Valid Layers Checks
+ - run: yarn compile
+ name: Compile Sources
+ # - run: yarn download-builtin-extensions {{SQL CARBON EDIT}} remove step
+ # name: Download Built-in Extensions
+ - run: ./scripts/test.sh --tfs "Unit Tests"
+ name: Run Unit Tests (Electron)
# - run: yarn test-browser --browser chromium --browser webkit
# name: Run Unit Tests (Browser)
# - run: ./scripts/test-integration.sh --tfs "Integration Tests"
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index aabab068f4..7bc7fbde44 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -3,44 +3,42 @@ name: "Code Scanning - Action"
on:
push:
schedule:
- - cron: '0 0 * * 0'
+ - cron: "0 0 * * 0"
jobs:
CodeQL-Build:
-
strategy:
fail-fast: false
-
# CodeQL runs on ubuntu-latest, windows-latest, and macos-latest
runs-on: ubuntu-latest
steps:
- - name: Checkout repository
- uses: actions/checkout@v2
+ - name: Checkout repository
+ uses: actions/checkout@v2
- # Initializes the CodeQL tools for scanning.
- - name: Initialize CodeQL
- uses: github/codeql-action/init@v1
- # Override language selection by uncommenting this and choosing your languages
- # with:
- # languages: go, javascript, csharp, python, cpp, java
+ # Initializes the CodeQL tools for scanning.
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v1
+ # Override language selection by uncommenting this and choosing your languages
+ # with:
+ # languages: go, javascript, csharp, python, cpp, java
- # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
- # If this step fails, then you should remove it and run the build manually (see below).
- - name: Autobuild
- uses: github/codeql-action/autobuild@v1
+ # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
+ # If this step fails, then you should remove it and run the build manually (see below).
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v1
- # âšī¸ Command-line programs to run using the OS shell.
- # đ https://git.io/JvXDl
+ # âšī¸ Command-line programs to run using the OS shell.
+ # đ https://git.io/JvXDl
- # âī¸ If the Autobuild fails above, remove it and uncomment the following three lines
- # and modify them (or add more) to build your code if your project
- # uses a compiled language
+ # âī¸ If the Autobuild fails above, remove it and uncomment the following three lines
+ # and modify them (or add more) to build your code if your project
+ # uses a compiled language
- #- run: |
- # make bootstrap
- # make release
+ #- run: |
+ # make bootstrap
+ # make release
- - name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v1
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v1
diff --git a/.github/workflows/deep-classifier-runner.yml b/.github/workflows/deep-classifier-runner.yml
index 82ae49039f..ffa11badc9 100644
--- a/.github/workflows/deep-classifier-runner.yml
+++ b/.github/workflows/deep-classifier-runner.yml
@@ -12,8 +12,8 @@ jobs:
- name: Checkout Actions
uses: actions/checkout@v2
with:
- repository: 'microsoft/vscode-github-triage-actions'
- ref: v35
+ repository: "microsoft/vscode-github-triage-actions"
+ ref: v40
path: ./actions
- name: Install Actions
run: npm install --production --prefix ./actions
diff --git a/.github/workflows/deep-classifier-scraper.yml b/.github/workflows/deep-classifier-scraper.yml
index 9fe52cd347..1ce6faed4b 100644
--- a/.github/workflows/deep-classifier-scraper.yml
+++ b/.github/workflows/deep-classifier-scraper.yml
@@ -10,8 +10,8 @@ jobs:
- name: Checkout Actions
uses: actions/checkout@v2
with:
- repository: 'microsoft/vscode-github-triage-actions'
- ref: v35
+ repository: "microsoft/vscode-github-triage-actions"
+ ref: v40
path: ./actions
- name: Install Actions
run: npm install --production --prefix ./actions
diff --git a/.github/workflows/devcontainer-cache.yml b/.github/workflows/devcontainer-cache.yml
new file mode 100644
index 0000000000..a250b56cd7
--- /dev/null
+++ b/.github/workflows/devcontainer-cache.yml
@@ -0,0 +1,40 @@
+name: VS Code Repo Dev Container Cache Image Generation
+
+on:
+ push:
+ # Currently doing this for master, but could be done for PRs as well
+ branches:
+ - "master"
+
+ # Only updates to these files result in changes to installed packages, so skip otherwise
+ paths:
+ - "**/package-lock.json"
+ - "**/yarn.lock"
+
+jobs:
+ devcontainer:
+ name: Generate cache image
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ id: checkout
+ uses: actions/checkout@v2
+
+ - name: Azure CLI login
+ id: az_login
+ uses: azure/login@v1
+ with:
+ creds: ${{ secrets.AZ_ACR_CREDS }}
+
+ - name: Build and push
+ id: build_and_push
+ run: |
+ set -e
+
+ ACR_REGISTRY_NAME=$(echo ${{ secrets.CONTAINER_IMAGE_REGISTRY }} | grep -oP '(.+)(?=\.azurecr\.io)')
+ az acr login --name $ACR_REGISTRY_NAME
+
+ GIT_BRANCH=$(echo "${{ github.ref }}" | grep -oP 'refs/(heads|tags)/\K(.+)')
+ if [ "$GIT_BRANCH" == "" ]; then GIT_BRANCH=master; fi
+
+ .devcontainer/cache/build-cache-image.sh "${{ secrets.CONTAINER_IMAGE_REGISTRY }}/public/vscode/devcontainers/repos/microsoft/vscode" "${GIT_BRANCH}"
diff --git a/.github/workflows/latest-release-monitor.yml b/.github/workflows/latest-release-monitor.yml
index 5585505438..190da52ba3 100644
--- a/.github/workflows/latest-release-monitor.yml
+++ b/.github/workflows/latest-release-monitor.yml
@@ -12,9 +12,9 @@ jobs:
- name: Checkout Actions
uses: actions/checkout@v2
with:
- repository: 'microsoft/vscode-github-triage-actions'
+ repository: "microsoft/vscode-github-triage-actions"
path: ./actions
- ref: v35
+ ref: v40
- name: Install Actions
run: npm install --production --prefix ./actions
- name: Install Storage Module
diff --git a/.nvmrc b/.nvmrc
deleted file mode 100644
index f599e28b8a..0000000000
--- a/.nvmrc
+++ /dev/null
@@ -1 +0,0 @@
-10
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 9b8f39afaf..6fc69d627b 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -41,10 +41,7 @@
"port": 5876,
"outFiles": [
"${workspaceFolder}/out/**/*.js"
- ],
- "presentation": {
- "hidden": true,
- }
+ ]
},
{
"type": "node",
@@ -141,9 +138,12 @@
}
},
{
- "type": "chrome",
+ "type": "pwa-chrome",
"request": "launch",
- "name": "Launch ADS (Web, Chrome) (TBD)",
+ "outFiles": [],
+ "outFiles": [],
+ "perScriptSourcemaps": "yes",
+ "name": "VS Code (Web, Chrome)",
"url": "http://localhost:8080",
"preLaunchTask": "Run web",
"presentation": {
@@ -154,6 +154,8 @@
{
"type": "pwa-msedge",
"request": "launch",
+ "outFiles": [],
+ "perScriptSourcemaps": "yes",
"name": "VS Code (Web, Edge)",
"url": "http://localhost:8080",
"pauseForSourceMap": false,
@@ -193,7 +195,7 @@
}
},
{
- "type": "node",
+ "type": "pwa-node",
"request": "launch",
"name": "Run Unit Tests",
"program": "${workspaceFolder}/test/unit/electron/index.js",
@@ -212,6 +214,41 @@
"outFiles": [
"${workspaceFolder}/out/**/*.js"
],
+ "cascadeTerminateToConfigurations": [
+ "Attach to VS Code"
+ ],
+ "env": {
+ "MOCHA_COLORS": "true"
+ },
+ "presentation": {
+ "hidden": true
+ }
+ },
+ {
+ "type": "pwa-node",
+ "request": "launch",
+ "name": "Run Unit Tests For Current File",
+ "program": "${workspaceFolder}/test/unit/electron/index.js",
+ "runtimeExecutable": "${workspaceFolder}/.build/electron/Code - OSS.app/Contents/MacOS/Electron",
+ "windows": {
+ "runtimeExecutable": "${workspaceFolder}/.build/electron/Code - OSS.exe"
+ },
+ "linux": {
+ "runtimeExecutable": "${workspaceFolder}/.build/electron/code-oss"
+ },
+ "cascadeTerminateToConfigurations": [
+ "Attach to VS Code"
+ ],
+ "outputCapture": "std",
+ "args": [
+ "--remote-debugging-port=9222",
+ "--run",
+ "${relativeFile}"
+ ],
+ "cwd": "${workspaceFolder}",
+ "outFiles": [
+ "${workspaceFolder}/out/**/*.js"
+ ],
"env": {
"MOCHA_COLORS": "true"
},
@@ -315,6 +352,17 @@
"group": "1_vscode",
"order": 2
}
+ },
+ {
+ "name": "Debug Unit Tests (Current File)",
+ "configurations": [
+ "Attach to VS Code",
+ "Run Unit Tests For Current File"
+ ],
+ "presentation": {
+ "group": "1_vscode",
+ "order": 2
+ }
}
]
}
diff --git a/.vscode/notebooks/api.github-issues b/.vscode/notebooks/api.github-issues
index 2eb4b6432b..8ff55e2c6e 100644
--- a/.vscode/notebooks/api.github-issues
+++ b/.vscode/notebooks/api.github-issues
@@ -8,7 +8,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "$repo=repo:microsoft/vscode\n$milestone=milestone:\"September 2020\"",
+ "value": "$repo=repo:microsoft/vscode\n$milestone=milestone:\"November 2020\"",
"editable": true
},
{
diff --git a/.vscode/notebooks/endgame.github-issues b/.vscode/notebooks/endgame.github-issues
new file mode 100644
index 0000000000..35a22f829e
--- /dev/null
+++ b/.vscode/notebooks/endgame.github-issues
@@ -0,0 +1,110 @@
+[
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "#### Macros",
+ "editable": true
+ },
+ {
+ "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\n\n$MILESTONE=milestone:\"November 2020\"",
+ "editable": false
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# Preparation",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Open Pull Requests on the Milestone",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE is:pr is:open",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Open Issues on the Milestone",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE is:issue is:open -label:iteration-plan -label:endgame-plan -label:testplan-item",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Feature Requests Missing Labels",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE is:issue is:closed label:feature-request -label:verification-needed -label:on-testplan -label:verified -label:*duplicate",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# Testing",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Test Plan Items",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE is:issue is:open label:testplan-item",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Verification Needed",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE is:issue is:closed label:feature-request label:verification-needed",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# Verification",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE is:issue is:closed sort:updated-asc label:bug -label:verified -label:on-testplan -label:*duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# Candidates",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE label:candidate",
+ "editable": true
+ }
+]
\ No newline at end of file
diff --git a/.vscode/notebooks/grooming-delta.github-issues b/.vscode/notebooks/grooming-delta.github-issues
new file mode 100644
index 0000000000..8bc9d38b48
--- /dev/null
+++ b/.vscode/notebooks/grooming-delta.github-issues
@@ -0,0 +1,767 @@
+[
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Config",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$since=2020-10-01",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode\n\nQuery exceeds the maximum result. Run the query manually: `is:issue is:open closed:>2020-10-01`",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "//repo:microsoft/vscode is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "//repo:microsoft/vscode is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-remote-release",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-remote-release is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-remote-release is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# monaco-editor",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-editor is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-editor is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-docs",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-docs is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-docs is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-js-debug",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-js-debug is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-js-debug is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# language-server-protocol",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/language-server-protocol is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/language-server-protocol is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-eslint",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-eslint is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-eslint is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-css-languageservice",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-css-languageservice is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-css-languageservice is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-test",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-test is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-test is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-pull-request-github"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-pull-request-github is:issue closed:>$since"
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-test is:issue created:>$since"
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-chrome-debug (deprecated)",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-chrome-debug is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-chrome-debug is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-chrome-debug-core",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-chrome-debug-core is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-chrome-debug-core is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-debugadapter-node",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-debugadapter-node is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-debugadapter-node is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-emmet-helper",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-emmet-helper is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-emmet-helper is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-extension-vscode\n\nDeprecated",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-extension-vscode is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-extension-vscode is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-extension-samples",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-extension-samples is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-extension-samples is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-filewatcher-windows",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-filewatcher-windows is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-filewatcher-windows is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-generator-code",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-generator-code is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-generator-code is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-html-languageservice",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-html-languageservice is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-html-languageservice is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-jshint",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-jshint is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-jshint is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-json-languageservice",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-json-languageservice is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-json-languageservice is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-languageserver-node",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-languageserver-node is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-languageserver-node is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-loader",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-loader is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-loader is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-mono-debug",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-mono-debug is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-mono-debug is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-node-debug",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-node-debug is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-node-debug is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-node-debug2",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-node-debug2 is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-node-debug2 is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-recipes",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-recipes is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-recipes is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-textmate",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-textmate is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-textmate is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-themes",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-themes is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-themes is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-vsce",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-vsce is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-vsce is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-website",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-website is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-website is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# vscode-windows-process-tree",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-windows-process-tree is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode-windows-process-tree is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# debug-adapter-protocol",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/debug-adapter-protocol is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/debug-adapter-protocol is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# inno-updater",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/inno-updater is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/inno-updater is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# language-server-protocol-inspector",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/language-server-protocol-inspector is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/language-server-protocol-inspector is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# monaco-languages",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-languages is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-languages is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# monaco-typescript",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-typescript is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-typescript is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# monaco-css",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-css is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-css is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# monaco-json",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-json is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-json is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# monaco-html",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-html is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-html is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# monaco-editor-webpack-plugin",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-editor-webpack-plugin is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/monaco-editor-webpack-plugin is:issue created:>$since",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# node-jsonc-parser",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/node-jsonc-parser is:issue closed:>$since",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/node-jsonc-parser is:issue created:>$since",
+ "editable": true
+ }
+]
\ No newline at end of file
diff --git a/.vscode/notebooks/grooming.github-issues b/.vscode/notebooks/grooming.github-issues
new file mode 100644
index 0000000000..f44b2c71ee
--- /dev/null
+++ b/.vscode/notebooks/grooming.github-issues
@@ -0,0 +1,26 @@
+[
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "### Categorizing Issues\n\nEach issue must have a type label. Most type labels are grey, some are yellow. Bugs are grey with a touch of red.",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode is:open is:issue assignee:@me -label:\"needs more info\" -label:bug -label:feature-request -label:under-discussion -label:debt -label:*question -label:upstream -label:electron -label:engineering -label:plan-item ",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "### Feature Areas\n\nEach issue should be assigned to a feature area",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode is:open is:issue assignee:@me -label:L10N -label:VIM -label:api -label:api-finalization -label:api-proposal -label:authentication -label:breadcrumbs -label:callhierarchy -label:code-lens -label:color-palette -label:comments -label:config -label:context-keys -label:css-less-scss -label:custom-editors -label:debug -label:debug-console -label:dialogs -label:diff-editor -label:dropdown -label:editor -label:editor-RTL -label:editor-autoclosing -label:editor-autoindent -label:editor-bracket-matching -label:editor-clipboard -label:editor-code-actions -label:editor-color-picker -label:editor-columnselect -label:editor-commands -label:editor-comments -label:editor-contrib -label:editor-core -label:editor-drag-and-drop -label:editor-error-widget -label:editor-find -label:editor-folding -label:editor-highlight -label:editor-hover -label:editor-indent-detection -label:editor-indent-guides -label:editor-input -label:editor-input-IME -label:editor-insets -label:editor-minimap -label:editor-multicursor -label:editor-parameter-hints -label:editor-render-whitespace -label:editor-rendering -label:editor-scrollbar -label:editor-symbols -label:editor-synced-region -label:editor-textbuffer -label:editor-theming -label:editor-wordnav -label:editor-wrapping -label:emmet -label:error-list -label:explorer-custom -label:extension-host -label:extension-recommendations -label:extensions -label:extensions-development -label:file-decorations -label:file-encoding -label:file-explorer -label:file-glob -label:file-guess-encoding -label:file-io -label:file-watcher -label:font-rendering -label:formatting -label:git -label:github -label:gpu -label:grammar -label:grid-view -label:html -label:i18n -label:icon-brand -label:icons-product -label:install-update -label:integrated-terminal -label:integrated-terminal-conpty -label:integrated-terminal-links -label:integrated-terminal-rendering -label:integrated-terminal-winpty -label:intellisense-config -label:ipc -label:issue-bot -label:issue-reporter -label:javascript -label:json -label:keybindings -label:keybindings-editor -label:keyboard-layout -label:label-provider -label:languages-basic -label:languages-diagnostics -label:languages-guessing -label:layout -label:lcd-text-rendering -label:list -label:log -label:markdown -label:marketplace -label:menus -label:merge-conflict -label:notebook -label:outline -label:output -label:perf -label:perf-bloat -label:perf-startup -label:php -label:portable-mode -label:proxy -label:quick-pick -label:references-viewlet -label:release-notes -label:remote -label:remote-explorer -label:rename -label:sandbox -label:scm -label:screencast-mode -label:search -label:search-api -label:search-editor -label:search-replace -label:semantic-tokens -label:settings-editor -label:settings-sync -label:settings-sync-server -label:shared-process -label:simple-file-dialog -label:smart-select -label:snap -label:snippets -label:splitview -label:suggest -label:sync-error-handling -label:tasks -label:telemetry -label:themes -label:timeline -label:timeline-git -label:titlebar -label:tokenization -label:touch/pointer -label:trackpad/scroll -label:tree -label:typescript -label:undo-redo -label:uri -label:ux -label:variable-resolving -label:vscode-build -label:vscode-website -label:web -label:webview -label:workbench-actions -label:workbench-cli -label:workbench-diagnostics -label:workbench-dnd -label:workbench-editor-grid -label:workbench-editors -label:workbench-electron -label:workbench-feedback -label:workbench-history -label:workbench-hot-exit -label:workbench-hover -label:workbench-launch -label:workbench-link -label:workbench-multiroot -label:workbench-notifications -label:workbench-os-integration -label:workbench-rapid-render -label:workbench-run-as-admin -label:workbench-state -label:workbench-status -label:workbench-tabs -label:workbench-touchbar -label:workbench-views -label:workbench-welcome -label:workbench-window -label:workbench-zen -label:workspace-edit -label:workspace-symbols -label:zoom",
+ "editable": true
+ }
+]
\ No newline at end of file
diff --git a/.vscode/notebooks/inbox.github-issues b/.vscode/notebooks/inbox.github-issues
index e2e9e8a1cb..93e985cdfa 100644
--- a/.vscode/notebooks/inbox.github-issues
+++ b/.vscode/notebooks/inbox.github-issues
@@ -2,19 +2,19 @@
{
"kind": 1,
"language": "markdown",
- "value": "##### `Config`: defines the inbox query",
+ "value": "## tl;dr: Triage Inbox\n\nAll inbox issues but not those that need more information. These issues need to be triaged, e.g assigned to a user or ask for more information",
"editable": true
},
{
"kind": 2,
"language": "github-issues",
- "value": "$inbox=repo:microsoft/vscode is:open no:assignee -label:feature-request -label:testplan-item -label:plan-item ",
+ "value": "$inbox -label:\"needs more info\"",
"editable": true
},
{
"kind": 1,
"language": "markdown",
- "value": "## Inbox tracking and Issue triage",
+ "value": "##### `Config`: defines the inbox query",
"editable": true
},
{
@@ -26,25 +26,25 @@
{
"kind": 1,
"language": "markdown",
- "value": "## Triage Inbox\n\nAll inbox issues but not those that need more information. These issues need to be triaged, e.g assigned to a user or ask for more information",
- "editable": true
- },
- {
- "kind": 2,
- "language": "github-issues",
- "value": "$inbox -label:\"needs more info\" -label:emmet",
+ "value": "## Inbox tracking and Issue triage",
"editable": true
},
{
"kind": 1,
"language": "markdown",
- "value": "## Inbox\n\nAll issues that have no assignee and that have neither **feature requests** nor **test plan items** nor **plan items**.",
+ "value": "New issues or pull requests submitted by the community are initially triaged by an [automatic classification bot](https://github.com/microsoft/vscode-github-triage-actions/tree/master/classifier-deep). Issues that the bot does not correctly triage are then triaged by a team member. The team rotates the inbox tracker on a weekly basis.\n\nA [mirror](https://github.com/JacksonKearl/testissues/issues) of the VS Code issue stream is available with details about how the bot classifies issues, including feature-area classifications and confidence ratings. Per-category confidence thresholds and feature-area ownership data is maintained in [.github/classifier.json](https://github.com/microsoft/vscode/blob/master/.github/classifier.json). \n\nđĄ The bot is being run through a GitHub action that runs every 30 minutes. Give the bot the opportunity to classify an issue before doing it manually.\n\n### Inbox Tracking\n\nThe inbox tracker is responsible for the [global inbox](https://github.com/microsoft/vscode/issues?utf8=%E2%9C%93&q=is%3Aopen+no%3Aassignee+-label%3Afeature-request+-label%3Atestplan-item+-label%3Aplan-item) containing all **open issues and pull requests** that\n- are neither **feature requests** nor **test plan items** nor **plan items** and\n- have **no owner assignment**.\n\nThe **inbox tracker** may perform any step described in our [issue triaging documentation](https://github.com/microsoft/vscode/wiki/Issues-Triaging) but its main responsibility is to route issues to the actual feature area owner.\n\nFeature area owners track the **feature area inbox** containing all **open issues and pull requests** that\n- are personally assigned to them and are not assigned to any milestone\n- are labeled with their feature area label and are not assigned to any milestone.\nThis secondary triage may involve any of the steps described in our [issue triaging documentation](https://github.com/microsoft/vscode/wiki/Issues-Triaging) and results in a fully triaged or closed issue.\n\nThe [github triage extension](https://github.com/microsoft/vscode-github-triage-extension) can be used to assist with triaging â it provides a \"Command Palette\"-style list of triaging actions like assignment, labeling, and triggers for various bot actions.",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## All Inbox Items\n\nAll issues that have no assignee and that have neither **feature requests** nor **test plan items** nor **plan items**.",
"editable": true
},
{
"kind": 2,
"language": "github-issues",
- "value": "$inbox -label:emmet",
+ "value": "$inbox",
"editable": true
}
]
\ No newline at end of file
diff --git a/.vscode/notebooks/my-endgame.github-issues b/.vscode/notebooks/my-endgame.github-issues
new file mode 100644
index 0000000000..402ef474e5
--- /dev/null
+++ b/.vscode/notebooks/my-endgame.github-issues
@@ -0,0 +1,206 @@
+[
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "#### Macros",
+ "editable": true
+ },
+ {
+ "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\n\n$MILESTONE=milestone:\"November 2020\"\n\n$MINE=assignee:@me",
+ "editable": false
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# Preparation",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Open Pull Requests on the Milestone",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE $MINE is:pr is:open",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Open Issues on the Milestone",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE $MINE is:issue is:open -label:iteration-plan -label:endgame-plan -label:testplan-item",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Feature Requests Missing Labels",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE $MINE is:issue is:closed label:feature-request -label:verification-needed -label:on-testplan -label:verified -label:*duplicate",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Test Plan Items",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE is:issue is:open author:@me label:testplan-item",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Verification Needed",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE $MINE is:issue is:closed label:feature-request label:verification-needed",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# Testing",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Test Plan Items",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE $MINE is:issue is:open label:testplan-item",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Verification Needed",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE -$MINE is:issue is:closed -assignee:@me -label:verified label:feature-request label:verification-needed",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# Fixing",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Open Issues",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE $MINE is:issue is:open",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Open Bugs",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE $MINE is:issue is:open label:bug",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# Verification",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## My Issues (verification-steps-needed)",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE $MINE is:issue is:open label:bug label:verification-steps-needed",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## My Issues (verification-found)",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE $MINE is:issue is:open label:bug label:verification-found",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Issues filed by me",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE -$MINE is:issue is:closed author:@me sort:updated-asc label:bug -label:verified -label:on-testplan -label:*duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "## Issues filed by others",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "$REPOS $MILESTONE -$MINE is:issue is:closed -author:@me sort:updated-asc label:bug -label:verified -label:on-testplan -label:*duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found",
+ "editable": true
+ },
+ {
+ "kind": 1,
+ "language": "markdown",
+ "value": "# Release Notes",
+ "editable": true
+ },
+ {
+ "kind": 2,
+ "language": "github-issues",
+ "value": "repo:microsoft/vscode $MILESTONE is:issue is:closed label:feature-request -label:on-release-notes",
+ "editable": true
+ }
+]
\ No newline at end of file
diff --git a/.vscode/notebooks/my-work.github-issues b/.vscode/notebooks/my-work.github-issues
index a5de65e0bd..55fc585e3e 100644
--- a/.vscode/notebooks/my-work.github-issues
+++ b/.vscode/notebooks/my-work.github-issues
@@ -8,7 +8,7 @@
{
"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\n\n// current milestone name\n$milestone=milestone:\"September 2020\"",
+ "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:\"November 2020\"",
"editable": true
},
{
diff --git a/.vscode/notebooks/verification.github-issues b/.vscode/notebooks/verification.github-issues
index 4e65452ea5..67db0cb97d 100644
--- a/.vscode/notebooks/verification.github-issues
+++ b/.vscode/notebooks/verification.github-issues
@@ -14,7 +14,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "$repos=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-remote-release repo:microsoft/vscode-js-debug repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-github-issue-notebooks \n$milestone=milestone:\"September 2020\"",
+ "value": "$repos=repo:microsoft/vscode repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-remote-release repo:microsoft/vscode-js-debug repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-github-issue-notebooks \n$milestone=milestone:\"October 2020\"",
"editable": true
},
{
@@ -38,7 +38,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "$repos $milestone is:closed -assignee:@me label:bug -label:verified -label:*duplicate -author:@me -assignee:@me label:bug -label:verified -author:@me -author:aeschli -author:alexdima -author:alexr00 -author:bpasero -author:chrisdias -author:chrmarti -author:connor4312 -author:dbaeumer -author:deepak1556 -author:eamodio -author:egamma -author:gregvanl -author:isidorn -author:JacksonKearl -author:joaomoreno -author:jrieken -author:lramos15 -author:lszomoru -author:misolori -author:mjbvz -author:rebornix -author:RMacfarlane -author:roblourens -author:sana-ajani -author:sandy081 -author:sbatten -author:Tyriar -author:weinand",
+ "value": "$repos $milestone is:closed -assignee:@me label:bug -label:verified -label:*duplicate -author:@me -assignee:@me label:bug -label:verified -author:@me -author:aeschli -author:alexdima -author:alexr00 -author:bpasero -author:chrisdias -author:chrmarti -author:connor4312 -author:dbaeumer -author:deepak1556 -author:eamodio -author:egamma -author:gregvanl -author:isidorn -author:JacksonKearl -author:joaomoreno -author:jrieken -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:RMacfarlane -author:roblourens -author:sana-ajani -author:sandy081 -author:sbatten -author:Tyriar -author:weinand",
"editable": false
},
{
diff --git a/.vscode/searches/TrustedTypes.code-search b/.vscode/searches/TrustedTypes.code-search
index 4b61b3e058..85707534c1 100644
--- a/.vscode/searches/TrustedTypes.code-search
+++ b/.vscode/searches/TrustedTypes.code-search
@@ -1,54 +1,37 @@
# Query: .innerHTML =
# Flags: CaseSensitive WordMatch
# Including: src/vs/**/*.{t,j}s
-# Excluding: *.test.ts
+# Excluding: *.test.ts, **/test/**
# ContextLines: 3
-22 results - 14 files
+12 results - 9 files
+
+src/vs/base/browser/dom.ts:
+ 1359 );
+ 1360
+ 1361 const html = _ttpSafeInnerHtml?.createHTML(value, options) ?? insane(value, options);
+ 1362: node.innerHTML = html as unknown as string;
+ 1363 }
src/vs/base/browser/markdownRenderer.ts:
- 161 const strValue = values[0];
- 162 const span = element.querySelector(`div[data-code="${id}"]`);
- 163 if (span) {
- 164: span.innerHTML = strValue;
- 165 }
- 166 }).catch(err => {
- 167 // ignore
+ 272 };
+ 273
+ 274 if (_ttpInsane) {
+ 275: element.innerHTML = _ttpInsane.createHTML(renderedMarkdown, insaneOptions) as unknown as string;
+ 276 } else {
+ 277: element.innerHTML = insane(renderedMarkdown, insaneOptions);
+ 278 }
+ 279
+ 280 // signal that async code blocks can be now be inserted
- 243 return true;
- 244 }
- 245
- 246: element.innerHTML = insane(renderedMarkdown, {
- 247 allowedSchemes,
- 248 // allowedTags should included everything that markdown renders to.
- 249 // Since we have our own sanitize function for marked, it's possible we missed some tag so let insane make sure.
-
-src/vs/base/browser/ui/contextview/contextview.ts:
- 157 this.shadowRootHostElement = DOM.$('.shadow-root-host');
- 158 this.container.appendChild(this.shadowRootHostElement);
- 159 this.shadowRoot = this.shadowRootHostElement.attachShadow({ mode: 'open' });
- 160: this.shadowRoot.innerHTML = `
- 161
-
-src/vs/code/electron-sandbox/issue/issueReporterMain.ts:
- 57 const platformClass = platform.isWindows ? 'windows' : platform.isLinux ? 'linux' : 'mac';
- 58 addClass(document.body, platformClass); // used by our fonts
- 59
- 60: document.body.innerHTML = BaseHtml();
- 61 const issueReporter = new IssueReporter(configuration);
- 62 issueReporter.render();
- 63 document.body.style.display = 'block';
-
-src/vs/code/electron-sandbox/processExplorer/processExplorerMain.ts:
- 320 content.push(`.highest { color: ${styles.highlightForeground}; }`);
- 321 }
- 322
- 323: styleTag.innerHTML = content.join('\n');
- 324 if (document.head) {
- 325 document.head.appendChild(styleTag);
- 326 }
+src/vs/editor/browser/core/markdownRenderer.ts:
+ 88
+ 89 const element = document.createElement('span');
+ 90
+ 91: element.innerHTML = MarkdownRenderer._ttpTokenizer
+ 92 ? MarkdownRenderer._ttpTokenizer.createHTML(value, tokenization) as unknown as string
+ 93 : tokenizeToString(value, tokenization);
+ 94
src/vs/editor/browser/view/domLineBreaksComputer.ts:
107 allCharOffsets[i] = tmp[0];
@@ -60,21 +43,21 @@ src/vs/editor/browser/view/domLineBreaksComputer.ts:
113 containerDomNode.style.top = '10000';
src/vs/editor/browser/view/viewLayer.ts:
- 507 private _finishRenderingNewLines(ctx: IRendererContext, domNodeIsEmpty: boolean, newLinesHTML: string, wasNew: boolean[]): void {
- 508 const lastChild = this.domNode.lastChild;
- 509 if (domNodeIsEmpty || !lastChild) {
- 510: this.domNode.innerHTML = newLinesHTML;
- 511 } else {
- 512 lastChild.insertAdjacentHTML('afterend', newLinesHTML);
- 513 }
+ 512 }
+ 513 const lastChild = this.domNode.lastChild;
+ 514 if (domNodeIsEmpty || !lastChild) {
+ 515: this.domNode.innerHTML = newLinesHTML;
+ 516 } else {
+ 517 lastChild.insertAdjacentHTML('afterend', newLinesHTML);
+ 518 }
- 525 private _finishRenderingInvalidLines(ctx: IRendererContext, invalidLinesHTML: string, wasInvalid: boolean[]): void {
- 526 const hugeDomNode = document.createElement('div');
- 527
- 528: hugeDomNode.innerHTML = invalidLinesHTML;
- 529
- 530 for (let i = 0; i < ctx.linesLength; i++) {
- 531 const line = ctx.lines[i];
+ 533 if (ViewLayerRenderer._ttPolicy) {
+ 534 invalidLinesHTML = ViewLayerRenderer._ttPolicy.createHTML(invalidLinesHTML) as unknown as string;
+ 535 }
+ 536: hugeDomNode.innerHTML = invalidLinesHTML;
+ 537
+ 538 for (let i = 0; i < ctx.linesLength; i++) {
+ 539 const line = ctx.lines[i];
src/vs/editor/browser/widget/diffEditorWidget.ts:
2157
@@ -99,64 +82,14 @@ src/vs/editor/standalone/browser/colorizer.ts:
45 return this.colorize(modeService, text || '', mimeType, options).then(render, (err) => console.error(err));
46 }
-src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts:
- 212 if (!this._globalStyleElement) {
- 213 this._globalStyleElement = dom.createStyleSheet();
- 214 this._globalStyleElement.className = 'monaco-colors';
- 215: this._globalStyleElement.innerHTML = this._css;
- 216 this._styleElements.push(this._globalStyleElement);
- 217 }
- 218 return Disposable.None;
-
- 221 private _registerShadowDomContainer(domNode: HTMLElement): IDisposable {
- 222 const styleElement = dom.createStyleSheet(domNode);
- 223 styleElement.className = 'monaco-colors';
- 224: styleElement.innerHTML = this._css;
- 225 this._styleElements.push(styleElement);
- 226 return {
- 227 dispose: () => {
-
- 291 ruleCollector.addRule(generateTokensCSSForColorMap(colorMap));
- 292
- 293 this._css = cssRules.join('\n');
- 294: this._styleElements.forEach(styleElement => styleElement.innerHTML = this._css);
- 295
- 296 TokenizationRegistry.setColorMap(colorMap);
- 297 this._onColorThemeChange.fire(theme);
-
-src/vs/editor/test/browser/controller/imeTester.ts:
- 55 let content = this._model.getModelLineContent(i);
- 56 r += content + '
';
- 57 }
- 58: output.innerHTML = r;
- 59 }
- 60 }
- 61
-
- 69 let title = document.createElement('div');
- 70 title.className = 'title';
- 71
- 72: title.innerHTML = description + '. Type ' + inputStr + '';
- 73 container.appendChild(title);
- 74
- 75 let startBtn = document.createElement('button');
-
src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts:
- 454
- 455 private getMarkdownDragImage(templateData: MarkdownCellRenderTemplate): HTMLElement {
- 456 const dragImageContainer = DOM.$('.cell-drag-image.monaco-list-row.focused.markdown-cell-row');
- 457: dragImageContainer.innerHTML = templateData.container.outerHTML;
- 458
- 459 // Remove all rendered content nodes after the
- 460 const markdownContent = dragImageContainer.querySelector('.cell.markdown')!;
-
- 611 return null;
- 612 }
- 613
- 614: editorContainer.innerHTML = richEditorText;
- 615
- 616 return dragImageContainer;
- 617 }
+ 580 const element = DOM.$('div', { style });
+ 581
+ 582 const linesHtml = this.getRichTextLinesAsHtml(model, modelRange, colorMap);
+ 583: element.innerHTML = linesHtml as unknown as string;
+ 584 return element;
+ 585 }
+ 586
src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts:
375 addMouseoverListeners(outputNode, outputId);
@@ -165,30 +98,4 @@ src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts:
378: outputNode.innerHTML = content.htmlContent;
379 cellOutputContainer.appendChild(outputNode);
380 domEval(outputNode);
- 381 } else {
-
-src/vs/workbench/contrib/webview/browser/pre/main.js:
- 386 // apply default styles
- 387 const defaultStyles = newDocument.createElement('style');
- 388 defaultStyles.id = '_defaultStyles';
- 389: defaultStyles.innerHTML = defaultCssRules;
- 390 newDocument.head.prepend(defaultStyles);
- 391
- 392 applyStyles(newDocument, newDocument.body);
-
-src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.ts:
- 281
- 282 const content = model.main.textEditorModel.getValue(EndOfLinePreference.LF);
- 283 if (!strings.endsWith(input.resource.path, '.md')) {
- 284: this.content.innerHTML = content;
- 285 this.updateSizeClasses();
- 286 this.decorateContent();
- 287 this.contentDisposables.push(this.keybindingService.onDidUpdateKeybindings(() => this.decorateContent()));
-
- 303 const innerContent = document.createElement('div');
- 304 innerContent.classList.add('walkThroughContent'); // only for markdown files
- 305 const markdown = this.expandMacros(content);
- 306: innerContent.innerHTML = marked(markdown, { renderer });
- 307 this.content.appendChild(innerContent);
- 308
- 309 model.snippets.forEach((snippet, i) => {
+ 381 } else if (preloadErrs.some(e => !!e)) {
diff --git a/.vscode/searches/es6.code-search b/.vscode/searches/es6.code-search
deleted file mode 100644
index 1e1bdd9418..0000000000
--- a/.vscode/searches/es6.code-search
+++ /dev/null
@@ -1,61 +0,0 @@
-# Query: @deprecated ES6
-# Flags: CaseSensitive WordMatch
-# ContextLines: 2
-
-12 results - 4 files
-
-src/vs/base/browser/dom.ts:
- 83 };
- 84
- 85: /** @deprecated ES6 - use classList*/
- 86 export const hasClass: (node: HTMLElement | SVGElement, className: string) => boolean = _classList.hasClass.bind(_classList);
- 87: /** @deprecated ES6 - use classList*/
- 88 export const addClass: (node: HTMLElement | SVGElement, className: string) => void = _classList.addClass.bind(_classList);
- 89: /** @deprecated ES6 - use classList*/
- 90 export const addClasses: (node: HTMLElement | SVGElement, ...classNames: string[]) => void = _classList.addClasses.bind(_classList);
- 91: /** @deprecated ES6 - use classList*/
- 92 export const removeClass: (node: HTMLElement | SVGElement, className: string) => void = _classList.removeClass.bind(_classList);
- 93: /** @deprecated ES6 - use classList*/
- 94 export const removeClasses: (node: HTMLElement | SVGElement, ...classNames: string[]) => void = _classList.removeClasses.bind(_classList);
- 95: /** @deprecated ES6 - use classList*/
- 96 export const toggleClass: (node: HTMLElement | SVGElement, className: string, shouldHaveIt?: boolean) => void = _classList.toggleClass.bind(_classList);
- 97
-
-src/vs/base/common/arrays.ts:
- 401
- 402 /**
- 403: * @deprecated ES6: use `Array.find`
- 404 */
- 405 export function first(array: ReadonlyArray, fn: (item: T) => boolean, notFoundValue: T): T;
-
-src/vs/base/common/objects.ts:
- 115
- 116 /**
- 117: * @deprecated ES6
- 118 */
- 119 export function assign(destination: T): T;
-
-src/vs/base/common/strings.ts:
- 15
- 16 /**
- 17: * @deprecated ES6: use `String.padStart`
- 18 */
- 19 export function pad(n: number, l: number, char: string = '0'): string {
-
- 146
- 147 /**
- 148: * @deprecated ES6: use `String.startsWith`
- 149 */
- 150 export function startsWith(haystack: string, needle: string): boolean {
-
- 167
- 168 /**
- 169: * @deprecated ES6: use `String.endsWith`
- 170 */
- 171 export function endsWith(haystack: string, needle: string): boolean {
-
- 857
- 858 /**
- 859: * @deprecated ES6
- 860 */
- 861 export function repeat(s: string, count: number): string {
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 9239eae0d4..45e111dd2b 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -73,6 +73,9 @@
},
"gulp.autoDetect": "off",
"files.insertFinalNewline": true,
+ "[plaintext]": {
+ "files.insertFinalNewline": false,
+ },
"[typescript]": {
"editor.defaultFormatter": "vscode.typescript-language-features"
},
diff --git a/.yarnrc b/.yarnrc
index fbf612d098..264a5e3a3d 100644
--- a/.yarnrc
+++ b/.yarnrc
@@ -1,3 +1,3 @@
-disturl "https://atom.io/download/electron"
-target "9.3.0"
+disturl "https://electronjs.org/headers"
+target "9.3.5"
runtime "electron"
diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt
index 5a653ac61e..6c416410ce 100644
--- a/ThirdPartyNotices.txt
+++ b/ThirdPartyNotices.txt
@@ -1526,30 +1526,6 @@ END OF primeng NOTICES AND INFORMATION
%% process-nextick-args NOTICES AND INFORMATION BEGIN HERE
=========================================
-# Copyright (c) 2015 Calvin Metcalf
-
-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 process-nextick-args NOTICES AND INFORMATION
-
-%% pty.js NOTICES AND INFORMATION BEGIN HERE
-=========================================
Copyright (c) 2012-2015, Christopher Jeffrey (https://github.com/chjj/)
Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/build/.gitattributes b/build/.gitattributes
index fcadb2cf97..d2690a8f26 100644
--- a/build/.gitattributes
+++ b/build/.gitattributes
@@ -1 +1,3 @@
* text eol=lf
+*.exe binary
+*.dll binary
diff --git a/build/.nativeignore b/build/.moduleignore
similarity index 100%
rename from build/.nativeignore
rename to build/.moduleignore
diff --git a/build/.webignore b/build/.webignore
index 1035cb291c..553d445f3f 100644
--- a/build/.webignore
+++ b/build/.webignore
@@ -8,6 +8,10 @@
**/LICENSE
**/CONTRIBUTORS
+**/docs/**
+**/example/**
+**/examples/**
+
jschardet/index.js
jschardet/src/**
jschardet/dist/jschardet.js
diff --git a/build/azure-pipelines/common/copyArtifacts.ts b/build/azure-pipelines/common/copyArtifacts.ts
index 95da6374e0..ae66c0c26a 100644
--- a/build/azure-pipelines/common/copyArtifacts.ts
+++ b/build/azure-pipelines/common/copyArtifacts.ts
@@ -24,7 +24,7 @@ const files = [
];
async function main() {
- return new Promise((resolve, reject) => {
+ return new Promise((resolve, reject) => {
const stream = vfs.src(files, { base: '.build', allowEmpty: true })
.pipe(es.through(file => {
const filePath = path.join(process.env.BUILD_ARTIFACTSTAGINGDIRECTORY!,
diff --git a/build/azure-pipelines/common/publish.ts b/build/azure-pipelines/common/publish.ts
index eda52041cc..d5508f0b1f 100644
--- a/build/azure-pipelines/common/publish.ts
+++ b/build/azure-pipelines/common/publish.ts
@@ -128,7 +128,7 @@ function createOrUpdate(commit: string, quality: string, platform: string, type:
}
async function assertContainer(blobService: azure.BlobService, quality: string): Promise {
- await new Promise((c, e) => blobService.createContainerIfNotExists(quality, { publicAccessLevel: 'blob' }, err => err ? e(err) : c()));
+ await new Promise((c, e) => blobService.createContainerIfNotExists(quality, { publicAccessLevel: 'blob' }, err => err ? e(err) : c()));
}
async function doesAssetExist(blobService: azure.BlobService, quality: string, blobName: string): Promise {
@@ -144,7 +144,7 @@ async function uploadBlob(blobService: azure.BlobService, quality: string, blobN
}
};
- await new Promise((c, e) => blobService.createBlockBlobFromLocalFile(quality, blobName, file, blobOptions, err => err ? e(err) : c()));
+ await new Promise((c, e) => blobService.createBlockBlobFromLocalFile(quality, blobName, file, blobOptions, err => err ? e(err) : c()));
}
interface PublishOptions {
diff --git a/build/azure-pipelines/darwin/continuous-build-darwin.yml b/build/azure-pipelines/darwin/continuous-build-darwin.yml
index 748eb3223f..bf7cf874fd 100644
--- a/build/azure-pipelines/darwin/continuous-build-darwin.yml
+++ b/build/azure-pipelines/darwin/continuous-build-darwin.yml
@@ -1,7 +1,7 @@
steps:
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3 # {{SQL CARBON EDIT}} update version
inputs:
@@ -14,10 +14,10 @@ steps:
targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
vstsFeed: 'npm-cache' # {{SQL CARBON EDIT}} update build cache
-- script: |
- CHILD_CONCURRENCY=1 yarn --frozen-lockfile
- displayName: Install Dependencies
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ - script: |
+ CHILD_CONCURRENCY=1 yarn --frozen-lockfile
+ displayName: Install Dependencies
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
displayName: Save Cache - Node Modules # {{SQL CARBON EDIT}}
@@ -35,21 +35,21 @@ steps:
# yarn monaco-compile-check
# displayName: Run Monaco Editor Checks
-- script: |
- yarn valid-layers-check
- displayName: Run Valid Layers Checks
+ - script: |
+ yarn valid-layers-check
+ displayName: Run Valid Layers Checks
-- script: |
- yarn compile
- displayName: Compile Sources
+ - script: |
+ yarn compile
+ displayName: Compile Sources
# - script: | {{SQL CARBON EDIT}} remove step
# yarn download-builtin-extensions
# displayName: Download Built-in Extensions
-- script: |
- ./scripts/test.sh --tfs "Unit Tests"
- displayName: Run Unit Tests (Electron)
+ - script: |
+ ./scripts/test.sh --tfs "Unit Tests"
+ displayName: Run Unit Tests (Electron)
# - script: | {{SQL CARBON EDIT}} disable
# yarn test-browser --browser chromium --browser webkit --browser firefox --tfs "Browser Unit Tests"
@@ -59,17 +59,17 @@ steps:
# ./scripts/test-integration.sh --tfs "Integration Tests"
# displayName: Run Integration Tests (Electron)
-- task: PublishPipelineArtifact@0
- inputs:
- artifactName: crash-dump-macos
- targetPath: .build/crashes
- displayName: 'Publish Crash Reports'
- continueOnError: true
- condition: failed()
+ - task: PublishPipelineArtifact@0
+ inputs:
+ artifactName: crash-dump-macos
+ targetPath: .build/crashes
+ displayName: "Publish Crash Reports"
+ continueOnError: true
+ condition: failed()
-- task: PublishTestResults@2
- displayName: Publish Tests Results
- inputs:
- testResultsFiles: '*-results.xml'
- searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
- condition: succeededOrFailed()
+ - task: PublishTestResults@2
+ displayName: Publish Tests Results
+ inputs:
+ testResultsFiles: "*-results.xml"
+ searchFolder: "$(Build.ArtifactStagingDirectory)/test-results"
+ condition: succeededOrFailed()
diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml
index d5e684890e..6f7dec16ac 100644
--- a/build/azure-pipelines/darwin/product-build-darwin.yml
+++ b/build/azure-pipelines/darwin/product-build-darwin.yml
@@ -1,265 +1,337 @@
steps:
-- script: |
- mkdir -p .build
- echo -n $BUILD_SOURCEVERSION > .build/commit
- echo -n $VSCODE_QUALITY > .build/quality
- displayName: Prepare cache flag
+ - script: |
+ mkdir -p .build
+ echo -n $BUILD_SOURCEVERSION > .build/commit
+ echo -n $VSCODE_QUALITY > .build/quality
+ echo -n $ENABLE_TERRAPIN > .build/terrapin
+ displayName: Prepare compilation cache flags
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: 'build/.cachesalt, .build/commit, .build/quality'
- targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
- vstsFeed: 'npm-vscode'
- platformIndependent: true
- alias: 'Compilation'
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ inputs:
+ keyfile: "build/.cachesalt, .build/commit, .build/quality, .build/terrapin"
+ targetfolder: ".build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min"
+ vstsFeed: "npm-vscode"
+ platformIndependent: true
+ alias: "Compilation"
-- script: |
- set -e
- exit 1
- displayName: Check RestoreCache
- condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
+ - script: |
+ set -e
+ exit 1
+ displayName: Check RestoreCache
+ condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
-- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
- inputs:
- versionSpec: "1.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
+ - task: AzureKeyVault@1
+ displayName: "Azure Key Vault: Get Secrets"
+ inputs:
+ azureSubscription: "vscode-builds-subscription"
+ KeyVaultName: vscode
-- script: |
- set -e
+ - script: |
+ set -e
- cat << EOF > ~/.netrc
- machine github.com
- login vscode
- password $(github-distro-mixin-password)
- EOF
+ cat << EOF > ~/.netrc
+ machine github.com
+ login vscode
+ password $(github-distro-mixin-password)
+ EOF
- git config user.email "vscode@microsoft.com"
- git config user.name "VSCode"
- displayName: Prepare tooling
+ git config user.email "vscode@microsoft.com"
+ git config user.name "VSCode"
+ displayName: Prepare tooling
-- script: |
- set -e
- git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
- git fetch distro
- git merge $(node -p "require('./package.json').distro")
- displayName: Merge distro
+ - script: |
+ set -e
+ sudo xcode-select -s /Applications/Xcode_12.2.app
+ displayName: Switch to Xcode 12
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'arm64'))
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
- vstsFeed: 'npm-vscode'
+ - script: |
+ set -e
+ git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
+ git fetch distro
+ git merge $(node -p "require('./package.json').distro")
+ displayName: Merge distro
-- script: |
- set -e
- CHILD_CONCURRENCY=1 yarn --frozen-lockfile
- displayName: Install dependencies
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ - script: |
+ npx https://aka.ms/enablesecurefeed standAlone
+ displayName: Switch to Terrapin packages
+ timeoutInMinutes: 5
+ condition: and(succeeded(), eq(variables['ENABLE_TERRAPIN'], 'true'))
-- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
- inputs:
- keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
- vstsFeed: 'npm-vscode'
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ - script: |
+ echo -n $(VSCODE_ARCH) > .build/arch
+ displayName: Prepare yarn cache flags
-- script: |
- set -e
- yarn postinstall
- displayName: Run postinstall scripts
- condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ inputs:
+ keyfile: ".build/arch, .build/terrapin, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules"
+ vstsFeed: "npm-vscode"
-- script: |
- set -e
- node build/azure-pipelines/mixin
- displayName: Mix in quality
+ - script: |
+ set -e
+ npm install -g node-gyp@7.1.0
+ node-gyp --version
+ displayName: Update node-gyp
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- script: |
- set -e
- VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
- yarn gulp vscode-darwin-min-ci
- displayName: Build
+ - script: |
+ set -e
+ export npm_config_arch=$(VSCODE_ARCH)
+ export npm_config_node_gyp=$(which node-gyp)
+ export SDKROOT=/Applications/Xcode_12.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk
+ export CHILD_CONCURRENCY="1"
-- script: |
- set -e
- ./scripts/test.sh --build --tfs "Unit Tests"
- displayName: Run unit tests (Electron)
- condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ for i in {1..3}; do # try 3 times, for Terrapin
+ yarn --frozen-lockfile && break
+ if [ $i -eq 3 ]; then
+ echo "Yarn failed too many times" >&2
+ exit 1
+ fi
+ echo "Yarn failed $i, trying again..."
+ done
+ displayName: Install dependencies
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- script: |
- set -e
- yarn test-browser --build --browser chromium --browser webkit --browser firefox --tfs "Browser Unit Tests"
- displayName: Run unit tests (Browser)
- condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
+ inputs:
+ keyfile: ".build/arch, .build/terrapin, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules"
+ vstsFeed: "npm-vscode"
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- script: |
- # Figure out the full absolute path of the product we just built
- # including the remote server and configure the integration tests
- # to run with these builds instead of running out of sources.
- set -e
- APP_ROOT=$(agent.builddirectory)/VSCode-darwin
- APP_NAME="`ls $APP_ROOT | head -n 1`"
- INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME/Contents/MacOS/Electron" \
- VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-darwin" \
- ./scripts/test-integration.sh --build --tfs "Integration Tests"
- displayName: Run integration tests (Electron)
- condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - script: |
+ set -e
+ export npm_config_arch=$(VSCODE_ARCH)
+ export npm_config_node_gyp=$(which node-gyp)
+ export SDKROOT=/Applications/Xcode_12.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk
+ ls /Applications/Xcode_12.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
+ yarn postinstall
+ displayName: Run postinstall scripts
+ condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
-- script: |
- set -e
- VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-web-darwin" \
- ./resources/server/test/test-web-integration.sh --browser webkit
- displayName: Run integration tests (Browser)
- condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - script: |
+ set -e
+ export npm_config_arch=$(VSCODE_ARCH)
+ export npm_config_node_gyp=$(which node-gyp)
+ export npm_config_build_from_source=true
+ export SDKROOT=/Applications/Xcode_12.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.0.sdk
+ ls /Applications/Xcode_12.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
+ yarn electron-rebuild
+ cd ./node_modules/keytar
+ node-gyp rebuild
+ displayName: Rebuild native modules for ARM64
+ condition: eq(variables['VSCODE_ARCH'], 'arm64')
-- script: |
- set -e
- APP_ROOT=$(agent.builddirectory)/VSCode-darwin
- APP_NAME="`ls $APP_ROOT | head -n 1`"
- INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME/Contents/MacOS/Electron" \
- VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-darwin" \
- ./resources/server/test/test-remote-integration.sh
- displayName: Run remote integration tests (Electron)
- condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - script: |
+ set -e
+ node build/azure-pipelines/mixin
+ displayName: Mix in quality
-- script: |
- set -e
- APP_ROOT=$(agent.builddirectory)/VSCode-darwin
- APP_NAME="`ls $APP_ROOT | head -n 1`"
- yarn smoketest --build "$APP_ROOT/$APP_NAME"
- continueOnError: true
- displayName: Run smoke tests (Electron)
- condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - script: |
+ set -e
+ VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
+ yarn gulp vscode-darwin-$(VSCODE_ARCH)-min-ci
+ displayName: Build
-- script: |
- set -e
- VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-web-darwin" \
- yarn smoketest --web --headless
- continueOnError: true
- displayName: Run smoke tests (Browser)
- condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - script: |
+ set -e
+ VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
+ yarn gulp vscode-reh-darwin-min-ci
+ VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
+ yarn gulp vscode-reh-web-darwin-min-ci
+ displayName: Build reh
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'))
-- task: PublishPipelineArtifact@0
- inputs:
- artifactName: crash-dump-macos
- targetPath: .build/crashes
- displayName: 'Publish Crash Reports'
- continueOnError: true
- condition: failed()
+ - script: |
+ set -e
+ yarn electron $(VSCODE_ARCH)
+ displayName: Download Electron
+ condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- task: PublishTestResults@2
- displayName: Publish Tests Results
- inputs:
- testResultsFiles: '*-results.xml'
- searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
- condition: succeededOrFailed()
+ - script: |
+ set -e
+ security create-keychain -p pwd $(agent.tempdirectory)/buildagent.keychain
+ security default-keychain -s $(agent.tempdirectory)/buildagent.keychain
+ security unlock-keychain -p pwd $(agent.tempdirectory)/buildagent.keychain
+ echo "$(macos-developer-certificate)" | base64 -D > $(agent.tempdirectory)/cert.p12
+ security import $(agent.tempdirectory)/cert.p12 -k $(agent.tempdirectory)/buildagent.keychain -P "$(macos-developer-certificate-key)" -T /usr/bin/codesign
+ security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k pwd $(agent.tempdirectory)/buildagent.keychain
+ VSCODE_ARCH="$(VSCODE_ARCH)" DEBUG=electron-osx-sign* node build/darwin/sign.js
+ displayName: Set Hardened Entitlements
-- script: |
- set -e
- security create-keychain -p pwd $(agent.tempdirectory)/buildagent.keychain
- security default-keychain -s $(agent.tempdirectory)/buildagent.keychain
- security unlock-keychain -p pwd $(agent.tempdirectory)/buildagent.keychain
- echo "$(macos-developer-certificate)" | base64 -D > $(agent.tempdirectory)/cert.p12
- security import $(agent.tempdirectory)/cert.p12 -k $(agent.tempdirectory)/buildagent.keychain -P "$(macos-developer-certificate-key)" -T /usr/bin/codesign
- security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k pwd $(agent.tempdirectory)/buildagent.keychain
- DEBUG=electron-osx-sign* node build/darwin/sign.js
- displayName: Set Hardened Entitlements
+ - script: |
+ set -e
+ ./scripts/test.sh --build --tfs "Unit Tests"
+ displayName: Run unit tests (Electron)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- script: |
- set -e
- pushd $(agent.builddirectory)/VSCode-darwin && zip -r -X -y $(agent.builddirectory)/VSCode-darwin.zip * && popd
- displayName: Archive build
+ - script: |
+ set -e
+ yarn test-browser --build --browser chromium --browser webkit --browser firefox --tfs "Browser Unit Tests"
+ displayName: Run unit tests (Browser)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
- inputs:
- ConnectedServiceName: 'ESRP CodeSign'
- FolderPath: '$(agent.builddirectory)'
- Pattern: 'VSCode-darwin.zip'
- signConfigType: inlineSignParams
- inlineOperation: |
- [
- {
- "keyCode": "CP-401337-Apple",
- "operationSetCode": "MacAppDeveloperSign",
- "parameters": [
- {
- "parameterName": "Hardening",
- "parameterValue": "--options=runtime"
- }
- ],
- "toolName": "sign",
- "toolVersion": "1.0"
- }
- ]
- SessionTimeout: 60
- displayName: Codesign
+ - script: |
+ # Figure out the full absolute path of the product we just built
+ # including the remote server and configure the integration tests
+ # to run with these builds instead of running out of sources.
+ set -e
+ APP_ROOT=$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)
+ APP_NAME="`ls $APP_ROOT | head -n 1`"
+ INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME/Contents/MacOS/Electron" \
+ VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-darwin" \
+ ./scripts/test-integration.sh --build --tfs "Integration Tests"
+ displayName: Run integration tests (Electron)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- script: |
- zip -d $(agent.builddirectory)/VSCode-darwin.zip "*.pkg"
- displayName: Clean Archive
+ - script: |
+ set -e
+ VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-web-darwin" \
+ ./resources/server/test/test-web-integration.sh --browser webkit
+ displayName: Run integration tests (Browser)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- script: |
- APP_ROOT=$(agent.builddirectory)/VSCode-darwin
- APP_NAME="`ls $APP_ROOT | head -n 1`"
- BUNDLE_IDENTIFIER=$(node -p "require(\"$APP_ROOT/$APP_NAME/Contents/Resources/app/product.json\").darwinBundleIdentifier")
- echo "##vso[task.setvariable variable=BundleIdentifier]$BUNDLE_IDENTIFIER"
- displayName: Export bundle identifier
+ - script: |
+ set -e
+ APP_ROOT=$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)
+ APP_NAME="`ls $APP_ROOT | head -n 1`"
+ INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME/Contents/MacOS/Electron" \
+ VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-darwin" \
+ ./resources/server/test/test-remote-integration.sh
+ displayName: Run remote integration tests (Electron)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
- inputs:
- ConnectedServiceName: 'ESRP CodeSign'
- FolderPath: '$(agent.builddirectory)'
- Pattern: 'VSCode-darwin.zip'
- signConfigType: inlineSignParams
- inlineOperation: |
- [
- {
- "keyCode": "CP-401337-Apple",
- "operationSetCode": "MacAppNotarize",
- "parameters": [
- {
- "parameterName": "BundleId",
- "parameterValue": "$(BundleIdentifier)"
- }
- ],
- "toolName": "sign",
- "toolVersion": "1.0"
- }
- ]
- SessionTimeout: 60
- displayName: Notarization
+ - script: |
+ set -e
+ APP_ROOT=$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)
+ APP_NAME="`ls $APP_ROOT | head -n 1`"
+ yarn smoketest --build "$APP_ROOT/$APP_NAME"
+ continueOnError: true
+ displayName: Run smoke tests (Electron)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- script: |
- set -e
- APP_ROOT=$(agent.builddirectory)/VSCode-darwin
- APP_NAME="`ls $APP_ROOT | head -n 1`"
- "$APP_ROOT/$APP_NAME/Contents/Resources/app/bin/code" --export-default-configuration=.build
- displayName: Verify start after signing (export configuration)
+ - script: |
+ set -e
+ VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-web-darwin" \
+ yarn smoketest --web --headless
+ continueOnError: true
+ displayName: Run smoke tests (Browser)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- 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)" \
- ./build/azure-pipelines/darwin/publish.sh
- displayName: Publish
+ - task: PublishPipelineArtifact@0
+ inputs:
+ artifactName: crash-dump-macos-$(VSCODE_ARCH)
+ targetPath: .build/crashes
+ displayName: "Publish Crash Reports"
+ continueOnError: true
+ condition: failed()
-- script: |
- AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
- yarn gulp upload-vscode-configuration
- displayName: Upload configuration (for Bing settings search)
- continueOnError: true
+ - task: PublishTestResults@2
+ displayName: Publish Tests Results
+ inputs:
+ testResultsFiles: "*-results.xml"
+ searchFolder: "$(Build.ArtifactStagingDirectory)/test-results"
+ condition: succeededOrFailed()
-- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
- displayName: 'Component Detection'
- continueOnError: true
+ - script: |
+ set -e
+ pushd $(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH) && zip -r -X -y $(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH).zip * && popd
+ displayName: Archive build
+
+ - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
+ inputs:
+ ConnectedServiceName: "ESRP CodeSign"
+ FolderPath: "$(agent.builddirectory)"
+ Pattern: "VSCode-darwin-$(VSCODE_ARCH).zip"
+ signConfigType: inlineSignParams
+ inlineOperation: |
+ [
+ {
+ "keyCode": "CP-401337-Apple",
+ "operationSetCode": "MacAppDeveloperSign",
+ "parameters": [
+ {
+ "parameterName": "Hardening",
+ "parameterValue": "--options=runtime"
+ }
+ ],
+ "toolName": "sign",
+ "toolVersion": "1.0"
+ }
+ ]
+ SessionTimeout: 60
+ displayName: Codesign
+
+ - script: |
+ zip -d $(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH).zip "*.pkg"
+ displayName: Clean Archive
+
+ - script: |
+ APP_ROOT=$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)
+ APP_NAME="`ls $APP_ROOT | head -n 1`"
+ BUNDLE_IDENTIFIER=$(node -p "require(\"$APP_ROOT/$APP_NAME/Contents/Resources/app/product.json\").darwinBundleIdentifier")
+ echo "##vso[task.setvariable variable=BundleIdentifier]$BUNDLE_IDENTIFIER"
+ displayName: Export bundle identifier
+
+ - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
+ inputs:
+ ConnectedServiceName: "ESRP CodeSign"
+ FolderPath: "$(agent.builddirectory)"
+ Pattern: "VSCode-darwin-$(VSCODE_ARCH).zip"
+ signConfigType: inlineSignParams
+ inlineOperation: |
+ [
+ {
+ "keyCode": "CP-401337-Apple",
+ "operationSetCode": "MacAppNotarize",
+ "parameters": [
+ {
+ "parameterName": "BundleId",
+ "parameterValue": "$(BundleIdentifier)"
+ }
+ ],
+ "toolName": "sign",
+ "toolVersion": "1.0"
+ }
+ ]
+ SessionTimeout: 60
+ displayName: Notarization
+
+ - script: |
+ set -e
+ APP_ROOT=$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)
+ APP_NAME="`ls $APP_ROOT | head -n 1`"
+ "$APP_ROOT/$APP_NAME/Contents/Resources/app/bin/code" --export-default-configuration=.build
+ displayName: Verify start after signing (export configuration)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'))
+
+ - 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.sh
+ displayName: Publish
+
+ - script: |
+ AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
+ VSCODE_ARCH="$(VSCODE_ARCH)" \
+ yarn gulp upload-vscode-configuration
+ displayName: Upload configuration (for Bing settings search)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'))
+ continueOnError: true
+
+ - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
+ displayName: "Component Detection"
+ continueOnError: true
diff --git a/build/azure-pipelines/darwin/publish.sh b/build/azure-pipelines/darwin/publish.sh
index 07734e194f..c9f5b4bab5 100755
--- a/build/azure-pipelines/darwin/publish.sh
+++ b/build/azure-pipelines/darwin/publish.sh
@@ -1,19 +1,27 @@
#!/usr/bin/env bash
set -e
+# Publish DEB
+case $VSCODE_ARCH in
+ x64) ASSET_ID="darwin" ;;
+ arm64) ASSET_ID="darwin-arm64" ;;
+esac
+
# publish the build
node build/azure-pipelines/common/createAsset.js \
- darwin \
+ "$ASSET_ID" \
archive \
- "VSCode-darwin-$VSCODE_QUALITY.zip" \
- ../VSCode-darwin.zip
+ "VSCode-$ASSET_ID.zip" \
+ ../VSCode-darwin-$VSCODE_ARCH.zip
-# package Remote Extension Host
-pushd .. && mv vscode-reh-darwin vscode-server-darwin && zip -Xry vscode-server-darwin.zip vscode-server-darwin && popd
+if [ "$VSCODE_ARCH" == "x64" ]; then
+ # package Remote Extension Host
+ pushd .. && mv vscode-reh-darwin vscode-server-darwin && zip -Xry vscode-server-darwin.zip vscode-server-darwin && popd
-# publish Remote Extension Host
-node build/azure-pipelines/common/createAsset.js \
- server-darwin \
- archive-unsigned \
- "vscode-server-darwin.zip" \
- ../vscode-server-darwin.zip
+ # publish Remote Extension Host
+ node build/azure-pipelines/common/createAsset.js \
+ server-darwin \
+ archive-unsigned \
+ "vscode-server-darwin.zip" \
+ ../vscode-server-darwin.zip
+fi
diff --git a/build/azure-pipelines/darwin/sql-product-build-darwin.yml b/build/azure-pipelines/darwin/sql-product-build-darwin.yml
index a81be1a0f2..02347fa6d0 100644
--- a/build/azure-pipelines/darwin/sql-product-build-darwin.yml
+++ b/build/azure-pipelines/darwin/sql-product-build-darwin.yml
@@ -98,7 +98,7 @@ steps:
- script: |
set -e
yarn gulp package-rebuild-extensions
- yarn gulp vscode-darwin-min-ci
+ yarn gulp vscode-darwin-x64-min-ci
displayName: Build
env:
VSCODE_MIXIN_PASSWORD: $(github-distro-mixin-password)
@@ -114,7 +114,7 @@ steps:
# including the remote server and configure the integration tests
# to run with these builds instead of running out of sources.
set -e
- APP_ROOT=$(agent.builddirectory)/azuredatastudio-darwin
+ APP_ROOT=$(agent.builddirectory)/azuredatastudio-darwin-x64
APP_NAME="`ls $APP_ROOT | head -n 1`"
INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME/Contents/MacOS/Electron" \
VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/azuredatastudio-reh-darwin" \
@@ -122,14 +122,14 @@ steps:
displayName: Run integration tests (Electron)
condition: and(succeeded(), eq(variables['RUN_TESTS'], 'true'))
- - script: |
- set -e
- APP_ROOT=$(agent.builddirectory)/azuredatastudio-darwin
- APP_NAME="`ls $APP_ROOT | head -n 1`"
- yarn smoketest --build "$APP_ROOT/$APP_NAME" --screenshots "$(build.artifactstagingdirectory)/smokeshots" --log "$(build.artifactstagingdirectory)/logs/darwin/smoke.log"
- displayName: Run smoke tests (Electron)
- continueOnError: true
- condition: and(succeeded(), eq(variables['RUN_TESTS'], 'true'))
+ # - script: |
+ # set -e
+ # APP_ROOT=$(agent.builddirectory)/azuredatastudio-darwin-x64
+ # APP_NAME="`ls $APP_ROOT | head -n 1`"
+ # yarn smoketest --build "$APP_ROOT/$APP_NAME" --screenshots "$(build.artifactstagingdirectory)/smokeshots" --log "$(build.artifactstagingdirectory)/logs/darwin/smoke.log"
+ # displayName: Run smoke tests (Electron)
+ # continueOnError: true
+ # condition: and(succeeded(), eq(variables['RUN_TESTS'], 'true'))
# - script: |
# set -e
@@ -142,7 +142,7 @@ steps:
- script: |
set -e
- pushd ../azuredatastudio-darwin
+ pushd ../azuredatastudio-darwin-x64
ls
echo "Cleaning the application"
@@ -172,7 +172,7 @@ steps:
- script: |
set -e
mkdir -p .build/darwin/archive
- pushd ../azuredatastudio-darwin
+ pushd ../azuredatastudio-darwin-x64
ditto -c -k --keepParent *.app $(Build.SourcesDirectory)/.build/darwin/archive/azuredatastudio-darwin.zip
popd
displayName: 'Archive (no signing)'
@@ -181,7 +181,7 @@ steps:
- script: |
set -e
mkdir -p .build/darwin/archive
- pushd ../azuredatastudio-darwin
+ pushd ../azuredatastudio-darwin-x64
ditto -c -k --keepParent *.app $(Build.SourcesDirectory)/.build/darwin/archive/azuredatastudio-darwin-unsigned.zip
popd
displayName: 'Archive'
diff --git a/build/azure-pipelines/distro-build.yml b/build/azure-pipelines/distro-build.yml
index 9342f3b7c1..cf519bbb03 100644
--- a/build/azure-pipelines/distro-build.yml
+++ b/build/azure-pipelines/distro-build.yml
@@ -9,9 +9,9 @@ pr:
include: ['main', 'release/*']
steps:
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
- task: AzureKeyVault@1
displayName: 'Azure Key Vault: Get Secrets'
@@ -19,8 +19,8 @@ steps:
azureSubscription: 'azuredatastudio-adointegration'
KeyVaultName: ado-secrets
-- script: |
- set -e
+ - script: |
+ set -e
cat << EOF > ~/.netrc
machine github.com
@@ -37,9 +37,9 @@ steps:
# Push main branch into oss/master
git push distro origin/main:refs/heads/oss/master
- # Push every release branch into oss/release
- git for-each-ref --format="%(refname:short)" refs/remotes/origin/release/* | sed 's/^origin\/\(.*\)$/\0:refs\/heads\/oss\/\1/' | xargs git push distro
+ # Push every release branch into oss/release
+ git for-each-ref --format="%(refname:short)" refs/remotes/origin/release/* | sed 's/^origin\/\(.*\)$/\0:refs\/heads\/oss\/\1/' | xargs git push distro
- git merge $(node -p "require('./package.json').distro")
+ git merge $(node -p "require('./package.json').distro")
- displayName: Sync & Merge Distro
+ displayName: Sync & Merge Distro
diff --git a/build/azure-pipelines/exploration-build.yml b/build/azure-pipelines/exploration-build.yml
index 8a61ca4a5e..fb9cecc12e 100644
--- a/build/azure-pipelines/exploration-build.yml
+++ b/build/azure-pipelines/exploration-build.yml
@@ -1,40 +1,40 @@
pool:
- vmImage: 'Ubuntu-16.04'
+ vmImage: "Ubuntu-16.04"
trigger:
branches:
- include: ['main']
+ include: ["main"]
pr:
branches:
- include: ['main']
+ include: ["main"]
steps:
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
-- task: AzureKeyVault@1
- displayName: 'Azure Key Vault: Get Secrets'
- inputs:
- azureSubscription: 'vscode-builds-subscription'
- KeyVaultName: vscode
+ - task: AzureKeyVault@1
+ displayName: "Azure Key Vault: Get Secrets"
+ inputs:
+ azureSubscription: "vscode-builds-subscription"
+ KeyVaultName: vscode
-- script: |
- set -e
+ - script: |
+ set -e
- cat << EOF > ~/.netrc
- machine github.com
- login vscode
- password $(github-distro-mixin-password)
- EOF
+ cat << EOF > ~/.netrc
+ machine github.com
+ login vscode
+ password $(github-distro-mixin-password)
+ EOF
- git config user.email "vscode@microsoft.com"
- git config user.name "VSCode"
+ git config user.email "vscode@microsoft.com"
+ git config user.name "VSCode"
- git checkout origin/electron-11.x.y
- git merge origin/master
+ git checkout origin/electron-11.x.y
+ git merge origin/master
- # Push master branch into exploration branch
- git push origin HEAD:electron-11.x.y
+ # Push master branch into exploration branch
+ git push origin HEAD:electron-11.x.y
- displayName: Sync & Merge Exploration
+ displayName: Sync & Merge Exploration
diff --git a/build/azure-pipelines/linux/alpine/install-dependencies.sh b/build/azure-pipelines/linux/alpine/install-dependencies.sh
new file mode 100755
index 0000000000..1d2a232549
--- /dev/null
+++ b/build/azure-pipelines/linux/alpine/install-dependencies.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+set -e
+
+echo "Installing remote dependencies"
+(cd remote && rm -rf node_modules && yarn)
\ No newline at end of file
diff --git a/build/azure-pipelines/linux/alpine/publish.sh b/build/azure-pipelines/linux/alpine/publish.sh
new file mode 100755
index 0000000000..4bf874c63c
--- /dev/null
+++ b/build/azure-pipelines/linux/alpine/publish.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+set -e
+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)
+
+node build/azure-pipelines/common/createAsset.js "server-$PLATFORM_LINUX" archive-unsigned "$SERVER_TARBALL_FILENAME" "$SERVER_TARBALL_PATH"
+
+# 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-*.tar.*
+(cd $ROOT && mv $LEGACY_SERVER_BUILD_NAME $SERVER_BUILD_NAME && tar --owner=0 --group=0 -czf $SERVER_TARBALL_PATH $SERVER_BUILD_NAME)
+
+node build/azure-pipelines/common/createAsset.js "server-$PLATFORM_LINUX-web" archive-unsigned "$SERVER_TARBALL_FILENAME" "$SERVER_TARBALL_PATH"
diff --git a/build/azure-pipelines/linux/continuous-build-linux.yml b/build/azure-pipelines/linux/continuous-build-linux.yml
index a44965c379..a97dcdc593 100644
--- a/build/azure-pipelines/linux/continuous-build-linux.yml
+++ b/build/azure-pipelines/linux/continuous-build-linux.yml
@@ -1,99 +1,99 @@
steps:
-- script: |
- set -e
- sudo apt-get update
- sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libkrb5-dev #{{SQL CARBON EDIT}} add kerberos dep
- sudo cp build/azure-pipelines/linux/xvfb.init /etc/init.d/xvfb
- sudo chmod +x /etc/init.d/xvfb
- sudo update-rc.d xvfb defaults
- sudo service xvfb start
+ - script: |
+ set -e
+ sudo apt-get update
+ sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libkrb5-dev #{{SQL CARBON EDIT}} add kerberos dep
+ sudo cp build/azure-pipelines/linux/xvfb.init /etc/init.d/xvfb
+ sudo chmod +x /etc/init.d/xvfb
+ sudo update-rc.d xvfb defaults
+ sudo service xvfb start
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
-- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3
- inputs:
- versionSpec: "1.x"
+ - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3
+ inputs:
+ versionSpec: "1.x"
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
displayName: Restore Cache - Node Modules # {{SQL CARBON EDIT}}
- inputs:
- keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
- vstsFeed: 'npm-cache' # {{SQL CARBON EDIT}} update build cache
+ inputs:
+ keyfile: "build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules"
+ vstsFeed: "npm-cache" # {{SQL CARBON EDIT}} update build cache
-- script: |
- CHILD_CONCURRENCY=1 yarn --frozen-lockfile
- displayName: Install Dependencies
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ - script: |
+ CHILD_CONCURRENCY=1 yarn --frozen-lockfile
+ displayName: Install Dependencies
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
displayName: Save Cache - Node Modules # {{SQL CARBON EDIT}}
- inputs:
- keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
- vstsFeed: 'npm-cache' # {{SQL CARBON EDIT}} update build cache
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ inputs:
+ keyfile: "build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules"
+ vstsFeed: "npm-cache" # {{SQL CARBON EDIT}} update build cache
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- script: |
- yarn electron x64
- displayName: Download Electron
+ - script: |
+ yarn electron x64
+ displayName: Download Electron
-- script: |
- yarn gulp hygiene
- displayName: Run Hygiene Checks
+ - script: |
+ yarn gulp hygiene
+ displayName: Run Hygiene Checks
-- script: | # {{SQL CARBON EDIT}} add strict null check
- yarn strict-vscode
- displayName: Run Strict Null Check
+ - script: | # {{SQL CARBON EDIT}} add strict null check
+ yarn strict-vscode
+ displayName: Run Strict Null Check
-# - script: | {{SQL CARBON EDIT}} remove monaco editor checks
-# yarn monaco-compile-check
-# displayName: Run Monaco Editor Checks
+ # - script: | {{SQL CARBON EDIT}} remove monaco editor checks
+ # yarn monaco-compile-check
+ # displayName: Run Monaco Editor Checks
-- script: |
- yarn valid-layers-check
- displayName: Run Valid Layers Checks
+ - script: |
+ yarn valid-layers-check
+ displayName: Run Valid Layers Checks
-- script: |
- yarn compile
- displayName: Compile Sources
+ - script: |
+ yarn compile
+ displayName: Compile Sources
-# - script: | {{SQL CARBON EDIT}} remove step
-# yarn download-builtin-extensions
-# displayName: Download Built-in Extensions
+ # - script: | {{SQL CARBON EDIT}} remove step
+ # yarn download-builtin-extensions
+ # displayName: Download Built-in Extensions
-- script: |
- DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests"
- displayName: Run Unit Tests (Electron)
+ - script: |
+ DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests"
+ displayName: Run Unit Tests (Electron)
-# - script: | {{SQL CARBON EDIT}} disable
-# DISPLAY=:10 yarn test-browser --browser chromium --tfs "Browser Unit Tests"
-# displayName: Run Unit Tests (Browser)
+ # - script: | {{SQL CARBON EDIT}} disable
+ # DISPLAY=:10 yarn test-browser --browser chromium --tfs "Browser Unit Tests"
+ # displayName: Run Unit Tests (Browser)
-# - script: | {{SQL CARBON EDIT}} disable
-# DISPLAY=:10 ./scripts/test-integration.sh --tfs "Integration Tests"
-# displayName: Run Integration Tests (Electron)
+ # - script: | {{SQL CARBON EDIT}} disable
+ # DISPLAY=:10 ./scripts/test-integration.sh --tfs "Integration Tests"
+ # displayName: Run Integration Tests (Electron)
-# - task: PublishPipelineArtifact@0
-# inputs:
-# artifactName: crash-dump-linux
-# targetPath: .build/crashes
-# displayName: 'Publish Crash Reports'
-# condition: succeededOrFailed()
+ # - task: PublishPipelineArtifact@0
+ # inputs:
+ # artifactName: crash-dump-linux
+ # targetPath: .build/crashes
+ # displayName: 'Publish Crash Reports'
+ # condition: succeededOrFailed()
-- task: PublishPipelineArtifact@0
- inputs:
- artifactName: crash-dump-linux
- targetPath: .build/crashes
- displayName: 'Publish Crash Reports'
- continueOnError: true
- condition: failed()
+ - task: PublishPipelineArtifact@0
+ inputs:
+ artifactName: crash-dump-linux
+ targetPath: .build/crashes
+ displayName: "Publish Crash Reports"
+ continueOnError: true
+ condition: failed()
-- task: PublishTestResults@2
- displayName: Publish Tests Results
- inputs:
- testResultsFiles: '*-results.xml'
- searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
- condition: succeededOrFailed()
+ - task: PublishTestResults@2
+ displayName: Publish Tests Results
+ inputs:
+ testResultsFiles: "*-results.xml"
+ searchFolder: "$(Build.ArtifactStagingDirectory)/test-results"
+ condition: succeededOrFailed()
diff --git a/build/azure-pipelines/linux/multiarch/alpine/build.sh b/build/azure-pipelines/linux/multiarch/alpine/build.sh
deleted file mode 100755
index 4f01bc9a7e..0000000000
--- a/build/azure-pipelines/linux/multiarch/alpine/build.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-set -e
-echo 'noop'
\ No newline at end of file
diff --git a/build/azure-pipelines/linux/multiarch/alpine/prebuild.sh b/build/azure-pipelines/linux/multiarch/alpine/prebuild.sh
deleted file mode 100755
index 4f01bc9a7e..0000000000
--- a/build/azure-pipelines/linux/multiarch/alpine/prebuild.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-set -e
-echo 'noop'
\ No newline at end of file
diff --git a/build/azure-pipelines/linux/multiarch/alpine/publish.sh b/build/azure-pipelines/linux/multiarch/alpine/publish.sh
deleted file mode 100755
index 4f01bc9a7e..0000000000
--- a/build/azure-pipelines/linux/multiarch/alpine/publish.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-set -e
-echo 'noop'
\ No newline at end of file
diff --git a/build/azure-pipelines/linux/multiarch/arm64/build.sh b/build/azure-pipelines/linux/multiarch/arm64/build.sh
deleted file mode 100755
index 4f01bc9a7e..0000000000
--- a/build/azure-pipelines/linux/multiarch/arm64/build.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-set -e
-echo 'noop'
\ No newline at end of file
diff --git a/build/azure-pipelines/linux/multiarch/arm64/prebuild.sh b/build/azure-pipelines/linux/multiarch/arm64/prebuild.sh
deleted file mode 100755
index 4f01bc9a7e..0000000000
--- a/build/azure-pipelines/linux/multiarch/arm64/prebuild.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-set -e
-echo 'noop'
\ No newline at end of file
diff --git a/build/azure-pipelines/linux/multiarch/arm64/publish.sh b/build/azure-pipelines/linux/multiarch/arm64/publish.sh
deleted file mode 100755
index 4f01bc9a7e..0000000000
--- a/build/azure-pipelines/linux/multiarch/arm64/publish.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-set -e
-echo 'noop'
\ No newline at end of file
diff --git a/build/azure-pipelines/linux/multiarch/armhf/build.sh b/build/azure-pipelines/linux/multiarch/armhf/build.sh
deleted file mode 100755
index 4f01bc9a7e..0000000000
--- a/build/azure-pipelines/linux/multiarch/armhf/build.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-set -e
-echo 'noop'
\ No newline at end of file
diff --git a/build/azure-pipelines/linux/multiarch/armhf/prebuild.sh b/build/azure-pipelines/linux/multiarch/armhf/prebuild.sh
deleted file mode 100755
index 4f01bc9a7e..0000000000
--- a/build/azure-pipelines/linux/multiarch/armhf/prebuild.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-set -e
-echo 'noop'
\ No newline at end of file
diff --git a/build/azure-pipelines/linux/multiarch/armhf/publish.sh b/build/azure-pipelines/linux/multiarch/armhf/publish.sh
deleted file mode 100755
index 4f01bc9a7e..0000000000
--- a/build/azure-pipelines/linux/multiarch/armhf/publish.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-set -e
-echo 'noop'
\ No newline at end of file
diff --git a/build/azure-pipelines/linux/product-build-alpine.yml b/build/azure-pipelines/linux/product-build-alpine.yml
new file mode 100644
index 0000000000..9a54bc2bc8
--- /dev/null
+++ b/build/azure-pipelines/linux/product-build-alpine.yml
@@ -0,0 +1,135 @@
+steps:
+ - script: |
+ mkdir -p .build
+ echo -n $BUILD_SOURCEVERSION > .build/commit
+ echo -n $VSCODE_QUALITY > .build/quality
+ echo -n $ENABLE_TERRAPIN > .build/terrapin
+ displayName: Prepare compilation cache flags
+
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ inputs:
+ keyfile: "build/.cachesalt, .build/commit, .build/quality, .build/terrapin"
+ targetfolder: ".build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min"
+ vstsFeed: "npm-vscode"
+ platformIndependent: true
+ alias: "Compilation"
+
+ - script: |
+ set -e
+ exit 1
+ displayName: Check RestoreCache
+ condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
+
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
+
+ - 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
+
+ - task: Docker@1
+ displayName: "Pull image"
+ inputs:
+ azureSubscriptionEndpoint: "vscode-builds-subscription"
+ azureContainerRegistry: vscodehub.azurecr.io
+ command: "Run an image"
+ imageName: "vscode-linux-build-agent:alpine"
+ containerCommand: uname
+
+ - script: |
+ set -e
+
+ cat << EOF > ~/.netrc
+ machine github.com
+ login vscode
+ password $(github-distro-mixin-password)
+ EOF
+
+ git config user.email "vscode@microsoft.com"
+ git config user.name "VSCode"
+ displayName: Prepare tooling
+
+ - script: |
+ set -e
+ git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
+ git fetch distro
+ git merge $(node -p "require('./package.json').distro")
+ displayName: Merge distro
+
+ - script: |
+ npx https://aka.ms/enablesecurefeed standAlone
+ displayName: Switch to Terrapin packages
+ timeoutInMinutes: 5
+ condition: and(succeeded(), eq(variables['ENABLE_TERRAPIN'], 'true'))
+
+ - script: |
+ echo -n "alpine" > .build/arch
+ displayName: Prepare yarn cache flags
+
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ inputs:
+ keyfile: ".build/arch, .build/terrapin, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules"
+ vstsFeed: "npm-vscode"
+
+ - script: |
+ set -e
+ export CHILD_CONCURRENCY="1"
+ for i in {1..3}; do # try 3 times, for Terrapin
+ yarn --frozen-lockfile && break
+ if [ $i -eq 3 ]; then
+ echo "Yarn failed too many times" >&2
+ exit 1
+ fi
+ echo "Yarn failed $i, trying again..."
+ done
+ displayName: Install dependencies
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
+ inputs:
+ keyfile: ".build/arch, .build/terrapin, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules"
+ vstsFeed: "npm-vscode"
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+
+ - script: |
+ set -e
+ yarn postinstall
+ displayName: Run postinstall scripts
+ condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
+
+ - script: |
+ set -e
+ node build/azure-pipelines/mixin
+ displayName: Mix in quality
+
+ - script: |
+ set -e
+ docker run -e VSCODE_QUALITY -e CHILD_CONCURRENCY=1 -v $(pwd):/root/vscode -v ~/.netrc:/root/.netrc vscodehub.azurecr.io/vscode-linux-build-agent:alpine /root/vscode/build/azure-pipelines/linux/alpine/install-dependencies.sh
+ displayName: Prebuild
+
+ - script: |
+ set -e
+ yarn gulp vscode-reh-linux-alpine-min-ci
+ yarn gulp vscode-reh-web-linux-alpine-min-ci
+ displayName: Build
+
+ - 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
+
+ - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
+ displayName: "Component Detection"
+ continueOnError: true
diff --git a/build/azure-pipelines/linux/product-build-linux-multiarch.yml b/build/azure-pipelines/linux/product-build-linux-multiarch.yml
deleted file mode 100644
index 258f87ea3d..0000000000
--- a/build/azure-pipelines/linux/product-build-linux-multiarch.yml
+++ /dev/null
@@ -1,115 +0,0 @@
-steps:
-- script: |
- mkdir -p .build
- echo -n $BUILD_SOURCEVERSION > .build/commit
- echo -n $VSCODE_QUALITY > .build/quality
- displayName: Prepare cache flag
-
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: 'build/.cachesalt, .build/commit, .build/quality'
- targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
- vstsFeed: 'npm-vscode'
- platformIndependent: true
- alias: 'Compilation'
-
-- script: |
- set -e
- exit 1
- displayName: Check RestoreCache
- condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
-
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
-
-- 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
-
-- task: Docker@1
- displayName: 'Pull image'
- inputs:
- azureSubscriptionEndpoint: 'vscode-builds-subscription'
- azureContainerRegistry: vscodehub.azurecr.io
- command: 'Run an image'
- imageName: 'vscode-linux-build-agent:$(VSCODE_ARCH)'
- containerCommand: uname
-
-- script: |
- set -e
-
- cat << EOF > ~/.netrc
- machine github.com
- login vscode
- password $(github-distro-mixin-password)
- EOF
-
- git config user.email "vscode@microsoft.com"
- git config user.name "VSCode"
- displayName: Prepare tooling
-
-- script: |
- set -e
- git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
- git fetch distro
- git merge $(node -p "require('./package.json').distro")
- displayName: Merge distro
-
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
- vstsFeed: 'npm-vscode'
-
-- script: |
- set -e
- CHILD_CONCURRENCY=1 yarn --frozen-lockfile
- displayName: Install dependencies
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-
-- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
- inputs:
- keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
- vstsFeed: 'npm-vscode'
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-
-- script: |
- set -e
- yarn postinstall
- displayName: Run postinstall scripts
- condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
-
-- script: |
- set -e
- node build/azure-pipelines/mixin
- displayName: Mix in quality
-
-- script: |
- set -e
- CHILD_CONCURRENCY=1 ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/prebuild.sh
- displayName: Prebuild
-
-- script: |
- set -e
- ./build/azure-pipelines/linux/multiarch/$(VSCODE_ARCH)/build.sh
- displayName: Build
-
-- 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/multiarch/$(VSCODE_ARCH)/publish.sh
- displayName: Publish
-
-- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
- displayName: 'Component Detection'
- continueOnError: true
diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml
index 270beb898a..1e88a0a3b5 100644
--- a/build/azure-pipelines/linux/product-build-linux.yml
+++ b/build/azure-pipelines/linux/product-build-linux.yml
@@ -1,217 +1,231 @@
steps:
-- script: |
- mkdir -p .build
- echo -n $BUILD_SOURCEVERSION > .build/commit
- echo -n $VSCODE_QUALITY > .build/quality
- displayName: Prepare cache flag
+ - script: |
+ mkdir -p .build
+ echo -n $BUILD_SOURCEVERSION > .build/commit
+ echo -n $VSCODE_QUALITY > .build/quality
+ echo -n $ENABLE_TERRAPIN > .build/terrapin
+ displayName: Prepare compilation cache flags
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: 'build/.cachesalt, .build/commit, .build/quality'
- targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
- vstsFeed: 'npm-vscode'
- platformIndependent: true
- alias: 'Compilation'
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ inputs:
+ keyfile: "build/.cachesalt, .build/commit, .build/quality, .build/terrapin"
+ targetfolder: ".build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min"
+ vstsFeed: "npm-vscode"
+ platformIndependent: true
+ alias: "Compilation"
-- script: |
- set -e
- exit 1
- displayName: Check RestoreCache
- condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
+ - script: |
+ set -e
+ exit 1
+ displayName: Check RestoreCache
+ condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
-- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
- inputs:
- versionSpec: "1.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
+ - task: AzureKeyVault@1
+ displayName: "Azure Key Vault: Get Secrets"
+ inputs:
+ azureSubscription: "vscode-builds-subscription"
+ KeyVaultName: vscode
-- script: |
- set -e
- cat << EOF > ~/.netrc
- machine github.com
- login vscode
- password $(github-distro-mixin-password)
- EOF
+ - script: |
+ set -e
+ cat << EOF > ~/.netrc
+ machine github.com
+ login vscode
+ password $(github-distro-mixin-password)
+ EOF
- git config user.email "vscode@microsoft.com"
- git config user.name "VSCode"
- displayName: Prepare tooling
+ git config user.email "vscode@microsoft.com"
+ git config user.name "VSCode"
+ displayName: Prepare tooling
-- script: |
- set -e
- git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
- git fetch distro
- git merge $(node -p "require('./package.json').distro")
- displayName: Merge distro
+ - script: |
+ set -e
+ git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
+ git fetch distro
+ git merge $(node -p "require('./package.json').distro")
+ displayName: Merge distro
-- script: |
- echo -n $VSCODE_ARCH > .build/arch
- displayName: Prepare arch cache flag
+ - script: |
+ npx https://aka.ms/enablesecurefeed standAlone
+ displayName: Switch to Terrapin packages
+ timeoutInMinutes: 5
+ condition: and(succeeded(), eq(variables['ENABLE_TERRAPIN'], 'true'))
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: '.build/arch, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
- vstsFeed: 'npm-vscode'
+ - script: |
+ echo -n $(VSCODE_ARCH) > .build/arch
+ displayName: Prepare yarn cache flags
-- script: |
- set -e
- CHILD_CONCURRENCY=1 npm_config_arch=$(NPM_ARCH) yarn --frozen-lockfile
- displayName: Install dependencies
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ inputs:
+ keyfile: ".build/arch, .build/terrapin, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules"
+ vstsFeed: "npm-vscode"
-- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
- inputs:
- keyfile: '.build/arch, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
- vstsFeed: 'npm-vscode'
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ - script: |
+ set -e
+ export npm_config_arch=$(NPM_ARCH)
+ export CHILD_CONCURRENCY="1"
+ for i in {1..3}; do # try 3 times, for Terrapin
+ yarn --frozen-lockfile && break
+ if [ $i -eq 3 ]; then
+ echo "Yarn failed too many times" >&2
+ exit 1
+ fi
+ echo "Yarn failed $i, trying again..."
+ done
+ displayName: Install dependencies
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- script: |
- set -e
- yarn postinstall
- displayName: Run postinstall scripts
- condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
+ inputs:
+ keyfile: ".build/arch, .build/terrapin, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules"
+ vstsFeed: "npm-vscode"
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- script: |
- set -e
- node build/azure-pipelines/mixin
- displayName: Mix in quality
+ - script: |
+ set -e
+ yarn postinstall
+ displayName: Run postinstall scripts
+ condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
-- script: |
- set -e
- VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
- yarn gulp vscode-linux-$(VSCODE_ARCH)-min-ci
- VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
- yarn gulp vscode-reh-linux-$(VSCODE_ARCH)-min-ci
- VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
- yarn gulp vscode-reh-web-linux-$(VSCODE_ARCH)-min-ci
- displayName: Build
+ - script: |
+ set -e
+ node build/azure-pipelines/mixin
+ displayName: Mix in quality
-- script: |
- set -e
- service xvfb start
- displayName: Start xvfb
- condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - script: |
+ set -e
+ VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
+ yarn gulp vscode-linux-$(VSCODE_ARCH)-min-ci
+ VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
+ yarn gulp vscode-reh-linux-$(VSCODE_ARCH)-min-ci
+ VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
+ yarn gulp vscode-reh-web-linux-$(VSCODE_ARCH)-min-ci
+ displayName: Build
-- script: |
- set -e
- DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests"
- displayName: Run unit tests (Electron)
- condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - script: |
+ set -e
+ service xvfb start
+ displayName: Start xvfb
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- script: |
- set -e
- DISPLAY=:10 yarn test-browser --build --browser chromium --tfs "Browser Unit Tests"
- displayName: Run unit tests (Browser)
- condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - script: |
+ set -e
+ DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests"
+ displayName: Run unit tests (Electron)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- script: |
- # Figure out the full absolute path of the product we just built
- # including the remote server and configure the integration tests
- # to run with these builds instead of running out of sources.
- set -e
- APP_ROOT=$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)
- APP_NAME=$(node -p "require(\"$APP_ROOT/resources/app/product.json\").applicationName")
- INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME" \
- VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-linux-$(VSCODE_ARCH)" \
- DISPLAY=:10 ./scripts/test-integration.sh --build --tfs "Integration Tests"
- displayName: Run integration tests (Electron)
- condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - script: |
+ set -e
+ DISPLAY=:10 yarn test-browser --build --browser chromium --tfs "Browser Unit Tests"
+ displayName: Run unit tests (Browser)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- script: |
- set -e
- VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-web-linux-$(VSCODE_ARCH)" \
- DISPLAY=:10 ./resources/server/test/test-web-integration.sh --browser chromium
- displayName: Run integration tests (Browser)
- condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - script: |
+ # Figure out the full absolute path of the product we just built
+ # including the remote server and configure the integration tests
+ # to run with these builds instead of running out of sources.
+ set -e
+ APP_ROOT=$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)
+ APP_NAME=$(node -p "require(\"$APP_ROOT/resources/app/product.json\").applicationName")
+ INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME" \
+ VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-linux-$(VSCODE_ARCH)" \
+ DISPLAY=:10 ./scripts/test-integration.sh --build --tfs "Integration Tests"
+ displayName: Run integration tests (Electron)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- script: |
- set -e
- APP_ROOT=$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)
- APP_NAME=$(node -p "require(\"$APP_ROOT/resources/app/product.json\").applicationName")
- INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME" \
- VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-linux-$(VSCODE_ARCH)" \
- DISPLAY=:10 ./resources/server/test/test-remote-integration.sh
- displayName: Run remote integration tests (Electron)
- condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - script: |
+ set -e
+ VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-web-linux-$(VSCODE_ARCH)" \
+ DISPLAY=:10 ./resources/server/test/test-web-integration.sh --browser chromium
+ displayName: Run integration tests (Browser)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- task: PublishPipelineArtifact@0
- inputs:
- artifactName: 'crash-dump-linux-$(VSCODE_ARCH)'
- targetPath: .build/crashes
- displayName: 'Publish Crash Reports'
- continueOnError: true
- condition: failed()
+ - script: |
+ set -e
+ APP_ROOT=$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)
+ APP_NAME=$(node -p "require(\"$APP_ROOT/resources/app/product.json\").applicationName")
+ INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME" \
+ VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-reh-linux-$(VSCODE_ARCH)" \
+ DISPLAY=:10 ./resources/server/test/test-remote-integration.sh
+ displayName: Run remote integration tests (Electron)
+ condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- task: PublishTestResults@2
- displayName: Publish Tests Results
- inputs:
- testResultsFiles: '*-results.xml'
- searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
- condition: succeededOrFailed()
+ - task: PublishPipelineArtifact@0
+ inputs:
+ artifactName: "crash-dump-linux-$(VSCODE_ARCH)"
+ targetPath: .build/crashes
+ displayName: "Publish Crash Reports"
+ continueOnError: true
+ condition: failed()
-- script: |
- set -e
- yarn gulp "vscode-linux-$(VSCODE_ARCH)-build-deb"
- yarn gulp "vscode-linux-$(VSCODE_ARCH)-build-rpm"
- displayName: Build deb, rpm packages
+ - task: PublishTestResults@2
+ displayName: Publish Tests Results
+ inputs:
+ testResultsFiles: "*-results.xml"
+ searchFolder: "$(Build.ArtifactStagingDirectory)/test-results"
+ condition: and(succeededOrFailed(), eq(variables['VSCODE_ARCH'], 'x64'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- script: |
- set -e
- yarn gulp "vscode-linux-$(VSCODE_ARCH)-prepare-snap"
- displayName: Prepare snap package
- condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'))
+ - script: |
+ set -e
+ yarn gulp "vscode-linux-$(VSCODE_ARCH)-build-deb"
+ yarn gulp "vscode-linux-$(VSCODE_ARCH)-build-rpm"
+ displayName: Build deb, rpm packages
-# needed for code signing
-- task: UseDotNet@2
- displayName: 'Install .NET Core SDK 2.x'
- inputs:
- version: 2.x
+ - script: |
+ set -e
+ yarn gulp "vscode-linux-$(VSCODE_ARCH)-prepare-snap"
+ displayName: Prepare snap package
-- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
- inputs:
- ConnectedServiceName: 'ESRP CodeSign'
- FolderPath: '.build/linux/rpm'
- Pattern: '*.rpm'
- signConfigType: inlineSignParams
- inlineOperation: |
- [
- {
- "keyCode": "CP-450779-Pgp",
- "operationSetCode": "LinuxSign",
- "parameters": [ ],
- "toolName": "sign",
- "toolVersion": "1.0"
- }
- ]
- SessionTimeout: 120
- displayName: Codesign rpm
+ # needed for code signing
+ - task: UseDotNet@2
+ displayName: "Install .NET Core SDK 2.x"
+ inputs:
+ version: 2.x
-- 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)" \
- VSCODE_ARCH="$(VSCODE_ARCH)" \
- ./build/azure-pipelines/linux/publish.sh
- displayName: Publish
+ - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
+ inputs:
+ ConnectedServiceName: "ESRP CodeSign"
+ FolderPath: ".build/linux/rpm"
+ Pattern: "*.rpm"
+ signConfigType: inlineSignParams
+ inlineOperation: |
+ [
+ {
+ "keyCode": "CP-450779-Pgp",
+ "operationSetCode": "LinuxSign",
+ "parameters": [ ],
+ "toolName": "sign",
+ "toolVersion": "1.0"
+ }
+ ]
+ SessionTimeout: 120
+ displayName: Codesign rpm
-- task: PublishPipelineArtifact@0
- displayName: 'Publish Pipeline Artifact'
- inputs:
- artifactName: 'snap-$(VSCODE_ARCH)'
- targetPath: .build/linux/snap-tarball
- condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'))
+ - 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)" \
+ VSCODE_ARCH="$(VSCODE_ARCH)" \
+ ./build/azure-pipelines/linux/publish.sh
+ displayName: Publish
-- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
- displayName: 'Component Detection'
- continueOnError: true
+ - task: PublishPipelineArtifact@0
+ displayName: "Publish Pipeline Artifact"
+ inputs:
+ artifactName: "snap-$(VSCODE_ARCH)"
+ targetPath: .build/linux/snap-tarball
+
+ - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
+ displayName: "Component Detection"
+ continueOnError: true
diff --git a/build/azure-pipelines/linux/publish.sh b/build/azure-pipelines/linux/publish.sh
index 72fe2ad7b3..e0f1ade30d 100755
--- a/build/azure-pipelines/linux/publish.sh
+++ b/build/azure-pipelines/linux/publish.sh
@@ -52,11 +52,9 @@ RPM_PATH="$REPO/.build/linux/rpm/$RPM_ARCH/$RPM_FILENAME"
node build/azure-pipelines/common/createAsset.js "$PLATFORM_RPM" package "$RPM_FILENAME" "$RPM_PATH"
-if [ "$VSCODE_ARCH" == "x64" ]; then
- # 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)
-fi
+# 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)
diff --git a/build/azure-pipelines/linux/snap-build-linux.yml b/build/azure-pipelines/linux/snap-build-linux.yml
index 39c39e86c9..f08c7b3c3e 100644
--- a/build/azure-pipelines/linux/snap-build-linux.yml
+++ b/build/azure-pipelines/linux/snap-build-linux.yml
@@ -1,52 +1,56 @@
steps:
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
-- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
- inputs:
- versionSpec: "1.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
+ - task: AzureKeyVault@1
+ displayName: "Azure Key Vault: Get Secrets"
+ inputs:
+ azureSubscription: "vscode-builds-subscription"
+ KeyVaultName: vscode
-- task: DownloadPipelineArtifact@0
- displayName: 'Download Pipeline Artifact'
- inputs:
- artifactName: snap-x64
- targetPath: .build/linux/snap-tarball
+ - task: DownloadPipelineArtifact@0
+ displayName: "Download Pipeline Artifact"
+ inputs:
+ artifactName: snap-$(VSCODE_ARCH)
+ targetPath: .build/linux/snap-tarball
-- script: |
- set -e
+ - script: |
+ set -e
- # Get snapcraft version
- snapcraft --version
+ # Get snapcraft version
+ snapcraft --version
- # Make sure we get latest packages
- sudo apt-get update
- sudo apt-get upgrade -y
+ # Make sure we get latest packages
+ sudo apt-get update
+ sudo apt-get upgrade -y
- # Define variables
- REPO="$(pwd)"
- SNAP_ROOT="$REPO/.build/linux/snap/x64"
+ # Define variables
+ REPO="$(pwd)"
+ SNAP_ROOT="$REPO/.build/linux/snap/$(VSCODE_ARCH)"
- # Install build dependencies
- (cd build && yarn)
+ # Install build dependencies
+ (cd build && yarn)
- # Unpack snap tarball artifact, in order to preserve file perms
- SNAP_TARBALL_PATH="$REPO/.build/linux/snap-tarball/snap-x64.tar.gz"
- (cd .build/linux && tar -xzf $SNAP_TARBALL_PATH)
+ # Unpack snap tarball artifact, in order to preserve file perms
+ SNAP_TARBALL_PATH="$REPO/.build/linux/snap-tarball/snap-$(VSCODE_ARCH).tar.gz"
+ (cd .build/linux && tar -xzf $SNAP_TARBALL_PATH)
- # Create snap package
- BUILD_VERSION="$(date +%s)"
- SNAP_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.snap"
- SNAP_PATH="$SNAP_ROOT/$SNAP_FILENAME"
- (cd $SNAP_ROOT/code-* && sudo --preserve-env snapcraft snap --output "$SNAP_PATH")
+ # Create snap package
+ BUILD_VERSION="$(date +%s)"
+ SNAP_FILENAME="code-$VSCODE_QUALITY-$(VSCODE_ARCH)-$BUILD_VERSION.snap"
+ SNAP_PATH="$SNAP_ROOT/$SNAP_FILENAME"
+ case $(VSCODE_ARCH) in
+ x64) SNAPCRAFT_TARGET_ARGS="" ;;
+ *) SNAPCRAFT_TARGET_ARGS="--target-arch $(VSCODE_ARCH)" ;;
+ esac
+ (cd $SNAP_ROOT/code-* && sudo --preserve-env snapcraft snap $SNAPCRAFT_TARGET_ARGS --output "$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-x64" package "$SNAP_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"
diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml
index 7d4246f4b3..ebe2fe6abe 100644
--- a/build/azure-pipelines/product-build.yml
+++ b/build/azure-pipelines/product-build.yml
@@ -2,158 +2,201 @@ trigger: none
pr: none
schedules:
-- cron: "0 5 * * Mon-Fri"
- displayName: Mon-Fri at 7:00
- branches:
- include:
- - master
+ - cron: "0 5 * * Mon-Fri"
+ displayName: Mon-Fri at 7:00
+ branches:
+ include:
+ - master
resources:
containers:
- - container: vscode-x64
- image: vscodehub.azurecr.io/vscode-linux-build-agent:x64
- endpoint: VSCodeHub
- - container: vscode-arm64
- image: vscodehub.azurecr.io/vscode-linux-build-agent:stretch-arm64
- endpoint: VSCodeHub
- - container: vscode-armhf
- image: vscodehub.azurecr.io/vscode-linux-build-agent:stretch-armhf
- endpoint: VSCodeHub
- - container: snapcraft
- image: snapcore/snapcraft:stable
+ - container: vscode-x64
+ image: vscodehub.azurecr.io/vscode-linux-build-agent:x64
+ endpoint: VSCodeHub
+ - container: vscode-arm64
+ image: vscodehub.azurecr.io/vscode-linux-build-agent:stretch-arm64
+ endpoint: VSCodeHub
+ - container: vscode-armhf
+ image: vscodehub.azurecr.io/vscode-linux-build-agent:stretch-armhf
+ endpoint: VSCodeHub
+ - container: snapcraft
+ image: snapcore/snapcraft:stable
stages:
-- stage: Compile
- jobs:
- - job: Compile
- pool:
- vmImage: 'Ubuntu-16.04'
- container: vscode-x64
- steps:
- - template: product-compile.yml
+ - stage: Compile
+ jobs:
+ - job: Compile
+ pool:
+ vmImage: "Ubuntu-16.04"
+ container: vscode-x64
+ variables:
+ VSCODE_ARCH: x64
+ steps:
+ - template: product-compile.yml
-- stage: Windows
- dependsOn:
- - Compile
- condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'))
- pool:
- vmImage: VS2017-Win2016
- jobs:
- - job: Windows
- condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true'))
- variables:
- VSCODE_ARCH: x64
- steps:
- - template: win32/product-build-win32.yml
-
- - job: Windows32
- condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true'))
- variables:
- VSCODE_ARCH: ia32
- steps:
- - template: win32/product-build-win32.yml
-
- - job: WindowsARM64
- condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_ARM64'], 'true'))
- variables:
- VSCODE_ARCH: arm64
- steps:
- - template: win32/product-build-win32-arm64.yml
-
-- stage: Linux
- dependsOn:
- - Compile
- condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'))
- pool:
- vmImage: 'Ubuntu-16.04'
- jobs:
- - job: Linux
- condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true'))
- container: vscode-x64
- variables:
- VSCODE_ARCH: x64
- NPM_ARCH: x64
- steps:
- - template: linux/product-build-linux.yml
-
- - job: LinuxSnap
+ - stage: Windows
dependsOn:
- - Linux
- condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true'))
- container: snapcraft
- variables:
- VSCODE_ARCH: x64
- steps:
- - template: linux/snap-build-linux.yml
+ - Compile
+ condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'))
+ pool:
+ vmImage: VS2017-Win2016
+ jobs:
+ - job: Windows
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32'], 'true'))
+ timeoutInMinutes: 90
+ variables:
+ VSCODE_ARCH: x64
+ steps:
+ - template: win32/product-build-win32.yml
- - job: LinuxArmhf
- condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'))
- container: vscode-armhf
- variables:
- VSCODE_ARCH: armhf
- NPM_ARCH: armv7l
- steps:
- - template: linux/product-build-linux.yml
+ - job: Windows32
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true'))
+ timeoutInMinutes: 90
+ variables:
+ VSCODE_ARCH: ia32
+ steps:
+ - template: win32/product-build-win32.yml
- - job: LinuxArm64
- condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARM64'], 'true'))
- container: vscode-arm64
- variables:
- VSCODE_ARCH: arm64
- NPM_ARCH: arm64
- steps:
- - template: linux/product-build-linux.yml
+ - job: WindowsARM64
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_WIN32_ARM64'], 'true'))
+ timeoutInMinutes: 90
+ variables:
+ VSCODE_ARCH: arm64
+ steps:
+ - template: win32/product-build-win32.yml
- - job: LinuxAlpine
- condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'))
- variables:
- VSCODE_ARCH: alpine
- steps:
- - template: linux/product-build-linux-multiarch.yml
+ - stage: Linux
+ dependsOn:
+ - Compile
+ condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'))
+ pool:
+ vmImage: "Ubuntu-16.04"
+ jobs:
+ - job: Linux
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true'))
+ container: vscode-x64
+ variables:
+ VSCODE_ARCH: x64
+ NPM_ARCH: x64
+ steps:
+ - template: linux/product-build-linux.yml
- - job: LinuxWeb
- condition: and(succeeded(), eq(variables['VSCODE_BUILD_WEB'], 'true'))
- variables:
- VSCODE_ARCH: x64
- steps:
- - template: web/product-build-web.yml
+ - job: LinuxSnap
+ dependsOn:
+ - Linux
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX'], 'true'))
+ container: snapcraft
+ variables:
+ VSCODE_ARCH: x64
+ steps:
+ - template: linux/snap-build-linux.yml
-- stage: macOS
- dependsOn:
- - Compile
- condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'))
- pool:
- vmImage: macOS-latest
- jobs:
- - job: macOS
- condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true'))
- steps:
- - template: darwin/product-build-darwin.yml
+ - job: LinuxArmhf
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'))
+ container: vscode-armhf
+ variables:
+ VSCODE_ARCH: armhf
+ NPM_ARCH: armv7l
+ steps:
+ - template: linux/product-build-linux.yml
-- stage: Mooncake
- dependsOn:
- - Windows
- - Linux
- - macOS
- condition: and(succeededOrFailed(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'))
- pool:
- vmImage: 'Ubuntu-16.04'
- jobs:
- - job: SyncMooncake
- displayName: Sync Mooncake
- steps:
- - template: sync-mooncake.yml
+ - job: LinuxSnapArmhf
+ dependsOn:
+ - LinuxArmhf
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARMHF'], 'true'))
+ container: snapcraft
+ variables:
+ VSCODE_ARCH: armhf
+ steps:
+ - template: linux/snap-build-linux.yml
-- stage: Publish
- dependsOn:
- - Windows
- - Linux
- - macOS
- condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule'))))
- pool:
- vmImage: 'Ubuntu-16.04'
- jobs:
- - job: BuildService
- displayName: Build Service
- steps:
- - template: release.yml
+ - job: LinuxArm64
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARM64'], 'true'))
+ container: vscode-arm64
+ variables:
+ VSCODE_ARCH: arm64
+ NPM_ARCH: arm64
+ steps:
+ - template: linux/product-build-linux.yml
+
+ - job: LinuxSnapArm64
+ dependsOn:
+ - LinuxArm64
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ARM64'], 'true'))
+ container: snapcraft
+ variables:
+ VSCODE_ARCH: arm64
+ steps:
+ - template: linux/snap-build-linux.yml
+
+ - job: LinuxAlpine
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_LINUX_ALPINE'], 'true'))
+ steps:
+ - template: linux/product-build-alpine.yml
+
+ - job: LinuxWeb
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_WEB'], 'true'))
+ variables:
+ VSCODE_ARCH: x64
+ steps:
+ - template: web/product-build-web.yml
+
+ - stage: macOS
+ dependsOn:
+ - Compile
+ condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'))
+ pool:
+ vmImage: macOS-latest
+ jobs:
+ - job: macOS
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS'], 'true'))
+ timeoutInMinutes: 90
+ variables:
+ VSCODE_ARCH: x64
+ steps:
+ - template: darwin/product-build-darwin.yml
+
+ - stage: macOSARM64
+ dependsOn:
+ - Compile
+ condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'))
+ pool:
+ vmImage: macOS-latest
+ jobs:
+ - job: macOSARM64
+ condition: and(succeeded(), eq(variables['VSCODE_BUILD_MACOS_ARM64'], 'true'))
+ timeoutInMinutes: 90
+ variables:
+ VSCODE_ARCH: arm64
+ steps:
+ - template: darwin/product-build-darwin.yml
+
+ - stage: Mooncake
+ dependsOn:
+ - Windows
+ - Linux
+ - macOS
+ - macOSARM64
+ condition: and(succeededOrFailed(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'))
+ pool:
+ vmImage: "Ubuntu-16.04"
+ jobs:
+ - job: SyncMooncake
+ displayName: Sync Mooncake
+ steps:
+ - template: sync-mooncake.yml
+
+ - stage: Publish
+ dependsOn:
+ - Windows
+ - Linux
+ - macOS
+ - macOSARM64
+ condition: and(succeeded(), eq(variables['VSCODE_COMPILE_ONLY'], 'false'), or(eq(variables['VSCODE_RELEASE'], 'true'), and(or(eq(variables['VSCODE_QUALITY'], 'insider'), eq(variables['VSCODE_QUALITY'], 'exploration')), eq(variables['Build.Reason'], 'Schedule'))))
+ pool:
+ vmImage: "Ubuntu-16.04"
+ jobs:
+ - job: BuildService
+ displayName: Build Service
+ steps:
+ - template: release.yml
diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml
index f3b54789e5..f606ad716d 100644
--- a/build/azure-pipelines/product-compile.yml
+++ b/build/azure-pipelines/product-compile.yml
@@ -1,146 +1,161 @@
steps:
-- script: |
- mkdir -p .build
- echo -n $BUILD_SOURCEVERSION > .build/commit
- echo -n $VSCODE_QUALITY > .build/quality
- displayName: Prepare cache flag
+ - script: |
+ mkdir -p .build
+ echo -n $BUILD_SOURCEVERSION > .build/commit
+ echo -n $VSCODE_QUALITY > .build/quality
+ echo -n $ENABLE_TERRAPIN > .build/terrapin
+ displayName: Prepare compilation cache flag
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: 'build/.cachesalt, .build/commit, .build/quality'
- targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
- vstsFeed: 'npm-vscode'
- platformIndependent: true
- alias: 'Compilation'
- dryRun: true
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ inputs:
+ keyfile: "build/.cachesalt, .build/commit, .build/quality, .build/terrapin"
+ targetfolder: ".build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min"
+ vstsFeed: "npm-vscode"
+ platformIndependent: true
+ alias: "Compilation"
+ dryRun: true
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
-- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
- inputs:
- versionSpec: "1.x"
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
+ - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
+ inputs:
+ versionSpec: "1.x"
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
-- task: AzureKeyVault@1
- displayName: 'Azure Key Vault: Get Secrets'
- inputs:
- azureSubscription: 'vscode-builds-subscription'
- KeyVaultName: vscode
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
+ - task: AzureKeyVault@1
+ displayName: "Azure Key Vault: Get Secrets"
+ inputs:
+ azureSubscription: "vscode-builds-subscription"
+ KeyVaultName: vscode
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
-- script: |
- set -e
- cat << EOF > ~/.netrc
- machine github.com
- login vscode
- password $(github-distro-mixin-password)
- EOF
+ - script: |
+ set -e
+ cat << EOF > ~/.netrc
+ machine github.com
+ login vscode
+ password $(github-distro-mixin-password)
+ EOF
- git config user.email "vscode@microsoft.com"
- git config user.name "VSCode"
- displayName: Prepare tooling
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
+ git config user.email "vscode@microsoft.com"
+ git config user.name "VSCode"
+ displayName: Prepare tooling
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
-- script: |
- set -e
- git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
- git fetch distro
- git merge $(node -p "require('./package.json').distro")
- displayName: Merge distro
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
+ - script: |
+ set -e
+ git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
+ git fetch distro
+ git merge $(node -p "require('./package.json').distro")
+ displayName: Merge distro
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
-- script: |
- echo -n $VSCODE_ARCH > .build/arch
- displayName: Prepare arch cache flag
+ - script: |
+ npx https://aka.ms/enablesecurefeed standAlone
+ displayName: Switch to Terrapin packages
+ timeoutInMinutes: 5
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), eq(variables['ENABLE_TERRAPIN'], 'true'))
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: '.build/arch, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
- vstsFeed: 'npm-vscode'
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
+ - script: |
+ echo -n $(VSCODE_ARCH) > .build/arch
+ displayName: Prepare yarn cache flags
-- script: |
- set -e
- CHILD_CONCURRENCY=1 yarn --frozen-lockfile
- displayName: Install dependencies
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), ne(variables['CacheRestored'], 'true'))
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ inputs:
+ keyfile: ".build/arch, .build/terrapin, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules"
+ vstsFeed: "npm-vscode"
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
-- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
- inputs:
- keyfile: '.build/arch, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
- vstsFeed: 'npm-vscode'
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), ne(variables['CacheRestored'], 'true'))
+ - script: |
+ set -e
+ export CHILD_CONCURRENCY="1"
+ for i in {1..3}; do # try 3 times, for Terrapin
+ yarn --frozen-lockfile && break
+ if [ $i -eq 3 ]; then
+ echo "Yarn failed too many times" >&2
+ exit 1
+ fi
+ echo "Yarn failed $i, trying again..."
+ done
+ displayName: Install dependencies
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), ne(variables['CacheRestored'], 'true'))
-- script: |
- set -e
- yarn postinstall
- displayName: Run postinstall scripts
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), eq(variables['CacheRestored'], 'true'))
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
+ inputs:
+ keyfile: ".build/arch, .build/terrapin, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules"
+ vstsFeed: "npm-vscode"
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), ne(variables['CacheRestored'], 'true'))
-# Mixin must run before optimize, because the CSS loader will
-# inline small SVGs
-- script: |
- set -e
- node build/azure-pipelines/mixin
- displayName: Mix in quality
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
+ - script: |
+ set -e
+ yarn postinstall
+ displayName: Run postinstall scripts
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), eq(variables['CacheRestored'], 'true'))
-- script: |
- set -e
- yarn gulp hygiene
- yarn monaco-compile-check
- yarn valid-layers-check
- displayName: Run hygiene, monaco compile & valid layers checks
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ # Mixin must run before optimize, because the CSS loader will
+ # inline small SVGs
+ - script: |
+ set -e
+ node build/azure-pipelines/mixin
+ displayName: Mix in quality
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
-- script: |
- set -
- ./build/azure-pipelines/common/extract-telemetry.sh
- displayName: Extract Telemetry
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
+ - script: |
+ set -e
+ yarn gulp hygiene
+ yarn monaco-compile-check
+ yarn valid-layers-check
+ displayName: Run hygiene, monaco compile & valid layers checks
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
-- script: |
- set -e
- AZURE_WEBVIEW_STORAGE_ACCESS_KEY="$(vscode-webview-storage-key)" \
- ./build/azure-pipelines/common/publish-webview.sh
- displayName: Publish Webview
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
+ - script: |
+ set -
+ ./build/azure-pipelines/common/extract-telemetry.sh
+ displayName: Extract Telemetry
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
-- script: |
- set -e
- yarn gulp compile-build
- yarn gulp compile-extensions-build
- yarn gulp minify-vscode
- yarn gulp vscode-reh-linux-x64-min
- yarn gulp vscode-reh-web-linux-x64-min
- displayName: Compile
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
+ - script: |
+ set -e
+ AZURE_WEBVIEW_STORAGE_ACCESS_KEY="$(vscode-webview-storage-key)" \
+ ./build/azure-pipelines/common/publish-webview.sh
+ displayName: Publish Webview
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
-- script: |
- set -e
- AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
- node build/azure-pipelines/upload-sourcemaps
- displayName: Upload sourcemaps
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
+ - script: |
+ set -e
+ yarn gulp compile-build
+ yarn gulp compile-extensions-build
+ yarn gulp minify-vscode
+ yarn gulp vscode-reh-linux-x64-min
+ yarn gulp vscode-reh-web-linux-x64-min
+ displayName: Compile
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
-- 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['CacheExists-Compilation'], 'true'))
+ - script: |
+ set -e
+ AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
+ node build/azure-pipelines/upload-sourcemaps
+ displayName: Upload sourcemaps
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
-- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
- inputs:
- keyfile: 'build/.cachesalt, .build/commit, .build/quality'
- targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
- vstsFeed: 'npm-vscode'
- platformIndependent: true
- alias: 'Compilation'
- condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
+ - 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['CacheExists-Compilation'], 'true'))
+
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
+ inputs:
+ keyfile: "build/.cachesalt, .build/commit, .build/quality, .build/terrapin"
+ targetfolder: ".build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min"
+ vstsFeed: "npm-vscode"
+ platformIndependent: true
+ alias: "Compilation"
+ condition: and(succeeded(), ne(variables['CacheExists-Compilation'], 'true'))
diff --git a/build/azure-pipelines/publish-types/publish-types.yml b/build/azure-pipelines/publish-types/publish-types.yml
index 10b6aa4e16..5f1cf6c28a 100644
--- a/build/azure-pipelines/publish-types/publish-types.yml
+++ b/build/azure-pipelines/publish-types/publish-types.yml
@@ -2,82 +2,82 @@
trigger:
branches:
- include: ['refs/tags/*']
+ include: ["refs/tags/*"]
pr: none
steps:
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
-- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
- inputs:
- versionSpec: "1.x"
+ - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
+ inputs:
+ versionSpec: "1.x"
-- bash: |
- TAG_VERSION=$(git describe --tags `git rev-list --tags --max-count=1`)
- CHANNEL="G1C14HJ2F"
+ - bash: |
+ TAG_VERSION=$(git describe --tags `git rev-list --tags --max-count=1`)
+ CHANNEL="G1C14HJ2F"
- if [ "$TAG_VERSION" == "1.999.0" ]; then
- MESSAGE=". Someone pushed 1.999.0 tag. Please delete it ASAP from remote and local."
+ if [ "$TAG_VERSION" == "1.999.0" ]; then
+ MESSAGE=". Someone pushed 1.999.0 tag. Please delete it ASAP from remote and local."
+
+ curl -X POST -H "Authorization: Bearer $(SLACK_TOKEN)" \
+ -H 'Content-type: application/json; charset=utf-8' \
+ --data '{"channel":"'"$CHANNEL"'", "link_names": true, "text":"'"$MESSAGE"'"}' \
+ https://slack.com/api/chat.postMessage
+
+ exit 1
+ fi
+ displayName: Check 1.999.0 tag
+
+ - bash: |
+ # Install build dependencies
+ (cd build && yarn)
+ node build/azure-pipelines/publish-types/check-version.js
+ displayName: Check version
+
+ - bash: |
+ git config --global user.email "vscode@microsoft.com"
+ git config --global user.name "VSCode"
+
+ git clone https://$(GITHUB_TOKEN)@github.com/DefinitelyTyped/DefinitelyTyped.git --depth=1
+ node build/azure-pipelines/publish-types/update-types.js
+
+ TAG_VERSION=$(git describe --tags `git rev-list --tags --max-count=1`)
+
+ cd DefinitelyTyped
+
+ git diff --color | cat
+ git add -A
+ git status
+ git checkout -b "vscode-types-$TAG_VERSION"
+ git commit -m "VS Code $TAG_VERSION Extension API"
+ git push origin "vscode-types-$TAG_VERSION"
+
+ displayName: Push update to DefinitelyTyped
+
+ - bash: |
+ TAG_VERSION=$(git describe --tags `git rev-list --tags --max-count=1`)
+ CHANNEL="G1C14HJ2F"
+
+ MESSAGE="DefinitelyTyped/DefinitelyTyped#vscode-types-$TAG_VERSION created. Endgame master, please open this link, examine changes and create a PR:"
+ LINK="https://github.com/DefinitelyTyped/DefinitelyTyped/compare/vscode-types-$TAG_VERSION?quick_pull=1&body=Updating%20VS%20Code%20Extension%20API.%20See%20https%3A%2F%2Fgithub.com%2Fmicrosoft%2Fvscode%2Fissues%2F70175%20for%20details."
+ MESSAGE2="[@eamodio, @jrieken, @kmaetzel, @egamma]. Please review and merge PR to publish @types/vscode."
curl -X POST -H "Authorization: Bearer $(SLACK_TOKEN)" \
-H 'Content-type: application/json; charset=utf-8' \
--data '{"channel":"'"$CHANNEL"'", "link_names": true, "text":"'"$MESSAGE"'"}' \
https://slack.com/api/chat.postMessage
- exit 1
- fi
- displayName: Check 1.999.0 tag
+ curl -X POST -H "Authorization: Bearer $(SLACK_TOKEN)" \
+ -H 'Content-type: application/json; charset=utf-8' \
+ --data '{"channel":"'"$CHANNEL"'", "link_names": true, "text":"'"$LINK"'"}' \
+ https://slack.com/api/chat.postMessage
-- bash: |
- # Install build dependencies
- (cd build && yarn)
- node build/azure-pipelines/publish-types/check-version.js
- displayName: Check version
+ curl -X POST -H "Authorization: Bearer $(SLACK_TOKEN)" \
+ -H 'Content-type: application/json; charset=utf-8' \
+ --data '{"channel":"'"$CHANNEL"'", "link_names": true, "text":"'"$MESSAGE2"'"}' \
+ https://slack.com/api/chat.postMessage
-- bash: |
- git config --global user.email "vscode@microsoft.com"
- git config --global user.name "VSCode"
-
- git clone https://$(GITHUB_TOKEN)@github.com/DefinitelyTyped/DefinitelyTyped.git --depth=1
- node build/azure-pipelines/publish-types/update-types.js
-
- TAG_VERSION=$(git describe --tags `git rev-list --tags --max-count=1`)
-
- cd DefinitelyTyped
-
- git diff --color | cat
- git add -A
- git status
- git checkout -b "vscode-types-$TAG_VERSION"
- git commit -m "VS Code $TAG_VERSION Extension API"
- git push origin "vscode-types-$TAG_VERSION"
-
- displayName: Push update to DefinitelyTyped
-
-- bash: |
- TAG_VERSION=$(git describe --tags `git rev-list --tags --max-count=1`)
- CHANNEL="G1C14HJ2F"
-
- MESSAGE="DefinitelyTyped/DefinitelyTyped#vscode-types-$TAG_VERSION created. Endgame master, please open this link, examine changes and create a PR:"
- LINK="https://github.com/DefinitelyTyped/DefinitelyTyped/compare/vscode-types-$TAG_VERSION?quick_pull=1&body=Updating%20VS%20Code%20Extension%20API.%20See%20https%3A%2F%2Fgithub.com%2Fmicrosoft%2Fvscode%2Fissues%2F70175%20for%20details."
- MESSAGE2="[@eamodio, @jrieken, @kmaetzel, @egamma]. Please review and merge PR to publish @types/vscode."
-
- curl -X POST -H "Authorization: Bearer $(SLACK_TOKEN)" \
- -H 'Content-type: application/json; charset=utf-8' \
- --data '{"channel":"'"$CHANNEL"'", "link_names": true, "text":"'"$MESSAGE"'"}' \
- https://slack.com/api/chat.postMessage
-
- curl -X POST -H "Authorization: Bearer $(SLACK_TOKEN)" \
- -H 'Content-type: application/json; charset=utf-8' \
- --data '{"channel":"'"$CHANNEL"'", "link_names": true, "text":"'"$LINK"'"}' \
- https://slack.com/api/chat.postMessage
-
- curl -X POST -H "Authorization: Bearer $(SLACK_TOKEN)" \
- -H 'Content-type: application/json; charset=utf-8' \
- --data '{"channel":"'"$CHANNEL"'", "link_names": true, "text":"'"$MESSAGE2"'"}' \
- https://slack.com/api/chat.postMessage
-
- displayName: Send message on Slack
+ displayName: Send message on Slack
diff --git a/build/azure-pipelines/release.yml b/build/azure-pipelines/release.yml
index f5365b80c7..edd293c04f 100644
--- a/build/azure-pipelines/release.yml
+++ b/build/azure-pipelines/release.yml
@@ -1,22 +1,22 @@
steps:
-- task: NodeTool@0
- inputs:
- versionSpec: "10.x"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "10.x"
-- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
- inputs:
- versionSpec: "1.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
+ - task: AzureKeyVault@1
+ displayName: "Azure Key Vault: Get Secrets"
+ inputs:
+ azureSubscription: "vscode-builds-subscription"
+ KeyVaultName: vscode
-- script: |
- set -e
+ - script: |
+ set -e
- (cd build ; yarn)
+ (cd build ; yarn)
- AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
- node build/azure-pipelines/common/releaseBuild.js
+ AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
+ node build/azure-pipelines/common/releaseBuild.js
diff --git a/build/azure-pipelines/sql-product-build.yml b/build/azure-pipelines/sql-product-build.yml
index 228f8aa7cc..c1436751e4 100644
--- a/build/azure-pipelines/sql-product-build.yml
+++ b/build/azure-pipelines/sql-product-build.yml
@@ -46,7 +46,8 @@ jobs:
steps:
- template: linux/sql-product-build-linux.yml
parameters:
- extensionsToUnitTest: ["admin-tool-ext-win", "agent", "azdata", "azurecore", "cms", "dacpac", "import", "schema-compare", "notebook", "resource-deployment", "machine-learning", "sql-database-projects", "data-workspace"]
+ # extensionsToUnitTest: ["admin-tool-ext-win", "agent", "azdata", "azurecore", "cms", "dacpac", "import", "schema-compare", "notebook", "resource-deployment", "machine-learning", "sql-database-projects", "data-workspace"]
+ extensionsToUnitTest: ["admin-tool-ext-win", "agent", "azdata", "azurecore", "cms", "dacpac", "import", "schema-compare", "resource-deployment", "machine-learning", "sql-database-projects", "data-workspace"]
timeoutInMinutes: 70
- job: LinuxWeb
diff --git a/build/azure-pipelines/sync-mooncake.yml b/build/azure-pipelines/sync-mooncake.yml
index 49dfc9ced8..109709418f 100644
--- a/build/azure-pipelines/sync-mooncake.yml
+++ b/build/azure-pipelines/sync-mooncake.yml
@@ -1,24 +1,24 @@
steps:
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
-- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
- inputs:
- versionSpec: "1.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
+ - task: AzureKeyVault@1
+ displayName: "Azure Key Vault: Get Secrets"
+ inputs:
+ azureSubscription: "vscode-builds-subscription"
+ KeyVaultName: vscode
-- script: |
- set -e
+ - script: |
+ set -e
- (cd build ; yarn)
+ (cd build ; yarn)
- AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
- AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
- MOONCAKE_STORAGE_ACCESS_KEY="$(vscode-mooncake-storage-key)" \
- node build/azure-pipelines/common/sync-mooncake.js "$VSCODE_QUALITY"
+ AZURE_DOCUMENTDB_MASTERKEY="$(builds-docdb-key-readwrite)" \
+ AZURE_STORAGE_ACCESS_KEY_2="$(vscode-storage-key)" \
+ MOONCAKE_STORAGE_ACCESS_KEY="$(vscode-mooncake-storage-key)" \
+ node build/azure-pipelines/common/sync-mooncake.js "$VSCODE_QUALITY"
diff --git a/build/azure-pipelines/upload-cdn.js b/build/azure-pipelines/upload-cdn.js
new file mode 100644
index 0000000000..4f7a51ea9d
--- /dev/null
+++ b/build/azure-pipelines/upload-cdn.js
@@ -0,0 +1,35 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the Source EULA. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+'use strict';
+Object.defineProperty(exports, "__esModule", { value: true });
+const path = require("path");
+const es = require("event-stream");
+const vfs = require("vinyl-fs");
+const util = require("../lib/util");
+const filter = require("gulp-filter");
+const gzip = require("gulp-gzip");
+const azure = require('gulp-azure-storage');
+const root = path.dirname(path.dirname(__dirname));
+const commit = util.getVersion(root);
+function main() {
+ return vfs.src('**', { cwd: '../vscode-web', base: '../vscode-web', dot: true })
+ .pipe(filter(f => !f.isDirectory()))
+ .pipe(gzip({ append: false }))
+ .pipe(es.through(function (data) {
+ console.log('Uploading CDN file:', data.relative); // debug
+ this.emit('data', data);
+ }))
+ .pipe(azure.upload({
+ account: process.env.AZURE_STORAGE_ACCOUNT,
+ key: process.env.AZURE_STORAGE_ACCESS_KEY,
+ container: process.env.VSCODE_QUALITY,
+ prefix: commit + '/',
+ contentSettings: {
+ contentEncoding: 'gzip',
+ cacheControl: 'max-age=31536000, public'
+ }
+ }));
+}
+main();
diff --git a/build/azure-pipelines/upload-cdn.ts b/build/azure-pipelines/upload-cdn.ts
new file mode 100644
index 0000000000..67e5402ac6
--- /dev/null
+++ b/build/azure-pipelines/upload-cdn.ts
@@ -0,0 +1,40 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the Source EULA. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+'use strict';
+
+import * as path from 'path';
+import * as es from 'event-stream';
+import * as Vinyl from 'vinyl';
+import * as vfs from 'vinyl-fs';
+import * as util from '../lib/util';
+import * as filter from 'gulp-filter';
+import * as gzip from 'gulp-gzip';
+const azure = require('gulp-azure-storage');
+
+const root = path.dirname(path.dirname(__dirname));
+const commit = util.getVersion(root);
+
+function main() {
+ return vfs.src('**', { cwd: '../vscode-web', base: '../vscode-web', dot: true })
+ .pipe(filter(f => !f.isDirectory()))
+ .pipe(gzip({ append: false }))
+ .pipe(es.through(function (data: Vinyl) {
+ console.log('Uploading CDN file:', data.relative); // debug
+ this.emit('data', data);
+ }))
+ .pipe(azure.upload({
+ account: process.env.AZURE_STORAGE_ACCOUNT,
+ key: process.env.AZURE_STORAGE_ACCESS_KEY,
+ container: process.env.VSCODE_QUALITY,
+ prefix: commit + '/',
+ contentSettings: {
+ contentEncoding: 'gzip',
+ cacheControl: 'max-age=31536000, public'
+ }
+ }));
+}
+
+main();
diff --git a/build/azure-pipelines/web/product-build-web.yml b/build/azure-pipelines/web/product-build-web.yml
index 7f4907aa2d..33282adbe4 100644
--- a/build/azure-pipelines/web/product-build-web.yml
+++ b/build/azure-pipelines/web/product-build-web.yml
@@ -1,106 +1,132 @@
steps:
-- script: |
- mkdir -p .build
- echo -n $BUILD_SOURCEVERSION > .build/commit
- echo -n $VSCODE_QUALITY > .build/quality
- displayName: Prepare cache flag
+ - script: |
+ mkdir -p .build
+ echo -n $BUILD_SOURCEVERSION > .build/commit
+ echo -n $VSCODE_QUALITY > .build/quality
+ echo -n $ENABLE_TERRAPIN > .build/terrapin
+ displayName: Prepare compilation cache flag
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: 'build/.cachesalt, .build/commit, .build/quality'
- targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
- vstsFeed: 'npm-vscode'
- platformIndependent: true
- alias: 'Compilation'
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ inputs:
+ keyfile: "build/.cachesalt, .build/commit, .build/quality, .build/terrapin"
+ targetfolder: ".build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min"
+ vstsFeed: "npm-vscode"
+ platformIndependent: true
+ alias: "Compilation"
-- script: |
- set -e
- exit 1
- displayName: Check RestoreCache
- condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
+ - script: |
+ set -e
+ exit 1
+ displayName: Check RestoreCache
+ condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
-- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
- inputs:
- versionSpec: "1.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
+ - task: AzureKeyVault@1
+ displayName: "Azure Key Vault: Get Secrets"
+ inputs:
+ azureSubscription: "vscode-builds-subscription"
+ KeyVaultName: vscode
-- script: |
- set -e
- cat << EOF > ~/.netrc
- machine github.com
- login vscode
- password $(github-distro-mixin-password)
- EOF
+ - script: |
+ set -e
+ cat << EOF > ~/.netrc
+ machine github.com
+ login vscode
+ password $(github-distro-mixin-password)
+ EOF
- git config user.email "vscode@microsoft.com"
- git config user.name "VSCode"
- displayName: Prepare tooling
+ git config user.email "vscode@microsoft.com"
+ git config user.name "VSCode"
+ displayName: Prepare tooling
-- script: |
- set -e
- git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
- git fetch distro
- git merge $(node -p "require('./package.json').distro")
- displayName: Merge distro
+ - script: |
+ set -e
+ git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git"
+ git fetch distro
+ git merge $(node -p "require('./package.json').distro")
+ displayName: Merge distro
-# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
-# inputs:
-# keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
-# targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
-# vstsFeed: 'npm-vscode'
+ - script: |
+ npx https://aka.ms/enablesecurefeed standAlone
+ displayName: Switch to Terrapin packages
+ timeoutInMinutes: 5
+ condition: and(succeeded(), eq(variables['ENABLE_TERRAPIN'], 'true'))
-- script: |
- set -e
- CHILD_CONCURRENCY=1 yarn --frozen-lockfile
- displayName: Install dependencies
- # condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ - script: |
+ echo -n "web" > .build/arch
+ displayName: Prepare yarn cache flag
-# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
-# inputs:
-# keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
-# targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
-# vstsFeed: 'npm-vscode'
-# condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ inputs:
+ keyfile: ".build/arch, .build/terrapin, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules"
+ vstsFeed: "npm-vscode"
-# - script: |
-# set -e
-# yarn postinstall
-# displayName: Run postinstall scripts
-# condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
+ - script: |
+ set -e
+ export CHILD_CONCURRENCY="1"
+ for i in {1..3}; do # try 3 times, for Terrapin
+ yarn --frozen-lockfile && break
+ if [ $i -eq 3 ]; then
+ echo "Yarn failed too many times" >&2
+ exit 1
+ fi
+ echo "Yarn failed $i, trying again..."
+ done
+ displayName: Install dependencies
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- script: |
- set -e
- node build/azure-pipelines/mixin
- displayName: Mix in quality
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
+ inputs:
+ keyfile: ".build/arch, .build/terrapin, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules"
+ vstsFeed: "npm-vscode"
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- script: |
- set -e
- VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
- yarn gulp vscode-web-min-ci
- displayName: Build
+ - script: |
+ set -e
+ yarn postinstall
+ displayName: Run postinstall scripts
+ condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
- # upload only the workbench.web.api.js source maps because
- # we just compiled these bits in the previous step and the
- # general task to upload source maps has already been run
-- script: |
- set -e
- AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
- node build/azure-pipelines/upload-sourcemaps out-vscode-web-min out-vscode-web-min/vs/workbench/workbench.web.api.js.map
- displayName: Upload sourcemaps (Web)
+ - script: |
+ set -e
+ node build/azure-pipelines/mixin
+ displayName: Mix in quality
-- 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
+ - script: |
+ set -e
+ VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)" \
+ yarn gulp vscode-web-min-ci
+ displayName: Build
+
+ - script: |
+ set -e
+ AZURE_STORAGE_ACCOUNT="$(web-storage-account)" \
+ AZURE_STORAGE_ACCESS_KEY="$(web-storage-key)" \
+ node build/azure-pipelines/upload-cdn.js
+ displayName: Upload to CDN
+
+ # upload only the workbench.web.api.js source maps because
+ # we just compiled these bits in the previous step and the
+ # general task to upload source maps has already been run
+ - script: |
+ set -e
+ AZURE_STORAGE_ACCESS_KEY="$(ticino-storage-key)" \
+ node build/azure-pipelines/upload-sourcemaps out-vscode-web-min out-vscode-web-min/vs/workbench/workbench.web.api.js.map
+ displayName: Upload sourcemaps (Web)
+
+ - 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
diff --git a/build/azure-pipelines/win32/ESRPClient/NuGet.config b/build/azure-pipelines/win32/ESRPClient/NuGet.config
index a3bf0fa7dd..e44c76a927 100644
--- a/build/azure-pipelines/win32/ESRPClient/NuGet.config
+++ b/build/azure-pipelines/win32/ESRPClient/NuGet.config
@@ -1,7 +1,7 @@
-
+
diff --git a/build/azure-pipelines/win32/ESRPClient/packages.config b/build/azure-pipelines/win32/ESRPClient/packages.config
index c10bed1412..ef586de976 100644
--- a/build/azure-pipelines/win32/ESRPClient/packages.config
+++ b/build/azure-pipelines/win32/ESRPClient/packages.config
@@ -1,4 +1,4 @@
-
+
diff --git a/build/azure-pipelines/win32/continuous-build-win32.yml b/build/azure-pipelines/win32/continuous-build-win32.yml
index 061e0a471f..00e87931ca 100644
--- a/build/azure-pipelines/win32/continuous-build-win32.yml
+++ b/build/azure-pipelines/win32/continuous-build-win32.yml
@@ -1,82 +1,82 @@
steps:
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
-- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3 # {{SQL CARBON EDIT}} update version
- inputs:
- versionSpec: "1.x"
+ - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3 # {{SQL CARBON EDIT}} update version
+ inputs:
+ versionSpec: "1.x"
-- task: UsePythonVersion@0
- inputs:
- versionSpec: '2.x'
- addToPath: true
+ - task: UsePythonVersion@0
+ inputs:
+ versionSpec: "2.x"
+ addToPath: true
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
displayName: Restore Cache - Node Modules # {{SQL CARBON EDIT}}
- inputs:
- keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
- vstsFeed: 'npm-cache' # {{SQL CARBON EDIT}} update build cache
+ inputs:
+ keyfile: "build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules"
+ vstsFeed: "npm-cache" # {{SQL CARBON EDIT}} update build cache
-- powershell: |
- yarn --frozen-lockfile
- env:
- CHILD_CONCURRENCY: "1"
- displayName: Install Dependencies
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ - powershell: |
+ yarn --frozen-lockfile
+ env:
+ CHILD_CONCURRENCY: "1"
+ displayName: Install Dependencies
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
displayName: Save Cache - Node Modules # {{SQL CARBON EDIT}}
- inputs:
- keyfile: 'build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules'
- vstsFeed: 'npm-cache' # {{SQL CARBON EDIT}} update build cache
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ inputs:
+ keyfile: "build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock, !samples/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules, !samples/**/node_modules"
+ vstsFeed: "npm-cache" # {{SQL CARBON EDIT}} update build cache
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- powershell: |
- yarn electron
- displayName: Download Electron
+ - powershell: |
+ yarn electron
+ displayName: Download Electron
-# - powershell: | {{SQL CARBON EDIT}} remove editor check
-# yarn monaco-compile-check
-# displayName: Run Monaco Editor Checks
+ # - powershell: | {{SQL CARBON EDIT}} remove editor check
+ # yarn monaco-compile-check
+ # displayName: Run Monaco Editor Checks
-- script: |
- yarn valid-layers-check
- displayName: Run Valid Layers Checks
+ - script: |
+ yarn valid-layers-check
+ displayName: Run Valid Layers Checks
-- powershell: |
- yarn compile
- displayName: Compile Sources
+ - powershell: |
+ yarn compile
+ displayName: Compile Sources
-# - powershell: | {{SQL CARBON EDIT}} remove step
-# yarn download-builtin-extensions
-# displayName: Download Built-in Extensions
+ # - powershell: | {{SQL CARBON EDIT}} remove step
+ # yarn download-builtin-extensions
+ # displayName: Download Built-in Extensions
-- powershell: |
- .\scripts\test.bat --tfs "Unit Tests"
- displayName: Run Unit Tests (Electron)
+ - powershell: |
+ .\scripts\test.bat --tfs "Unit Tests"
+ displayName: Run Unit Tests (Electron)
-# - powershell: | {{SQL CARBON EDIT}} disable
-# yarn test-browser --browser chromium --browser firefox --tfs "Browser Unit Tests"
-# displayName: Run Unit Tests (Browser)
+ # - powershell: | {{SQL CARBON EDIT}} disable
+ # yarn test-browser --browser chromium --browser firefox --tfs "Browser Unit Tests"
+ # displayName: Run Unit Tests (Browser)
-# - powershell: | {{SQL CARBON EDIT}} disable
-# .\scripts\test-integration.bat --tfs "Integration Tests"
-# displayName: Run Integration Tests (Electron)
+ # - powershell: | {{SQL CARBON EDIT}} disable
+ # .\scripts\test-integration.bat --tfs "Integration Tests"
+ # displayName: Run Integration Tests (Electron)
-- task: PublishPipelineArtifact@0
- displayName: 'Publish Crash Reports'
- inputs:
- artifactName: crash-dump-windows
- targetPath: .build\crashes
- continueOnError: true
- condition: failed()
+ - task: PublishPipelineArtifact@0
+ displayName: "Publish Crash Reports"
+ inputs:
+ artifactName: crash-dump-windows
+ targetPath: .build\crashes
+ continueOnError: true
+ condition: failed()
-- task: PublishTestResults@2
- displayName: Publish Tests Results
- inputs:
- testResultsFiles: '*-results.xml'
- searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
- condition: succeededOrFailed()
+ - task: PublishTestResults@2
+ displayName: Publish Tests Results
+ inputs:
+ testResultsFiles: "*-results.xml"
+ searchFolder: "$(Build.ArtifactStagingDirectory)/test-results"
+ condition: succeededOrFailed()
diff --git a/build/azure-pipelines/win32/import-esrp-auth-cert.ps1 b/build/azure-pipelines/win32/import-esrp-auth-cert.ps1
index c345c78023..f11f878c83 100644
--- a/build/azure-pipelines/win32/import-esrp-auth-cert.ps1
+++ b/build/azure-pipelines/win32/import-esrp-auth-cert.ps1
@@ -1,14 +1,14 @@
-Param(
- [string]$AuthCertificateBase64,
- [string]$AuthCertificateKey
-)
+param ($CertBase64)
+$ErrorActionPreference = "Stop"
-# Import auth certificate
-$AuthCertificateFileName = [System.IO.Path]::GetTempFileName()
-$AuthCertificateBytes = [Convert]::FromBase64String($AuthCertificateBase64)
-[IO.File]::WriteAllBytes($AuthCertificateFileName, $AuthCertificateBytes)
-$AuthCertificate = Import-PfxCertificate -FilePath $AuthCertificateFileName -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString $AuthCertificateKey -AsPlainText -Force)
-rm $AuthCertificateFileName
-$ESRPAuthCertificateSubjectName = $AuthCertificate.Subject
+$CertBytes = [System.Convert]::FromBase64String($CertBase64)
+$CertCollection = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2Collection
+$CertCollection.Import($CertBytes, $null, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
-Write-Output ("##vso[task.setvariable variable=ESRPAuthCertificateSubjectName;]$ESRPAuthCertificateSubjectName")
\ No newline at end of file
+$CertStore = New-Object System.Security.Cryptography.X509Certificates.X509Store("My","LocalMachine")
+$CertStore.Open("ReadWrite")
+$CertStore.AddRange($CertCollection)
+$CertStore.Close()
+
+$ESRPAuthCertificateSubjectName = $CertCollection[0].Subject
+Write-Output ("##vso[task.setvariable variable=ESRPAuthCertificateSubjectName;]$ESRPAuthCertificateSubjectName")
diff --git a/build/azure-pipelines/win32/product-build-win32-arm64.yml b/build/azure-pipelines/win32/product-build-win32-arm64.yml
deleted file mode 100644
index ecb50ad678..0000000000
--- a/build/azure-pipelines/win32/product-build-win32-arm64.yml
+++ /dev/null
@@ -1,190 +0,0 @@
-steps:
-- powershell: |
- mkdir .build -ea 0
- "$env:BUILD_SOURCEVERSION" | Out-File -Encoding ascii -NoNewLine .build\commit
- "$env:VSCODE_QUALITY" | Out-File -Encoding ascii -NoNewLine .build\quality
- displayName: Prepare cache flag
-
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: 'build/.cachesalt, .build/commit, .build/quality'
- targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
- vstsFeed: 'npm-vscode'
- platformIndependent: true
- alias: 'Compilation'
-
-- powershell: |
- $ErrorActionPreference = "Stop"
- exit 1
- displayName: Check RestoreCache
- condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
-
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
-
-- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
- inputs:
- versionSpec: "1.x"
-
-- task: UsePythonVersion@0
- inputs:
- versionSpec: '2.x'
- addToPath: true
-
-- task: AzureKeyVault@1
- displayName: 'Azure Key Vault: Get Secrets'
- inputs:
- azureSubscription: 'vscode-builds-subscription'
- KeyVaultName: vscode
-
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- "machine github.com`nlogin vscode`npassword $(github-distro-mixin-password)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII
-
- exec { git config user.email "vscode@microsoft.com" }
- exec { git config user.name "VSCode" }
-
- mkdir .build -ea 0
- "$(VSCODE_ARCH)" | Out-File -Encoding ascii -NoNewLine .build\arch
- displayName: Prepare tooling
-
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- exec { git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" }
- exec { git fetch distro }
- exec { git merge $(node -p "require('./package.json').distro") }
- displayName: Merge distro
-
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
- vstsFeed: 'npm-vscode'
-
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- $env:npm_config_arch="$(VSCODE_ARCH)"
- $env:CHILD_CONCURRENCY="1"
- exec { yarn --frozen-lockfile }
- displayName: Install dependencies
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-
-- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
- inputs:
- keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
- vstsFeed: 'npm-vscode'
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- exec { yarn postinstall }
- displayName: Run postinstall scripts
- condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
-
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- exec { node build/azure-pipelines/mixin }
- displayName: Mix in quality
-
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)"
- exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min-ci" }
- exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-code-helper" }
- exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-inno-updater" }
- displayName: Build
-
-- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
- inputs:
- ConnectedServiceName: 'ESRP CodeSign'
- FolderPath: '$(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH)'
- Pattern: '*.dll,*.exe,*.node'
- signConfigType: inlineSignParams
- inlineOperation: |
- [
- {
- "keyCode": "CP-230012",
- "operationSetCode": "SigntoolSign",
- "parameters": [
- {
- "parameterName": "OpusName",
- "parameterValue": "VS Code"
- },
- {
- "parameterName": "OpusInfo",
- "parameterValue": "https://code.visualstudio.com/"
- },
- {
- "parameterName": "Append",
- "parameterValue": "/as"
- },
- {
- "parameterName": "FileDigest",
- "parameterValue": "/fd \"SHA256\""
- },
- {
- "parameterName": "PageHash",
- "parameterValue": "/NPH"
- },
- {
- "parameterName": "TimeStamp",
- "parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
- }
- ],
- "toolName": "sign",
- "toolVersion": "1.0"
- },
- {
- "keyCode": "CP-230012",
- "operationSetCode": "SigntoolVerify",
- "parameters": [
- {
- "parameterName": "VerifyAll",
- "parameterValue": "/all"
- }
- ],
- "toolName": "sign",
- "toolVersion": "1.0"
- }
- ]
- SessionTimeout: 120
-
-- task: NuGetCommand@2
- displayName: Install ESRPClient.exe
- inputs:
- restoreSolution: 'build\azure-pipelines\win32\ESRPClient\packages.config'
- feedsToUse: config
- nugetConfigPath: 'build\azure-pipelines\win32\ESRPClient\NuGet.config'
- externalFeedCredentials: 3fc0b7f7-da09-4ae7-a9c8-d69824b1819b
- restoreDirectory: packages
-
-- task: ESRPImportCertTask@1
- displayName: Import ESRP Request Signing Certificate
- inputs:
- ESRP: 'ESRP CodeSign'
-
-- powershell: |
- $ErrorActionPreference = "Stop"
- .\build\azure-pipelines\win32\import-esrp-auth-cert.ps1 -AuthCertificateBase64 $(esrp-auth-certificate) -AuthCertificateKey $(esrp-auth-certificate-key)
- displayName: Import ESRP Auth Certificate
-
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- $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
- displayName: Publish
-
-- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
- displayName: 'Component Detection'
- continueOnError: true
diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml
index be80731a7a..1992ac1aff 100644
--- a/build/azure-pipelines/win32/product-build-win32.yml
+++ b/build/azure-pipelines/win32/product-build-win32.yml
@@ -1,252 +1,272 @@
steps:
-- powershell: |
- mkdir .build -ea 0
- "$env:BUILD_SOURCEVERSION" | Out-File -Encoding ascii -NoNewLine .build\commit
- "$env:VSCODE_QUALITY" | Out-File -Encoding ascii -NoNewLine .build\quality
- displayName: Prepare cache flag
+ - powershell: |
+ mkdir .build -ea 0
+ "$env:BUILD_SOURCEVERSION" | Out-File -Encoding ascii -NoNewLine .build\commit
+ "$env:VSCODE_QUALITY" | Out-File -Encoding ascii -NoNewLine .build\quality
+ "$env:ENABLE_TERRAPIN" | Out-File -Encoding ascii -NoNewLine .build\terrapin
+ displayName: Prepare compilation cache flags
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: 'build/.cachesalt, .build/commit, .build/quality'
- targetfolder: '.build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min'
- vstsFeed: 'npm-vscode'
- platformIndependent: true
- alias: 'Compilation'
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ inputs:
+ keyfile: "build/.cachesalt, .build/commit, .build/quality, .build/terrapin"
+ targetfolder: ".build, out-build, out-vscode-min, out-vscode-reh-min, out-vscode-reh-web-min"
+ vstsFeed: "npm-vscode"
+ platformIndependent: true
+ alias: "Compilation"
-- powershell: |
- $ErrorActionPreference = "Stop"
- exit 1
- displayName: Check RestoreCache
- condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
+ - powershell: |
+ $ErrorActionPreference = "Stop"
+ exit 1
+ displayName: Check RestoreCache
+ condition: and(succeeded(), ne(variables['CacheRestored-Compilation'], 'true'))
-- task: NodeTool@0
- inputs:
- versionSpec: "12.14.1"
+ - task: NodeTool@0
+ inputs:
+ versionSpec: "12.14.1"
-- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
- inputs:
- versionSpec: "1.x"
+ - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
+ inputs:
+ versionSpec: "1.x"
-- task: UsePythonVersion@0
- inputs:
- versionSpec: '2.x'
- addToPath: true
+ - task: UsePythonVersion@0
+ inputs:
+ versionSpec: "2.x"
+ addToPath: true
-- task: AzureKeyVault@1
- displayName: 'Azure Key Vault: Get Secrets'
- inputs:
- azureSubscription: 'vscode-builds-subscription'
- KeyVaultName: vscode
+ - task: AzureKeyVault@1
+ displayName: "Azure Key Vault: Get Secrets"
+ inputs:
+ azureSubscription: "vscode-builds-subscription"
+ KeyVaultName: vscode
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- "machine github.com`nlogin vscode`npassword $(github-distro-mixin-password)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ "machine github.com`nlogin vscode`npassword $(github-distro-mixin-password)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII
- exec { git config user.email "vscode@microsoft.com" }
- exec { git config user.name "VSCode" }
+ exec { git config user.email "vscode@microsoft.com" }
+ exec { git config user.name "VSCode" }
+ displayName: Prepare tooling
- mkdir .build -ea 0
- "$(VSCODE_ARCH)" | Out-File -Encoding ascii -NoNewLine .build\arch
- displayName: Prepare tooling
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ exec { git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" }
+ exec { git fetch distro }
+ exec { git merge $(node -p "require('./package.json').distro") }
+ displayName: Merge distro
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- exec { git remote add distro "https://github.com/$(VSCODE_MIXIN_REPO).git" }
- exec { git fetch distro }
- exec { git merge $(node -p "require('./package.json').distro") }
- displayName: Merge distro
+ - script: |
+ npx https://aka.ms/enablesecurefeed standAlone
+ displayName: Switch to Terrapin packages
+ timeoutInMinutes: 5
+ condition: and(succeeded(), eq(variables['ENABLE_TERRAPIN'], 'true'))
-- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
- inputs:
- keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
- vstsFeed: 'npm-vscode'
+ - powershell: |
+ "$(VSCODE_ARCH)" | Out-File -Encoding ascii -NoNewLine .build\arch
+ displayName: Prepare yarn cache flags
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- $env:npm_config_arch="$(VSCODE_ARCH)"
- $env:CHILD_CONCURRENCY="1"
- exec { yarn --frozen-lockfile }
- displayName: Install dependencies
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1
+ inputs:
+ keyfile: ".build/arch, .build/terrapin, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules"
+ vstsFeed: "npm-vscode"
-- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
- inputs:
- keyfile: 'build/.cachesalt, .build/arch, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock'
- targetfolder: '**/node_modules, !**/node_modules/**/node_modules'
- vstsFeed: 'npm-vscode'
- condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ . build/azure-pipelines/win32/retry.ps1
+ $ErrorActionPreference = "Stop"
+ $env:npm_config_arch="$(VSCODE_ARCH)"
+ $env:CHILD_CONCURRENCY="1"
+ retry { exec { yarn --frozen-lockfile } }
+ displayName: Install dependencies
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- exec { yarn postinstall }
- displayName: Run postinstall scripts
- condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
+ - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1
+ inputs:
+ keyfile: ".build/arch, .build/terrapin, build/.cachesalt, .yarnrc, remote/.yarnrc, **/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock"
+ targetfolder: "**/node_modules, !**/node_modules/**/node_modules"
+ vstsFeed: "npm-vscode"
+ condition: and(succeeded(), ne(variables['CacheRestored'], 'true'))
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- exec { node build/azure-pipelines/mixin }
- displayName: Mix in quality
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ exec { yarn postinstall }
+ displayName: Run postinstall scripts
+ condition: and(succeeded(), eq(variables['CacheRestored'], 'true'))
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)"
- exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-min-ci" }
- exec { yarn gulp "vscode-reh-win32-$env:VSCODE_ARCH-min-ci" }
- exec { yarn gulp "vscode-reh-web-win32-$env:VSCODE_ARCH-min-ci" }
- exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-code-helper" }
- exec { yarn gulp "vscode-win32-$env:VSCODE_ARCH-inno-updater" }
- displayName: Build
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ exec { node build/azure-pipelines/mixin }
+ displayName: Mix in quality
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- exec { yarn electron $(VSCODE_ARCH) }
- exec { .\scripts\test.bat --build --tfs "Unit Tests" }
- displayName: Run unit tests (Electron)
- condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)"
+ exec { yarn gulp "vscode-win32-$(VSCODE_ARCH)-min-ci" }
+ exec { yarn gulp "vscode-win32-$(VSCODE_ARCH)-code-helper" }
+ exec { yarn gulp "vscode-win32-$(VSCODE_ARCH)-inno-updater" }
+ echo "##vso[task.setvariable variable=CodeSigningFolderPath]$(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH)"
+ displayName: Build
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- exec { yarn test-browser --build --browser chromium --browser firefox --tfs "Browser Unit Tests" }
- displayName: Run unit tests (Browser)
- condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ $env:VSCODE_MIXIN_PASSWORD="$(github-distro-mixin-password)"
+ exec { yarn gulp "vscode-reh-win32-$(VSCODE_ARCH)-min-ci" }
+ exec { yarn gulp "vscode-reh-web-win32-$(VSCODE_ARCH)-min-ci" }
+ echo "##vso[task.setvariable variable=CodeSigningFolderPath]$(CodeSigningFolderPath),$(agent.builddirectory)/vscode-reh-win32-$(VSCODE_ARCH)"
+ displayName: Build Server
+ condition: and(succeeded(), ne(variables['VSCODE_ARCH'], 'arm64'))
-- powershell: |
- # Figure out the full absolute path of the product we just built
- # including the remote server and configure the integration tests
- # to run with these builds instead of running out of sources.
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- $AppRoot = "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)"
- $AppProductJson = Get-Content -Raw -Path "$AppRoot\resources\app\product.json" | ConvertFrom-Json
- $AppNameShort = $AppProductJson.nameShort
- exec { $env:INTEGRATION_TEST_ELECTRON_PATH = "$AppRoot\$AppNameShort.exe"; $env:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-win32-$(VSCODE_ARCH)"; .\scripts\test-integration.bat --build --tfs "Integration Tests" }
- displayName: Run integration tests (Electron)
- condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ exec { yarn electron $(VSCODE_ARCH) }
+ exec { .\scripts\test.bat --build --tfs "Unit Tests" }
+ displayName: Run unit tests (Electron)
+ condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64'))
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- exec { $env:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-web-win32-$(VSCODE_ARCH)"; .\resources\server\test\test-web-integration.bat --browser firefox }
- displayName: Run integration tests (Browser)
- condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ exec { yarn test-browser --build --browser chromium --browser firefox --tfs "Browser Unit Tests" }
+ displayName: Run unit tests (Browser)
+ condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64'))
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- $AppRoot = "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)"
- $AppProductJson = Get-Content -Raw -Path "$AppRoot\resources\app\product.json" | ConvertFrom-Json
- $AppNameShort = $AppProductJson.nameShort
- exec { $env:INTEGRATION_TEST_ELECTRON_PATH = "$AppRoot\$AppNameShort.exe"; $env:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-win32-$(VSCODE_ARCH)"; .\resources\server\test\test-remote-integration.bat }
- displayName: Run remote integration tests (Electron)
- condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+ - powershell: |
+ # Figure out the full absolute path of the product we just built
+ # including the remote server and configure the integration tests
+ # to run with these builds instead of running out of sources.
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ $AppRoot = "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)"
+ $AppProductJson = Get-Content -Raw -Path "$AppRoot\resources\app\product.json" | ConvertFrom-Json
+ $AppNameShort = $AppProductJson.nameShort
+ exec { $env:INTEGRATION_TEST_ELECTRON_PATH = "$AppRoot\$AppNameShort.exe"; $env:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-win32-$(VSCODE_ARCH)"; .\scripts\test-integration.bat --build --tfs "Integration Tests" }
+ displayName: Run integration tests (Electron)
+ condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64'))
-- task: PublishPipelineArtifact@0
- inputs:
- artifactName: crash-dump-windows-$(VSCODE_ARCH)
- targetPath: .build\crashes
- displayName: 'Publish Crash Reports'
- continueOnError: true
- condition: failed()
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ exec { $env:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-web-win32-$(VSCODE_ARCH)"; .\resources\server\test\test-web-integration.bat --browser firefox }
+ displayName: Run integration tests (Browser)
+ condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64'))
-- task: PublishTestResults@2
- displayName: Publish Tests Results
- inputs:
- testResultsFiles: '*-results.xml'
- searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
- condition: succeededOrFailed()
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ $AppRoot = "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)"
+ $AppProductJson = Get-Content -Raw -Path "$AppRoot\resources\app\product.json" | ConvertFrom-Json
+ $AppNameShort = $AppProductJson.nameShort
+ exec { $env:INTEGRATION_TEST_ELECTRON_PATH = "$AppRoot\$AppNameShort.exe"; $env:VSCODE_REMOTE_SERVER_PATH = "$(agent.builddirectory)\vscode-reh-win32-$(VSCODE_ARCH)"; .\resources\server\test\test-remote-integration.bat }
+ displayName: Run remote integration tests (Electron)
+ condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'), ne(variables['VSCODE_ARCH'], 'arm64'))
-- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
- inputs:
- ConnectedServiceName: 'ESRP CodeSign'
- FolderPath: '$(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH),$(agent.builddirectory)/vscode-reh-win32-$(VSCODE_ARCH)'
- Pattern: '*.dll,*.exe,*.node'
- signConfigType: inlineSignParams
- inlineOperation: |
- [
- {
- "keyCode": "CP-230012",
- "operationSetCode": "SigntoolSign",
- "parameters": [
- {
- "parameterName": "OpusName",
- "parameterValue": "VS Code"
- },
- {
- "parameterName": "OpusInfo",
- "parameterValue": "https://code.visualstudio.com/"
- },
- {
- "parameterName": "Append",
- "parameterValue": "/as"
- },
- {
- "parameterName": "FileDigest",
- "parameterValue": "/fd \"SHA256\""
- },
- {
- "parameterName": "PageHash",
- "parameterValue": "/NPH"
- },
- {
- "parameterName": "TimeStamp",
- "parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
- }
- ],
- "toolName": "sign",
- "toolVersion": "1.0"
- },
- {
- "keyCode": "CP-230012",
- "operationSetCode": "SigntoolVerify",
- "parameters": [
- {
- "parameterName": "VerifyAll",
- "parameterValue": "/all"
- }
- ],
- "toolName": "sign",
- "toolVersion": "1.0"
- }
- ]
- SessionTimeout: 120
+ - task: PublishPipelineArtifact@0
+ inputs:
+ artifactName: crash-dump-windows-$(VSCODE_ARCH)
+ targetPath: .build\crashes
+ displayName: "Publish Crash Reports"
+ continueOnError: true
+ condition: failed()
-- task: NuGetCommand@2
- displayName: Install ESRPClient.exe
- inputs:
- restoreSolution: 'build\azure-pipelines\win32\ESRPClient\packages.config'
- feedsToUse: config
- nugetConfigPath: 'build\azure-pipelines\win32\ESRPClient\NuGet.config'
- externalFeedCredentials: 'ESRP Nuget'
- restoreDirectory: packages
+ - task: PublishTestResults@2
+ displayName: Publish Tests Results
+ inputs:
+ testResultsFiles: "*-results.xml"
+ searchFolder: "$(Build.ArtifactStagingDirectory)/test-results"
+ condition: and(succeededOrFailed(), ne(variables['VSCODE_ARCH'], 'arm64'))
-- task: ESRPImportCertTask@1
- displayName: Import ESRP Request Signing Certificate
- inputs:
- ESRP: 'ESRP CodeSign'
+ - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
+ inputs:
+ ConnectedServiceName: "ESRP CodeSign"
+ FolderPath: "$(CodeSigningFolderPath)"
+ Pattern: "*.dll,*.exe,*.node"
+ signConfigType: inlineSignParams
+ inlineOperation: |
+ [
+ {
+ "keyCode": "CP-230012",
+ "operationSetCode": "SigntoolSign",
+ "parameters": [
+ {
+ "parameterName": "OpusName",
+ "parameterValue": "VS Code"
+ },
+ {
+ "parameterName": "OpusInfo",
+ "parameterValue": "https://code.visualstudio.com/"
+ },
+ {
+ "parameterName": "Append",
+ "parameterValue": "/as"
+ },
+ {
+ "parameterName": "FileDigest",
+ "parameterValue": "/fd \"SHA256\""
+ },
+ {
+ "parameterName": "PageHash",
+ "parameterValue": "/NPH"
+ },
+ {
+ "parameterName": "TimeStamp",
+ "parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
+ }
+ ],
+ "toolName": "sign",
+ "toolVersion": "1.0"
+ },
+ {
+ "keyCode": "CP-230012",
+ "operationSetCode": "SigntoolVerify",
+ "parameters": [
+ {
+ "parameterName": "VerifyAll",
+ "parameterValue": "/all"
+ }
+ ],
+ "toolName": "sign",
+ "toolVersion": "1.0"
+ }
+ ]
+ SessionTimeout: 120
-- powershell: |
- $ErrorActionPreference = "Stop"
- .\build\azure-pipelines\win32\import-esrp-auth-cert.ps1 -AuthCertificateBase64 $(esrp-auth-certificate) -AuthCertificateKey $(esrp-auth-certificate-key)
- displayName: Import ESRP Auth Certificate
+ - task: NuGetCommand@2
+ displayName: Install ESRPClient.exe
+ inputs:
+ restoreSolution: 'build\azure-pipelines\win32\ESRPClient\packages.config'
+ feedsToUse: config
+ nugetConfigPath: 'build\azure-pipelines\win32\ESRPClient\NuGet.config'
+ externalFeedCredentials: "ESRP Nuget"
+ restoreDirectory: packages
-- powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- $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
- displayName: Publish
+ - task: ESRPImportCertTask@1
+ displayName: Import ESRP Request Signing Certificate
+ inputs:
+ ESRP: "ESRP CodeSign"
-- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
- displayName: 'Component Detection'
- continueOnError: true
+ - task: PowerShell@2
+ inputs:
+ targetType: filePath
+ filePath: .\build\azure-pipelines\win32\import-esrp-auth-cert.ps1
+ arguments: "$(ESRP-SSL-AADAuth)"
+ displayName: Import ESRP Auth Certificate
+
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ $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
+ displayName: Publish
+
+ - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
+ displayName: "Component Detection"
+ continueOnError: true
diff --git a/build/azure-pipelines/win32/retry.ps1 b/build/azure-pipelines/win32/retry.ps1
new file mode 100644
index 0000000000..002a5e274b
--- /dev/null
+++ b/build/azure-pipelines/win32/retry.ps1
@@ -0,0 +1,19 @@
+function Retry
+{
+ [CmdletBinding()]
+ param(
+ [Parameter(Position=0,Mandatory=1)][scriptblock]$cmd
+ )
+ $retry = 0
+
+ while ($retry++ -lt 3) {
+ try {
+ & $cmd
+ return
+ } catch {
+ # noop
+ }
+ }
+
+ throw "Max retries reached"
+}
diff --git a/build/azure-pipelines/win32/sign.ps1 b/build/azure-pipelines/win32/sign.ps1
index 840cbe4071..b73db31207 100644
--- a/build/azure-pipelines/win32/sign.ps1
+++ b/build/azure-pipelines/win32/sign.ps1
@@ -12,6 +12,7 @@ $Auth = Create-TmpJson @{
SubjectName = $env:ESRPAuthCertificateSubjectName
StoreLocation = "LocalMachine"
StoreName = "My"
+ SendX5c = "true"
}
RequestSigningCert = @{
SubjectName = $env:ESRPCertificateSubjectName
@@ -67,4 +68,4 @@ $Input = Create-TmpJson @{
$Output = [System.IO.Path]::GetTempFileName()
$ScriptPath = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
-& "$ScriptPath\ESRPClient\packages\Microsoft.ESRPClient.1.2.25\tools\ESRPClient.exe" Sign -a $Auth -p $Policy -i $Input -o $Output
+& "$ScriptPath\ESRPClient\packages\Microsoft.ESRPClient.*\tools\ESRPClient.exe" Sign -a $Auth -p $Policy -i $Input -o $Output
diff --git a/build/darwin/sign.js b/build/darwin/sign.js
index 7307d01c0e..cd8376f775 100644
--- a/build/darwin/sign.js
+++ b/build/darwin/sign.js
@@ -11,6 +11,7 @@ const product = require("../../product.json");
async function main() {
const buildDir = process.env['AGENT_BUILDDIRECTORY'];
const tempDir = process.env['AGENT_TEMPDIRECTORY'];
+ const arch = process.env['VSCODE_ARCH'];
if (!buildDir) {
throw new Error('$AGENT_BUILDDIRECTORY not set');
}
@@ -18,7 +19,7 @@ async function main() {
throw new Error('$AGENT_TEMPDIRECTORY not set');
}
const baseDir = path.dirname(__dirname);
- const appRoot = path.join(buildDir, 'VSCode-darwin');
+ const appRoot = path.join(buildDir, `VSCode-darwin-${arch}`);
const appName = product.nameLong + '.app';
const appFrameworkPath = path.join(appRoot, appName, 'Contents', 'Frameworks');
const helperAppBaseName = product.nameShort;
diff --git a/build/darwin/sign.ts b/build/darwin/sign.ts
index e299ea5606..b5c5eb7150 100644
--- a/build/darwin/sign.ts
+++ b/build/darwin/sign.ts
@@ -13,6 +13,7 @@ import * as product from '../../product.json';
async function main(): Promise {
const buildDir = process.env['AGENT_BUILDDIRECTORY'];
const tempDir = process.env['AGENT_TEMPDIRECTORY'];
+ const arch = process.env['VSCODE_ARCH'];
if (!buildDir) {
throw new Error('$AGENT_BUILDDIRECTORY not set');
@@ -23,7 +24,7 @@ async function main(): Promise {
}
const baseDir = path.dirname(__dirname);
- const appRoot = path.join(buildDir, 'VSCode-darwin');
+ const appRoot = path.join(buildDir, `VSCode-darwin-${arch}`);
const appName = product.nameLong + '.app';
const appFrameworkPath = path.join(appRoot, appName, 'Contents', 'Frameworks');
const helperAppBaseName = product.nameShort;
diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js
index 7a06e69086..6cf5e1c445 100644
--- a/build/gulpfile.editor.js
+++ b/build/gulpfile.editor.js
@@ -434,7 +434,7 @@ function createTscCompileTask(watch) {
// stdio: [null, 'pipe', 'inherit']
});
let errors = [];
- let reporter = createReporter();
+ let reporter = createReporter('monaco');
let report;
// eslint-disable-next-line no-control-regex
let magic = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; // https://stackoverflow.com/questions/25245716/remove-all-ansi-colors-styles-from-strings
diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js
index 0eed5bebe4..713c2a4299 100644
--- a/build/gulpfile.extensions.js
+++ b/build/gulpfile.extensions.js
@@ -70,7 +70,7 @@ const tasks = compilations.map(function (tsconfigFile) {
}
function createPipeline(build, emitError) {
- const reporter = createReporter();
+ const reporter = createReporter('extensions');
overrideOptions.inlineSources = Boolean(build);
overrideOptions.base = path.dirname(absolutePath);
diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js
index 4bf02af900..d16742c5ea 100644
--- a/build/gulpfile.hygiene.js
+++ b/build/gulpfile.hygiene.js
@@ -3,484 +3,46 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-'use strict';
-
const gulp = require('gulp');
-const filter = require('gulp-filter');
const es = require('event-stream');
-const gulpeslint = require('gulp-eslint');
-const tsfmt = require('typescript-formatter');
-const VinylFile = require('vinyl');
-const vfs = require('vinyl-fs');
const path = require('path');
-const fs = require('fs');
-const pall = require('p-all');
const task = require('./lib/task');
-
-/**
- * Hygiene works by creating cascading subsets of all our files and
- * passing them through a sequence of checks. Here are the current subsets,
- * named according to the checks performed on them. Each subset contains
- * the following one, as described in mathematical notation:
- *
- * all â eol â indentation â copyright â typescript
- */
-
-const all = [
- '*',
- 'build/**/*',
- 'extensions/**/*',
- 'scripts/**/*',
- 'src/**/*',
- 'test/**/*',
- '!test/**/out/**',
- '!**/node_modules/**',
- '!build/actions/**/*.js' // {{ SQL CARBON EDIT }}
-];
-
-const indentationFilter = [
- '**',
-
- // except specific files
- '!**/ThirdPartyNotices.txt',
- '!**/LICENSE.{txt,rtf}',
- '!LICENSES.chromium.html',
- '!**/LICENSE',
- '!src/vs/nls.js',
- '!src/vs/nls.build.js',
- '!src/vs/css.js',
- '!src/vs/css.build.js',
- '!src/vs/loader.js',
- '!src/vs/base/common/insane/insane.js',
- '!src/vs/base/common/marked/marked.js',
- '!src/vs/base/node/terminateProcess.sh',
- '!src/vs/base/node/cpuUsage.sh',
- '!test/unit/assert.js',
-
- // except specific folders
- '!test/automation/out/**',
- '!test/smoke/out/**',
- '!extensions/typescript-language-features/test-workspace/**',
- '!extensions/vscode-api-tests/testWorkspace/**',
- '!extensions/vscode-api-tests/testWorkspace2/**',
- '!build/monaco/**',
- '!build/win32/**',
-
- // except multiple specific files
- '!**/package.json',
- '!**/yarn.lock',
- '!**/yarn-error.log',
-
- // except multiple specific folders
- '!**/codicon/**',
- '!**/fixtures/**',
- '!**/lib/**',
- '!extensions/**/out/**',
- '!extensions/**/snippets/**',
- '!extensions/**/syntaxes/**',
- '!extensions/**/themes/**',
- '!extensions/**/colorize-fixtures/**',
-
- // except specific file types
- '!src/vs/*/**/*.d.ts',
- '!src/typings/**/*.d.ts',
- '!extensions/**/*.d.ts',
- '!**/*.{svg,exe,png,bmp,scpt,bat,cmd,cur,ttf,woff,eot,md,ps1,template,yaml,yml,d.ts.recipe,ico,icns,plist}',
- '!build/{lib,download,darwin}/**/*.js',
- '!build/**/*.sh',
- '!build/azure-pipelines/**/*.js',
- '!build/azure-pipelines/**/*.config',
- '!**/Dockerfile',
- '!**/Dockerfile.*',
- '!**/*.Dockerfile',
- '!**/*.dockerfile',
- '!extensions/markdown-language-features/media/*.js',
- // {{SQL CARBON EDIT}}
- '!**/*.gif',
- '!build/actions/**/*.js',
- '!**/*.{xlf,lcl,docx,sql,vsix,bacpac,ipynb,jpg}',
- '!extensions/mssql/sqltoolsservice/**',
- '!extensions/import/flatfileimportservice/**',
- '!extensions/admin-tool-ext-win/ssmsmin/**',
- '!extensions/resource-deployment/notebooks/**',
- '!extensions/mssql/notebooks/**',
- '!extensions/azurehybridtoolkit/notebooks/**',
- '!extensions/integration-tests/testData/**',
- '!extensions/arc/src/controller/generated/**',
- '!extensions/sql-database-projects/resources/templates/*.xml',
- '!extensions/sql-database-projects/src/test/baselines/*.xml',
- '!extensions/sql-database-projects/src/test/baselines/*.json',
- '!extensions/sql-database-projects/src/test/baselines/*.sqlproj',
- '!extensions/sql-database-projects/BuildDirectory/SystemDacpacs/**',
- '!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts',
- '!extensions/big-data-cluster/src/bigDataCluster/controller/clusterApiGenerated2.ts',
- '!resources/linux/snap/electron-launch'
-];
-
-const copyrightFilter = [
- '**',
- '!**/*.desktop',
- '!**/*.json',
- '!**/*.html',
- '!**/*.template',
- '!**/*.md',
- '!**/*.bat',
- '!**/*.cmd',
- '!**/*.ico',
- '!**/*.icns',
- '!**/*.xml',
- '!**/*.sh',
- '!**/*.txt',
- '!**/*.xpm',
- '!**/*.opts',
- '!**/*.disabled',
- '!**/*.code-workspace',
- '!**/*.js.map',
- '!build/**/*.init',
- '!resources/linux/snap/snapcraft.yaml',
- '!resources/linux/snap/electron-launch',
- '!resources/win32/bin/code.js',
- '!resources/web/code-web.js',
- '!resources/completions/**',
- '!extensions/markdown-language-features/media/highlight.css',
- '!extensions/html-language-features/server/src/modes/typescript/*',
- '!extensions/*/server/bin/*',
- '!src/vs/editor/test/node/classification/typescript-test.ts',
- '!scripts/code-web.js',
- '!resources/serverless/code-web.js',
- '!src/vs/editor/test/node/classification/typescript-test.ts',
- // {{SQL CARBON EDIT}}
- '!extensions/notebook/src/intellisense/text.ts',
- '!extensions/mssql/src/hdfs/webhdfs.ts',
- '!src/sql/workbench/contrib/notebook/browser/outputs/tableRenderers.ts',
- '!src/sql/workbench/contrib/notebook/common/models/url.ts',
- '!src/sql/workbench/services/notebook/browser/outputs/renderMimeInterfaces.ts',
- '!src/sql/workbench/contrib/notebook/browser/models/outputProcessor.ts',
- '!src/sql/workbench/services/notebook/browser/outputs/mimemodel.ts',
- '!src/sql/workbench/contrib/notebook/browser/cellViews/media/*.css',
- '!src/sql/base/browser/ui/table/plugins/rowSelectionModel.plugin.ts',
- '!src/sql/base/browser/ui/table/plugins/rowDetailView.ts',
- '!src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts',
- '!src/sql/base/browser/ui/table/plugins/checkboxSelectColumn.plugin.ts',
- '!src/sql/base/browser/ui/table/plugins/cellSelectionModel.plugin.ts',
- '!src/sql/base/browser/ui/table/plugins/autoSizeColumns.plugin.ts',
- '!src/sql/workbench/services/notebook/browser/outputs/sanitizer.ts',
- '!src/sql/workbench/contrib/notebook/browser/outputs/renderers.ts',
- '!src/sql/workbench/services/notebook/browser/outputs/registry.ts',
- '!src/sql/workbench/services/notebook/browser/outputs/factories.ts',
- '!src/sql/workbench/services/notebook/common/nbformat.ts',
- '!extensions/markdown-language-features/media/tomorrow.css',
- '!src/sql/workbench/browser/modelComponents/media/highlight.css',
- '!src/sql/workbench/contrib/notebook/electron-browser/cellViews/media/highlight.css',
- '!src/sql/workbench/contrib/notebook/browser/turndownPluginGfm.ts',
- '!extensions/mssql/sqltoolsservice/**',
- '!extensions/import/flatfileimportservice/**',
- '!extensions/notebook/src/prompts/**',
- '!extensions/mssql/src/prompts/**',
- '!extensions/kusto/src/prompts/**',
- '!extensions/notebook/resources/jupyter_config/**',
- '!extensions/azurehybridtoolkit/notebooks/**',
- '!extensions/query-history/images/**',
- '!extensions/sql/build/update-grammar.js',
- '!**/*.gif',
- '!**/*.xlf',
- '!**/*.dacpac',
- '!**/*.bacpac',
- '!**/*.py'
-];
-
-const jsHygieneFilter = [
- 'src/**/*.js',
- 'build/gulpfile.*.js',
- '!src/vs/loader.js',
- '!src/vs/css.js',
- '!src/vs/nls.js',
- '!src/vs/css.build.js',
- '!src/vs/nls.build.js',
- '!src/**/insane.js',
- '!src/**/marked.js',
- '!**/test/**'
-];
-
-const tsHygieneFilter = [
- 'src/**/*.ts',
- 'test/**/*.ts',
- 'extensions/**/*.ts',
- '!**/fixtures/**',
- '!**/typings/**',
- '!**/node_modules/**',
- '!extensions/typescript-basics/test/colorize-fixtures/**',
- '!extensions/vscode-api-tests/testWorkspace/**',
- '!extensions/vscode-api-tests/testWorkspace2/**',
- '!extensions/**/*.test.ts',
- '!extensions/html-language-features/server/lib/jquery.d.ts',
- '!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts', // {{SQL CARBON EDIT}},
- '!extensions/big-data-cluster/src/bigDataCluster/controller/tokenApiGenerated.ts', // {{SQL CARBON EDIT}},
- '!src/vs/workbench/services/themes/common/textMateScopeMatcher.ts', // {{SQL CARBON EDIT}} skip this because we have no plans on touching this and its not ours
- '!src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService.ts' // {{SQL CARBON EDIT}} skip this because known issue
-];
-
-const copyrightHeaderLines = [
- '/*---------------------------------------------------------------------------------------------',
- ' * Copyright (c) Microsoft Corporation. All rights reserved.',
- ' * Licensed under the Source EULA. See License.txt in the project root for license information.',
- ' *--------------------------------------------------------------------------------------------*/'
-];
-
-gulp.task('eslint', () => {
- return vfs.src(all, { base: '.', follow: true, allowEmpty: true })
- .pipe(filter(jsHygieneFilter.concat(tsHygieneFilter)))
- .pipe(gulpeslint({
- configFile: '.eslintrc.json',
- rulePaths: ['./build/lib/eslint']
- }))
- .pipe(gulpeslint.formatEach('compact'))
- .pipe(gulpeslint.results(results => {
- if (results.warningCount > 0 || results.errorCount > 0) {
- throw new Error('eslint failed with warnings and/or errors');
- }
- }));
-});
+const { hygiene } = require('./hygiene');
function checkPackageJSON(actualPath) {
const actual = require(path.join(__dirname, '..', actualPath));
const rootPackageJSON = require('../package.json');
+ const checkIncluded = (set1, set2) => {
+ for (let depName in set1) {
+ const depVersion = set1[depName];
+ const rootDepVersion = set2[depName];
+ if (!rootDepVersion) {
+ // missing in root is allowed
+ continue;
+ }
+ if (depVersion !== rootDepVersion) {
+ this.emit(
+ 'error',
+ `The dependency ${depName} in '${actualPath}' (${depVersion}) is different than in the root package.json (${rootDepVersion})`
+ );
+ }
+ }
+ };
- for (let depName in actual.dependencies) {
- const depVersion = actual.dependencies[depName];
- const rootDepVersion = rootPackageJSON.dependencies[depName];
- if (!rootDepVersion) {
- // missing in root is allowed
- continue;
- }
- if (depVersion !== rootDepVersion) {
- this.emit('error', `The dependency ${depName} in '${actualPath}' (${depVersion}) is different than in the root package.json (${rootDepVersion})`);
- }
- }
+ checkIncluded(actual.dependencies, rootPackageJSON.dependencies);
+ checkIncluded(actual.devDependencies, rootPackageJSON.devDependencies);
}
const checkPackageJSONTask = task.define('check-package-json', () => {
- return gulp.src('package.json')
- .pipe(es.through(function () {
+ return gulp.src('package.json').pipe(
+ es.through(function () {
checkPackageJSON.call(this, 'remote/package.json');
checkPackageJSON.call(this, 'remote/web/package.json');
- }));
+ checkPackageJSON.call(this, 'build/package.json');
+ })
+ );
});
gulp.task(checkPackageJSONTask);
-
-function hygiene(some) {
- let errorCount = 0;
-
- const productJson = es.through(function (file) {
- // const product = JSON.parse(file.contents.toString('utf8'));
-
- // if (product.extensionsGallery) { // {{SQL CARBON EDIT}} @todo we need to research on what the point of this is
- // console.error('product.json: Contains "extensionsGallery"');
- // errorCount++;
- // }
-
- this.emit('data', file);
- });
-
- const indentation = es.through(function (file) {
- const lines = file.contents.toString('utf8').split(/\r\n|\r|\n/);
- file.__lines = lines;
-
- lines
- .forEach((line, i) => {
- if (/^\s*$/.test(line)) {
- // empty or whitespace lines are OK
- } else if (/^[\t]*[^\s]/.test(line)) {
- // good indent
- } else if (/^[\t]* \*/.test(line)) {
- // block comment using an extra space
- } else {
- console.error(file.relative + '(' + (i + 1) + ',1): Bad whitespace indentation');
- errorCount++;
- }
- });
-
- this.emit('data', file);
- });
-
- const copyrights = es.through(function (file) {
-
- const lines = file.__lines;
- for (let i = 0; i < copyrightHeaderLines.length; i++) {
- if (lines[i] !== copyrightHeaderLines[i]) {
- console.error(file.relative + ': Missing or bad copyright statement');
- errorCount++;
- break;
- }
- }
-
- this.emit('data', file);
- });
-
- const formatting = es.map(function (file, cb) {
- tsfmt.processString(file.path, file.contents.toString('utf8'), {
- verify: false,
- tsfmt: true,
- // verbose: true,
- // keep checkJS happy
- editorconfig: undefined,
- replace: undefined,
- tsconfig: undefined,
- tsconfigFile: undefined,
- tsfmtFile: undefined,
- vscode: undefined,
- vscodeFile: undefined
- }).then(result => {
- let original = result.src.replace(/\r\n/gm, '\n');
- let formatted = result.dest.replace(/\r\n/gm, '\n');
-
- if (original !== formatted) {
- console.error('File not formatted. Run the \'Format Document\' command to fix it:', file.relative);
- errorCount++;
- }
- cb(null, file);
-
- }, err => {
- cb(err);
- });
- });
-
- let input;
-
- if (Array.isArray(some) || typeof some === 'string' || !some) {
- const options = { base: '.', follow: true, allowEmpty: true };
- if (some) {
- input = vfs.src(some, options).pipe(filter(all)); // split this up to not unnecessarily filter all a second time
- } else {
- input = vfs.src(all, options);
- }
- } else {
- input = some;
- }
-
- const productJsonFilter = filter('product.json', { restore: true });
-
- const result = input
- .pipe(filter(f => !f.stat.isDirectory()))
- .pipe(productJsonFilter)
- .pipe(process.env['BUILD_SOURCEVERSION'] ? es.through() : productJson)
- .pipe(productJsonFilter.restore)
- .pipe(filter(indentationFilter))
- .pipe(indentation)
- .pipe(filter(copyrightFilter))
- .pipe(copyrights);
-
- const typescript = result
- .pipe(filter(tsHygieneFilter))
- .pipe(formatting);
-
- const javascript = result
- .pipe(filter(jsHygieneFilter.concat(tsHygieneFilter)))
- .pipe(gulpeslint({
- configFile: '.eslintrc.json',
- rulePaths: ['./build/lib/eslint']
- }))
- .pipe(gulpeslint.formatEach('compact'))
- .pipe(gulpeslint.results(results => {
- errorCount += results.warningCount;
- errorCount += results.errorCount;
- }));
-
- let count = 0;
- return es.merge(typescript, javascript)
- .pipe(es.through(function (data) {
- count++;
- if (process.env['TRAVIS'] && count % 10 === 0) {
- process.stdout.write('.');
- }
- this.emit('data', data);
- }, function () {
- process.stdout.write('\n');
- if (errorCount > 0) {
- this.emit('error', 'Hygiene failed with ' + errorCount + ' errors. Check \'build/gulpfile.hygiene.js\'.');
- } else {
- this.emit('end');
- }
- }));
-}
-
-function createGitIndexVinyls(paths) {
- const cp = require('child_process');
- const repositoryPath = process.cwd();
-
- const fns = paths.map(relativePath => () => new Promise((c, e) => {
- const fullPath = path.join(repositoryPath, relativePath);
-
- fs.stat(fullPath, (err, stat) => {
- if (err && err.code === 'ENOENT') { // ignore deletions
- return c(null);
- } else if (err) {
- return e(err);
- }
-
- cp.exec(`git show :${relativePath}`, { maxBuffer: 2000 * 1024, encoding: 'buffer' }, (err, out) => {
- if (err) {
- return e(err);
- }
-
- c(new VinylFile({
- path: fullPath,
- base: repositoryPath,
- contents: out,
- stat
- }));
- });
- });
- }));
-
- return pall(fns, { concurrency: 4 })
- .then(r => r.filter(p => !!p));
-}
-
-gulp.task('hygiene', task.series(checkPackageJSONTask, () => hygiene()));
-
-// this allows us to run hygiene as a git pre-commit hook
-if (require.main === module) {
- const cp = require('child_process');
-
- process.on('unhandledRejection', (reason, p) => {
- console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
- process.exit(1);
- });
-
- if (process.argv.length > 2) {
- hygiene(process.argv.slice(2)).on('error', err => {
- console.error();
- console.error(err);
- process.exit(1);
- });
- } else {
- cp.exec('git diff --cached --name-only', { maxBuffer: 2000 * 1024 }, (err, out) => {
- if (err) {
- console.error();
- console.error(err);
- process.exit(1);
- return;
- }
-
- const some = out
- .split(/\r?\n/)
- .filter(l => !!l);
-
- if (some.length > 0) {
- console.log('Reading git index versions...');
-
- createGitIndexVinyls(some)
- .then(vinyls => new Promise((c, e) => hygiene(es.readArray(vinyls))
- .on('end', () => c())
- .on('error', e)))
- .catch(err => {
- console.error();
- console.error(err);
- process.exit(1);
- });
- }
- });
- }
-}
+const hygieneTask = task.define('hygiene', task.series(checkPackageJSONTask, () => hygiene(undefined, false)));
+gulp.task(hygieneTask);
diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js
index 7319578492..9997210084 100644
--- a/build/gulpfile.vscode.js
+++ b/build/gulpfile.vscode.js
@@ -221,13 +221,15 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
const telemetry = gulp.src('.build/telemetry/**', { base: '.build/telemetry', dot: true });
+ const jsFilter = util.filter(data => !data.isDirectory() &&/\.js$/.test(data.path));
const root = path.resolve(path.join(__dirname, '..'));
const dependenciesSrc = _.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`]));
+ // {{SQL CARBON EDIT}} - fix runtime module load break
const deps = gulp.src(dependenciesSrc, { base: '.', dot: true })
.pipe(filter(['**', '!**/package-lock.json']))
- .pipe(util.cleanNodeModules(path.join(__dirname, '.nativeignore')))
- .pipe(createAsar(path.join(process.cwd(), 'node_modules'), ['**/*.node', '**/vscode-ripgrep/bin/*', '**/node-pty/build/Release/*', '**/*.wasm'], 'app/node_modules.asar'));
+ .pipe(util.cleanNodeModules(path.join(__dirname, '.moduleignore')))
+ .pipe(createAsar(path.join(process.cwd(), 'node_modules'), ['**/*.node', '**/vscode-ripgrep/bin/*', '**/node-pty/build/Release/*', '**/*.wasm'], 'node_modules.asar'));
let all = es.merge(
packageJsonStream,
@@ -342,7 +344,8 @@ const BUILD_TARGETS = [
{ platform: 'win32', arch: 'ia32' },
{ platform: 'win32', arch: 'x64' },
{ platform: 'win32', arch: 'arm64' },
- { platform: 'darwin', arch: null, opts: { stats: true } },
+ { platform: 'darwin', arch: 'x64', opts: { stats: true } },
+ { platform: 'darwin', arch: 'arm64', opts: { stats: true } },
{ platform: 'linux', arch: 'ia32' },
{ platform: 'linux', arch: 'x64' },
{ platform: 'linux', arch: 'armhf' },
@@ -471,8 +474,10 @@ const generateVSCodeConfigurationTask = task.define('generate-vscode-configurati
const userDataDir = path.join(os.tmpdir(), 'tmpuserdata');
const extensionsDir = path.join(os.tmpdir(), 'tmpextdir');
+ const arch = process.env['VSCODE_ARCH'];
+ const appRoot = path.join(buildDir, `VSCode-darwin-${arch}`);
const appName = process.env.VSCODE_QUALITY === 'insider' ? 'Visual\\ Studio\\ Code\\ -\\ Insiders.app' : 'Visual\\ Studio\\ Code.app';
- const appPath = path.join(buildDir, `VSCode-darwin/${appName}/Contents/Resources/app/bin/code`);
+ const appPath = path.join(appRoot, appName, 'Contents', 'Resources', 'app', 'bin', 'code');
const codeProc = cp.exec(
`${appPath} --export-default-configuration='${allConfigDetailsPath}' --wait --user-data-dir='${userDataDir}' --extensions-dir='${extensionsDir}'`,
(err, stdout, stderr) => {
diff --git a/build/gulpfile.vscode.linux.js b/build/gulpfile.vscode.linux.js
index 034cd1e7ef..ac8af3845d 100644
--- a/build/gulpfile.vscode.linux.js
+++ b/build/gulpfile.vscode.linux.js
@@ -240,6 +240,7 @@ function prepareSnapPackage(arch) {
const snapcraft = gulp.src('resources/linux/snap/snapcraft.yaml', { base: '.' })
.pipe(replace('@@NAME@@', product.applicationName))
.pipe(replace('@@VERSION@@', commit.substr(0, 8)))
+ .pipe(replace('@@ARCHITECTURE@@', arch))
.pipe(rename('snap/snapcraft.yaml'));
const electronLaunch = gulp.src('resources/linux/snap/electron-launch', { base: '.' })
diff --git a/build/gulpfile.vscode.win32.js b/build/gulpfile.vscode.win32.js
index c19c69bf8e..e075e9d893 100644
--- a/build/gulpfile.vscode.win32.js
+++ b/build/gulpfile.vscode.win32.js
@@ -55,7 +55,13 @@ function packageInnoSetup(iss, options, cb) {
cp.spawn(innoSetupPath, args, { stdio: ['ignore', 'inherit', 'inherit'] })
.on('error', cb)
- .on('exit', () => cb(null));
+ .on('exit', code => {
+ if (code === 0) {
+ cb(null);
+ } else {
+ cb(new Error(`InnoSetup returned exit code: ${code}`));
+ }
+ });
}
function buildWin32Setup(arch, target) {
diff --git a/build/hygiene.js b/build/hygiene.js
new file mode 100644
index 0000000000..f0813201af
--- /dev/null
+++ b/build/hygiene.js
@@ -0,0 +1,482 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the Source EULA. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+const filter = require('gulp-filter');
+const es = require('event-stream');
+const gulpeslint = require('gulp-eslint');
+const tsfmt = require('typescript-formatter');
+const VinylFile = require('vinyl');
+const vfs = require('vinyl-fs');
+const path = require('path');
+const fs = require('fs');
+const pall = require('p-all');
+
+/**
+ * Hygiene works by creating cascading subsets of all our files and
+ * passing them through a sequence of checks. Here are the current subsets,
+ * named according to the checks performed on them. Each subset contains
+ * the following one, as described in mathematical notation:
+ *
+ * all â eol â indentation â copyright â typescript
+ */
+
+const all = [
+ '*',
+ 'extensions/**/*',
+ 'scripts/**/*',
+ 'src/**/*',
+ 'test/**/*',
+ '!test/**/out/**',
+ '!**/node_modules/**',
+ '!build/actions/**/*.js', // {{ SQL CARBON EDIT }}
+ '!build/**/*' // {{SQL CARBON EDIT}}
+];
+module.exports.all = all;
+
+const indentationFilter = [
+ '**',
+
+ // except specific files
+ '!**/ThirdPartyNotices.txt',
+ '!**/LICENSE.{txt,rtf}',
+ '!LICENSES.chromium.html',
+ '!**/LICENSE',
+ '!src/vs/nls.js',
+ '!src/vs/nls.build.js',
+ '!src/vs/css.js',
+ '!src/vs/css.build.js',
+ '!src/vs/loader.js',
+ '!src/vs/base/common/insane/insane.js',
+ '!src/vs/base/common/marked/marked.js',
+ '!src/vs/base/common/semver/semver.js',
+ '!src/vs/base/node/terminateProcess.sh',
+ '!src/vs/base/node/cpuUsage.sh',
+ '!test/unit/assert.js',
+ '!resources/linux/snap/electron-launch',
+
+ // except specific folders
+ '!test/automation/out/**',
+ '!test/smoke/out/**',
+ '!extensions/typescript-language-features/test-workspace/**',
+ '!extensions/vscode-api-tests/testWorkspace/**',
+ '!extensions/vscode-api-tests/testWorkspace2/**',
+ '!build/monaco/**',
+ '!build/win32/**',
+
+ // except multiple specific files
+ '!**/package.json',
+ '!**/yarn.lock',
+ '!**/yarn-error.log',
+
+ // except multiple specific folders
+ '!**/codicon/**',
+ '!**/fixtures/**',
+ '!**/lib/**',
+ '!extensions/**/out/**',
+ '!extensions/**/snippets/**',
+ '!extensions/**/syntaxes/**',
+ '!extensions/**/themes/**',
+ '!extensions/**/colorize-fixtures/**',
+
+ // except specific file types
+ '!src/vs/*/**/*.d.ts',
+ '!src/typings/**/*.d.ts',
+ '!extensions/**/*.d.ts',
+ '!**/*.{svg,exe,png,bmp,jpg,scpt,bat,cmd,cur,ttf,woff,eot,md,ps1,template,yaml,yml,d.ts.recipe,ico,icns,plist}',
+ '!build/{lib,download,darwin}/**/*.js',
+ '!build/**/*.sh',
+ '!build/azure-pipelines/**/*.js',
+ '!build/azure-pipelines/**/*.config',
+ '!**/Dockerfile',
+ '!**/Dockerfile.*',
+ '!**/*.Dockerfile',
+ '!**/*.dockerfile',
+ '!extensions/markdown-language-features/media/*.js',
+ // {{SQL CARBON EDIT}}
+ '!**/*.gif',
+ '!build/actions/**/*.js',
+ '!**/*.{xlf,lcl,docx,sql,vsix,bacpac,ipynb,jpg}',
+ '!extensions/mssql/sqltoolsservice/**',
+ '!extensions/import/flatfileimportservice/**',
+ '!extensions/admin-tool-ext-win/ssmsmin/**',
+ '!extensions/resource-deployment/notebooks/**',
+ '!extensions/mssql/notebooks/**',
+ '!extensions/azurehybridtoolkit/notebooks/**',
+ '!extensions/integration-tests/testData/**',
+ '!extensions/arc/src/controller/generated/**',
+ '!extensions/sql-database-projects/resources/templates/*.xml',
+ '!extensions/sql-database-projects/src/test/baselines/*.xml',
+ '!extensions/sql-database-projects/src/test/baselines/*.json',
+ '!extensions/sql-database-projects/src/test/baselines/*.sqlproj',
+ '!extensions/sql-database-projects/BuildDirectory/SystemDacpacs/**',
+ '!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts',
+ '!extensions/big-data-cluster/src/bigDataCluster/controller/clusterApiGenerated2.ts',
+ '!resources/linux/snap/electron-launch',
+ '!build/**/*' // {{SQL CARBON EDIT}}
+];
+
+const copyrightFilter = [
+ '**',
+ '!**/*.desktop',
+ '!**/*.json',
+ '!**/*.html',
+ '!**/*.template',
+ '!**/*.md',
+ '!**/*.bat',
+ '!**/*.cmd',
+ '!**/*.ico',
+ '!**/*.icns',
+ '!**/*.xml',
+ '!**/*.sh',
+ '!**/*.txt',
+ '!**/*.xpm',
+ '!**/*.opts',
+ '!**/*.disabled',
+ '!**/*.code-workspace',
+ '!**/*.js.map',
+ '!build/**/*.init',
+ '!resources/linux/snap/snapcraft.yaml',
+ '!resources/win32/bin/code.js',
+ '!resources/web/code-web.js',
+ '!resources/completions/**',
+ '!extensions/configuration-editing/build/inline-allOf.ts',
+ '!extensions/markdown-language-features/media/highlight.css',
+ '!extensions/html-language-features/server/src/modes/typescript/*',
+ '!extensions/*/server/bin/*',
+ '!src/vs/editor/test/node/classification/typescript-test.ts',
+ '!scripts/code-web.js',
+ '!resources/serverless/code-web.js',
+ '!src/vs/editor/test/node/classification/typescript-test.ts',
+ // {{SQL CARBON EDIT}}
+ '!extensions/notebook/src/intellisense/text.ts',
+ '!extensions/mssql/src/hdfs/webhdfs.ts',
+ '!src/sql/workbench/contrib/notebook/browser/outputs/tableRenderers.ts',
+ '!src/sql/workbench/contrib/notebook/common/models/url.ts',
+ '!src/sql/workbench/services/notebook/browser/outputs/renderMimeInterfaces.ts',
+ '!src/sql/workbench/contrib/notebook/browser/models/outputProcessor.ts',
+ '!src/sql/workbench/services/notebook/browser/outputs/mimemodel.ts',
+ '!src/sql/workbench/contrib/notebook/browser/cellViews/media/*.css',
+ '!src/sql/base/browser/ui/table/plugins/rowSelectionModel.plugin.ts',
+ '!src/sql/base/browser/ui/table/plugins/rowDetailView.ts',
+ '!src/sql/base/browser/ui/table/plugins/headerFilter.plugin.ts',
+ '!src/sql/base/browser/ui/table/plugins/checkboxSelectColumn.plugin.ts',
+ '!src/sql/base/browser/ui/table/plugins/cellSelectionModel.plugin.ts',
+ '!src/sql/base/browser/ui/table/plugins/autoSizeColumns.plugin.ts',
+ '!src/sql/workbench/services/notebook/browser/outputs/sanitizer.ts',
+ '!src/sql/workbench/contrib/notebook/browser/outputs/renderers.ts',
+ '!src/sql/workbench/services/notebook/browser/outputs/registry.ts',
+ '!src/sql/workbench/services/notebook/browser/outputs/factories.ts',
+ '!src/sql/workbench/services/notebook/common/nbformat.ts',
+ '!extensions/markdown-language-features/media/tomorrow.css',
+ '!src/sql/workbench/browser/modelComponents/media/highlight.css',
+ '!src/sql/workbench/contrib/notebook/electron-browser/cellViews/media/highlight.css',
+ '!src/sql/workbench/contrib/notebook/browser/turndownPluginGfm.ts',
+ '!extensions/mssql/sqltoolsservice/**',
+ '!extensions/import/flatfileimportservice/**',
+ '!extensions/notebook/src/prompts/**',
+ '!extensions/mssql/src/prompts/**',
+ '!extensions/kusto/src/prompts/**',
+ '!extensions/notebook/resources/jupyter_config/**',
+ '!extensions/azurehybridtoolkit/notebooks/**',
+ '!extensions/query-history/images/**',
+ '!extensions/sql/build/update-grammar.js',
+ '!**/*.gif',
+ '!**/*.xlf',
+ '!**/*.dacpac',
+ '!**/*.bacpac',
+ '!**/*.py'
+];
+
+const jsHygieneFilter = [
+ 'src/**/*.js',
+ 'build/gulpfile.*.js',
+ '!src/vs/loader.js',
+ '!src/vs/css.js',
+ '!src/vs/nls.js',
+ '!src/vs/css.build.js',
+ '!src/vs/nls.build.js',
+ '!src/**/insane.js',
+ '!src/**/marked.js',
+ '!src/**/semver.js',
+ '!**/test/**',
+ '!build/**/*' // {{SQL CARBON EDIT}}
+];
+module.exports.jsHygieneFilter = jsHygieneFilter;
+
+const tsHygieneFilter = [
+ 'src/**/*.ts',
+ 'test/**/*.ts',
+ 'extensions/**/*.ts',
+ '!**/fixtures/**',
+ '!**/typings/**',
+ '!**/node_modules/**',
+ '!extensions/typescript-basics/test/colorize-fixtures/**',
+ '!extensions/vscode-api-tests/testWorkspace/**',
+ '!extensions/vscode-api-tests/testWorkspace2/**',
+ '!extensions/**/*.test.ts',
+ '!extensions/html-language-features/server/lib/jquery.d.ts',
+ '!extensions/big-data-cluster/src/bigDataCluster/controller/apiGenerated.ts', // {{SQL CARBON EDIT}}
+ '!extensions/big-data-cluster/src/bigDataCluster/controller/tokenApiGenerated.ts', // {{SQL CARBON EDIT}}
+ '!src/vs/workbench/services/themes/common/textMateScopeMatcher.ts', // {{SQL CARBON EDIT}} skip this because we have no plans on touching this and its not ours
+ '!src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService.ts', // {{SQL CARBON EDIT}} skip this because known issue
+ '!build/**/*' // {{SQL CARBON EDIT}}
+];
+module.exports.tsHygieneFilter = tsHygieneFilter;
+
+const copyrightHeaderLines = [
+ '/*---------------------------------------------------------------------------------------------',
+ ' * Copyright (c) Microsoft Corporation. All rights reserved.',
+ ' * Licensed under the Source EULA. See License.txt in the project root for license information.',
+ ' *--------------------------------------------------------------------------------------------*/',
+];
+
+function hygiene(some) {
+ let errorCount = 0;
+
+ const productJson = es.through(function (file) {
+ // const product = JSON.parse(file.contents.toString('utf8'));
+
+ // if (product.extensionsGallery) { // {{SQL CARBON EDIT}} @todo we need to research on what the point of this is
+ // console.error('product.json: Contains "extensionsGallery"');
+ // errorCount++;
+ // }
+
+ this.emit('data', file);
+ });
+
+ const indentation = es.through(function (file) {
+ const lines = file.contents.toString('utf8').split(/\r\n|\r|\n/);
+ file.__lines = lines;
+
+ lines.forEach((line, i) => {
+ if (/^\s*$/.test(line)) {
+ // empty or whitespace lines are OK
+ } else if (/^[\t]*[^\s]/.test(line)) {
+ // good indent
+ } else if (/^[\t]* \*/.test(line)) {
+ // block comment using an extra space
+ } else {
+ console.error(
+ file.relative + '(' + (i + 1) + ',1): Bad whitespace indentation'
+ );
+ errorCount++;
+ }
+ });
+
+ this.emit('data', file);
+ });
+
+ const copyrights = es.through(function (file) {
+ const lines = file.__lines;
+
+ for (let i = 0; i < copyrightHeaderLines.length; i++) {
+ if (lines[i] !== copyrightHeaderLines[i]) {
+ //console.error(file.relative + ': Missing or bad copyright statement');
+ //errorCount++;
+ break;
+ }
+ }
+
+ this.emit('data', file);
+ });
+
+ const formatting = es.map(function (file, cb) {
+ tsfmt
+ .processString(file.path, file.contents.toString('utf8'), {
+ verify: false,
+ tsfmt: true,
+ // verbose: true,
+ // keep checkJS happy
+ editorconfig: undefined,
+ replace: undefined,
+ tsconfig: undefined,
+ tsconfigFile: undefined,
+ tsfmtFile: undefined,
+ vscode: undefined,
+ vscodeFile: undefined,
+ })
+ .then(
+ (result) => {
+ let original = result.src.replace(/\r\n/gm, '\n');
+ let formatted = result.dest.replace(/\r\n/gm, '\n');
+
+ if (original !== formatted) {
+ console.error(
+ `File not formatted. Run the 'Format Document' command to fix it:`,
+ file.relative
+ );
+ errorCount++;
+ }
+ cb(null, file);
+ },
+ (err) => {
+ cb(err);
+ }
+ );
+ });
+
+ let input;
+
+ if (Array.isArray(some) || typeof some === 'string' || !some) {
+ const options = { base: '.', follow: true, allowEmpty: true };
+ if (some) {
+ input = vfs.src(some, options).pipe(filter(all)); // split this up to not unnecessarily filter all a second time
+ } else {
+ input = vfs.src(all, options);
+ }
+ } else {
+ input = some;
+ }
+
+ const productJsonFilter = filter('product.json', { restore: true });
+
+ const result = input
+ .pipe(filter((f) => !f.stat.isDirectory()))
+ .pipe(productJsonFilter)
+ .pipe(process.env['BUILD_SOURCEVERSION'] ? es.through() : productJson)
+ .pipe(productJsonFilter.restore)
+ .pipe(filter(indentationFilter))
+ .pipe(indentation)
+ .pipe(filter(copyrightFilter))
+ .pipe(copyrights);
+
+ const typescript = result.pipe(filter(tsHygieneFilter)).pipe(formatting);
+
+ const javascript = result
+ .pipe(filter(jsHygieneFilter.concat(tsHygieneFilter)))
+ .pipe(
+ gulpeslint({
+ configFile: '.eslintrc.json',
+ rulePaths: ['./build/lib/eslint'],
+ })
+ )
+ .pipe(gulpeslint.formatEach('compact'))
+ .pipe(
+ gulpeslint.results((results) => {
+ errorCount += results.warningCount;
+ errorCount += results.errorCount;
+ })
+ );
+
+ let count = 0;
+ return es.merge(typescript, javascript).pipe(
+ es.through(
+ function (data) {
+ count++;
+ if (process.env['TRAVIS'] && count % 10 === 0) {
+ process.stdout.write('.');
+ }
+ this.emit('data', data);
+ },
+ function () {
+ process.stdout.write('\n');
+ if (errorCount > 0) {
+ this.emit(
+ 'error',
+ 'Hygiene failed with ' +
+ errorCount +
+ ` errors. Check 'build / gulpfile.hygiene.js'.`
+ );
+ } else {
+ this.emit('end');
+ }
+ }
+ )
+ );
+}
+
+module.exports.hygiene = hygiene;
+
+function createGitIndexVinyls(paths) {
+ const cp = require('child_process');
+ const repositoryPath = process.cwd();
+
+ const fns = paths.map((relativePath) => () =>
+ new Promise((c, e) => {
+ const fullPath = path.join(repositoryPath, relativePath);
+
+ fs.stat(fullPath, (err, stat) => {
+ if (err && err.code === 'ENOENT') {
+ // ignore deletions
+ return c(null);
+ } else if (err) {
+ return e(err);
+ }
+
+ cp.exec(
+ `git show :${relativePath}`,
+ { maxBuffer: 2000 * 1024, encoding: 'buffer' },
+ (err, out) => {
+ if (err) {
+ return e(err);
+ }
+
+ c(
+ new VinylFile({
+ path: fullPath,
+ base: repositoryPath,
+ contents: out,
+ stat,
+ })
+ );
+ }
+ );
+ });
+ })
+ );
+
+ return pall(fns, { concurrency: 4 }).then((r) => r.filter((p) => !!p));
+}
+
+// this allows us to run hygiene as a git pre-commit hook
+if (require.main === module) {
+ const cp = require('child_process');
+
+ process.on('unhandledRejection', (reason, p) => {
+ console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
+ process.exit(1);
+ });
+
+ if (process.argv.length > 2) {
+ hygiene(process.argv.slice(2)).on('error', (err) => {
+ console.error();
+ console.error(err);
+ process.exit(1);
+ });
+ } else {
+ cp.exec(
+ 'git diff --cached --name-only',
+ { maxBuffer: 2000 * 1024 },
+ (err, out) => {
+ if (err) {
+ console.error();
+ console.error(err);
+ process.exit(1);
+ }
+
+ const some = out.split(/\r?\n/).filter((l) => !!l);
+
+ if (some.length > 0) {
+ console.log('Reading git index versions...');
+
+ createGitIndexVinyls(some)
+ .then(
+ (vinyls) =>
+ new Promise((c, e) =>
+ hygiene(es.readArray(vinyls))
+ .on('end', () => c())
+ .on('error', e)
+ )
+ )
+ .catch((err) => {
+ console.error();
+ console.error(err);
+ process.exit(1);
+ });
+ }
+ }
+ );
+ }
+}
diff --git a/build/lib/asar.js b/build/lib/asar.js
index 96420fea80..c3ada32736 100644
--- a/build/lib/asar.js
+++ b/build/lib/asar.js
@@ -70,8 +70,7 @@ function createAsar(folderPath, unpackGlobs, destFilename) {
// The file goes outside of xx.asar, in a folder xx.asar.unpacked
const relative = path.relative(folderPath, file.path);
this.queue(new VinylFile({
- cwd: folderPath,
- base: folderPath,
+ base: '.',
path: path.join(destFilename + '.unpacked', relative),
stat: file.stat,
contents: file.contents
@@ -96,8 +95,7 @@ function createAsar(folderPath, unpackGlobs, destFilename) {
const contents = Buffer.concat(out);
out.length = 0;
this.queue(new VinylFile({
- cwd: folderPath,
- base: folderPath,
+ base: '.',
path: destFilename,
contents: contents
}));
diff --git a/build/lib/asar.ts b/build/lib/asar.ts
index bc85ecce2f..66ea414964 100644
--- a/build/lib/asar.ts
+++ b/build/lib/asar.ts
@@ -87,8 +87,7 @@ export function createAsar(folderPath: string, unpackGlobs: string[], destFilena
// The file goes outside of xx.asar, in a folder xx.asar.unpacked
const relative = path.relative(folderPath, file.path);
this.queue(new VinylFile({
- cwd: folderPath,
- base: folderPath,
+ base: '.',
path: path.join(destFilename + '.unpacked', relative),
stat: file.stat,
contents: file.contents
@@ -117,8 +116,7 @@ export function createAsar(folderPath: string, unpackGlobs: string[], destFilena
out.length = 0;
this.queue(new VinylFile({
- cwd: folderPath,
- base: folderPath,
+ base: '.',
path: destFilename,
contents: contents
}));
diff --git a/build/lib/electron.js b/build/lib/electron.js
index 9cf2e89e88..7cc8e981f5 100644
--- a/build/lib/electron.js
+++ b/build/lib/electron.js
@@ -21,7 +21,7 @@ function darwinBundleDocumentType(extensions, icon) {
return {
name: product.nameLong + ' document',
role: 'Editor',
- ostypes: ["TEXT", "utxt", "TUTX", "****"],
+ ostypes: ['TEXT', 'utxt', 'TUTX', '****'],
extensions: extensions,
iconFile: icon
};
diff --git a/build/lib/electron.ts b/build/lib/electron.ts
index 030fc0b4b0..2aad4a99c7 100644
--- a/build/lib/electron.ts
+++ b/build/lib/electron.ts
@@ -25,7 +25,7 @@ function darwinBundleDocumentType(extensions: string[], icon: string) {
return {
name: product.nameLong + ' document',
role: 'Editor',
- ostypes: ["TEXT", "utxt", "TUTX", "****"],
+ ostypes: ['TEXT', 'utxt', 'TUTX', '****'],
extensions: extensions,
iconFile: icon
};
diff --git a/build/lib/eslint/code-no-unexternalized-strings.js b/build/lib/eslint/code-no-unexternalized-strings.js
index ae233eba07..748778d151 100644
--- a/build/lib/eslint/code-no-unexternalized-strings.js
+++ b/build/lib/eslint/code-no-unexternalized-strings.js
@@ -37,7 +37,7 @@ module.exports = new (_a = class NoUnexternalizedStrings {
// extract key so that it can be checked later
let key;
if (isStringLiteral(keyNode)) {
- doubleQuotedStringLiterals.delete(keyNode); //todo@joh reconsider
+ doubleQuotedStringLiterals.delete(keyNode);
key = keyNode.value;
}
else if (keyNode.type === experimental_utils_1.AST_NODE_TYPES.ObjectExpression) {
@@ -45,7 +45,7 @@ module.exports = new (_a = class NoUnexternalizedStrings {
if (property.type === experimental_utils_1.AST_NODE_TYPES.Property && !property.computed) {
if (property.key.type === experimental_utils_1.AST_NODE_TYPES.Identifier && property.key.name === 'key') {
if (isStringLiteral(property.value)) {
- doubleQuotedStringLiterals.delete(property.value); //todo@joh reconsider
+ doubleQuotedStringLiterals.delete(property.value);
key = property.value.value;
break;
}
diff --git a/build/lib/eslint/code-no-unexternalized-strings.ts b/build/lib/eslint/code-no-unexternalized-strings.ts
index 9e77bfd3f8..a20a06d6c8 100644
--- a/build/lib/eslint/code-no-unexternalized-strings.ts
+++ b/build/lib/eslint/code-no-unexternalized-strings.ts
@@ -47,7 +47,7 @@ export = new class NoUnexternalizedStrings implements eslint.Rule.RuleModule {
// extract key so that it can be checked later
let key: string | undefined;
if (isStringLiteral(keyNode)) {
- doubleQuotedStringLiterals.delete(keyNode); //todo@joh reconsider
+ doubleQuotedStringLiterals.delete(keyNode);
key = keyNode.value;
} else if (keyNode.type === AST_NODE_TYPES.ObjectExpression) {
@@ -55,7 +55,7 @@ export = new class NoUnexternalizedStrings implements eslint.Rule.RuleModule {
if (property.type === AST_NODE_TYPES.Property && !property.computed) {
if (property.key.type === AST_NODE_TYPES.Identifier && property.key.name === 'key') {
if (isStringLiteral(property.value)) {
- doubleQuotedStringLiterals.delete(property.value); //todo@joh reconsider
+ doubleQuotedStringLiterals.delete(property.value);
key = property.value.value;
break;
}
@@ -123,4 +123,3 @@ export = new class NoUnexternalizedStrings implements eslint.Rule.RuleModule {
};
}
};
-
diff --git a/build/lib/extensions.js b/build/lib/extensions.js
index 57e8e308b8..77bcd668c8 100644
--- a/build/lib/extensions.js
+++ b/build/lib/extensions.js
@@ -199,7 +199,7 @@ const excludedExtensions = [
'ms-vscode.node-debug',
'ms-vscode.node-debug2',
'vscode-notebook-tests',
- 'integration-tests',
+ 'integration-tests', // {{SQL CARBON EDIT}}
];
// {{SQL CARBON EDIT}}
const externalExtensions = [
diff --git a/build/lib/i18n.js b/build/lib/i18n.js
index b35bf2336b..e77e6953af 100644
--- a/build/lib/i18n.js
+++ b/build/lib/i18n.js
@@ -1038,7 +1038,7 @@ function createI18nFile(originalFilePath, messages) {
contents: Buffer.from(content, 'utf8')
});
}
-const i18nPackVersion = "1.0.0";
+const i18nPackVersion = '1.0.0';
function pullI18nPackFiles(apiHostname, username, password, language, resultingTranslationPaths) {
return pullCoreAndExtensionsXlfFiles(apiHostname, username, password, language, exports.externalExtensionsWithTranslations)
.pipe(prepareI18nPackFiles(exports.externalExtensionsWithTranslations, resultingTranslationPaths, language.id === 'ps'));
diff --git a/build/lib/i18n.resources.json b/build/lib/i18n.resources.json
index 0d34d1cea6..9ec898986a 100644
--- a/build/lib/i18n.resources.json
+++ b/build/lib/i18n.resources.json
@@ -62,6 +62,10 @@
"name": "vs/workbench/contrib/debug",
"project": "vscode-workbench"
},
+ {
+ "name": "vs/workbench/contrib/dialogs",
+ "project": "vscode-workbench"
+ },
{
"name": "vs/workbench/contrib/emmet",
"project": "vscode-workbench"
@@ -210,6 +214,10 @@
"name": "vs/workbench/contrib/webviewPanel",
"project": "vscode-workbench"
},
+ {
+ "name": "vs/workbench/contrib/workspaces",
+ "project": "vscode-workbench"
+ },
{
"name": "vs/workbench/contrib/customEditor",
"project": "vscode-workbench"
@@ -361,6 +369,14 @@
{
"name": "vs/workbench/services/authentication",
"project": "vscode-workbench"
+ },
+ {
+ "name": "vs/workbench/services/extensionRecommendations",
+ "project": "vscode-workbench"
+ },
+ {
+ "name": "vs/workbench/services/gettingStarted",
+ "project": "vscode-workbench"
}
]
}
diff --git a/build/lib/i18n.ts b/build/lib/i18n.ts
index be7232f2e6..dcf24f52cc 100644
--- a/build/lib/i18n.ts
+++ b/build/lib/i18n.ts
@@ -1196,7 +1196,7 @@ interface I18nPack {
};
}
-const i18nPackVersion = "1.0.0";
+const i18nPackVersion = '1.0.0';
export interface TranslationPath {
id: string;
diff --git a/build/lib/layersChecker.js b/build/lib/layersChecker.js
index a688d1e1fc..6293acaabf 100644
--- a/build/lib/layersChecker.js
+++ b/build/lib/layersChecker.js
@@ -24,8 +24,8 @@ const minimatch_1 = require("minimatch");
// Feel free to add more core types as you see needed if present in node.js and browsers
const CORE_TYPES = [
'require',
- 'atob',
- 'btoa',
+ // 'atob',
+ // 'btoa',
'setTimeout',
'clearTimeout',
'setInterval',
diff --git a/build/lib/layersChecker.ts b/build/lib/layersChecker.ts
index d9d67b48ff..fe899c6683 100644
--- a/build/lib/layersChecker.ts
+++ b/build/lib/layersChecker.ts
@@ -25,8 +25,8 @@ import { match } from 'minimatch';
// Feel free to add more core types as you see needed if present in node.js and browsers
const CORE_TYPES = [
'require', // from our AMD loader
- 'atob',
- 'btoa',
+ // 'atob',
+ // 'btoa',
'setTimeout',
'clearTimeout',
'setInterval',
diff --git a/build/lib/monaco-api.js b/build/lib/monaco-api.js
new file mode 100644
index 0000000000..a8ebfe51ac
--- /dev/null
+++ b/build/lib/monaco-api.js
@@ -0,0 +1,627 @@
+"use strict";
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the Source EULA. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.execute = exports.run3 = exports.DeclarationResolver = exports.FSProvider = exports.RECIPE_PATH = void 0;
+const fs = require("fs");
+const ts = require("typescript");
+const path = require("path");
+const fancyLog = require("fancy-log");
+const ansiColors = require("ansi-colors");
+const dtsv = '3';
+const tsfmt = require('../../tsfmt.json');
+const SRC = path.join(__dirname, '../../src');
+exports.RECIPE_PATH = path.join(__dirname, '../monaco/monaco.d.ts.recipe');
+const DECLARATION_PATH = path.join(__dirname, '../../src/vs/monaco.d.ts');
+function logErr(message, ...rest) {
+ fancyLog(ansiColors.yellow(`[monaco.d.ts]`), message, ...rest);
+}
+function isDeclaration(a) {
+ return (a.kind === ts.SyntaxKind.InterfaceDeclaration
+ || a.kind === ts.SyntaxKind.EnumDeclaration
+ || a.kind === ts.SyntaxKind.ClassDeclaration
+ || a.kind === ts.SyntaxKind.TypeAliasDeclaration
+ || a.kind === ts.SyntaxKind.FunctionDeclaration
+ || a.kind === ts.SyntaxKind.ModuleDeclaration);
+}
+function visitTopLevelDeclarations(sourceFile, visitor) {
+ let stop = false;
+ let visit = (node) => {
+ if (stop) {
+ return;
+ }
+ switch (node.kind) {
+ case ts.SyntaxKind.InterfaceDeclaration:
+ case ts.SyntaxKind.EnumDeclaration:
+ case ts.SyntaxKind.ClassDeclaration:
+ case ts.SyntaxKind.VariableStatement:
+ case ts.SyntaxKind.TypeAliasDeclaration:
+ case ts.SyntaxKind.FunctionDeclaration:
+ case ts.SyntaxKind.ModuleDeclaration:
+ stop = visitor(node);
+ }
+ if (stop) {
+ return;
+ }
+ ts.forEachChild(node, visit);
+ };
+ visit(sourceFile);
+}
+function getAllTopLevelDeclarations(sourceFile) {
+ let all = [];
+ visitTopLevelDeclarations(sourceFile, (node) => {
+ if (node.kind === ts.SyntaxKind.InterfaceDeclaration || node.kind === ts.SyntaxKind.ClassDeclaration || node.kind === ts.SyntaxKind.ModuleDeclaration) {
+ let interfaceDeclaration = node;
+ let triviaStart = interfaceDeclaration.pos;
+ let triviaEnd = interfaceDeclaration.name.pos;
+ let triviaText = getNodeText(sourceFile, { pos: triviaStart, end: triviaEnd });
+ if (triviaText.indexOf('@internal') === -1) {
+ all.push(node);
+ }
+ }
+ else {
+ let nodeText = getNodeText(sourceFile, node);
+ if (nodeText.indexOf('@internal') === -1) {
+ all.push(node);
+ }
+ }
+ return false /*continue*/;
+ });
+ return all;
+}
+function getTopLevelDeclaration(sourceFile, typeName) {
+ let result = null;
+ visitTopLevelDeclarations(sourceFile, (node) => {
+ if (isDeclaration(node) && node.name) {
+ if (node.name.text === typeName) {
+ result = node;
+ return true /*stop*/;
+ }
+ return false /*continue*/;
+ }
+ // node is ts.VariableStatement
+ if (getNodeText(sourceFile, node).indexOf(typeName) >= 0) {
+ result = node;
+ return true /*stop*/;
+ }
+ return false /*continue*/;
+ });
+ return result;
+}
+function getNodeText(sourceFile, node) {
+ return sourceFile.getFullText().substring(node.pos, node.end);
+}
+function hasModifier(modifiers, kind) {
+ if (modifiers) {
+ for (let i = 0; i < modifiers.length; i++) {
+ let mod = modifiers[i];
+ if (mod.kind === kind) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+function isStatic(member) {
+ return hasModifier(member.modifiers, ts.SyntaxKind.StaticKeyword);
+}
+function isDefaultExport(declaration) {
+ return (hasModifier(declaration.modifiers, ts.SyntaxKind.DefaultKeyword)
+ && hasModifier(declaration.modifiers, ts.SyntaxKind.ExportKeyword));
+}
+function getMassagedTopLevelDeclarationText(sourceFile, declaration, importName, usage, enums) {
+ let result = getNodeText(sourceFile, declaration);
+ if (declaration.kind === ts.SyntaxKind.InterfaceDeclaration || declaration.kind === ts.SyntaxKind.ClassDeclaration) {
+ let interfaceDeclaration = declaration;
+ const staticTypeName = (isDefaultExport(interfaceDeclaration)
+ ? `${importName}.default`
+ : `${importName}.${declaration.name.text}`);
+ let instanceTypeName = staticTypeName;
+ const typeParametersCnt = (interfaceDeclaration.typeParameters ? interfaceDeclaration.typeParameters.length : 0);
+ if (typeParametersCnt > 0) {
+ let arr = [];
+ for (let i = 0; i < typeParametersCnt; i++) {
+ arr.push('any');
+ }
+ instanceTypeName = `${instanceTypeName}<${arr.join(',')}>`;
+ }
+ const members = interfaceDeclaration.members;
+ members.forEach((member) => {
+ try {
+ let memberText = getNodeText(sourceFile, member);
+ if (memberText.indexOf('@internal') >= 0 || memberText.indexOf('private') >= 0) {
+ result = result.replace(memberText, '');
+ }
+ else {
+ const memberName = member.name.text;
+ const memberAccess = (memberName.indexOf('.') >= 0 ? `['${memberName}']` : `.${memberName}`);
+ if (isStatic(member)) {
+ usage.push(`a = ${staticTypeName}${memberAccess};`);
+ }
+ else {
+ usage.push(`a = (<${instanceTypeName}>b)${memberAccess};`);
+ }
+ }
+ }
+ catch (err) {
+ // life..
+ }
+ });
+ }
+ else if (declaration.kind === ts.SyntaxKind.VariableStatement) {
+ const jsDoc = result.substr(0, declaration.getLeadingTriviaWidth(sourceFile));
+ if (jsDoc.indexOf('@monacodtsreplace') >= 0) {
+ const jsDocLines = jsDoc.split(/\r\n|\r|\n/);
+ let directives = [];
+ for (const jsDocLine of jsDocLines) {
+ const m = jsDocLine.match(/^\s*\* \/([^/]+)\/([^/]+)\/$/);
+ if (m) {
+ directives.push([new RegExp(m[1], 'g'), m[2]]);
+ }
+ }
+ // remove the jsdoc
+ result = result.substr(jsDoc.length);
+ if (directives.length > 0) {
+ // apply replace directives
+ const replacer = createReplacerFromDirectives(directives);
+ result = replacer(result);
+ }
+ }
+ }
+ result = result.replace(/export default /g, 'export ');
+ result = result.replace(/export declare /g, 'export ');
+ result = result.replace(/declare /g, '');
+ let lines = result.split(/\r\n|\r|\n/);
+ for (let i = 0; i < lines.length; i++) {
+ if (/\s*\*/.test(lines[i])) {
+ // very likely a comment
+ continue;
+ }
+ lines[i] = lines[i].replace(/"/g, '\'');
+ }
+ result = lines.join('\n');
+ if (declaration.kind === ts.SyntaxKind.EnumDeclaration) {
+ result = result.replace(/const enum/, 'enum');
+ enums.push({
+ enumName: declaration.name.getText(sourceFile),
+ text: result
+ });
+ }
+ return result;
+}
+function format(text, endl) {
+ const REALLY_FORMAT = false;
+ text = preformat(text, endl);
+ if (!REALLY_FORMAT) {
+ return text;
+ }
+ // Parse the source text
+ let sourceFile = ts.createSourceFile('file.ts', text, ts.ScriptTarget.Latest, /*setParentPointers*/ true);
+ // Get the formatting edits on the input sources
+ let edits = ts.formatting.formatDocument(sourceFile, getRuleProvider(tsfmt), tsfmt);
+ // Apply the edits on the input code
+ return applyEdits(text, edits);
+ function countParensCurly(text) {
+ let cnt = 0;
+ for (let i = 0; i < text.length; i++) {
+ if (text.charAt(i) === '(' || text.charAt(i) === '{') {
+ cnt++;
+ }
+ if (text.charAt(i) === ')' || text.charAt(i) === '}') {
+ cnt--;
+ }
+ }
+ return cnt;
+ }
+ function repeatStr(s, cnt) {
+ let r = '';
+ for (let i = 0; i < cnt; i++) {
+ r += s;
+ }
+ return r;
+ }
+ function preformat(text, endl) {
+ let lines = text.split(endl);
+ let inComment = false;
+ let inCommentDeltaIndent = 0;
+ let indent = 0;
+ for (let i = 0; i < lines.length; i++) {
+ let line = lines[i].replace(/\s$/, '');
+ let repeat = false;
+ let lineIndent = 0;
+ do {
+ repeat = false;
+ if (line.substring(0, 4) === ' ') {
+ line = line.substring(4);
+ lineIndent++;
+ repeat = true;
+ }
+ if (line.charAt(0) === '\t') {
+ line = line.substring(1);
+ lineIndent++;
+ repeat = true;
+ }
+ } while (repeat);
+ if (line.length === 0) {
+ continue;
+ }
+ if (inComment) {
+ if (/\*\//.test(line)) {
+ inComment = false;
+ }
+ lines[i] = repeatStr('\t', lineIndent + inCommentDeltaIndent) + line;
+ continue;
+ }
+ if (/\/\*/.test(line)) {
+ inComment = true;
+ inCommentDeltaIndent = indent - lineIndent;
+ lines[i] = repeatStr('\t', indent) + line;
+ continue;
+ }
+ const cnt = countParensCurly(line);
+ let shouldUnindentAfter = false;
+ let shouldUnindentBefore = false;
+ if (cnt < 0) {
+ if (/[({]/.test(line)) {
+ shouldUnindentAfter = true;
+ }
+ else {
+ shouldUnindentBefore = true;
+ }
+ }
+ else if (cnt === 0) {
+ shouldUnindentBefore = /^\}/.test(line);
+ }
+ let shouldIndentAfter = false;
+ if (cnt > 0) {
+ shouldIndentAfter = true;
+ }
+ else if (cnt === 0) {
+ shouldIndentAfter = /{$/.test(line);
+ }
+ if (shouldUnindentBefore) {
+ indent--;
+ }
+ lines[i] = repeatStr('\t', indent) + line;
+ if (shouldUnindentAfter) {
+ indent--;
+ }
+ if (shouldIndentAfter) {
+ indent++;
+ }
+ }
+ return lines.join(endl);
+ }
+ function getRuleProvider(options) {
+ // Share this between multiple formatters using the same options.
+ // This represents the bulk of the space the formatter uses.
+ return ts.formatting.getFormatContext(options);
+ }
+ function applyEdits(text, edits) {
+ // Apply edits in reverse on the existing text
+ let result = text;
+ for (let i = edits.length - 1; i >= 0; i--) {
+ let change = edits[i];
+ let head = result.slice(0, change.span.start);
+ let tail = result.slice(change.span.start + change.span.length);
+ result = head + change.newText + tail;
+ }
+ return result;
+ }
+}
+function createReplacerFromDirectives(directives) {
+ return (str) => {
+ for (let i = 0; i < directives.length; i++) {
+ str = str.replace(directives[i][0], directives[i][1]);
+ }
+ return str;
+ };
+}
+function createReplacer(data) {
+ data = data || '';
+ let rawDirectives = data.split(';');
+ let directives = [];
+ rawDirectives.forEach((rawDirective) => {
+ if (rawDirective.length === 0) {
+ return;
+ }
+ let pieces = rawDirective.split('=>');
+ let findStr = pieces[0];
+ let replaceStr = pieces[1];
+ findStr = findStr.replace(/[\-\\\{\}\*\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, '\\$&');
+ findStr = '\\b' + findStr + '\\b';
+ directives.push([new RegExp(findStr, 'g'), replaceStr]);
+ });
+ return createReplacerFromDirectives(directives);
+}
+function generateDeclarationFile(recipe, sourceFileGetter) {
+ const endl = /\r\n/.test(recipe) ? '\r\n' : '\n';
+ let lines = recipe.split(endl);
+ let result = [];
+ let usageCounter = 0;
+ let usageImports = [];
+ let usage = [];
+ let failed = false;
+ usage.push(`var a: any;`);
+ usage.push(`var b: any;`);
+ const generateUsageImport = (moduleId) => {
+ let importName = 'm' + (++usageCounter);
+ usageImports.push(`import * as ${importName} from './${moduleId.replace(/\.d\.ts$/, '')}';`);
+ return importName;
+ };
+ let enums = [];
+ let version = null;
+ lines.forEach(line => {
+ if (failed) {
+ return;
+ }
+ let m0 = line.match(/^\/\/dtsv=(\d+)$/);
+ if (m0) {
+ version = m0[1];
+ }
+ let m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/);
+ if (m1) {
+ let moduleId = m1[1];
+ const sourceFile = sourceFileGetter(moduleId);
+ if (!sourceFile) {
+ logErr(`While handling ${line}`);
+ logErr(`Cannot find ${moduleId}`);
+ failed = true;
+ return;
+ }
+ const importName = generateUsageImport(moduleId);
+ let replacer = createReplacer(m1[2]);
+ let typeNames = m1[3].split(/,/);
+ typeNames.forEach((typeName) => {
+ typeName = typeName.trim();
+ if (typeName.length === 0) {
+ return;
+ }
+ let declaration = getTopLevelDeclaration(sourceFile, typeName);
+ if (!declaration) {
+ logErr(`While handling ${line}`);
+ logErr(`Cannot find ${typeName}`);
+ failed = true;
+ return;
+ }
+ result.push(replacer(getMassagedTopLevelDeclarationText(sourceFile, declaration, importName, usage, enums)));
+ });
+ return;
+ }
+ let m2 = line.match(/^\s*#includeAll\(([^;)]*)(;[^)]*)?\)\:(.*)$/);
+ if (m2) {
+ let moduleId = m2[1];
+ const sourceFile = sourceFileGetter(moduleId);
+ if (!sourceFile) {
+ logErr(`While handling ${line}`);
+ logErr(`Cannot find ${moduleId}`);
+ failed = true;
+ return;
+ }
+ const importName = generateUsageImport(moduleId);
+ let replacer = createReplacer(m2[2]);
+ let typeNames = m2[3].split(/,/);
+ let typesToExcludeMap = {};
+ let typesToExcludeArr = [];
+ typeNames.forEach((typeName) => {
+ typeName = typeName.trim();
+ if (typeName.length === 0) {
+ return;
+ }
+ typesToExcludeMap[typeName] = true;
+ typesToExcludeArr.push(typeName);
+ });
+ getAllTopLevelDeclarations(sourceFile).forEach((declaration) => {
+ if (isDeclaration(declaration) && declaration.name) {
+ if (typesToExcludeMap[declaration.name.text]) {
+ return;
+ }
+ }
+ else {
+ // node is ts.VariableStatement
+ let nodeText = getNodeText(sourceFile, declaration);
+ for (let i = 0; i < typesToExcludeArr.length; i++) {
+ if (nodeText.indexOf(typesToExcludeArr[i]) >= 0) {
+ return;
+ }
+ }
+ }
+ result.push(replacer(getMassagedTopLevelDeclarationText(sourceFile, declaration, importName, usage, enums)));
+ });
+ return;
+ }
+ result.push(line);
+ });
+ if (failed) {
+ return null;
+ }
+ if (version !== dtsv) {
+ if (!version) {
+ logErr(`gulp watch restart required. 'monaco.d.ts.recipe' is written before versioning was introduced.`);
+ }
+ else {
+ logErr(`gulp watch restart required. 'monaco.d.ts.recipe' v${version} does not match runtime v${dtsv}.`);
+ }
+ return null;
+ }
+ let resultTxt = result.join(endl);
+ resultTxt = resultTxt.replace(/\bURI\b/g, 'Uri');
+ resultTxt = resultTxt.replace(/\bEvent {
+ if (e1.enumName < e2.enumName) {
+ return -1;
+ }
+ if (e1.enumName > e2.enumName) {
+ return 1;
+ }
+ return 0;
+ });
+ let resultEnums = [
+ '/*---------------------------------------------------------------------------------------------',
+ ' * Copyright (c) Microsoft Corporation. All rights reserved.',
+ ' * Licensed under the Source EULA. See License.txt in the project root for license information.',
+ ' *--------------------------------------------------------------------------------------------*/',
+ '',
+ '// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY.',
+ ''
+ ].concat(enums.map(e => e.text)).join(endl);
+ resultEnums = resultEnums.split(/\r\n|\n|\r/).join(endl);
+ resultEnums = format(resultEnums, endl);
+ resultEnums = resultEnums.split(/\r\n|\n|\r/).join(endl);
+ return {
+ result: resultTxt,
+ usageContent: `${usageImports.join('\n')}\n\n${usage.join('\n')}`,
+ enums: resultEnums
+ };
+}
+function _run(sourceFileGetter) {
+ const recipe = fs.readFileSync(exports.RECIPE_PATH).toString();
+ const t = generateDeclarationFile(recipe, sourceFileGetter);
+ if (!t) {
+ return null;
+ }
+ const result = t.result;
+ const usageContent = t.usageContent;
+ const enums = t.enums;
+ const currentContent = fs.readFileSync(DECLARATION_PATH).toString();
+ const one = currentContent.replace(/\r\n/gm, '\n');
+ const other = result.replace(/\r\n/gm, '\n');
+ const isTheSame = (one === other);
+ return {
+ content: result,
+ usageContent: usageContent,
+ enums: enums,
+ filePath: DECLARATION_PATH,
+ isTheSame
+ };
+}
+class FSProvider {
+ existsSync(filePath) {
+ return fs.existsSync(filePath);
+ }
+ statSync(filePath) {
+ return fs.statSync(filePath);
+ }
+ readFileSync(_moduleId, filePath) {
+ return fs.readFileSync(filePath);
+ }
+}
+exports.FSProvider = FSProvider;
+class CacheEntry {
+ constructor(sourceFile, mtime) {
+ this.sourceFile = sourceFile;
+ this.mtime = mtime;
+ }
+}
+class DeclarationResolver {
+ constructor(_fsProvider) {
+ this._fsProvider = _fsProvider;
+ this._sourceFileCache = Object.create(null);
+ }
+ invalidateCache(moduleId) {
+ this._sourceFileCache[moduleId] = null;
+ }
+ getDeclarationSourceFile(moduleId) {
+ if (this._sourceFileCache[moduleId]) {
+ // Since we cannot trust file watching to invalidate the cache, check also the mtime
+ const fileName = this._getFileName(moduleId);
+ const mtime = this._fsProvider.statSync(fileName).mtime.getTime();
+ if (this._sourceFileCache[moduleId].mtime !== mtime) {
+ this._sourceFileCache[moduleId] = null;
+ }
+ }
+ if (!this._sourceFileCache[moduleId]) {
+ this._sourceFileCache[moduleId] = this._getDeclarationSourceFile(moduleId);
+ }
+ return this._sourceFileCache[moduleId] ? this._sourceFileCache[moduleId].sourceFile : null;
+ }
+ _getFileName(moduleId) {
+ if (/\.d\.ts$/.test(moduleId)) {
+ return path.join(SRC, moduleId);
+ }
+ return path.join(SRC, `${moduleId}.ts`);
+ }
+ _getDeclarationSourceFile(moduleId) {
+ const fileName = this._getFileName(moduleId);
+ if (!this._fsProvider.existsSync(fileName)) {
+ return null;
+ }
+ const mtime = this._fsProvider.statSync(fileName).mtime.getTime();
+ if (/\.d\.ts$/.test(moduleId)) {
+ // const mtime = this._fsProvider.statFileSync()
+ const fileContents = this._fsProvider.readFileSync(moduleId, fileName).toString();
+ return new CacheEntry(ts.createSourceFile(fileName, fileContents, ts.ScriptTarget.ES5), mtime);
+ }
+ const fileContents = this._fsProvider.readFileSync(moduleId, fileName).toString();
+ const fileMap = {
+ 'file.ts': fileContents
+ };
+ const service = ts.createLanguageService(new TypeScriptLanguageServiceHost({}, fileMap, {}));
+ const text = service.getEmitOutput('file.ts', true, true).outputFiles[0].text;
+ return new CacheEntry(ts.createSourceFile(fileName, text, ts.ScriptTarget.ES5), mtime);
+ }
+}
+exports.DeclarationResolver = DeclarationResolver;
+function run3(resolver) {
+ const sourceFileGetter = (moduleId) => resolver.getDeclarationSourceFile(moduleId);
+ return _run(sourceFileGetter);
+}
+exports.run3 = run3;
+class TypeScriptLanguageServiceHost {
+ constructor(libs, files, compilerOptions) {
+ this._libs = libs;
+ this._files = files;
+ this._compilerOptions = compilerOptions;
+ }
+ // --- language service host ---------------
+ getCompilationSettings() {
+ return this._compilerOptions;
+ }
+ getScriptFileNames() {
+ return ([]
+ .concat(Object.keys(this._libs))
+ .concat(Object.keys(this._files)));
+ }
+ getScriptVersion(_fileName) {
+ return '1';
+ }
+ getProjectVersion() {
+ return '1';
+ }
+ getScriptSnapshot(fileName) {
+ if (this._files.hasOwnProperty(fileName)) {
+ return ts.ScriptSnapshot.fromString(this._files[fileName]);
+ }
+ else if (this._libs.hasOwnProperty(fileName)) {
+ return ts.ScriptSnapshot.fromString(this._libs[fileName]);
+ }
+ else {
+ return ts.ScriptSnapshot.fromString('');
+ }
+ }
+ getScriptKind(_fileName) {
+ return ts.ScriptKind.TS;
+ }
+ getCurrentDirectory() {
+ return '';
+ }
+ getDefaultLibFileName(_options) {
+ return 'defaultLib:es5';
+ }
+ isDefaultLibFileName(fileName) {
+ return fileName === this.getDefaultLibFileName(this._compilerOptions);
+ }
+}
+function execute() {
+ let r = run3(new DeclarationResolver(new FSProvider()));
+ if (!r) {
+ throw new Error(`monaco.d.ts generation error - Cannot continue`);
+ }
+ return r;
+}
+exports.execute = execute;
diff --git a/build/lib/optimize.js b/build/lib/optimize.js
index 240cdc6fca..cb3d292b19 100644
--- a/build/lib/optimize.js
+++ b/build/lib/optimize.js
@@ -61,7 +61,7 @@ function loader(src, bundledFileHeader, bundleLoader) {
isFirst = false;
this.emit('data', new VinylFile({
path: 'fake',
- base: '',
+ base: '.',
contents: Buffer.from(bundledFileHeader)
}));
this.emit('data', data);
@@ -92,7 +92,7 @@ function toConcatStream(src, bundledFileHeader, sources, dest, fileContentMapper
}
const treatedSources = sources.map(function (source) {
const root = source.path ? REPO_ROOT_PATH.replace(/\\/g, '/') : '';
- const base = source.path ? root + `/${src}` : '';
+ const base = source.path ? root + `/${src}` : '.';
const path = source.path ? root + '/' + source.path.replace(/\\/g, '/') : 'fake';
const contents = source.path ? fileContentMapper(source.contents, path) : source.contents;
return new VinylFile({
diff --git a/build/lib/optimize.ts b/build/lib/optimize.ts
index 313ef17295..6992cb88f5 100644
--- a/build/lib/optimize.ts
+++ b/build/lib/optimize.ts
@@ -69,7 +69,7 @@ function loader(src: string, bundledFileHeader: string, bundleLoader: boolean):
isFirst = false;
this.emit('data', new VinylFile({
path: 'fake',
- base: '',
+ base: '.',
contents: Buffer.from(bundledFileHeader)
}));
this.emit('data', data);
@@ -104,7 +104,7 @@ function toConcatStream(src: string, bundledFileHeader: string, sources: bundle.
const treatedSources = sources.map(function (source) {
const root = source.path ? REPO_ROOT_PATH.replace(/\\/g, '/') : '';
- const base = source.path ? root + `/${src}` : '';
+ const base = source.path ? root + `/${src}` : '.';
const path = source.path ? root + '/' + source.path.replace(/\\/g, '/') : 'fake';
const contents = source.path ? fileContentMapper(source.contents, path) : source.contents;
diff --git a/build/lib/reporter.js b/build/lib/reporter.js
index fe9ec7fbe6..55feaf80ce 100644
--- a/build/lib/reporter.js
+++ b/build/lib/reporter.js
@@ -11,65 +11,81 @@ const fancyLog = require("fancy-log");
const ansiColors = require("ansi-colors");
const fs = require("fs");
const path = require("path");
-const allErrors = [];
-let startTime = null;
-let count = 0;
-function onStart() {
- if (count++ > 0) {
- return;
+class ErrorLog {
+ constructor(id) {
+ this.id = id;
+ this.allErrors = [];
+ this.startTime = null;
+ this.count = 0;
}
- startTime = new Date().getTime();
- fancyLog(`Starting ${ansiColors.green('compilation')}...`);
-}
-function onEnd() {
- if (--count > 0) {
- return;
+ onStart() {
+ if (this.count++ > 0) {
+ return;
+ }
+ this.startTime = new Date().getTime();
+ fancyLog(`Starting ${ansiColors.green('compilation')}${this.id ? ansiColors.blue(` ${this.id}`) : ''}...`);
+ }
+ onEnd() {
+ if (--this.count > 0) {
+ return;
+ }
+ this.log();
+ }
+ log() {
+ const errors = _.flatten(this.allErrors);
+ const seen = new Set();
+ errors.map(err => {
+ if (!seen.has(err)) {
+ seen.add(err);
+ fancyLog(`${ansiColors.red('Error')}: ${err}`);
+ }
+ });
+ fancyLog(`Finished ${ansiColors.green('compilation')}${this.id ? ansiColors.blue(` ${this.id}`) : ''} with ${errors.length} errors after ${ansiColors.magenta((new Date().getTime() - this.startTime) + ' ms')}`);
+ const regex = /^([^(]+)\((\d+),(\d+)\): (.*)$/s;
+ const messages = errors
+ .map(err => regex.exec(err))
+ .filter(match => !!match)
+ .map(x => x)
+ .map(([, path, line, column, message]) => ({ path, line: parseInt(line), column: parseInt(column), message }));
+ try {
+ const logFileName = 'log' + (this.id ? `_${this.id}` : '');
+ fs.writeFileSync(path.join(buildLogFolder, logFileName), JSON.stringify(messages));
+ }
+ catch (err) {
+ //noop
+ }
}
- log();
}
-const buildLogPath = path.join(path.dirname(path.dirname(__dirname)), '.build', 'log');
+const errorLogsById = new Map();
+function getErrorLog(id = '') {
+ let errorLog = errorLogsById.get(id);
+ if (!errorLog) {
+ errorLog = new ErrorLog(id);
+ errorLogsById.set(id, errorLog);
+ }
+ return errorLog;
+}
+const buildLogFolder = path.join(path.dirname(path.dirname(__dirname)), '.build');
try {
- fs.mkdirSync(path.dirname(buildLogPath));
+ fs.mkdirSync(buildLogFolder);
}
catch (err) {
// ignore
}
-function log() {
- const errors = _.flatten(allErrors);
- const seen = new Set();
- errors.map(err => {
- if (!seen.has(err)) {
- seen.add(err);
- fancyLog(`${ansiColors.red('Error')}: ${err}`);
- }
- });
- const regex = /^([^(]+)\((\d+),(\d+)\): (.*)$/;
- const messages = errors
- .map(err => regex.exec(err))
- .filter(match => !!match)
- .map(x => x)
- .map(([, path, line, column, message]) => ({ path, line: parseInt(line), column: parseInt(column), message }));
- try {
- fs.writeFileSync(buildLogPath, JSON.stringify(messages));
- }
- catch (err) {
- //noop
- }
- fancyLog(`Finished ${ansiColors.green('compilation')} with ${errors.length} errors after ${ansiColors.magenta((new Date().getTime() - startTime) + ' ms')}`);
-}
-function createReporter() {
+function createReporter(id) {
+ const errorLog = getErrorLog(id);
const errors = [];
- allErrors.push(errors);
+ errorLog.allErrors.push(errors);
const result = (err) => errors.push(err);
result.hasErrors = () => errors.length > 0;
result.end = (emitError) => {
errors.length = 0;
- onStart();
+ errorLog.onStart();
return es.through(undefined, function () {
- onEnd();
+ errorLog.onEnd();
if (emitError && errors.length > 0) {
if (!errors.__logged__) {
- log();
+ errorLog.log();
}
errors.__logged__ = true;
const err = new Error(`Found ${errors.length} errors`);
diff --git a/build/lib/reporter.ts b/build/lib/reporter.ts
index fe7750fa52..2bf8c6a048 100644
--- a/build/lib/reporter.ts
+++ b/build/lib/reporter.ts
@@ -12,72 +12,89 @@ import * as ansiColors from 'ansi-colors';
import * as fs from 'fs';
import * as path from 'path';
-const allErrors: string[][] = [];
-let startTime: number | null = null;
-let count = 0;
+class ErrorLog {
+ constructor(public id: string) {
+ }
+ allErrors: string[][] = [];
+ startTime: number | null = null;
+ count = 0;
-function onStart(): void {
- if (count++ > 0) {
- return;
+ onStart(): void {
+ if (this.count++ > 0) {
+ return;
+ }
+
+ this.startTime = new Date().getTime();
+ fancyLog(`Starting ${ansiColors.green('compilation')}${this.id ? ansiColors.blue(` ${this.id}`) : ''}...`);
}
- startTime = new Date().getTime();
- fancyLog(`Starting ${ansiColors.green('compilation')}...`);
-}
+ onEnd(): void {
+ if (--this.count > 0) {
+ return;
+ }
-function onEnd(): void {
- if (--count > 0) {
- return;
+ this.log();
+ }
+
+ log(): void {
+ const errors = _.flatten(this.allErrors);
+ const seen = new Set();
+
+ errors.map(err => {
+ if (!seen.has(err)) {
+ seen.add(err);
+ fancyLog(`${ansiColors.red('Error')}: ${err}`);
+ }
+ });
+
+ fancyLog(`Finished ${ansiColors.green('compilation')}${this.id ? ansiColors.blue(` ${this.id}`) : ''} with ${errors.length} errors after ${ansiColors.magenta((new Date().getTime() - this.startTime!) + ' ms')}`);
+
+ const regex = /^([^(]+)\((\d+),(\d+)\): (.*)$/s;
+ const messages = errors
+ .map(err => regex.exec(err))
+ .filter(match => !!match)
+ .map(x => x as string[])
+ .map(([, path, line, column, message]) => ({ path, line: parseInt(line), column: parseInt(column), message }));
+
+ try {
+ const logFileName = 'log' + (this.id ? `_${this.id}` : '');
+ fs.writeFileSync(path.join(buildLogFolder, logFileName), JSON.stringify(messages));
+ } catch (err) {
+ //noop
+ }
}
- log();
}
-const buildLogPath = path.join(path.dirname(path.dirname(__dirname)), '.build', 'log');
+const errorLogsById = new Map();
+function getErrorLog(id: string = '') {
+ let errorLog = errorLogsById.get(id);
+ if (!errorLog) {
+ errorLog = new ErrorLog(id);
+ errorLogsById.set(id, errorLog);
+ }
+ return errorLog;
+}
+
+const buildLogFolder = path.join(path.dirname(path.dirname(__dirname)), '.build');
try {
- fs.mkdirSync(path.dirname(buildLogPath));
+ fs.mkdirSync(buildLogFolder);
} catch (err) {
// ignore
}
-function log(): void {
- const errors = _.flatten(allErrors);
- const seen = new Set();
-
- errors.map(err => {
- if (!seen.has(err)) {
- seen.add(err);
- fancyLog(`${ansiColors.red('Error')}: ${err}`);
- }
- });
-
- const regex = /^([^(]+)\((\d+),(\d+)\): (.*)$/;
- const messages = errors
- .map(err => regex.exec(err))
- .filter(match => !!match)
- .map(x => x as string[])
- .map(([, path, line, column, message]) => ({ path, line: parseInt(line), column: parseInt(column), message }));
-
- try {
-
- fs.writeFileSync(buildLogPath, JSON.stringify(messages));
- } catch (err) {
- //noop
- }
-
- fancyLog(`Finished ${ansiColors.green('compilation')} with ${errors.length} errors after ${ansiColors.magenta((new Date().getTime() - startTime!) + ' ms')}`);
-}
-
export interface IReporter {
(err: string): void;
hasErrors(): boolean;
end(emitError: boolean): NodeJS.ReadWriteStream;
}
-export function createReporter(): IReporter {
+export function createReporter(id?: string): IReporter {
+ const errorLog = getErrorLog(id);
+
const errors: string[] = [];
- allErrors.push(errors);
+ errorLog.allErrors.push(errors);
const result = (err: string) => errors.push(err);
@@ -85,14 +102,14 @@ export function createReporter(): IReporter {
result.end = (emitError: boolean): NodeJS.ReadWriteStream => {
errors.length = 0;
- onStart();
+ errorLog.onStart();
return es.through(undefined, function () {
- onEnd();
+ errorLog.onEnd();
if (emitError && errors.length > 0) {
if (!(errors as any).__logged__) {
- log();
+ errorLog.log();
}
(errors as any).__logged__ = true;
diff --git a/build/lib/standalone.js b/build/lib/standalone.js
index a0a85817d4..41e1ac08e8 100644
--- a/build/lib/standalone.js
+++ b/build/lib/standalone.js
@@ -28,6 +28,7 @@ function writeFile(filePath, contents) {
fs.writeFileSync(filePath, contents);
}
function extractEditor(options) {
+ var _a;
const tsConfig = JSON.parse(fs.readFileSync(path.join(options.sourcesRoot, 'tsconfig.monaco.json')).toString());
let compilerOptions;
if (tsConfig.extends) {
@@ -47,6 +48,12 @@ function extractEditor(options) {
console.log(`Running tree shaker with shakeLevel ${tss.toStringShakeLevel(options.shakeLevel)}`);
// Take the extra included .d.ts files from `tsconfig.monaco.json`
options.typings = tsConfig.include.filter(includedFile => /\.d\.ts$/.test(includedFile));
+ // Add extra .d.ts files from `node_modules/@types/`
+ if (Array.isArray((_a = options.compilerOptions) === null || _a === void 0 ? void 0 : _a.types)) {
+ options.compilerOptions.types.forEach((type) => {
+ options.typings.push(`../node_modules/@types/${type}/index.d.ts`);
+ });
+ }
let result = tss.shake(options);
for (let fileName in result) {
if (result.hasOwnProperty(fileName)) {
diff --git a/build/lib/standalone.ts b/build/lib/standalone.ts
index f157b7bba7..2bef371011 100644
--- a/build/lib/standalone.ts
+++ b/build/lib/standalone.ts
@@ -55,6 +55,13 @@ export function extractEditor(options: tss.ITreeShakingOptions & { destRoot: str
// Take the extra included .d.ts files from `tsconfig.monaco.json`
options.typings = (tsConfig.include).filter(includedFile => /\.d\.ts$/.test(includedFile));
+ // Add extra .d.ts files from `node_modules/@types/`
+ if (Array.isArray(options.compilerOptions?.types)) {
+ options.compilerOptions.types.forEach((type: string) => {
+ options.typings.push(`../node_modules/@types/${type}/index.d.ts`);
+ });
+ }
+
let result = tss.shake(options);
for (let fileName in result) {
if (result.hasOwnProperty(fileName)) {
diff --git a/build/lib/util.js b/build/lib/util.js
index 17e538a69a..6b1331a8dc 100644
--- a/build/lib/util.js
+++ b/build/lib/util.js
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
-exports.getElectronVersion = exports.streamToPromise = exports.versionStringToNumber = exports.filter = exports.rebase = exports.getVersion = exports.ensureDir = exports.rreddir = exports.rimraf = exports.stripSourceMappingURL = exports.loadSourcemaps = exports.cleanNodeModules = exports.skipDirectories = exports.toFileUri = exports.setExecutableBit = exports.fixWin32DirectoryPermissions = exports.incremental = void 0;
+exports.getElectronVersion = exports.streamToPromise = exports.versionStringToNumber = exports.filter = exports.rebase = exports.getVersion = exports.ensureDir = exports.rreddir = exports.rimraf = exports.rewriteSourceMappingURL = exports.stripSourceMappingURL = exports.loadSourcemaps = exports.cleanNodeModules = exports.skipDirectories = exports.toFileUri = exports.setExecutableBit = exports.fixWin32DirectoryPermissions = exports.incremental = void 0;
const es = require("event-stream");
const debounce = require("debounce");
const _filter = require("gulp-filter");
@@ -167,6 +167,18 @@ function stripSourceMappingURL() {
return es.duplex(input, output);
}
exports.stripSourceMappingURL = stripSourceMappingURL;
+function rewriteSourceMappingURL(sourceMappingURLBase) {
+ const input = es.through();
+ const output = input
+ .pipe(es.mapSync(f => {
+ const contents = f.contents.toString('utf8');
+ const str = `//# sourceMappingURL=${sourceMappingURLBase}/${path.dirname(f.relative).replace(/\\/g, '/')}/$1`;
+ f.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, str));
+ return f;
+ }));
+ return es.duplex(input, output);
+}
+exports.rewriteSourceMappingURL = rewriteSourceMappingURL;
function rimraf(dir) {
const result = () => new Promise((c, e) => {
let retries = 0;
diff --git a/build/lib/util.ts b/build/lib/util.ts
index b3d8330688..eca16fdc25 100644
--- a/build/lib/util.ts
+++ b/build/lib/util.ts
@@ -220,6 +220,20 @@ export function stripSourceMappingURL(): NodeJS.ReadWriteStream {
return es.duplex(input, output);
}
+export function rewriteSourceMappingURL(sourceMappingURLBase: string): NodeJS.ReadWriteStream {
+ const input = es.through();
+
+ const output = input
+ .pipe(es.mapSync(f => {
+ const contents = (f.contents).toString('utf8');
+ const str = `//# sourceMappingURL=${sourceMappingURLBase}/${path.dirname(f.relative).replace(/\\/g, '/')}/$1`;
+ f.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, str));
+ return f;
+ }));
+
+ return es.duplex(input, output);
+}
+
export function rimraf(dir: string): () => Promise {
const result = () => new Promise((c, e) => {
let retries = 0;
diff --git a/build/npm/preinstall.js b/build/npm/preinstall.js
index 0f728dfca3..be23c182e7 100644
--- a/build/npm/preinstall.js
+++ b/build/npm/preinstall.js
@@ -7,8 +7,8 @@ let err = false;
const majorNodeVersion = parseInt(/^(\d+)\./.exec(process.versions.node)[1]);
-if (majorNodeVersion < 10 || majorNodeVersion >= 13) {
- console.error('\033[1;31m*** Please use node >=10 and <=12.\033[0;0m');
+if (majorNodeVersion < 10 || majorNodeVersion >= 16) {
+ console.error('\033[1;31m*** Please use node >=10 and <=16.\033[0;0m');
err = true;
}
diff --git a/build/package.json b/build/package.json
index 57929be41e..106b498c2d 100644
--- a/build/package.json
+++ b/build/package.json
@@ -13,6 +13,7 @@
"@types/gulp": "^4.0.5",
"@types/gulp-concat": "^0.0.32",
"@types/gulp-filter": "^3.0.32",
+ "@types/gulp-gzip": "^0.0.31",
"@types/gulp-json-editor": "^2.2.31",
"@types/gulp-rename": "^0.0.33",
"@types/gulp-sourcemaps": "^0.0.32",
@@ -21,7 +22,7 @@
"@types/minimatch": "^3.0.3",
"@types/minimist": "^1.2.0",
"@types/mocha": "2.2.39",
- "@types/node": "^10.14.8",
+ "@types/node": "^12.11.7",
"@types/pump": "^1.0.1",
"@types/request": "^2.47.0",
"@types/rimraf": "^2.0.2",
@@ -31,26 +32,28 @@
"@types/underscore": "^1.8.9",
"@types/xml2js": "0.0.33",
"@typescript-eslint/experimental-utils": "~2.13.0",
- "@typescript-eslint/parser": "^2.12.0",
+ "@typescript-eslint/parser": "^3.3.0",
"applicationinsights": "1.0.8",
"azure-storage": "^2.1.0",
"documentdb": "1.13.0",
"electron-osx-sign": "^0.4.16",
"github-releases": "^0.4.1",
+ "gulp-azure-storage": "^0.11.1",
"gulp-bom": "^1.0.0",
+ "gulp-gzip": "^1.4.2",
"gulp-sourcemaps": "^1.11.0",
"gulp-uglify": "^3.0.0",
"iconv-lite-umd": "0.6.8",
"jsonc-parser": "^2.3.0",
- "mime": "^1.3.4",
- "minimatch": "3.0.4",
+ "mime": "^1.4.1",
+ "minimatch": "^3.0.4",
"minimist": "^1.2.3",
"request": "^2.85.0",
"rollup": "^1.20.3",
"rollup-plugin-commonjs": "^10.1.0",
"rollup-plugin-node-resolve": "^5.2.0",
"terser": "4.3.8",
- "typescript": "^4.1.0-dev.20200824",
+ "typescript": "^4.2.0-dev.20201119",
"vsce": "1.48.0",
"vscode-telemetry-extractor": "^1.6.0",
"xml2js": "^0.4.17"
@@ -62,6 +65,6 @@
"npmCheckJs": "tsc --noEmit"
},
"dependencies": {
- "@azure/cosmos": "^3.4.0"
+ "@azure/cosmos": "^3.9.3"
}
}
diff --git a/build/win32/code.iss b/build/win32/code.iss
index 54174b471d..b94b5d62dc 100644
--- a/build/win32/code.iss
+++ b/build/win32/code.iss
@@ -112,6 +112,7 @@ Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\.sql\OpenWithProgids"
Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.sql"; ValueType: string; ValueName: ""; ValueData: "{cm:SourceFile,SQL}"; Flags: uninsdeletekey; Tasks: associatewithfiles
Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.sql"; ValueType: string; ValueName: "AppUserModelID"; ValueData: "{#AppUserId}"; Flags: uninsdeletekey; Tasks: associatewithfiles
Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.sql\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\app\resources\win32\sql.ico"; Tasks: associatewithfiles
+Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.sql\shell\open"; ValueType: string; ValueName: "Icon"; ValueData: """{app}\{#ExeBasename}.exe"""; Tasks: associatewithfiles
Root: {#SoftwareClassesRootKey}; Subkey: "Software\Classes\{#RegValueName}.sql\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#ExeBasename}.exe"" ""%1"""; Tasks: associatewithfiles
; .ipynb
diff --git a/build/yarn.lock b/build/yarn.lock
index 19ed2bb35e..f29da9b075 100644
--- a/build/yarn.lock
+++ b/build/yarn.lock
@@ -2,21 +2,22 @@
# yarn lockfile v1
-"@azure/cosmos@^3.4.0":
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/@azure/cosmos/-/cosmos-3.4.0.tgz#96f36a4522be23e1389d0516ea4d77e5fc153221"
- integrity sha512-4ym+ezk7qBe4s7/tb6IJ5kmXE4xgEbAPbraT3382oeCRlYpGrblIZIDoWbthMCJfLyLBDX5T05Fhm18QeY1R/w==
+"@azure/cosmos@^3.9.3":
+ version "3.9.3"
+ resolved "https://registry.yarnpkg.com/@azure/cosmos/-/cosmos-3.9.3.tgz#7e95ff92e5c3e9da7e8316bc50c9cc928be6c1d6"
+ integrity sha512-1mh8a6LAIykz24tJvQpafXiABUfq+HSAZBFJVZXea0Rd0qG8Ia9z8AK9FtPbC1nPvDC2RID2mRIjJvYbxRM/BA==
dependencies:
"@types/debug" "^4.1.4"
debug "^4.1.1"
fast-json-stable-stringify "^2.0.0"
+ jsbi "^3.1.3"
node-abort-controller "^1.0.4"
node-fetch "^2.6.0"
- os-name "^3.1.0"
priorityqueuejs "^1.0.0"
semaphore "^1.0.5"
- tslib "^1.9.3"
- uuid "^3.3.2"
+ tslib "^2.0.0"
+ universal-user-agent "^6.0.0"
+ uuid "^8.3.0"
"@dsherret/to-absolute-glob@^2.0.2":
version "2.0.2"
@@ -72,6 +73,14 @@
resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a"
integrity sha512-FhlMa34NHp9K5MY1Uz8yb+ZvuX0pnvn3jScRSNAb75KHGB8d3rEU6hqMs3Z2vjuytcMfRg6c5CHMc3wtYyD2/A==
+"@types/chokidar@*":
+ version "1.7.5"
+ resolved "https://registry.yarnpkg.com/@types/chokidar/-/chokidar-1.7.5.tgz#1fa78c8803e035bed6d98e6949e514b133b0c9b6"
+ integrity sha512-PDkSRY7KltW3M60hSBlerxI8SFPXsO3AL/aRVsO4Kh9IHRW74Ih75gUuTd/aE4LSSFqypb10UIX3QzOJwBQMGQ==
+ dependencies:
+ "@types/events" "*"
+ "@types/node" "*"
+
"@types/debounce@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@types/debounce/-/debounce-1.0.0.tgz#417560200331e1bb84d72da85391102c2fcd61b7"
@@ -83,9 +92,9 @@
integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==
"@types/documentdb@^1.10.5":
- version "1.10.5"
- resolved "https://registry.yarnpkg.com/@types/documentdb/-/documentdb-1.10.5.tgz#86c6ec9be9ce07ff9fcac5ca3c17570c385d40a4"
- integrity sha512-FHQV9Nc1ffrLkQxO0zFlDCRPyHZtuKmAAuJIi278COhtkKBuBRuKOzoO3JlT0yfUrivPjAzNae+gh9fS++r0Ag==
+ version "1.10.8"
+ resolved "https://registry.yarnpkg.com/@types/documentdb/-/documentdb-1.10.8.tgz#cf2008f8a4944abbd971f2ac1dbb81abf2d92f92"
+ integrity sha512-GkOXovVMlMVTYkPomq9rOI79DmVOMZ0TDziL3H3TSlhUSm1/txi5qA49H/qZRDFsExagjnf5Cd/4xF8mXVxubw==
dependencies:
"@types/node" "*"
@@ -107,11 +116,6 @@
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.41.tgz#fd90754150b57432b72bf560530500597ff04421"
integrity sha512-rIAmXyJlqw4KEBO7+u9gxZZSQHaCNnIzYrnNmYVpgfJhxTqO0brCX0SYpqUTkVI5mwwUwzmtspLBGBKroMeynA==
-"@types/estree@0.0.39":
- version "0.0.39"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
- integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
-
"@types/events@*":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
@@ -154,14 +158,21 @@
"@types/node" "*"
"@types/gulp-filter@^3.0.32":
- version "3.0.33"
- resolved "https://registry.yarnpkg.com/@types/gulp-filter/-/gulp-filter-3.0.33.tgz#353f6a9a5c0edea1a704f50b14f7979179497134"
- integrity sha512-LYwn+zTIt1h97RuGhqWT5DoeQQyfyiYIBOtPmeOYDEu0vo9GToiORUO+zBeYnCs5PIfJTAcHkGdhH61OTbSS4w==
+ version "3.0.32"
+ resolved "https://registry.yarnpkg.com/@types/gulp-filter/-/gulp-filter-3.0.32.tgz#eeff3e9dbc092268fed01f2421ab00f6c8cb4848"
+ integrity sha512-JvY4qTxXehoK2yCUxYVxTMvckVbDM5TWHWeUoYJyX31gwFqw4YDD6JNzhuTxI3yHPUTY4BBRTqgm6puQEZVCNg==
dependencies:
"@types/minimatch" "*"
"@types/node" "*"
"@types/vinyl" "*"
+"@types/gulp-gzip@^0.0.31":
+ version "0.0.31"
+ resolved "https://registry.yarnpkg.com/@types/gulp-gzip/-/gulp-gzip-0.0.31.tgz#9358def25540442138fd61a7227f40d4c1e26760"
+ integrity sha512-KQjHz1FTqLse8/EiktfhN/vo33vamX4gVAQhMTp55STDBA7UToW5CJqYyP7iRorkHK9/aJ2nL2hLkNZkY4M8+w==
+ dependencies:
+ "@types/node" "*"
+
"@types/gulp-json-editor@^2.2.31":
version "2.2.31"
resolved "https://registry.yarnpkg.com/@types/gulp-json-editor/-/gulp-json-editor-2.2.31.tgz#3c1a8950556c109a0e2d0ab11d5f2a2443665ed2"
@@ -193,13 +204,13 @@
"@types/uglify-js" "^2"
"@types/gulp@^4.0.5":
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-4.0.6.tgz#68fe0e1f0ff3657cfca46fb564806b744a1bf899"
- integrity sha512-0E8/iV/7FKWyQWSmi7jnUvgXXgaw+pfAzEB06Xu+l0iXVJppLbpOye5z7E2klw5akXd+8kPtYuk65YBcZPM4ow==
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-4.0.5.tgz#f5f498d5bf9538364792de22490a12c0e6bc5eb4"
+ integrity sha512-nx1QjPTiRpvLfYsZ7MBu7bT6Cm7tAXyLbY0xbdx2IEMxCK2v2urIhJMQZHW0iV1TskM71Xl6p2uRRuWDbk+/7g==
dependencies:
+ "@types/chokidar" "*"
"@types/undertaker" "*"
"@types/vinyl-fs" "*"
- chokidar "^2.1.2"
"@types/js-beautify@*":
version "1.8.0"
@@ -236,15 +247,10 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb"
integrity sha512-El3+WJk2D/ppWNd2X05aiP5l2k4EwF7KwheknQZls+I26eSICoWRhRIJ56jGgw2dqNGQ5LtNajmBU2ajS28EvQ==
-"@types/node@^10.14.8":
- version "10.14.13"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.13.tgz#ac786d623860adf39a3f51d629480aacd6a6eec7"
- integrity sha512-yN/FNNW1UYsRR1wwAoyOwqvDuLDtVXnaJTZ898XIw/Q5cCaeVAlVwvsmXLX5PuiScBYwZsZU4JYSHB3TvfdwvQ==
-
-"@types/node@^12.7.5":
- version "12.7.8"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.8.tgz#cb1bf6800238898bc2ff6ffa5702c3cadd350708"
- integrity sha512-FMdVn84tJJdV+xe+53sYiZS4R5yn1mAIxfj+DVoNiQjTYz1+OYmjwEZr1ev9nU0axXwda0QDbYl06QHanRVH3A==
+"@types/node@^12.11.7":
+ version "12.19.16"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.16.tgz#15753af35cbef636182d8d8ca55b37c8583cecb3"
+ integrity sha512-7xHmXm/QJ7cbK2laF+YYD7gb5MggHIIQwqyjin3bpEGiSuvScMQ5JZZXPvRipi1MwckTQbJZROMns/JxdnIL1Q==
"@types/pump@^1.0.1":
version "1.0.1"
@@ -305,9 +311,9 @@
integrity sha512-vOVmaruQG5EatOU/jM6yU2uCp3Lz6mK1P5Ztu4iJjfM4SVHU9XYktPUQtKlIXuahqXHdEyUarMrBEwg5Cwu+bA==
"@types/uglify-js@^2":
- version "2.6.32"
- resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.32.tgz#1b60906946fcf6ee4ceafa812d2b86f1358da904"
- integrity sha512-pVD2cG2wsKPvtpcxVZiSvK8eV9CpxXdlvhbAN//1eD3rOodqQLaEZ1qMNPl/+J93HrECsNLItRx5DkZuSW3j3A==
+ version "2.6.31"
+ resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.31.tgz#c694755eeb6a1bb9f8f321f3ec37cc22ca4c4f6b"
+ integrity sha512-LjcyGt6CHsgZ0AoofnMwhyxo9hUqz2mgl6IcF+S8B1zdSTxHAvTO/1RPvBAHG3C1ZeAc+AoWA5mb3lDJKtM9Zg==
dependencies:
source-map "^0.6.1"
@@ -351,14 +357,16 @@
resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.0.33.tgz#20c5dd6460245284d64a55690015b95e409fb7de"
integrity sha1-IMXdZGAkUoTWSlVpABW5XkCft94=
-"@typescript-eslint/experimental-utils@2.14.0":
- version "2.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.14.0.tgz#e9179fa3c44e00b3106b85d7b69342901fb43e3b"
- integrity sha512-KcyKS7G6IWnIgl3ZpyxyBCxhkBPV+0a5Jjy2g5HxlrbG2ZLQNFeneIBVXdaBCYOVjvGmGGFKom1kgiAY75SDeQ==
+"@typescript-eslint/experimental-utils@3.10.1":
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686"
+ integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==
dependencies:
"@types/json-schema" "^7.0.3"
- "@typescript-eslint/typescript-estree" "2.14.0"
+ "@typescript-eslint/types" "3.10.1"
+ "@typescript-eslint/typescript-estree" "3.10.1"
eslint-scope "^5.0.0"
+ eslint-utils "^2.0.0"
"@typescript-eslint/experimental-utils@~2.13.0":
version "2.13.0"
@@ -369,16 +377,22 @@
"@typescript-eslint/typescript-estree" "2.13.0"
eslint-scope "^5.0.0"
-"@typescript-eslint/parser@^2.12.0":
- version "2.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.14.0.tgz#30fa0523d86d74172a5e32274558404ba4262cd6"
- integrity sha512-haS+8D35fUydIs+zdSf4BxpOartb/DjrZ2IxQ5sR8zyGfd77uT9ZJZYF8+I0WPhzqHmfafUBx8MYpcp8pfaoSA==
+"@typescript-eslint/parser@^3.3.0":
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467"
+ integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==
dependencies:
"@types/eslint-visitor-keys" "^1.0.0"
- "@typescript-eslint/experimental-utils" "2.14.0"
- "@typescript-eslint/typescript-estree" "2.14.0"
+ "@typescript-eslint/experimental-utils" "3.10.1"
+ "@typescript-eslint/types" "3.10.1"
+ "@typescript-eslint/typescript-estree" "3.10.1"
eslint-visitor-keys "^1.1.0"
+"@typescript-eslint/types@3.10.1":
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727"
+ integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==
+
"@typescript-eslint/typescript-estree@2.13.0":
version "2.13.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.13.0.tgz#a2e746867da772c857c13853219fced10d2566bc"
@@ -392,33 +406,36 @@
semver "^6.3.0"
tsutils "^3.17.1"
-"@typescript-eslint/typescript-estree@2.14.0":
- version "2.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.14.0.tgz#c67698acdc14547f095eeefe908958d93e1a648d"
- integrity sha512-pnLpUcMNG7GfFFfNQbEX6f1aPa5fMnH2G9By+A1yovYI4VIOK2DzkaRuUlIkbagpAcrxQHLqovI1YWqEcXyRnA==
+"@typescript-eslint/typescript-estree@3.10.1":
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853"
+ integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==
dependencies:
+ "@typescript-eslint/types" "3.10.1"
+ "@typescript-eslint/visitor-keys" "3.10.1"
debug "^4.1.1"
- eslint-visitor-keys "^1.1.0"
glob "^7.1.6"
is-glob "^4.0.1"
- lodash.unescape "4.0.1"
- semver "^6.3.0"
+ lodash "^4.17.15"
+ semver "^7.3.2"
tsutils "^3.17.1"
-abbrev@1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
- integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+"@typescript-eslint/visitor-keys@3.10.1":
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931"
+ integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==
+ dependencies:
+ eslint-visitor-keys "^1.1.0"
acorn@4.X:
version "4.0.13"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
-acorn@^7.0.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
- integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
+acorn@^7.1.0:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
agent-base@5:
version "5.1.1"
@@ -443,6 +460,23 @@ ajv@^5.1.0:
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.3.0"
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-colors@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9"
+ integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==
+ dependencies:
+ ansi-wrap "^0.1.0"
+
ansi-gray@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
@@ -455,28 +489,39 @@ ansi-regex@^2.0.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
-ansi-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
- integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
-ansi-wrap@0.1.0:
+ansi-styles@^4.0.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768=
-anymatch@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
- integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+any-promise@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+ integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
+
+append-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1"
+ integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=
dependencies:
- micromatch "^3.1.4"
- normalize-path "^2.1.1"
+ buffer-equal "^1.0.0"
applicationinsights@1.0.8:
version "1.0.8"
@@ -487,19 +532,6 @@ applicationinsights@1.0.8:
diagnostic-channel-publishers "0.2.1"
zone.js "0.7.6"
-aproba@^1.0.3:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
- integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
-
-are-we-there-yet@~1.1.2:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
- integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
- dependencies:
- delegates "^1.0.0"
- readable-stream "^2.0.6"
-
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@@ -512,11 +544,6 @@ arr-diff@^4.0.0:
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
-arr-flatten@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
- integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
-
arr-union@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
@@ -552,11 +579,6 @@ array-uniq@^1.0.2:
resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
-array-unique@^0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
- integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
-
arrify@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
@@ -582,11 +604,6 @@ assign-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
-async-each@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735"
- integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg==
-
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -617,6 +634,11 @@ aws4@^1.6.0:
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"
integrity sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==
+aws4@^1.8.0:
+ version "1.10.1"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428"
+ integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==
+
azure-storage@^2.1.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/azure-storage/-/azure-storage-2.6.0.tgz#84747ee54a4bd194bb960f89f3eff89d67acf1cf"
@@ -634,6 +656,23 @@ azure-storage@^2.1.0:
xml2js "0.2.7"
xmlbuilder "0.4.3"
+azure-storage@^2.10.2:
+ version "2.10.3"
+ resolved "https://registry.yarnpkg.com/azure-storage/-/azure-storage-2.10.3.tgz#c5966bf929d87587d78f6847040ea9a4b1d4a50a"
+ integrity sha512-IGLs5Xj6kO8Ii90KerQrrwuJKexLgSwYC4oLWmc11mzKe7Jt2E5IVg+ZQ8K53YWZACtVTMBNO3iGuA+4ipjJxQ==
+ dependencies:
+ browserify-mime "~1.2.9"
+ extend "^3.0.2"
+ json-edm-parser "0.1.2"
+ md5.js "1.3.4"
+ readable-stream "~2.0.0"
+ request "^2.86.0"
+ underscore "~1.8.3"
+ uuid "^3.0.0"
+ validator "~9.4.1"
+ xml2js "0.2.8"
+ xmlbuilder "^9.0.7"
+
balanced-match@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
@@ -644,19 +683,6 @@ base64-js@^1.2.3:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
-base@^0.11.1:
- version "0.11.2"
- resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
- integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
- dependencies:
- cache-base "^1.0.1"
- class-utils "^0.3.5"
- component-emitter "^1.2.1"
- define-property "^1.0.0"
- isobject "^3.0.1"
- mixin-deep "^1.2.0"
- pascalcase "^0.1.1"
-
bcrypt-pbkdf@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
@@ -669,11 +695,6 @@ beeper@^1.0.0:
resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=
-binary-extensions@^1.0.0:
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.0.tgz#9523e001306a32444b907423f1de2164222f6ab1"
- integrity sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==
-
binary-search-bounds@2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/binary-search-bounds/-/binary-search-bounds-2.0.3.tgz#5ff8616d6dd2ca5388bc85b2d6266e2b9da502dc"
@@ -718,22 +739,6 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
-braces@^2.3.1, braces@^2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
- integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
- dependencies:
- arr-flatten "^1.1.0"
- array-unique "^0.3.2"
- extend-shallow "^2.0.1"
- fill-range "^4.0.0"
- isobject "^3.0.1"
- repeat-element "^1.1.2"
- snapdragon "^0.8.1"
- snapdragon-node "^2.0.1"
- split-string "^3.0.2"
- to-regex "^3.0.1"
-
braces@^3.0.1:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
@@ -764,6 +769,11 @@ buffer-crc32@~0.2.3:
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
+buffer-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
+ integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74=
+
buffer-fill@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
@@ -779,20 +789,15 @@ builtin-modules@^3.1.0:
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484"
integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==
-cache-base@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
- integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
- dependencies:
- collection-visit "^1.0.0"
- component-emitter "^1.2.1"
- get-value "^2.0.6"
- has-value "^1.0.0"
- isobject "^3.0.1"
- set-value "^2.0.0"
- to-object-path "^0.3.0"
- union-value "^1.0.0"
- unset-value "^1.0.0"
+bytes@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
caseless@~0.12.0:
version "0.12.0"
@@ -822,50 +827,49 @@ cheerio@^1.0.0-rc.1:
lodash "^4.15.0"
parse5 "^3.0.1"
-chokidar@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058"
- integrity sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==
+cliui@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+ integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
dependencies:
- anymatch "^2.0.0"
- async-each "^1.0.1"
- braces "^2.3.2"
- glob-parent "^3.1.0"
- inherits "^2.0.3"
- is-binary-path "^1.0.0"
- is-glob "^4.0.0"
- normalize-path "^3.0.0"
- path-is-absolute "^1.0.0"
- readdirp "^2.2.1"
- upath "^1.1.0"
- optionalDependencies:
- fsevents "^1.2.7"
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^6.2.0"
-chownr@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
- integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==
-
-class-utils@^0.3.5:
- version "0.3.6"
- resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
- integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
- dependencies:
- arr-union "^3.1.0"
- define-property "^0.2.5"
- isobject "^3.0.0"
- static-extend "^0.1.1"
+clone-buffer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
+ integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg=
clone-stats@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=
+clone-stats@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
+ integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=
+
clone@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
+clone@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+ integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+cloneable-readable@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec"
+ integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==
+ dependencies:
+ inherits "^2.0.1"
+ process-nextick-args "^2.0.0"
+ readable-stream "^2.3.5"
+
co@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -876,18 +880,17 @@ code-block-writer@9.4.1:
resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-9.4.1.tgz#1448fca79dfc7a3649000f4c85be6bc770604c4c"
integrity sha512-LHAB+DL4YZDcwK8y/kAxZ0Lf/ncwLh/Ux4cTVWbPwIdrf1gPxXiPcwpz8r8/KqXu1aD+Raz46EOxDjFlbyO6bA==
-code-point-at@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
- integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
-
-collection-visit@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
- integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
dependencies:
- map-visit "^1.0.0"
- object-visit "^1.0.0"
+ color-name "~1.1.4"
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-support@^1.1.3:
version "1.1.3"
@@ -913,6 +916,13 @@ combined-stream@^1.0.5, combined-stream@~1.0.5:
dependencies:
delayed-stream "~1.0.0"
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
command-line-args@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.1.1.tgz#88e793e5bb3ceb30754a86863f0401ac92fd369a"
@@ -938,21 +948,11 @@ compare-version@^0.1.2:
resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=
-component-emitter@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
- integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
-
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
-console-control-strings@^1.0.0, console-control-strings@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
- integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
-
convert-source-map@1.X:
version "1.6.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
@@ -960,27 +960,18 @@ convert-source-map@1.X:
dependencies:
safe-buffer "~5.1.1"
-copy-descriptor@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
- integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+convert-source-map@^1.5.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ dependencies:
+ safe-buffer "~5.1.1"
core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-cross-spawn@^6.0.0:
- version "6.0.5"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
- integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
- dependencies:
- nice-try "^1.0.4"
- path-key "^2.0.1"
- semver "^5.5.0"
- shebang-command "^1.2.0"
- which "^1.2.9"
-
cryptiles@2.x.x:
version "2.0.5"
resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
@@ -1041,72 +1032,59 @@ debug-fabulous@0.0.X:
lazy-debug-legacy "0.0.X"
object-assign "4.1.0"
-debug@2.X, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8:
+debug@2.X, debug@^2.6.8:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
-debug@4, debug@^4.1.1:
+debug@4:
version "4.1.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
dependencies:
ms "^2.1.1"
+debug@^4.1.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
decode-uri-component@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
-deep-extend@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
- integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
-
-define-property@^0.2.5:
- version "0.2.5"
- resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
- integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
dependencies:
- is-descriptor "^0.1.0"
+ object-keys "^1.0.12"
-define-property@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
- integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
- dependencies:
- is-descriptor "^1.0.0"
-
-define-property@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
- integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
- dependencies:
- is-descriptor "^1.0.2"
- isobject "^3.0.1"
+delayed-stream@0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.6.tgz#a2646cb7ec3d5d7774614670a7a65de0c173edbc"
+ integrity sha1-omRst+w9XXd0YUZwp6Zd4MFz7bw=
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
-delegates@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
- integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
-
denodeify@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631"
integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE=
-detect-libc@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
- integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
-
detect-newline@2.X:
version "2.1.0"
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
@@ -1194,6 +1172,21 @@ duplexer2@0.0.2:
dependencies:
readable-stream "~1.1.9"
+duplexer@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
+ integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
+
+duplexify@^3.6.0:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
+ integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
+ dependencies:
+ end-of-stream "^1.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+ stream-shift "^1.0.0"
+
ecc-jsbn@~0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
@@ -1213,7 +1206,12 @@ electron-osx-sign@^0.4.16:
minimist "^1.2.0"
plist "^3.0.1"
-end-of-stream@^1.1.0:
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -1225,6 +1223,33 @@ entities@^1.1.1, entities@~1.1.1:
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1:
+ version "1.18.0-next.1"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68"
+ integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==
+ dependencies:
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+ is-callable "^1.2.2"
+ is-negative-zero "^2.0.0"
+ is-regex "^1.1.1"
+ object-inspect "^1.8.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.1"
+ string.prototype.trimend "^1.0.1"
+ string.prototype.trimstart "^1.0.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
escape-string-regexp@^1.0.2:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
@@ -1238,6 +1263,13 @@ eslint-scope@^5.0.0:
esrecurse "^4.1.0"
estraverse "^4.1.1"
+eslint-utils@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
+ integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+ dependencies:
+ eslint-visitor-keys "^1.1.0"
+
eslint-visitor-keys@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
@@ -1260,40 +1292,20 @@ estree-walker@^0.6.1:
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362"
integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==
-execa@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
- integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+event-stream@3.3.4:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
+ integrity sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=
dependencies:
- cross-spawn "^6.0.0"
- get-stream "^4.0.0"
- is-stream "^1.1.0"
- npm-run-path "^2.0.0"
- p-finally "^1.0.0"
- signal-exit "^3.0.0"
- strip-eof "^1.0.0"
+ duplexer "~0.1.1"
+ from "~0"
+ map-stream "~0.1.0"
+ pause-stream "0.0.11"
+ split "0.3"
+ stream-combiner "~0.0.4"
+ through "~2.3.1"
-expand-brackets@^2.1.4:
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
- integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
- dependencies:
- debug "^2.3.3"
- define-property "^0.2.5"
- extend-shallow "^2.0.1"
- posix-character-classes "^0.1.0"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.1"
-
-extend-shallow@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
- integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
- dependencies:
- is-extendable "^0.1.0"
-
-extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+extend-shallow@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
@@ -1301,6 +1313,11 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
assign-symbols "^1.0.0"
is-extendable "^1.0.1"
+extend@^3.0.0, extend@^3.0.2, extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
extend@~1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/extend/-/extend-1.2.1.tgz#a0f5fd6cfc83a5fe49ef698d60ec8a624dd4576c"
@@ -1311,20 +1328,6 @@ extend@~3.0.0, extend@~3.0.1:
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=
-extglob@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
- integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
- dependencies:
- array-unique "^0.3.2"
- define-property "^1.0.0"
- expand-brackets "^2.1.4"
- extend-shallow "^2.0.1"
- fragment-cache "^0.2.1"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.1"
-
extsprintf@1.3.0, extsprintf@^1.2.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
@@ -1339,11 +1342,26 @@ fancy-log@^1.1.0:
color-support "^1.1.3"
time-stamp "^1.0.0"
+fancy-log@^1.3.2:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7"
+ integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==
+ dependencies:
+ ansi-gray "^0.1.1"
+ color-support "^1.1.3"
+ parse-node-version "^1.0.0"
+ time-stamp "^1.0.0"
+
fast-deep-equal@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
fast-glob@^3.0.3:
version "3.0.4"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.0.4.tgz#d484a41005cb6faeb399b951fd1bd70ddaebb602"
@@ -1357,9 +1375,9 @@ fast-glob@^3.0.3:
micromatch "^4.0.2"
fast-json-stable-stringify@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
- integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
fastq@^1.6.0:
version "1.6.0"
@@ -1375,16 +1393,6 @@ fd-slicer@~1.1.0:
dependencies:
pend "~1.2.0"
-fill-range@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
- integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
- dependencies:
- extend-shallow "^2.0.1"
- is-number "^3.0.0"
- repeat-string "^1.6.1"
- to-regex-range "^2.1.0"
-
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
@@ -1399,10 +1407,21 @@ find-replace@^3.0.0:
dependencies:
array-back "^3.0.1"
-for-in@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
- integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
+find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+flush-write-stream@^1.0.2:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
+ integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.3.6"
forever-agent@~0.6.1:
version "0.6.1"
@@ -1427,12 +1446,19 @@ form-data@~2.3.1:
combined-stream "1.0.6"
mime-types "^2.1.12"
-fragment-cache@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
- integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
dependencies:
- map-cache "^0.2.2"
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+from@~0:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
+ integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=
fs-extra@^8.1.0:
version "8.1.0"
@@ -1443,51 +1469,28 @@ fs-extra@^8.1.0:
jsonfile "^4.0.0"
universalify "^0.1.0"
-fs-minipass@^1.2.5:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
- integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==
+fs-mkdirp-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
+ integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=
dependencies:
- minipass "^2.2.1"
+ graceful-fs "^4.1.11"
+ through2 "^2.0.3"
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
-fsevents@^1.2.7:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4"
- integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==
- dependencies:
- nan "^2.9.2"
- node-pre-gyp "^0.10.0"
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
-gauge@~2.7.3:
- version "2.7.4"
- resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
- integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
- dependencies:
- aproba "^1.0.3"
- console-control-strings "^1.0.0"
- has-unicode "^2.0.0"
- object-assign "^4.1.0"
- signal-exit "^3.0.0"
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
- wide-align "^1.1.0"
-
-get-stream@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
- integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
- dependencies:
- pump "^3.0.0"
-
-get-value@^2.0.3, get-value@^2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
- integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+get-caller-file@^2.0.1:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
getpass@^0.1.1:
version "0.1.7"
@@ -1521,6 +1524,22 @@ glob-parent@^5.0.0:
dependencies:
is-glob "^4.0.1"
+glob-stream@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4"
+ integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=
+ dependencies:
+ extend "^3.0.0"
+ glob "^7.1.1"
+ glob-parent "^3.1.0"
+ is-negated-glob "^1.0.0"
+ ordered-read-streams "^1.0.0"
+ pumpify "^1.3.5"
+ readable-stream "^2.1.5"
+ remove-trailing-separator "^1.0.1"
+ to-absolute-glob "^2.0.0"
+ unique-stream "^2.0.2"
+
glob@^7.0.6:
version "7.1.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
@@ -1533,10 +1552,10 @@ glob@^7.0.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^7.1.3:
- version "7.1.4"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
- integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
+glob@^7.1.1, glob@^7.1.6:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@@ -1545,10 +1564,10 @@ glob@^7.1.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^7.1.6:
- version "7.1.6"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
- integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+glob@^7.1.3:
+ version "7.1.4"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
+ integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@@ -1583,16 +1602,32 @@ graceful-fs@4.X:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=
-graceful-fs@^4.1.11:
- version "4.1.15"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
- integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
+graceful-fs@^4.0.0, graceful-fs@^4.1.11:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
+ integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b"
integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==
+gulp-azure-storage@^0.11.1:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/gulp-azure-storage/-/gulp-azure-storage-0.11.1.tgz#0e5f5d0f789da11206f1e5a9311a6cf7107877d7"
+ integrity sha512-csOwItwZV1P9GLsORVQy+CFwjYDdHNrBol89JlHdlhGx0fTgJBc1COTRZbjGRyRjgdUuVguo3YLl4ToJ10/SIQ==
+ dependencies:
+ azure-storage "^2.10.2"
+ delayed-stream "0.0.6"
+ event-stream "3.3.4"
+ mime "^1.3.4"
+ progress "^1.1.8"
+ queue "^3.0.10"
+ streamifier "^0.1.1"
+ vinyl "^2.2.0"
+ vinyl-fs "^3.0.3"
+ yargs "^15.3.0"
+
gulp-bom@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/gulp-bom/-/gulp-bom-1.0.0.tgz#38a183a07187bd57a7922d37977441f379df2abf"
@@ -1601,6 +1636,18 @@ gulp-bom@^1.0.0:
gulp-util "^3.0.0"
through2 "^2.0.0"
+gulp-gzip@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/gulp-gzip/-/gulp-gzip-1.4.2.tgz#0422a94014248655b5b1a9eea1c2abee1d4f4337"
+ integrity sha512-ZIxfkUwk2XmZPTT9pPHrHUQlZMyp9nPhg2sfoeN27mBGpi7OaHnOD+WCN41NXjfJQ69lV1nQ9LLm1hYxx4h3UQ==
+ dependencies:
+ ansi-colors "^1.0.1"
+ bytes "^3.0.0"
+ fancy-log "^1.3.2"
+ plugin-error "^1.0.0"
+ stream-to-array "^2.3.0"
+ through2 "^2.0.3"
+
gulp-sourcemaps@^1.11.0:
version "1.12.1"
resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.12.1.tgz#b437d1f3d980cf26e81184823718ce15ae6597b6"
@@ -1691,6 +1738,14 @@ har-validator@~5.0.3:
ajv "^5.1.0"
har-schema "^2.0.0"
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
has-ansi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
@@ -1705,41 +1760,17 @@ has-gulplog@^0.1.0:
dependencies:
sparkles "^1.0.0"
-has-unicode@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
- integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
+has-symbols@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
+ integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
-has-value@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
- integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
dependencies:
- get-value "^2.0.3"
- has-values "^0.1.4"
- isobject "^2.0.0"
-
-has-value@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
- integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
- dependencies:
- get-value "^2.0.6"
- has-values "^1.0.0"
- isobject "^3.0.0"
-
-has-values@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
- integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
-
-has-values@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
- integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
- dependencies:
- is-number "^3.0.0"
- kind-of "^4.0.0"
+ function-bind "^1.1.1"
hash-base@^3.0.0:
version "3.0.4"
@@ -1822,20 +1853,6 @@ iconv-lite-umd@0.6.8:
resolved "https://registry.yarnpkg.com/iconv-lite-umd/-/iconv-lite-umd-0.6.8.tgz#5ad310ec126b260621471a2d586f7f37b9958ec0"
integrity sha512-zvXJ5gSwMC9JD3wDzH8CoZGc1pbiJn12Tqjk8BXYCnYz3hYL5GRjHW8LEykjXhV9WgNGI4rgpgHcbIiBfrRq6A==
-iconv-lite@^0.4.4:
- version "0.4.24"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
- integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
- dependencies:
- safer-buffer ">= 2.1.2 < 3"
-
-ignore-walk@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
- integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==
- dependencies:
- minimatch "^3.0.4"
-
ignore@^5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558"
@@ -1849,7 +1866,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2:
+inherits@2, inherits@~2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -1859,11 +1876,6 @@ inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
-ini@~1.3.0:
- version "1.3.7"
- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84"
- integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==
-
is-absolute@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
@@ -1872,68 +1884,27 @@ is-absolute@^1.0.0:
is-relative "^1.0.0"
is-windows "^1.0.1"
-is-accessor-descriptor@^0.1.6:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
- integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
- dependencies:
- kind-of "^3.0.2"
-
-is-accessor-descriptor@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
- integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
- dependencies:
- kind-of "^6.0.0"
-
-is-binary-path@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
- integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
- dependencies:
- binary-extensions "^1.0.0"
-
is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
-is-data-descriptor@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
- integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
- dependencies:
- kind-of "^3.0.2"
+is-callable@^1.1.4, is-callable@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9"
+ integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==
-is-data-descriptor@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
- integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+is-core-module@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946"
+ integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==
dependencies:
- kind-of "^6.0.0"
+ has "^1.0.3"
-is-descriptor@^0.1.0:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
- integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
- dependencies:
- is-accessor-descriptor "^0.1.6"
- is-data-descriptor "^0.1.4"
- kind-of "^5.0.0"
-
-is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+is-date-object@^1.0.1:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
- integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
- dependencies:
- is-accessor-descriptor "^1.0.0"
- is-data-descriptor "^1.0.0"
- kind-of "^6.0.2"
-
-is-extendable@^0.1.0, is-extendable@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
- integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
+ integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
is-extendable@^1.0.1:
version "1.0.1"
@@ -1947,17 +1918,10 @@ is-extglob@^2.1.0, is-extglob@^2.1.1:
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
-is-fullwidth-code-point@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
- integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
- dependencies:
- number-is-nan "^1.0.0"
-
-is-fullwidth-code-point@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
- integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-glob@^3.1.0:
version "3.1.0"
@@ -1966,13 +1930,6 @@ is-glob@^3.1.0:
dependencies:
is-extglob "^2.1.0"
-is-glob@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
- integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=
- dependencies:
- is-extglob "^2.1.1"
-
is-glob@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
@@ -1990,19 +1947,17 @@ is-negated-glob@^1.0.0:
resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=
-is-number@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
- integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
- dependencies:
- kind-of "^3.0.2"
+is-negative-zero@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461"
+ integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+is-plain-object@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
@@ -2010,11 +1965,18 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
isobject "^3.0.1"
is-reference@^1.1.2:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.4.tgz#3f95849886ddb70256a3e6d062b1a68c13c51427"
- integrity sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7"
+ integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==
dependencies:
- "@types/estree" "0.0.39"
+ "@types/estree" "*"
+
+is-regex@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9"
+ integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==
+ dependencies:
+ has-symbols "^1.0.1"
is-relative@^1.0.0:
version "1.0.0"
@@ -2023,10 +1985,12 @@ is-relative@^1.0.0:
dependencies:
is-unc-path "^1.0.0"
-is-stream@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
- integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
+is-symbol@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
+ integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
+ dependencies:
+ has-symbols "^1.0.1"
is-typedarray@~1.0.0:
version "1.0.0"
@@ -2040,12 +2004,17 @@ is-unc-path@^1.0.0:
dependencies:
unc-path-regex "^0.1.2"
-is-utf8@^0.2.0:
+is-utf8@^0.2.0, is-utf8@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
-is-windows@^1.0.1, is-windows@^1.0.2:
+is-valid-glob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa"
+ integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=
+
+is-windows@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
@@ -2055,7 +2024,7 @@ isarray@0.0.1:
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
-isarray@1.0.0, isarray@~1.0.0:
+isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
@@ -2067,19 +2036,7 @@ isbinaryfile@^3.0.2:
dependencies:
buffer-alloc "^1.2.0"
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-
-isobject@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
- integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
- dependencies:
- isarray "1.0.0"
-
-isobject@^3.0.0, isobject@^3.0.1:
+isobject@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
@@ -2089,6 +2046,11 @@ isstream@~0.1.2:
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+jsbi@^3.1.3:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.1.4.tgz#9654dd02207a66a4911b4e4bb74265bc2cbc9dd0"
+ integrity sha512-52QRRFSsi9impURE8ZUbzAMCLjPm4THO7H2fcuIvaaeFTbSysvkodbQQXIVsNgq/ypDbq6dJiuGKL0vZ/i9hUg==
+
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -2106,11 +2068,21 @@ json-schema-traverse@^0.3.0:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
json-schema@0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+
json-stable-stringify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
@@ -2155,35 +2127,25 @@ jsprim@^1.2.2:
json-schema "0.2.3"
verror "1.10.0"
-kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
- integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
- dependencies:
- is-buffer "^1.1.5"
-
-kind-of@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
- integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
- dependencies:
- is-buffer "^1.1.5"
-
-kind-of@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
- integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
-
-kind-of@^6.0.0, kind-of@^6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
- integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
-
lazy-debug-legacy@0.0.X:
version "0.0.1"
resolved "https://registry.yarnpkg.com/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz#537716c0776e4cf79e3ed1b621f7658c2911b1b1"
integrity sha1-U3cWwHduTPeePtG2IfdljCkRsbE=
+lazystream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
+ integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=
+ dependencies:
+ readable-stream "^2.0.5"
+
+lead@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42"
+ integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=
+ dependencies:
+ flush-write-stream "^1.0.2"
+
linkify-it@^2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f"
@@ -2191,6 +2153,13 @@ linkify-it@^2.0.0:
dependencies:
uc.micro "^1.0.1"
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
lodash._basecopy@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
@@ -2305,15 +2274,22 @@ lodash@^4.15.0, lodash@^4.17.10:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
-macos-release@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f"
- integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==
+lodash@^4.17.15:
+ version "4.17.20"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+ integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
magic-string@^0.25.2:
- version "0.25.3"
- resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.3.tgz#34b8d2a2c7fec9d9bdf9929a3fd81d271ef35be9"
- integrity sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==
+ version "0.25.7"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051"
+ integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==
dependencies:
sourcemap-codec "^1.4.4"
@@ -2329,17 +2305,10 @@ make-error@^1.2.0:
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8"
integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==
-map-cache@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
- integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
-
-map-visit@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
- integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
- dependencies:
- object-visit "^1.0.0"
+map-stream@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194"
+ integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=
markdown-it@^8.3.1:
version "8.4.2"
@@ -2370,25 +2339,6 @@ merge2@^1.2.3:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5"
integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==
-micromatch@^3.1.10, micromatch@^3.1.4:
- version "3.1.10"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
- integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
- dependencies:
- arr-diff "^4.0.0"
- array-unique "^0.3.2"
- braces "^2.3.1"
- define-property "^2.0.2"
- extend-shallow "^3.0.2"
- extglob "^2.0.4"
- fragment-cache "^0.2.1"
- kind-of "^6.0.2"
- nanomatch "^1.2.9"
- object.pick "^1.3.0"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.2"
-
micromatch@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
@@ -2397,6 +2347,11 @@ micromatch@^4.0.2:
braces "^3.0.1"
picomatch "^2.0.5"
+mime-db@1.44.0:
+ version "1.44.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
+ integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
+
mime-db@~1.30.0:
version "1.30.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
@@ -2421,11 +2376,23 @@ mime-types@~2.1.17:
dependencies:
mime-db "~1.33.0"
+mime-types@~2.1.19:
+ version "2.1.27"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
+ integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
+ dependencies:
+ mime-db "1.44.0"
+
mime@^1.3.4:
version "1.4.1"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
+mime@^1.4.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
@@ -2433,11 +2400,6 @@ minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
-minimist@0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
- integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
-
minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.3.tgz#3db5c0765545ab8637be71f333a104a965a9ca3f"
@@ -2448,42 +2410,12 @@ minimist@~0.0.1:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
-minipass@^2.2.1, minipass@^2.3.4:
- version "2.3.5"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
- integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==
- dependencies:
- safe-buffer "^5.1.2"
- yallist "^3.0.0"
-
-minizlib@^1.1.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614"
- integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==
- dependencies:
- minipass "^2.2.1"
-
-mixin-deep@^1.2.0:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
- integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
- dependencies:
- for-in "^1.0.2"
- is-extendable "^1.0.1"
-
-mkdirp@^0.5.0, mkdirp@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
- integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
- dependencies:
- minimist "0.0.8"
-
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
-ms@^2.1.1:
+ms@2.1.2, ms@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
@@ -2511,76 +2443,16 @@ mute-stream@~0.0.4:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
-nan@^2.9.2:
- version "2.13.1"
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd"
- integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA==
-
-nanomatch@^1.2.9:
- version "1.2.13"
- resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
- integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
- dependencies:
- arr-diff "^4.0.0"
- array-unique "^0.3.2"
- define-property "^2.0.2"
- extend-shallow "^3.0.2"
- fragment-cache "^0.2.1"
- is-windows "^1.0.2"
- kind-of "^6.0.2"
- object.pick "^1.3.0"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.1"
-
-needle@^2.2.1:
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
- integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==
- dependencies:
- debug "^2.1.2"
- iconv-lite "^0.4.4"
- sax "^1.2.4"
-
-nice-try@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
- integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
-
node-abort-controller@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-1.0.4.tgz#4095e41d58b2fae169d2f9892904d603e11c7a39"
- integrity sha512-7cNtLKTAg0LrW3ViS2C7UfIzbL3rZd8L0++5MidbKqQVJ8yrH6+1VRSHl33P0ZjBTbOJd37d9EYekvHyKkB0QQ==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-1.1.0.tgz#8a734a631b022af29963be7245c1483cbb9e070d"
+ integrity sha512-dEYmUqjtbivotqjraOe8UvhT/poFfog1BQRNsZm/MSEDDESk2cQ1tvD8kGyuN07TM/zoW+n42odL8zTeJupYdQ==
node-fetch@^2.6.0:
version "2.6.1"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
-node-pre-gyp@^0.10.0:
- version "0.10.3"
- resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
- integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==
- dependencies:
- detect-libc "^1.0.2"
- mkdirp "^0.5.1"
- needle "^2.2.1"
- nopt "^4.0.1"
- npm-packlist "^1.1.6"
- npmlog "^4.0.2"
- rc "^1.2.7"
- rimraf "^2.6.1"
- semver "^5.3.0"
- tar "^4"
-
-nopt@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
- integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
- dependencies:
- abbrev "1"
- osenv "^0.1.4"
-
normalize-path@^2.0.1, normalize-path@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
@@ -2588,40 +2460,12 @@ normalize-path@^2.0.1, normalize-path@^2.1.1:
dependencies:
remove-trailing-separator "^1.0.1"
-normalize-path@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
- integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-
-npm-bundled@^1.0.1:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd"
- integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==
-
-npm-packlist@^1.1.6:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc"
- integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==
+now-and-later@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c"
+ integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==
dependencies:
- ignore-walk "^3.0.1"
- npm-bundled "^1.0.1"
-
-npm-run-path@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
- integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
- dependencies:
- path-key "^2.0.0"
-
-npmlog@^4.0.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
- integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
- dependencies:
- are-we-there-yet "~1.1.2"
- console-control-strings "~1.1.0"
- gauge "~2.7.3"
- set-blocking "~2.0.0"
+ once "^1.3.2"
nth-check@~1.0.1:
version "1.0.2"
@@ -2630,16 +2474,16 @@ nth-check@~1.0.1:
dependencies:
boolbase "~1.0.0"
-number-is-nan@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
- integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
-
oauth-sign@~0.8.1, oauth-sign@~0.8.2:
version "0.8.2"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
object-assign@4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
@@ -2650,35 +2494,27 @@ object-assign@^3.0.0:
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=
-object-assign@^4.1.0:
+object-inspect@^1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
+ integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
+
+object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.0.4, object.assign@^4.1.1:
version "4.1.1"
- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
- integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
-
-object-copy@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
- integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd"
+ integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==
dependencies:
- copy-descriptor "^0.1.0"
- define-property "^0.2.5"
- kind-of "^3.0.3"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.0"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
-object-visit@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
- integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
- dependencies:
- isobject "^3.0.0"
-
-object.pick@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
- integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
- dependencies:
- isobject "^3.0.1"
-
-once@^1.3.0, once@^1.3.1, once@^1.4.0:
+once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
@@ -2693,25 +2529,24 @@ optimist@0.6.1:
minimist "~0.0.1"
wordwrap "~0.0.2"
+ordered-read-streams@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e"
+ integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=
+ dependencies:
+ readable-stream "^2.0.1"
+
os-homedir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
-os-name@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801"
- integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==
- dependencies:
- macos-release "^2.2.0"
- windows-release "^3.1.0"
-
os-tmpdir@^1.0.0, os-tmpdir@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
-osenv@^0.1.3, osenv@^0.1.4:
+osenv@^0.1.3:
version "0.1.5"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
@@ -2719,10 +2554,29 @@ osenv@^0.1.3, osenv@^0.1.4:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
-p-finally@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
- integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parse-node-version@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
+ integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
parse-semver@^1.1.1:
version "1.1.1"
@@ -2738,26 +2592,21 @@ parse5@^3.0.1:
dependencies:
"@types/node" "*"
-pascalcase@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
- integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
-
path-dirname@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-path-key@^2.0.0, path-key@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
- integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
-
path-parse@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
@@ -2768,6 +2617,13 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+pause-stream@0.0.11:
+ version "0.0.11"
+ resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
+ integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=
+ dependencies:
+ through "~2.3"
+
pend@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
@@ -2797,10 +2653,15 @@ plist@^3.0.1:
xmlbuilder "^9.0.7"
xmldom "0.1.x"
-posix-character-classes@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
- integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+plugin-error@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c"
+ integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==
+ dependencies:
+ ansi-colors "^1.0.1"
+ arr-diff "^4.0.0"
+ arr-union "^3.1.0"
+ extend-shallow "^3.0.2"
prettyjson@1.2.1:
version "1.2.1"
@@ -2815,6 +2676,11 @@ priorityqueuejs@1.0.0, priorityqueuejs@^1.0.0:
resolved "https://registry.yarnpkg.com/priorityqueuejs/-/priorityqueuejs-1.0.0.tgz#2ee4f23c2560913e08c07ce5ccdd6de3df2c5af8"
integrity sha1-LuTyPCVgkT4IwHzlzN1t498sWvg=
+process-nextick-args@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
process-nextick-args@~1.0.6:
version "1.0.7"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
@@ -2825,24 +2691,48 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
+progress@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
+ integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=
+
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
-pump@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+pump@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+ integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
+pumpify@^1.3.5:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+ integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
+ dependencies:
+ duplexify "^3.6.0"
+ inherits "^2.0.3"
+ pump "^2.0.0"
+
punycode@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
q@^1.0.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
@@ -2858,15 +2748,17 @@ qs@~6.5.1:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==
-rc@^1.2.7:
- version "1.2.8"
- resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
- integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+queue@^3.0.10:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/queue/-/queue-3.1.0.tgz#6c49d01f009e2256788789f2bffac6b8b9990585"
+ integrity sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=
dependencies:
- deep-extend "^0.6.0"
- ini "~1.3.0"
- minimist "^1.2.0"
- strip-json-comments "~2.0.1"
+ inherits "~2.0.0"
read@^1.0.7:
version "1.0.7"
@@ -2875,7 +2767,20 @@ read@^1.0.7:
dependencies:
mute-stream "~0.0.4"
-readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5:
+readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.5, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@^2.1.5:
version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
@@ -2919,43 +2824,38 @@ readable-stream@~2.0.0:
string_decoder "~0.10.x"
util-deprecate "~1.0.1"
-readdirp@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
- integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+remove-bom-buffer@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53"
+ integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==
dependencies:
- graceful-fs "^4.1.11"
- micromatch "^3.1.10"
- readable-stream "^2.0.2"
+ is-buffer "^1.1.5"
+ is-utf8 "^0.2.1"
-regex-not@^1.0.0, regex-not@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
- integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+remove-bom-stream@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523"
+ integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=
dependencies:
- extend-shallow "^3.0.2"
- safe-regex "^1.1.0"
+ remove-bom-buffer "^3.0.0"
+ safe-buffer "^5.1.0"
+ through2 "^2.0.3"
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
-repeat-element@^1.1.2:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
- integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
-
-repeat-string@^1.6.1:
- version "1.6.1"
- resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
- integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
-
replace-ext@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=
+replace-ext@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a"
+ integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==
+
request@2.81.0, request@~2.81.0:
version "2.81.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
@@ -3012,35 +2912,67 @@ request@^2.85.0:
tunnel-agent "^0.6.0"
uuid "^3.1.0"
+request@^2.86.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+resolve-options@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131"
+ integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=
+ dependencies:
+ value-or-function "^3.0.0"
+
resolve-url@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
resolve@^1.11.0, resolve@^1.11.1:
- version "1.12.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6"
- integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c"
+ integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==
dependencies:
+ is-core-module "^2.1.0"
path-parse "^1.0.6"
-ret@~0.1.10:
- version "0.1.15"
- resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
- integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
-
reusify@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
-rimraf@^2.6.1:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
- integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
- dependencies:
- glob "^7.1.3"
-
rollup-plugin-commonjs@^10.1.0:
version "10.1.0"
resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb"
@@ -3071,13 +3003,13 @@ rollup-pluginutils@^2.8.1:
estree-walker "^0.6.1"
rollup@^1.20.3:
- version "1.21.4"
- resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.21.4.tgz#00a41a30f90095db890301b226cbe2918e4cf54d"
- integrity sha512-Pl512XVCmVzgcBz5h/3Li4oTaoDcmpuFZ+kdhS/wLreALz//WuDAMfomD3QEYl84NkDu6Z6wV9twlcREb4qQsw==
+ version "1.32.1"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4"
+ integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==
dependencies:
- "@types/estree" "0.0.39"
- "@types/node" "^12.7.5"
- acorn "^7.0.0"
+ "@types/estree" "*"
+ "@types/node" "*"
+ acorn "^7.1.0"
run-parallel@^1.1.9:
version "1.1.9"
@@ -3089,6 +3021,11 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==
+safe-buffer@^5.1.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
safe-buffer@^5.1.2:
version "5.2.0"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
@@ -3099,24 +3036,17 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-safe-regex@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
- integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
- dependencies:
- ret "~0.1.10"
-
-"safer-buffer@>= 2.1.2 < 3":
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
- integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-
sax@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.2.tgz#735ffaa39a1cff8ffb9598f0223abdb03a9fb2ea"
integrity sha1-c1/6o5oc/4/7lZjwIjq9sDqfsuo=
-sax@>=0.6.0, sax@^1.2.4:
+sax@0.5.x:
+ version "0.5.8"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
+ integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=
+
+sax@>=0.6.0:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
@@ -3136,93 +3066,28 @@ semver@^5.1.0, semver@^5.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
-semver@^5.5.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
- integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-set-blocking@~2.0.0:
+semver@^7.3.2:
+ version "7.3.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97"
+ integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==
+ dependencies:
+ lru-cache "^6.0.0"
+
+set-blocking@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
-set-value@^0.4.3:
- version "0.4.3"
- resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
- integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE=
- dependencies:
- extend-shallow "^2.0.1"
- is-extendable "^0.1.1"
- is-plain-object "^2.0.1"
- to-object-path "^0.3.0"
-
-set-value@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
- integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==
- dependencies:
- extend-shallow "^2.0.1"
- is-extendable "^0.1.1"
- is-plain-object "^2.0.3"
- split-string "^3.0.1"
-
-shebang-command@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
- integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
- dependencies:
- shebang-regex "^1.0.0"
-
-shebang-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
- integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
-
-signal-exit@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
- integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
-
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-snapdragon-node@^2.0.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
- integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
- dependencies:
- define-property "^1.0.0"
- isobject "^3.0.0"
- snapdragon-util "^3.0.1"
-
-snapdragon-util@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
- integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
- dependencies:
- kind-of "^3.2.0"
-
-snapdragon@^0.8.1:
- version "0.8.2"
- resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
- integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
- dependencies:
- base "^0.11.1"
- debug "^2.2.0"
- define-property "^0.2.5"
- extend-shallow "^2.0.1"
- map-cache "^0.2.2"
- source-map "^0.5.6"
- source-map-resolve "^0.5.0"
- use "^3.1.0"
-
sntp@1.x.x:
version "1.0.9"
resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
@@ -3237,7 +3102,7 @@ sntp@2.x.x:
dependencies:
hoek "4.x.x"
-source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
+source-map-resolve@^0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
@@ -3261,7 +3126,7 @@ source-map-url@^0.4.0:
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
-source-map@^0.5.1, source-map@^0.5.6:
+source-map@^0.5.1:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@@ -3272,21 +3137,21 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
sourcemap-codec@^1.4.4:
- version "1.4.6"
- resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9"
- integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
+ integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
sparkles@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"
integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==
-split-string@^3.0.1, split-string@^3.0.2:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
- integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+split@0.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
+ integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=
dependencies:
- extend-shallow "^3.0.0"
+ through "2"
sprintf-js@~1.0.2:
version "1.0.3"
@@ -3308,30 +3173,54 @@ sshpk@^1.7.0:
jsbn "~0.1.0"
tweetnacl "~0.14.0"
-static-extend@^0.1.1:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
- integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+stream-combiner@~0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14"
+ integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=
dependencies:
- define-property "^0.2.5"
- object-copy "^0.1.0"
+ duplexer "~0.1.1"
-string-width@^1.0.1:
+stream-shift@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
+ integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
+
+stream-to-array@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353"
+ integrity sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=
+ dependencies:
+ any-promise "^1.1.0"
+
+streamifier@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/streamifier/-/streamifier-0.1.1.tgz#97e98d8fa4d105d62a2691d1dc07e820db8dfc4f"
+ integrity sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
+ integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string.prototype.trimend@^1.0.1:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
- integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46"
+ integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==
dependencies:
- code-point-at "^1.0.0"
- is-fullwidth-code-point "^1.0.0"
- strip-ansi "^3.0.0"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.1"
-"string-width@^1.0.2 || 2":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
- integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+string.prototype.trimstart@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7"
+ integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==
dependencies:
- is-fullwidth-code-point "^2.0.0"
- strip-ansi "^4.0.0"
+ define-properties "^1.1.3"
+ es-abstract "^1.18.0-next.1"
string_decoder@^1.1.1, string_decoder@~1.1.1:
version "1.1.1"
@@ -3346,23 +3235,23 @@ string_decoder@~0.10.x:
integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
stringstream@~0.0.4, stringstream@~0.0.5:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72"
- integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+ integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=
-strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+strip-ansi@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
dependencies:
ansi-regex "^2.0.0"
-strip-ansi@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
- integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
dependencies:
- ansi-regex "^3.0.0"
+ ansi-regex "^5.0.0"
strip-bom@2.X:
version "2.0.0"
@@ -3371,34 +3260,11 @@ strip-bom@2.X:
dependencies:
is-utf8 "^0.2.0"
-strip-eof@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
- integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
-
-strip-json-comments@~2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
- integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
-
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
-tar@^4:
- version "4.4.8"
- resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d"
- integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==
- dependencies:
- chownr "^1.1.1"
- fs-minipass "^1.2.5"
- minipass "^2.3.4"
- minizlib "^1.1.1"
- mkdirp "^0.5.0"
- safe-buffer "^5.1.2"
- yallist "^3.0.2"
-
terser@*:
version "4.2.1"
resolved "https://registry.yarnpkg.com/terser/-/terser-4.2.1.tgz#1052cfe17576c66e7bc70fcc7119f22b155bdac1"
@@ -3417,6 +3283,14 @@ terser@4.3.8:
source-map "~0.6.1"
source-map-support "~0.5.12"
+through2-filter@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254"
+ integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==
+ dependencies:
+ through2 "~2.0.0"
+ xtend "~4.0.0"
+
through2@2.X, through2@^2.0.0, through2@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
@@ -3425,6 +3299,19 @@ through2@2.X, through2@^2.0.0, through2@^2.0.3:
readable-stream "^2.1.5"
xtend "~4.0.1"
+through2@~2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+through@2, through@~2.3, through@~2.3.1:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
time-stamp@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
@@ -3437,20 +3324,13 @@ tmp@0.0.29:
dependencies:
os-tmpdir "~1.0.1"
-to-object-path@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
- integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+to-absolute-glob@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b"
+ integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=
dependencies:
- kind-of "^3.0.2"
-
-to-regex-range@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
- integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
- dependencies:
- is-number "^3.0.0"
- repeat-string "^1.6.1"
+ is-absolute "^1.0.0"
+ is-negated-glob "^1.0.0"
to-regex-range@^5.0.1:
version "5.0.1"
@@ -3459,15 +3339,12 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
-to-regex@^3.0.1, to-regex@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
- integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+to-through@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6"
+ integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=
dependencies:
- define-property "^2.0.2"
- extend-shallow "^3.0.2"
- regex-not "^1.0.2"
- safe-regex "^1.1.0"
+ through2 "^2.0.3"
tough-cookie@~2.3.0:
version "2.3.3"
@@ -3483,6 +3360,14 @@ tough-cookie@~2.3.3:
dependencies:
punycode "^1.4.1"
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
ts-morph@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-3.1.3.tgz#bbfa1d14481ee23bdd1c030340ccf4a243cfc844"
@@ -3502,10 +3387,10 @@ tslib@^1.8.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
-tslib@^1.9.3:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
- integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
+tslib@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
+ integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
tsutils@^3.17.1:
version "3.17.1"
@@ -3544,10 +3429,10 @@ typescript@^3.0.1:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977"
integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==
-typescript@^4.1.0-dev.20200824:
- version "4.1.0-dev.20200824"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.0-dev.20200824.tgz#34c92d9b6e5124600658c0d4e9b8c125beaf577d"
- integrity sha512-hTJfocmebnMKoqRw/xs3bL61z87XXtvOUwYtM7zaCX9mAvnfdo1x1bzQlLZAsvdzRIgAHPJQYbqYHKygWkDw6g==
+typescript@^4.2.0-dev.20201119:
+ version "4.2.0-dev.20201119"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.0-dev.20201119.tgz#d4a43511cd9931adac05e1a47b6425f6b0e76cc3"
+ integrity sha512-HIgv+D/0VpVYRTbcVVf9oac/0GtLKMqaufTcPgohNaFWlCOh4lq8syefANgENXTG5Q4VEC6xwDGzHW6EJAVr3A==
typical@^4.0.0:
version "4.0.0"
@@ -3582,33 +3467,30 @@ underscore@^1.8.3:
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
-union-value@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
- integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=
+unique-stream@^2.0.2:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac"
+ integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==
dependencies:
- arr-union "^3.1.0"
- get-value "^2.0.6"
- is-extendable "^0.1.1"
- set-value "^0.4.3"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ through2-filter "^3.0.0"
+
+universal-user-agent@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee"
+ integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==
universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
-unset-value@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
- integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+uri-js@^4.2.2:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602"
+ integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==
dependencies:
- has-value "^0.3.1"
- isobject "^3.0.0"
-
-upath@^1.1.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068"
- integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==
+ punycode "^2.1.0"
urix@^0.1.0:
version "0.1.0"
@@ -3620,11 +3502,6 @@ url-join@^1.1.0:
resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78"
integrity sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=
-use@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
- integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
-
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
@@ -3641,15 +3518,30 @@ uuid@^3.1.0:
integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==
uuid@^3.3.2:
- version "3.3.3"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866"
- integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+uuid@^8.3.0:
+ version "8.3.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31"
+ integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==
validator@~3.35.0:
version "3.35.0"
resolved "https://registry.yarnpkg.com/validator/-/validator-3.35.0.tgz#3f07249402c1fc8fc093c32c6e43d72a79cca1dc"
integrity sha1-PwcklALB/I/Ak8MsbkPXKnnModw=
+validator@~9.4.1:
+ version "9.4.1"
+ resolved "https://registry.yarnpkg.com/validator/-/validator-9.4.1.tgz#abf466d398b561cd243050112c6ff1de6cc12663"
+ integrity sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA==
+
+value-or-function@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
+ integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=
+
verror@1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
@@ -3659,6 +3551,42 @@ verror@1.10.0:
core-util-is "1.0.2"
extsprintf "^1.2.0"
+vinyl-fs@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7"
+ integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==
+ dependencies:
+ fs-mkdirp-stream "^1.0.0"
+ glob-stream "^6.1.0"
+ graceful-fs "^4.0.0"
+ is-valid-glob "^1.0.0"
+ lazystream "^1.0.0"
+ lead "^1.0.0"
+ object.assign "^4.0.4"
+ pumpify "^1.3.5"
+ readable-stream "^2.3.3"
+ remove-bom-buffer "^3.0.0"
+ remove-bom-stream "^1.2.0"
+ resolve-options "^1.1.0"
+ through2 "^2.0.0"
+ to-through "^2.0.0"
+ value-or-function "^3.0.0"
+ vinyl "^2.0.0"
+ vinyl-sourcemap "^1.1.0"
+
+vinyl-sourcemap@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16"
+ integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=
+ dependencies:
+ append-buffer "^1.0.2"
+ convert-source-map "^1.5.0"
+ graceful-fs "^4.1.6"
+ normalize-path "^2.1.1"
+ now-and-later "^2.0.0"
+ remove-bom-buffer "^3.0.0"
+ vinyl "^2.0.0"
+
vinyl-sourcemaps-apply@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"
@@ -3684,6 +3612,18 @@ vinyl@^0.5.0:
clone-stats "^0.0.1"
replace-ext "0.0.1"
+vinyl@^2.0.0, vinyl@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974"
+ integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==
+ dependencies:
+ clone "^2.1.1"
+ clone-buffer "^1.0.0"
+ clone-stats "^1.0.0"
+ cloneable-readable "^1.0.0"
+ remove-trailing-separator "^1.0.1"
+ replace-ext "^1.0.0"
+
vsce@1.48.0:
version "1.48.0"
resolved "https://registry.yarnpkg.com/vsce/-/vsce-1.48.0.tgz#31c1a4c6909c3b8bdc48b3d32cc8c8e94c7113a2"
@@ -3734,32 +3674,25 @@ vso-node-api@6.1.2-preview:
typed-rest-client "^0.9.0"
underscore "^1.8.3"
-which@^1.2.9:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
- integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
- dependencies:
- isexe "^2.0.0"
-
-wide-align@^1.1.0:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
- integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
- dependencies:
- string-width "^1.0.2 || 2"
-
-windows-release@^3.1.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f"
- integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==
- dependencies:
- execa "^1.0.0"
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
wordwrap@~0.0.2:
version "0.0.3"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -3772,6 +3705,13 @@ xml2js@0.2.7:
dependencies:
sax "0.5.2"
+xml2js@0.2.8:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.2.8.tgz#9b81690931631ff09d1957549faf54f4f980b3c2"
+ integrity sha1-m4FpCTFjH/CdGVdUn69U9PmAs8I=
+ dependencies:
+ sax "0.5.x"
+
xml2js@^0.4.17:
version "0.4.19"
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
@@ -3800,15 +3740,50 @@ xmldom@0.1.x:
resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff"
integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==
+xtend@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
xtend@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
-yallist@^3.0.0, yallist@^3.0.2:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
- integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
+y18n@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+ integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^18.1.2:
+ version "18.1.3"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+ integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs@^15.3.0:
+ version "15.4.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+ integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
+ dependencies:
+ cliui "^6.0.0"
+ decamelize "^1.2.0"
+ find-up "^4.1.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^4.2.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^18.1.2"
yauzl@^2.3.1:
version "2.10.0"
diff --git a/cglicenses.json b/cglicenses.json
index 0da22bd9f5..6096fa6b4b 100644
--- a/cglicenses.json
+++ b/cglicenses.json
@@ -359,5 +359,65 @@
"",
"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."
]
+ },
+ {
+ // Reason: The license at https://github.com/acornjs/acorn/blob/master/acorn/LICENSE
+ // cannot be found by the OSS tool automatically.
+ "name": "acorn",
+ "fullLicenseText": [
+ "MIT License",
+ "Copyright (C) 2012-2018 by various contributors (see 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."
+ ]
+ },
+ {
+ // Reason: The license at https://github.com/acornjs/acorn/blob/master/acorn-loose/LICENSE
+ // cannot be found by the OSS tool automatically.
+ "name": "acorn-loose",
+ "fullLicenseText": [
+ "MIT License",
+ "Copyright (C) 2012-2018 by various contributors (see 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."
+ ]
+ },
+ {
+ // Reason: The license at https://github.com/jquery/esprima/blob/master/LICENSE.BSD
+ // cannot be found by the OSS tool automatically.
+ "name": "esprima",
+ "fullLicenseText": [
+ "BSD 2-Clause \"Simplified\" License",
+ "Copyright JS Foundation and other contributors, https://js.foundation/",
+ "",
+ "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.",
+ "",
+ "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 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."
+ ]
+ },
+ {
+ // Reason: The license at https://github.com/LinusU/load-yaml-file/blob/master/readme.md
+ // cannot be found by the OSS tool automatically.
+ "name": "load-yaml-file",
+ "fullLicenseText": [
+ "MIT License",
+ "Copyright (C) 2012-2018 by various contributors (see 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."
+ ]
}
]
diff --git a/cgmanifest.json b/cgmanifest.json
index 859af568b1..656e3f821b 100644
--- a/cgmanifest.json
+++ b/cgmanifest.json
@@ -60,12 +60,12 @@
"git": {
"name": "electron",
"repositoryUrl": "https://github.com/electron/electron",
- "commitHash": "fb03807cd21915ddc3aa2521ba4f5ba14597bd7e"
+ "commitHash": "415c1f9e9b35d9599b1a8ad1200476afa47a3323"
}
},
"isOnlyProductionDependency": true,
"license": "MIT",
- "version": "9.3.0"
+ "version": "9.3.5"
},
{
"component": {
diff --git a/extensions/arc/src/common/promise.ts b/extensions/arc/src/common/promise.ts
index 53f62a287b..321c559c1f 100644
--- a/extensions/arc/src/common/promise.ts
+++ b/extensions/arc/src/common/promise.ts
@@ -12,7 +12,7 @@ export class Deferred {
reject!: (reason?: any) => void;
constructor() {
this.promise = new Promise((resolve, reject) => {
- this.resolve = resolve;
+ this.resolve = resolve;
this.reject = reject;
});
}
diff --git a/extensions/arc/src/common/utils.ts b/extensions/arc/src/common/utils.ts
index 43f97f903d..fbde85dbbf 100644
--- a/extensions/arc/src/common/utils.ts
+++ b/extensions/arc/src/common/utils.ts
@@ -118,7 +118,7 @@ async function promptInputBox(title: string, options: vscode.InputBoxOptions): P
inputBox.value = options.value ?? '';
inputBox.ignoreFocusOut = options.ignoreFocusOut ?? false;
- return new Promise(resolve => {
+ return new Promise(resolve => {
let valueAccepted = false;
inputBox.onDidAccept(async () => {
if (options.validateInput) {
diff --git a/extensions/arc/src/test/models/controllerModel.test.ts b/extensions/arc/src/test/models/controllerModel.test.ts
index 90d4fdabeb..b37f1d5c34 100644
--- a/extensions/arc/src/test/models/controllerModel.test.ts
+++ b/extensions/arc/src/test/models/controllerModel.test.ts
@@ -18,6 +18,10 @@ import { ControllerModel } from '../../models/controllerModel';
import { ConnectToControllerDialog } from '../../ui/dialogs/connectControllerDialog';
import { AzureArcTreeDataProvider } from '../../ui/tree/azureArcTreeDataProvider';
+interface ExtensionGlobalMemento extends vscode.Memento {
+ setKeysForSync(keys: string[]): void;
+}
+
describe('ControllerModel', function (): void {
afterEach(function (): void {
sinon.restore();
@@ -25,11 +29,11 @@ describe('ControllerModel', function (): void {
describe('azdataLogin', function (): void {
let mockExtensionContext: TypeMoq.IMock;
- let mockGlobalState: TypeMoq.IMock;
+ let mockGlobalState: TypeMoq.IMock;
before(function (): void {
mockExtensionContext = TypeMoq.Mock.ofType();
- mockGlobalState = TypeMoq.Mock.ofType();
+ mockGlobalState = TypeMoq.Mock.ofType();
mockExtensionContext.setup(x => x.globalState).returns(() => mockGlobalState.object);
});
diff --git a/extensions/arc/src/test/ui/tree/azureArcTreeDataProvider.test.ts b/extensions/arc/src/test/ui/tree/azureArcTreeDataProvider.test.ts
index 0ef7f22c90..674915e6fb 100644
--- a/extensions/arc/src/test/ui/tree/azureArcTreeDataProvider.test.ts
+++ b/extensions/arc/src/test/ui/tree/azureArcTreeDataProvider.test.ts
@@ -20,11 +20,15 @@ import { MiaaTreeNode } from '../../../ui/tree/miaaTreeNode';
import { FakeControllerModel } from '../../mocks/fakeControllerModel';
import { FakeAzdataApi } from '../../mocks/fakeAzdataApi';
+interface ExtensionGlobalMemento extends vscode.Memento {
+ setKeysForSync(keys: string[]): void;
+}
+
describe('AzureArcTreeDataProvider tests', function (): void {
let treeDataProvider: AzureArcTreeDataProvider;
beforeEach(function (): void {
const mockExtensionContext = TypeMoq.Mock.ofType();
- const mockGlobalState = TypeMoq.Mock.ofType();
+ const mockGlobalState = TypeMoq.Mock.ofType();
mockGlobalState.setup(x => x.update(TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => Promise.resolve());
mockExtensionContext.setup(x => x.globalState).returns(() => mockGlobalState.object);
//treeDataProviderMock = TypeMoq.Mock.ofType();
diff --git a/extensions/azdata/src/common/promise.ts b/extensions/azdata/src/common/promise.ts
index 53f62a287b..321c559c1f 100644
--- a/extensions/azdata/src/common/promise.ts
+++ b/extensions/azdata/src/common/promise.ts
@@ -12,7 +12,7 @@ export class Deferred {
reject!: (reason?: any) => void;
constructor() {
this.promise = new Promise((resolve, reject) => {
- this.resolve = resolve;
+ this.resolve = resolve;
this.reject = reject;
});
}
diff --git a/extensions/azdata/src/common/utils.ts b/extensions/azdata/src/common/utils.ts
index 20106c28bd..326234ba43 100644
--- a/extensions/azdata/src/common/utils.ts
+++ b/extensions/azdata/src/common/utils.ts
@@ -22,7 +22,7 @@ export class NoAzdataError extends Error implements azdataExt.ErrorWithLink {
*/
export function searchForCmd(exe: string): Promise {
// Note : This is separated out to allow for easy test stubbing
- return new Promise((resolve, reject) => which(exe, (err, path) => err ? reject(err) : resolve(path)));
+ return new Promise((resolve, reject) => which(exe, (err, path) => err ? reject(err) : resolve(path)));
}
/**
diff --git a/extensions/azurecore/src/azureResource/providers/resourceTreeDataProviderBase.ts b/extensions/azurecore/src/azureResource/providers/resourceTreeDataProviderBase.ts
index 4d46bbd371..9f469615b8 100644
--- a/extensions/azurecore/src/azureResource/providers/resourceTreeDataProviderBase.ts
+++ b/extensions/azurecore/src/azureResource/providers/resourceTreeDataProviderBase.ts
@@ -34,7 +34,7 @@ export abstract class ResourceTreeDataProviderBase a.treeItem.label.localeCompare(b.treeItem.label));
+ }).sort((a, b) => (a.treeItem.label).localeCompare(b.treeItem.label));
} catch (error) {
console.log(AzureResourceErrorMessageUtil.getErrorMessage(error));
throw error;
diff --git a/extensions/azurecore/src/azureResource/resourceTreeNode.ts b/extensions/azurecore/src/azureResource/resourceTreeNode.ts
index c951bf1381..c85272b19d 100644
--- a/extensions/azurecore/src/azureResource/resourceTreeNode.ts
+++ b/extensions/azurecore/src/azureResource/resourceTreeNode.ts
@@ -60,7 +60,7 @@ export class AzureResourceResourceTreeNode extends TreeNode {
const treeItem = this.resourceNodeWithProviderId.resourceNode.treeItem;
return {
- label: treeItem.label,
+ label: treeItem.label,
isLeaf: treeItem.collapsibleState === TreeItemCollapsibleState.None ? true : false,
errorMessage: undefined,
metadata: undefined,
diff --git a/extensions/azurecore/src/azureResource/tree/flatTreeProvider.ts b/extensions/azurecore/src/azureResource/tree/flatTreeProvider.ts
index 97ae7c283b..f59f1fbb5e 100644
--- a/extensions/azurecore/src/azureResource/tree/flatTreeProvider.ts
+++ b/extensions/azurecore/src/azureResource/tree/flatTreeProvider.ts
@@ -196,7 +196,7 @@ class AzureResourceResourceTreeNode extends TreeNode {
const treeItem = this.resourceNodeWithProviderId.resourceNode.treeItem;
return {
- label: treeItem.label,
+ label: treeItem.label,
isLeaf: treeItem.collapsibleState === vscode.TreeItemCollapsibleState.None ? true : false,
errorMessage: undefined,
metadata: undefined,
diff --git a/extensions/configuration-editing/.vscodeignore b/extensions/configuration-editing/.vscodeignore
index de8e6dc591..c5234c346a 100644
--- a/extensions/configuration-editing/.vscodeignore
+++ b/extensions/configuration-editing/.vscodeignore
@@ -5,3 +5,5 @@ out/**
extension.webpack.config.js
extension-browser.webpack.config.js
yarn.lock
+build/**
+schemas/*.schema.src.json
diff --git a/extensions/configuration-editing/build/inline-allOf.ts b/extensions/configuration-editing/build/inline-allOf.ts
new file mode 100755
index 0000000000..3057e5a6db
--- /dev/null
+++ b/extensions/configuration-editing/build/inline-allOf.ts
@@ -0,0 +1,103 @@
+#!/usr/bin/env ts-node
+
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the Source EULA. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+// Inlines "allOf"s to allow for "additionalProperties": false. (https://github.com/microsoft/vscode-remote-release/issues/2967)
+// Run this manually after updating devContainer.schema.src.json.
+
+import * as fs from 'fs';
+
+function transform(schema: any) {
+
+ const definitions = Object.keys(schema.definitions)
+ .reduce((d, k) => {
+ d[`#/definitions/${k}`] = (schema.definitions as any)[k];
+ return d;
+ }, {} as any);
+
+ function copy(from: any) {
+ const type = Array.isArray(from) ? 'array' : typeof from;
+ switch (type) {
+ case 'object': {
+ const to: any = {};
+ for (const key in from) {
+ switch (key) {
+ case 'definitions':
+ break;
+ case 'oneOf':
+ const list = copy(from[key])
+ .reduce((a: any[], o: any) => {
+ if (o.oneOf) {
+ a.push(...o.oneOf);
+ } else {
+ a.push(o);
+ }
+ return a;
+ }, [] as any[]);
+ if (list.length === 1) {
+ Object.assign(to, list[0]);
+ } else {
+ to.oneOf = list;
+ }
+ break;
+ case 'allOf':
+ const all = copy(from[key]);
+ const leaves = all.map((one: any) => (one.oneOf ? one.oneOf : [one]));
+ function cross(res: any, leaves: any[][]): any[] {
+ if (leaves.length) {
+ const rest = leaves.slice(1);
+ return ([] as any[]).concat(...leaves[0].map(leaf => {
+ const intermediate = { ...res, ...leaf };
+ if ('properties' in res && 'properties' in leaf) {
+ intermediate.properties = {
+ ...res.properties,
+ ...leaf.properties,
+ };
+ }
+ return cross(intermediate, rest);
+ }));
+ }
+ return [res];
+ }
+ const list2 = cross({}, leaves);
+ if (list2.length === 1) {
+ Object.assign(to, list2[0]);
+ } else {
+ to.oneOf = list2;
+ }
+ break;
+ case '$ref':
+ const ref = from[key];
+ const definition = definitions[ref];
+ if (definition) {
+ Object.assign(to, copy(definition));
+ } else {
+ to[key] = ref;
+ }
+ break;
+ default:
+ to[key] = copy(from[key]);
+ break;
+ }
+ }
+ if (to.type === 'object' && !('additionalProperties' in to)) {
+ to.additionalProperties = false;
+ }
+ return to;
+ }
+ case 'array': {
+ return from.map(copy);
+ }
+ default:
+ return from;
+ }
+ }
+
+ return copy(schema);
+}
+
+const devContainer = JSON.parse(fs.readFileSync('../schemas/devContainer.schema.src.json', 'utf8'));
+fs.writeFileSync('../schemas/devContainer.schema.generated.json', JSON.stringify(transform(devContainer), undefined, ' '));
diff --git a/extensions/configuration-editing/build/tsconfig.json b/extensions/configuration-editing/build/tsconfig.json
new file mode 100644
index 0000000000..0ac2f0ded8
--- /dev/null
+++ b/extensions/configuration-editing/build/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../shared.tsconfig.json",
+ "compilerOptions": {
+ "resolveJsonModule": true,
+ "outDir": "./out"
+ }
+}
diff --git a/extensions/configuration-editing/package.json b/extensions/configuration-editing/package.json
index 3afe9fa433..4234004132 100644
--- a/extensions/configuration-editing/package.json
+++ b/extensions/configuration-editing/package.json
@@ -111,11 +111,11 @@
},
{
"fileMatch": "/.devcontainer/devcontainer.json",
- "url": "./schemas/devContainer.schema.json"
+ "url": "./schemas/devContainer.schema.generated.json"
},
{
"fileMatch": "/.devcontainer.json",
- "url": "./schemas/devContainer.schema.json"
+ "url": "./schemas/devContainer.schema.generated.json"
},
{
"fileMatch": "%APP_SETTINGS_HOME%/globalStorage/ms-vscode-remote.remote-containers/nameConfigs/*.json",
diff --git a/extensions/configuration-editing/schemas/attachContainer.schema.json b/extensions/configuration-editing/schemas/attachContainer.schema.json
index 2b7952446f..b3b8653339 100644
--- a/extensions/configuration-editing/schemas/attachContainer.schema.json
+++ b/extensions/configuration-editing/schemas/attachContainer.schema.json
@@ -21,7 +21,7 @@
},
"settings": {
"$ref": "vscode://schemas/settings/machine",
- "description": "Machine specific settings that should be copied into the container."
+ "description": "Machine specific settings that should be copied into the container. These are only copied when connecting to the container for the first time."
},
"remoteEnv": {
"type": "object",
@@ -31,7 +31,7 @@
"null"
]
},
- "description": "Remote environment variables."
+ "description": "Remote environment variables. If these are used in the Integrated Terminal, make sure the 'Terminal > Integrated: Inherit Env' setting is enabled."
},
"remoteUser": {
"type": "string",
diff --git a/extensions/configuration-editing/schemas/devContainer.schema.generated.json b/extensions/configuration-editing/schemas/devContainer.schema.generated.json
new file mode 100644
index 0000000000..8cdf40090d
--- /dev/null
+++ b/extensions/configuration-editing/schemas/devContainer.schema.generated.json
@@ -0,0 +1,832 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "description": "Defines a dev container",
+ "allowComments": true,
+ "allowTrailingCommas": true,
+ "oneOf": [
+ {
+ "type": "object",
+ "properties": {
+ "build": {
+ "type": "object",
+ "description": "Docker build-related options.",
+ "properties": {
+ "dockerfile": {
+ "type": "string",
+ "description": "The location of the Dockerfile that defines the contents of the container. The path is relative to the folder containing the `devcontainer.json` file."
+ },
+ "context": {
+ "type": "string",
+ "description": "The location of the context folder for building the Docker image. The path is relative to the folder containing the `devcontainer.json` file."
+ },
+ "target": {
+ "type": "string",
+ "description": "Target stage in a multi-stage build."
+ },
+ "args": {
+ "type": "object",
+ "additionalProperties": {
+ "type": [
+ "string"
+ ]
+ },
+ "description": "Build arguments."
+ }
+ },
+ "required": [
+ "dockerfile"
+ ],
+ "additionalProperties": false
+ },
+ "appPort": {
+ "type": [
+ "integer",
+ "string",
+ "array"
+ ],
+ "description": "Application ports that are exposed by the container. This can be a single port or an array of ports. Each port can be a number or a string. A number is mapped to the same port on the host. A string is passed to Docker unchanged and can be used to map ports differently, e.g. \"8000:8010\".",
+ "items": {
+ "type": [
+ "integer",
+ "string"
+ ]
+ }
+ },
+ "containerEnv": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "Container environment variables."
+ },
+ "containerUser": {
+ "type": "string",
+ "description": "The user the container will be started with. The default is the user on the Docker image."
+ },
+ "updateRemoteUserUID": {
+ "type": "boolean",
+ "description": "Controls whether on Linux the container's user should be updated with the local user's UID and GID. On by default."
+ },
+ "mounts": {
+ "type": "array",
+ "description": "Mount points to set up when creating the container. See Docker's documentation for the --mount option for the supported syntax.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "runArgs": {
+ "type": "array",
+ "description": "The arguments required when starting in the container.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "shutdownAction": {
+ "type": "string",
+ "enum": [
+ "none",
+ "stopContainer"
+ ],
+ "description": "Action to take when the VS Code window is closed. The default is to stop the container."
+ },
+ "overrideCommand": {
+ "type": "boolean",
+ "description": "Whether to overwrite the command specified in the image. The default is true."
+ },
+ "workspaceFolder": {
+ "type": "string",
+ "description": "The path of the workspace folder inside the container."
+ },
+ "workspaceMount": {
+ "type": "string",
+ "description": "The --mount parameter for docker run. The default is to mount the project folder at /workspaces/$project."
+ },
+ "name": {
+ "type": "string",
+ "description": "A name to show for the workspace folder."
+ },
+ "extensions": {
+ "type": "array",
+ "description": "An array of extensions that should be installed into the container.",
+ "items": {
+ "type": "string",
+ "pattern": "^([a-z0-9A-Z][a-z0-9\\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\\-A-Z]*)(@(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?$",
+ "errorMessage": "Expected format: '${publisher}.${name}' or '${publisher}.${name}@${version}'. Example: 'ms-dotnettools.csharp'."
+ }
+ },
+ "settings": {
+ "$ref": "vscode://schemas/settings/machine",
+ "description": "Machine specific settings that should be copied into the container. These are only copied when connecting to the container for the first time, rebuilding the container then triggers it again."
+ },
+ "forwardPorts": {
+ "type": "array",
+ "description": "Ports that are forwarded from the container to the local machine.",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 0
+ }
+ },
+ "remoteEnv": {
+ "type": "object",
+ "additionalProperties": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "description": "Remote environment variables. If these are used in the Integrated Terminal, make sure the 'Terminal > Integrated: Inherit Env' setting is enabled."
+ },
+ "remoteUser": {
+ "type": "string",
+ "description": "The user VS Code Server will be started with. The default is the same user as the container."
+ },
+ "initializeCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run locally before anything else. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postCreateCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after creating the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postStartCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after starting the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postAttachCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after attaching to the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "devPort": {
+ "type": "integer",
+ "description": "The port VS Code can use to connect to its backend."
+ },
+ "userEnvProbe": {
+ "type": "string",
+ "enum": [
+ "none",
+ "loginShell",
+ "loginInteractiveShell",
+ "interactiveShell"
+ ],
+ "description": "User environment probe to run. The default is none."
+ },
+ "codespaces": {
+ "type": "object",
+ "additionalProperties": true,
+ "description": "Codespaces-specific configuration."
+ }
+ },
+ "required": [
+ "build"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "dockerFile": {
+ "type": "string",
+ "description": "The location of the Dockerfile that defines the contents of the container. The path is relative to the folder containing the `devcontainer.json` file."
+ },
+ "context": {
+ "type": "string",
+ "description": "The location of the context folder for building the Docker image. The path is relative to the folder containing the `devcontainer.json` file."
+ },
+ "build": {
+ "description": "Docker build-related options.",
+ "type": "object",
+ "properties": {
+ "target": {
+ "type": "string",
+ "description": "Target stage in a multi-stage build."
+ },
+ "args": {
+ "type": "object",
+ "additionalProperties": {
+ "type": [
+ "string"
+ ]
+ },
+ "description": "Build arguments."
+ }
+ },
+ "additionalProperties": false
+ },
+ "appPort": {
+ "type": [
+ "integer",
+ "string",
+ "array"
+ ],
+ "description": "Application ports that are exposed by the container. This can be a single port or an array of ports. Each port can be a number or a string. A number is mapped to the same port on the host. A string is passed to Docker unchanged and can be used to map ports differently, e.g. \"8000:8010\".",
+ "items": {
+ "type": [
+ "integer",
+ "string"
+ ]
+ }
+ },
+ "containerEnv": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "Container environment variables."
+ },
+ "containerUser": {
+ "type": "string",
+ "description": "The user the container will be started with. The default is the user on the Docker image."
+ },
+ "updateRemoteUserUID": {
+ "type": "boolean",
+ "description": "Controls whether on Linux the container's user should be updated with the local user's UID and GID. On by default."
+ },
+ "mounts": {
+ "type": "array",
+ "description": "Mount points to set up when creating the container. See Docker's documentation for the --mount option for the supported syntax.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "runArgs": {
+ "type": "array",
+ "description": "The arguments required when starting in the container.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "shutdownAction": {
+ "type": "string",
+ "enum": [
+ "none",
+ "stopContainer"
+ ],
+ "description": "Action to take when the VS Code window is closed. The default is to stop the container."
+ },
+ "overrideCommand": {
+ "type": "boolean",
+ "description": "Whether to overwrite the command specified in the image. The default is true."
+ },
+ "workspaceFolder": {
+ "type": "string",
+ "description": "The path of the workspace folder inside the container."
+ },
+ "workspaceMount": {
+ "type": "string",
+ "description": "The --mount parameter for docker run. The default is to mount the project folder at /workspaces/$project."
+ },
+ "name": {
+ "type": "string",
+ "description": "A name to show for the workspace folder."
+ },
+ "extensions": {
+ "type": "array",
+ "description": "An array of extensions that should be installed into the container.",
+ "items": {
+ "type": "string",
+ "pattern": "^([a-z0-9A-Z][a-z0-9\\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\\-A-Z]*)(@(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?$",
+ "errorMessage": "Expected format: '${publisher}.${name}' or '${publisher}.${name}@${version}'. Example: 'ms-dotnettools.csharp'."
+ }
+ },
+ "settings": {
+ "$ref": "vscode://schemas/settings/machine",
+ "description": "Machine specific settings that should be copied into the container. These are only copied when connecting to the container for the first time, rebuilding the container then triggers it again."
+ },
+ "forwardPorts": {
+ "type": "array",
+ "description": "Ports that are forwarded from the container to the local machine.",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 0
+ }
+ },
+ "remoteEnv": {
+ "type": "object",
+ "additionalProperties": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "description": "Remote environment variables. If these are used in the Integrated Terminal, make sure the 'Terminal > Integrated: Inherit Env' setting is enabled."
+ },
+ "remoteUser": {
+ "type": "string",
+ "description": "The user VS Code Server will be started with. The default is the same user as the container."
+ },
+ "initializeCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run locally before anything else. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postCreateCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after creating the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postStartCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after starting the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postAttachCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after attaching to the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "devPort": {
+ "type": "integer",
+ "description": "The port VS Code can use to connect to its backend."
+ },
+ "userEnvProbe": {
+ "type": "string",
+ "enum": [
+ "none",
+ "loginShell",
+ "loginInteractiveShell",
+ "interactiveShell"
+ ],
+ "description": "User environment probe to run. The default is none."
+ },
+ "codespaces": {
+ "type": "object",
+ "additionalProperties": true,
+ "description": "Codespaces-specific configuration."
+ }
+ },
+ "required": [
+ "dockerFile"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "image": {
+ "type": "string",
+ "description": "The docker image that will be used to create the container."
+ },
+ "appPort": {
+ "type": [
+ "integer",
+ "string",
+ "array"
+ ],
+ "description": "Application ports that are exposed by the container. This can be a single port or an array of ports. Each port can be a number or a string. A number is mapped to the same port on the host. A string is passed to Docker unchanged and can be used to map ports differently, e.g. \"8000:8010\".",
+ "items": {
+ "type": [
+ "integer",
+ "string"
+ ]
+ }
+ },
+ "containerEnv": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "Container environment variables."
+ },
+ "containerUser": {
+ "type": "string",
+ "description": "The user the container will be started with. The default is the user on the Docker image."
+ },
+ "updateRemoteUserUID": {
+ "type": "boolean",
+ "description": "Controls whether on Linux the container's user should be updated with the local user's UID and GID. On by default."
+ },
+ "mounts": {
+ "type": "array",
+ "description": "Mount points to set up when creating the container. See Docker's documentation for the --mount option for the supported syntax.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "runArgs": {
+ "type": "array",
+ "description": "The arguments required when starting in the container.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "shutdownAction": {
+ "type": "string",
+ "enum": [
+ "none",
+ "stopContainer"
+ ],
+ "description": "Action to take when the VS Code window is closed. The default is to stop the container."
+ },
+ "overrideCommand": {
+ "type": "boolean",
+ "description": "Whether to overwrite the command specified in the image. The default is true."
+ },
+ "workspaceFolder": {
+ "type": "string",
+ "description": "The path of the workspace folder inside the container."
+ },
+ "workspaceMount": {
+ "type": "string",
+ "description": "The --mount parameter for docker run. The default is to mount the project folder at /workspaces/$project."
+ },
+ "name": {
+ "type": "string",
+ "description": "A name to show for the workspace folder."
+ },
+ "extensions": {
+ "type": "array",
+ "description": "An array of extensions that should be installed into the container.",
+ "items": {
+ "type": "string",
+ "pattern": "^([a-z0-9A-Z][a-z0-9\\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\\-A-Z]*)(@(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?$",
+ "errorMessage": "Expected format: '${publisher}.${name}' or '${publisher}.${name}@${version}'. Example: 'ms-dotnettools.csharp'."
+ }
+ },
+ "settings": {
+ "$ref": "vscode://schemas/settings/machine",
+ "description": "Machine specific settings that should be copied into the container. These are only copied when connecting to the container for the first time, rebuilding the container then triggers it again."
+ },
+ "forwardPorts": {
+ "type": "array",
+ "description": "Ports that are forwarded from the container to the local machine.",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 0
+ }
+ },
+ "remoteEnv": {
+ "type": "object",
+ "additionalProperties": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "description": "Remote environment variables. If these are used in the Integrated Terminal, make sure the 'Terminal > Integrated: Inherit Env' setting is enabled."
+ },
+ "remoteUser": {
+ "type": "string",
+ "description": "The user VS Code Server will be started with. The default is the same user as the container."
+ },
+ "initializeCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run locally before anything else. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postCreateCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after creating the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postStartCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after starting the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postAttachCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after attaching to the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "devPort": {
+ "type": "integer",
+ "description": "The port VS Code can use to connect to its backend."
+ },
+ "userEnvProbe": {
+ "type": "string",
+ "enum": [
+ "none",
+ "loginShell",
+ "loginInteractiveShell",
+ "interactiveShell"
+ ],
+ "description": "User environment probe to run. The default is none."
+ },
+ "codespaces": {
+ "type": "object",
+ "additionalProperties": true,
+ "description": "Codespaces-specific configuration."
+ }
+ },
+ "required": [
+ "image"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "dockerComposeFile": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "The name of the docker-compose file(s) used to start the services.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "service": {
+ "type": "string",
+ "description": "The service you want to work on."
+ },
+ "runServices": {
+ "type": "array",
+ "description": "An array of services that should be started and stopped.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "workspaceFolder": {
+ "type": "string",
+ "description": "The path of the workspace folder inside the container. This is typically the target path of a volume mount in the docker-compose.yml."
+ },
+ "shutdownAction": {
+ "type": "string",
+ "enum": [
+ "none",
+ "stopCompose"
+ ],
+ "description": "Action to take when the VS Code window is closed. The default is to stop the containers."
+ },
+ "name": {
+ "type": "string",
+ "description": "A name to show for the workspace folder."
+ },
+ "extensions": {
+ "type": "array",
+ "description": "An array of extensions that should be installed into the container.",
+ "items": {
+ "type": "string",
+ "pattern": "^([a-z0-9A-Z][a-z0-9\\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\\-A-Z]*)(@(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?$",
+ "errorMessage": "Expected format: '${publisher}.${name}' or '${publisher}.${name}@${version}'. Example: 'ms-dotnettools.csharp'."
+ }
+ },
+ "settings": {
+ "$ref": "vscode://schemas/settings/machine",
+ "description": "Machine specific settings that should be copied into the container. These are only copied when connecting to the container for the first time, rebuilding the container then triggers it again."
+ },
+ "forwardPorts": {
+ "type": "array",
+ "description": "Ports that are forwarded from the container to the local machine.",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 0
+ }
+ },
+ "remoteEnv": {
+ "type": "object",
+ "additionalProperties": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "description": "Remote environment variables. If these are used in the Integrated Terminal, make sure the 'Terminal > Integrated: Inherit Env' setting is enabled."
+ },
+ "remoteUser": {
+ "type": "string",
+ "description": "The user VS Code Server will be started with. The default is the same user as the container."
+ },
+ "initializeCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run locally before anything else. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postCreateCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after creating the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postStartCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after starting the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postAttachCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after attaching to the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "devPort": {
+ "type": "integer",
+ "description": "The port VS Code can use to connect to its backend."
+ },
+ "userEnvProbe": {
+ "type": "string",
+ "enum": [
+ "none",
+ "loginShell",
+ "loginInteractiveShell",
+ "interactiveShell"
+ ],
+ "description": "User environment probe to run. The default is none."
+ },
+ "codespaces": {
+ "type": "object",
+ "additionalProperties": true,
+ "description": "Codespaces-specific configuration."
+ }
+ },
+ "required": [
+ "dockerComposeFile",
+ "service",
+ "workspaceFolder"
+ ],
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "A name to show for the workspace folder."
+ },
+ "extensions": {
+ "type": "array",
+ "description": "An array of extensions that should be installed into the container.",
+ "items": {
+ "type": "string",
+ "pattern": "^([a-z0-9A-Z][a-z0-9\\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\\-A-Z]*)(@(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)?$",
+ "errorMessage": "Expected format: '${publisher}.${name}' or '${publisher}.${name}@${version}'. Example: 'ms-dotnettools.csharp'."
+ }
+ },
+ "settings": {
+ "$ref": "vscode://schemas/settings/machine",
+ "description": "Machine specific settings that should be copied into the container. These are only copied when connecting to the container for the first time, rebuilding the container then triggers it again."
+ },
+ "forwardPorts": {
+ "type": "array",
+ "description": "Ports that are forwarded from the container to the local machine.",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 0
+ }
+ },
+ "remoteEnv": {
+ "type": "object",
+ "additionalProperties": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "description": "Remote environment variables. If these are used in the Integrated Terminal, make sure the 'Terminal > Integrated: Inherit Env' setting is enabled."
+ },
+ "remoteUser": {
+ "type": "string",
+ "description": "The user VS Code Server will be started with. The default is the same user as the container."
+ },
+ "initializeCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run locally before anything else. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postCreateCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after creating the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postStartCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after starting the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "postAttachCommand": {
+ "type": [
+ "string",
+ "array"
+ ],
+ "description": "A command to run after attaching to the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "devPort": {
+ "type": "integer",
+ "description": "The port VS Code can use to connect to its backend."
+ },
+ "userEnvProbe": {
+ "type": "string",
+ "enum": [
+ "none",
+ "loginShell",
+ "loginInteractiveShell",
+ "interactiveShell"
+ ],
+ "description": "User environment probe to run. The default is none."
+ },
+ "codespaces": {
+ "type": "object",
+ "additionalProperties": true,
+ "description": "Codespaces-specific configuration."
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+}
\ No newline at end of file
diff --git a/extensions/configuration-editing/schemas/devContainer.schema.json b/extensions/configuration-editing/schemas/devContainer.schema.src.json
similarity index 95%
rename from extensions/configuration-editing/schemas/devContainer.schema.json
rename to extensions/configuration-editing/schemas/devContainer.schema.src.json
index b37e07fa65..ba140ba943 100644
--- a/extensions/configuration-editing/schemas/devContainer.schema.json
+++ b/extensions/configuration-editing/schemas/devContainer.schema.src.json
@@ -3,7 +3,6 @@
"description": "Defines a dev container",
"allowComments": true,
"allowTrailingCommas": true,
- "type": "object",
"definitions": {
"devContainerCommon": {
"type": "object",
@@ -23,7 +22,7 @@
},
"settings": {
"$ref": "vscode://schemas/settings/machine",
- "description": "Machine specific settings that should be copied into the container."
+ "description": "Machine specific settings that should be copied into the container. These are only copied when connecting to the container for the first time, rebuilding the container then triggers it again."
},
"forwardPorts": {
"type": "array",
@@ -42,7 +41,7 @@
"null"
]
},
- "description": "Remote environment variables."
+ "description": "Remote environment variables. If these are used in the Integrated Terminal, make sure the 'Terminal > Integrated: Inherit Env' setting is enabled."
},
"remoteUser": {
"type": "string",
@@ -104,6 +103,7 @@
},
"codespaces": {
"type": "object",
+ "additionalProperties": true,
"description": "Codespaces-specific configuration."
}
}
@@ -298,7 +298,7 @@
},
"workspaceFolder": {
"type": "string",
- "description": "The path of the workspace folder inside the container."
+ "description": "The path of the workspace folder inside the container. This is typically the target path of a volume mount in the docker-compose.yml."
},
"shutdownAction": {
"type": "string",
diff --git a/extensions/dacpac/src/test/testContext.ts b/extensions/dacpac/src/test/testContext.ts
index 823b300a7e..1dbe2e0b56 100644
--- a/extensions/dacpac/src/test/testContext.ts
+++ b/extensions/dacpac/src/test/testContext.ts
@@ -24,8 +24,9 @@ export function createContext(): TestContext {
update: () => { return Promise.resolve(); }
},
globalState: {
- get: () => { return Promise.resolve(); },
- update: () => { return Promise.resolve(); }
+ setKeysForSync: (): void => { },
+ get: (): any | undefined => { return Promise.resolve(); },
+ update: (): Thenable => { return Promise.resolve(); }
},
extensionPath: extensionPath,
asAbsolutePath: () => { return ''; },
diff --git a/extensions/dacpac/src/wizard/api/basePage.ts b/extensions/dacpac/src/wizard/api/basePage.ts
index ae31fd10cb..91ae1c2162 100644
--- a/extensions/dacpac/src/wizard/api/basePage.ts
+++ b/extensions/dacpac/src/wizard/api/basePage.ts
@@ -27,12 +27,12 @@ export abstract class BasePage {
/**
* This method constructs all the elements of the page.
*/
- public async abstract start(): Promise;
+ public abstract start(): Promise;
/**
* This method is called when the user is entering the page.
*/
- public async abstract onPageEnter(): Promise;
+ public abstract onPageEnter(): Promise;
/**
* This method is called when the user is leaving the page.
diff --git a/extensions/data-workspace/src/test/workspaceService.test.ts b/extensions/data-workspace/src/test/workspaceService.test.ts
index 12cfd1c1fe..bc534b5dd6 100644
--- a/extensions/data-workspace/src/test/workspaceService.test.ts
+++ b/extensions/data-workspace/src/test/workspaceService.test.ts
@@ -63,9 +63,13 @@ function createMockExtension(id: string, isActive: boolean, projectTypes: string
};
}
+interface ExtensionGlobalMemento extends vscode.Memento {
+ setKeysForSync(keys: string[]): void;
+}
+
suite('WorkspaceService Tests', function (): void {
const mockExtensionContext = TypeMoq.Mock.ofType();
- const mockGlobalState = TypeMoq.Mock.ofType();
+ const mockGlobalState = TypeMoq.Mock.ofType();
mockGlobalState.setup(x => x.update(TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => Promise.resolve());
mockExtensionContext.setup(x => x.globalState).returns(() => mockGlobalState.object);
diff --git a/extensions/data-workspace/src/test/workspaceTreeDataProvider.test.ts b/extensions/data-workspace/src/test/workspaceTreeDataProvider.test.ts
index 81b6b6b0c3..5fcbe08d36 100644
--- a/extensions/data-workspace/src/test/workspaceTreeDataProvider.test.ts
+++ b/extensions/data-workspace/src/test/workspaceTreeDataProvider.test.ts
@@ -13,9 +13,13 @@ import { WorkspaceService } from '../services/workspaceService';
import { IProjectProvider, WorkspaceTreeItem } from 'dataworkspace';
import { MockTreeDataProvider } from './projectProviderRegistry.test';
+interface ExtensionGlobalMemento extends vscode.Memento {
+ setKeysForSync(keys: string[]): void;
+}
+
suite('workspaceTreeDataProvider Tests', function (): void {
const mockExtensionContext = TypeMoq.Mock.ofType();
- const mockGlobalState = TypeMoq.Mock.ofType();
+ const mockGlobalState = TypeMoq.Mock.ofType();
mockGlobalState.setup(x => x.update(TypeMoq.It.isAny(), TypeMoq.It.isAny())).returns(() => Promise.resolve());
mockExtensionContext.setup(x => x.globalState).returns(() => mockGlobalState.object);
diff --git a/extensions/git/build/update-emoji.js b/extensions/git/build/update-emoji.js
new file mode 100644
index 0000000000..10d8217c71
--- /dev/null
+++ b/extensions/git/build/update-emoji.js
@@ -0,0 +1,101 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the Source EULA. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+/* eslint-disable @typescript-eslint/no-var-requires */
+const fs = require('fs');
+const https = require('https');
+const path = require('path');
+
+async function generate() {
+ /**
+ * @type {Map}
+ */
+ const shortcodeMap = new Map();
+
+ // Get emoji data from https://github.com/milesj/emojibase
+ // https://github.com/milesj/emojibase/
+
+ const files = ['github.raw.json'] //, 'emojibase.raw.json']; //, 'iamcal.raw.json', 'joypixels.raw.json'];
+
+ for (const file of files) {
+ await download(
+ `https://raw.githubusercontent.com/milesj/emojibase/master/packages/data/en/shortcodes/${file}`,
+ file,
+ );
+
+ /**
+ * @type {Record}}
+ */
+ // eslint-disable-next-line import/no-dynamic-require
+ const data = require(path.join(process.cwd(), file));
+ for (const [emojis, codes] of Object.entries(data)) {
+ const emoji = emojis
+ .split('-')
+ .map(c => String.fromCodePoint(parseInt(c, 16)))
+ .join('');
+ for (const code of Array.isArray(codes) ? codes : [codes]) {
+ if (shortcodeMap.has(code)) {
+ // console.warn(`${file}: ${code}`);
+ continue;
+ }
+ shortcodeMap.set(code, emoji);
+ }
+ }
+
+ fs.unlink(file, () => { });
+ }
+
+ // Get gitmoji data from https://github.com/carloscuesta/gitmoji
+ // https://github.com/carloscuesta/gitmoji/blob/master/src/data/gitmojis.json
+ await download(
+ 'https://raw.githubusercontent.com/carloscuesta/gitmoji/master/src/data/gitmojis.json',
+ 'gitmojis.json',
+ );
+
+ /**
+ * @type {({ code: string; emoji: string })[]}
+ */
+ // eslint-disable-next-line import/no-dynamic-require
+ const gitmojis = require(path.join(process.cwd(), 'gitmojis.json')).gitmojis;
+ for (const emoji of gitmojis) {
+ if (emoji.code.startsWith(':') && emoji.code.endsWith(':')) {
+ emoji.code = emoji.code.substring(1, emoji.code.length - 2);
+ }
+
+ if (shortcodeMap.has(emoji.code)) {
+ // console.warn(`GitHub: ${emoji.code}`);
+ continue;
+ }
+ shortcodeMap.set(emoji.code, emoji.emoji);
+ }
+
+ fs.unlink('gitmojis.json', () => { });
+
+ // Sort the emojis for easier diff checking
+ const list = [...shortcodeMap.entries()];
+ list.sort();
+
+ const map = list.reduce((m, [key, value]) => {
+ m[key] = value;
+ return m;
+ }, Object.create(null));
+
+ fs.writeFileSync(path.join(process.cwd(), 'resources/emojis.json'), JSON.stringify(map), 'utf8');
+}
+
+function download(url, destination) {
+ return new Promise(resolve => {
+ const stream = fs.createWriteStream(destination);
+ https.get(url, rsp => {
+ rsp.pipe(stream);
+ stream.on('finish', () => {
+ stream.close();
+ resolve();
+ });
+ });
+ });
+}
+
+void generate();
diff --git a/extensions/git/package.json b/extensions/git/package.json
index 6570b4a36c..82294853de 100644
--- a/extensions/git/package.json
+++ b/extensions/git/package.json
@@ -22,6 +22,7 @@
"scripts": {
"compile": "gulp compile-extension:git",
"watch": "gulp watch-extension:git",
+ "update-emoji": "node ./build/update-emoji.js",
"update-grammar": "node ./build/update-grammars.js",
"test": "mocha"
},
@@ -37,6 +38,11 @@
"title": "%command.clone%",
"category": "Git"
},
+ {
+ "command": "git.cloneRecursive",
+ "title": "%command.cloneRecursive%",
+ "category": "Git"
+ },
{
"command": "git.init",
"title": "%command.init%",
@@ -175,6 +181,12 @@
"category": "Git",
"icon": "$(discard)"
},
+ {
+ "command": "git.rename",
+ "title": "%command.rename%",
+ "category": "Git",
+ "icon": "$(discard)"
+ },
{
"command": "git.commit",
"title": "%command.commit%",
@@ -272,6 +284,11 @@
"title": "%command.checkout%",
"category": "Git"
},
+ {
+ "command": "git.checkoutDetached",
+ "title": "%command.checkoutDetached%",
+ "category": "Git"
+ },
{
"command": "git.branch",
"title": "%command.branch%",
@@ -297,6 +314,11 @@
"title": "%command.merge%",
"category": "Git"
},
+ {
+ "command": "git.rebase",
+ "title": "%command.rebase%",
+ "category": "Git"
+ },
{
"command": "git.createTag",
"title": "%command.createTag%",
@@ -357,6 +379,11 @@
"title": "%command.pushToForce%",
"category": "Git"
},
+ {
+ "command": "git.pushTags",
+ "title": "%command.pushTags%",
+ "category": "Git"
+ },
{
"command": "git.pushWithTags",
"title": "%command.pushFollowTags%",
@@ -367,6 +394,11 @@
"title": "%command.pushFollowTagsForce%",
"category": "Git"
},
+ {
+ "command": "git.cherryPick",
+ "title": "%command.cherryPick%",
+ "category": "Git"
+ },
{
"command": "git.addRemote",
"title": "%command.addRemote%",
@@ -494,6 +526,10 @@
"command": "git.clone",
"when": "config.git.enabled && !git.missing"
},
+ {
+ "command": "git.cloneRecursive",
+ "when": "config.git.enabled && !git.missing"
+ },
{
"command": "git.init",
"when": "config.git.enabled && !git.missing"
@@ -590,6 +626,10 @@
"command": "git.cleanAllUntracked",
"when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"
},
+ {
+ "command": "git.rename",
+ "when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && resourceScheme == file"
+ },
{
"command": "git.commit",
"when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"
@@ -622,6 +662,10 @@
"command": "git.commitAllAmend",
"when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"
},
+ {
+ "command": "git.rebaseAbort",
+ "when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && gitRebaseInProgress"
+ },
{
"command": "git.commitNoVerify",
"when": "config.git.enabled && !git.missing && config.git.allowNoVerifyCommit && gitOpenRepositoryCount != 0"
@@ -686,6 +730,10 @@
"command": "git.renameBranch",
"when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"
},
+ {
+ "command": "git.cherryPick",
+ "when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"
+ },
{
"command": "git.pull",
"when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"
@@ -702,6 +750,10 @@
"command": "git.merge",
"when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"
},
+ {
+ "command": "git.rebase",
+ "when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"
+ },
{
"command": "git.createTag",
"when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"
@@ -746,6 +798,10 @@
"command": "git.pushWithTagsForce",
"when": "config.git.enabled && !git.missing && config.git.allowForcePush && gitOpenRepositoryCount != 0"
},
+ {
+ "command": "git.pushTags",
+ "when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"
+ },
{
"command": "git.addRemote",
"when": "config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"
@@ -876,6 +932,11 @@
"group": "2_main@6",
"when": "scmProvider == git"
},
+ {
+ "submenu": "git.tags",
+ "group": "2_main@7",
+ "when": "scmProvider == git"
+ },
{
"command": "git.showOutput",
"group": "3_footer",
@@ -1251,17 +1312,17 @@
{
"command": "git.stageSelectedRanges",
"group": "2_git@1",
- "when": "isInDiffRightEditor && config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme =~ /^git$|^file$/"
+ "when": "isInDiffRightEditor && !isInEmbeddedDiffEditor && config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme =~ /^git$|^file$/"
},
{
"command": "git.unstageSelectedRanges",
"group": "2_git@2",
- "when": "isInDiffRightEditor && config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme =~ /^git$|^file$/"
+ "when": "isInDiffRightEditor && !isInEmbeddedDiffEditor && config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme =~ /^git$|^file$/"
},
{
"command": "git.revertSelectedRanges",
"group": "2_git@3",
- "when": "isInDiffRightEditor && config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme =~ /^git$|^file$/"
+ "when": "isInDiffRightEditor && !isInEmbeddedDiffEditor && config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme =~ /^git$|^file$/"
}
],
"scm/change/title": [
@@ -1366,114 +1427,145 @@
],
"git.changes": [
{
- "command": "git.stageAll"
+ "command": "git.stageAll",
+ "group": "changes@1"
},
{
- "command": "git.unstageAll"
+ "command": "git.unstageAll",
+ "group": "changes@2"
},
{
- "command": "git.cleanAll"
+ "command": "git.cleanAll",
+ "group": "changes@3"
}
],
"git.pullpush": [
{
"command": "git.sync",
- "group": "1_sync"
+ "group": "1_sync@1"
},
{
"command": "git.syncRebase",
"when": "gitState == idle",
- "group": "1_sync"
+ "group": "1_sync@2"
},
{
"command": "git.pull",
- "group": "2_pull"
+ "group": "2_pull@1"
},
{
"command": "git.pullRebase",
- "group": "2_pull"
+ "group": "2_pull@2"
},
{
"command": "git.pullFrom",
- "group": "2_pull"
+ "group": "2_pull@3"
},
{
"command": "git.push",
- "group": "3_push"
+ "group": "3_push@1"
},
{
"command": "git.pushForce",
"when": "config.git.allowForcePush",
- "group": "3_push"
+ "group": "3_push@2"
},
{
"command": "git.pushTo",
- "group": "3_push"
+ "group": "3_push@3"
},
{
"command": "git.pushToForce",
"when": "config.git.allowForcePush",
- "group": "3_push"
+ "group": "3_push@4"
},
{
"command": "git.fetch",
- "group": "4_fetch"
+ "group": "4_fetch@1"
},
{
"command": "git.fetchPrune",
- "group": "4_fetch"
+ "group": "4_fetch@2"
},
{
"command": "git.fetchAll",
- "group": "4_fetch"
+ "group": "4_fetch@3"
}
],
"git.branch": [
{
- "command": "git.merge"
+ "command": "git.merge",
+ "group": "branch@1"
},
{
- "command": "git.branch"
+ "command": "git.rebase",
+ "group": "branch@2"
},
{
- "command": "git.branchFrom"
+ "command": "git.branch",
+ "group": "branch@3"
},
{
- "command": "git.renameBranch"
+ "command": "git.branchFrom",
+ "group": "branch@4"
},
{
- "command": "git.publish"
+ "command": "git.renameBranch",
+ "group": "branch@5"
+ },
+ {
+ "command": "git.publish",
+ "group": "branch@6"
}
],
"git.remotes": [
{
- "command": "git.addRemote"
+ "command": "git.addRemote",
+ "group": "remote@1"
},
{
- "command": "git.removeRemote"
+ "command": "git.removeRemote",
+ "group": "remote@2"
}
],
"git.stash": [
{
- "command": "git.stash"
+ "command": "git.stash",
+ "group": "stash@1"
},
{
- "command": "git.stashIncludeUntracked"
+ "command": "git.stashIncludeUntracked",
+ "group": "stash@2"
},
{
- "command": "git.stashApplyLatest"
+ "command": "git.stashApplyLatest",
+ "group": "stash@3"
},
{
- "command": "git.stashApply"
+ "command": "git.stashApply",
+ "group": "stash@4"
},
{
- "command": "git.stashPopLatest"
+ "command": "git.stashPopLatest",
+ "group": "stash@5"
},
{
- "command": "git.stashPop"
+ "command": "git.stashPop",
+ "group": "stash@6"
},
{
- "command": "git.stashDrop"
+ "command": "git.stashDrop",
+ "group": "stash@7"
+ }
+ ],
+ "git.tags": [
+ {
+ "command": "git.createTag",
+ "group": "tags@1"
+ },
+ {
+ "command": "git.deleteTag",
+ "group": "tags@2"
}
]
},
@@ -1501,6 +1593,10 @@
{
"id": "git.stash",
"label": "%submenu.stash%"
+ },
+ {
+ "id": "git.tags",
+ "label": "%submenu.tags%"
}
],
"configuration": {
@@ -1594,21 +1690,27 @@
"scope": "resource"
},
"git.checkoutType": {
- "type": "string",
- "enum": [
- "all",
- "local",
- "tags",
- "remote"
- ],
- "enumDescriptions": [
- "%config.checkoutType.all%",
- "%config.checkoutType.local%",
- "%config.checkoutType.tags%",
- "%config.checkoutType.remote%"
- ],
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": [
+ "local",
+ "tags",
+ "remote"
+ ],
+ "enumDescriptions": [
+ "%config.checkoutType.local%",
+ "%config.checkoutType.tags%",
+ "%config.checkoutType.remote%"
+ ]
+ },
+ "uniqueItems": true,
"markdownDescription": "%config.checkoutType%",
- "default": "all"
+ "default": [
+ "local",
+ "remote",
+ "tags"
+ ]
},
"git.ignoreLegacyWarning": {
"type": "boolean",
@@ -1636,6 +1738,7 @@
"null"
],
"default": null,
+ "scope": "machine",
"description": "%config.defaultCloneDirectory%"
},
"git.enableSmartCommit": {
@@ -1687,6 +1790,28 @@
"description": "%config.enableStatusBarSync%",
"scope": "resource"
},
+ "git.followTagsWhenSync": {
+ "type": "boolean",
+ "scope": "resource",
+ "default": false,
+ "description": "%config.followTagsWhenSync%"
+ },
+ "git.promptToSaveFilesBeforeStash": {
+ "type": "string",
+ "enum": [
+ "always",
+ "staged",
+ "never"
+ ],
+ "enumDescriptions": [
+ "%config.promptToSaveFilesBeforeStash.always%",
+ "%config.promptToSaveFilesBeforeStash.staged%",
+ "%config.promptToSaveFilesBeforeStash.never%"
+ ],
+ "scope": "resource",
+ "default": "always",
+ "description": "%config.promptToSaveFilesBeforeStash%"
+ },
"git.promptToSaveFilesBeforeCommit": {
"type": "string",
"enum": [
@@ -1719,6 +1844,23 @@
"scope": "resource",
"default": "none"
},
+ "git.openAfterClone": {
+ "type": "string",
+ "enum": [
+ "always",
+ "alwaysNewWindow",
+ "whenNoFolderOpen",
+ "prompt"
+ ],
+ "enumDescriptions": [
+ "%config.openAfterClone.always%",
+ "%config.openAfterClone.alwaysNewWindow%",
+ "%config.openAfterClone.whenNoFolderOpen%",
+ "%config.openAfterClone.prompt%"
+ ],
+ "default": "prompt",
+ "description": "%config.openAfterClone%"
+ },
"git.showInlineOpenFileAction": {
"type": "boolean",
"default": true,
@@ -1776,6 +1918,12 @@
"default": false,
"description": "%config.alwaysSignOff%"
},
+ "git.ignoreSubmodules": {
+ "type": "boolean",
+ "scope": "resource",
+ "default": false,
+ "description": "%config.ignoreSubmodules%"
+ },
"git.ignoredRepositories": {
"type": "array",
"items": {
@@ -1812,6 +1960,12 @@
"default": false,
"description": "%config.fetchOnPull%"
},
+ "git.pruneOnFetch": {
+ "type": "boolean",
+ "scope": "resource",
+ "default": false,
+ "description": "%config.pruneOnFetch%"
+ },
"git.pullTags": {
"type": "boolean",
"scope": "resource",
@@ -1898,8 +2052,33 @@
"default": true,
"description": "%config.terminalAuthentication%"
},
+ "git.useCommitInputAsStashMessage": {
+ "type": "boolean",
+ "scope": "resource",
+ "default": false,
+ "description": "%config.useCommitInputAsStashMessage%"
+ },
"git.githubAuthentication": {
"deprecationMessage": "This setting is now deprecated, please use `github.gitAuthentication` instead."
+ },
+ "git.timeline.date": {
+ "enum": [
+ "committed",
+ "authored"
+ ],
+ "enumDescriptions": [
+ "%config.timeline.date.committed%",
+ "%config.timeline.date.authored%"
+ ],
+ "default": "committed",
+ "description": "%config.timeline.date%",
+ "scope": "window"
+ },
+ "git.timeline.showAuthor": {
+ "type": "boolean",
+ "default": true,
+ "description": "%config.timeline.showAuthor%",
+ "scope": "window"
}
}
},
@@ -2065,27 +2244,37 @@
{
"view": "scm",
"contents": "%view.workbench.scm.empty%",
- "when": "config.git.enabled && git.state == initialized && workbenchState == empty"
+ "when": "config.git.enabled && workbenchState == empty",
+ "enablement": "git.state == initialized",
+ "group": "2_open@1"
},
{
"view": "scm",
"contents": "%view.workbench.scm.folder%",
- "when": "config.git.enabled && git.state == initialized && workbenchState == folder"
+ "when": "config.git.enabled && workbenchState == folder",
+ "enablement": "git.state == initialized",
+ "group": "5_scm@1"
},
{
"view": "scm",
"contents": "%view.workbench.scm.workspace%",
- "when": "config.git.enabled && git.state == initialized && workbenchState == workspace && workspaceFolderCount != 0"
+ "when": "config.git.enabled && workbenchState == workspace && workspaceFolderCount != 0",
+ "enablement": "git.state == initialized",
+ "group": "5_scm@1"
},
{
"view": "scm",
"contents": "%view.workbench.scm.emptyWorkspace%",
- "when": "config.git.enabled && git.state == initialized && workbenchState == workspace && workspaceFolderCount == 0"
+ "when": "config.git.enabled && workbenchState == workspace && workspaceFolderCount == 0",
+ "enablement": "git.state == initialized",
+ "group": "2_open@1"
},
{
"view": "explorer",
"contents": "%view.workbench.cloneRepository%",
- "when": "config.git.enabled && git.state == initialized"
+ "when": "config.git.enabled",
+ "enablement": "git.state == initialized",
+ "group": "5_scm@1"
}
]
},
diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json
index 4912dca308..416161e811 100644
--- a/extensions/git/package.nls.json
+++ b/extensions/git/package.nls.json
@@ -3,6 +3,7 @@
"description": "Git SCM Integration",
"command.setLogLevel": "Set Log Level...",
"command.clone": "Clone",
+ "command.cloneRecursive": "Clone (Recursive)",
"command.init": "Initialize Repository",
"command.openRepository": "Open Repository",
"command.close": "Close Repository",
@@ -22,6 +23,7 @@
"command.unstage": "Unstage Changes",
"command.unstageAll": "Unstage All Changes",
"command.unstageSelectedRanges": "Unstage Selected Ranges",
+ "command.rename": "Rename",
"command.clean": "Discard Changes",
"command.cleanAll": "Discard All Changes",
"command.cleanAllTracked": "Discard All Tracked Changes",
@@ -34,7 +36,7 @@
"command.commitAll": "Commit All",
"command.commitAllSigned": "Commit All (Signed Off)",
"command.commitAllAmend": "Commit All (Amend)",
- "command.commitNoVerify": "Commit (No Nerify)",
+ "command.commitNoVerify": "Commit (No Verify)",
"command.commitStagedNoVerify": "Commit Staged (No Verify)",
"command.commitEmptyNoVerify": "Commit Empty (No Verify)",
"command.commitStagedSignedNoVerify": "Commit Staged (Signed Off, No Verify)",
@@ -45,11 +47,14 @@
"command.restoreCommitTemplate": "Restore Commit Template",
"command.undoCommit": "Undo Last Commit",
"command.checkout": "Checkout to...",
+ "command.checkoutDetached": "Checkout to (Detached)...",
"command.branch": "Create Branch...",
"command.branchFrom": "Create Branch From...",
"command.deleteBranch": "Delete Branch...",
"command.renameBranch": "Rename Branch...",
+ "command.cherryPick": "Cherry Pick...",
"command.merge": "Merge Branch...",
+ "command.rebase": "Rebase Branch...",
"command.createTag": "Create Tag",
"command.deleteTag": "Delete Tag",
"command.fetch": "Fetch",
@@ -64,6 +69,7 @@
"command.pushToForce": "Push to... (Force)",
"command.pushFollowTags": "Push (Follow Tags)",
"command.pushFollowTagsForce": "Push (Follow Tags, Force)",
+ "command.pushTags": "Push Tags",
"command.addRemote": "Add Remote...",
"command.removeRemote": "Remove Remote",
"command.sync": "Sync",
@@ -98,11 +104,10 @@
"config.countBadge.all": "Count all changes.",
"config.countBadge.tracked": "Count only tracked changes.",
"config.countBadge.off": "Turn off counter.",
- "config.checkoutType": "Controls what type of branches are listed when running `Checkout to...`.",
- "config.checkoutType.all": "Show all references.",
- "config.checkoutType.local": "Show only local branches.",
- "config.checkoutType.tags": "Show only tags.",
- "config.checkoutType.remote": "Show only remote branches.",
+ "config.checkoutType": "Controls what type of git refs are listed when running `Checkout to...`.",
+ "config.checkoutType.local": "Local branches",
+ "config.checkoutType.tags": "Tags",
+ "config.checkoutType.remote": "Remote branches",
"config.branchValidationRegex": "A regular expression to validate new branch names.",
"config.branchWhitespaceChar": "The character to replace whitespace in new branch names.",
"config.ignoreLegacyWarning": "Ignores the legacy Git warning.",
@@ -119,6 +124,11 @@
"config.discardAllScope": "Controls what changes are discarded by the `Discard all changes` command. `all` discards all changes. `tracked` discards only tracked files. `prompt` shows a prompt dialog every time the action is run.",
"config.decorations.enabled": "Controls whether Git contributes colors and badges to the explorer and the open editors view.",
"config.enableStatusBarSync": "Controls whether the Git Sync command appears in the status bar.",
+ "config.followTagsWhenSync": "Follow push all tags when running the sync command.",
+ "config.promptToSaveFilesBeforeStash": "Controls whether Git should check for unsaved files before stashing changes.",
+ "config.promptToSaveFilesBeforeStash.always": "Check for any unsaved files.",
+ "config.promptToSaveFilesBeforeStash.staged": "Check only for unsaved staged files.",
+ "config.promptToSaveFilesBeforeStash.never": "Disable this check.",
"config.promptToSaveFilesBeforeCommit": "Controls whether Git should check for unsaved files before committing.",
"config.promptToSaveFilesBeforeCommit.always": "Check for any unsaved files.",
"config.promptToSaveFilesBeforeCommit.staged": "Check only for unsaved staged files.",
@@ -127,6 +137,11 @@
"config.postCommitCommand.none": "Don't run any command after a commit.",
"config.postCommitCommand.push": "Run 'Git Push' after a successful commit.",
"config.postCommitCommand.sync": "Run 'Git Sync' after a successful commit.",
+ "config.openAfterClone": "Controls whether to open a repository automatically after cloning.",
+ "config.openAfterClone.always": "Always open in current window.",
+ "config.openAfterClone.alwaysNewWindow": "Always open in a new window.",
+ "config.openAfterClone.whenNoFolderOpen": "Only open in current window when no folder is opened.",
+ "config.openAfterClone.prompt": "Always prompt for action.",
"config.showInlineOpenFileAction": "Controls whether to show an inline Open File action in the Git changes view.",
"config.showPushSuccessNotification": "Controls whether to show a notification when a push is successful.",
"config.inputValidation": "Controls when to show commit message input validation.",
@@ -136,6 +151,7 @@
"config.detectSubmodulesLimit": "Controls the limit of git submodules detected.",
"config.alwaysShowStagedChangesResourceGroup": "Always show the Staged Changes resource group.",
"config.alwaysSignOff": "Controls the signoff flag for all commits.",
+ "config.ignoreSubmodules": "Ignore modifications to submodules in the file tree.",
"config.ignoredRepositories": "List of git repositories to ignore.",
"config.scanRepositories": "List of paths to search for git repositories in.",
"config.showProgress": "Controls whether git actions should show progress.",
@@ -143,6 +159,7 @@
"config.confirmEmptyCommits": "Always confirm the creation of empty commits for the 'Git: Commit Empty' command.",
"config.fetchOnPull": "When enabled, fetch all branches when pulling. Otherwise, fetch just the current one.",
"config.pullTags": "Fetch all tags when pulling.",
+ "config.pruneOnFetch": "Prune when fetching.",
"config.autoStash": "Stash any changes before pulling and restore them after successful pull.",
"config.allowForcePush": "Controls whether force push (with or without lease) is enabled.",
"config.useForcePushWithLease": "Controls whether force pushing uses the safer force-with-lease variant.",
@@ -158,6 +175,12 @@
"config.untrackedChanges.hidden": "Untracked changes are hidden and excluded from several actions.",
"config.showCommitInput": "Controls whether to show the commit input in the Git source control panel.",
"config.terminalAuthentication": "Controls whether to enable VS Code to be the authentication handler for git processes spawned in the integrated terminal. Note: terminals need to be restarted to pick up a change in this setting.",
+ "config.timeline.showAuthor": "Controls whether to show the commit author in the Timeline view",
+ "config.timeline.date": "Controls which date to use for items in the Timeline view",
+ "config.timeline.date.committed": "Use the committed date",
+ "config.timeline.date.authored": "Use the authored date",
+ "config.useCommitInputAsStashMessage": "Controls whether to use the message from the commit input box as the default stash message.",
+ "submenu.explorer": "Git",
"submenu.commit": "Commit",
"submenu.commit.amend": "Amend",
"submenu.commit.signoff": "Sign Off",
@@ -166,6 +189,7 @@
"submenu.branch": "Branch",
"submenu.remotes": "Remote",
"submenu.stash": "Stash",
+ "submenu.tags": "Tags",
"colors.added": "Color for added resources.",
"colors.modified": "Color for modified resources.",
"colors.deleted": "Color for deleted resources.",
@@ -173,11 +197,11 @@
"colors.ignored": "Color for ignored resources.",
"colors.conflict": "Color for resources with conflicts.",
"colors.submodule": "Color for submodule resources.",
- "view.workbench.scm.missing": "A valid git installation was not detected, more details can be found in the [git output](command:git.showOutput).\nPlease [install git](https://git-scm.com/), or learn more about how to use git and source control in Azure Data Studio in [our docs](https://aka.ms/vscode-scm).\nIf you're using a different version control system, you can [search the Marketplace](command:workbench.extensions.search?%22%40category%3A%5C%22scm%20providers%5C%22%22) for additional extensions.",
- "view.workbench.scm.disabled": "If you would like to use git features, please enable git in your [settings](command:workbench.action.openSettings?%5B%22git.enabled%22%5D).\nTo learn more about how to use git and source control in Azure Data Studio [read our docs](https://aka.ms/vscode-scm).",
- "view.workbench.scm.empty": "In order to use git features, you can open a folder containing a git repository or clone from a URL.\n[Open Folder](command:vscode.openFolder)\n[Clone Repository](command:git.clone)\nTo learn more about how to use git and source control in Azure Data Studio [read our docs](https://aka.ms/vscode-scm).",
- "view.workbench.scm.folder": "The folder currently open doesn't have a git repository. You can initialize a repository which will enable source control features powered by git.\n[Initialize Repository](command:git.init?%5Btrue%5D)\nTo learn more about how to use git and source control in Azure Data Studio [read our docs](https://aka.ms/vscode-scm).",
- "view.workbench.scm.workspace": "The workspace currently open doesn't have any folders containing git repositories. You can initialize a repository on a folder which will enable source control features powered by git.\n[Initialize Repository](command:git.init)\nTo learn more about how to use git and source control in Azure Data Studio [read our docs](https://aka.ms/vscode-scm).",
- "view.workbench.scm.emptyWorkspace": "The workspace currently open doesn't have any folders containing git repositories.\n[Add Folder to Workspace](command:workbench.action.addRootFolder)\nTo learn more about how to use git and source control in Azure Data Studio [read our docs](https://aka.ms/vscode-scm).",
- "view.workbench.cloneRepository": "You can also clone a repository from a URL. To learn more about how to use git and source control in Azure Data Studio [read our docs](https://aka.ms/vscode-scm).\n[Clone Repository](command:git.clone)"
+ "view.workbench.scm.missing": "A valid git installation was not detected, more details can be found in the [git output](command:git.showOutput).\nPlease [install git](https://git-scm.com/), or learn more about how to use git and source control in VS Code in [our docs](https://aka.ms/vscode-scm).\nIf you're using a different version control system, you can [search the Marketplace](command:workbench.extensions.search?%22%40category%3A%5C%22scm%20providers%5C%22%22) for additional extensions.",
+ "view.workbench.scm.disabled": "If you would like to use git features, please enable git in your [settings](command:workbench.action.openSettings?%5B%22git.enabled%22%5D).\nTo learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).",
+ "view.workbench.scm.empty": "In order to use git features, you can open a folder containing a git repository or clone from a URL.\n[Open Folder](command:vscode.openFolder)\n[Clone Repository](command:git.clone)\nTo learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).",
+ "view.workbench.scm.folder": "The folder currently open doesn't have a git repository. You can initialize a repository which will enable source control features powered by git.\n[Initialize Repository](command:git.init?%5Btrue%5D)\nTo learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).",
+ "view.workbench.scm.workspace": "The workspace currently open doesn't have any folders containing git repositories. You can initialize a repository on a folder which will enable source control features powered by git.\n[Initialize Repository](command:git.init)\nTo learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).",
+ "view.workbench.scm.emptyWorkspace": "The workspace currently open doesn't have any folders containing git repositories.\n[Add Folder to Workspace](command:workbench.action.addRootFolder)\nTo learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).",
+ "view.workbench.cloneRepository": "You can also clone a repository from a URL. To learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).\n[Clone Repository](command:git.clone 'Clone a repository once the git extension has activated')"
}
diff --git a/extensions/git/resources/emojis.json b/extensions/git/resources/emojis.json
new file mode 100644
index 0000000000..84556dcda5
--- /dev/null
+++ b/extensions/git/resources/emojis.json
@@ -0,0 +1 @@
+{"100":"đ¯","1234":"đĸ","+1":"đ","-1":"đ","1st_place_medal":"đĨ","2nd_place_medal":"đĨ","3rd_place_medal":"đĨ","8ball":"đą","a":"đ
°","ab":"đ","abacus":"đ§Ž","abc":"đ¤","abcd":"đĄ","accept":"đ","adhesive_bandage":"đŠš","adult":"đ§","aerial_tramway":"đĄ","afghanistan":"đĻđĢ","airplane":"â","aland_islands":"đĻđŊ","alarm_clock":"â°","albania":"đĻđą","alembi":"â","alembic":"â","algeria":"đŠđŋ","alie":"đŊ","alien":"đŊ","ambulanc":"đ","ambulance":"đ","american_samoa":"đĻđ¸","amphora":"đē","anchor":"â","andorra":"đĻđŠ","angel":"đŧ","anger":"đĸ","angola":"đĻđ´","angry":"đ ","anguilla":"đĻđŽ","anguished":"đ§","ant":"đ","antarctica":"đĻđļ","antigua_barbuda":"đĻđŦ","apple":"đ","aquarius":"â","ar":"đ¨","argentina":"đĻđˇ","aries":"â","armenia":"đĻđ˛","arrow_backward":"â","arrow_double_down":"âŦ","arrow_double_up":"âĢ","arrow_dow":"âŦī¸","arrow_down":"âŦ","arrow_down_small":"đŊ","arrow_forward":"âļ","arrow_heading_down":"â¤ĩ","arrow_heading_up":"⤴","arrow_left":"âŦ
","arrow_lower_left":"â","arrow_lower_right":"â","arrow_right":"âĄ","arrow_right_hook":"âĒ","arrow_u":"âŦī¸","arrow_up":"âŦ","arrow_up_down":"â","arrow_up_small":"đŧ","arrow_upper_left":"â","arrow_upper_right":"â","arrows_clockwise":"đ","arrows_counterclockwise":"đ","art":"đ¨","articulated_lorry":"đ","artificial_satellite":"đ°","artist":"đ§âđ¨","aruba":"đĻđŧ","ascension_island":"đĻđ¨","asterisk":"*ī¸âŖ","astonished":"đ˛","astronaut":"đ§âđ","athletic_shoe":"đ","atm":"đ§","atom_symbol":"â","australia":"đĻđē","austria":"đĻđš","auto_rickshaw":"đē","avocado":"đĨ","axe":"đĒ","azerbaijan":"đĻđŋ","b":"đ
ą","baby":"đļ","baby_bottle":"đŧ","baby_chick":"đ¤","baby_symbol":"đŧ","back":"đ","bacon":"đĨ","badger":"đĻĄ","badminton":"đ¸","bagel":"đĨ¯","baggage_claim":"đ","baguette_bread":"đĨ","bahamas":"đ§đ¸","bahrain":"đ§đ","balance_scale":"â","bald_man":"đ¨âđϞ","bald_woman":"đŠâđϞ","ballet_shoes":"đа","balloon":"đ","ballot_box":"đŗ","ballot_box_with_check":"â","bamboo":"đ","banana":"đ","bangbang":"âŧ","bangladesh":"đ§đŠ","banjo":"đĒ","bank":"đĻ","bar_chart":"đ","barbados":"đ§đ§","barber":"đ","baseball":"âž","basket":"đ§ē","basketball":"đ","basketball_man":"âšī¸ââī¸","basketball_woman":"âšī¸ââī¸","bat":"đĻ","bath":"đ","bathtub":"đ","battery":"đ","beach_umbrella":"đ","bear":"đģ","bearded_person":"đ§","bed":"đ","bee":"đ","beer":"đē","beers":"đģ","beetle":"đ","beginner":"đ°","belarus":"đ§đž","belgium":"đ§đĒ","belize":"đ§đŋ","bell":"đ","bellhop_bell":"đ","benin":"đ§đ¯","bent":"đą","bento":"đą","bermuda":"đ§đ˛","beverage_box":"đ§","bhutan":"đ§đš","bicyclist":"đ´","bike":"đ˛","biking_man":"đ´ââī¸","biking_woman":"đ´ââī¸","bikini":"đ","billed_cap":"đ§ĸ","biohazard":"âŖ","bird":"đĻ","birthday":"đ","black_circle":"âĢ","black_flag":"đ´","black_heart":"đ¤","black_joker":"đ","black_large_square":"âŦ","black_medium_small_square":"âž","black_medium_square":"âŧ","black_nib":"â","black_small_square":"âĒ","black_square_button":"đ˛","blond_haired_man":"đąââī¸","blond_haired_person":"đą","blond_haired_woman":"đąââī¸","blonde_woman":"đąââī¸","blossom":"đŧ","blowfish":"đĄ","blue_book":"đ","blue_car":"đ","blue_heart":"đ","blue_square":"đĻ","blush":"đ","boar":"đ","boat":"âĩ","bolivia":"đ§đ´","bomb":"đŖ","bone":"đĻ´","boo":"đĨ","book":"đ","bookmar":"đ","bookmark":"đ","bookmark_tabs":"đ","books":"đ","boom":"đĨ","boot":"đĸ","bosnia_herzegovina":"đ§đĻ","botswana":"đ§đŧ","bouncing_ball_man":"âšī¸ââī¸","bouncing_ball_person":"âš","bouncing_ball_woman":"âšī¸ââī¸","bouquet":"đ","bouvet_island":"đ§đģ","bow":"đ","bow_and_arrow":"đš","bowing_man":"đââī¸","bowing_woman":"đââī¸","bowl_with_spoon":"đĨŖ","bowling":"đŗ","boxing_glove":"đĨ","boy":"đĻ","brain":"đ§ ","brazil":"đ§đˇ","bread":"đ","breast_feeding":"đ¤ą","bricks":"đ§ą","bride_with_veil":"đ°","bridge_at_night":"đ","briefcase":"đŧ","british_indian_ocean_territory":"đŽđ´","british_virgin_islands":"đģđŦ","broccoli":"đĨĻ","broken_heart":"đ","broom":"đ§š","brown_circle":"đ¤","brown_heart":"đ¤","brown_square":"đĢ","brunei":"đ§đŗ","bu":"đ","bug":"đ","building_constructio":"đ","building_construction":"đ","bul":"đĄ","bulb":"đĄ","bulgaria":"đ§đŦ","bullettrain_front":"đ
","bullettrain_side":"đ","burkina_faso":"đ§đĢ","burrito":"đ¯","burundi":"đ§đŽ","bus":"đ","business_suit_levitating":"đ´","busstop":"đ","bust_in_silhouette":"đ¤","busts_in_silhouett":"đĨ","busts_in_silhouette":"đĨ","butter":"đ§","butterfly":"đĻ","cactus":"đĩ","cake":"đ°","calendar":"đ","call_me_hand":"đ¤","calling":"đ˛","cambodia":"đ°đ","camel":"đĢ","camera":"đˇ","camera_flas":"đ¸","camera_flash":"đ¸","cameroon":"đ¨đ˛","camping":"đ","canada":"đ¨đĻ","canary_islands":"đŽđ¨","cancer":"â","candle":"đ¯","candy":"đŦ","canned_food":"đĨĢ","canoe":"đļ","cape_verde":"đ¨đģ","capital_abcd":"đ ","capricorn":"â","car":"đ","card_file_bo":"đ","card_file_box":"đ","card_index":"đ","card_index_dividers":"đ","caribbean_netherlands":"đ§đļ","carousel_horse":"đ ","carrot":"đĨ","cartwheeling":"đ¤¸","cat":"đą","cat2":"đ","cayman_islands":"đ°đž","cd":"đŋ","central_african_republic":"đ¨đĢ","ceuta_melilla":"đĒđĻ","chad":"đšđŠ","chains":"â","chair":"đĒ","champagne":"đž","chart":"đš","chart_with_downwards_trend":"đ","chart_with_upwards_tren":"đ","chart_with_upwards_trend":"đ","checkered_flag":"đ","cheese":"đ§","cherries":"đ","cherry_blossom":"đ¸","chess_pawn":"â","chestnut":"đ°","chicken":"đ","child":"đ§","children_crossin":"đ¸","children_crossing":"đ¸","chile":"đ¨đą","chipmunk":"đŋ","chocolate_bar":"đĢ","chopsticks":"đĨĸ","christmas_island":"đ¨đŊ","christmas_tree":"đ","church":"âĒ","cinema":"đĻ","circus_tent":"đĒ","city_sunrise":"đ","city_sunset":"đ","cityscape":"đ","cl":"đ","clamp":"đ","clap":"đ","clapper":"đŦ","classical_building":"đ","climbing":"đ§","climbing_man":"đ§ââī¸","climbing_woman":"đ§ââī¸","clinking_glasses":"đĨ","clipboard":"đ","clipperton_island":"đ¨đĩ","clock1":"đ","clock10":"đ","clock1030":"đĨ","clock11":"đ","clock1130":"đĻ","clock12":"đ","clock1230":"đ§","clock130":"đ","clock2":"đ","clock230":"đ","clock3":"đ","clock330":"đ","clock4":"đ","clock430":"đ","clock5":"đ","clock530":"đ ","clock6":"đ","clock630":"đĄ","clock7":"đ","clock730":"đĸ","clock8":"đ","clock830":"đŖ","clock9":"đ","clock930":"đ¤","closed_book":"đ","closed_lock_with_key":"đ","closed_umbrella":"đ","cloud":"â","cloud_with_lightning":"đŠ","cloud_with_lightning_and_rain":"â","cloud_with_rain":"đ§","cloud_with_snow":"đ¨","clown_fac":"đ¤Ą","clown_face":"đ¤Ą","clubs":"âŖ","cn":"đ¨đŗ","coat":"đ§Ĩ","cocktail":"đ¸","coconut":"đĨĨ","cocos_islands":"đ¨đ¨","coffee":"â","coffin":"â°","cold_face":"đĨļ","cold_sweat":"đ°","collision":"đĨ","colombia":"đ¨đ´","comet":"â","comoros":"đ°đ˛","compass":"đ§","computer":"đģ","computer_mouse":"đą","confetti_ball":"đ","confounded":"đ","confused":"đ","congo_brazzaville":"đ¨đŦ","congo_kinshasa":"đ¨đŠ","congratulations":"ã","constructio":"đ§","construction":"đ§","construction_worke":"đˇ","construction_worker":"đˇ","construction_worker_man":"đˇââī¸","construction_worker_woman":"đˇââī¸","control_knobs":"đ","convenience_store":"đĒ","cook":"đ§âđŗ","cook_islands":"đ¨đ°","cookie":"đĒ","cool":"đ","cop":"đŽ","copyright":"Š","corn":"đŊ","costa_rica":"đ¨đˇ","cote_divoire":"đ¨đŽ","couch_and_lamp":"đ","couple":"đĢ","couple_with_heart":"đ","couple_with_heart_man_man":"đ¨ââ¤ī¸âđ¨","couple_with_heart_woman_man":"đŠââ¤ī¸âđ¨","couple_with_heart_woman_woman":"đŠââ¤ī¸âđŠ","couplekiss":"đ","couplekiss_man_man":"đ¨ââ¤ī¸âđâđ¨","couplekiss_man_woman":"đŠââ¤ī¸âđâđ¨","couplekiss_woman_woman":"đŠââ¤ī¸âđâđŠ","cow":"đŽ","cow2":"đ","cowboy_hat_face":"đ¤ ","crab":"đĻ","crayon":"đ","credit_card":"đŗ","crescent_moon":"đ","cricket":"đĻ","cricket_game":"đ","croatia":"đđˇ","crocodile":"đ","croissant":"đĨ","crossed_fingers":"đ¤","crossed_flags":"đ","crossed_swords":"â","crown":"đ","cry":"đĸ","crying_cat_face":"đŋ","crystal_ball":"đŽ","cuba":"đ¨đē","cucumber":"đĨ","cup_with_straw":"đĨ¤","cupcake":"đ§","cupid":"đ","curacao":"đ¨đŧ","curling_stone":"đĨ","curly_haired_man":"đ¨âđĻą","curly_haired_woman":"đŠâđĻą","curly_loop":"â°","currency_exchange":"đą","curry":"đ","cursing_face":"đ¤Ŧ","custard":"đŽ","customs":"đ","cut_of_meat":"đĨŠ","cyclone":"đ","cyprus":"đ¨đž","czech_republic":"đ¨đŋ","dagger":"đĄ","dancer":"đ","dancers":"đ¯","dancing_men":"đ¯ââī¸","dancing_women":"đ¯ââī¸","dango":"đĄ","dark_sunglasses":"đļ","dart":"đ¯","dash":"đ¨","date":"đ
","de":"đŠđĒ","deaf_man":"đ§ââī¸","deaf_person":"đ§","deaf_woman":"đ§ââī¸","deciduous_tree":"đŗ","deer":"đĻ","denmark":"đŠđ°","department_store":"đŦ","derelict_house":"đ","desert":"đ","desert_island":"đ","desktop_computer":"đĨ","detective":"đĩ","diamond_shape_with_a_dot_inside":"đ ","diamonds":"âĻ","diego_garcia":"đŠđŦ","disappointed":"đ","disappointed_relieved":"đĨ","diving_mask":"đ¤ŋ","diya_lamp":"đĒ","dizz":"đĢ","dizzy":"đĢ","dizzy_face":"đĩ","djibouti":"đŠđ¯","dna":"đ§Ŧ","do_not_litter":"đ¯","dog":"đļ","dog2":"đ","dollar":"đĩ","dolls":"đ","dolphin":"đŦ","dominica":"đŠđ˛","dominican_republic":"đŠđ´","door":"đĒ","doughnut":"đŠ","dove":"đ","dragon":"đ","dragon_face":"đ˛","dress":"đ","dromedary_camel":"đĒ","drooling_face":"đ¤¤","drop_of_blood":"đЏ","droplet":"đ§","drum":"đĨ","duck":"đĻ","dumpling":"đĨ","dvd":"đ","e-mail":"đ§","eagle":"đĻ
","ear":"đ","ear_of_rice":"đž","ear_with_hearing_aid":"đĻģ","earth_africa":"đ","earth_americas":"đ","earth_asia":"đ","ecuador":"đĒđ¨","eg":"đĨ","egg":"đĨ","eggplant":"đ","egypt":"đĒđŦ","eight":"8ī¸âŖ","eight_pointed_black_star":"â´","eight_spoked_asterisk":"âŗ","eject_button":"â","el_salvador":"đ¸đģ","electric_plug":"đ","elephant":"đ","elf":"đ§","elf_man":"đ§ââī¸","elf_woman":"đ§ââī¸","email":"â","end":"đ","england":"đ´ķ §ķ ĸķ Ĩķ Žķ §ķ ŋ","envelope":"â","envelope_with_arrow":"đŠ","equatorial_guinea":"đŦđļ","eritrea":"đĒđˇ","es":"đĒđ¸","estonia":"đĒđĒ","ethiopia":"đĒđš","eu":"đĒđē","euro":"đļ","european_castle":"đ°","european_post_office":"đ¤","european_union":"đĒđē","evergreen_tree":"đ˛","exclamation":"â","exploding_head":"đ¤¯","expressionless":"đ","eye":"đ","eye_speech_bubble":"đī¸âđ¨ī¸","eyeglasses":"đ","eyes":"đ","face_with_head_bandage":"đ¤","face_with_thermometer":"đ¤","facepalm":"đ¤Ļ","facepunch":"đ","factory":"đ","factory_worker":"đ§âđ","fairy":"đ§","fairy_man":"đ§ââī¸","fairy_woman":"đ§ââī¸","falafel":"đ§","falkland_islands":"đĢđ°","fallen_leaf":"đ","family":"đĒ","family_man_boy":"đ¨âđĻ","family_man_boy_boy":"đ¨âđĻâđĻ","family_man_girl":"đ¨âđ§","family_man_girl_boy":"đ¨âđ§âđĻ","family_man_girl_girl":"đ¨âđ§âđ§","family_man_man_boy":"đ¨âđ¨âđĻ","family_man_man_boy_boy":"đ¨âđ¨âđĻâđĻ","family_man_man_girl":"đ¨âđ¨âđ§","family_man_man_girl_boy":"đ¨âđ¨âđ§âđĻ","family_man_man_girl_girl":"đ¨âđ¨âđ§âđ§","family_man_woman_boy":"đ¨âđŠâđĻ","family_man_woman_boy_boy":"đ¨âđŠâđĻâđĻ","family_man_woman_girl":"đ¨âđŠâđ§","family_man_woman_girl_boy":"đ¨âđŠâđ§âđĻ","family_man_woman_girl_girl":"đ¨âđŠâđ§âđ§","family_woman_boy":"đŠâđĻ","family_woman_boy_boy":"đŠâđĻâđĻ","family_woman_girl":"đŠâđ§","family_woman_girl_boy":"đŠâđ§âđĻ","family_woman_girl_girl":"đŠâđ§âđ§","family_woman_woman_boy":"đŠâđŠâđĻ","family_woman_woman_boy_boy":"đŠâđŠâđĻâđĻ","family_woman_woman_girl":"đŠâđŠâđ§","family_woman_woman_girl_boy":"đŠâđŠâđ§âđĻ","family_woman_woman_girl_girl":"đŠâđŠâđ§âđ§","farmer":"đ§âđž","faroe_islands":"đĢđ´","fast_forward":"âŠ","fax":"đ ","fearful":"đ¨","feet":"đž","female_detective":"đĩī¸ââī¸","female_sign":"â","ferris_wheel":"đĄ","ferry":"â´","field_hockey":"đ","fiji":"đĢđ¯","file_cabinet":"đ","file_folder":"đ","film_projector":"đŊ","film_strip":"đ","finland":"đĢđŽ","fir":"đĨ","fire":"đĨ","fire_engine":"đ","fire_extinguisher":"đ§¯","firecracker":"đ§¨","firefighter":"đ§âđ","fireworks":"đ","first_quarter_moon":"đ","first_quarter_moon_with_face":"đ","fish":"đ","fish_cake":"đĨ","fishing_pole_and_fish":"đŖ","fist":"â","fist_left":"đ¤","fist_oncoming":"đ","fist_raised":"â","fist_right":"đ¤","five":"5ī¸âŖ","flags":"đ","flamingo":"đĻŠ","flashlight":"đĻ","flat_shoe":"đĨŋ","fleur_de_lis":"â","flight_arrival":"đŦ","flight_departure":"đĢ","flipper":"đŦ","floppy_disk":"đž","flower_playing_cards":"đ´","flushed":"đŗ","flying_disc":"đĨ","flying_saucer":"đ¸","fog":"đĢ","foggy":"đ","foot":"đĻļ","football":"đ","footprints":"đŖ","fork_and_knife":"đ´","fortune_cookie":"đĨ ","fountain":"â˛","fountain_pen":"đ","four":"4ī¸âŖ","four_leaf_clover":"đ","fox_face":"đĻ","fr":"đĢđˇ","framed_picture":"đŧ","free":"đ","french_guiana":"đŦđĢ","french_polynesia":"đĩđĢ","french_southern_territories":"đšđĢ","fried_egg":"đŗ","fried_shrimp":"đ¤","fries":"đ","frog":"đ¸","frowning":"đĻ","frowning_face":"âš","frowning_man":"đââī¸","frowning_person":"đ","frowning_woman":"đââī¸","fu":"đ","fuelpump":"âŊ","full_moon":"đ","full_moon_with_face":"đ","funeral_urn":"âą","gabon":"đŦđĻ","gambia":"đŦđ˛","game_die":"đ˛","garlic":"đ§","gb":"đŦđ§","gear":"â","gem":"đ","gemini":"â","genie":"đ§","genie_man":"đ§ââī¸","genie_woman":"đ§ââī¸","georgia":"đŦđĒ","ghana":"đŦđ","ghost":"đģ","gibraltar":"đŦđŽ","gift":"đ","gift_heart":"đ","giraffe":"đĻ","girl":"đ§","globe_with_meridian":"đ","globe_with_meridians":"đ","gloves":"đ§¤","goal_ne":"đĨ
","goal_net":"đĨ
","goat":"đ","goggles":"đĨŊ","golf":"âŗ","golfing":"đ","golfing_man":"đī¸ââī¸","golfing_woman":"đī¸ââī¸","gorilla":"đĻ","grapes":"đ","greece":"đŦđˇ","green_apple":"đ","green_book":"đ","green_circle":"đĸ","green_hear":"đ","green_heart":"đ","green_salad":"đĨ","green_square":"đŠ","greenland":"đŦđą","grenada":"đŦđŠ","grey_exclamation":"â","grey_question":"â","grimacing":"đŦ","grin":"đ","grinning":"đ","guadeloupe":"đŦđĩ","guam":"đŦđē","guard":"đ","guardsman":"đââī¸","guardswoman":"đââī¸","guatemala":"đŦđš","guernsey":"đŦđŦ","guide_dog":"đĻŽ","guinea":"đŦđŗ","guinea_bissau":"đŦđŧ","guitar":"đ¸","gun":"đĢ","guyana":"đŦđž","haircut":"đ","haircut_man":"đââī¸","haircut_woman":"đââī¸","haiti":"đđš","hamburger":"đ","hamme":"đ¨","hammer":"đ¨","hammer_and_pick":"â","hammer_and_wrench":"đ ","hamster":"đš","hand":"â","hand_over_mouth":"đ¤","handbag":"đ","handball_person":"đ¤ž","handshake":"đ¤","hankey":"đŠ","hash":"#ī¸âŖ","hatched_chick":"đĨ","hatching_chick":"đŖ","headphones":"đ§","health_worker":"đ§ââī¸","hear_no_evil":"đ","heard_mcdonald_islands":"đđ˛","heart":"â¤","heart_decoration":"đ","heart_eyes":"đ","heart_eyes_cat":"đģ","heartbeat":"đ","heartpulse":"đ","hearts":"âĨ","heavy_check_mark":"â","heavy_division_sign":"â","heavy_dollar_sign":"đ˛","heavy_exclamation_mark":"â","heavy_heart_exclamation":"âŖ","heavy_minus_sig":"â","heavy_minus_sign":"â","heavy_multiplication_x":"â","heavy_plus_sig":"â","heavy_plus_sign":"â","hedgehog":"đĻ","helicopter":"đ","herb":"đŋ","hibiscus":"đē","high_brightness":"đ","high_heel":"đ ","hiking_boot":"đĨž","hindu_temple":"đ","hippopotamus":"đĻ","hocho":"đĒ","hole":"đŗ","honduras":"đđŗ","honey_pot":"đ¯","honeybee":"đ","hong_kong":"đđ°","horse":"đ´","horse_racing":"đ","hospital":"đĨ","hot_face":"đĨĩ","hot_pepper":"đļ","hotdog":"đ","hotel":"đ¨","hotsprings":"â¨","hourglass":"â","hourglass_flowing_sand":"âŗ","house":"đ ","house_with_garden":"đĄ","houses":"đ","hugs":"đ¤","hungary":"đđē","hushed":"đ¯","ice_cream":"đ¨","ice_cube":"đ§","ice_hockey":"đ","ice_skate":"â¸","icecream":"đĻ","iceland":"đŽđ¸","id":"đ","ideograph_advantage":"đ","imp":"đŋ","inbox_tray":"đĨ","incoming_envelope":"đ¨","india":"đŽđŗ","indonesia":"đŽđŠ","infinity":"âž","information_desk_person":"đ","information_source":"âš","innocent":"đ","interrobang":"â","iphon":"đą","iphone":"đą","iran":"đŽđˇ","iraq":"đŽđļ","ireland":"đŽđĒ","isle_of_man":"đŽđ˛","israel":"đŽđą","it":"đŽđš","izakaya_lantern":"đŽ","jack_o_lantern":"đ","jamaica":"đ¯đ˛","japan":"đž","japanese_castle":"đ¯","japanese_goblin":"đē","japanese_ogre":"đš","jeans":"đ","jersey":"đ¯đĒ","jigsaw":"đ§Š","jordan":"đ¯đ´","joy":"đ","joy_cat":"đš","joystick":"đš","jp":"đ¯đĩ","judge":"đ§ââī¸","juggling_person":"đ¤š","kaaba":"đ","kangaroo":"đĻ","kazakhstan":"đ°đŋ","kenya":"đ°đĒ","key":"đ","keyboard":"â¨","keycap_ten":"đ","kick_scooter":"đ´","kimono":"đ","kiribati":"đ°đŽ","kiss":"đ","kissing":"đ","kissing_cat":"đŊ","kissing_closed_eyes":"đ","kissing_heart":"đ","kissing_smiling_eyes":"đ","kite":"đĒ","kiwi_fruit":"đĨ","kneeling_man":"đ§ââī¸","kneeling_person":"đ§","kneeling_woman":"đ§ââī¸","knife":"đĒ","koala":"đ¨","koko":"đ","kosovo":"đŊđ°","kr":"đ°đˇ","kuwait":"đ°đŧ","kyrgyzstan":"đ°đŦ","lab_coat":"đĨŧ","labe":"đˇī¸","label":"đˇ","lacrosse":"đĨ","lantern":"đŽ","laos":"đąđĻ","large_blue_circle":"đĩ","large_blue_diamond":"đˇ","large_orange_diamond":"đļ","last_quarter_moon":"đ","last_quarter_moon_with_face":"đ","latin_cross":"â","latvia":"đąđģ","laughing":"đ","leafy_green":"đĨŦ","leaves":"đ","lebanon":"đąđ§","ledger":"đ","left_luggage":"đ
","left_right_arrow":"â","left_speech_bubble":"đ¨","leftwards_arrow_with_hook":"âŠ","leg":"đĻĩ","lemon":"đ","leo":"â","leopard":"đ","lesotho":"đąđ¸","level_slider":"đ","liberia":"đąđˇ","libra":"â","libya":"đąđž","liechtenstein":"đąđŽ","light_rail":"đ","link":"đ","lion":"đĻ","lips":"đ","lipstic":"đ","lipstick":"đ","lithuania":"đąđš","lizard":"đĻ","llama":"đĻ","lobster":"đĻ","loc":"đ","lock":"đ","lock_with_ink_pen":"đ","lollipop":"đ","loop":"âŋ","lotion_bottle":"đ§´","lotus_position":"đ§","lotus_position_man":"đ§ââī¸","lotus_position_woman":"đ§ââī¸","loud_soun":"đ","loud_sound":"đ","loudspeaker":"đĸ","love_hotel":"đŠ","love_letter":"đ","love_you_gesture":"đ¤","low_brightness":"đ
","luggage":"đ§ŗ","luxembourg":"đąđē","lying_face":"đ¤Ĩ","m":"â","ma":"đ","macau":"đ˛đ´","macedonia":"đ˛đ°","madagascar":"đ˛đŦ","mag":"đ","mag_right":"đ","mage":"đ§","mage_man":"đ§ââī¸","mage_woman":"đ§ââī¸","magnet":"đ§˛","mahjong":"đ","mailbox":"đĢ","mailbox_closed":"đĒ","mailbox_with_mail":"đŦ","mailbox_with_no_mail":"đ","malawi":"đ˛đŧ","malaysia":"đ˛đž","maldives":"đ˛đģ","male_detective":"đĩī¸ââī¸","male_sign":"â","mali":"đ˛đą","malta":"đ˛đš","man":"đ¨","man_artist":"đ¨âđ¨","man_astronaut":"đ¨âđ","man_cartwheeling":"đ¤¸ââī¸","man_cook":"đ¨âđŗ","man_dancing":"đē","man_facepalming":"đ¤Ļââī¸","man_factory_worker":"đ¨âđ","man_farmer":"đ¨âđž","man_firefighter":"đ¨âđ","man_health_worker":"đ¨ââī¸","man_in_manual_wheelchair":"đ¨âđĻŊ","man_in_motorized_wheelchair":"đ¨âđĻŧ","man_in_tuxedo":"đ¤ĩ","man_judge":"đ¨ââī¸","man_juggling":"đ¤šââī¸","man_mechanic":"đ¨âđ§","man_office_worker":"đ¨âđŧ","man_pilot":"đ¨ââī¸","man_playing_handball":"đ¤žââī¸","man_playing_water_polo":"đ¤Ŋââī¸","man_scientist":"đ¨âđŦ","man_shrugging":"đ¤ˇââī¸","man_singer":"đ¨âđ¤","man_student":"đ¨âđ","man_teacher":"đ¨âđĢ","man_technologist":"đ¨âđģ","man_with_gua_pi_mao":"đ˛","man_with_probing_cane":"đ¨âđϝ","man_with_turban":"đŗââī¸","mandarin":"đ","mango":"đĨ","mans_shoe":"đ","mantelpiece_clock":"đ°","manual_wheelchair":"đĻŊ","maple_leaf":"đ","marshall_islands":"đ˛đ","martial_arts_uniform":"đĨ","martinique":"đ˛đļ","mask":"đˇ","massage":"đ","massage_man":"đââī¸","massage_woman":"đââī¸","mate":"đ§","mauritania":"đ˛đˇ","mauritius":"đ˛đē","mayotte":"đžđš","meat_on_bone":"đ","mechanic":"đ§âđ§","mechanical_arm":"đĻž","mechanical_leg":"đĻŋ","medal_military":"đ","medal_sports":"đ
","medical_symbol":"â","mega":"đŖ","melon":"đ","mem":"đ","memo":"đ","men_wrestling":"đ¤ŧââī¸","menorah":"đ","mens":"đš","mermaid":"đ§ââī¸","merman":"đ§ââī¸","merperson":"đ§","metal":"đ¤","metro":"đ","mexico":"đ˛đŊ","microbe":"đĻ ","micronesia":"đĢđ˛","microphone":"đ¤","microscope":"đŦ","middle_finger":"đ","milk_glass":"đĨ","milky_way":"đ","minibus":"đ","minidisc":"đŊ","mobile_phone_off":"đ´","moldova":"đ˛đŠ","monaco":"đ˛đ¨","money_mouth_face":"đ¤","money_with_wings":"đ¸","moneybag":"đ°","mongolia":"đ˛đŗ","monkey":"đ","monkey_face":"đĩ","monocle_face":"đ§","monorail":"đ","montenegro":"đ˛đĒ","montserrat":"đ˛đ¸","moon":"đ","moon_cake":"đĨŽ","morocco":"đ˛đĻ","mortar_board":"đ","mosque":"đ","mosquito":"đĻ","motor_boat":"đĨ","motor_scooter":"đĩ","motorcycle":"đ","motorized_wheelchair":"đĻŧ","motorway":"đŖ","mount_fuji":"đģ","mountain":"â°","mountain_bicyclist":"đĩ","mountain_biking_man":"đĩââī¸","mountain_biking_woman":"đĩââī¸","mountain_cableway":"đ ","mountain_railway":"đ","mountain_snow":"đ","mouse":"đ","mouse2":"đ","movie_camera":"đĨ","moyai":"đŋ","mozambique":"đ˛đŋ","mrs_claus":"đ¤ļ","muscle":"đĒ","mushroom":"đ","musical_keyboard":"đš","musical_note":"đĩ","musical_score":"đŧ","mut":"đ","mute":"đ","myanmar":"đ˛đ˛","nail_care":"đ
","name_badge":"đ","namibia":"đŗđĻ","national_park":"đ","nauru":"đŗđˇ","nauseated_face":"đ¤ĸ","nazar_amulet":"đ§ŋ","necktie":"đ","negative_squared_cross_mark":"â","nepal":"đŗđĩ","nerd_face":"đ¤","netherlands":"đŗđą","neutral_face":"đ","new":"đ","new_caledonia":"đŗđ¨","new_moon":"đ","new_moon_with_face":"đ","new_zealand":"đŗđŋ","newspaper":"đ°","newspaper_roll":"đ","next_track_button":"â","ng":"đ","ng_man":"đ
ââī¸","ng_woman":"đ
ââī¸","nicaragua":"đŗđŽ","niger":"đŗđĒ","nigeria":"đŗđŦ","night_with_stars":"đ","nine":"9ī¸âŖ","niue":"đŗđē","no_bell":"đ","no_bicycles":"đŗ","no_entry":"â","no_entry_sign":"đĢ","no_good":"đ
","no_good_man":"đ
ââī¸","no_good_woman":"đ
ââī¸","no_mobile_phones":"đĩ","no_mouth":"đļ","no_pedestrians":"đˇ","no_smoking":"đ","non-potable_water":"đą","norfolk_island":"đŗđĢ","north_korea":"đ°đĩ","northern_mariana_islands":"đ˛đĩ","norway":"đŗđ´","nose":"đ","notebook":"đ","notebook_with_decorative_cover":"đ","notes":"đļ","nut_and_bolt":"đŠ","o":"â","o2":"đ
ž","ocean":"đ","octopus":"đ","oden":"đĸ","office":"đĸ","office_worker":"đ§âđŧ","oil_drum":"đĸ","ok":"đ","ok_hand":"đ","ok_man":"đââī¸","ok_person":"đ","ok_woman":"đââī¸","old_key":"đ","older_adult":"đ§","older_man":"đ´","older_woman":"đĩ","om":"đ","oman":"đ´đ˛","on":"đ","oncoming_automobile":"đ","oncoming_bus":"đ","oncoming_police_car":"đ","oncoming_taxi":"đ","one":"1ī¸âŖ","one_piece_swimsuit":"đŠą","onion":"đ§
","open_book":"đ","open_file_folder":"đ","open_hands":"đ","open_mouth":"đŽ","open_umbrella":"â","ophiuchus":"â","orange":"đ","orange_book":"đ","orange_circle":"đ ","orange_heart":"đ§Ą","orange_square":"đ§","orangutan":"đϧ","orthodox_cross":"âĻ","otter":"đĻĻ","outbox_tray":"đ¤","owl":"đĻ","ox":"đ","oyster":"đĻĒ","packag":"đĻ","package":"đĻ","page_facing_u":"đ","page_facing_up":"đ","page_with_curl":"đ","pager":"đ","paintbrush":"đ","pakistan":"đĩđ°","palau":"đĩđŧ","palestinian_territories":"đĩđ¸","palm_tree":"đ´","palms_up_together":"đ¤˛","panama":"đĩđĻ","pancakes":"đĨ","panda_face":"đŧ","paperclip":"đ","paperclips":"đ","papua_new_guinea":"đĩđŦ","parachute":"đĒ","paraguay":"đĩđž","parasol_on_ground":"âą","parking":"đ
ŋ","parrot":"đĻ","part_alternation_mark":"ãŊ","partly_sunny":"â
","partying_face":"đĨŗ","passenger_ship":"đŗ","passport_control":"đ","pause_button":"â¸","paw_prints":"đž","peace_symbol":"âŽ","peach":"đ","peacock":"đĻ","peanuts":"đĨ","pear":"đ","pen":"đ","pencil":"đ","pencil2":"â","penguin":"đ§","pensive":"đ","people_holding_hands":"đ§âđ¤âđ§","performing_arts":"đ","persevere":"đŖ","person_bald":"đ§âđϞ","person_curly_hair":"đ§âđĻą","person_fencing":"đ¤ē","person_in_manual_wheelchair":"đ§âđĻŊ","person_in_motorized_wheelchair":"đ§âđĻŧ","person_red_hair":"đ§âđϰ","person_white_hair":"đ§âđĻŗ","person_with_probing_cane":"đ§âđϝ","person_with_turban":"đŗ","peru":"đĩđĒ","petri_dish":"đ§Ģ","philippines":"đĩđ","phone":"â","pick":"â","pie":"đĨ§","pig":"đˇ","pig2":"đ","pig_nose":"đŊ","pill":"đ","pilot":"đ§ââī¸","pinching_hand":"đ¤","pineapple":"đ","ping_pong":"đ","pirate_flag":"đ´ââ ī¸","pisces":"â","pitcairn_islands":"đĩđŗ","pizza":"đ","place_of_worship":"đ","plate_with_cutlery":"đŊ","play_or_pause_button":"â¯","pleading_face":"đĨē","point_down":"đ","point_left":"đ","point_right":"đ","point_up":"â","point_up_2":"đ","poland":"đĩđą","police_car":"đ","police_officer":"đŽ","policeman":"đŽââī¸","policewoman":"đŽââī¸","poo":"đŠ","poodle":"đŠ","poop":"đŠ","popcorn":"đŋ","portugal":"đĩđš","post_office":"đŖ","postal_horn":"đ¯","postbox":"đŽ","potable_water":"đ°","potato":"đĨ","pouch":"đ","poultry_leg":"đ","pound":"đˇ","pout":"đĄ","pouting_cat":"đž","pouting_face":"đ","pouting_man":"đââī¸","pouting_woman":"đââī¸","pray":"đ","prayer_beads":"đŋ","pregnant_woman":"đ¤°","pretzel":"đĨ¨","previous_track_button":"âŽ","prince":"đ¤´","princess":"đ¸","printer":"đ¨","probing_cane":"đϝ","puerto_rico":"đĩđˇ","punch":"đ","purple_circle":"đŖ","purple_heart":"đ","purple_square":"đĒ","purse":"đ","pushpi":"đ","pushpin":"đ","put_litter_in_its_place":"đŽ","qatar":"đļđĻ","question":"â","rabbit":"đ°","rabbit2":"đ","raccoon":"đĻ","racehorse":"đ","racing_car":"đ","radio":"đģ","radio_button":"đ","radioactive":"âĸ","rage":"đĄ","railway_car":"đ","railway_track":"đ¤","rainbow":"đ","rainbow_flag":"đŗī¸âđ","raised_back_of_hand":"đ¤","raised_eyebrow":"đ¤¨","raised_hand":"â","raised_hand_with_fingers_splayed":"đ","raised_hands":"đ","raising_hand":"đ","raising_hand_man":"đââī¸","raising_hand_woman":"đââī¸","ram":"đ","ramen":"đ","rat":"đ","razor":"đĒ","receipt":"đ§ž","record_button":"âē","recycl":"âģī¸","recycle":"âģ","red_car":"đ","red_circle":"đ´","red_envelope":"đ§§","red_haired_man":"đ¨âđϰ","red_haired_woman":"đŠâđϰ","red_square":"đĨ","registered":"ÂŽ","relaxed":"âē","relieved":"đ","reminder_ribbon":"đ","repeat":"đ","repeat_one":"đ","rescue_worker_helmet":"â","restroom":"đģ","reunion":"đˇđĒ","revolving_hearts":"đ","rewin":"âĒ","rewind":"âĒ","rhinoceros":"đĻ","ribbon":"đ","rice":"đ","rice_ball":"đ","rice_cracker":"đ","rice_scene":"đ","right_anger_bubble":"đ¯","ring":"đ","ringed_planet":"đĒ","robot":"đ¤","rocke":"đ","rocket":"đ","rofl":"đ¤Ŗ","roll_eyes":"đ","roll_of_paper":"đ§ģ","roller_coaster":"đĸ","romania":"đˇđ´","rooster":"đ","rose":"đš","rosette":"đĩ","rotating_ligh":"đ¨","rotating_light":"đ¨","round_pushpin":"đ","rowboat":"đŖ","rowing_man":"đŖââī¸","rowing_woman":"đŖââī¸","ru":"đˇđē","rugby_football":"đ","runner":"đ","running":"đ","running_man":"đââī¸","running_shirt_with_sash":"đŊ","running_woman":"đââī¸","rwanda":"đˇđŧ","sa":"đ","safety_pin":"đ§ˇ","safety_vest":"đĻē","sagittarius":"â","sailboat":"âĩ","sake":"đļ","salt":"đ§","samoa":"đŧđ¸","san_marino":"đ¸đ˛","sandal":"đĄ","sandwich":"đĨĒ","santa":"đ
","sao_tome_principe":"đ¸đš","sari":"đĨģ","sassy_man":"đââī¸","sassy_woman":"đââī¸","satellite":"đĄ","satisfied":"đ","saudi_arabia":"đ¸đĻ","sauna_man":"đ§ââī¸","sauna_person":"đ§","sauna_woman":"đ§ââī¸","sauropod":"đĻ","saxophone":"đˇ","scarf":"đ§Ŗ","school":"đĢ","school_satchel":"đ","scientist":"đ§âđŦ","scissors":"â","scorpion":"đĻ","scorpius":"â","scotland":"đ´ķ §ķ ĸķ ŗķ Ŗķ ´ķ ŋ","scream":"đą","scream_cat":"đ","scroll":"đ","seat":"đē","secret":"ã","see_no_evi":"đ","see_no_evil":"đ","seedlin":"đą","seedling":"đą","selfie":"đ¤ŗ","senegal":"đ¸đŗ","serbia":"đˇđ¸","service_dog":"đâđĻē","seven":"7ī¸âŖ","seychelles":"đ¸đ¨","shallow_pan_of_food":"đĨ","shamrock":"â","shark":"đĻ","shaved_ice":"đ§","sheep":"đ","shell":"đ","shield":"đĄ","shinto_shrine":"âŠ","ship":"đĸ","shirt":"đ","shit":"đŠ","shoe":"đ","shopping":"đ","shopping_cart":"đ","shorts":"đŠŗ","shower":"đŋ","shrimp":"đĻ","shrug":"đ¤ˇ","shushing_face":"đ¤Ģ","sierra_leone":"đ¸đą","signal_strength":"đļ","singapore":"đ¸đŦ","singer":"đ§âđ¤","sint_maarten":"đ¸đŊ","six":"6ī¸âŖ","six_pointed_star":"đ¯","skateboard":"đš","ski":"đŋ","skier":"âˇ","skull":"đ","skull_and_crossbones":"â ","skunk":"đύ","sled":"đˇ","sleeping":"đ´","sleeping_bed":"đ","sleepy":"đĒ","slightly_frowning_face":"đ","slightly_smiling_face":"đ","slot_machine":"đ°","sloth":"đĻĨ","slovakia":"đ¸đ°","slovenia":"đ¸đŽ","small_airplane":"đŠ","small_blue_diamond":"đš","small_orange_diamond":"đ¸","small_red_triangle":"đē","small_red_triangle_down":"đģ","smile":"đ","smile_cat":"đ¸","smiley":"đ","smiley_cat":"đē","smiling_face_with_three_hearts":"đĨ°","smiling_imp":"đ","smirk":"đ","smirk_cat":"đŧ","smoking":"đŦ","snail":"đ","snake":"đ","sneezing_face":"đ¤§","snowboarder":"đ","snowflake":"â","snowman":"â","snowman_with_snow":"â","soap":"đ§ŧ","sob":"đ","soccer":"âŊ","socks":"đ§Ļ","softball":"đĨ","solomon_islands":"đ¸đ§","somalia":"đ¸đ´","soon":"đ","sos":"đ","sound":"đ","south_africa":"đŋđĻ","south_georgia_south_sandwich_islands":"đŦđ¸","south_sudan":"đ¸đ¸","space_invader":"đž","spades":"â ","spaghetti":"đ","sparkle":"â","sparkler":"đ","sparkles":"â¨","sparkling_heart":"đ","speak_no_evil":"đ","speaker":"đ","speaking_head":"đŖ","speech_balloo":"đŦ","speech_balloon":"đŦ","speedboat":"đ¤","spider":"đˇ","spider_web":"đ¸","spiral_calendar":"đ","spiral_notepad":"đ","sponge":"đ§Ŋ","spoon":"đĨ","squid":"đĻ","sri_lanka":"đąđ°","st_barthelemy":"đ§đą","st_helena":"đ¸đ","st_kitts_nevis":"đ°đŗ","st_lucia":"đąđ¨","st_martin":"đ˛đĢ","st_pierre_miquelon":"đĩđ˛","st_vincent_grenadines":"đģđ¨","stadium":"đ","standing_man":"đ§ââī¸","standing_person":"đ§","standing_woman":"đ§ââī¸","star":"â","star2":"đ","star_and_crescent":"âĒ","star_of_david":"âĄ","star_struck":"đ¤Š","stars":"đ ","station":"đ","statue_of_liberty":"đŊ","steam_locomotive":"đ","stethoscope":"đŠē","stew":"đ˛","stop_button":"âš","stop_sign":"đ","stopwatch":"âą","straight_ruler":"đ","strawberry":"đ","stuck_out_tongue":"đ","stuck_out_tongue_closed_eyes":"đ","stuck_out_tongue_winking_eye":"đ","student":"đ§âđ","studio_microphone":"đ","stuffed_flatbread":"đĨ","sudan":"đ¸đŠ","sun_behind_large_cloud":"đĨ","sun_behind_rain_cloud":"đĻ","sun_behind_small_cloud":"đ¤","sun_with_face":"đ","sunflower":"đģ","sunglasses":"đ","sunny":"â","sunrise":"đ
","sunrise_over_mountains":"đ","superhero":"đϏ","superhero_man":"đϏââī¸","superhero_woman":"đϏââī¸","supervillain":"đĻš","supervillain_man":"đĻšââī¸","supervillain_woman":"đĻšââī¸","surfer":"đ","surfing_man":"đââī¸","surfing_woman":"đââī¸","suriname":"đ¸đˇ","sushi":"đŖ","suspension_railway":"đ","svalbard_jan_mayen":"đ¸đ¯","swan":"đĻĸ","swaziland":"đ¸đŋ","sweat":"đ","sweat_drops":"đĻ","sweat_smile":"đ
","sweden":"đ¸đĒ","sweet_potato":"đ ","swim_brief":"đО","swimmer":"đ","swimming_man":"đââī¸","swimming_woman":"đââī¸","switzerland":"đ¨đ","symbols":"đŖ","synagogue":"đ","syria":"đ¸đž","syringe":"đ","t-rex":"đĻ","taco":"đŽ","tad":"đ","tada":"đ","taiwan":"đšđŧ","tajikistan":"đšđ¯","takeout_box":"đĨĄ","tanabata_tree":"đ","tangerine":"đ","tanzania":"đšđŋ","taurus":"â","taxi":"đ","tea":"đĩ","teacher":"đ§âđĢ","technologist":"đ§âđģ","teddy_bear":"đ§¸","telephone":"â","telephone_receiver":"đ","telescope":"đ","tennis":"đž","tent":"âē","test_tube":"đ§Ē","thailand":"đšđ","thermometer":"đĄ","thinking":"đ¤","thought_balloon":"đ","thread":"đ§ĩ","three":"3ī¸âŖ","thumbsdown":"đ","thumbsup":"đ","ticket":"đĢ","tickets":"đ","tiger":"đ¯","tiger2":"đ
","timer_clock":"â˛","timor_leste":"đšđą","tipping_hand_man":"đââī¸","tipping_hand_person":"đ","tipping_hand_woman":"đââī¸","tired_face":"đĢ","tm":"âĸ","togo":"đšđŦ","toilet":"đŊ","tokelau":"đšđ°","tokyo_tower":"đŧ","tomato":"đ
","tonga":"đšđ´","tongue":"đ
","toolbox":"đ§°","tooth":"đώ","top":"đ","tophat":"đŠ","tornado":"đĒ","tr":"đšđˇ","trackball":"đ˛","tractor":"đ","traffic_light":"đĨ","train":"đ","train2":"đ","tram":"đ","triangular_flag_on_pos":"đŠ","triangular_flag_on_post":"đŠ","triangular_ruler":"đ","trident":"đą","trinidad_tobago":"đšđš","tristan_da_cunha":"đšđĻ","triumph":"đ¤","trolleybus":"đ","trophy":"đ","tropical_drink":"đš","tropical_fish":"đ ","truc":"đ","truck":"đ","trumpet":"đē","tshirt":"đ","tulip":"đˇ","tumbler_glass":"đĨ","tunisia":"đšđŗ","turkey":"đĻ","turkmenistan":"đšđ˛","turks_caicos_islands":"đšđ¨","turtle":"đĸ","tuvalu":"đšđģ","tv":"đē","twisted_rightwards_arrow":"đ","twisted_rightwards_arrows":"đ","two":"2ī¸âŖ","two_hearts":"đ","two_men_holding_hands":"đŦ","two_women_holding_hands":"đ","u5272":"đš","u5408":"đ´","u55b6":"đē","u6307":"đ¯","u6708":"đˇ","u6709":"đļ","u6e80":"đĩ","u7121":"đ","u7533":"đ¸","u7981":"đ˛","u7a7a":"đŗ","uganda":"đēđŦ","uk":"đŦđ§","ukraine":"đēđĻ","umbrella":"â","unamused":"đ","underage":"đ","unicorn":"đĻ","united_arab_emirates":"đĻđĒ","united_nations":"đēđŗ","unlock":"đ","up":"đ","upside_down_face":"đ","uruguay":"đēđž","us":"đēđ¸","us_outlying_islands":"đēđ˛","us_virgin_islands":"đģđŽ","uzbekistan":"đēđŋ","v":"â","vampire":"đ§","vampire_man":"đ§ââī¸","vampire_woman":"đ§ââī¸","vanuatu":"đģđē","vatican_city":"đģđĻ","venezuela":"đģđĒ","vertical_traffic_light":"đĻ","vhs":"đŧ","vibration_mode":"đŗ","video_camera":"đš","video_game":"đŽ","vietnam":"đģđŗ","violin":"đģ","virgo":"â","volcano":"đ","volleyball":"đ","vomiting_face":"đ¤Ž","vs":"đ","vulcan_salute":"đ","waffle":"đ§","wales":"đ´ķ §ķ ĸķ ˇķ Ŧķ ŗķ ŋ","walking":"đļ","walking_man":"đļââī¸","walking_woman":"đļââī¸","wallis_futuna":"đŧđĢ","waning_crescent_moon":"đ","waning_gibbous_moon":"đ","warning":"â ","wastebaske":"đ","wastebasket":"đ","watch":"â","water_buffalo":"đ","water_polo":"đ¤Ŋ","watermelon":"đ","wave":"đ","wavy_dash":"ã°","waxing_crescent_moon":"đ","waxing_gibbous_moon":"đ","wc":"đž","weary":"đŠ","wedding":"đ","weight_lifting":"đ","weight_lifting_man":"đī¸ââī¸","weight_lifting_woman":"đī¸ââī¸","western_sahara":"đĒđ","whale":"đŗ","whale2":"đ","wheel_of_dharma":"â¸","wheelchai":"âŋī¸","wheelchair":"âŋ","white_check_mar":"â
","white_check_mark":"â
","white_circle":"âĒ","white_flag":"đŗ","white_flower":"đŽ","white_haired_man":"đ¨âđĻŗ","white_haired_woman":"đŠâđĻŗ","white_heart":"đ¤","white_large_square":"âŦ","white_medium_small_square":"âŊ","white_medium_square":"âģ","white_small_square":"âĢ","white_square_button":"đŗ","wilted_flower":"đĨ","wind_chime":"đ","wind_face":"đŦ","wine_glass":"đˇ","wink":"đ","wolf":"đē","woman":"đŠ","woman_artist":"đŠâđ¨","woman_astronaut":"đŠâđ","woman_cartwheeling":"đ¤¸ââī¸","woman_cook":"đŠâđŗ","woman_dancing":"đ","woman_facepalming":"đ¤Ļââī¸","woman_factory_worker":"đŠâđ","woman_farmer":"đŠâđž","woman_firefighter":"đŠâđ","woman_health_worker":"đŠââī¸","woman_in_manual_wheelchair":"đŠâđĻŊ","woman_in_motorized_wheelchair":"đŠâđĻŧ","woman_judge":"đŠââī¸","woman_juggling":"đ¤šââī¸","woman_mechanic":"đŠâđ§","woman_office_worker":"đŠâđŧ","woman_pilot":"đŠââī¸","woman_playing_handball":"đ¤žââī¸","woman_playing_water_polo":"đ¤Ŋââī¸","woman_scientist":"đŠâđŦ","woman_shrugging":"đ¤ˇââī¸","woman_singer":"đŠâđ¤","woman_student":"đŠâđ","woman_teacher":"đŠâđĢ","woman_technologist":"đŠâđģ","woman_with_headscarf":"đ§","woman_with_probing_cane":"đŠâđϝ","woman_with_turban":"đŗââī¸","womans_clothes":"đ","womans_hat":"đ","women_wrestling":"đ¤ŧââī¸","womens":"đē","woozy_face":"đĨ´","world_map":"đē","worried":"đ","wrenc":"đ§","wrench":"đ§","wrestling":"đ¤ŧ","writing_hand":"â","x":"â","yarn":"đ§ļ","yawning_face":"đĨą","yellow_circle":"đĄ","yellow_heart":"đ","yellow_square":"đ¨","yemen":"đžđĒ","yen":"đ´","yin_yang":"â¯","yo_yo":"đĒ","yum":"đ","za":"âĄī¸","zambia":"đŋđ˛","zany_face":"đ¤Ē","zap":"âĄ","zebra":"đĻ","zero":"0ī¸âŖ","zimbabwe":"đŋđŧ","zipper_mouth_face":"đ¤","zombie":"đ§","zombie_man":"đ§ââī¸","zombie_woman":"đ§ââī¸","zzz":"đ¤"}
\ No newline at end of file
diff --git a/extensions/git/src/api/api1.ts b/extensions/git/src/api/api1.ts
index 5e3a8b69ce..d6fe1eb835 100644
--- a/extensions/git/src/api/api1.ts
+++ b/extensions/git/src/api/api1.ts
@@ -357,7 +357,7 @@ export function registerAPICommands(extension: GitExtensionImpl): Disposable {
return;
}
- return pickRemoteSource(extension.model, opts);
+ return pickRemoteSource(extension.model, opts as any);
}));
return Disposable.from(...disposables);
diff --git a/extensions/git/src/api/git.d.ts b/extensions/git/src/api/git.d.ts
index d55714c219..b4322d4a7f 100644
--- a/extensions/git/src/api/git.d.ts
+++ b/extensions/git/src/api/git.d.ts
@@ -212,6 +212,7 @@ export interface RemoteSourceProvider {
readonly icon?: string; // codicon name
readonly supportsQuery?: boolean;
getRemoteSources(query?: string): ProviderResult;
+ getBranches?(url: string): ProviderResult;
publishRepository?(repository: Repository): Promise;
}
diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts
index 6bf9a25ae3..702d0632f4 100644
--- a/extensions/git/src/commands.ts
+++ b/extensions/git/src/commands.ts
@@ -3,10 +3,9 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-import { lstat, Stats } from 'fs';
import * as os from 'os';
import * as path from 'path';
-import { commands, Disposable, LineChange, MessageOptions, OutputChannel, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection } from 'vscode';
+import { commands, Disposable, LineChange, MessageOptions, OutputChannel, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection, TextDocumentContentProvider } from 'vscode';
import TelemetryReporter from 'vscode-extension-telemetry';
import * as nls from 'vscode-nls';
import { Branch, GitErrorCodes, Ref, RefType, Status, CommitOptions, RemoteSourceProvider } from './api/git';
@@ -31,14 +30,14 @@ class CheckoutItem implements QuickPickItem {
constructor(protected ref: Ref) { }
- async run(repository: Repository): Promise {
+ async run(repository: Repository, opts?: { detached?: boolean }): Promise {
const ref = this.ref.name;
if (!ref) {
return;
}
- await repository.checkout(ref);
+ await repository.checkout(ref, opts);
}
}
@@ -99,32 +98,36 @@ class MergeItem implements QuickPickItem {
}
}
-class CreateBranchItem implements QuickPickItem {
+class RebaseItem implements QuickPickItem {
- constructor(private cc: CommandCenter) { }
+ get label(): string { return this.ref.name || ''; }
+ description: string = '';
- get label(): string { return '$(plus) ' + localize('create branch', 'Create new branch...'); }
- get description(): string { return ''; }
-
- get alwaysShow(): boolean { return true; }
+ constructor(readonly ref: Ref) { }
async run(repository: Repository): Promise {
- await this.cc.branch(repository);
+ if (this.ref?.name) {
+ await repository.rebase(this.ref.name);
+ }
}
}
+class CreateBranchItem implements QuickPickItem {
+ get label(): string { return '$(plus) ' + localize('create branch', 'Create new branch...'); }
+ get description(): string { return ''; }
+ get alwaysShow(): boolean { return true; }
+}
+
class CreateBranchFromItem implements QuickPickItem {
-
- constructor(private cc: CommandCenter) { }
-
get label(): string { return '$(plus) ' + localize('create branch from', 'Create new branch from...'); }
get description(): string { return ''; }
-
get alwaysShow(): boolean { return true; }
+}
- async run(repository: Repository): Promise {
- await this.cc.branch(repository);
- }
+class CheckoutDetachedItem implements QuickPickItem {
+ get label(): string { return '$(debug-disconnect) ' + localize('checkout detached', 'Checkout detached...'); }
+ get description(): string { return ''; }
+ get alwaysShow(): boolean { return true; }
}
class HEADItem implements QuickPickItem {
@@ -203,18 +206,53 @@ async function categorizeResourceByResolution(resources: Resource[]): Promise<{
function createCheckoutItems(repository: Repository): CheckoutItem[] {
const config = workspace.getConfiguration('git');
- const checkoutType = config.get('checkoutType') || 'all';
- const includeTags = checkoutType === 'all' || checkoutType === 'tags';
- const includeRemotes = checkoutType === 'all' || checkoutType === 'remote';
+ const checkoutTypeConfig = config.get('checkoutType');
+ let checkoutTypes: string[];
- const heads = repository.refs.filter(ref => ref.type === RefType.Head)
- .map(ref => new CheckoutItem(ref));
- const tags = (includeTags ? repository.refs.filter(ref => ref.type === RefType.Tag) : [])
- .map(ref => new CheckoutTagItem(ref));
- const remoteHeads = (includeRemotes ? repository.refs.filter(ref => ref.type === RefType.RemoteHead) : [])
- .map(ref => new CheckoutRemoteHeadItem(ref));
+ if (checkoutTypeConfig === 'all' || !checkoutTypeConfig || checkoutTypeConfig.length === 0) {
+ checkoutTypes = ['local', 'remote', 'tags'];
+ } else if (typeof checkoutTypeConfig === 'string') {
+ checkoutTypes = [checkoutTypeConfig];
+ } else {
+ checkoutTypes = checkoutTypeConfig;
+ }
- return [...heads, ...tags, ...remoteHeads];
+ const processors = checkoutTypes.map(getCheckoutProcessor)
+ .filter(p => !!p) as CheckoutProcessor[];
+
+ for (const ref of repository.refs) {
+ for (const processor of processors) {
+ processor.onRef(ref);
+ }
+ }
+
+ return processors.reduce((r, p) => r.concat(...p.items), []);
+}
+
+class CheckoutProcessor {
+
+ private refs: Ref[] = [];
+ get items(): CheckoutItem[] { return this.refs.map(r => new this.ctor(r)); }
+ constructor(private type: RefType, private ctor: { new(ref: Ref): CheckoutItem }) { }
+
+ onRef(ref: Ref): void {
+ if (ref.type === this.type) {
+ this.refs.push(ref);
+ }
+ }
+}
+
+function getCheckoutProcessor(type: string): CheckoutProcessor | undefined {
+ switch (type) {
+ case 'local':
+ return new CheckoutProcessor(RefType.Head, CheckoutItem);
+ case 'remote':
+ return new CheckoutProcessor(RefType.RemoteHead, CheckoutRemoteHeadItem);
+ case 'tags':
+ return new CheckoutProcessor(RefType.Tag, CheckoutTagItem);
+ }
+
+ return undefined;
}
function sanitizeRemoteName(name: string) {
@@ -232,6 +270,7 @@ enum PushType {
Push,
PushTo,
PushFollowTags,
+ PushTags
}
interface PushOptions {
@@ -240,9 +279,27 @@ interface PushOptions {
silent?: boolean;
}
+class CommandErrorOutputTextDocumentContentProvider implements TextDocumentContentProvider {
+
+ private items = new Map();
+
+ set(uri: Uri, contents: string): void {
+ this.items.set(uri.path, contents);
+ }
+
+ delete(uri: Uri): void {
+ this.items.delete(uri.path);
+ }
+
+ provideTextDocumentContent(uri: Uri): string | undefined {
+ return this.items.get(uri.path);
+ }
+}
+
export class CommandCenter {
private disposables: Disposable[];
+ private commandErrors = new CommandErrorOutputTextDocumentContentProvider();
constructor(
private git: Git,
@@ -259,6 +316,8 @@ export class CommandCenter {
return commands.registerCommand(commandId, command);
}
});
+
+ this.disposables.push(workspace.registerTextDocumentContentProvider('git-output', this.commandErrors));
}
@command('git.setLogLevel')
@@ -297,169 +356,17 @@ export class CommandCenter {
}
@command('git.openResource')
- async openResource(resource: Resource, preserveFocus: boolean): Promise {
+ async openResource(resource: Resource): Promise {
const repository = this.model.getRepository(resource.resourceUri);
if (!repository) {
return;
}
- const config = workspace.getConfiguration('git', Uri.file(repository.root));
- const openDiffOnClick = config.get('openDiffOnClick');
-
- if (openDiffOnClick) {
- await this._openResource(resource, undefined, preserveFocus, false);
- } else {
- await this.openFile(resource);
- }
+ await resource.open();
}
- private async _openResource(resource: Resource, preview?: boolean, preserveFocus?: boolean, preserveSelection?: boolean): Promise {
- let stat: Stats | undefined;
-
- try {
- stat = await new Promise((c, e) => lstat(resource.resourceUri.fsPath, (err, stat) => err ? e(err) : c(stat)));
- } catch (err) {
- // noop
- }
-
- let left: Uri | undefined;
- let right: Uri | undefined;
-
- if (stat && stat.isDirectory()) {
- const repository = this.model.getRepositoryForSubmodule(resource.resourceUri);
-
- if (repository) {
- right = toGitUri(resource.resourceUri, resource.resourceGroupType === ResourceGroupType.Index ? 'index' : 'wt', { submoduleOf: repository.root });
- }
- } else {
- if (resource.type !== Status.DELETED_BY_THEM) {
- left = this.getLeftResource(resource);
- }
-
- right = this.getRightResource(resource);
- }
-
- const title = this.getTitle(resource);
-
- if (!right) {
- // TODO
- console.error('oh no');
- return;
- }
-
- const opts: TextDocumentShowOptions = {
- preserveFocus,
- preview,
- viewColumn: ViewColumn.Active
- };
-
- const activeTextEditor = window.activeTextEditor;
-
- // Check if active text editor has same path as other editor. we cannot compare via
- // URI.toString() here because the schemas can be different. Instead we just go by path.
- if (preserveSelection && activeTextEditor && activeTextEditor.document.uri.path === right.path) {
- opts.selection = activeTextEditor.selection;
- }
-
- if (!left) {
- await commands.executeCommand('vscode.open', right, opts, title);
- } else {
- await commands.executeCommand('vscode.diff', left, right, title, opts);
- }
- }
-
- private getLeftResource(resource: Resource): Uri | undefined {
- switch (resource.type) {
- case Status.INDEX_MODIFIED:
- case Status.INDEX_RENAMED:
- case Status.INDEX_ADDED:
- return toGitUri(resource.original, 'HEAD');
-
- case Status.MODIFIED:
- case Status.UNTRACKED:
- return toGitUri(resource.resourceUri, '~');
-
- case Status.DELETED_BY_THEM:
- return toGitUri(resource.resourceUri, '');
- }
- return undefined;
- }
-
- private getRightResource(resource: Resource): Uri | undefined {
- switch (resource.type) {
- case Status.INDEX_MODIFIED:
- case Status.INDEX_ADDED:
- case Status.INDEX_COPIED:
- case Status.INDEX_RENAMED:
- return toGitUri(resource.resourceUri, '');
-
- case Status.INDEX_DELETED:
- case Status.DELETED:
- return toGitUri(resource.resourceUri, 'HEAD');
-
- case Status.DELETED_BY_US:
- return toGitUri(resource.resourceUri, '~3');
-
- case Status.DELETED_BY_THEM:
- return toGitUri(resource.resourceUri, '~2');
-
- case Status.MODIFIED:
- case Status.UNTRACKED:
- case Status.IGNORED:
- case Status.INTENT_TO_ADD:
- const repository = this.model.getRepository(resource.resourceUri);
-
- if (!repository) {
- return;
- }
-
- const uriString = resource.resourceUri.toString();
- const [indexStatus] = repository.indexGroup.resourceStates.filter(r => r.resourceUri.toString() === uriString);
-
- if (indexStatus && indexStatus.renameResourceUri) {
- return indexStatus.renameResourceUri;
- }
-
- return resource.resourceUri;
-
- case Status.BOTH_ADDED:
- case Status.BOTH_MODIFIED:
- return resource.resourceUri;
- }
- return undefined;
- }
-
- private getTitle(resource: Resource): string {
- const basename = path.basename(resource.resourceUri.fsPath);
-
- switch (resource.type) {
- case Status.INDEX_MODIFIED:
- case Status.INDEX_RENAMED:
- case Status.INDEX_ADDED:
- return localize('git.title.index', '{0} (Index)', basename);
-
- case Status.MODIFIED:
- case Status.BOTH_ADDED:
- case Status.BOTH_MODIFIED:
- return localize('git.title.workingTree', '{0} (Working Tree)', basename);
-
- case Status.DELETED_BY_US:
- return localize('git.title.theirs', '{0} (Theirs)', basename);
-
- case Status.DELETED_BY_THEM:
- return localize('git.title.ours', '{0} (Ours)', basename);
-
- case Status.UNTRACKED:
- return localize('git.title.untracked', '{0} (Untracked)', basename);
-
- default:
- return '';
- }
- }
-
- @command('git.clone')
- async clone(url?: string, parentPath?: string): Promise {
+ async cloneRepository(url?: string, parentPath?: string, options: { recursive?: boolean } = {}): Promise {
if (!url || typeof url !== 'string') {
url = await pickRemoteSource(this.model, {
providerLabel: provider => localize('clonefrom', "Clone from {0}", provider.name),
@@ -515,38 +422,57 @@ export class CommandCenter {
const repositoryPath = await window.withProgress(
opts,
- (progress, token) => this.git.clone(url!, parentPath!, progress, token)
+ (progress, token) => this.git.clone(url!, { parentPath: parentPath!, progress, recursive: options.recursive }, token)
);
- let message = localize('proposeopen', "Would you like to open the cloned repository?");
- const open = localize('openrepo', "Open");
- const openNewWindow = localize('openreponew', "Open in New Window");
- const choices = [open, openNewWindow];
+ const config = workspace.getConfiguration('git');
+ const openAfterClone = config.get<'always' | 'alwaysNewWindow' | 'whenNoFolderOpen' | 'prompt'>('openAfterClone');
- const addToWorkspace = localize('add', "Add to Workspace");
- if (workspace.workspaceFolders) {
- message = localize('proposeopen2', "Would you like to open the cloned repository, or add it to the current workspace?");
- choices.push(addToWorkspace);
+ enum PostCloneAction { Open, OpenNewWindow, AddToWorkspace }
+ let action: PostCloneAction | undefined = undefined;
+
+ if (openAfterClone === 'always') {
+ action = PostCloneAction.Open;
+ } else if (openAfterClone === 'alwaysNewWindow') {
+ action = PostCloneAction.OpenNewWindow;
+ } else if (openAfterClone === 'whenNoFolderOpen' && !workspace.workspaceFolders) {
+ action = PostCloneAction.Open;
}
- const result = await window.showInformationMessage(message, ...choices);
+ if (action === undefined) {
+ let message = localize('proposeopen', "Would you like to open the cloned repository?");
+ const open = localize('openrepo', "Open");
+ const openNewWindow = localize('openreponew', "Open in New Window");
+ const choices = [open, openNewWindow];
+
+ const addToWorkspace = localize('add', "Add to Workspace");
+ if (workspace.workspaceFolders) {
+ message = localize('proposeopen2', "Would you like to open the cloned repository, or add it to the current workspace?");
+ choices.push(addToWorkspace);
+ }
+
+ const result = await window.showInformationMessage(message, ...choices);
+
+ action = result === open ? PostCloneAction.Open
+ : result === openNewWindow ? PostCloneAction.OpenNewWindow
+ : result === addToWorkspace ? PostCloneAction.AddToWorkspace : undefined;
+ }
- const openFolder = result === open;
/* __GDPR__
"clone" : {
"outcome" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
"openFolder": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }
}
*/
- this.telemetryReporter.sendTelemetryEvent('clone', { outcome: 'success' }, { openFolder: openFolder ? 1 : 0 });
+ this.telemetryReporter.sendTelemetryEvent('clone', { outcome: 'success' }, { openFolder: action === PostCloneAction.Open || action === PostCloneAction.OpenNewWindow ? 1 : 0 });
const uri = Uri.file(repositoryPath);
- if (openFolder) {
+ if (action === PostCloneAction.Open) {
commands.executeCommand('vscode.openFolder', uri, { forceReuseWindow: true });
- } else if (result === addToWorkspace) {
+ } else if (action === PostCloneAction.AddToWorkspace) {
workspace.updateWorkspaceFolders(workspace.workspaceFolders!.length, 0, { uri });
- } else if (result === openNewWindow) {
+ } else if (action === PostCloneAction.OpenNewWindow) {
commands.executeCommand('vscode.openFolder', uri, { forceNewWindow: true });
}
} catch (err) {
@@ -572,6 +498,16 @@ export class CommandCenter {
}
}
+ @command('git.clone')
+ async clone(url?: string, parentPath?: string): Promise {
+ this.cloneRepository(url, parentPath);
+ }
+
+ @command('git.cloneRecursive')
+ async cloneRecursive(url?: string, parentPath?: string): Promise {
+ this.cloneRepository(url, parentPath, { recursive: true });
+ }
+
@command('git.init')
async init(skipFolderPrompt = false): Promise {
let repositoryPath: string | undefined = undefined;
@@ -738,7 +674,10 @@ export class CommandCenter {
try {
document = await workspace.openTextDocument(uri);
} catch (error) {
- await commands.executeCommand('vscode.open', uri, opts);
+ await commands.executeCommand('vscode.open', uri, {
+ ...opts,
+ override: arg instanceof Resource && arg.type === Status.BOTH_MODIFIED ? false : undefined
+ });
continue;
}
@@ -778,7 +717,7 @@ export class CommandCenter {
return;
}
- const HEAD = this.getLeftResource(resource);
+ const HEAD = resource.leftUri;
const basename = path.basename(resource.resourceUri.fsPath);
const title = `${basename} (HEAD)`;
@@ -796,10 +735,6 @@ export class CommandCenter {
@command('git.openChange')
async openChange(arg?: Resource | Uri, ...resourceStates: SourceControlResourceState[]): Promise {
- const preserveFocus = arg instanceof Resource;
- const preview = !(arg instanceof Resource);
-
- const preserveSelection = arg instanceof Uri || !arg;
let resources: Resource[] | undefined = undefined;
if (arg instanceof Uri) {
@@ -826,10 +761,33 @@ export class CommandCenter {
}
for (const resource of resources) {
- await this._openResource(resource, preview, preserveFocus, preserveSelection);
+ await resource.openChange();
}
}
+ @command('git.rename', { repository: true })
+ async rename(repository: Repository, fromUri: Uri | undefined): Promise {
+ fromUri = fromUri ?? window.activeTextEditor?.document.uri;
+
+ if (!fromUri) {
+ return;
+ }
+
+ const from = path.relative(repository.root, fromUri.path);
+ let to = await window.showInputBox({
+ value: from,
+ valueSelection: [from.length - path.basename(from).length, from.length]
+ });
+
+ to = to?.trim();
+
+ if (!to) {
+ return;
+ }
+
+ await repository.move(from, to);
+ }
+
@command('git.stage')
async stage(...resourceStates: SourceControlResourceState[]): Promise {
this.outputChannel.appendLine(`git.stage ${resourceStates.length}`);
@@ -995,6 +953,10 @@ export class CommandCenter {
@command('git.stageChange')
async stageChange(uri: Uri, changes: LineChange[], index: number): Promise {
+ if (!uri) {
+ return;
+ }
+
const textEditor = window.visibleTextEditors.filter(e => e.document.uri.toString() === uri.toString())[0];
if (!textEditor) {
@@ -1045,6 +1007,10 @@ export class CommandCenter {
@command('git.revertChange')
async revertChange(uri: Uri, changes: LineChange[], index: number): Promise {
+ if (!uri) {
+ return;
+ }
+
const textEditor = window.visibleTextEditors.filter(e => e.document.uri.toString() === uri.toString())[0];
if (!textEditor) {
@@ -1198,7 +1164,7 @@ export class CommandCenter {
if (scmResources.length === 1) {
if (untrackedCount > 0) {
- message = localize('confirm delete', "Are you sure you want to DELETE {0}?\nThis is IRREVERSIBLE!\nThis file will be FOREVER LOST.", path.basename(scmResources[0].resourceUri.fsPath));
+ message = localize('confirm delete', "Are you sure you want to DELETE {0}?\nThis is IRREVERSIBLE!\nThis file will be FOREVER LOST if you proceed.", path.basename(scmResources[0].resourceUri.fsPath));
yes = localize('delete file', "Delete file");
} else {
if (scmResources[0].type === Status.DELETED) {
@@ -1303,7 +1269,7 @@ export class CommandCenter {
private async _cleanTrackedChanges(repository: Repository, resources: Resource[]): Promise {
const message = resources.length === 1
? localize('confirm discard all single', "Are you sure you want to discard changes in {0}?", path.basename(resources[0].resourceUri.fsPath))
- : localize('confirm discard all', "Are you sure you want to discard ALL changes in {0} files?\nThis is IRREVERSIBLE!\nYour current working set will be FOREVER LOST.", resources.length);
+ : localize('confirm discard all', "Are you sure you want to discard ALL changes in {0} files?\nThis is IRREVERSIBLE!\nYour current working set will be FOREVER LOST if you proceed.", resources.length);
const yes = resources.length === 1
? localize('discardAll multiple', "Discard 1 File")
: localize('discardAll', "Discard All {0} Files", resources.length);
@@ -1317,7 +1283,7 @@ export class CommandCenter {
}
private async _cleanUntrackedChange(repository: Repository, resource: Resource): Promise {
- const message = localize('confirm delete', "Are you sure you want to DELETE {0}?\nThis is IRREVERSIBLE!\nThis file will be FOREVER LOST.", path.basename(resource.resourceUri.fsPath));
+ const message = localize('confirm delete', "Are you sure you want to DELETE {0}?\nThis is IRREVERSIBLE!\nThis file will be FOREVER LOST if you proceed.", path.basename(resource.resourceUri.fsPath));
const yes = localize('delete file', "Delete file");
const pick = await window.showWarningMessage(message, { modal: true }, yes);
@@ -1329,7 +1295,7 @@ export class CommandCenter {
}
private async _cleanUntrackedChanges(repository: Repository, resources: Resource[]): Promise {
- const message = localize('confirm delete multiple', "Are you sure you want to DELETE {0} files?", resources.length);
+ const message = localize('confirm delete multiple', "Are you sure you want to DELETE {0} files?\nThis is IRREVERSIBLE!\nThese files will be FOREVER LOST if you proceed.", resources.length);
const yes = localize('delete files', "Delete Files");
const pick = await window.showWarningMessage(message, { modal: true }, yes);
@@ -1374,7 +1340,7 @@ export class CommandCenter {
? localize('unsaved files single', "The following file has unsaved changes which won't be included in the commit if you proceed: {0}.\n\nWould you like to save it before committing?", path.basename(documents[0].uri.fsPath))
: localize('unsaved files', "There are {0} unsaved files.\n\nWould you like to save them before committing?", documents.length);
const saveAndCommit = localize('save and commit', "Save All & Commit");
- const commit = localize('commit', "Commit Anyway");
+ const commit = localize('commit', "Commit Staged Changes");
const pick = await window.showWarningMessage(message, { modal: true }, saveAndCommit, commit);
if (pick === saveAndCommit) {
@@ -1386,8 +1352,14 @@ export class CommandCenter {
}
}
+ if (!opts) {
+ opts = { all: noStagedChanges };
+ } else if (!opts.all && noStagedChanges && !opts.empty) {
+ opts = { ...opts, all: true };
+ }
+
// no changes, and the user has not configured to commit all in this case
- if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit) {
+ if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.empty) {
const suggestSmartCommit = config.get('suggestSmartCommit') === true;
if (!suggestSmartCommit) {
@@ -1395,7 +1367,7 @@ export class CommandCenter {
}
// prompt the user if we want to commit all or not
- const message = localize('no staged changes', "There are no staged changes to commit.\n\nWould you like to automatically stage all your changes and commit them directly?");
+ const message = localize('no staged changes', "There are no staged changes to commit.\n\nWould you like to stage all your changes and commit them directly?");
const yes = localize('yes', "Yes");
const always = localize('always', "Always");
const never = localize('never', "Never");
@@ -1411,13 +1383,7 @@ export class CommandCenter {
}
}
- if (!opts) {
- opts = { all: noStagedChanges };
- } else if (!opts.all && noStagedChanges) {
- opts = { ...opts, all: true };
- }
-
- // enable signing of commits if configurated
+ // enable signing of commits if configured
opts.signCommit = enableCommitSigning;
if (config.get('alwaysSignOff')) {
@@ -1435,10 +1401,18 @@ export class CommandCenter {
// no staged changes and no tracked unstaged changes
|| (noStagedChanges && smartCommitChanges === 'tracked' && repository.workingTreeGroup.resourceStates.every(r => r.type === Status.UNTRACKED))
)
+ // amend allows changing only the commit message
+ && !opts.amend
&& !opts.empty
) {
- window.showInformationMessage(localize('no changes', "There are no changes to commit."));
- return false;
+ const commitAnyway = localize('commit anyway', "Create Empty Commit");
+ const answer = await window.showInformationMessage(localize('no changes', "There are no changes to commit."), commitAnyway);
+
+ if (answer !== commitAnyway) {
+ return false;
+ }
+
+ opts.empty = true;
}
if (opts.noVerify) {
@@ -1461,9 +1435,9 @@ export class CommandCenter {
}
}
- const message = await getCommitMessage();
+ let message = await getCommitMessage();
- if (!message) {
+ if (!message && !opts.amend) {
return false;
}
@@ -1500,7 +1474,7 @@ export class CommandCenter {
let value: string | undefined = undefined;
if (opts && opts.amend && repository.HEAD && repository.HEAD.commit) {
- value = (await repository.getCommit(repository.HEAD.commit)).message;
+ return undefined;
}
const branchName = repository.headShortName;
@@ -1667,20 +1641,38 @@ export class CommandCenter {
}
@command('git.checkout', { repository: true })
- async checkout(repository: Repository, treeish: string): Promise {
- if (typeof treeish === 'string') {
- await repository.checkout(treeish);
+ async checkout(repository: Repository, treeish?: string): Promise {
+ return this._checkout(repository, { treeish });
+ }
+
+ @command('git.checkoutDetached', { repository: true })
+ async checkoutDetached(repository: Repository, treeish?: string): Promise {
+ return this._checkout(repository, { detached: true, treeish });
+ }
+
+ private async _checkout(repository: Repository, opts?: { detached?: boolean, treeish?: string }): Promise {
+ if (typeof opts?.treeish === 'string') {
+ await repository.checkout(opts?.treeish, opts);
return true;
}
- const createBranch = new CreateBranchItem(this);
- const createBranchFrom = new CreateBranchFromItem(this);
- const picks = [createBranch, createBranchFrom, ...createCheckoutItems(repository)];
- const placeHolder = localize('select a ref to checkout', 'Select a ref to checkout');
+ const createBranch = new CreateBranchItem();
+ const createBranchFrom = new CreateBranchFromItem();
+ const checkoutDetached = new CheckoutDetachedItem();
+ const picks: QuickPickItem[] = [];
+
+ if (!opts?.detached) {
+ picks.push(createBranch, createBranchFrom, checkoutDetached);
+ }
+
+ picks.push(...createCheckoutItems(repository));
const quickpick = window.createQuickPick();
quickpick.items = picks;
- quickpick.placeholder = placeHolder;
+ quickpick.placeholder = opts?.detached
+ ? localize('select a ref to checkout detached', 'Select a ref to checkout in detached mode')
+ : localize('select a ref to checkout', 'Select a ref to checkout');
+
quickpick.show();
const choice = await new Promise(c => quickpick.onDidAccept(() => c(quickpick.activeItems[0])));
@@ -1694,8 +1686,31 @@ export class CommandCenter {
await this._branch(repository, quickpick.value);
} else if (choice === createBranchFrom) {
await this._branch(repository, quickpick.value, true);
+ } else if (choice === checkoutDetached) {
+ return this._checkout(repository, { detached: true });
} else {
- await (choice as CheckoutItem).run(repository);
+ const item = choice as CheckoutItem;
+
+ try {
+ await item.run(repository, opts);
+ } catch (err) {
+ if (err.gitErrorCode !== GitErrorCodes.DirtyWorkTree) {
+ throw err;
+ }
+
+ const force = localize('force', "Force Checkout");
+ const stash = localize('stashcheckout', "Stash & Checkout");
+ const choice = await window.showWarningMessage(localize('local changes', "Your local changes would be overwritten by checkout."), { modal: true }, force, stash);
+
+ if (choice === force) {
+ await this.cleanAll(repository);
+ await item.run(repository, opts);
+ } else if (choice === stash) {
+ await this.stash(repository);
+ await item.run(repository, opts);
+ await this.stashPopLatest(repository);
+ }
+ }
}
return true;
@@ -1826,8 +1841,8 @@ export class CommandCenter {
@command('git.merge', { repository: true })
async merge(repository: Repository): Promise {
const config = workspace.getConfiguration('git');
- const checkoutType = config.get('checkoutType') || 'all';
- const includeRemotes = checkoutType === 'all' || checkoutType === 'remote';
+ const checkoutType = config.get('checkoutType');
+ const includeRemotes = checkoutType === 'all' || checkoutType === 'remote' || checkoutType?.includes('remote');
const heads = repository.refs.filter(ref => ref.type === RefType.Head)
.filter(ref => ref.name || ref.commit)
@@ -1848,6 +1863,44 @@ export class CommandCenter {
await choice.run(repository);
}
+ @command('git.rebase', { repository: true })
+ async rebase(repository: Repository): Promise {
+ const config = workspace.getConfiguration('git');
+ const checkoutType = config.get('checkoutType');
+ const includeRemotes = checkoutType === 'all' || checkoutType === 'remote' || checkoutType?.includes('remote');
+
+ const heads = repository.refs.filter(ref => ref.type === RefType.Head)
+ .filter(ref => ref.name !== repository.HEAD?.name)
+ .filter(ref => ref.name || ref.commit);
+
+ const remoteHeads = (includeRemotes ? repository.refs.filter(ref => ref.type === RefType.RemoteHead) : [])
+ .filter(ref => ref.name || ref.commit);
+
+ const picks = [...heads, ...remoteHeads]
+ .map(ref => new RebaseItem(ref));
+
+ // set upstream branch as first
+ if (repository.HEAD?.upstream) {
+ const upstreamName = `${repository.HEAD?.upstream.remote}/${repository.HEAD?.upstream.name}`;
+ const index = picks.findIndex(e => e.ref.name === upstreamName);
+
+ if (index > -1) {
+ const [ref] = picks.splice(index, 1);
+ ref.description = '(upstream)';
+ picks.unshift(ref);
+ }
+ }
+
+ const placeHolder = localize('select a branch to rebase onto', 'Select a branch to rebase onto');
+ const choice = await window.showQuickPick(picks, { placeHolder });
+
+ if (!choice) {
+ return;
+ }
+
+ await choice.run(repository);
+ }
+
@command('git.createTag', { repository: true })
async createTag(repository: Repository): Promise {
const inputTagName = await window.showInputBox({
@@ -2008,7 +2061,7 @@ export class CommandCenter {
forcePushMode = config.get('useForcePushWithLease') === true ? ForcePushMode.ForceWithLease : ForcePushMode.Force;
if (config.get('confirmForcePush')) {
- const message = localize('confirm force push', "You are about to force push your changes, this can be destructive and could inadvertedly overwrite changes made by others.\n\nAre you sure to continue?");
+ const message = localize('confirm force push', "You are about to force push your changes, this can be destructive and could inadvertently overwrite changes made by others.\n\nAre you sure to continue?");
const yes = localize('ok', "OK");
const neverAgain = localize('never ask again', "OK, Don't Ask Again");
const pick = await window.showWarningMessage(message, { modal: true }, yes, neverAgain);
@@ -2026,6 +2079,10 @@ export class CommandCenter {
return;
}
+ if (pushOptions.pushType === PushType.PushTags) {
+ await repository.pushTags(undefined, forcePushMode);
+ }
+
if (!repository.HEAD || !repository.HEAD.name) {
if (!pushOptions.silent) {
window.showWarningMessage(localize('nobranch', "Please check out a branch to push to a remote."));
@@ -2097,6 +2154,21 @@ export class CommandCenter {
await this._push(repository, { pushType: PushType.PushFollowTags, forcePush: true });
}
+ @command('git.cherryPick', { repository: true })
+ async cherryPick(repository: Repository): Promise {
+ const hash = await window.showInputBox({
+ placeHolder: localize('commit hash', "Commit Hash"),
+ prompt: localize('provide commit hash', "Please provide the commit hash"),
+ ignoreFocusOut: true
+ });
+
+ if (!hash) {
+ return;
+ }
+
+ await repository.cherryPick(hash);
+ }
+
@command('git.pushTo', { repository: true })
async pushTo(repository: Repository): Promise {
await this._push(repository, { pushType: PushType.PushTo });
@@ -2107,6 +2179,11 @@ export class CommandCenter {
await this._push(repository, { pushType: PushType.PushTo, forcePush: true });
}
+ @command('git.pushTags', { repository: true })
+ async pushTags(repository: Repository): Promise {
+ await this._push(repository, { pushType: PushType.PushTags });
+ }
+
@command('git.addRemote', { repository: true })
async addRemote(repository: Repository): Promise {
const url = await pickRemoteSource(this.model, {
@@ -2140,6 +2217,7 @@ export class CommandCenter {
}
await repository.addRemote(name, url);
+ await repository.fetch(name);
return name;
}
@@ -2353,7 +2431,45 @@ export class CommandCenter {
return;
}
- const message = await this.getStashMessage();
+ const config = workspace.getConfiguration('git', Uri.file(repository.root));
+ const promptToSaveFilesBeforeStashing = config.get<'always' | 'staged' | 'never'>('promptToSaveFilesBeforeStash');
+
+ if (promptToSaveFilesBeforeStashing !== 'never') {
+ let documents = workspace.textDocuments
+ .filter(d => !d.isUntitled && d.isDirty && isDescendant(repository.root, d.uri.fsPath));
+
+ if (promptToSaveFilesBeforeStashing === 'staged' || repository.indexGroup.resourceStates.length > 0) {
+ documents = documents
+ .filter(d => repository.indexGroup.resourceStates.some(s => pathEquals(s.resourceUri.fsPath, d.uri.fsPath)));
+ }
+
+ if (documents.length > 0) {
+ const message = documents.length === 1
+ ? localize('unsaved stash files single', "The following file has unsaved changes which won't be included in the stash if you proceed: {0}.\n\nWould you like to save it before stashing?", path.basename(documents[0].uri.fsPath))
+ : localize('unsaved stash files', "There are {0} unsaved files.\n\nWould you like to save them before stashing?", documents.length);
+ const saveAndStash = localize('save and stash', "Save All & Stash");
+ const stash = localize('stash', "Stash Anyway");
+ const pick = await window.showWarningMessage(message, { modal: true }, saveAndStash, stash);
+
+ if (pick === saveAndStash) {
+ await Promise.all(documents.map(d => d.save()));
+ } else if (pick !== stash) {
+ return; // do not stash on cancel
+ }
+ }
+ }
+
+ let message: string | undefined;
+
+ if (config.get('useCommitInputAsStashMessage') && (!repository.sourceControl.commitTemplate || repository.inputBox.value !== repository.sourceControl.commitTemplate)) {
+ message = repository.inputBox.value;
+ }
+
+ message = await window.showInputBox({
+ value: message,
+ prompt: localize('provide stash message', "Optionally provide a stash message"),
+ placeHolder: localize('stash message', "Stash message")
+ });
if (typeof message === 'undefined') {
return;
@@ -2362,13 +2478,6 @@ export class CommandCenter {
await repository.createStash(message, includeUntracked);
}
- private async getStashMessage(): Promise {
- return await window.showInputBox({
- prompt: localize('provide stash message', "Optionally provide a stash message"),
- placeHolder: localize('stash message', "Stash message")
- });
- }
-
@command('git.stash', { repository: true })
stash(repository: Repository): Promise {
return this._stash(repository);
@@ -2436,6 +2545,16 @@ export class CommandCenter {
return;
}
+ // request confirmation for the operation
+ const yes = localize('yes', "Yes");
+ const result = await window.showWarningMessage(
+ localize('sure drop', "Are you sure you want to drop the stash: {0}?", stash.description),
+ yes
+ );
+ if (result !== yes) {
+ return;
+ }
+
await repository.dropStash(stash.index);
}
@@ -2499,7 +2618,11 @@ export class CommandCenter {
@command('git.rebaseAbort', { repository: true })
async rebaseAbort(repository: Repository): Promise {
- await repository.rebaseAbort();
+ if (repository.rebaseCommit) {
+ await repository.rebaseAbort();
+ } else {
+ await window.showInformationMessage(localize('no rebase', "No rebase in progress."));
+ }
}
private createCommand(id: string, key: string, method: Function, options: CommandOptions): (...args: any[]) => any {
@@ -2550,6 +2673,31 @@ export class CommandCenter {
const outputChannel = this.outputChannel as OutputChannel;
choices.set(openOutputChannelChoice, () => outputChannel.show());
+ const showCommandOutputChoice = localize('show command output', "Show Command Output");
+ if (err.stderr) {
+ choices.set(showCommandOutputChoice, async () => {
+ const timestamp = new Date().getTime();
+ const uri = Uri.parse(`git-output:/git-error-${timestamp}`);
+
+ let command = 'git';
+
+ if (err.gitArgs) {
+ command = `${command} ${err.gitArgs.join(' ')}`;
+ } else if (err.gitCommand) {
+ command = `${command} ${err.gitCommand}`;
+ }
+
+ this.commandErrors.set(uri, `> ${command}\n${err.stderr}`);
+
+ try {
+ const doc = await workspace.openTextDocument(uri);
+ await window.showTextDocument(doc);
+ } finally {
+ this.commandErrors.delete(uri);
+ }
+ });
+ }
+
switch (err.gitErrorCode) {
case GitErrorCodes.DirtyWorkTree:
message = localize('clean repo', "Please clean your repository working tree before checkout.");
diff --git a/extensions/git/src/decorationProvider.ts b/extensions/git/src/decorationProvider.ts
index 00e05f8bb2..76340fe2a9 100644
--- a/extensions/git/src/decorationProvider.ts
+++ b/extensions/git/src/decorationProvider.ts
@@ -3,7 +3,8 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-import { window, workspace, Uri, Disposable, Event, EventEmitter, Decoration, DecorationProvider, ThemeColor } from 'vscode';
+
+import { window, workspace, Uri, Disposable, Event, EventEmitter, FileDecoration, FileDecorationProvider, ThemeColor } from 'vscode';
import * as path from 'path';
import { Repository, GitResourceGroup } from './repository';
import { Model } from './model';
@@ -11,25 +12,25 @@ import { debounce } from './decorators';
import { filterEvent, dispose, anyEvent, fireEvent, PromiseSource } from './util';
import { GitErrorCodes, Status } from './api/git';
-class GitIgnoreDecorationProvider implements DecorationProvider {
+class GitIgnoreDecorationProvider implements FileDecorationProvider {
- private static Decoration: Decoration = { priority: 3, color: new ThemeColor('gitDecoration.ignoredResourceForeground') };
+ private static Decoration: FileDecoration = { color: new ThemeColor('gitDecoration.ignoredResourceForeground') };
- readonly onDidChangeDecorations: Event;
- private queue = new Map>; }>();
+ readonly onDidChangeFileDecorations: Event;
+ private queue = new Map>; }>();
private disposables: Disposable[] = [];
constructor(private model: Model) {
- this.onDidChangeDecorations = fireEvent(anyEvent(
+ this.onDidChangeFileDecorations = fireEvent(anyEvent(
filterEvent(workspace.onDidSaveTextDocument, e => /\.gitignore$|\.git\/info\/exclude$/.test(e.uri.path)),
model.onDidOpenRepository,
model.onDidCloseRepository
));
- this.disposables.push(window.registerDecorationProvider(this));
+ this.disposables.push(window.registerFileDecorationProvider(this));
}
- async provideDecoration(uri: Uri): Promise {
+ async provideFileDecoration(uri: Uri): Promise {
const repository = this.model.getRepository(uri);
if (!repository) {
@@ -39,7 +40,7 @@ class GitIgnoreDecorationProvider implements DecorationProvider {
let queueItem = this.queue.get(repository.root);
if (!queueItem) {
- queueItem = { repository, queue: new Map>() };
+ queueItem = { repository, queue: new Map>() };
this.queue.set(repository.root, queueItem);
}
@@ -84,29 +85,29 @@ class GitIgnoreDecorationProvider implements DecorationProvider {
}
}
-class GitDecorationProvider implements DecorationProvider {
+class GitDecorationProvider implements FileDecorationProvider {
- private static SubmoduleDecorationData: Decoration = {
- title: 'Submodule',
- letter: 'S',
+ private static SubmoduleDecorationData: FileDecoration = {
+ tooltip: 'Submodule',
+ badge: 'S',
color: new ThemeColor('gitDecoration.submoduleResourceForeground')
};
private readonly _onDidChangeDecorations = new EventEmitter();
- readonly onDidChangeDecorations: Event = this._onDidChangeDecorations.event;
+ readonly onDidChangeFileDecorations: Event = this._onDidChangeDecorations.event;
private disposables: Disposable[] = [];
- private decorations = new Map();
+ private decorations = new Map();
constructor(private repository: Repository) {
this.disposables.push(
- window.registerDecorationProvider(this),
+ window.registerFileDecorationProvider(this),
repository.onDidRunGitStatus(this.onDidRunGitStatus, this)
);
}
private onDidRunGitStatus(): void {
- let newDecorations = new Map();
+ let newDecorations = new Map();
this.collectSubmoduleDecorationData(newDecorations);
this.collectDecorationData(this.repository.indexGroup, newDecorations);
@@ -119,7 +120,7 @@ class GitDecorationProvider implements DecorationProvider {
this._onDidChangeDecorations.fire([...uris.values()].map(value => Uri.parse(value, true)));
}
- private collectDecorationData(group: GitResourceGroup, bucket: Map): void {
+ private collectDecorationData(group: GitResourceGroup, bucket: Map): void {
for (const r of group.resourceStates) {
const decoration = r.resourceDecoration;
@@ -134,13 +135,13 @@ class GitDecorationProvider implements DecorationProvider {
}
}
- private collectSubmoduleDecorationData(bucket: Map): void {
+ private collectSubmoduleDecorationData(bucket: Map): void {
for (const submodule of this.repository.submodules) {
bucket.set(Uri.file(path.join(this.repository.root, submodule.path)).toString(), GitDecorationProvider.SubmoduleDecorationData);
}
}
- provideDecoration(uri: Uri): Decoration | undefined {
+ provideFileDecoration(uri: Uri): FileDecoration | undefined {
return this.decorations.get(uri.toString());
}
diff --git a/extensions/git/src/emoji.ts b/extensions/git/src/emoji.ts
new file mode 100644
index 0000000000..2002a4f805
--- /dev/null
+++ b/extensions/git/src/emoji.ts
@@ -0,0 +1,39 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the Source EULA. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+'use strict';
+import { workspace, Uri } from 'vscode';
+import { getExtensionContext } from './main';
+import { TextDecoder } from 'util';
+
+const emojiRegex = /:([-+_a-z0-9]+):/g;
+
+let emojiMap: Record | undefined;
+let emojiMapPromise: Promise | undefined;
+
+export async function ensureEmojis() {
+ if (emojiMap === undefined) {
+ if (emojiMapPromise === undefined) {
+ emojiMapPromise = loadEmojiMap();
+ }
+ await emojiMapPromise;
+ }
+}
+
+async function loadEmojiMap() {
+ const context = getExtensionContext();
+ const uri = (Uri as any).joinPath(context.extensionUri, 'resources', 'emojis.json');
+ emojiMap = JSON.parse(new TextDecoder('utf8').decode(await workspace.fs.readFile(uri)));
+}
+
+export function emojify(message: string) {
+ if (emojiMap === undefined) {
+ return message;
+ }
+
+ return message.replace(emojiRegex, (s, code) => {
+ return emojiMap?.[code] || s;
+ });
+}
diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts
index 5a773875f8..75faae4647 100644
--- a/extensions/git/src/git.ts
+++ b/extensions/git/src/git.ts
@@ -13,7 +13,6 @@ import * as iconv from 'iconv-lite-umd';
import * as filetype from 'file-type';
import { assign, groupBy, IDisposable, toDisposable, dispose, mkdirp, readBytes, detectUnicodeEncoding, Encoding, onceEvent, splitInChunks, Limiter } from './util';
import { CancellationToken, Progress, Uri } from 'vscode';
-import { URI } from 'vscode-uri';
import { detectEncoding } from './encoding';
import { Ref, RefType, Branch, Remote, GitErrorCodes, LogOptions, Change, Status, CommitOptions, BranchQuery } from './api/git';
import * as byline from 'byline';
@@ -261,6 +260,7 @@ export interface IGitErrorData {
exitCode?: number;
gitErrorCode?: string;
gitCommand?: string;
+ gitArgs?: string[];
}
export class GitError {
@@ -272,6 +272,7 @@ export class GitError {
exitCode?: number;
gitErrorCode?: string;
gitCommand?: string;
+ gitArgs?: string[];
constructor(data: IGitErrorData) {
if (data.error) {
@@ -288,6 +289,7 @@ export class GitError {
this.exitCode = data.exitCode;
this.gitErrorCode = data.gitErrorCode;
this.gitCommand = data.gitCommand;
+ this.gitArgs = data.gitArgs;
}
toString(): string {
@@ -351,6 +353,12 @@ function sanitizePath(path: string): string {
const COMMIT_FORMAT = '%H%n%aN%n%aE%n%at%n%ct%n%P%n%B';
+export interface ICloneOptions {
+ readonly parentPath: string;
+ readonly progress: Progress<{ increment: number }>;
+ readonly recursive?: boolean;
+}
+
export class Git {
readonly path: string;
@@ -373,18 +381,18 @@ export class Git {
return;
}
- async clone(url: string, parentPath: string, progress: Progress<{ increment: number }>, cancellationToken?: CancellationToken): Promise {
+ async clone(url: string, options: ICloneOptions, cancellationToken?: CancellationToken): Promise {
let baseFolderName = decodeURI(url).replace(/[\/]+$/, '').replace(/^.*[\/\\]/, '').replace(/\.git$/, '') || 'repository';
let folderName = baseFolderName;
- let folderPath = path.join(parentPath, folderName);
+ let folderPath = path.join(options.parentPath, folderName);
let count = 1;
while (count < 20 && await new Promise(c => exists(folderPath, c))) {
folderName = `${baseFolderName}-${count++}`;
- folderPath = path.join(parentPath, folderName);
+ folderPath = path.join(options.parentPath, folderName);
}
- await mkdirp(parentPath);
+ await mkdirp(options.parentPath);
const onSpawn = (child: cp.ChildProcess) => {
const decoder = new StringDecoder('utf8');
@@ -408,14 +416,18 @@ export class Git {
}
if (totalProgress !== previousProgress) {
- progress.report({ increment: totalProgress - previousProgress });
+ options.progress.report({ increment: totalProgress - previousProgress });
previousProgress = totalProgress;
}
});
};
try {
- await this.exec(parentPath, ['clone', url.includes(' ') ? encodeURI(url) : url, folderPath, '--progress'], { cancellationToken, onSpawn });
+ let command = ['clone', url.includes(' ') ? encodeURI(url) : url, folderPath, '--progress'];
+ if (options.recursive) {
+ command.push('--recursive');
+ }
+ await this.exec(options.parentPath, command, { cancellationToken, onSpawn });
} catch (err) {
if (err.stderr) {
err.stderr = err.stderr.replace(/^Cloning.+$/m, '').trim();
@@ -445,7 +457,7 @@ export class Git {
const [, letter] = match;
try {
- const networkPath = await new Promise(resolve =>
+ const networkPath = await new Promise(resolve =>
realpath.native(`${letter}:`, { encoding: 'utf8' }, (err, resolvedPath) =>
resolve(err !== null ? undefined : resolvedPath),
),
@@ -526,7 +538,8 @@ export class Git {
stderr: result.stderr,
exitCode: result.exitCode,
gitErrorCode: getGitErrorCode(result.stderr),
- gitCommand: args[0]
+ gitCommand: args[0],
+ gitArgs: args
}));
}
@@ -679,7 +692,7 @@ export function parseGitmodules(raw: string): Submodule[] {
return;
}
- const propertyMatch = /^\s*(\w+)\s+=\s+(.*)$/.exec(line);
+ const propertyMatch = /^\s*(\w+)\s*=\s*(.*)$/.exec(line);
if (!propertyMatch) {
return;
@@ -1155,7 +1168,7 @@ export class Repository {
break;
}
- const originalUri = URI.file(path.isAbsolute(resourcePath) ? resourcePath : path.join(this.repositoryRoot, resourcePath));
+ const originalUri = Uri.file(path.isAbsolute(resourcePath) ? resourcePath : path.join(this.repositoryRoot, resourcePath));
let status: Status = Status.UNTRACKED;
// Copy or Rename status comes with a number, e.g. 'R100'. We don't need the number, so we use only first character of the status.
@@ -1183,7 +1196,7 @@ export class Repository {
break;
}
- const uri = URI.file(path.isAbsolute(newPath) ? newPath : path.join(this.repositoryRoot, newPath));
+ const uri = Uri.file(path.isAbsolute(newPath) ? newPath : path.join(this.repositoryRoot, newPath));
result.push({
uri,
renameUri: uri,
@@ -1233,7 +1246,7 @@ export class Repository {
}
if (paths && paths.length) {
- for (const chunk of splitInChunks(paths, MAX_CLI_LENGTH)) {
+ for (const chunk of splitInChunks(paths.map(sanitizePath), MAX_CLI_LENGTH)) {
await this.run([...args, '--', ...chunk]);
}
} else {
@@ -1286,13 +1299,17 @@ export class Repository {
await this.run(['update-index', add, '--cacheinfo', mode, hash, path]);
}
- async checkout(treeish: string, paths: string[], opts: { track?: boolean } = Object.create(null)): Promise {
+ async checkout(treeish: string, paths: string[], opts: { track?: boolean, detached?: boolean } = Object.create(null)): Promise {
const args = ['checkout', '-q'];
if (opts.track) {
args.push('--track');
}
+ if (opts.detached) {
+ args.push('--detach');
+ }
+
if (treeish) {
args.push(treeish);
}
@@ -1308,23 +1325,30 @@ export class Repository {
} catch (err) {
if (/Please,? commit your changes or stash them/.test(err.stderr || '')) {
err.gitErrorCode = GitErrorCodes.DirtyWorkTree;
+ err.gitTreeish = treeish;
}
throw err;
}
}
- async commit(message: string, opts: CommitOptions = Object.create(null)): Promise {
- const args = ['commit', '--quiet', '--allow-empty-message', '--file', '-'];
+ async commit(message: string | undefined, opts: CommitOptions = Object.create(null)): Promise {
+ const args = ['commit', '--quiet', '--allow-empty-message'];
if (opts.all) {
args.push('--all');
}
- if (opts.amend) {
+ if (opts.amend && message) {
args.push('--amend');
}
+ if (opts.amend && !message) {
+ args.push('--amend', '--no-edit');
+ } else {
+ args.push('--file', '-');
+ }
+
if (opts.signoff) {
args.push('--signoff');
}
@@ -1341,8 +1365,11 @@ export class Repository {
args.push('--no-verify');
}
+ // Stops git from guessing at user/email
+ args.splice(0, 0, '-c', 'user.useConfigOnly=true');
+
try {
- await this.run(args, { input: message || '' });
+ await this.run(args, !opts.amend || message ? { input: message || '' } : {});
} catch (commitErr) {
await this.handleCommitError(commitErr);
}
@@ -1405,6 +1432,11 @@ export class Repository {
await this.run(args);
}
+ async move(from: string, to: string): Promise {
+ const args = ['mv', from, to];
+ await this.run(args);
+ }
+
async setBranchUpstream(name: string, upstream: string): Promise {
const args = ['branch', '--set-upstream-to', upstream, name];
await this.run(args);
@@ -1455,7 +1487,7 @@ export class Repository {
const args = ['clean', '-f', '-q'];
for (const paths of groups) {
- for (const chunk of splitInChunks(paths, MAX_CLI_LENGTH)) {
+ for (const chunk of splitInChunks(paths.map(sanitizePath), MAX_CLI_LENGTH)) {
promises.push(limiter.queue(() => this.run([...args, '--', ...chunk])));
}
}
@@ -1495,7 +1527,7 @@ export class Repository {
try {
if (paths && paths.length > 0) {
- for (const chunk of splitInChunks(paths, MAX_CLI_LENGTH)) {
+ for (const chunk of splitInChunks(paths.map(sanitizePath), MAX_CLI_LENGTH)) {
await this.run([...args, '--', ...chunk]);
}
} else {
@@ -1527,9 +1559,11 @@ export class Repository {
await this.run(args);
}
- async fetch(options: { remote?: string, ref?: string, all?: boolean, prune?: boolean, depth?: number, silent?: boolean } = {}): Promise {
+ async fetch(options: { remote?: string, ref?: string, all?: boolean, prune?: boolean, depth?: number, silent?: boolean, readonly cancellationToken?: CancellationToken } = {}): Promise {
const args = ['fetch'];
- const spawnOptions: SpawnOptions = {};
+ const spawnOptions: SpawnOptions = {
+ cancellationToken: options.cancellationToken,
+ };
if (options.remote) {
args.push(options.remote);
@@ -1608,7 +1642,25 @@ export class Repository {
}
}
- async push(remote?: string, name?: string, setUpstream: boolean = false, tags = false, forcePushMode?: ForcePushMode): Promise {
+ async rebase(branch: string, options: PullOptions = {}): Promise {
+ const args = ['rebase'];
+
+ args.push(branch);
+
+ try {
+ await this.run(args, options);
+ } catch (err) {
+ if (/^CONFLICT \([^)]+\): \b/m.test(err.stdout || '')) {
+ err.gitErrorCode = GitErrorCodes.Conflict;
+ } else if (/cannot rebase onto multiple branches/i.test(err.stderr || '')) {
+ err.gitErrorCode = GitErrorCodes.CantRebaseMultipleBranches;
+ }
+
+ throw err;
+ }
+ }
+
+ async push(remote?: string, name?: string, setUpstream: boolean = false, followTags = false, forcePushMode?: ForcePushMode, tags = false): Promise {
const args = ['push'];
if (forcePushMode === ForcePushMode.ForceWithLease) {
@@ -1621,10 +1673,14 @@ export class Repository {
args.push('-u');
}
- if (tags) {
+ if (followTags) {
args.push('--follow-tags');
}
+ if (tags) {
+ args.push('--tags');
+ }
+
if (remote) {
args.push(remote);
}
@@ -1650,6 +1706,11 @@ export class Repository {
}
}
+ async cherryPick(commitHash: string): Promise {
+ const args = ['cherry-pick', commitHash];
+ await this.run(args);
+ }
+
async blame(path: string): Promise {
try {
const args = ['blame', sanitizePath(path)];
@@ -1734,11 +1795,17 @@ export class Repository {
}
}
- getStatus(limit = 5000): Promise<{ status: IFileStatus[]; didHitLimit: boolean; }> {
+ getStatus(opts?: { limit?: number, ignoreSubmodules?: boolean }): Promise<{ status: IFileStatus[]; didHitLimit: boolean; }> {
return new Promise<{ status: IFileStatus[]; didHitLimit: boolean; }>((c, e) => {
const parser = new GitStatusParser();
const env = { GIT_OPTIONAL_LOCKS: '0' };
- const child = this.stream(['status', '-z', '-u'], { env });
+ const args = ['status', '-z', '-u'];
+
+ if (opts?.ignoreSubmodules) {
+ args.push('--ignore-submodules');
+ }
+
+ const child = this.stream(args, { env });
const onExit = (exitCode: number) => {
if (exitCode !== 0) {
@@ -1748,13 +1815,15 @@ export class Repository {
stderr,
exitCode,
gitErrorCode: getGitErrorCode(stderr),
- gitCommand: 'status'
+ gitCommand: 'status',
+ gitArgs: args
}));
}
c({ status: parser.status, didHitLimit: false });
};
+ const limit = opts?.limit ?? 5000;
const onStdoutData = (raw: string) => {
parser.update(raw);
@@ -1818,7 +1887,7 @@ export class Repository {
args.push('--sort', `-${opts.sort}`);
}
- args.push('--format', '%(refname) %(objectname)');
+ args.push('--format', '%(refname) %(objectname) %(*objectname)');
if (opts?.pattern) {
args.push(opts.pattern);
@@ -1833,12 +1902,12 @@ export class Repository {
const fn = (line: string): Ref | null => {
let match: RegExpExecArray | null;
- if (match = /^refs\/heads\/([^ ]+) ([0-9a-f]{40})$/.exec(line)) {
+ if (match = /^refs\/heads\/([^ ]+) ([0-9a-f]{40}) ([0-9a-f]{40})?$/.exec(line)) {
return { name: match[1], commit: match[2], type: RefType.Head };
- } else if (match = /^refs\/remotes\/([^/]+)\/([^ ]+) ([0-9a-f]{40})$/.exec(line)) {
+ } else if (match = /^refs\/remotes\/([^/]+)\/([^ ]+) ([0-9a-f]{40}) ([0-9a-f]{40})?$/.exec(line)) {
return { name: `${match[1]}/${match[2]}`, commit: match[3], type: RefType.RemoteHead, remote: match[1] };
- } else if (match = /^refs\/tags\/([^ ]+) ([0-9a-f]{40})$/.exec(line)) {
- return { name: match[1], commit: match[2], type: RefType.Tag };
+ } else if (match = /^refs\/tags\/([^ ]+) ([0-9a-f]{40}) ([0-9a-f]{40})?$/.exec(line)) {
+ return { name: match[1], commit: match[3] ?? match[2], type: RefType.Tag };
}
return null;
diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts
index 8199ccf054..7734c46cb8 100644
--- a/extensions/git/src/main.ts
+++ b/extensions/git/src/main.ts
@@ -170,7 +170,14 @@ export async function _activate(context: ExtensionContext): Promise {
+ _context = context;
+
const result = await _activate(context);
context.subscriptions.push(registerAPICommands(result));
return result;
diff --git a/extensions/git/src/protocolHandler.ts b/extensions/git/src/protocolHandler.ts
index b63113ac7c..f64a3dcecd 100644
--- a/extensions/git/src/protocolHandler.ts
+++ b/extensions/git/src/protocolHandler.ts
@@ -34,4 +34,4 @@ export class GitProtocolHandler implements UriHandler {
dispose(): void {
this.disposables = dispose(this.disposables);
}
-}
\ No newline at end of file
+}
diff --git a/extensions/git/src/remoteSource.ts b/extensions/git/src/remoteSource.ts
index f8361eb6a2..202ce03080 100644
--- a/extensions/git/src/remoteSource.ts
+++ b/extensions/git/src/remoteSource.ts
@@ -59,7 +59,8 @@ class RemoteSourceProviderQuickPick {
this.quickpick.items = remoteSources.map(remoteSource => ({
label: remoteSource.name,
description: remoteSource.description || (typeof remoteSource.url === 'string' ? remoteSource.url : remoteSource.url[0]),
- remoteSource
+ remoteSource,
+ alwaysShow: true
}));
}
} catch (err) {
@@ -80,12 +81,30 @@ class RemoteSourceProviderQuickPick {
export interface PickRemoteSourceOptions {
readonly providerLabel?: (provider: RemoteSourceProvider) => string;
readonly urlLabel?: string;
+ readonly providerName?: string;
+ readonly branch?: boolean; // then result is PickRemoteSourceResult
}
-export async function pickRemoteSource(model: Model, options: PickRemoteSourceOptions = {}): Promise {
+export interface PickRemoteSourceResult {
+ readonly url: string;
+ readonly branch?: string;
+}
+
+export async function pickRemoteSource(model: Model, options: PickRemoteSourceOptions & { branch?: false | undefined }): Promise;
+export async function pickRemoteSource(model: Model, options: PickRemoteSourceOptions & { branch: true }): Promise;
+export async function pickRemoteSource(model: Model, options: PickRemoteSourceOptions = {}): Promise {
const quickpick = window.createQuickPick<(QuickPickItem & { provider?: RemoteSourceProvider, url?: string })>();
quickpick.ignoreFocusOut = true;
+ if (options.providerName) {
+ const provider = model.getRemoteProviders()
+ .filter(provider => provider.name === options.providerName)[0];
+
+ if (provider) {
+ return await pickProviderSource(provider, options);
+ }
+ }
+
const providers = model.getRemoteProviders()
.map(provider => ({ label: (provider.icon ? `$(${provider.icon}) ` : '') + (options.providerLabel ? options.providerLabel(provider) : provider.name), alwaysShow: true, provider }));
@@ -116,18 +135,48 @@ export async function pickRemoteSource(model: Model, options: PickRemoteSourceOp
if (result.url) {
return result.url;
} else if (result.provider) {
- const quickpick = new RemoteSourceProviderQuickPick(result.provider);
- const remote = await quickpick.pick();
-
- if (remote) {
- if (typeof remote.url === 'string') {
- return remote.url;
- } else if (remote.url.length > 0) {
- return await window.showQuickPick(remote.url, { ignoreFocusOut: true, placeHolder: localize('pick url', "Choose a URL to clone from.") });
- }
- }
+ return await pickProviderSource(result.provider, options);
}
}
return undefined;
}
+
+async function pickProviderSource(provider: RemoteSourceProvider, options: PickRemoteSourceOptions = {}): Promise {
+ const quickpick = new RemoteSourceProviderQuickPick(provider);
+ const remote = await quickpick.pick();
+
+ let url: string | undefined;
+
+ if (remote) {
+ if (typeof remote.url === 'string') {
+ url = remote.url;
+ } else if (remote.url.length > 0) {
+ url = await window.showQuickPick(remote.url, { ignoreFocusOut: true, placeHolder: localize('pick url', "Choose a URL to clone from.") });
+ }
+ }
+
+ if (!url || !options.branch) {
+ return url;
+ }
+
+ if (!provider.getBranches) {
+ return { url };
+ }
+
+ const branches = await provider.getBranches(url);
+
+ if (!branches) {
+ return { url };
+ }
+
+ const branch = await window.showQuickPick(branches, {
+ placeHolder: localize('branch name', "Branch name")
+ });
+
+ if (!branch) {
+ return { url };
+ }
+
+ return { url, branch };
+}
diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts
index 8217d2037e..3ec85ce807 100644
--- a/extensions/git/src/repository.ts
+++ b/extensions/git/src/repository.ts
@@ -5,7 +5,7 @@
import * as fs from 'fs';
import * as path from 'path';
-import { CancellationToken, Command, Disposable, Event, EventEmitter, Memento, OutputChannel, ProgressLocation, ProgressOptions, scm, SourceControl, SourceControlInputBox, SourceControlInputBoxValidation, SourceControlInputBoxValidationType, SourceControlResourceDecorations, SourceControlResourceGroup, SourceControlResourceState, ThemeColor, Uri, window, workspace, WorkspaceEdit, Decoration } from 'vscode';
+import { CancellationToken, Command, Disposable, Event, EventEmitter, Memento, OutputChannel, ProgressLocation, ProgressOptions, scm, SourceControl, SourceControlInputBox, SourceControlInputBoxValidation, SourceControlInputBoxValidationType, SourceControlResourceDecorations, SourceControlResourceGroup, SourceControlResourceState, ThemeColor, Uri, window, workspace, WorkspaceEdit, FileDecoration, commands } from 'vscode';
import * as nls from 'vscode-nls';
import { Branch, Change, GitErrorCodes, LogOptions, Ref, RefType, Remote, Status, CommitOptions, BranchQuery } from './api/git';
import { AutoFetcher } from './autofetch';
@@ -75,13 +75,21 @@ export class Resource implements SourceControlResourceState {
return this._resourceUri;
}
- @memoize
+ get leftUri(): Uri | undefined {
+ return this.resources[0];
+ }
+
+ get rightUri(): Uri {
+ return this.resources[1];
+ }
+
get command(): Command {
- return {
- command: 'git.openResource',
- title: localize('open', "Open"),
- arguments: [this]
- };
+ return this._commandResolver.resolveDefaultCommand(this);
+ }
+
+ @memoize
+ private get resources(): [Uri | undefined, Uri] {
+ return this._commandResolver.getResources(this);
}
get resourceGroupType(): ResourceGroupType { return this._resourceGroupType; }
@@ -205,9 +213,11 @@ export class Resource implements SourceControlResourceState {
get color(): ThemeColor {
switch (this.type) {
case Status.INDEX_MODIFIED:
+ return new ThemeColor('gitDecoration.stageModifiedResourceForeground');
case Status.MODIFIED:
return new ThemeColor('gitDecoration.modifiedResourceForeground');
case Status.INDEX_DELETED:
+ return new ThemeColor('gitDecoration.stageDeletedResourceForeground');
case Status.DELETED:
return new ThemeColor('gitDecoration.deletedResourceForeground');
case Status.INDEX_ADDED:
@@ -253,23 +263,35 @@ export class Resource implements SourceControlResourceState {
}
}
- get resourceDecoration(): Decoration {
- return {
- bubble: this.type !== Status.DELETED && this.type !== Status.INDEX_DELETED,
- title: this.tooltip,
- letter: this.letter,
- color: this.color,
- priority: this.priority
- };
+ get resourceDecoration(): FileDecoration {
+ const res = new FileDecoration(this.letter, this.tooltip, this.color);
+ res.propagate = this.type !== Status.DELETED && this.type !== Status.INDEX_DELETED;
+ return res;
}
constructor(
+ private _commandResolver: ResourceCommandResolver,
private _resourceGroupType: ResourceGroupType,
private _resourceUri: Uri,
private _type: Status,
private _useIcons: boolean,
- private _renameResourceUri?: Uri
+ private _renameResourceUri?: Uri,
) { }
+
+ async open(): Promise {
+ const command = this.command;
+ await commands.executeCommand(command.command, ...(command.arguments || []));
+ }
+
+ async openFile(): Promise {
+ const command = this._commandResolver.resolveFileCommand(this);
+ await commands.executeCommand(command.command, ...(command.arguments || []));
+ }
+
+ async openChange(): Promise {
+ const command = this._commandResolver.resolveChangeCommand(this);
+ await commands.executeCommand(command.command, ...(command.arguments || []));
+ }
}
export const enum Operation {
@@ -294,6 +316,7 @@ export const enum Operation {
Fetch = 'Fetch',
Pull = 'Pull',
Push = 'Push',
+ CherryPick = 'CherryPick',
Sync = 'Sync',
Show = 'Show',
Stage = 'Stage',
@@ -302,6 +325,7 @@ export const enum Operation {
RenameBranch = 'RenameBranch',
DeleteRef = 'DeleteRef',
Merge = 'Merge',
+ Rebase = 'Rebase',
Ignore = 'Ignore',
Tag = 'Tag',
DeleteTag = 'DeleteTag',
@@ -316,6 +340,8 @@ export const enum Operation {
Blame = 'Blame',
Log = 'Log',
LogFile = 'LogFile',
+
+ Move = 'Move'
}
function isReadOnly(operation: Operation): boolean {
@@ -551,6 +577,142 @@ class DotGitWatcher implements IFileWatcher {
}
}
+class ResourceCommandResolver {
+
+ constructor(private repository: Repository) { }
+
+ resolveDefaultCommand(resource: Resource): Command {
+ const config = workspace.getConfiguration('git', Uri.file(this.repository.root));
+ const openDiffOnClick = config.get('openDiffOnClick', true);
+ return openDiffOnClick ? this.resolveChangeCommand(resource) : this.resolveFileCommand(resource);
+ }
+
+ resolveFileCommand(resource: Resource): Command {
+ return {
+ command: 'vscode.open',
+ title: localize('open', "Open"),
+ arguments: [resource.resourceUri]
+ };
+ }
+
+ resolveChangeCommand(resource: Resource): Command {
+ const title = this.getTitle(resource);
+
+ if (!resource.leftUri) {
+ return {
+ command: 'vscode.open',
+ title: localize('open', "Open"),
+ arguments: [resource.rightUri, { override: resource.type === Status.BOTH_MODIFIED ? false : undefined }, title]
+ };
+ } else {
+ return {
+ command: 'vscode.diff',
+ title: localize('open', "Open"),
+ arguments: [resource.leftUri, resource.rightUri, title]
+ };
+ }
+ }
+
+ getResources(resource: Resource): [Uri | undefined, Uri] {
+ for (const submodule of this.repository.submodules) {
+ if (path.join(this.repository.root, submodule.path) === resource.resourceUri.fsPath) {
+ return [undefined, toGitUri(resource.resourceUri, resource.resourceGroupType === ResourceGroupType.Index ? 'index' : 'wt', { submoduleOf: this.repository.root })];
+ }
+ }
+
+ return [this.getLeftResource(resource), this.getRightResource(resource)];
+ }
+
+ private getLeftResource(resource: Resource): Uri | undefined {
+ switch (resource.type) {
+ case Status.INDEX_MODIFIED:
+ case Status.INDEX_RENAMED:
+ case Status.INDEX_ADDED:
+ return toGitUri(resource.original, 'HEAD');
+
+ case Status.MODIFIED:
+ case Status.UNTRACKED:
+ return toGitUri(resource.resourceUri, '~');
+
+ case Status.DELETED_BY_US:
+ case Status.DELETED_BY_THEM:
+ return toGitUri(resource.resourceUri, '~1');
+ }
+ return undefined;
+ }
+
+ private getRightResource(resource: Resource): Uri {
+ switch (resource.type) {
+ case Status.INDEX_MODIFIED:
+ case Status.INDEX_ADDED:
+ case Status.INDEX_COPIED:
+ case Status.INDEX_RENAMED:
+ return toGitUri(resource.resourceUri, '');
+
+ case Status.INDEX_DELETED:
+ case Status.DELETED:
+ return toGitUri(resource.resourceUri, 'HEAD');
+
+ case Status.DELETED_BY_US:
+ return toGitUri(resource.resourceUri, '~3');
+
+ case Status.DELETED_BY_THEM:
+ return toGitUri(resource.resourceUri, '~2');
+
+ case Status.MODIFIED:
+ case Status.UNTRACKED:
+ case Status.IGNORED:
+ case Status.INTENT_TO_ADD:
+ const uriString = resource.resourceUri.toString();
+ const [indexStatus] = this.repository.indexGroup.resourceStates.filter(r => r.resourceUri.toString() === uriString);
+
+ if (indexStatus && indexStatus.renameResourceUri) {
+ return indexStatus.renameResourceUri;
+ }
+
+ return resource.resourceUri;
+
+ case Status.BOTH_ADDED:
+ case Status.BOTH_MODIFIED:
+ return resource.resourceUri;
+ }
+
+ throw new Error('Should never happen');
+ }
+
+ private getTitle(resource: Resource): string {
+ const basename = path.basename(resource.resourceUri.fsPath);
+
+ switch (resource.type) {
+ case Status.INDEX_MODIFIED:
+ case Status.INDEX_RENAMED:
+ case Status.INDEX_ADDED:
+ return localize('git.title.index', '{0} (Index)', basename);
+
+ case Status.MODIFIED:
+ case Status.BOTH_ADDED:
+ case Status.BOTH_MODIFIED:
+ return localize('git.title.workingTree', '{0} (Working Tree)', basename);
+
+ case Status.INDEX_DELETED:
+ case Status.DELETED:
+ return localize('git.title.deleted', '{0} (Deleted)', basename);
+
+ case Status.DELETED_BY_US:
+ return localize('git.title.theirs', '{0} (Theirs)', basename);
+
+ case Status.DELETED_BY_THEM:
+ return localize('git.title.ours', '{0} (Ours)', basename);
+
+ case Status.UNTRACKED:
+ return localize('git.title.untracked', '{0} (Untracked)', basename);
+
+ default:
+ return '';
+ }
+ }
+}
+
export class Repository implements Disposable {
private _onDidChangeRepository = new EventEmitter();
@@ -644,6 +806,7 @@ export class Repository implements Disposable {
}
this._rebaseCommit = rebaseCommit;
+ commands.executeCommand('setContext', 'gitRebaseInProgress', !!this._rebaseCommit);
}
get rebaseCommit(): Commit | undefined {
@@ -680,6 +843,7 @@ export class Repository implements Disposable {
private isRepositoryHuge = false;
private didWarnAboutLimit = false;
+ private resourceCommandResolver = new ResourceCommandResolver(this);
private disposables: Disposable[] = [];
constructor(
@@ -746,11 +910,12 @@ export class Repository implements Disposable {
onConfigListener(updateIndexGroupVisibility, this, this.disposables);
updateIndexGroupVisibility();
- const onConfigListenerForBranchSortOrder = filterEvent(workspace.onDidChangeConfiguration, e => e.affectsConfiguration('git.branchSortOrder', root));
- onConfigListenerForBranchSortOrder(this.updateModelState, this, this.disposables);
-
- const onConfigListenerForUntracked = filterEvent(workspace.onDidChangeConfiguration, e => e.affectsConfiguration('git.untrackedChanges', root));
- onConfigListenerForUntracked(this.updateModelState, this, this.disposables);
+ filterEvent(workspace.onDidChangeConfiguration, e =>
+ e.affectsConfiguration('git.branchSortOrder', root)
+ || e.affectsConfiguration('git.untrackedChanges', root)
+ || e.affectsConfiguration('git.ignoreSubmodules', root)
+ || e.affectsConfiguration('git.openDiffOnClick', root)
+ )(this.updateModelState, this, this.disposables);
const updateInputBoxVisibility = () => {
const config = workspace.getConfiguration('git', root);
@@ -771,7 +936,7 @@ export class Repository implements Disposable {
this.disposables.push(new AutoFetcher(this, globalState));
- // https://github.com/Microsoft/vscode/issues/39039
+ // https://github.com/microsoft/vscode/issues/39039
const onSuccessfulPush = filterEvent(this.onDidRunOperation, e => e.operation === Operation.Push && !e.error);
onSuccessfulPush(() => {
const gitConfig = workspace.getConfiguration('git');
@@ -864,6 +1029,12 @@ export class Repository implements Disposable {
return;
}
+ const path = uri.path;
+
+ if (this.mergeGroup.resourceStates.some(r => r.resourceUri.path === path)) {
+ return undefined;
+ }
+
return toGitUri(uri, '', { replaceFileExtension: true });
}
@@ -976,7 +1147,7 @@ export class Repository implements Disposable {
await this.run(Operation.RevertFiles, () => this.repository.revert('HEAD', resources.map(r => r.fsPath)));
}
- async commit(message: string, opts: CommitOptions = Object.create(null)): Promise {
+ async commit(message: string | undefined, opts: CommitOptions = Object.create(null)): Promise {
if (this.rebaseCommit) {
await this.run(Operation.RebaseContinue, async () => {
if (opts.all) {
@@ -1053,6 +1224,14 @@ export class Repository implements Disposable {
await this.run(Operation.RenameBranch, () => this.repository.renameBranch(name));
}
+ async cherryPick(commitHash: string): Promise {
+ await this.run(Operation.CherryPick, () => this.repository.cherryPick(commitHash));
+ }
+
+ async move(from: string, to: string): Promise {
+ await this.run(Operation.Move, () => this.repository.move(from, to));
+ }
+
async getBranch(name: string): Promise {
return await this.run(Operation.GetBranch, () => this.repository.getBranch(name));
}
@@ -1069,6 +1248,10 @@ export class Repository implements Disposable {
await this.run(Operation.Merge, () => this.repository.merge(ref));
}
+ async rebase(branch: string): Promise {
+ await this.run(Operation.Rebase, () => this.repository.rebase(branch));
+ }
+
async tag(name: string, message?: string): Promise {
await this.run(Operation.Tag, () => this.repository.tag(name, message));
}
@@ -1077,8 +1260,8 @@ export class Repository implements Disposable {
await this.run(Operation.DeleteTag, () => this.repository.deleteTag(name));
}
- async checkout(treeish: string): Promise {
- await this.run(Operation.Checkout, () => this.repository.checkout(treeish, []));
+ async checkout(treeish: string, opts?: { detached?: boolean }): Promise {
+ await this.run(Operation.Checkout, () => this.repository.checkout(treeish, [], opts));
}
async checkoutTracking(treeish: string): Promise {
@@ -1115,21 +1298,31 @@ export class Repository implements Disposable {
@throttle
async fetchDefault(options: { silent?: boolean } = {}): Promise {
- await this.run(Operation.Fetch, () => this.repository.fetch(options));
+ await this._fetch({ silent: options.silent });
}
@throttle
async fetchPrune(): Promise {
- await this.run(Operation.Fetch, () => this.repository.fetch({ prune: true }));
+ await this._fetch({ prune: true });
}
@throttle
async fetchAll(): Promise {
- await this.run(Operation.Fetch, () => this.repository.fetch({ all: true }));
+ await this._fetch({ all: true });
}
async fetch(remote?: string, ref?: string, depth?: number): Promise {
- await this.run(Operation.Fetch, () => this.repository.fetch({ remote, ref, depth }));
+ await this._fetch({ remote, ref, depth });
+ }
+
+ private async _fetch(options: { remote?: string, ref?: string, all?: boolean, prune?: boolean, depth?: number, silent?: boolean } = {}): Promise {
+ if (!options.prune) {
+ const config = workspace.getConfiguration('git', Uri.file(this.root));
+ const prune = config.get('pruneOnFetch');
+ options.prune = prune;
+ }
+
+ await this.run(Operation.Fetch, async () => this.repository.fetch(options));
}
@throttle
@@ -1165,11 +1358,12 @@ export class Repository implements Disposable {
const fetchOnPull = config.get('fetchOnPull');
const tags = config.get('pullTags');
+ // When fetchOnPull is enabled, fetch all branches when pulling
if (fetchOnPull) {
- await this.repository.pull(rebase, undefined, undefined, { unshallow, tags });
- } else {
- await this.repository.pull(rebase, remote, branch, { unshallow, tags });
+ await this.repository.fetch({ all: true });
}
+
+ await this.repository.pull(rebase, remote, branch, { unshallow, tags });
});
});
}
@@ -1195,6 +1389,10 @@ export class Repository implements Disposable {
await this.run(Operation.Push, () => this._push(remote, undefined, false, true, forcePushMode));
}
+ async pushTags(remote?: string, forcePushMode?: ForcePushMode): Promise {
+ await this.run(Operation.Push, () => this._push(remote, undefined, false, false, forcePushMode, true));
+ }
+
async blame(path: string): Promise {
return await this.run(Operation.Blame, () => this.repository.blame(path));
}
@@ -1225,11 +1423,18 @@ export class Repository implements Disposable {
const config = workspace.getConfiguration('git', Uri.file(this.root));
const fetchOnPull = config.get('fetchOnPull');
const tags = config.get('pullTags');
+ const followTags = config.get('followTagsWhenSync');
const supportCancellation = config.get('supportCancellation');
- const fn = fetchOnPull
- ? async (cancellationToken?: CancellationToken) => await this.repository.pull(rebase, undefined, undefined, { tags, cancellationToken })
- : async (cancellationToken?: CancellationToken) => await this.repository.pull(rebase, remoteName, pullBranch, { tags, cancellationToken });
+ const fn = async (cancellationToken?: CancellationToken) => {
+ // When fetchOnPull is enabled, fetch all branches when pulling
+ if (fetchOnPull) {
+ await this.repository.fetch({ all: true, cancellationToken });
+ }
+
+ await this.repository.pull(rebase, remoteName, pullBranch, { tags, cancellationToken });
+ };
+
if (supportCancellation) {
const opts: ProgressOptions = {
@@ -1252,7 +1457,7 @@ export class Repository implements Disposable {
const shouldPush = this.HEAD && (typeof this.HEAD.ahead === 'number' ? this.HEAD.ahead > 0 : true);
if (shouldPush) {
- await this._push(remoteName, pushBranch);
+ await this._push(remoteName, pushBranch, false, followTags);
}
});
});
@@ -1414,9 +1619,9 @@ export class Repository implements Disposable {
return ignored;
}
- private async _push(remote?: string, refspec?: string, setUpstream: boolean = false, tags = false, forcePushMode?: ForcePushMode): Promise {
+ private async _push(remote?: string, refspec?: string, setUpstream: boolean = false, followTags = false, forcePushMode?: ForcePushMode, tags = false): Promise {
try {
- await this.repository.push(remote, refspec, setUpstream, tags, forcePushMode);
+ await this.repository.push(remote, refspec, setUpstream, followTags, forcePushMode, tags);
} catch (err) {
if (!remote || !refspec) {
throw err;
@@ -1514,9 +1719,12 @@ export class Repository implements Disposable {
@throttle
private async updateModelState(): Promise {
- const { status, didHitLimit } = await this.repository.getStatus();
- const config = workspace.getConfiguration('git');
const scopedConfig = workspace.getConfiguration('git', Uri.file(this.repository.root));
+ const ignoreSubmodules = scopedConfig.get('ignoreSubmodules');
+
+ const { status, didHitLimit } = await this.repository.getStatus({ ignoreSubmodules });
+
+ const config = workspace.getConfiguration('git');
const shouldIgnore = config.get('ignoreLimitWarning') === true;
const useIcons = !config.get('decorations.enabled', true);
this.isRepositoryHuge = didHitLimit;
@@ -1591,36 +1799,36 @@ export class Repository implements Disposable {
switch (raw.x + raw.y) {
case '??': switch (untrackedChanges) {
- case 'mixed': return workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.UNTRACKED, useIcons));
- case 'separate': return untracked.push(new Resource(ResourceGroupType.Untracked, uri, Status.UNTRACKED, useIcons));
+ case 'mixed': return workingTree.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.UNTRACKED, useIcons));
+ case 'separate': return untracked.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Untracked, uri, Status.UNTRACKED, useIcons));
default: return undefined;
}
case '!!': switch (untrackedChanges) {
- case 'mixed': return workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.IGNORED, useIcons));
- case 'separate': return untracked.push(new Resource(ResourceGroupType.Untracked, uri, Status.IGNORED, useIcons));
+ case 'mixed': return workingTree.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.IGNORED, useIcons));
+ case 'separate': return untracked.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Untracked, uri, Status.IGNORED, useIcons));
default: return undefined;
}
- case 'DD': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.BOTH_DELETED, useIcons));
- case 'AU': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.ADDED_BY_US, useIcons));
- case 'UD': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.DELETED_BY_THEM, useIcons));
- case 'UA': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.ADDED_BY_THEM, useIcons));
- case 'DU': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.DELETED_BY_US, useIcons));
- case 'AA': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.BOTH_ADDED, useIcons));
- case 'UU': return merge.push(new Resource(ResourceGroupType.Merge, uri, Status.BOTH_MODIFIED, useIcons));
+ case 'DD': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.BOTH_DELETED, useIcons));
+ case 'AU': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.ADDED_BY_US, useIcons));
+ case 'UD': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.DELETED_BY_THEM, useIcons));
+ case 'UA': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.ADDED_BY_THEM, useIcons));
+ case 'DU': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.DELETED_BY_US, useIcons));
+ case 'AA': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.BOTH_ADDED, useIcons));
+ case 'UU': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.BOTH_MODIFIED, useIcons));
}
switch (raw.x) {
- case 'M': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_MODIFIED, useIcons)); break;
- case 'A': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_ADDED, useIcons)); break;
- case 'D': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_DELETED, useIcons)); break;
- case 'R': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_RENAMED, useIcons, renameUri)); break;
- case 'C': index.push(new Resource(ResourceGroupType.Index, uri, Status.INDEX_COPIED, useIcons, renameUri)); break;
+ case 'M': index.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_MODIFIED, useIcons)); break;
+ case 'A': index.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_ADDED, useIcons)); break;
+ case 'D': index.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_DELETED, useIcons)); break;
+ case 'R': index.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_RENAMED, useIcons, renameUri)); break;
+ case 'C': index.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_COPIED, useIcons, renameUri)); break;
}
switch (raw.y) {
- case 'M': workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.MODIFIED, useIcons, renameUri)); break;
- case 'D': workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.DELETED, useIcons, renameUri)); break;
- case 'A': workingTree.push(new Resource(ResourceGroupType.WorkingTree, uri, Status.INTENT_TO_ADD, useIcons, renameUri)); break;
+ case 'M': workingTree.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.MODIFIED, useIcons, renameUri)); break;
+ case 'D': workingTree.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.DELETED, useIcons, renameUri)); break;
+ case 'A': workingTree.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.INTENT_TO_ADD, useIcons, renameUri)); break;
}
return undefined;
@@ -1788,6 +1996,28 @@ export class Repository implements Disposable {
return `${this.HEAD.behind}â ${this.HEAD.ahead}â`;
}
+ get syncTooltip(): string {
+ if (!this.HEAD
+ || !this.HEAD.name
+ || !this.HEAD.commit
+ || !this.HEAD.upstream
+ || !(this.HEAD.ahead || this.HEAD.behind)
+ ) {
+ return localize('sync changes', "Synchronize Changes");
+ }
+
+ const remoteName = this.HEAD && this.HEAD.remote || this.HEAD.upstream.remote;
+ const remote = this.remotes.find(r => r.name === remoteName);
+
+ if ((remote && remote.isReadOnly) || !this.HEAD.ahead) {
+ return localize('pull n', "Pull {0} commits from {1}/{2}", this.HEAD.behind, this.HEAD.upstream.remote, this.HEAD.upstream.name);
+ } else if (!this.HEAD.behind) {
+ return localize('push n', "Push {0} commits to {1}/{2}", this.HEAD.ahead, this.HEAD.upstream.remote, this.HEAD.upstream.name);
+ } else {
+ return localize('pull push n', "Pull {0} and push {1} commits between {2}/{3}", this.HEAD.behind, this.HEAD.ahead, this.HEAD.upstream.remote, this.HEAD.upstream.name);
+ }
+ }
+
private updateInputBoxPlaceholder(): void {
const branchName = this.headShortName;
diff --git a/extensions/git/src/statusbar.ts b/extensions/git/src/statusbar.ts
index 7b49689eb4..4b325aaece 100644
--- a/extensions/git/src/statusbar.ts
+++ b/extensions/git/src/statusbar.ts
@@ -28,7 +28,7 @@ class CheckoutStatusBar {
return {
command: 'git.checkout',
- tooltip: `${this.repository.headLabel}`,
+ tooltip: localize('checkout', "Checkout branch/tag..."),
title,
arguments: [this.repository.sourceControl]
};
@@ -150,7 +150,7 @@ class SyncStatusBar {
const rebaseWhenSync = config.get('rebaseWhenSync');
command = rebaseWhenSync ? 'git.syncRebase' : 'git.sync';
- tooltip = localize('sync changes', "Synchronize Changes");
+ tooltip = this.repository.syncTooltip;
} else {
icon = '$(cloud-upload)';
command = 'git.publish';
diff --git a/extensions/git/src/test/git.test.ts b/extensions/git/src/test/git.test.ts
index 8c18a6ddfc..842795ff7d 100644
--- a/extensions/git/src/test/git.test.ts
+++ b/extensions/git/src/test/git.test.ts
@@ -184,6 +184,17 @@ suite('git', () => {
{ name: 'deps/spdlog', path: 'deps/spdlog', url: 'https://github.com/gabime/spdlog.git' }
]);
});
+
+ test('whitespace again #108371', () => {
+ const sample = `[submodule "deps/spdlog"]
+ path= deps/spdlog
+ url=https://github.com/gabime/spdlog.git
+`;
+
+ assert.deepEqual(parseGitmodules(sample), [
+ { name: 'deps/spdlog', path: 'deps/spdlog', url: 'https://github.com/gabime/spdlog.git' }
+ ]);
+ });
});
suite('parseGitCommit', () => {
diff --git a/extensions/git/src/timelineProvider.ts b/extensions/git/src/timelineProvider.ts
index 4c239f9ace..9782472992 100644
--- a/extensions/git/src/timelineProvider.ts
+++ b/extensions/git/src/timelineProvider.ts
@@ -4,10 +4,11 @@
*--------------------------------------------------------------------------------------------*/
import * as nls from 'vscode-nls';
-import { CancellationToken, Disposable, env, Event, EventEmitter, ThemeIcon, Timeline, TimelineChangeEvent, TimelineItem, TimelineOptions, TimelineProvider, Uri, workspace } from 'vscode';
+import { CancellationToken, ConfigurationChangeEvent, Disposable, env, Event, EventEmitter, ThemeIcon, Timeline, TimelineChangeEvent, TimelineItem, TimelineOptions, TimelineProvider, Uri, workspace } from 'vscode';
import { Model } from './model';
import { Repository, Resource } from './repository';
import { debounce } from './decorators';
+import { emojify, ensureEmojis } from './emoji';
const localize = nls.loadMessageBundle();
@@ -75,6 +76,7 @@ export class GitTimelineProvider implements TimelineProvider {
constructor(private readonly model: Model) {
this.disposable = Disposable.from(
model.onDidOpenRepository(this.onRepositoriesChanged, this),
+ workspace.onDidChangeConfiguration(this.onConfigurationChanged, this)
);
if (model.repositories.length) {
@@ -110,6 +112,8 @@ export class GitTimelineProvider implements TimelineProvider {
);
}
+ const config = workspace.getConfiguration('git.timeline');
+
// TODO@eamodio: Ensure that the uri is a file -- if not we could get the history of the repo?
let limit: number | undefined;
@@ -129,6 +133,8 @@ export class GitTimelineProvider implements TimelineProvider {
limit = options.limit === undefined ? undefined : options.limit + 1;
}
+ await ensureEmojis();
+
const commits = await repo.logFile(uri, {
maxEntries: limit,
hash: options.cursor,
@@ -146,13 +152,20 @@ export class GitTimelineProvider implements TimelineProvider {
const dateFormatter = new Intl.DateTimeFormat(env.language, { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric' });
- const items = commits.map((c, i) => {
- const date = c.commitDate; // c.authorDate
+ const dateType = config.get<'committed' | 'authored'>('date');
+ const showAuthor = config.get('showAuthor');
- const item = new GitTimelineItem(c.hash, commits[i + 1]?.hash ?? `${c.hash}^`, c.message, date?.getTime() ?? 0, c.hash, 'git:file:commit');
+ const items = commits.map((c, i) => {
+ const date = dateType === 'authored' ? c.authorDate : c.commitDate;
+
+ const message = emojify(c.message);
+
+ const item = new GitTimelineItem(c.hash, commits[i + 1]?.hash ?? `${c.hash}^`, message, date?.getTime() ?? 0, c.hash, 'git:file:commit');
item.iconPath = new (ThemeIcon as any)('git-commit');
- item.description = c.authorName;
- item.detail = `${c.authorName} (${c.authorEmail}) \u2014 ${c.hash.substr(0, 8)}\n${dateFormatter.format(date)}\n\n${c.message}`;
+ if (showAuthor) {
+ item.description = c.authorName;
+ }
+ item.detail = `${c.authorName} (${c.authorEmail}) â ${c.hash.substr(0, 8)}\n${dateFormatter.format(date)}\n\n${message}`;
item.command = {
title: 'Open Comparison',
command: 'git.timeline.openDiff',
@@ -173,7 +186,7 @@ export class GitTimelineProvider implements TimelineProvider {
// TODO@eamodio: Replace with a better icon -- reflecting its status maybe?
item.iconPath = new (ThemeIcon as any)('git-commit');
item.description = '';
- item.detail = localize('git.timeline.detail', '{0} \u2014 {1}\n{2}\n\n{3}', you, localize('git.index', 'Index'), dateFormatter.format(date), Resource.getStatusText(index.type));
+ item.detail = localize('git.timeline.detail', '{0} â {1}\n{2}\n\n{3}', you, localize('git.index', 'Index'), dateFormatter.format(date), Resource.getStatusText(index.type));
item.command = {
title: 'Open Comparison',
command: 'git.timeline.openDiff',
@@ -187,11 +200,11 @@ export class GitTimelineProvider implements TimelineProvider {
if (working) {
const date = new Date();
- const item = new GitTimelineItem('', index ? '~' : 'HEAD', localize('git.timeline.uncommitedChanges', 'Uncommited Changes'), date.getTime(), 'working', 'git:file:working');
+ const item = new GitTimelineItem('', index ? '~' : 'HEAD', localize('git.timeline.uncommitedChanges', 'Uncommitted Changes'), date.getTime(), 'working', 'git:file:working');
// TODO@eamodio: Replace with a better icon -- reflecting its status maybe?
item.iconPath = new (ThemeIcon as any)('git-commit');
item.description = '';
- item.detail = localize('git.timeline.detail', '{0} \u2014 {1}\n{2}\n\n{3}', you, localize('git.workingTree', 'Working Tree'), dateFormatter.format(date), Resource.getStatusText(working.type));
+ item.detail = localize('git.timeline.detail', '{0} â {1}\n{2}\n\n{3}', you, localize('git.workingTree', 'Working Tree'), dateFormatter.format(date), Resource.getStatusText(working.type));
item.command = {
title: 'Open Comparison',
command: 'git.timeline.openDiff',
@@ -214,6 +227,12 @@ export class GitTimelineProvider implements TimelineProvider {
}
}
+ private onConfigurationChanged(e: ConfigurationChangeEvent) {
+ if (e.affectsConfiguration('git.timeline.date') || e.affectsConfiguration('git.timeline.showAuthor')) {
+ this.fireChanged();
+ }
+ }
+
private onRepositoriesChanged(_repo: Repository) {
// console.log(`GitTimelineProvider.onRepositoriesChanged`);
diff --git a/extensions/git/src/util.ts b/extensions/git/src/util.ts
index 18c8d700de..2bcd5d651d 100644
--- a/extensions/git/src/util.ts
+++ b/extensions/git/src/util.ts
@@ -353,7 +353,7 @@ export class Limiter {
}
queue(factory: () => Promise): Promise {
- return new Promise((c, e) => {
+ return new Promise((c, e) => {
this.outstandingPromises.push({ factory, c, e });
this.consume();
});
diff --git a/extensions/github-authentication/src/common/keychain.ts b/extensions/github-authentication/src/common/keychain.ts
index fc4d4d7320..bf331b1335 100644
--- a/extensions/github-authentication/src/common/keychain.ts
+++ b/extensions/github-authentication/src/common/keychain.ts
@@ -28,24 +28,12 @@ export type Keytar = {
deletePassword: typeof keytarType['deletePassword'];
};
-const SERVICE_ID = `${vscode.env.uriScheme}-github.login`;
-const ACCOUNT_ID = 'account';
+const SERVICE_ID = `github.auth`;
export class Keychain {
- private keytar: Keytar;
-
- constructor() {
- const keytar = getKeytar();
- if (!keytar) {
- throw new Error('System keychain unavailable');
- }
-
- this.keytar = keytar;
- }
-
async setToken(token: string): Promise {
try {
- return await this.keytar.setPassword(SERVICE_ID, ACCOUNT_ID, token);
+ return await vscode.authentication.setPassword(SERVICE_ID, token);
} catch (e) {
// Ignore
Logger.error(`Setting token failed: ${e}`);
@@ -59,7 +47,7 @@ export class Keychain {
async getToken(): Promise {
try {
- return await this.keytar.getPassword(SERVICE_ID, ACCOUNT_ID);
+ return await vscode.authentication.getPassword(SERVICE_ID);
} catch (e) {
// Ignore
Logger.error(`Getting token failed: ${e}`);
@@ -67,15 +55,35 @@ export class Keychain {
}
}
- async deleteToken(): Promise {
+ async deleteToken(): Promise {
try {
- return await this.keytar.deletePassword(SERVICE_ID, ACCOUNT_ID);
+ return await vscode.authentication.deletePassword(SERVICE_ID);
} catch (e) {
// Ignore
Logger.error(`Deleting token failed: ${e}`);
return Promise.resolve(undefined);
}
}
+
+ async tryMigrate(): Promise {
+ try {
+ const keytar = getKeytar();
+ if (!keytar) {
+ throw new Error('keytar unavailable');
+ }
+
+ const oldValue = await keytar.getPassword(`${vscode.env.uriScheme}-github.login`, 'account');
+ if (oldValue) {
+ await this.setToken(oldValue);
+ await keytar.deletePassword(`${vscode.env.uriScheme}-github.login`, 'account');
+ }
+
+ return oldValue;
+ } catch (_) {
+ // Ignore
+ return Promise.resolve(undefined);
+ }
+ }
}
export const keychain = new Keychain();
diff --git a/extensions/github-authentication/src/common/utils.ts b/extensions/github-authentication/src/common/utils.ts
index 9f19b3abdc..5204cc4989 100644
--- a/extensions/github-authentication/src/common/utils.ts
+++ b/extensions/github-authentication/src/common/utils.ts
@@ -25,7 +25,7 @@ export interface PromiseAdapter {
(
value: T,
resolve:
- (value?: U | PromiseLike) => void,
+ (value: U | PromiseLike) => void,
reject:
(reason: any) => void
): any;
diff --git a/extensions/github-authentication/src/extension.ts b/extensions/github-authentication/src/extension.ts
index 335dbc411e..3de3bd5d54 100644
--- a/extensions/github-authentication/src/extension.ts
+++ b/extensions/github-authentication/src/extension.ts
@@ -16,7 +16,7 @@ export async function activate(context: vscode.ExtensionContext) {
context.subscriptions.push(vscode.window.registerUriHandler(uriHandler));
const loginService = new GitHubAuthenticationProvider();
- await loginService.initialize();
+ await loginService.initialize(context);
context.subscriptions.push(vscode.commands.registerCommand('github.provide-token', () => {
return loginService.manuallyProvideToken();
@@ -40,6 +40,15 @@ export async function activate(context: vscode.ExtensionContext) {
onDidChangeSessions.fire({ added: [session.id], removed: [], changed: [] });
return session;
} catch (e) {
+ // If login was cancelled, do not notify user.
+ if (e.message === 'Cancelled') {
+ /* __GDPR__
+ "loginCancelled" : { }
+ */
+ telemetryReporter.sendTelemetryEvent('loginCancelled');
+ throw e;
+ }
+
/* __GDPR__
"loginFailed" : { }
*/
diff --git a/extensions/github-authentication/src/github.ts b/extensions/github-authentication/src/github.ts
index c64aa9b804..e49d8271b0 100644
--- a/extensions/github-authentication/src/github.ts
+++ b/extensions/github-authentication/src/github.ts
@@ -26,63 +26,82 @@ export class GitHubAuthenticationProvider {
private _sessions: vscode.AuthenticationSession[] = [];
private _githubServer = new GitHubServer();
- public async initialize(): Promise {
+ public async initialize(context: vscode.ExtensionContext): Promise {
try {
this._sessions = await this.readSessions();
+ await this.verifySessions();
} catch (e) {
// Ignore, network request failed
}
- this.pollForChange();
+ context.subscriptions.push(vscode.authentication.onDidChangePassword(() => this.checkForUpdates()));
}
- private pollForChange() {
- setTimeout(async () => {
- let storedSessions: vscode.AuthenticationSession[];
+ private async verifySessions(): Promise {
+ const verifiedSessions: vscode.AuthenticationSession[] = [];
+ const verificationPromises = this._sessions.map(async session => {
try {
- storedSessions = await this.readSessions();
+ await this._githubServer.getUserInfo(session.accessToken);
+ verifiedSessions.push(session);
} catch (e) {
- // Ignore, network request failed
- return;
- }
-
- const added: string[] = [];
- const removed: string[] = [];
-
- storedSessions.forEach(session => {
- const matchesExisting = this._sessions.some(s => s.id === session.id);
- // Another window added a session to the keychain, add it to our state as well
- if (!matchesExisting) {
- Logger.info('Adding session found in keychain');
- this._sessions.push(session);
- added.push(session.id);
+ // Remove sessions that return unauthorized response
+ if (e.message !== 'Unauthorized') {
+ verifiedSessions.push(session);
}
- });
-
- this._sessions.map(session => {
- const matchesExisting = storedSessions.some(s => s.id === session.id);
- // Another window has logged out, remove from our state
- if (!matchesExisting) {
- Logger.info('Removing session no longer found in keychain');
- const sessionIndex = this._sessions.findIndex(s => s.id === session.id);
- if (sessionIndex > -1) {
- this._sessions.splice(sessionIndex, 1);
- }
-
- removed.push(session.id);
- }
- });
-
- if (added.length || removed.length) {
- onDidChangeSessions.fire({ added, removed, changed: [] });
}
+ });
- this.pollForChange();
- }, 1000 * 30);
+ Promise.all(verificationPromises).then(_ => {
+ if (this._sessions.length !== verifiedSessions.length) {
+ this._sessions = verifiedSessions;
+ this.storeSessions();
+ }
+ });
+ }
+
+ private async checkForUpdates() {
+ let storedSessions: vscode.AuthenticationSession[];
+ try {
+ storedSessions = await this.readSessions();
+ } catch (e) {
+ // Ignore, network request failed
+ return;
+ }
+
+ const added: string[] = [];
+ const removed: string[] = [];
+
+ storedSessions.forEach(session => {
+ const matchesExisting = this._sessions.some(s => s.id === session.id);
+ // Another window added a session to the keychain, add it to our state as well
+ if (!matchesExisting) {
+ Logger.info('Adding session found in keychain');
+ this._sessions.push(session);
+ added.push(session.id);
+ }
+ });
+
+ this._sessions.map(session => {
+ const matchesExisting = storedSessions.some(s => s.id === session.id);
+ // Another window has logged out, remove from our state
+ if (!matchesExisting) {
+ Logger.info('Removing session no longer found in keychain');
+ const sessionIndex = this._sessions.findIndex(s => s.id === session.id);
+ if (sessionIndex > -1) {
+ this._sessions.splice(sessionIndex, 1);
+ }
+
+ removed.push(session.id);
+ }
+ });
+
+ if (added.length || removed.length) {
+ onDidChangeSessions.fire({ added, removed, changed: [] });
+ }
}
private async readSessions(): Promise {
- const storedSessions = await keychain.getToken();
+ const storedSessions = await keychain.getToken() || await keychain.tryMigrate();
if (storedSessions) {
try {
const sessionData: SessionData[] = JSON.parse(storedSessions);
@@ -161,9 +180,12 @@ export class GitHubAuthenticationProvider {
}
public async logout(id: string) {
+ Logger.info(`Logging out of ${id}`);
const sessionIndex = this._sessions.findIndex(session => session.id === id);
if (sessionIndex > -1) {
this._sessions.splice(sessionIndex, 1);
+ } else {
+ Logger.error('Session not found');
}
await this.storeSessions();
diff --git a/extensions/github-authentication/src/githubServer.ts b/extensions/github-authentication/src/githubServer.ts
index 33cbd5c28e..17de5c2a04 100644
--- a/extensions/github-authentication/src/githubServer.ts
+++ b/extensions/github-authentication/src/githubServer.ts
@@ -5,7 +5,7 @@
import * as nls from 'vscode-nls';
import * as vscode from 'vscode';
-import fetch from 'node-fetch';
+import fetch, { Response } from 'node-fetch';
import { v4 as uuid } from 'uuid';
import { PromiseAdapter, promiseFromEvent } from './common/utils';
import Logger from './common/logger';
@@ -23,38 +23,9 @@ class UriEventHandler extends vscode.EventEmitter implements vscode.
export const uriHandler = new UriEventHandler;
-const onDidManuallyProvideToken = new vscode.EventEmitter();
+const onDidManuallyProvideToken = new vscode.EventEmitter();
-const exchangeCodeForToken: (state: string) => PromiseAdapter =
- (state) => async (uri, resolve, reject) => {
- Logger.info('Exchanging code for token...');
- const query = parseQuery(uri);
- const code = query.code;
- if (query.state !== state) {
- reject('Received mismatched state');
- return;
- }
-
- try {
- const result = await fetch(`https://${AUTH_RELAY_SERVER}/token?code=${code}&state=${state}`, {
- method: 'POST',
- headers: {
- Accept: 'application/json'
- }
- });
-
- if (result.ok) {
- const json = await result.json();
- Logger.info('Token exchange success!');
- resolve(json.access_token);
- } else {
- reject(result.statusText);
- }
- } catch (ex) {
- reject(ex);
- }
- };
function parseQuery(uri: vscode.Uri) {
return uri.query.split('&').reduce((prev: any, current) => {
@@ -67,6 +38,9 @@ function parseQuery(uri: vscode.Uri) {
export class GitHubServer {
private _statusBarItem: vscode.StatusBarItem | undefined;
+ private _pendingStates = new Map();
+ private _codeExchangePromises = new Map>();
+
private isTestEnvironment(url: vscode.Uri): boolean {
return url.authority === 'vscode-web-test-playground.azurewebsites.net' || url.authority.startsWith('localhost:');
}
@@ -81,21 +55,82 @@ export class GitHubServer {
if (this.isTestEnvironment(callbackUri)) {
const token = await vscode.window.showInputBox({ prompt: 'GitHub Personal Access Token', ignoreFocusOut: true });
if (!token) { throw new Error('Sign in failed: No token provided'); }
+
+ const tokenScopes = await this.getScopes(token); // Example: ['repo', 'user']
+ const scopesList = scopes.split(' '); // Example: 'read:user repo user:email'
+ if (!scopesList.every(scope => {
+ const included = tokenScopes.includes(scope);
+ if (included || !scope.includes(':')) {
+ return included;
+ }
+
+ return scope.split(':').some(splitScopes => {
+ return tokenScopes.includes(splitScopes);
+ });
+ })) {
+ throw new Error(`The provided token is does not match the requested scopes: ${scopes}`);
+ }
+
this.updateStatusBarItem(false);
return token;
} else {
+ const existingStates = this._pendingStates.get(scopes) || [];
+ this._pendingStates.set(scopes, [...existingStates, state]);
+
const uri = vscode.Uri.parse(`https://${AUTH_RELAY_SERVER}/authorize/?callbackUri=${encodeURIComponent(callbackUri.toString())}&scope=${scopes}&state=${state}&responseType=code&authServer=https://github.com`);
await vscode.env.openExternal(uri);
}
+ // Register a single listener for the URI callback, in case the user starts the login process multiple times
+ // before completing it.
+ let existingPromise = this._codeExchangePromises.get(scopes);
+ if (!existingPromise) {
+ existingPromise = promiseFromEvent(uriHandler.event, this.exchangeCodeForToken(scopes));
+ this._codeExchangePromises.set(scopes, existingPromise);
+ }
+
return Promise.race([
- promiseFromEvent(uriHandler.event, exchangeCodeForToken(state)),
- promiseFromEvent(onDidManuallyProvideToken.event)
+ existingPromise,
+ promiseFromEvent(onDidManuallyProvideToken.event, (token: string | undefined): string => { if (!token) { throw new Error('Cancelled'); } return token; })
]).finally(() => {
+ this._pendingStates.delete(scopes);
+ this._codeExchangePromises.delete(scopes);
this.updateStatusBarItem(false);
});
}
+ private exchangeCodeForToken: (scopes: string) => PromiseAdapter =
+ (scopes) => async (uri, resolve, reject) => {
+ Logger.info('Exchanging code for token...');
+ const query = parseQuery(uri);
+ const code = query.code;
+
+ const acceptedStates = this._pendingStates.get(scopes) || [];
+ if (!acceptedStates.includes(query.state)) {
+ reject('Received mismatched state');
+ return;
+ }
+
+ try {
+ const result = await fetch(`https://${AUTH_RELAY_SERVER}/token?code=${code}&state=${query.state}`, {
+ method: 'POST',
+ headers: {
+ Accept: 'application/json'
+ }
+ });
+
+ if (result.ok) {
+ const json = await result.json();
+ Logger.info('Token exchange success!');
+ resolve(json.access_token);
+ } else {
+ reject(result.statusText);
+ }
+ } catch (ex) {
+ reject(ex);
+ }
+ };
+
private updateStatusBarItem(isStart?: boolean) {
if (isStart && !this._statusBarItem) {
this._statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
@@ -112,7 +147,11 @@ export class GitHubServer {
public async manuallyProvideToken() {
const uriOrToken = await vscode.window.showInputBox({ prompt: 'Token', ignoreFocusOut: true });
- if (!uriOrToken) { return; }
+ if (!uriOrToken) {
+ onDidManuallyProvideToken.fire(undefined);
+ return;
+ }
+
try {
const uri = vscode.Uri.parse(uriOrToken);
if (!uri.scheme || uri.scheme === 'file') { throw new Error; }
@@ -124,10 +163,10 @@ export class GitHubServer {
}
}
- public async getUserInfo(token: string): Promise<{ id: string, accountName: string }> {
+ private async getScopes(token: string): Promise {
try {
- Logger.info('Getting user info...');
- const result = await fetch('https://api.github.com/user', {
+ Logger.info('Getting token scopes...');
+ const result = await fetch('https://api.github.com', {
headers: {
Authorization: `token ${token}`,
'User-Agent': 'Visual-Studio-Code'
@@ -135,11 +174,10 @@ export class GitHubServer {
});
if (result.ok) {
- const json = await result.json();
- Logger.info('Got account info!');
- return { id: json.id, accountName: json.login };
+ const scopes = result.headers.get('X-OAuth-Scopes');
+ return scopes ? scopes.split(',').map(scope => scope.trim()) : [];
} else {
- Logger.error(`Getting account info failed: ${result.statusText}`);
+ Logger.error(`Getting scopes failed: ${result.statusText}`);
throw new Error(result.statusText);
}
} catch (ex) {
@@ -147,4 +185,29 @@ export class GitHubServer {
throw new Error(NETWORK_ERROR);
}
}
+
+ public async getUserInfo(token: string): Promise<{ id: string, accountName: string }> {
+ let result: Response;
+ try {
+ Logger.info('Getting user info...');
+ result = await fetch('https://api.github.com/user', {
+ headers: {
+ Authorization: `token ${token}`,
+ 'User-Agent': 'Visual-Studio-Code'
+ }
+ });
+ } catch (ex) {
+ Logger.error(ex.message);
+ throw new Error(NETWORK_ERROR);
+ }
+
+ if (result.ok) {
+ const json = await result.json();
+ Logger.info('Got account info!');
+ return { id: json.id, accountName: json.login };
+ } else {
+ Logger.error(`Getting account info failed: ${result.statusText}`);
+ throw new Error(result.statusText);
+ }
+ }
}
diff --git a/extensions/github-authentication/yarn.lock b/extensions/github-authentication/yarn.lock
index 50f97842aa..08604b972e 100644
--- a/extensions/github-authentication/yarn.lock
+++ b/extensions/github-authentication/yarn.lock
@@ -74,10 +74,10 @@ base64-js@^1.0.2:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
-bl@^4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.2.tgz#52b71e9088515d0606d9dd9cc7aa48dc1f98e73a"
- integrity sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==
+bl@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489"
+ integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==
dependencies:
buffer "^5.5.0"
inherits "^2.0.4"
@@ -287,9 +287,9 @@ napi-build-utils@^1.0.1:
integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
node-abi@^2.7.0:
- version "2.17.0"
- resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.17.0.tgz#f167c92780497ff01eeaf473fcf8138e0fcc87fa"
- integrity sha512-dFRAA0ACk/aBo0TIXQMEWMLUTyWYYT8OBYIzLmEUrQTElGRjxDCvyBZIsDL0QA7QCaj9PrawhOmTEdsuLY4uOQ==
+ version "2.19.1"
+ resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.19.1.tgz#6aa32561d0a5e2fdb6810d8c25641b657a8cea85"
+ integrity sha512-HbtmIuByq44yhAzK7b9j/FelKlHYISKQn0mtvcBrU5QBkhoCMp5bu8Hv5AI34DcKfOAcJBcOEMwLlwO62FFu9A==
dependencies:
semver "^5.4.1"
@@ -427,9 +427,9 @@ signal-exit@^3.0.0:
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
simple-concat@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
- integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
simple-get@^3.0.3:
version "3.1.0"
@@ -501,11 +501,11 @@ tar-fs@^2.0.0:
tar-stream "^2.0.0"
tar-stream@^2.0.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.2.tgz#6d5ef1a7e5783a95ff70b69b97455a5968dc1325"
- integrity sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa"
+ integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==
dependencies:
- bl "^4.0.1"
+ bl "^4.0.3"
end-of-stream "^1.4.1"
fs-constants "^1.0.0"
inherits "^2.0.3"
diff --git a/extensions/github/src/publish.ts b/extensions/github/src/publish.ts
index 9e08022d9a..8207e9bf7f 100644
--- a/extensions/github/src/publish.ts
+++ b/extensions/github/src/publish.ts
@@ -9,6 +9,7 @@ import { API as GitAPI, Repository } from './typings/git';
import { getOctokit } from './auth';
import { TextEncoder } from 'util';
import { basename } from 'path';
+import { Octokit } from '@octokit/rest';
const localize = nls.loadMessageBundle();
@@ -32,6 +33,9 @@ export async function publishRepository(gitAPI: GitAPI, repository?: Repository)
if (repository) {
folder = repository.rootUri;
+ } else if (gitAPI.repositories.length === 1) {
+ repository = gitAPI.repositories[0];
+ folder = repository.rootUri;
} else if (vscode.workspace.workspaceFolders.length === 1) {
folder = vscode.workspace.workspaceFolders[0].uri;
} else {
@@ -54,9 +58,18 @@ export async function publishRepository(gitAPI: GitAPI, repository?: Repository)
quickpick.show();
quickpick.busy = true;
- const octokit = await getOctokit();
- const user = await octokit.users.getAuthenticated({});
- const owner = user.data.login;
+ let owner: string;
+ let octokit: Octokit;
+ try {
+ octokit = await getOctokit();
+ const user = await octokit.users.getAuthenticated({});
+ owner = user.data.login;
+ } catch (e) {
+ // User has cancelled sign in
+ quickpick.dispose();
+ return;
+ }
+
quickpick.busy = false;
let repo: string | undefined;
@@ -136,7 +149,7 @@ export async function publishRepository(gitAPI: GitAPI, repository?: Repository)
new Promise(c => quickpick.onDidHide(() => c(undefined)))
]);
- if (!result) {
+ if (!result || result.length === 0) {
return;
}
@@ -188,9 +201,9 @@ export async function publishRepository(gitAPI: GitAPI, repository?: Repository)
}
const openInGitHub = 'Open In GitHub';
- const action = await vscode.window.showInformationMessage(`Successfully published the '${owner}/${repo}' repository on GitHub.`, openInGitHub);
-
- if (action === openInGitHub) {
- vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(githubRepository.html_url));
- }
+ vscode.window.showInformationMessage(`Successfully published the '${owner}/${repo}' repository on GitHub.`, openInGitHub).then(action => {
+ if (action === openInGitHub) {
+ vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(githubRepository.html_url));
+ }
+ });
}
diff --git a/extensions/github/src/pushErrorHandler.ts b/extensions/github/src/pushErrorHandler.ts
index bc585d18b6..f53720ae06 100644
--- a/extensions/github/src/pushErrorHandler.ts
+++ b/extensions/github/src/pushErrorHandler.ts
@@ -40,8 +40,14 @@ async function handlePushError(repository: Repository, remote: Remote, refspec:
// Issue: what if there's already another `origin` repo?
await repository.addRemote('origin', ghRepository.clone_url);
- await repository.fetch('origin', remoteName);
- await repository.setBranchUpstream(localName, `origin/${remoteName}`);
+
+ try {
+ await repository.fetch('origin', remoteName);
+ await repository.setBranchUpstream(localName, `origin/${remoteName}`);
+ } catch {
+ // noop
+ }
+
await repository.push('origin', localName, true);
return [octokit, ghRepository];
diff --git a/extensions/github/src/remoteSourceProvider.ts b/extensions/github/src/remoteSourceProvider.ts
index 503447b777..c3ad8b6285 100644
--- a/extensions/github/src/remoteSourceProvider.ts
+++ b/extensions/github/src/remoteSourceProvider.ts
@@ -8,6 +8,12 @@ import { getOctokit } from './auth';
import { Octokit } from '@octokit/rest';
import { publishRepository } from './publish';
+function parse(url: string): { owner: string, repo: string } | undefined {
+ const match = /^https:\/\/github\.com\/([^/]+)\/([^/]+)\.git/i.exec(url)
+ || /^git@github\.com:([^/]+)\/([^/]+)\.git/i.exec(url);
+ return (match && { owner: match[1], repo: match[2] }) ?? undefined;
+}
+
function asRemoteSource(raw: any): RemoteSource {
return {
name: `$(github) ${raw.full_name}`,
@@ -28,17 +34,30 @@ export class GithubRemoteSourceProvider implements RemoteSourceProvider {
async getRemoteSources(query?: string): Promise {
const octokit = await getOctokit();
- const [fromUser, fromQuery] = await Promise.all([
+
+ if (query) {
+ const repository = parse(query);
+
+ if (repository) {
+ const raw = await octokit.repos.get(repository);
+ return [asRemoteSource(raw.data)];
+ }
+ }
+
+ const all = await Promise.all([
this.getUserRemoteSources(octokit, query),
this.getQueryRemoteSources(octokit, query)
]);
- const userRepos = new Set(fromUser.map(r => r.name));
+ const map = new Map();
- return [
- ...fromUser,
- ...fromQuery.filter(r => !userRepos.has(r.name))
- ];
+ for (const group of all) {
+ for (const remoteSource of group) {
+ map.set(remoteSource.name, remoteSource);
+ }
+ }
+
+ return [...map.values()];
}
private async getUserRemoteSources(octokit: Octokit, query?: string): Promise {
@@ -61,6 +80,35 @@ export class GithubRemoteSourceProvider implements RemoteSourceProvider {
return raw.data.items.map(asRemoteSource);
}
+ async getBranches(url: string): Promise {
+ const repository = parse(url);
+
+ if (!repository) {
+ return [];
+ }
+
+ const octokit = await getOctokit();
+
+ const branches: string[] = [];
+ let page = 1;
+
+ while (true) {
+ let res = await octokit.repos.listBranches({ ...repository, per_page: 100, page });
+
+ if (res.data.length === 0) {
+ break;
+ }
+
+ branches.push(...res.data.map(b => b.name));
+ page++;
+ }
+
+ const repo = await octokit.repos.get(repository);
+ const defaultBranch = repo.data.default_branch;
+
+ return branches.sort((a, b) => a === defaultBranch ? -1 : b === defaultBranch ? 1 : 0);
+ }
+
publishRepository(repository: Repository): Promise {
return publishRepository(this.gitAPI, repository);
}
diff --git a/extensions/github/src/typings/git.d.ts b/extensions/github/src/typings/git.d.ts
index 9593d8bc70..b4322d4a7f 100644
--- a/extensions/github/src/typings/git.d.ts
+++ b/extensions/github/src/typings/git.d.ts
@@ -130,6 +130,7 @@ export interface CommitOptions {
signoff?: boolean;
signCommit?: boolean;
empty?: boolean;
+ noVerify?: boolean;
}
export interface BranchQuery {
@@ -211,6 +212,7 @@ export interface RemoteSourceProvider {
readonly icon?: string; // codicon name
readonly supportsQuery?: boolean;
getRemoteSources(query?: string): ProviderResult;
+ getBranches?(url: string): ProviderResult;
publishRepository?(repository: Repository): Promise;
}
diff --git a/extensions/import/src/test/utils.test.ts b/extensions/import/src/test/utils.test.ts
index 69135f18ed..19e2219cce 100644
--- a/extensions/import/src/test/utils.test.ts
+++ b/extensions/import/src/test/utils.test.ts
@@ -131,6 +131,10 @@ export class TestQueryProvider implements azdata.QueryProvider {
}
+export interface ExtensionGlobalMemento extends vscode.Memento {
+ setKeysForSync(keys: string[]): void;
+}
+
export class TestExtensionContext implements vscode.ExtensionContext {
storageUri: vscode.Uri;
globalStorageUri: vscode.Uri;
@@ -138,7 +142,7 @@ export class TestExtensionContext implements vscode.ExtensionContext {
extensionMode: vscode.ExtensionMode;
subscriptions: { dispose(): any; }[];
workspaceState: vscode.Memento;
- globalState: vscode.Memento;
+ globalState: ExtensionGlobalMemento;
extensionUri: vscode.Uri;
extensionPath: string;
environmentVariableCollection: vscode.EnvironmentVariableCollection;
diff --git a/extensions/import/src/wizard/api/basePage.ts b/extensions/import/src/wizard/api/basePage.ts
index d9e736f698..21a1ca9522 100644
--- a/extensions/import/src/wizard/api/basePage.ts
+++ b/extensions/import/src/wizard/api/basePage.ts
@@ -15,12 +15,12 @@ export abstract class BasePage {
/**
* This method constructs all the elements of the page.
*/
- public async abstract start(): Promise;
+ public abstract start(): Promise;
/**
* This method is called when the user is entering the page.
*/
- public async abstract onPageEnter(): Promise;
+ public abstract onPageEnter(): Promise;
/**
* This method is called when the user is leaving the page.
diff --git a/extensions/integration-tests/src/test/notebook.test.ts b/extensions/integration-tests/src/test/notebook.test.ts
index 2c21f6b015..48e4a6ac11 100644
--- a/extensions/integration-tests/src/test/notebook.test.ts
+++ b/extensions/integration-tests/src/test/notebook.test.ts
@@ -55,7 +55,7 @@ suite('Notebook integration test suite', function () {
assert(actualOutput2[0] === '1', `Expected result: 1, Actual: '${actualOutput2[0]}'`);
});
- test('Sql NB multiple cells test', async function () {
+ test.skip('Sql NB multiple cells test', async function (done) {
let notebook = await openNotebook(sqlNotebookMultipleCellsContent, sqlKernelMetadata, this.test.title + this.invocationCount++);
await runCells(notebook);
const expectedOutput0 = '(1 row affected)';
@@ -82,9 +82,10 @@ suite('Notebook integration test suite', function () {
assert(actualOutput2[0] === i.toString(), `Expected result: ${i.toString()}, Actual: '${actualOutput2[0]}'`);
console.log('Sql multiple cells NB done');
}
+ done();
});
- test('Sql NB run cells above and below test', async function () {
+ test.skip('Sql NB run cells above and below test', async function (done) {
let notebook = await openNotebook(sqlNotebookMultipleCellsContent, sqlKernelMetadata, this.test.title + this.invocationCount++);
// When running all cells above a cell, ensure that only cells preceding current cell have output
await runCells(notebook, true, undefined, notebook.document.cells[1]);
@@ -99,21 +100,24 @@ suite('Notebook integration test suite', function () {
assert(notebook.document.cells[0].contents.outputs.length === 0, `Expected length: '0', Actual: '${notebook.document.cells[0].contents.outputs.length}'`);
assert(notebook.document.cells[1].contents.outputs.length === 3, `Expected length: '3', Actual: '${notebook.document.cells[1].contents.outputs.length}'`);
assert(notebook.document.cells[2].contents.outputs.length === 3, `Expected length: '3', Actual: '${notebook.document.cells[2].contents.outputs.length}'`);
+ done();
});
- test('Clear cell output - SQL notebook', async function () {
+ test.skip('Clear cell output - SQL notebook', async function (done) {
let notebook = await openNotebook(sqlNotebookContent, sqlKernelMetadata, this.test.title + this.invocationCount++);
await runCell(notebook);
await verifyClearOutputs(notebook);
+ done();
});
- test('Clear all outputs - SQL notebook', async function () {
+ test.skip('Clear all outputs - SQL notebook', async function (done) {
let notebook = await openNotebook(sqlNotebookContent, sqlKernelMetadata, this.test.title + this.invocationCount++);
await runCell(notebook);
await verifyClearAllOutputs(notebook);
+ done();
});
- test('sql language test', async function () {
+ test.skip('sql language test', async function (done) {
let language = 'sql';
await cellLanguageTest(notebookContentForCellLanguageTest, this.test.title + this.invocationCount++, language, {
'kernelspec': {
@@ -126,9 +130,10 @@ suite('Notebook integration test suite', function () {
'mimetype': ''
}
});
+ done();
});
- test('should not be dirty after saving notebook test', async function () {
+ test.skip('should not be dirty after saving notebook test', async function (done) {
// Given a notebook that's been edited (in this case, open notebook runs the 1st cell and adds an output)
let notebook = await openNotebook(sqlNotebookContent, sqlKernelMetadata, this.test.title);
await runCell(notebook);
@@ -161,6 +166,7 @@ suite('Notebook integration test suite', function () {
await sleep(100);
assert(saved === true, 'Expect save after edit to succeed');
assert(notebook.document.isDirty === false, 'Notebook should not be dirty after 2nd save');
+ done();
});
if (process.env['RUN_PYTHON3_TEST'] === '1') {
diff --git a/extensions/json-language-features/client/src/jsonClient.ts b/extensions/json-language-features/client/src/jsonClient.ts
index 4249e4ea9d..5f1eb6c2e5 100644
--- a/extensions/json-language-features/client/src/jsonClient.ts
+++ b/extensions/json-language-features/client/src/jsonClient.ts
@@ -73,6 +73,10 @@ namespace SettingIds {
export const maxItemsComputed = 'json.maxItemsComputed';
}
+namespace StorageIds {
+ export const maxItemsExceededInformation = 'json.maxItemsExceededInformation';
+}
+
export interface TelemetryReporter {
sendTelemetryEvent(eventName: string, properties?: {
[key: string]: string;
@@ -116,7 +120,7 @@ export function startClient(context: ExtensionContext, newLanguageClient: Langua
initializationOptions: {
handledSchemaProtocols: ['file'], // language server only loads file-URI. Fetching schemas with other protocols ('http'...) are made on the client.
provideFormatter: false, // tell the server to not provide formatting capability and ignore the `json.format.enable` setting.
- customCapabilities: { rangeFormatting: { editLimit: 1000 } }
+ customCapabilities: { rangeFormatting: { editLimit: 10000 } }
},
synchronize: {
// Synchronize the setting section 'json' to the server
@@ -298,8 +302,19 @@ export function startClient(context: ExtensionContext, newLanguageClient: Langua
}
}));
- client.onNotification(ResultLimitReachedNotification.type, message => {
- window.showInformationMessage(`${message}\n${localize('configureLimit', 'Use setting \'{0}\' to configure the limit.', SettingIds.maxItemsComputed)}`);
+ client.onNotification(ResultLimitReachedNotification.type, async message => {
+ const shouldPrompt = context.globalState.get(StorageIds.maxItemsExceededInformation) !== false;
+ if (shouldPrompt) {
+ const ok = localize('ok', "Ok");
+ const openSettings = localize('goToSetting', 'Open Settings');
+ const neverAgain = localize('yes never again', "Don't Show Again");
+ const pick = await window.showInformationMessage(`${message}\n${localize('configureLimit', 'Use setting \'{0}\' to configure the limit.', SettingIds.maxItemsComputed)}`, ok, openSettings, neverAgain);
+ if (pick === neverAgain) {
+ await context.globalState.update(StorageIds.maxItemsExceededInformation, false);
+ } else if (pick === openSettings) {
+ await commands.executeCommand('workbench.action.openSettings', SettingIds.maxItemsComputed);
+ }
+ }
});
function updateFormatterRegistration() {
@@ -315,6 +330,8 @@ export function startClient(context: ExtensionContext, newLanguageClient: Langua
range: client.code2ProtocolConverter.asRange(range),
options: client.code2ProtocolConverter.asFormattingOptions(options)
};
+ params.options.insertFinalNewline = workspace.getConfiguration('files', document).get('insertFinalNewline');
+
return client.sendRequest(DocumentRangeFormattingRequest.type, params, token).then(
client.protocol2CodeConverter.asTextEdits,
(error) => {
diff --git a/extensions/json-language-features/client/src/node/jsonClientMain.ts b/extensions/json-language-features/client/src/node/jsonClientMain.ts
index a39aa0581e..2f705bc36e 100644
--- a/extensions/json-language-features/client/src/node/jsonClientMain.ts
+++ b/extensions/json-language-features/client/src/node/jsonClientMain.ts
@@ -25,7 +25,7 @@ export function activate(context: ExtensionContext) {
const serverModule = context.asAbsolutePath(serverMain);
// The debug options for the server
- const debugOptions = { execArgv: ['--nolazy', '--inspect=6044'] };
+ const debugOptions = { execArgv: ['--nolazy', '--inspect=' + (6000 + Math.round(Math.random() * 999))] };
// If the extension is launch in debug mode the debug server options are use
// Otherwise the run options are used
diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json
index db003f0512..a8e3231a93 100644
--- a/extensions/json-language-features/package.json
+++ b/extensions/json-language-features/package.json
@@ -127,10 +127,10 @@
]
},
"dependencies": {
- "request-light": "^0.3.0",
+ "request-light": "^0.4.0",
"vscode-extension-telemetry": "0.1.1",
"vscode-languageclient": "7.0.0-next.5.1",
- "vscode-nls": "^4.1.2"
+ "vscode-nls": "^5.0.0"
},
"devDependencies": {
"@types/node": "^12.11.7"
diff --git a/extensions/json-language-features/package.nls.json b/extensions/json-language-features/package.nls.json
index 28a21fe9f9..fd1e1fe856 100644
--- a/extensions/json-language-features/package.nls.json
+++ b/extensions/json-language-features/package.nls.json
@@ -13,5 +13,6 @@
"json.schemaResolutionErrorMessage": "Unable to resolve schema.",
"json.clickToRetry": "Click to retry.",
"json.maxItemsComputed.desc": "The maximum number of outline symbols and folding regions computed (limited for performance reasons).",
+ "json.maxItemsExceededInformation.desc": "Show notification when exceeding the maximum number of outline symbols and folding regions.",
"json.enableSchemaDownload.desc": "When enabled, JSON schemas can be fetched from http and https locations."
}
diff --git a/extensions/json-language-features/server/README.md b/extensions/json-language-features/server/README.md
index a399a8d223..c2000ef5ad 100644
--- a/extensions/json-language-features/server/README.md
+++ b/extensions/json-language-features/server/README.md
@@ -167,7 +167,12 @@ interface ISchemaAssociation {
* A match succeeds when there is at least one pattern matching and last matching pattern does not start with '!'.
*/
fileMatch: string[];
-
+
+ /*
+ * The schema for the given URI.
+ * If no schema is provided, the schema will be fetched with the schema request service (if available).
+ */
+ schema?: JSONSchema;
}
```
diff --git a/extensions/json-language-features/server/bin/vscode-json-languageserver b/extensions/json-language-features/server/bin/vscode-json-languageserver
index a80d7d55b4..129768aef0 100644
--- a/extensions/json-language-features/server/bin/vscode-json-languageserver
+++ b/extensions/json-language-features/server/bin/vscode-json-languageserver
@@ -3,4 +3,4 @@
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-require("../out/jsonServerMain");
\ No newline at end of file
+require('../out/node/jsonServerMain');
diff --git a/extensions/json-language-features/server/package.json b/extensions/json-language-features/server/package.json
index ddf75c333e..86df32285a 100644
--- a/extensions/json-language-features/server/package.json
+++ b/extensions/json-language-features/server/package.json
@@ -1,7 +1,7 @@
{
"name": "vscode-json-languageserver",
"description": "JSON language server",
- "version": "1.2.3",
+ "version": "1.3.1",
"author": "Microsoft Corporation",
"license": "MIT",
"engines": {
@@ -12,9 +12,9 @@
},
"main": "./out/node/jsonServerMain",
"dependencies": {
- "jsonc-parser": "^2.2.1",
- "request-light": "^0.3.0",
- "vscode-json-languageservice": "^3.8.3",
+ "jsonc-parser": "^3.0.0",
+ "request-light": "^0.4.0",
+ "vscode-json-languageservice": "^3.11.0",
"vscode-languageserver": "7.0.0-next.3",
"vscode-uri": "^2.1.2"
},
diff --git a/extensions/json-language-features/server/src/jsonServer.ts b/extensions/json-language-features/server/src/jsonServer.ts
index f0f3b2460f..106fe00d1f 100644
--- a/extensions/json-language-features/server/src/jsonServer.ts
+++ b/extensions/json-language-features/server/src/jsonServer.ts
@@ -137,11 +137,11 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment)
} : undefined,
hoverProvider: true,
documentSymbolProvider: true,
- documentRangeFormattingProvider: params.initializationOptions.provideFormatter === true,
+ documentRangeFormattingProvider: params.initializationOptions?.provideFormatter === true,
colorProvider: {},
foldingRangeProvider: true,
selectionRangeProvider: true,
- definitionProvider: true
+ documentLinkProvider: {}
};
return { capabilities };
@@ -481,15 +481,15 @@ export function startServer(connection: Connection, runtime: RuntimeEnvironment)
}, [], `Error while computing selection ranges for ${params.textDocument.uri}`, token);
});
- connection.onDefinition((params, token) => {
+ connection.onDocumentLinks((params, token) => {
return runSafeAsync(async () => {
const document = documents.get(params.textDocument.uri);
if (document) {
const jsonDocument = getJSONDocument(document);
- return languageService.findDefinition(document, params.position, jsonDocument);
+ return languageService.findLinks(document, jsonDocument);
}
return [];
- }, [], `Error while computing definitions for ${params.textDocument.uri}`, token);
+ }, [], `Error while computing links for ${params.textDocument.uri}`, token);
});
// Listen on the connection
diff --git a/extensions/json-language-features/server/yarn.lock b/extensions/json-language-features/server/yarn.lock
index ac7354a958..ec82f87b58 100644
--- a/extensions/json-language-features/server/yarn.lock
+++ b/extensions/json-language-features/server/yarn.lock
@@ -61,34 +61,34 @@ https-proxy-agent@^2.2.4:
agent-base "^4.3.0"
debug "^3.1.0"
-jsonc-parser@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.2.1.tgz#db73cd59d78cce28723199466b2a03d1be1df2bc"
- integrity sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==
+jsonc-parser@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22"
+ integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
-request-light@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.3.0.tgz#04daa783e7f0a70392328dda4b546f3e27845f2d"
- integrity sha512-xlVlZVT0ZvCT+c3zm3SjeFCzchoQxsUUmx5fkal0I6RIDJK+lmb1UYyKJ7WM4dTfnzHP4ElWwAf8Dli8c0/tVA==
+request-light@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.4.0.tgz#c6b91ef00b18cb0de75d2127e55b3a2c9f7f90f9"
+ integrity sha512-fimzjIVw506FBZLspTAXHdpvgvQebyjpNyLRd0e6drPPRq7gcrROeGWRyF81wLqFg5ijPgnOQbmfck5wdTqpSA==
dependencies:
http-proxy-agent "^2.1.0"
https-proxy-agent "^2.2.4"
- vscode-nls "^4.1.1"
-
-vscode-json-languageservice@^3.8.3:
- version "3.8.3"
- resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.8.3.tgz#fae5e7bdda2b6ec4f64588c571df40b6bfcb09b5"
- integrity sha512-8yPag/NQHCuTthahyaTtzK0DHT0FKM/xBU0mFBQ8nMo8C1i2P+FCyIVqICoNoHkRI2BTGlXKomPUpsqjSz0TnQ==
- dependencies:
- jsonc-parser "^2.2.1"
- vscode-languageserver-textdocument "^1.0.1"
- vscode-languageserver-types "^3.15.1"
vscode-nls "^4.1.2"
+
+vscode-json-languageservice@^3.11.0:
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.11.0.tgz#ad574b36c4346bd7830f1d34b5a5213d3af8d232"
+ integrity sha512-QxI+qV97uD7HHOCjh3MrM1TfbdwmTXrMckri5Tus1/FQiG3baDZb2C9Y0y8QThs7PwHYBIQXcAc59ZveCRZKPA==
+ dependencies:
+ jsonc-parser "^3.0.0"
+ vscode-languageserver-textdocument "^1.0.1"
+ vscode-languageserver-types "3.16.0-next.2"
+ vscode-nls "^5.0.0"
vscode-uri "^2.1.2"
vscode-jsonrpc@6.0.0-next.2:
@@ -114,11 +114,6 @@ vscode-languageserver-types@3.16.0-next.2:
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz#940bd15c992295a65eae8ab6b8568a1e8daa3083"
integrity sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q==
-vscode-languageserver-types@^3.15.1:
- version "3.15.1"
- resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de"
- integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==
-
vscode-languageserver@7.0.0-next.3:
version "7.0.0-next.3"
resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-7.0.0-next.3.tgz#3833bd09259a4a085baeba90783f1e4d06d81095"
@@ -126,16 +121,16 @@ vscode-languageserver@7.0.0-next.3:
dependencies:
vscode-languageserver-protocol "3.16.0-next.4"
-vscode-nls@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.1.tgz#f9916b64e4947b20322defb1e676a495861f133c"
- integrity sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A==
-
vscode-nls@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167"
integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==
+vscode-nls@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840"
+ integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==
+
vscode-uri@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c"
diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock
index 29972b7df0..a1e87bdbce 100644
--- a/extensions/json-language-features/yarn.lock
+++ b/extensions/json-language-features/yarn.lock
@@ -94,14 +94,14 @@ ms@^2.1.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
-request-light@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.3.0.tgz#04daa783e7f0a70392328dda4b546f3e27845f2d"
- integrity sha512-xlVlZVT0ZvCT+c3zm3SjeFCzchoQxsUUmx5fkal0I6RIDJK+lmb1UYyKJ7WM4dTfnzHP4ElWwAf8Dli8c0/tVA==
+request-light@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.4.0.tgz#c6b91ef00b18cb0de75d2127e55b3a2c9f7f90f9"
+ integrity sha512-fimzjIVw506FBZLspTAXHdpvgvQebyjpNyLRd0e6drPPRq7gcrROeGWRyF81wLqFg5ijPgnOQbmfck5wdTqpSA==
dependencies:
http-proxy-agent "^2.1.0"
https-proxy-agent "^2.2.4"
- vscode-nls "^4.1.1"
+ vscode-nls "^4.1.2"
semver@^5.3.0:
version "5.5.0"
@@ -146,16 +146,16 @@ vscode-languageserver-types@3.16.0-next.2:
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz#940bd15c992295a65eae8ab6b8568a1e8daa3083"
integrity sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q==
-vscode-nls@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.1.tgz#f9916b64e4947b20322defb1e676a495861f133c"
- integrity sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A==
-
vscode-nls@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167"
integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==
+vscode-nls@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840"
+ integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==
+
zone.js@0.7.6:
version "0.7.6"
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009"
diff --git a/extensions/json/package.json b/extensions/json/package.json
index 73902a8ec4..1b7331b207 100644
--- a/extensions/json/package.json
+++ b/extensions/json/package.json
@@ -33,8 +33,7 @@
],
"filenames": [
"composer.lock",
- ".watchmanconfig",
- ".ember-cli"
+ ".watchmanconfig"
],
"mimetypes": [
"application/json",
@@ -57,6 +56,9 @@
".hintrc",
".babelrc"
],
+ "filenames": [
+ ".ember-cli"
+ ],
"configuration": "./language-configuration.json"
}
],
diff --git a/extensions/kusto/src/prompts/adapter.ts b/extensions/kusto/src/prompts/adapter.ts
index 42ecc5d839..6aa519bdf6 100644
--- a/extensions/kusto/src/prompts/adapter.ts
+++ b/extensions/kusto/src/prompts/adapter.ts
@@ -66,7 +66,7 @@ export default class CodeAdapter implements IPrompter {
}
// Helper to make it possible to prompt using callback pattern. Generally Promise is a preferred flow
- public promptCallback(questions: IQuestion[], callback: IPromptCallback): void {
+ public promptCallback(questions: IQuestion[], callback: IPromptCallback | undefined): void {
// Collapse multiple questions into a set of prompt steps
this.prompt(questions).then(answers => {
if (callback && answers) {
diff --git a/extensions/machine-learning/src/test/mainController.test.ts b/extensions/machine-learning/src/test/mainController.test.ts
index cd70157f79..b5dea3313c 100644
--- a/extensions/machine-learning/src/test/mainController.test.ts
+++ b/extensions/machine-learning/src/test/mainController.test.ts
@@ -82,8 +82,9 @@ function createContext(): TestContext {
update: () => {return Promise.resolve();}
},
globalState: {
- get: () => {return Promise.resolve();},
- update: () => {return Promise.resolve();}
+ setKeysForSync: (): void => { },
+ get: (): any | undefined => { return Promise.resolve(); },
+ update: (): Thenable => { return Promise.resolve(); }
},
extensionPath: extensionPath,
asAbsolutePath: () => {return '';},
diff --git a/extensions/machine-learning/src/test/views/externalLanguages/addEditLanguageTab.test.ts b/extensions/machine-learning/src/test/views/externalLanguages/addEditLanguageTab.test.ts
index 6a75313677..3d380341af 100644
--- a/extensions/machine-learning/src/test/views/externalLanguages/addEditLanguageTab.test.ts
+++ b/extensions/machine-learning/src/test/views/externalLanguages/addEditLanguageTab.test.ts
@@ -104,7 +104,7 @@ describe('Add Edit External Languages Tab', () => {
let tab = new AddEditLanguageTab(testContext.apiWrapper.object, parent, languageUpdateModel);
should.notEqual(tab.saveButton, undefined);
let updateCalled = false;
- let promise = new Promise(resolve => {
+ let promise = new Promise(resolve => {
parent.onUpdate(() => {
updateCalled = true;
resolve();
diff --git a/extensions/machine-learning/src/test/views/externalLanguages/languageEditDialog.test.ts b/extensions/machine-learning/src/test/views/externalLanguages/languageEditDialog.test.ts
index cd8f4e51a0..e5605253ab 100644
--- a/extensions/machine-learning/src/test/views/externalLanguages/languageEditDialog.test.ts
+++ b/extensions/machine-learning/src/test/views/externalLanguages/languageEditDialog.test.ts
@@ -35,7 +35,7 @@ describe('Edit External Languages Dialog', () => {
dialog.showDialog();
let updateCalled = false;
- let promise = new Promise(resolve => {
+ let promise = new Promise(resolve => {
parent.onUpdate(() => {
updateCalled = true;
parent.onUpdatedLanguage(languageUpdateModel);
diff --git a/extensions/markdown-basics/cgmanifest.json b/extensions/markdown-basics/cgmanifest.json
index 71df78ef41..5606dcc7cd 100644
--- a/extensions/markdown-basics/cgmanifest.json
+++ b/extensions/markdown-basics/cgmanifest.json
@@ -26,7 +26,19 @@
],
"license": "TextMate Bundle License",
"version": "0.0.0"
+ },
+ {
+ "component": {
+ "type": "git",
+ "git": {
+ "name": "microsoft/vscode-markdown-tm-grammar",
+ "repositoryUrl": "https://github.com/microsoft/vscode-markdown-tm-grammar",
+ "commitHash": "11cf764606cb2cde54badb5d0e5a0758a8871c4b"
+ }
+ },
+ "license": "MIT",
+ "version": "0.0.0"
}
],
"version": 1
-}
\ No newline at end of file
+}
diff --git a/extensions/markdown-basics/snippets/markdown.code-snippets b/extensions/markdown-basics/snippets/markdown.code-snippets
index b07f984138..f0753507b6 100644
--- a/extensions/markdown-basics/snippets/markdown.code-snippets
+++ b/extensions/markdown-basics/snippets/markdown.code-snippets
@@ -64,6 +64,11 @@
"body": ["1. ${1:first}", "2. ${2:second}", "3. ${3:third}", "$0"],
"description": "Insert ordered list"
},
+ "Insert definition list": {
+ "prefix": "definition list",
+ "body": ["${1:term}", ": ${2:definition}", "$0"],
+ "description": "Insert definition list"
+ },
"Insert horizontal rule": {
"prefix": "horizontal rule",
"body": "----------\n",
@@ -83,5 +88,5 @@
"prefix": "strikethrough",
"body": "~~${1:${TM_SELECTED_TEXT}}~~",
"description": "Insert strikethrough"
- }
+ },
}
diff --git a/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json b/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json
index e8feaa75fa..13ee6f3604 100644
--- a/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json
+++ b/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json
@@ -4,7 +4,7 @@
"If you want to provide a fix or improvement, please create a pull request against the original repository.",
"Once accepted there, we are happy to receive an update request."
],
- "version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/4be9cb335581f3559166c319607dac9100103083",
+ "version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/f051a36bd9713dd722cbe1bdde9c8240d12f00b4",
"name": "Markdown",
"scopeName": "text.html.markdown",
"patterns": [
@@ -2190,9 +2190,18 @@
},
"13": {
"name": "punctuation.definition.string.end.markdown"
+ },
+ "14": {
+ "name": "string.other.link.description.title.markdown"
+ },
+ "15": {
+ "name": "punctuation.definition.string.begin.markdown"
+ },
+ "16": {
+ "name": "punctuation.definition.string.end.markdown"
}
},
- "match": "(?x)\n \\s* # Leading whitespace\n (\\[)([^]]+?)(\\])(:) # Reference name\n [ \\t]* # Optional whitespace\n ()(\\S+?)(>?) # The url\n [ \\t]* # Optional whitespace\n (?:\n ((\\().+?(\\))) # Match title in quotesâĻ\n | ((\").+?(\")) # or in parens.\n )? # Title is optional\n \\s* # Optional whitespace\n $\n",
+ "match": "(?x)\n \\s* # Leading whitespace\n (\\[)([^]]+?)(\\])(:) # Reference name\n [ \\t]* # Optional whitespace\n ()(\\S+?)(>?) # The url\n [ \\t]* # Optional whitespace\n (?:\n ((\\().+?(\\))) # Match title in parensâĻ\n | ((\").+?(\")) # or in double quotesâĻ\n | ((').+?(')) # or in single quotes.\n )? # Title is optional\n \\s* # Optional whitespace\n $\n",
"name": "meta.link.reference.def.markdown"
},
"list_paragraph": {
@@ -2453,10 +2462,19 @@
"name": "punctuation.definition.string.markdown"
},
"15": {
+ "name": "string.other.link.description.title.markdown"
+ },
+ "16": {
+ "name": "punctuation.definition.string.markdown"
+ },
+ "17": {
+ "name": "punctuation.definition.string.markdown"
+ },
+ "18": {
"name": "punctuation.definition.metadata.markdown"
}
},
- "match": "(?x)\n (\\!\\[)((?[^\\[\\]\\\\]|\\\\.|\\[\\g*+\\])*+)(\\])\n # Match the link text.\n (\\() # Opening paren for url\n ()(\\S+?)(>?) # The url\n [ \\t]* # Optional whitespace\n (?:\n ((\\().+?(\\))) # Match title in parensâĻ\n | ((\").+?(\")) # or in quotes.\n )? # Title is optional\n \\s* # Optional whitespace\n (\\))\n",
+ "match": "(?x)\n (\\!\\[)((?[^\\[\\]\\\\]|\\\\.|\\[\\g*+\\])*+)(\\])\n # Match the link text.\n (\\() # Opening paren for url\n ()(\\S+?)(>?) # The url\n [ \\t]* # Optional whitespace\n (?:\n ((\\().+?(\\))) # Match title in parensâĻ\n | ((\").+?(\")) # or in double quotesâĻ\n | ((').+?(')) # or in single quotes.\n )? # Title is optional\n \\s* # Optional whitespace\n (\\))\n",
"name": "meta.image.inline.markdown"
},
"image-ref": {
@@ -2616,10 +2634,19 @@
"name": "punctuation.definition.string.end.markdown"
},
"16": {
+ "name": "string.other.link.description.title.markdown"
+ },
+ "17": {
+ "name": "punctuation.definition.string.begin.markdown"
+ },
+ "18": {
+ "name": "punctuation.definition.string.end.markdown"
+ },
+ "19": {
"name": "punctuation.definition.metadata.markdown"
}
},
- "match": "(?x)\n (\\[)((?[^\\[\\]\\\\]|\\\\.|\\[\\g*+\\])*+)(\\])\n # Match the link text.\n (\\() # Opening paren for url\n ()((?