Compare commits
85 Commits
1.691-vsc1
...
1.1119-vsc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a2ad3d4ff4 | ||
|
|
4a29cd1664 | ||
|
|
0462a93f11 | ||
|
|
db39eacfa1 | ||
|
|
c020cd2f2c | ||
|
|
81bbfa7fbe | ||
|
|
aa1474b675 | ||
|
|
8256252967 | ||
|
|
07342bbee7 | ||
|
|
72152f74ab | ||
|
|
420ca76f54 | ||
|
|
31503fc853 | ||
|
|
cf399ef6ac | ||
|
|
bb5836ec61 | ||
|
|
f36235e03f | ||
|
|
6ef1628acb | ||
|
|
ab8f8a0a22 | ||
|
|
cdb900aca8 | ||
|
|
1622fd4152 | ||
|
|
6c972e855f | ||
|
|
e332882a88 | ||
|
|
d0142e2536 | ||
|
|
e8c8fba91d | ||
|
|
01a63a7241 | ||
|
|
a2e0638c6a | ||
|
|
4e62f938a9 | ||
|
|
4c5bb83fc1 | ||
|
|
a3ac4567e3 | ||
|
|
58cf109a83 | ||
|
|
fab45dedcd | ||
|
|
446573809c | ||
|
|
5ad9398b01 | ||
|
|
bcdbd90197 | ||
|
|
0de7247868 | ||
|
|
c9f91e77cd | ||
|
|
30b8565e2d | ||
|
|
6b887dcc9c | ||
|
|
41c7d98b7b | ||
|
|
b055a26dc3 | ||
|
|
2bc6e1a457 | ||
|
|
e61ea796c6 | ||
|
|
d073622629 | ||
|
|
5f40ebb845 | ||
|
|
c56e2797cc | ||
|
|
166efcb17e | ||
|
|
206e107a9a | ||
|
|
12c8b5d337 | ||
|
|
4aa20fd864 | ||
|
|
0cd4e46055 | ||
|
|
f51823b51f | ||
|
|
55bfeab208 | ||
|
|
309d15cefd | ||
|
|
95006a435a | ||
|
|
4d576ab4d4 | ||
|
|
d5b03ef60e | ||
|
|
cdc5b55a9d | ||
|
|
c3a38e3fea | ||
|
|
cc8c7e2cee | ||
|
|
e0f1787ce6 | ||
|
|
50e6108012 | ||
|
|
630ccfcacc | ||
|
|
c4c26058ef | ||
|
|
8a4da542ae | ||
|
|
e907dbe7e6 | ||
|
|
22b485acd9 | ||
|
|
b8f222acf2 | ||
|
|
aabb2ecda7 | ||
|
|
dfabc070b9 | ||
|
|
da420cdda9 | ||
|
|
c6a46e4753 | ||
|
|
742dd6f597 | ||
|
|
6c3ff1d6f0 | ||
|
|
db57aa229f | ||
|
|
f7342ede69 | ||
|
|
b781ccde9c | ||
|
|
8f62b2bff2 | ||
|
|
7047be859c | ||
|
|
2785e2219a | ||
|
|
4b217fba00 | ||
|
|
3fae68bbab | ||
|
|
a2f20aa25c | ||
|
|
94b8b9a5cf | ||
|
|
bbd8b27fc7 | ||
|
|
6361635b55 | ||
|
|
d2da4cfc43 |
@@ -7,3 +7,4 @@ doc/
|
|||||||
.travis.yml
|
.travis.yml
|
||||||
LICENSE
|
LICENSE
|
||||||
README.md
|
README.md
|
||||||
|
node_modules
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -4,4 +4,5 @@ dist
|
|||||||
out
|
out
|
||||||
.DS_Store
|
.DS_Store
|
||||||
release
|
release
|
||||||
.cache
|
.vscode
|
||||||
|
.cache
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
8.15.0
|
10.15.1
|
||||||
|
|||||||
18
.travis.yml
18
.travis.yml
@@ -1,13 +1,21 @@
|
|||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- 8.15.0
|
- 10.15.1
|
||||||
env:
|
services:
|
||||||
- VSCODE_VERSION="1.33.0" MAJOR_VERSION="1" VERSION="$MAJOR_VERSION.$TRAVIS_BUILD_NUMBER-vsc$VSCODE_VERSION"
|
- docker
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: linux
|
- os: linux
|
||||||
dist: trusty
|
dist: trusty
|
||||||
|
env:
|
||||||
|
- VSCODE_VERSION="1.33.1" MAJOR_VERSION="1" VERSION="$MAJOR_VERSION.$TRAVIS_BUILD_NUMBER-vsc$VSCODE_VERSION" TARGET="centos"
|
||||||
|
- os: linux
|
||||||
|
dist: trusty
|
||||||
|
env:
|
||||||
|
- VSCODE_VERSION="1.33.1" MAJOR_VERSION="1" VERSION="$MAJOR_VERSION.$TRAVIS_BUILD_NUMBER-vsc$VSCODE_VERSION" TARGET="alpine"
|
||||||
- os: osx
|
- os: osx
|
||||||
|
env:
|
||||||
|
- VSCODE_VERSION="1.33.1" MAJOR_VERSION="1" VERSION="$MAJOR_VERSION.$TRAVIS_BUILD_NUMBER-vsc$VSCODE_VERSION"
|
||||||
before_install:
|
before_install:
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install libxkbfile-dev
|
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install libxkbfile-dev
|
||||||
libsecret-1-dev; fi
|
libsecret-1-dev; fi
|
||||||
@@ -19,7 +27,7 @@ before_deploy:
|
|||||||
- git config --local user.name "$USER_NAME"
|
- git config --local user.name "$USER_NAME"
|
||||||
- git config --local user.email "$USER_EMAIL"
|
- git config --local user.email "$USER_EMAIL"
|
||||||
- git tag "$VERSION" "$TRAVIS_COMMIT"
|
- git tag "$VERSION" "$TRAVIS_COMMIT"
|
||||||
- yarn task package "$VERSION"
|
- if [[ “$TRAVIS_OS_NAME” == “osx” ]]; then yarn task package $VERSION; fi
|
||||||
deploy:
|
deploy:
|
||||||
provider: releases
|
provider: releases
|
||||||
file_glob: true
|
file_glob: true
|
||||||
@@ -34,7 +42,7 @@ deploy:
|
|||||||
- release/*.tar.gz
|
- release/*.tar.gz
|
||||||
- release/*.zip
|
- release/*.zip
|
||||||
on:
|
on:
|
||||||
repo: codercom/code-server
|
repo: cdr/code-server
|
||||||
branch: master
|
branch: master
|
||||||
cache:
|
cache:
|
||||||
yarn: true
|
yarn: true
|
||||||
|
|||||||
12
Dockerfile
12
Dockerfile
@@ -1,4 +1,4 @@
|
|||||||
FROM node:8.15.0
|
FROM node:10.15.1
|
||||||
|
|
||||||
# Install VS Code's deps. These are the only two it seems we need.
|
# Install VS Code's deps. These are the only two it seems we need.
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y \
|
||||||
@@ -24,7 +24,10 @@ RUN apt-get update && apt-get install -y \
|
|||||||
git \
|
git \
|
||||||
locales \
|
locales \
|
||||||
sudo \
|
sudo \
|
||||||
dumb-init
|
dumb-init \
|
||||||
|
vim \
|
||||||
|
curl \
|
||||||
|
wget
|
||||||
|
|
||||||
RUN locale-gen en_US.UTF-8
|
RUN locale-gen en_US.UTF-8
|
||||||
# We unfortunately cannot use update-locale because docker will not use the env variables
|
# We unfortunately cannot use update-locale because docker will not use the env variables
|
||||||
@@ -37,8 +40,13 @@ RUN adduser --gecos '' --disabled-password coder && \
|
|||||||
USER coder
|
USER coder
|
||||||
# We create first instead of just using WORKDIR as when WORKDIR creates, the user is root.
|
# We create first instead of just using WORKDIR as when WORKDIR creates, the user is root.
|
||||||
RUN mkdir -p /home/coder/project
|
RUN mkdir -p /home/coder/project
|
||||||
|
|
||||||
WORKDIR /home/coder/project
|
WORKDIR /home/coder/project
|
||||||
|
|
||||||
|
# This assures we have a volume mounted even if the user forgot to do bind mount.
|
||||||
|
# So that they do not lose their data if they delete the container.
|
||||||
|
VOLUME [ "/home/coder/project" ]
|
||||||
|
|
||||||
COPY --from=0 /src/packages/server/cli-linux-x64 /usr/local/bin/code-server
|
COPY --from=0 /src/packages/server/cli-linux-x64 /usr/local/bin/code-server
|
||||||
EXPOSE 8443
|
EXPOSE 8443
|
||||||
|
|
||||||
|
|||||||
22
README.md
22
README.md
@@ -1,15 +1,15 @@
|
|||||||
# code-server
|
# code-server
|
||||||
|
|
||||||
[](https://github.com/codercom/code-server/issues)
|
[](https://github.com/cdr/code-server/issues)
|
||||||
[](https://github.com/codercom/code-server/releases/latest)
|
[](https://github.com/cdr/code-server/releases/latest)
|
||||||
[](https://github.com/codercom/code-server/blob/master/LICENSE)
|
[](https://github.com/cdr/code-server/blob/master/LICENSE)
|
||||||
[](https://discord.gg/zxSwN8Z)
|
[](https://discord.gg/zxSwN8Z)
|
||||||
|
|
||||||
`code-server` is [VS Code](https://github.com/Microsoft/vscode) running on a remote server, accessible through the browser.
|
`code-server` is [VS Code](https://github.com/Microsoft/vscode) running on a remote server, accessible through the browser.
|
||||||
|
|
||||||
Try it out:
|
Try it out:
|
||||||
```bash
|
```bash
|
||||||
docker run -it -p 127.0.0.1:8443:8443 -v "${PWD}:/home/coder/project" codercom/code-server:1.621 --allow-http --no-auth
|
docker run -it -p 127.0.0.1:8443:8443 -v "${PWD}:/home/coder/project" codercom/code-server --allow-http --no-auth
|
||||||
```
|
```
|
||||||
|
|
||||||
- Code on your Chromebook, tablet, and laptop with a consistent dev environment.
|
- Code on your Chromebook, tablet, and laptop with a consistent dev environment.
|
||||||
@@ -23,9 +23,9 @@ docker run -it -p 127.0.0.1:8443:8443 -v "${PWD}:/home/coder/project" codercom/c
|
|||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
### Hosted
|
### Run over SSH
|
||||||
|
|
||||||
[Try `code-server` now](https://coder.com/signup) for free at coder.com.
|
Use [sshcode](https://github.com/codercom/sshcode) for a simple setup.
|
||||||
|
|
||||||
### Docker
|
### Docker
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ See docker oneliner mentioned above. Dockerfile is at [/Dockerfile](/Dockerfile)
|
|||||||
|
|
||||||
### Binaries
|
### Binaries
|
||||||
|
|
||||||
1. [Download a binary](https://github.com/codercom/code-server/releases) (Linux and OS X supported. Windows coming soon)
|
1. [Download a binary](https://github.com/cdr/code-server/releases) (Linux and OS X supported. Windows coming soon)
|
||||||
2. Start the binary with the project directory as the first argument
|
2. Start the binary with the project directory as the first argument
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -46,7 +46,7 @@ See docker oneliner mentioned above. Dockerfile is at [/Dockerfile](/Dockerfile)
|
|||||||
|
|
||||||
For detailed instructions and troubleshooting, see the [self-hosted quick start guide](doc/self-hosted/index.md).
|
For detailed instructions and troubleshooting, see the [self-hosted quick start guide](doc/self-hosted/index.md).
|
||||||
|
|
||||||
Quickstart guides for [Google Cloud](doc/admin/install/google_cloud.md), [AWS](doc/admin/install/aws.md), and [Digital Ocean](doc/admin/install/digitalocean.md).
|
Quickstart guides for [Google Cloud](doc/admin/install/google_cloud.md), [AWS](doc/admin/install/aws.md), and [DigitalOcean](doc/admin/install/digitalocean.md).
|
||||||
|
|
||||||
How to [secure your setup](/doc/security/ssl.md).
|
How to [secure your setup](/doc/security/ssl.md).
|
||||||
|
|
||||||
@@ -67,6 +67,12 @@ How to [secure your setup](/doc/security/ssl.md).
|
|||||||
|
|
||||||
At the moment we can't use the official VSCode Marketplace. We've created a custom extension marketplace focused around open-sourced extensions. However, if you have access to the `.vsix` file, you can manually install the extension.
|
At the moment we can't use the official VSCode Marketplace. We've created a custom extension marketplace focused around open-sourced extensions. However, if you have access to the `.vsix` file, you can manually install the extension.
|
||||||
|
|
||||||
|
## Telemetry
|
||||||
|
|
||||||
|
Use the `--disable-telemetry` flag or set `DISABLE_TELEMETRY=true` to disable tracking ENTIRELY.
|
||||||
|
|
||||||
|
We use data collected to improve code-server.
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Development guides are coming soon.
|
Development guides are coming soon.
|
||||||
|
|||||||
42
build/platform.ts
Normal file
42
build/platform.ts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* Script that detects platform name and arch.
|
||||||
|
* Cannot use os.platform() as that won't detect libc version
|
||||||
|
*/
|
||||||
|
import * as cp from "child_process";
|
||||||
|
import * as fs from "fs";
|
||||||
|
import * as os from "os";
|
||||||
|
|
||||||
|
enum Lib {
|
||||||
|
GLIBC,
|
||||||
|
MUSL,
|
||||||
|
}
|
||||||
|
|
||||||
|
const CLIB: Lib | undefined = ((): Lib | undefined => {
|
||||||
|
if (os.platform() !== "linux") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const glibc = cp.spawnSync("getconf", ["GNU_LIBC_VERSION"]);
|
||||||
|
if (glibc.status === 0) {
|
||||||
|
return Lib.GLIBC;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ldd = cp.spawnSync("ldd", ["--version"]);
|
||||||
|
if (ldd.stdout && ldd.stdout.indexOf("musl") !== -1) {
|
||||||
|
return Lib.MUSL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const muslFile = fs.readdirSync("/lib").find((value) => value.startsWith("libc.musl"));
|
||||||
|
if (muslFile) {
|
||||||
|
return Lib.MUSL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Lib.GLIBC;
|
||||||
|
})();
|
||||||
|
|
||||||
|
export const platform = (): NodeJS.Platform | "musl" => {
|
||||||
|
if (CLIB === Lib.MUSL) {
|
||||||
|
return "musl";
|
||||||
|
}
|
||||||
|
|
||||||
|
return os.platform();
|
||||||
|
};
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
import { register, run } from "@coder/runner";
|
import { register, run } from "@coder/runner";
|
||||||
|
import { logger, field } from "@coder/logger";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import * as fse from "fs-extra";
|
import * as fse from "fs-extra";
|
||||||
import * as os from "os";
|
import * as os from "os";
|
||||||
|
import { platform } from "./platform";
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import * as zlib from "zlib";
|
import * as zlib from "zlib";
|
||||||
import * as https from "https";
|
import * as https from "https";
|
||||||
@@ -12,10 +14,15 @@ const libPath = path.join(__dirname, "../lib");
|
|||||||
const vscodePath = path.join(libPath, "vscode");
|
const vscodePath = path.join(libPath, "vscode");
|
||||||
const defaultExtensionsPath = path.join(libPath, "extensions");
|
const defaultExtensionsPath = path.join(libPath, "extensions");
|
||||||
const pkgsPath = path.join(__dirname, "../packages");
|
const pkgsPath = path.join(__dirname, "../packages");
|
||||||
const vscodeVersion = process.env.VSCODE_VERSION || "1.33.0";
|
const vscodeVersion = process.env.VSCODE_VERSION || "1.33.1";
|
||||||
const vsSourceUrl = `https://codesrv-ci.cdr.sh/vstar-${vscodeVersion}.tar.gz`;
|
const vsSourceUrl = `https://codesrv-ci.cdr.sh/vstar-${vscodeVersion}.tar.gz`;
|
||||||
|
|
||||||
const buildServerBinary = register("build:server:binary", async (runner) => {
|
const buildServerBinary = register("build:server:binary", async (runner) => {
|
||||||
|
logger.info("Building with environment", field("env", {
|
||||||
|
NODE_ENV: process.env.NODE_ENV,
|
||||||
|
VERSION: process.env.VERSION,
|
||||||
|
}));
|
||||||
|
|
||||||
await ensureInstalled();
|
await ensureInstalled();
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
buildBootstrapFork(),
|
buildBootstrapFork(),
|
||||||
@@ -48,19 +55,11 @@ const buildServerBinaryCopy = register("build:server:binary:copy", async (runner
|
|||||||
const bootstrapForkPath = path.join(pkgsPath, "vscode", "out", "bootstrap-fork.js");
|
const bootstrapForkPath = path.join(pkgsPath, "vscode", "out", "bootstrap-fork.js");
|
||||||
const webOutputPath = path.join(pkgsPath, "web", "out");
|
const webOutputPath = path.join(pkgsPath, "web", "out");
|
||||||
const browserAppOutputPath = path.join(pkgsPath, "app", "browser", "out");
|
const browserAppOutputPath = path.join(pkgsPath, "app", "browser", "out");
|
||||||
const nodePtyModule = path.join(pkgsPath, "protocol", "node_modules", "node-pty-prebuilt", "build", "Release", "pty.node");
|
|
||||||
const spdlogModule = path.join(pkgsPath, "protocol", "node_modules", "spdlog", "build", "Release", "spdlog.node");
|
|
||||||
let ripgrepPath = path.join(pkgsPath, "..", "lib", "vscode", "node_modules", "vscode-ripgrep", "bin", "rg");
|
let ripgrepPath = path.join(pkgsPath, "..", "lib", "vscode", "node_modules", "vscode-ripgrep", "bin", "rg");
|
||||||
if (isWin) {
|
if (isWin) {
|
||||||
ripgrepPath += ".exe";
|
ripgrepPath += ".exe";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fs.existsSync(nodePtyModule)) {
|
|
||||||
throw new Error("Could not find pty.node. Ensure all packages have been installed");
|
|
||||||
}
|
|
||||||
if (!fs.existsSync(spdlogModule)) {
|
|
||||||
throw new Error("Could not find spdlog.node. Ensure all packages have been installed");
|
|
||||||
}
|
|
||||||
if (!fs.existsSync(webOutputPath)) {
|
if (!fs.existsSync(webOutputPath)) {
|
||||||
throw new Error("Web bundle must be built");
|
throw new Error("Web bundle must be built");
|
||||||
}
|
}
|
||||||
@@ -75,24 +74,22 @@ const buildServerBinaryCopy = register("build:server:binary:copy", async (runner
|
|||||||
}
|
}
|
||||||
fse.copySync(defaultExtensionsPath, path.join(cliBuildPath, "extensions"));
|
fse.copySync(defaultExtensionsPath, path.join(cliBuildPath, "extensions"));
|
||||||
fs.writeFileSync(path.join(cliBuildPath, "bootstrap-fork.js.gz"), zlib.gzipSync(fs.readFileSync(bootstrapForkPath)));
|
fs.writeFileSync(path.join(cliBuildPath, "bootstrap-fork.js.gz"), zlib.gzipSync(fs.readFileSync(bootstrapForkPath)));
|
||||||
const cpDir = (dir: string, subdir: "auth" | "unauth", rootPath: string): void => {
|
const cpDir = (dir: string, rootPath: string, subdir?: "login"): void => {
|
||||||
const stat = fs.statSync(dir);
|
const stat = fs.statSync(dir);
|
||||||
if (stat.isDirectory()) {
|
if (stat.isDirectory()) {
|
||||||
const paths = fs.readdirSync(dir);
|
const paths = fs.readdirSync(dir);
|
||||||
paths.forEach((p) => cpDir(path.join(dir, p), subdir, rootPath));
|
paths.forEach((p) => cpDir(path.join(dir, p), rootPath, subdir));
|
||||||
} else if (stat.isFile()) {
|
} else if (stat.isFile()) {
|
||||||
const newPath = path.join(cliBuildPath, "web", subdir, path.relative(rootPath, dir));
|
const newPath = path.join(cliBuildPath, "web", subdir || "", path.relative(rootPath, dir));
|
||||||
fse.mkdirpSync(path.dirname(newPath));
|
fse.mkdirpSync(path.dirname(newPath));
|
||||||
fs.writeFileSync(newPath + ".gz", zlib.gzipSync(fs.readFileSync(dir)));
|
fs.writeFileSync(newPath + ".gz", zlib.gzipSync(fs.readFileSync(dir)));
|
||||||
} else {
|
} else {
|
||||||
// Nothing
|
// Nothing
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
cpDir(webOutputPath, "auth", webOutputPath);
|
cpDir(webOutputPath, webOutputPath);
|
||||||
cpDir(browserAppOutputPath, "unauth", browserAppOutputPath);
|
cpDir(browserAppOutputPath, browserAppOutputPath, "login");
|
||||||
fse.mkdirpSync(path.join(cliBuildPath, "dependencies"));
|
fse.mkdirpSync(path.join(cliBuildPath, "dependencies"));
|
||||||
fse.copySync(nodePtyModule, path.join(cliBuildPath, "dependencies", "pty.node"));
|
|
||||||
fse.copySync(spdlogModule, path.join(cliBuildPath, "dependencies", "spdlog.node"));
|
|
||||||
fse.copySync(ripgrepPath, path.join(cliBuildPath, "dependencies", "rg"));
|
fse.copySync(ripgrepPath, path.join(cliBuildPath, "dependencies", "rg"));
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -190,12 +187,12 @@ register("package", async (runner, releaseTag) => {
|
|||||||
|
|
||||||
const releasePath = path.resolve(__dirname, "../release");
|
const releasePath = path.resolve(__dirname, "../release");
|
||||||
|
|
||||||
const archiveName = `code-server${releaseTag}-${os.platform()}-${os.arch()}`;
|
const archiveName = `code-server${releaseTag}-${platform()}-${os.arch()}`;
|
||||||
const archiveDir = path.join(releasePath, archiveName);
|
const archiveDir = path.join(releasePath, archiveName);
|
||||||
fse.removeSync(archiveDir);
|
fse.removeSync(archiveDir);
|
||||||
fse.mkdirpSync(archiveDir);
|
fse.mkdirpSync(archiveDir);
|
||||||
|
|
||||||
const binaryPath = path.join(__dirname, `../packages/server/cli-${os.platform()}-${os.arch()}`);
|
const binaryPath = path.join(__dirname, `../packages/server/cli-${platform()}-${os.arch()}`);
|
||||||
const binaryDestination = path.join(archiveDir, "code-server");
|
const binaryDestination = path.join(archiveDir, "code-server");
|
||||||
fse.copySync(binaryPath, binaryDestination);
|
fse.copySync(binaryPath, binaryDestination);
|
||||||
fs.chmodSync(binaryDestination, "755");
|
fs.chmodSync(binaryDestination, "755");
|
||||||
@@ -204,9 +201,9 @@ register("package", async (runner, releaseTag) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
runner.cwd = releasePath;
|
runner.cwd = releasePath;
|
||||||
await os.platform() === "linux"
|
await (os.platform() === "linux"
|
||||||
? runner.execute("tar", ["-cvzf", `${archiveName}.tar.gz`, `${archiveName}`])
|
? runner.execute("tar", ["-cvzf", `${archiveName}.tar.gz`, `${archiveName}`])
|
||||||
: runner.execute("zip", ["-r", `${archiveName}.zip`, `${archiveName}`]);
|
: runner.execute("zip", ["-r", `${archiveName}.zip`, `${archiveName}`]));
|
||||||
});
|
});
|
||||||
|
|
||||||
run();
|
run();
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ metadata:
|
|||||||
provisioner: kubernetes.io/aws-ebs
|
provisioner: kubernetes.io/aws-ebs
|
||||||
parameters:
|
parameters:
|
||||||
type: gp2
|
type: gp2
|
||||||
fsType: ext4
|
fsType: ext4
|
||||||
---
|
---
|
||||||
kind: PersistentVolumeClaim
|
kind: PersistentVolumeClaim
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
@@ -71,4 +71,4 @@ spec:
|
|||||||
- name: code-server-storage
|
- name: code-server-storage
|
||||||
persistentVolumeClaim:
|
persistentVolumeClaim:
|
||||||
claimName: code-store
|
claimName: code-store
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This tutorial shows you how to deploy `code-server` on an EC2 AWS instance.
|
This tutorial shows you how to deploy `code-server` on an EC2 AWS instance.
|
||||||
|
|
||||||
If you're just starting out, we recommend [installing code-server locally](../../self-hosted/index.md). It takes only a few minutes and lets you try out all of the features. You can also try out the IDE on a container hosted [by Coder](http://coder.com/signup)
|
If you're just starting out, we recommend [installing code-server locally](../../self-hosted/index.md). It takes only a few minutes and lets you try out all of the features.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -35,11 +35,11 @@ If you're just starting out, we recommend [installing code-server locally](../..
|
|||||||
- At this point it is time to download the `code-server` binary. We will of course want the linux version.
|
- At this point it is time to download the `code-server` binary. We will of course want the linux version.
|
||||||
- Find the latest Linux release from this URL:
|
- Find the latest Linux release from this URL:
|
||||||
```
|
```
|
||||||
https://github.com/codercom/code-server/releases/latest
|
https://github.com/cdr/code-server/releases/latest
|
||||||
```
|
```
|
||||||
- Replace {version} in the following command with the version found on the releases page and run it (or just copy the download URL from the releases page):
|
- Replace {version} in the following command with the version found on the releases page and run it (or just copy the download URL from the releases page):
|
||||||
```
|
```
|
||||||
wget https://github.com/codercom/code-server/releases/download/{version}/code-server-{version}-linux-x64.tar.gz
|
wget https://github.com/cdr/code-server/releases/download/{version}/code-server-{version}-linux-x64.tar.gz
|
||||||
```
|
```
|
||||||
- Extract the downloaded tar.gz file with this command, for example:
|
- Extract the downloaded tar.gz file with this command, for example:
|
||||||
```
|
```
|
||||||
@@ -66,4 +66,4 @@ If you're just starting out, we recommend [installing code-server locally](../..
|
|||||||
> The `-p 80` flag is necessary in order to make the IDE accessible from the public IP of your instance (also available from the description in the instances page.
|
> The `-p 80` flag is necessary in order to make the IDE accessible from the public IP of your instance (also available from the description in the instances page.
|
||||||
|
|
||||||
---
|
---
|
||||||
> NOTE: If you get stuck or need help, [file an issue](https://github.com/codercom/code-server/issues/new?&title=Improve+self-hosted+quickstart+guide), [tweet (@coderhq)](https://twitter.com/coderhq) or [email](mailto:support@coder.com?subject=Self-hosted%20quickstart%20guide).
|
> NOTE: If you get stuck or need help, [file an issue](https://github.com/cdr/code-server/issues/new?&title=Improve+self-hosted+quickstart+guide), [tweet (@coderhq)](https://twitter.com/coderhq) or [email](mailto:support@coder.com?subject=Self-hosted%20quickstart%20guide).
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This tutorial shows you how to deploy `code-server` to a single node running on DigitalOcean.
|
This tutorial shows you how to deploy `code-server` to a single node running on DigitalOcean.
|
||||||
|
|
||||||
If you're just starting out, we recommend [installing code-server locally](../../self-hosted/index.md). It takes only a few minutes and lets you try out all of the features. You can also try out the IDE on a container hosted [by Coder](http://coder.com/signup)
|
If you're just starting out, we recommend [installing code-server locally](../../self-hosted/index.md). It takes only a few minutes and lets you try out all of the features.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -15,14 +15,14 @@ If you're just starting out, we recommend [installing code-server locally](../..
|
|||||||
- Launch your instance
|
- Launch your instance
|
||||||
- Open a terminal on your computer and SSH into your instance
|
- Open a terminal on your computer and SSH into your instance
|
||||||
> example: ssh root@203.0.113.0
|
> example: ssh root@203.0.113.0
|
||||||
- Once in the SSH session, visit code-server [releases page](https://github.com/codercom/code-server/releases/) and copy the link to the download for the latest linux release
|
- Once in the SSH session, visit code-server [releases page](https://github.com/cdr/code-server/releases/) and copy the link to the download for the latest linux release
|
||||||
- Find the latest Linux release from this URL:
|
- Find the latest Linux release from this URL:
|
||||||
```
|
```
|
||||||
https://github.com/codercom/code-server/releases/latest
|
https://github.com/cdr/code-server/releases/latest
|
||||||
```
|
```
|
||||||
- Replace {version} in the following command with the version found on the releases page and run it (or just copy the download URL from the releases page):
|
- Replace {version} in the following command with the version found on the releases page and run it (or just copy the download URL from the releases page):
|
||||||
```
|
```
|
||||||
wget https://github.com/codercom/code-server/releases/download/{version}/code-server-{version}-linux-x64.tar.gz
|
wget https://github.com/cdr/code-server/releases/download/{version}/code-server-{version}-linux-x64.tar.gz
|
||||||
```
|
```
|
||||||
- Extract the downloaded tar.gz file with this command, for example:
|
- Extract the downloaded tar.gz file with this command, for example:
|
||||||
```
|
```
|
||||||
@@ -39,11 +39,11 @@ If you're just starting out, we recommend [installing code-server locally](../..
|
|||||||
> To ensure the connection between you and your server is encrypted view our guide on [securing your setup](../../security/ssl.md)
|
> To ensure the connection between you and your server is encrypted view our guide on [securing your setup](../../security/ssl.md)
|
||||||
- Finally start the code-server
|
- Finally start the code-server
|
||||||
```
|
```
|
||||||
sudo ./code-server-linux -p 80
|
sudo ./code-server -p 80
|
||||||
```
|
```
|
||||||
> For instructions on how to keep the server running after you end your SSH session please checkout [how to use systemd](https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/) to start linux based services if they are killed
|
> For instructions on how to keep the server running after you end your SSH session please checkout [how to use systemd](https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/) to start linux based services if they are killed
|
||||||
- When you visit the public IP for your Digital Ocean instance, you will be greeted with this page. Code-server is using a self-signed SSL certificate for easy setup. To proceed to the IDE, click **"Advanced"**<img src ="../../assets/chrome_warning.png">
|
- When you visit the public IP for your Digital Ocean instance, you will be greeted with this page. Code-server is using a self-signed SSL certificate for easy setup. To proceed to the IDE, click **"Advanced"**<img src ="../../assets/chrome_warning.png">
|
||||||
- Then click **"proceed anyway"**<img src="../../assets/chrome_confirm.png">
|
- Then click **"proceed anyway"**<img src="../../assets/chrome_confirm.png">
|
||||||
|
|
||||||
---
|
---
|
||||||
> NOTE: If you get stuck or need help, [file an issue](https://github.com/codercom/code-server/issues/new?&title=Improve+self-hosted+quickstart+guide), [tweet (@coderhq)](https://twitter.com/coderhq) or [email](mailto:support@coder.com?subject=Self-hosted%20quickstart%20guide).
|
> NOTE: If you get stuck or need help, [file an issue](https://github.com/cdr/code-server/issues/new?&title=Improve+self-hosted+quickstart+guide), [tweet (@coderhq)](https://twitter.com/coderhq) or [email](mailto:support@coder.com?subject=Self-hosted%20quickstart%20guide).
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
This tutorial shows you how to deploy `code-server` to a single node running on Google Cloud.
|
This tutorial shows you how to deploy `code-server` to a single node running on Google Cloud.
|
||||||
|
|
||||||
If you're just starting out, we recommend [installing code-server locally](../../self-hosted/index.md). It takes only a few minutes and lets you try out all of the features. You can also try out the IDE on a container hosted [by Coder](http://coder.com/signup)
|
If you're just starting out, we recommend [installing code-server locally](../../self-hosted/index.md). It takes only a few minutes and lets you try out all of the features.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@ If you're just starting out, we recommend [installing code-server locally](../..
|
|||||||
- Choose Ubuntu 16.04 LTS as your boot disk
|
- Choose Ubuntu 16.04 LTS as your boot disk
|
||||||
- Check the boxes for **Allow HTTP traffic** and **Allow HTTPS traffic** in the **Firewall** section
|
- Check the boxes for **Allow HTTP traffic** and **Allow HTTPS traffic** in the **Firewall** section
|
||||||
- Create your VM, and **take note** of its public IP address.
|
- Create your VM, and **take note** of its public IP address.
|
||||||
- Copy the link to download the latest Linux binary from our [releases page](https://github.com/codercom/code-server/releases)
|
- Copy the link to download the latest Linux binary from our [releases page](https://github.com/cdr/code-server/releases)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -27,12 +27,12 @@ gcloud compute ssh --zone [region] [instance name]
|
|||||||
|
|
||||||
- Find the latest Linux release from this URL:
|
- Find the latest Linux release from this URL:
|
||||||
```
|
```
|
||||||
https://github.com/codercom/code-server/releases/latest
|
https://github.com/cdr/code-server/releases/latest
|
||||||
```
|
```
|
||||||
|
|
||||||
- Replace {version} in the following command with the version found on the releases page and run it (or just copy the download URL from the releases page):
|
- Replace {version} in the following command with the version found on the releases page and run it (or just copy the download URL from the releases page):
|
||||||
```
|
```
|
||||||
wget https://github.com/codercom/code-server/releases/download/{version}/code-server-{version}-linux-x64.tar.gz
|
wget https://github.com/cdr/code-server/releases/download/{version}/code-server-{version}-linux-x64.tar.gz
|
||||||
```
|
```
|
||||||
|
|
||||||
- Extract the downloaded tar.gz file with this command, for example:
|
- Extract the downloaded tar.gz file with this command, for example:
|
||||||
@@ -59,7 +59,7 @@ sudo ./code-server -p 80
|
|||||||
|
|
||||||
> For instructions on how to keep the server running after you end your SSH session please checkout [how to use systemd](https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/) to start linux based services if they are killed
|
> For instructions on how to keep the server running after you end your SSH session please checkout [how to use systemd](https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/) to start linux based services if they are killed
|
||||||
|
|
||||||
- Access code-server from the public IP of your Google Cloud instance we noted earlier in your browser.
|
- Access code-server from the public IP of your Google Cloud instance we noted earlier in your browser.
|
||||||
> example: 32.32.32.234
|
> example: 32.32.32.234
|
||||||
|
|
||||||
- You will be greeted with this page. Code-server is using a self-signed SSL certificate for easy setup. To proceed to the IDE, click **"Advanced"**<img src ="../../assets/chrome_warning.png">
|
- You will be greeted with this page. Code-server is using a self-signed SSL certificate for easy setup. To proceed to the IDE, click **"Advanced"**<img src ="../../assets/chrome_warning.png">
|
||||||
@@ -68,4 +68,4 @@ sudo ./code-server -p 80
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
> NOTE: If you get stuck or need help, [file an issue](https://github.com/codercom/code-server/issues/new?&title=Improve+self-hosted+quickstart+guide), [tweet (@coderhq)](https://twitter.com/coderhq) or [email](mailto:support@coder.com?subject=Self-hosted%20quickstart%20guide).
|
> NOTE: If you get stuck or need help, [file an issue](https://github.com/cdr/code-server/issues/new?&title=Improve+self-hosted+quickstart+guide), [tweet (@coderhq)](https://twitter.com/coderhq) or [email](mailto:support@coder.com?subject=Self-hosted%20quickstart%20guide).
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## Quickstart Guide
|
## Quickstart Guide
|
||||||
|
|
||||||
> NOTE: If you get stuck or need help, [file an issue](https://github.com/codercom/code-server/issues/new?&title=Improve+self-hosted+quickstart+guide), [tweet (@coderhq)](https://twitter.com/coderhq) or [email](mailto:support@coder.com?subject=Self-hosted%20quickstart%20guide).
|
> NOTE: If you get stuck or need help, [file an issue](https://github.com/cdr/code-server/issues/new?&title=Improve+self-hosted+quickstart+guide), [tweet (@coderhq)](https://twitter.com/coderhq) or [email](mailto:support@coder.com?subject=Self-hosted%20quickstart%20guide).
|
||||||
|
|
||||||
This document pertains to Coder specific implementations of VS Code. For documentation on how to use VS Code itself, please refer to the official [documentation for VS Code](https://code.visualstudio.com/docs)
|
This document pertains to Coder specific implementations of VS Code. For documentation on how to use VS Code itself, please refer to the official [documentation for VS Code](https://code.visualstudio.com/docs)
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ It takes just a few minutes to get your own self-hosted server running. If you'v
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
1. Visit [the releases](https://github.com/codercom/code-server/releases) page and download the latest cli for your operating system
|
1. Visit [the releases](https://github.com/cdr/code-server/releases) page and download the latest cli for your operating system
|
||||||
2. Double click the executable to run in the current directory
|
2. Double click the executable to run in the current directory
|
||||||
3. Copy the password that appears in the cli<img src="../assets/cli.png">
|
3. Copy the password that appears in the cli<img src="../assets/cli.png">
|
||||||
4. In your browser navigate to `localhost:8443`
|
4. In your browser navigate to `localhost:8443`
|
||||||
@@ -34,40 +34,44 @@ It takes just a few minutes to get your own self-hosted server running. If you'v
|
|||||||
code-server can be ran with a number of arguments to customize your working directory, host, port, and SSL certificate.
|
code-server can be ran with a number of arguments to customize your working directory, host, port, and SSL certificate.
|
||||||
|
|
||||||
```
|
```
|
||||||
USAGE
|
Usage: code-server [options]
|
||||||
$ code-server [WORKDIR]
|
|
||||||
|
|
||||||
ARGUMENTS
|
Run VS Code on a remote server.
|
||||||
WORKDIR [default: (directory to binary)] Specify working dir
|
|
||||||
|
|
||||||
OPTIONS
|
Options:
|
||||||
-d, --data-dir=data-dir
|
-V, --version output the version number
|
||||||
-h, --host=host [default: 0.0.0.0]
|
--cert <value>
|
||||||
-o, --open Open in browser on startup
|
--cert-key <value>
|
||||||
-p, --port=port [default: 8443] Port to bind on
|
-e, --extensions-dir <dir> Set the root path for extensions.
|
||||||
-v, --version show CLI version
|
-d --user-data-dir <dir> Specifies the directory that user data is kept in, useful when running as root.
|
||||||
--allow-http
|
--data-dir <value> DEPRECATED: Use '--user-data-dir' instead. Customize where user-data is stored.
|
||||||
--cert=cert
|
-h, --host <value> Customize the hostname. (default: "0.0.0.0")
|
||||||
--cert-key=cert-key
|
-o, --open Open in the browser on startup.
|
||||||
--help show CLI help
|
-p, --port <number> Port to bind on. (default: 8443)
|
||||||
--no-auth
|
-N, --no-auth Start without requiring authentication.
|
||||||
--password=password
|
-H, --allow-http Allow http connections.
|
||||||
|
-P, --password <value> Specify a password for authentication.
|
||||||
|
--disable-telemetry Disables ALL telemetry.
|
||||||
|
--help output usage information
|
||||||
```
|
```
|
||||||
|
|
||||||
### Data Directory
|
### Data Directory
|
||||||
Use `code-server -d (path/to/directory)` or `code-server --data-dir=(path/to/directory)`, excluding the parentheses to specify the root folder that VS Code will start in
|
Use `code-server -d (path/to/directory)` or `code-server --user-data-dir=(path/to/directory)`, excluding the parentheses to specify the root folder that VS Code will start in.
|
||||||
|
|
||||||
### Host
|
### Host
|
||||||
By default, code-server will use `0.0.0.0` as its address. This can be changed by using `code-server -h` or `code-server --host=` followed by the address you want to use.
|
By default, code-server will use `0.0.0.0` as its address. This can be changed by using `code-server -h` or `code-server --host=` followed by the address you want to use.
|
||||||
> Example: `code-server -h 127.0.0.1`
|
> Example: `code-server -h 127.0.0.1`
|
||||||
|
|
||||||
### Open
|
### Open
|
||||||
You can have the server automatically open the VS Code in your browser on startup by using the `code server -o` or `code-server --open` flags
|
You can have the server automatically open the VS Code in your browser on startup by using the `code-server -o` or `code-server --open` flags
|
||||||
|
|
||||||
### Port
|
### Port
|
||||||
By default, code-server will use `8443` as its port. This can be changed by using `code-server -p` or `code-server --port=` followed by the port you want to use.
|
By default, code-server will use `8443` as its port. This can be changed by using `code-server -p` or `code-server --port=` followed by the port you want to use.
|
||||||
> Example: `code-server -p 9000`
|
> Example: `code-server -p 9000`
|
||||||
|
|
||||||
|
### Telemetry
|
||||||
|
Disable all telemetry with `code-server --disable-telemetry`.
|
||||||
|
|
||||||
### Cert and Cert Key
|
### Cert and Cert Key
|
||||||
To encrypt the traffic between the browser and server use `code-server --cert=` followed by the path to your `.cer` file. Additionally, you can use certificate keys with `code-server --cert-key` followed by the path to your `.key` file.
|
To encrypt the traffic between the browser and server use `code-server --cert=` followed by the path to your `.cer` file. Additionally, you can use certificate keys with `code-server --cert-key` followed by the path to your `.key` file.
|
||||||
> Example (certificate and key): `code-server --cert /etc/letsencrypt/live/example.com/fullchain.cer --cert-key /etc/letsencrypt/live/example.com/fullchain.key`
|
> Example (certificate and key): `code-server --cert /etc/letsencrypt/live/example.com/fullchain.cer --cert-key /etc/letsencrypt/live/example.com/fullchain.key`
|
||||||
@@ -116,4 +120,4 @@ OPTIONS
|
|||||||
*Important:* For more details about Apache reverse proxy configuration checkout the [documentation](https://httpd.apache.org/docs/current/mod/mod_proxy.html) - especially the [Securing your Server](https://httpd.apache.org/docs/current/mod/mod_proxy.html#access) section
|
*Important:* For more details about Apache reverse proxy configuration checkout the [documentation](https://httpd.apache.org/docs/current/mod/mod_proxy.html) - especially the [Securing your Server](https://httpd.apache.org/docs/current/mod/mod_proxy.html#access) section
|
||||||
|
|
||||||
### Help
|
### Help
|
||||||
Use `code-server -h` or `code-server --help` to view the usage for the cli. This is also shown at the beginning of this section.
|
Use `code-server --help` to view the usage for the CLI. This is also shown at the beginning of this section.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@coder/code-server",
|
"name": "@coder/code-server",
|
||||||
"repository": "https://github.com/codercom/code-server",
|
"repository": "https://github.com/cdr/code-server",
|
||||||
"author": "Coder",
|
"author": "Coder",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"description": "Run VS Code remotely.",
|
"description": "Run VS Code remotely.",
|
||||||
@@ -54,10 +54,17 @@
|
|||||||
"webpack-dev-middleware": "^3.5.0",
|
"webpack-dev-middleware": "^3.5.0",
|
||||||
"webpack-dev-server": "^3.1.14",
|
"webpack-dev-server": "^3.1.14",
|
||||||
"webpack-hot-middleware": "^2.24.3",
|
"webpack-hot-middleware": "^2.24.3",
|
||||||
|
"webpack-pwa-manifest": "^4.0.0",
|
||||||
|
"workbox-webpack-plugin": "^4.1.0",
|
||||||
"write-file-webpack-plugin": "^4.5.0"
|
"write-file-webpack-plugin": "^4.5.0"
|
||||||
},
|
},
|
||||||
|
"resolutions": {
|
||||||
|
"bindings": "1.3.0"
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"node-loader": "^0.6.0",
|
"node-loader": "^0.6.0",
|
||||||
|
"node-pty": "0.8.1",
|
||||||
|
"spdlog": "0.8.1",
|
||||||
"webpack-merge": "^4.2.1"
|
"webpack-merge": "^4.2.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,22 +7,24 @@
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="login">
|
<form id="login-form">
|
||||||
<div class="back"> <- Back </div>
|
<div class="login">
|
||||||
<h4 class="title">code-server</h4>
|
<div class="back">
|
||||||
<h2 class="subtitle">
|
<- Back </div> <h4 class="title">code-server</h4>
|
||||||
Enter server password
|
<h2 class="subtitle">
|
||||||
</h2>
|
Enter server password
|
||||||
<div class="mdc-text-field">
|
</h2>
|
||||||
<input type="password" id="password" class="mdc-text-field__input" required>
|
<div class="mdc-text-field">
|
||||||
<label class="mdc-floating-label" for="password">Password</label>
|
<input type="password" id="password" class="mdc-text-field__input" required>
|
||||||
<div class="mdc-line-ripple"></div>
|
<label class="mdc-floating-label" for="password">Password</label>
|
||||||
</div>
|
<div class="mdc-line-ripple"></div>
|
||||||
<button id="submit" class="mdc-button mdc-button--unelevated">
|
</div>
|
||||||
<span class="mdc-button__label">Enter IDE</span>
|
<button id="submit" class="mdc-button mdc-button--unelevated">
|
||||||
</button>
|
<span class="mdc-button__label">Enter IDE</span>
|
||||||
<div id="error-display"></div>
|
</button>
|
||||||
</div>
|
<div id="error-display"></div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@@ -20,12 +20,17 @@ window.addEventListener("message", (event) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const password = document.getElementById("password") as HTMLInputElement;
|
const password = document.getElementById("password") as HTMLInputElement;
|
||||||
const submit = document.getElementById("submit") as HTMLButtonElement;
|
const form = document.getElementById("login-form") as HTMLFormElement;
|
||||||
if (!submit) {
|
|
||||||
throw new Error("No submit button found");
|
if (!form) {
|
||||||
|
throw new Error("No password form found");
|
||||||
}
|
}
|
||||||
submit.addEventListener("click", () => {
|
|
||||||
document.cookie = `password=${password.value}`;
|
form.addEventListener("submit", (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
document.cookie = `password=${password.value}; `
|
||||||
|
+ `path=${location.pathname.replace(/\/login\/?$/, "/")}; `
|
||||||
|
+ `domain=${location.hostname}`;
|
||||||
location.reload();
|
location.reload();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -38,4 +43,4 @@ const errorDisplay = document.getElementById("error-display") as HTMLDivElement;
|
|||||||
|
|
||||||
if (document.referrer === document.location.href && matches) {
|
if (document.referrer === document.location.href && matches) {
|
||||||
errorDisplay.innerText = "Password is incorrect!";
|
errorDisplay.innerText = "Password is incorrect!";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,11 +7,10 @@ const root = path.resolve(__dirname, "../../..");
|
|||||||
|
|
||||||
module.exports = merge(
|
module.exports = merge(
|
||||||
require(path.join(root, "scripts/webpack.client.config.js"))({
|
require(path.join(root, "scripts/webpack.client.config.js"))({
|
||||||
entry: path.join(root, "packages/app/browser/src/app.ts"),
|
dirname: __dirname,
|
||||||
template: path.join(root, "packages/app/browser/src/app.html"),
|
entry: path.join(__dirname, "src/app.ts"),
|
||||||
|
name: "login",
|
||||||
|
template: path.join(__dirname, "src/app.html"),
|
||||||
}), {
|
}), {
|
||||||
output: {
|
|
||||||
path: path.join(__dirname, "out"),
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -5,15 +5,12 @@ const root = path.resolve(__dirname, "../..");
|
|||||||
|
|
||||||
module.exports = merge(
|
module.exports = merge(
|
||||||
require(path.join(root, "scripts/webpack.node.config.js"))({
|
require(path.join(root, "scripts/webpack.node.config.js"))({
|
||||||
// Options.
|
dirname: __dirname,
|
||||||
|
name: "dns",
|
||||||
}), {
|
}), {
|
||||||
externals: {
|
externals: {
|
||||||
"node-named": "commonjs node-named",
|
"node-named": "commonjs node-named",
|
||||||
},
|
},
|
||||||
output: {
|
|
||||||
path: path.join(__dirname, "out"),
|
|
||||||
filename: "main.js",
|
|
||||||
},
|
|
||||||
entry: [
|
entry: [
|
||||||
"./packages/dns/src/dns.ts"
|
"./packages/dns/src/dns.ts"
|
||||||
],
|
],
|
||||||
|
|||||||
14
packages/ide-api/api.d.ts
vendored
14
packages/ide-api/api.d.ts
vendored
@@ -1,5 +1,10 @@
|
|||||||
// tslint:disable no-any
|
// tslint:disable no-any
|
||||||
|
|
||||||
|
import { ITerminalService } from "vs/workbench/contrib/terminal/common/terminal";
|
||||||
|
import { IWorkbenchActionRegistry } from 'vs/workbench/common/actions';
|
||||||
|
import { Action } from 'vs/base/common/actions';
|
||||||
|
import { SyncActionDescriptor } from 'vs/platform/actions/common/actions';
|
||||||
|
|
||||||
export interface EvalHelper { }
|
export interface EvalHelper { }
|
||||||
interface ActiveEvalEmitter {
|
interface ActiveEvalEmitter {
|
||||||
removeAllListeners(event?: string): void;
|
removeAllListeners(event?: string): void;
|
||||||
@@ -136,14 +141,23 @@ interface ICommandRegistry {
|
|||||||
registerCommand(command: ICommand): IDisposable;
|
registerCommand(command: ICommand): IDisposable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface IStorageService {
|
||||||
|
save(): Promise<void>;
|
||||||
|
}
|
||||||
|
|
||||||
declare namespace ide {
|
declare namespace ide {
|
||||||
export const client: {};
|
export const client: {};
|
||||||
|
|
||||||
export const workbench: {
|
export const workbench: {
|
||||||
|
readonly action: Action,
|
||||||
|
readonly syncActionDescriptor: SyncActionDescriptor,
|
||||||
readonly statusbarService: IStatusbarService;
|
readonly statusbarService: IStatusbarService;
|
||||||
|
readonly actionsRegistry: IWorkbenchActionRegistry;
|
||||||
readonly notificationService: INotificationService;
|
readonly notificationService: INotificationService;
|
||||||
|
readonly storageService: IStorageService;
|
||||||
readonly menuRegistry: IMenuRegistry;
|
readonly menuRegistry: IMenuRegistry;
|
||||||
readonly commandRegistry: ICommandRegistry;
|
readonly commandRegistry: ICommandRegistry;
|
||||||
|
readonly terminalService: ITerminalService;
|
||||||
|
|
||||||
onFileCreate(cb: (path: string) => void): void;
|
onFileCreate(cb: (path: string) => void): void;
|
||||||
onFileMove(cb: (path: string, target: string) => void): void;
|
onFileMove(cb: (path: string, target: string) => void): void;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@coder/ide-api",
|
"name": "@coder/ide-api",
|
||||||
"version": "1.0.3",
|
"version": "1.0.4",
|
||||||
"typings": "api.d.ts",
|
"typings": "api.d.ts",
|
||||||
"author": "Coder",
|
"author": "Coder",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@@ -34,6 +34,12 @@ export abstract class IdeClient {
|
|||||||
this.loadTime = time(2500);
|
this.loadTime = time(2500);
|
||||||
|
|
||||||
let appWindow: Window | undefined;
|
let appWindow: Window | undefined;
|
||||||
|
|
||||||
|
window.addEventListener("beforeunload", (e) => {
|
||||||
|
e.preventDefault(); // FireFox
|
||||||
|
e.returnValue = ""; // Chrome
|
||||||
|
});
|
||||||
|
|
||||||
window.addEventListener("message", (event) => {
|
window.addEventListener("message", (event) => {
|
||||||
if (event.data === "app") {
|
if (event.data === "app") {
|
||||||
appWindow = event.source as Window;
|
appWindow = event.source as Window;
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ const newCreateElement = <K extends keyof HTMLElementTagNameMap>(tagName: K): HT
|
|||||||
},
|
},
|
||||||
set: (value: string): void => {
|
set: (value: string): void => {
|
||||||
if (value) {
|
if (value) {
|
||||||
value = value.replace(/file:\/\//g, "/resource");
|
const resourceBaseUrl = location.pathname.replace(/\/$/, "") + "/resource";
|
||||||
|
value = value.replace(/file:\/\//g, resourceBaseUrl);
|
||||||
}
|
}
|
||||||
oldSrc!.set!.call(img, value);
|
oldSrc!.set!.call(img, value);
|
||||||
},
|
},
|
||||||
@@ -66,7 +67,8 @@ const newCreateElement = <K extends keyof HTMLElementTagNameMap>(tagName: K): HT
|
|||||||
},
|
},
|
||||||
set: (value: string): void => {
|
set: (value: string): void => {
|
||||||
if (value) {
|
if (value) {
|
||||||
value = value.replace(/file:\/\//g, "/resource");
|
const resourceBaseUrl = location.pathname.replace(/\/$/, "") + "/resource";
|
||||||
|
value = value.replace(/file:\/\//g, resourceBaseUrl);
|
||||||
}
|
}
|
||||||
oldInnerHtml!.set!.call(style, value);
|
oldInnerHtml!.set!.call(style, value);
|
||||||
},
|
},
|
||||||
@@ -80,7 +82,8 @@ const newCreateElement = <K extends keyof HTMLElementTagNameMap>(tagName: K): HT
|
|||||||
if (sheet && !overridden) {
|
if (sheet && !overridden) {
|
||||||
const oldInsertRule = sheet.insertRule;
|
const oldInsertRule = sheet.insertRule;
|
||||||
sheet.insertRule = (rule: string, index?: number): void => {
|
sheet.insertRule = (rule: string, index?: number): void => {
|
||||||
rule = rule.replace(/file:\/\//g, "/resource");
|
const resourceBaseUrl = location.pathname.replace(/\/$/, "") + "/resource";
|
||||||
|
rule = rule.replace(/file:\/\//g, resourceBaseUrl);
|
||||||
oldInsertRule.call(sheet, rule, index);
|
oldInsertRule.call(sheet, rule, index);
|
||||||
};
|
};
|
||||||
overridden = true;
|
overridden = true;
|
||||||
@@ -145,8 +148,9 @@ const newCreateElement = <K extends keyof HTMLElementTagNameMap>(tagName: K): HT
|
|||||||
(view as any).send = (channel: string, ...args: any[]): void => { // tslint:disable-line no-any
|
(view as any).send = (channel: string, ...args: any[]): void => { // tslint:disable-line no-any
|
||||||
if (args[0] && typeof args[0] === "object" && args[0].contents) {
|
if (args[0] && typeof args[0] === "object" && args[0].contents) {
|
||||||
// TODO
|
// TODO
|
||||||
args[0].contents = (args[0].contents as string).replace(/"(file:\/\/[^"]*)"/g, (m1) => `"/resource${m1}"`);
|
const resourceBaseUrl = location.pathname.replace(/\/$/, "") + "/resource";
|
||||||
args[0].contents = (args[0].contents as string).replace(/"vscode-resource:([^"]*)"/g, (m, m1) => `"/resource${m1}"`);
|
args[0].contents = (args[0].contents as string).replace(/"(file:\/\/[^"]*)"/g, (m1) => `"${resourceBaseUrl}${m1}"`);
|
||||||
|
args[0].contents = (args[0].contents as string).replace(/"vscode-resource:([^"]*)"/g, (m, m1) => `"${resourceBaseUrl}${m1}"`);
|
||||||
args[0].contents = (args[0].contents as string).replace(/style-src vscode-core-resource:/g, "style-src 'self'");
|
args[0].contents = (args[0].contents as string).replace(/style-src vscode-core-resource:/g, "style-src 'self'");
|
||||||
}
|
}
|
||||||
if (view.contentWindow) {
|
if (view.contentWindow) {
|
||||||
@@ -167,8 +171,10 @@ const newCreateElement = <K extends keyof HTMLElementTagNameMap>(tagName: K): HT
|
|||||||
document.createElement = newCreateElement;
|
document.createElement = newCreateElement;
|
||||||
|
|
||||||
class Clipboard {
|
class Clipboard {
|
||||||
public has(): boolean {
|
private readonly buffers = new Map<string, Buffer>();
|
||||||
return false;
|
|
||||||
|
public has(format: string): boolean {
|
||||||
|
return this.buffers.has(format);
|
||||||
}
|
}
|
||||||
|
|
||||||
public readFindText(): string {
|
public readFindText(): string {
|
||||||
@@ -182,6 +188,18 @@ class Clipboard {
|
|||||||
public writeText(value: string): Promise<void> {
|
public writeText(value: string): Promise<void> {
|
||||||
return clipboard.writeText(value);
|
return clipboard.writeText(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public readText(): Promise<string> {
|
||||||
|
return clipboard.readText();
|
||||||
|
}
|
||||||
|
|
||||||
|
public writeBuffer(format: string, buffer: Buffer): void {
|
||||||
|
this.buffers.set(format, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public readBuffer(format: string): Buffer | undefined {
|
||||||
|
return this.buffers.get(format);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Shell {
|
class Shell {
|
||||||
@@ -360,14 +378,31 @@ class BrowserWindow extends EventEmitter {
|
|||||||
|
|
||||||
public setFullScreen(fullscreen: boolean): void {
|
public setFullScreen(fullscreen: boolean): void {
|
||||||
if (fullscreen) {
|
if (fullscreen) {
|
||||||
document.documentElement.requestFullscreen();
|
document.documentElement.requestFullscreen().catch((error) => {
|
||||||
|
logger.error(error.message);
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
document.exitFullscreen();
|
document.exitFullscreen().catch((error) => {
|
||||||
|
logger.error(error.message);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public isFullScreen(): boolean {
|
public isFullScreen(): boolean {
|
||||||
return document.fullscreenEnabled;
|
// TypeScript doesn't recognize this property.
|
||||||
|
// tslint:disable no-any
|
||||||
|
if (typeof (window as any)["fullScreen"] !== "undefined") {
|
||||||
|
return (window as any)["fullScreen"];
|
||||||
|
}
|
||||||
|
// tslint:enable no-any
|
||||||
|
|
||||||
|
try {
|
||||||
|
return window.matchMedia("(display-mode: fullscreen)").matches;
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error.message);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public isFocused(): boolean {
|
public isFocused(): boolean {
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ export class Retry {
|
|||||||
|
|
||||||
// Times are in seconds.
|
// Times are in seconds.
|
||||||
private readonly retryMinDelay = 1;
|
private readonly retryMinDelay = 1;
|
||||||
private readonly retryMaxDelay = 10;
|
private readonly retryMaxDelay = 3;
|
||||||
private readonly maxImmediateRetries = 5;
|
private readonly maxImmediateRetries = 5;
|
||||||
private readonly retryExponent = 1.5;
|
private readonly retryExponent = 1.5;
|
||||||
private blocked: string | boolean | undefined;
|
private blocked: string | boolean | undefined;
|
||||||
|
|||||||
@@ -5,9 +5,12 @@
|
|||||||
"build": "tsc -p tsconfig.build.json && cp ./out/packages/logger/src/* ./out && rm -rf out/packages && ../../node_modules/.bin/webpack --config ./webpack.config.js",
|
"build": "tsc -p tsconfig.build.json && cp ./out/packages/logger/src/* ./out && rm -rf out/packages && ../../node_modules/.bin/webpack --config ./webpack.config.js",
|
||||||
"postinstall": "if [ ! -d out ];then npm run build; fi"
|
"postinstall": "if [ ! -d out ];then npm run build; fi"
|
||||||
},
|
},
|
||||||
"version": "1.0.3",
|
"version": "1.1.3",
|
||||||
"main": "out/main.js",
|
"main": "out/main.js",
|
||||||
"types": "out/index.d.ts",
|
"types": "out/index.d.ts",
|
||||||
"author": "Coder",
|
"author": "Coder",
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@google-cloud/logging": "^4.5.2"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
packages/logger/src/extender.test.ts
Normal file
12
packages/logger/src/extender.test.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { field, logger } from "./logger";
|
||||||
|
import { createStackdriverExtender } from "./extender";
|
||||||
|
|
||||||
|
describe("Extender", () => {
|
||||||
|
it("should add stackdriver extender", () => {
|
||||||
|
logger.extend(createStackdriverExtender("coder-dev-1", "logging-package-tests"));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should log", async () => {
|
||||||
|
logger.debug("Bananas!", field("frog", { hi: "wow" }));
|
||||||
|
});
|
||||||
|
});
|
||||||
63
packages/logger/src/extender.ts
Normal file
63
packages/logger/src/extender.ts
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
import * as gcl from "@google-cloud/logging";
|
||||||
|
import { Extender, logger, field } from "./logger";
|
||||||
|
|
||||||
|
export const createStackdriverExtender = (projectId: string, logId: string): Extender => {
|
||||||
|
enum GcpLogSeverity {
|
||||||
|
DEFAULT = 0,
|
||||||
|
DEBUG = 100,
|
||||||
|
INFO = 200,
|
||||||
|
NOTICE = 300,
|
||||||
|
WARNING = 400,
|
||||||
|
ERROR = 500,
|
||||||
|
CRITICAL = 600,
|
||||||
|
ALERT = 700,
|
||||||
|
EMERGENCY = 800,
|
||||||
|
}
|
||||||
|
|
||||||
|
const logging = new gcl.Logging({
|
||||||
|
autoRetry: true,
|
||||||
|
projectId,
|
||||||
|
});
|
||||||
|
|
||||||
|
const log = logging.log(logId);
|
||||||
|
const convertSeverity = (severity: "trace" | "info" | "warn" | "debug" | "error"): GcpLogSeverity => {
|
||||||
|
switch (severity) {
|
||||||
|
case "trace":
|
||||||
|
case "debug":
|
||||||
|
return GcpLogSeverity.DEBUG;
|
||||||
|
case "info":
|
||||||
|
return GcpLogSeverity.INFO;
|
||||||
|
case "error":
|
||||||
|
return GcpLogSeverity.ERROR;
|
||||||
|
case "warn":
|
||||||
|
return GcpLogSeverity.WARNING;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (options): void => {
|
||||||
|
const severity = convertSeverity(options.type);
|
||||||
|
// tslint:disable-next-line:no-any
|
||||||
|
const metadata = {} as any;
|
||||||
|
if (options.fields) {
|
||||||
|
options.fields.forEach((f) => {
|
||||||
|
if (!f) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
metadata[f.identifier] = f.value;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const entry = log.entry({
|
||||||
|
// tslint:disable-next-line:no-any
|
||||||
|
severity: severity as any,
|
||||||
|
}, {
|
||||||
|
...metadata,
|
||||||
|
message: options.message,
|
||||||
|
});
|
||||||
|
|
||||||
|
log.write(entry).catch((ex) => {
|
||||||
|
logger.named("GCP").error("Failed to log", field("error", ex));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
@@ -59,6 +59,14 @@ export const field = <T>(name: string, value: T): Field<T> => {
|
|||||||
return new Field(name, value);
|
return new Field(name, value);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type Extender = (msg: {
|
||||||
|
message: string,
|
||||||
|
level: Level,
|
||||||
|
type: "trace" | "info" | "warn" | "debug" | "error",
|
||||||
|
fields?: FieldArray,
|
||||||
|
section?: string,
|
||||||
|
}) => void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This formats & builds text for logging.
|
* This formats & builds text for logging.
|
||||||
* It should only be used to build one log item at a time since it stores the
|
* It should only be used to build one log item at a time since it stores the
|
||||||
@@ -221,6 +229,7 @@ export class Logger {
|
|||||||
private _formatter: Formatter,
|
private _formatter: Formatter,
|
||||||
private readonly name?: string,
|
private readonly name?: string,
|
||||||
private readonly defaultFields?: FieldArray,
|
private readonly defaultFields?: FieldArray,
|
||||||
|
private readonly extenders: Extender[] = [],
|
||||||
) {
|
) {
|
||||||
if (name) {
|
if (name) {
|
||||||
this.nameColor = this.hashStringToColor(name);
|
this.nameColor = this.hashStringToColor(name);
|
||||||
@@ -248,6 +257,10 @@ export class Logger {
|
|||||||
this.muted = true;
|
this.muted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public extend(extender: Extender): void {
|
||||||
|
this.extenders.push(extender);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Outputs information.
|
* Outputs information.
|
||||||
*/
|
*/
|
||||||
@@ -328,7 +341,7 @@ export class Logger {
|
|||||||
* Each name is deterministically generated a color.
|
* Each name is deterministically generated a color.
|
||||||
*/
|
*/
|
||||||
public named(name: string, ...fields: FieldArray): Logger {
|
public named(name: string, ...fields: FieldArray): Logger {
|
||||||
const l = new Logger(this._formatter, name, fields);
|
const l = new Logger(this._formatter, name, fields, this.extenders);
|
||||||
if (this.muted) {
|
if (this.muted) {
|
||||||
l.mute();
|
l.mute();
|
||||||
}
|
}
|
||||||
@@ -393,6 +406,16 @@ export class Logger {
|
|||||||
console.log(...this._formatter.flush());
|
console.log(...this._formatter.flush());
|
||||||
}
|
}
|
||||||
// tslint:enable no-console
|
// tslint:enable no-console
|
||||||
|
|
||||||
|
this.extenders.forEach((extender) => {
|
||||||
|
extender({
|
||||||
|
section: this.name,
|
||||||
|
fields: options.fields,
|
||||||
|
level: options.level,
|
||||||
|
message: options.message as string,
|
||||||
|
type: options.type,
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,16 +1,34 @@
|
|||||||
const path = require("path");
|
const path = require("path");
|
||||||
const merge = require("webpack-merge");
|
const merge = require("webpack-merge");
|
||||||
|
|
||||||
module.exports = merge(require(path.join(__dirname, "../../scripts", "webpack.general.config.js"))(), {
|
module.exports = [
|
||||||
devtool: "none",
|
merge(require(path.join(__dirname, "../../scripts", "webpack.general.config.js"))(), {
|
||||||
mode: "production",
|
devtool: "none",
|
||||||
target: "node",
|
mode: "production",
|
||||||
output: {
|
target: "node",
|
||||||
path: path.join(__dirname, "out"),
|
output: {
|
||||||
filename: "main.js",
|
path: path.join(__dirname, "out"),
|
||||||
libraryTarget: "commonjs",
|
filename: "main.js",
|
||||||
},
|
libraryTarget: "commonjs",
|
||||||
entry: [
|
},
|
||||||
"./packages/logger/src/index.ts"
|
entry: [
|
||||||
],
|
"./packages/logger/src/index.ts"
|
||||||
});
|
],
|
||||||
|
}),
|
||||||
|
merge(require(path.join(__dirname, "../../scripts", "webpack.general.config.js"))(), {
|
||||||
|
devtool: "none",
|
||||||
|
mode: "production",
|
||||||
|
target: "node",
|
||||||
|
output: {
|
||||||
|
path: path.join(__dirname, "out"),
|
||||||
|
filename: "extender.js",
|
||||||
|
libraryTarget: "commonjs",
|
||||||
|
},
|
||||||
|
externals: {
|
||||||
|
"@google-cloud/logging": "commonjs @google-cloud/logging",
|
||||||
|
},
|
||||||
|
entry: [
|
||||||
|
"./packages/logger/src/extender.ts"
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
];
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -33,8 +33,7 @@
|
|||||||
"@coder/(.*)/test": "<rootDir>/$1/test",
|
"@coder/(.*)/test": "<rootDir>/$1/test",
|
||||||
"@coder/(.*)": "<rootDir>/$1/src",
|
"@coder/(.*)": "<rootDir>/$1/src",
|
||||||
"vs/(.*)": "<rootDir>/../lib/vscode/src/vs/$1",
|
"vs/(.*)": "<rootDir>/../lib/vscode/src/vs/$1",
|
||||||
"vszip": "<rootDir>/../lib/vscode/src/vs/base/node/zip.ts",
|
"vszip": "<rootDir>/../lib/vscode/src/vs/base/node/zip.ts"
|
||||||
"^node-pty": "node-pty-prebuilt"
|
|
||||||
},
|
},
|
||||||
"transform": {
|
"transform": {
|
||||||
"^.+\\.tsx?$": "ts-jest"
|
"^.+\\.tsx?$": "ts-jest"
|
||||||
|
|||||||
47
packages/protocol/README.md
Normal file
47
packages/protocol/README.md
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# Protocol
|
||||||
|
|
||||||
|
This module provides a way for the browser to run Node modules like `fs`, `net`,
|
||||||
|
etc.
|
||||||
|
|
||||||
|
## Internals
|
||||||
|
|
||||||
|
### Server-side proxies
|
||||||
|
The server-side proxies are regular classes that call native Node functions. The
|
||||||
|
only thing special about them is that they must return promises and they must
|
||||||
|
return serializable values.
|
||||||
|
|
||||||
|
The only exception to the promise rule are event-related methods such as
|
||||||
|
`onEvent` and `onDone` (these are synchronous). The server will simply
|
||||||
|
immediately bind and push all events it can to the client. It doesn't wait for
|
||||||
|
the client to start listening. This prevents issues with the server not
|
||||||
|
receiving the client's request to start listening in time.
|
||||||
|
|
||||||
|
However, there is a way to specify events that should not bind immediately and
|
||||||
|
should wait for the client to request it, because some events (like `data` on a
|
||||||
|
stream) cannot be bound immediately (because doing so changes how the stream
|
||||||
|
behaves).
|
||||||
|
|
||||||
|
### Client-side proxies
|
||||||
|
Client-side proxies are `Proxy` instances. They simply make remote calls for any
|
||||||
|
method you call on it. The only exception is for events. Each client proxy has a
|
||||||
|
local emitter which it uses in place of a remote call (this allows the call to
|
||||||
|
be completed synchronously on the client). Then when an event is received from
|
||||||
|
the server, it gets emitted on that local emitter.
|
||||||
|
|
||||||
|
When an event is listened to, the proxy also notifies the server so it can start
|
||||||
|
listening in case it isn't already (see the `data` example above). This only
|
||||||
|
works for events that only fire after they are bound.
|
||||||
|
|
||||||
|
### Client-side fills
|
||||||
|
The client-side fills implement the Node API and make calls to the server-side
|
||||||
|
proxies using the client-side proxies.
|
||||||
|
|
||||||
|
When a proxy returns a proxy (for example `fs.createWriteStream`), that proxy is
|
||||||
|
a promise (since communicating with the server is asynchronous). We have to
|
||||||
|
return the fill from `fs.createWriteStream` synchronously, so that means the
|
||||||
|
fill has to contain a proxy promise. To eliminate the need for calling `then`
|
||||||
|
and to keep the code looking clean every time you use the proxy, the proxy is
|
||||||
|
itself wrapped in another proxy which just calls the method after a `then`. This
|
||||||
|
works since all the methods return promises (aside from the event methods, but
|
||||||
|
those are not used by the fills directly—they are only used internally to
|
||||||
|
forward events to the fill if it is an event emitter).
|
||||||
@@ -4,8 +4,6 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"express": "^4.16.4",
|
"express": "^4.16.4",
|
||||||
"google-protobuf": "^3.6.1",
|
"google-protobuf": "^3.6.1",
|
||||||
"node-pty-prebuilt": "^0.7.6",
|
|
||||||
"spdlog": "^0.7.2",
|
|
||||||
"trash": "^4.3.0",
|
"trash": "^4.3.0",
|
||||||
"ws": "^6.1.2"
|
"ws": "^6.1.2"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { promisify } from "util";
|
|||||||
import { Emitter } from "@coder/events";
|
import { Emitter } from "@coder/events";
|
||||||
import { logger, field } from "@coder/logger";
|
import { logger, field } from "@coder/logger";
|
||||||
import { ReadWriteConnection, InitData, SharedProcessData } from "../common/connection";
|
import { ReadWriteConnection, InitData, SharedProcessData } from "../common/connection";
|
||||||
import { Module, ServerProxy } from "../common/proxy";
|
import { ClientServerProxy, Module, ServerProxy } from "../common/proxy";
|
||||||
import { argumentToProto, protoToArgument, moduleToProto, protoToModule, protoToOperatingSystem } from "../common/util";
|
import { argumentToProto, protoToArgument, moduleToProto, protoToModule, protoToOperatingSystem } from "../common/util";
|
||||||
import { Argument, Ping, ServerMessage, ClientMessage, Method, Event, Callback } from "../proto";
|
import { Argument, Ping, ServerMessage, ClientMessage, Method, Event, Callback } from "../proto";
|
||||||
import { FsModule, ChildProcessModule, NetModule, NodePtyModule, SpdlogModule, TrashModule } from "./modules";
|
import { FsModule, ChildProcessModule, NetModule, NodePtyModule, SpdlogModule, TrashModule } from "./modules";
|
||||||
@@ -174,9 +174,10 @@ export class Client {
|
|||||||
* Make a remote call for a proxy's method using proto.
|
* Make a remote call for a proxy's method using proto.
|
||||||
*/
|
*/
|
||||||
private remoteCall(proxyId: number | Module, method: string, args: any[]): Promise<any> {
|
private remoteCall(proxyId: number | Module, method: string, args: any[]): Promise<any> {
|
||||||
if (this.disconnected && typeof proxyId === "number") {
|
if (typeof proxyId === "number" && (this.disconnected || !this.proxies.has(proxyId))) {
|
||||||
// Can assume killing or closing works because a disconnected proxy
|
// Can assume killing or closing works because a disconnected proxy is
|
||||||
// is disposed on the server's side.
|
// disposed on the server's side, and a non-existent proxy has already
|
||||||
|
// been disposed.
|
||||||
switch (method) {
|
switch (method) {
|
||||||
case "close":
|
case "close":
|
||||||
case "kill":
|
case "kill":
|
||||||
@@ -223,7 +224,11 @@ export class Client {
|
|||||||
field("method", method),
|
field("method", method),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
proxyMessage.setArgsList(args.map((a) => argumentToProto(a, storeCallback)));
|
proxyMessage.setArgsList(args.map((a) => argumentToProto<ClientServerProxy>(
|
||||||
|
a,
|
||||||
|
storeCallback,
|
||||||
|
(p) => p.proxyId,
|
||||||
|
)));
|
||||||
|
|
||||||
const clientMessage = new ClientMessage();
|
const clientMessage = new ClientMessage();
|
||||||
clientMessage.setMethod(message);
|
clientMessage.setMethod(message);
|
||||||
@@ -273,6 +278,8 @@ export class Client {
|
|||||||
shell: init.getShell(),
|
shell: init.getShell(),
|
||||||
extensionsDirectory: init.getExtensionsDirectory(),
|
extensionsDirectory: init.getExtensionsDirectory(),
|
||||||
builtInExtensionsDirectory: init.getBuiltinExtensionsDir(),
|
builtInExtensionsDirectory: init.getBuiltinExtensionsDir(),
|
||||||
|
extraExtensionDirectories: init.getExtraExtensionDirectoriesList(),
|
||||||
|
extraBuiltinExtensionDirectories: init.getExtraBuiltinExtensionDirectoriesList(),
|
||||||
};
|
};
|
||||||
this.initDataEmitter.emit(this._initData);
|
this.initDataEmitter.emit(this._initData);
|
||||||
break;
|
break;
|
||||||
@@ -428,7 +435,7 @@ export class Client {
|
|||||||
/**
|
/**
|
||||||
* Return a proxy that makes remote calls.
|
* Return a proxy that makes remote calls.
|
||||||
*/
|
*/
|
||||||
private createProxy<T>(proxyId: number | Module, promise: Promise<any> = Promise.resolve()): T {
|
private createProxy<T extends ClientServerProxy>(proxyId: number | Module, promise: Promise<any> = Promise.resolve()): T {
|
||||||
logger.trace(() => [
|
logger.trace(() => [
|
||||||
"creating proxy",
|
"creating proxy",
|
||||||
field("proxyId", proxyId),
|
field("proxyId", proxyId),
|
||||||
@@ -448,7 +455,7 @@ export class Client {
|
|||||||
cb(event.event, ...event.args);
|
cb(event.event, ...event.args);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
}, {
|
} as ClientServerProxy, {
|
||||||
get: (target: any, name: string): any => {
|
get: (target: any, name: string): any => {
|
||||||
// When resolving a promise with a proxy, it will check for "then".
|
// When resolving a promise with a proxy, it will check for "then".
|
||||||
if (name === "then") {
|
if (name === "then") {
|
||||||
|
|||||||
@@ -2,13 +2,22 @@ import * as cp from "child_process";
|
|||||||
import * as net from "net";
|
import * as net from "net";
|
||||||
import * as stream from "stream";
|
import * as stream from "stream";
|
||||||
import { callbackify } from "util";
|
import { callbackify } from "util";
|
||||||
import { ClientProxy } from "../../common/proxy";
|
import { ClientProxy, ClientServerProxy } from "../../common/proxy";
|
||||||
import { ChildProcessModuleProxy, ChildProcessProxy, ChildProcessProxies } from "../../node/modules/child_process";
|
import { ChildProcessModuleProxy, ChildProcessProxy } from "../../node/modules/child_process";
|
||||||
import { Readable, Writable } from "./stream";
|
import { ClientWritableProxy, ClientReadableProxy, Readable, Writable } from "./stream";
|
||||||
|
|
||||||
// tslint:disable completed-docs
|
// tslint:disable completed-docs
|
||||||
|
|
||||||
export class ChildProcess extends ClientProxy<ChildProcessProxy> implements cp.ChildProcess {
|
export interface ClientChildProcessProxy extends ChildProcessProxy, ClientServerProxy<cp.ChildProcess> {}
|
||||||
|
|
||||||
|
export interface ClientChildProcessProxies {
|
||||||
|
childProcess: ClientChildProcessProxy;
|
||||||
|
stdin?: ClientWritableProxy | null;
|
||||||
|
stdout?: ClientReadableProxy | null;
|
||||||
|
stderr?: ClientReadableProxy | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ChildProcess extends ClientProxy<ClientChildProcessProxy> implements cp.ChildProcess {
|
||||||
public readonly stdin: stream.Writable;
|
public readonly stdin: stream.Writable;
|
||||||
public readonly stdout: stream.Readable;
|
public readonly stdout: stream.Readable;
|
||||||
public readonly stderr: stream.Readable;
|
public readonly stderr: stream.Readable;
|
||||||
@@ -18,7 +27,7 @@ export class ChildProcess extends ClientProxy<ChildProcessProxy> implements cp.C
|
|||||||
private _killed: boolean = false;
|
private _killed: boolean = false;
|
||||||
private _pid = -1;
|
private _pid = -1;
|
||||||
|
|
||||||
public constructor(proxyPromises: Promise<ChildProcessProxies>) {
|
public constructor(proxyPromises: Promise<ClientChildProcessProxies>) {
|
||||||
super(proxyPromises.then((p) => p.childProcess));
|
super(proxyPromises.then((p) => p.childProcess));
|
||||||
this.stdin = new Writable(proxyPromises.then((p) => p.stdin!));
|
this.stdin = new Writable(proxyPromises.then((p) => p.stdin!));
|
||||||
this.stdout = new Readable(proxyPromises.then((p) => p.stdout!));
|
this.stdout = new Readable(proxyPromises.then((p) => p.stdout!));
|
||||||
@@ -99,8 +108,14 @@ export class ChildProcess extends ClientProxy<ChildProcessProxy> implements cp.C
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ClientChildProcessModuleProxy extends ChildProcessModuleProxy, ClientServerProxy {
|
||||||
|
exec(command: string, options?: { encoding?: string | null } & cp.ExecOptions | null, callback?: ((error: cp.ExecException | null, stdin: string | Buffer, stdout: string | Buffer) => void)): Promise<ClientChildProcessProxies>;
|
||||||
|
fork(modulePath: string, args?: string[], options?: cp.ForkOptions): Promise<ClientChildProcessProxies>;
|
||||||
|
spawn(command: string, args?: string[], options?: cp.SpawnOptions): Promise<ClientChildProcessProxies>;
|
||||||
|
}
|
||||||
|
|
||||||
export class ChildProcessModule {
|
export class ChildProcessModule {
|
||||||
public constructor(private readonly proxy: ChildProcessModuleProxy) {}
|
public constructor(private readonly proxy: ClientChildProcessModuleProxy) {}
|
||||||
|
|
||||||
public exec = (
|
public exec = (
|
||||||
command: string,
|
command: string,
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { callbackify } from "util";
|
import { callbackify } from "util";
|
||||||
import { ClientProxy, Batch } from "../../common/proxy";
|
import { Batch, ClientProxy, ClientServerProxy } from "../../common/proxy";
|
||||||
import { IEncodingOptions, IEncodingOptionsCallback } from "../../common/util";
|
import { IEncodingOptions, IEncodingOptionsCallback } from "../../common/util";
|
||||||
import { FsModuleProxy, Stats as IStats, WatcherProxy, WriteStreamProxy } from "../../node/modules/fs";
|
import { FsModuleProxy, ReadStreamProxy, Stats as IStats, WatcherProxy, WriteStreamProxy } from "../../node/modules/fs";
|
||||||
import { Writable } from "./stream";
|
import { Readable, Writable } from "./stream";
|
||||||
|
|
||||||
// tslint:disable no-any
|
// tslint:disable completed-docs no-any
|
||||||
// tslint:disable completed-docs
|
|
||||||
|
|
||||||
class StatBatch extends Batch<IStats, { path: fs.PathLike }> {
|
class StatBatch extends Batch<IStats, { path: fs.PathLike }> {
|
||||||
public constructor(private readonly proxy: FsModuleProxy) {
|
public constructor(private readonly proxy: FsModuleProxy) {
|
||||||
@@ -38,7 +37,9 @@ class ReaddirBatch extends Batch<Buffer[] | fs.Dirent[] | string[], { path: fs.P
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Watcher extends ClientProxy<WatcherProxy> implements fs.FSWatcher {
|
interface ClientWatcherProxy extends WatcherProxy, ClientServerProxy<fs.FSWatcher> {}
|
||||||
|
|
||||||
|
class Watcher extends ClientProxy<ClientWatcherProxy> implements fs.FSWatcher {
|
||||||
public close(): void {
|
public close(): void {
|
||||||
this.catch(this.proxy.close());
|
this.catch(this.proxy.close());
|
||||||
}
|
}
|
||||||
@@ -48,7 +49,25 @@ class Watcher extends ClientProxy<WatcherProxy> implements fs.FSWatcher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class WriteStream extends Writable<WriteStreamProxy> implements fs.WriteStream {
|
interface ClientReadStreamProxy extends ReadStreamProxy, ClientServerProxy<fs.ReadStream> {}
|
||||||
|
|
||||||
|
class ReadStream extends Readable<ClientReadStreamProxy> implements fs.ReadStream {
|
||||||
|
public get bytesRead(): number {
|
||||||
|
throw new Error("not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public get path(): string | Buffer {
|
||||||
|
throw new Error("not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public close(): void {
|
||||||
|
this.catch(this.proxy.close());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ClientWriteStreamProxy extends WriteStreamProxy, ClientServerProxy<fs.WriteStream> {}
|
||||||
|
|
||||||
|
class WriteStream extends Writable<ClientWriteStreamProxy> implements fs.WriteStream {
|
||||||
public get bytesWritten(): number {
|
public get bytesWritten(): number {
|
||||||
throw new Error("not implemented");
|
throw new Error("not implemented");
|
||||||
}
|
}
|
||||||
@@ -62,12 +81,18 @@ class WriteStream extends Writable<WriteStreamProxy> implements fs.WriteStream {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ClientFsModuleProxy extends FsModuleProxy, ClientServerProxy {
|
||||||
|
createReadStream(path: fs.PathLike, options?: any): Promise<ClientReadStreamProxy>;
|
||||||
|
createWriteStream(path: fs.PathLike, options?: any): Promise<ClientWriteStreamProxy>;
|
||||||
|
watch(filename: fs.PathLike, options?: IEncodingOptions): Promise<ClientWatcherProxy>;
|
||||||
|
}
|
||||||
|
|
||||||
export class FsModule {
|
export class FsModule {
|
||||||
private readonly statBatch: StatBatch;
|
private readonly statBatch: StatBatch;
|
||||||
private readonly lstatBatch: LstatBatch;
|
private readonly lstatBatch: LstatBatch;
|
||||||
private readonly readdirBatch: ReaddirBatch;
|
private readonly readdirBatch: ReaddirBatch;
|
||||||
|
|
||||||
public constructor(private readonly proxy: FsModuleProxy) {
|
public constructor(private readonly proxy: ClientFsModuleProxy) {
|
||||||
this.statBatch = new StatBatch(this.proxy);
|
this.statBatch = new StatBatch(this.proxy);
|
||||||
this.lstatBatch = new LstatBatch(this.proxy);
|
this.lstatBatch = new LstatBatch(this.proxy);
|
||||||
this.readdirBatch = new ReaddirBatch(this.proxy);
|
this.readdirBatch = new ReaddirBatch(this.proxy);
|
||||||
@@ -110,6 +135,10 @@ export class FsModule {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public createReadStream = (path: fs.PathLike, options?: any): fs.ReadStream => {
|
||||||
|
return new ReadStream(this.proxy.createReadStream(path, options));
|
||||||
|
}
|
||||||
|
|
||||||
public createWriteStream = (path: fs.PathLike, options?: any): fs.WriteStream => {
|
public createWriteStream = (path: fs.PathLike, options?: any): fs.WriteStream => {
|
||||||
return new WriteStream(this.proxy.createWriteStream(path, options));
|
return new WriteStream(this.proxy.createWriteStream(path, options));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,18 @@
|
|||||||
import * as net from "net";
|
import * as net from "net";
|
||||||
import { callbackify } from "util";
|
import { callbackify } from "util";
|
||||||
import { ClientProxy } from "../../common/proxy";
|
import { ClientProxy, ClientServerProxy } from "../../common/proxy";
|
||||||
import { NetModuleProxy, NetServerProxy, NetSocketProxy } from "../../node/modules/net";
|
import { NetModuleProxy, NetServerProxy, NetSocketProxy } from "../../node/modules/net";
|
||||||
import { Duplex } from "./stream";
|
import { Duplex } from "./stream";
|
||||||
|
|
||||||
// tslint:disable completed-docs
|
// tslint:disable completed-docs
|
||||||
|
|
||||||
export class Socket extends Duplex<NetSocketProxy> implements net.Socket {
|
interface ClientNetSocketProxy extends NetSocketProxy, ClientServerProxy<net.Socket> {}
|
||||||
|
|
||||||
|
export class Socket extends Duplex<ClientNetSocketProxy> implements net.Socket {
|
||||||
private _connecting: boolean = false;
|
private _connecting: boolean = false;
|
||||||
private _destroyed: boolean = false;
|
private _destroyed: boolean = false;
|
||||||
|
|
||||||
public constructor(proxyPromise: Promise<NetSocketProxy> | NetSocketProxy, connecting?: boolean) {
|
public constructor(proxyPromise: Promise<ClientNetSocketProxy> | ClientNetSocketProxy, connecting?: boolean) {
|
||||||
super(proxyPromise);
|
super(proxyPromise);
|
||||||
if (connecting) {
|
if (connecting) {
|
||||||
this._connecting = connecting;
|
this._connecting = connecting;
|
||||||
@@ -126,12 +128,16 @@ export class Socket extends Duplex<NetSocketProxy> implements net.Socket {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Server extends ClientProxy<NetServerProxy> implements net.Server {
|
interface ClientNetServerProxy extends NetServerProxy, ClientServerProxy<net.Server> {
|
||||||
|
onConnection(cb: (proxy: ClientNetSocketProxy) => void): Promise<void>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Server extends ClientProxy<ClientNetServerProxy> implements net.Server {
|
||||||
private socketId = 0;
|
private socketId = 0;
|
||||||
private readonly sockets = new Map<number, net.Socket>();
|
private readonly sockets = new Map<number, net.Socket>();
|
||||||
private _listening: boolean = false;
|
private _listening: boolean = false;
|
||||||
|
|
||||||
public constructor(proxyPromise: Promise<NetServerProxy> | NetServerProxy) {
|
public constructor(proxyPromise: Promise<ClientNetServerProxy> | ClientNetServerProxy) {
|
||||||
super(proxyPromise);
|
super(proxyPromise);
|
||||||
|
|
||||||
this.catch(this.proxy.onConnection((socketProxy) => {
|
this.catch(this.proxy.onConnection((socketProxy) => {
|
||||||
@@ -208,11 +214,17 @@ export class Server extends ClientProxy<NetServerProxy> implements net.Server {
|
|||||||
|
|
||||||
type NodeNet = typeof net;
|
type NodeNet = typeof net;
|
||||||
|
|
||||||
|
interface ClientNetModuleProxy extends NetModuleProxy, ClientServerProxy {
|
||||||
|
createSocket(options?: net.SocketConstructorOpts): Promise<ClientNetSocketProxy>;
|
||||||
|
createConnection(target: string | number | net.NetConnectOpts, host?: string): Promise<ClientNetSocketProxy>;
|
||||||
|
createServer(options?: { allowHalfOpen?: boolean, pauseOnConnect?: boolean }): Promise<ClientNetServerProxy>;
|
||||||
|
}
|
||||||
|
|
||||||
export class NetModule implements NodeNet {
|
export class NetModule implements NodeNet {
|
||||||
public readonly Socket: typeof net.Socket;
|
public readonly Socket: typeof net.Socket;
|
||||||
public readonly Server: typeof net.Server;
|
public readonly Server: typeof net.Server;
|
||||||
|
|
||||||
public constructor(private readonly proxy: NetModuleProxy) {
|
public constructor(private readonly proxy: ClientNetModuleProxy) {
|
||||||
// @ts-ignore this is because Socket is missing things from the Stream
|
// @ts-ignore this is because Socket is missing things from the Stream
|
||||||
// namespace but I'm unsure how best to provide them (finished,
|
// namespace but I'm unsure how best to provide them (finished,
|
||||||
// finished.__promisify__, pipeline, and some others) or if it even matters.
|
// finished.__promisify__, pipeline, and some others) or if it even matters.
|
||||||
|
|||||||
@@ -1,15 +1,19 @@
|
|||||||
import * as pty from "node-pty";
|
import * as pty from "node-pty";
|
||||||
import { ClientProxy } from "../../common/proxy";
|
import { ClientProxy, ClientServerProxy } from "../../common/proxy";
|
||||||
import { NodePtyModuleProxy, NodePtyProcessProxy } from "../../node/modules/node-pty";
|
import { NodePtyModuleProxy, NodePtyProcessProxy } from "../../node/modules/node-pty";
|
||||||
|
|
||||||
// tslint:disable completed-docs
|
// tslint:disable completed-docs
|
||||||
|
|
||||||
export class NodePtyProcess extends ClientProxy<NodePtyProcessProxy> implements pty.IPty {
|
interface ClientNodePtyProcessProxy extends NodePtyProcessProxy, ClientServerProxy {}
|
||||||
|
|
||||||
|
export class NodePtyProcess extends ClientProxy<ClientNodePtyProcessProxy> implements pty.IPty {
|
||||||
private _pid = -1;
|
private _pid = -1;
|
||||||
private _process = "";
|
private _process = "";
|
||||||
|
private lastCols: number | undefined;
|
||||||
|
private lastRows: number | undefined;
|
||||||
|
|
||||||
public constructor(
|
public constructor(
|
||||||
private readonly moduleProxy: NodePtyModuleProxy,
|
private readonly moduleProxy: ClientNodePtyModuleProxy,
|
||||||
private readonly file: string,
|
private readonly file: string,
|
||||||
private readonly args: string[] | string,
|
private readonly args: string[] | string,
|
||||||
private readonly options: pty.IPtyForkOptions,
|
private readonly options: pty.IPtyForkOptions,
|
||||||
@@ -18,10 +22,12 @@ export class NodePtyProcess extends ClientProxy<NodePtyProcessProxy> implements
|
|||||||
this.on("process", (process) => this._process = process);
|
this.on("process", (process) => this._process = process);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected initialize(proxyPromise: Promise<NodePtyProcessProxy>): void {
|
protected initialize(proxyPromise: Promise<ClientNodePtyProcessProxy>): ClientNodePtyProcessProxy {
|
||||||
super.initialize(proxyPromise);
|
const proxy = super.initialize(proxyPromise);
|
||||||
this.catch(this.proxy.getPid().then((p) => this._pid = p));
|
this.catch(this.proxy.getPid().then((p) => this._pid = p));
|
||||||
this.catch(this.proxy.getProcess().then((p) => this._process = p));
|
this.catch(this.proxy.getProcess().then((p) => this._process = p));
|
||||||
|
|
||||||
|
return proxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public get pid(): number {
|
public get pid(): number {
|
||||||
@@ -33,6 +39,9 @@ export class NodePtyProcess extends ClientProxy<NodePtyProcessProxy> implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
public resize(columns: number, rows: number): void {
|
public resize(columns: number, rows: number): void {
|
||||||
|
this.lastCols = columns;
|
||||||
|
this.lastRows = rows;
|
||||||
|
|
||||||
this.catch(this.proxy.resize(columns, rows));
|
this.catch(this.proxy.resize(columns, rows));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,14 +56,22 @@ export class NodePtyProcess extends ClientProxy<NodePtyProcessProxy> implements
|
|||||||
protected handleDisconnect(): void {
|
protected handleDisconnect(): void {
|
||||||
this._process += " (disconnected)";
|
this._process += " (disconnected)";
|
||||||
this.emit("data", "\r\n\nLost connection...\r\n\n");
|
this.emit("data", "\r\n\nLost connection...\r\n\n");
|
||||||
this.initialize(this.moduleProxy.spawn(this.file, this.args, this.options));
|
this.initialize(this.moduleProxy.spawn(this.file, this.args, {
|
||||||
|
...this.options,
|
||||||
|
cols: this.lastCols || this.options.cols,
|
||||||
|
rows: this.lastRows || this.options.rows,
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type NodePty = typeof pty;
|
type NodePty = typeof pty;
|
||||||
|
|
||||||
|
interface ClientNodePtyModuleProxy extends NodePtyModuleProxy, ClientServerProxy {
|
||||||
|
spawn(file: string, args: string[] | string, options: pty.IPtyForkOptions): Promise<ClientNodePtyProcessProxy>;
|
||||||
|
}
|
||||||
|
|
||||||
export class NodePtyModule implements NodePty {
|
export class NodePtyModule implements NodePty {
|
||||||
public constructor(private readonly proxy: NodePtyModuleProxy) {}
|
public constructor(private readonly proxy: ClientNodePtyModuleProxy) {}
|
||||||
|
|
||||||
public spawn = (file: string, args: string[] | string, options: pty.IPtyForkOptions): pty.IPty => {
|
public spawn = (file: string, args: string[] | string, options: pty.IPtyForkOptions): pty.IPty => {
|
||||||
return new NodePtyProcess(this.proxy, file, args, options);
|
return new NodePtyProcess(this.proxy, file, args, options);
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
import * as spdlog from "spdlog";
|
import * as spdlog from "spdlog";
|
||||||
import { ClientProxy } from "../../common/proxy";
|
import { ClientProxy, ClientServerProxy } from "../../common/proxy";
|
||||||
import { RotatingLoggerProxy, SpdlogModuleProxy } from "../../node/modules/spdlog";
|
import { RotatingLoggerProxy, SpdlogModuleProxy } from "../../node/modules/spdlog";
|
||||||
|
|
||||||
// tslint:disable completed-docs
|
// tslint:disable completed-docs
|
||||||
|
|
||||||
class RotatingLogger extends ClientProxy<RotatingLoggerProxy> implements spdlog.RotatingLogger {
|
interface ClientRotatingLoggerProxy extends RotatingLoggerProxy, ClientServerProxy {}
|
||||||
|
|
||||||
|
class RotatingLogger extends ClientProxy<ClientRotatingLoggerProxy> implements spdlog.RotatingLogger {
|
||||||
public constructor(
|
public constructor(
|
||||||
private readonly moduleProxy: SpdlogModuleProxy,
|
private readonly moduleProxy: ClientSpdlogModuleProxy,
|
||||||
private readonly name: string,
|
private readonly name: string,
|
||||||
private readonly filename: string,
|
private readonly filename: string,
|
||||||
private readonly filesize: number,
|
private readonly filesize: number,
|
||||||
@@ -31,10 +33,14 @@ class RotatingLogger extends ClientProxy<RotatingLoggerProxy> implements spdlog.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ClientSpdlogModuleProxy extends SpdlogModuleProxy, ClientServerProxy {
|
||||||
|
createLogger(name: string, filePath: string, fileSize: number, fileCount: number): Promise<ClientRotatingLoggerProxy>;
|
||||||
|
}
|
||||||
|
|
||||||
export class SpdlogModule {
|
export class SpdlogModule {
|
||||||
public readonly RotatingLogger: typeof spdlog.RotatingLogger;
|
public readonly RotatingLogger: typeof spdlog.RotatingLogger;
|
||||||
|
|
||||||
public constructor(private readonly proxy: SpdlogModuleProxy) {
|
public constructor(private readonly proxy: ClientSpdlogModuleProxy) {
|
||||||
this.RotatingLogger = class extends RotatingLogger {
|
this.RotatingLogger = class extends RotatingLogger {
|
||||||
public constructor(name: string, filename: string, filesize: number, filecount: number) {
|
public constructor(name: string, filename: string, filesize: number, filecount: number) {
|
||||||
super(proxy, name, filename, filesize, filecount);
|
super(proxy, name, filename, filesize, filecount);
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
import * as stream from "stream";
|
import * as stream from "stream";
|
||||||
import { callbackify } from "util";
|
import { callbackify } from "util";
|
||||||
import { ClientProxy } from "../../common/proxy";
|
import { ClientProxy, ClientServerProxy } from "../../common/proxy";
|
||||||
import { DuplexProxy, IReadableProxy, WritableProxy } from "../../node/modules/stream";
|
import { isPromise } from "../../common/util";
|
||||||
|
import { DuplexProxy, ReadableProxy, WritableProxy } from "../../node/modules/stream";
|
||||||
|
|
||||||
// tslint:disable completed-docs
|
// tslint:disable completed-docs no-any
|
||||||
|
|
||||||
export class Writable<T extends WritableProxy = WritableProxy> extends ClientProxy<T> implements stream.Writable {
|
export interface ClientWritableProxy extends WritableProxy, ClientServerProxy<stream.Writable> {}
|
||||||
|
|
||||||
|
export class Writable<T extends ClientWritableProxy = ClientWritableProxy> extends ClientProxy<T> implements stream.Writable {
|
||||||
public get writable(): boolean {
|
public get writable(): boolean {
|
||||||
throw new Error("not implemented");
|
throw new Error("not implemented");
|
||||||
}
|
}
|
||||||
@@ -50,7 +53,6 @@ export class Writable<T extends WritableProxy = WritableProxy> extends ClientPro
|
|||||||
return this.catch(this.proxy.setDefaultEncoding(encoding));
|
return this.catch(this.proxy.setDefaultEncoding(encoding));
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public write(chunk: any, encoding?: string | ((error?: Error | null) => void), callback?: (error?: Error | null) => void): boolean {
|
public write(chunk: any, encoding?: string | ((error?: Error | null) => void), callback?: (error?: Error | null) => void): boolean {
|
||||||
if (typeof encoding === "function") {
|
if (typeof encoding === "function") {
|
||||||
callback = encoding;
|
callback = encoding;
|
||||||
@@ -65,7 +67,6 @@ export class Writable<T extends WritableProxy = WritableProxy> extends ClientPro
|
|||||||
return true; // Always true since we can't get this synchronously.
|
return true; // Always true since we can't get this synchronously.
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public end(data?: any | (() => void), encoding?: string | (() => void), callback?: (() => void)): void {
|
public end(data?: any | (() => void), encoding?: string | (() => void), callback?: (() => void)): void {
|
||||||
if (typeof data === "function") {
|
if (typeof data === "function") {
|
||||||
callback = data;
|
callback = data;
|
||||||
@@ -88,7 +89,9 @@ export class Writable<T extends WritableProxy = WritableProxy> extends ClientPro
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Readable<T extends IReadableProxy = IReadableProxy> extends ClientProxy<T> implements stream.Readable {
|
export interface ClientReadableProxy extends ReadableProxy, ClientServerProxy<stream.Readable> {}
|
||||||
|
|
||||||
|
export class Readable<T extends ClientReadableProxy = ClientReadableProxy> extends ClientProxy<T> implements stream.Readable {
|
||||||
public get readable(): boolean {
|
public get readable(): boolean {
|
||||||
throw new Error("not implemented");
|
throw new Error("not implemented");
|
||||||
}
|
}
|
||||||
@@ -141,11 +144,20 @@ export class Readable<T extends IReadableProxy = IReadableProxy> extends ClientP
|
|||||||
throw new Error("not implemented");
|
throw new Error("not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
public pipe<T>(): T {
|
public pipe<P extends NodeJS.WritableStream>(destination: P, options?: { end?: boolean }): P {
|
||||||
throw new Error("not implemented");
|
const writableProxy = (destination as any as Writable).proxyPromise;
|
||||||
|
if (!writableProxy) {
|
||||||
|
throw new Error("can only pipe stream proxies");
|
||||||
|
}
|
||||||
|
this.catch(
|
||||||
|
isPromise(writableProxy)
|
||||||
|
? writableProxy.then((p) => this.proxy.pipe(p, options))
|
||||||
|
: this.proxy.pipe(writableProxy, options),
|
||||||
|
);
|
||||||
|
|
||||||
|
return destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public [Symbol.asyncIterator](): AsyncIterableIterator<any> {
|
public [Symbol.asyncIterator](): AsyncIterableIterator<any> {
|
||||||
throw new Error("not implemented");
|
throw new Error("not implemented");
|
||||||
}
|
}
|
||||||
@@ -164,7 +176,9 @@ export class Readable<T extends IReadableProxy = IReadableProxy> extends ClientP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Duplex<T extends DuplexProxy = DuplexProxy> extends Writable<T> implements stream.Duplex, stream.Readable {
|
export interface ClientDuplexProxy extends DuplexProxy, ClientServerProxy<stream.Duplex> {}
|
||||||
|
|
||||||
|
export class Duplex<T extends ClientDuplexProxy = ClientDuplexProxy> extends Writable<T> implements stream.Duplex, stream.Readable {
|
||||||
private readonly _readable: Readable;
|
private readonly _readable: Readable;
|
||||||
|
|
||||||
public constructor(proxyPromise: Promise<T> | T) {
|
public constructor(proxyPromise: Promise<T> | T) {
|
||||||
@@ -228,7 +242,6 @@ export class Duplex<T extends DuplexProxy = DuplexProxy> extends Writable<T> imp
|
|||||||
this._readable.unshift();
|
this._readable.unshift();
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public [Symbol.asyncIterator](): AsyncIterableIterator<any> {
|
public [Symbol.asyncIterator](): AsyncIterableIterator<any> {
|
||||||
return this._readable[Symbol.asyncIterator]();
|
return this._readable[Symbol.asyncIterator]();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
import * as trash from "trash";
|
import * as trash from "trash";
|
||||||
|
import { ClientServerProxy } from "../../common/proxy";
|
||||||
import { TrashModuleProxy } from "../../node/modules/trash";
|
import { TrashModuleProxy } from "../../node/modules/trash";
|
||||||
|
|
||||||
// tslint:disable completed-docs
|
// tslint:disable completed-docs
|
||||||
|
|
||||||
|
interface ClientTrashModuleProxy extends TrashModuleProxy, ClientServerProxy {}
|
||||||
|
|
||||||
export class TrashModule {
|
export class TrashModule {
|
||||||
public constructor(private readonly proxy: TrashModuleProxy) {}
|
public constructor(private readonly proxy: ClientTrashModuleProxy) {}
|
||||||
|
|
||||||
public trash = (path: string, options?: trash.Options): Promise<void> => {
|
public trash = (path: string, options?: trash.Options): Promise<void> => {
|
||||||
return this.proxy.trash(path, options);
|
return this.proxy.trash(path, options);
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ export interface InitData {
|
|||||||
readonly shell: string;
|
readonly shell: string;
|
||||||
readonly extensionsDirectory: string;
|
readonly extensionsDirectory: string;
|
||||||
readonly builtInExtensionsDirectory: string;
|
readonly builtInExtensionsDirectory: string;
|
||||||
|
readonly extraExtensionDirectories: string[];
|
||||||
|
readonly extraBuiltinExtensionDirectories: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SharedProcessData {
|
export interface SharedProcessData {
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { EventEmitter } from "events";
|
import { EventEmitter } from "events";
|
||||||
import { isPromise } from "./util";
|
import { isPromise, EventCallback } from "./util";
|
||||||
|
|
||||||
// tslint:disable no-any
|
// tslint:disable no-any
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allow using a proxy like it's returned synchronously. This only works because
|
* Allow using a proxy like it's returned synchronously. This only works because
|
||||||
* all proxy methods return promises.
|
* all proxy methods must return promises.
|
||||||
*/
|
*/
|
||||||
const unpromisify = <T extends ServerProxy>(proxyPromise: Promise<T>): T => {
|
const unpromisify = <T extends ClientServerProxy>(proxyPromise: Promise<T>): T => {
|
||||||
return new Proxy({}, {
|
return new Proxy({}, {
|
||||||
get: (target: any, name: string): any => {
|
get: (target: any, name: string): any => {
|
||||||
if (typeof target[name] === "undefined") {
|
if (typeof target[name] === "undefined") {
|
||||||
@@ -24,23 +24,23 @@ const unpromisify = <T extends ServerProxy>(proxyPromise: Promise<T>): T => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Client-side emitter that just forwards proxy events to its own emitter.
|
* Client-side emitter that just forwards server proxy events to its own
|
||||||
* It also turns a promisified proxy into a non-promisified proxy so we don't
|
* emitter. It also turns a promisified server proxy into a non-promisified
|
||||||
* need a bunch of `then` calls everywhere.
|
* proxy so we don't need a bunch of `then` calls everywhere.
|
||||||
*/
|
*/
|
||||||
export abstract class ClientProxy<T extends ServerProxy> extends EventEmitter {
|
export abstract class ClientProxy<T extends ClientServerProxy> extends EventEmitter {
|
||||||
private _proxy: T | undefined;
|
private _proxy: T;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* You can specify not to bind events in order to avoid emitting twice for
|
* You can specify not to bind events in order to avoid emitting twice for
|
||||||
* duplex streams.
|
* duplex streams.
|
||||||
*/
|
*/
|
||||||
public constructor(
|
public constructor(
|
||||||
proxyPromise: Promise<T> | T,
|
private _proxyPromise: Promise<T> | T,
|
||||||
private readonly bindEvents: boolean = true,
|
private readonly bindEvents: boolean = true,
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
this.initialize(proxyPromise);
|
this._proxy = this.initialize(this._proxyPromise);
|
||||||
if (this.bindEvents) {
|
if (this.bindEvents) {
|
||||||
this.on("disconnected", (error) => {
|
this.on("disconnected", (error) => {
|
||||||
try {
|
try {
|
||||||
@@ -64,11 +64,34 @@ export abstract class ClientProxy<T extends ServerProxy> extends EventEmitter {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected get proxy(): T {
|
/**
|
||||||
if (!this._proxy) {
|
* Bind the event locally and ensure the event is bound on the server.
|
||||||
throw new Error("not initialized");
|
*/
|
||||||
}
|
public addListener(event: string, listener: (...args: any[]) => void): this {
|
||||||
|
this.catch(this.proxy.bindDelayedEvent(event));
|
||||||
|
|
||||||
|
return super.on(event, listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alias for `addListener`.
|
||||||
|
*/
|
||||||
|
public on(event: string, listener: (...args: any[]) => void): this {
|
||||||
|
return this.addListener(event, listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Original promise for the server proxy. Can be used to be passed as an
|
||||||
|
* argument.
|
||||||
|
*/
|
||||||
|
public get proxyPromise(): Promise<T> | T {
|
||||||
|
return this._proxyPromise;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Server proxy.
|
||||||
|
*/
|
||||||
|
protected get proxy(): T {
|
||||||
return this._proxy;
|
return this._proxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,13 +99,18 @@ export abstract class ClientProxy<T extends ServerProxy> extends EventEmitter {
|
|||||||
* Initialize the proxy by unpromisifying if necessary and binding to its
|
* Initialize the proxy by unpromisifying if necessary and binding to its
|
||||||
* events.
|
* events.
|
||||||
*/
|
*/
|
||||||
protected initialize(proxyPromise: Promise<T> | T): void {
|
protected initialize(proxyPromise: Promise<T> | T): T {
|
||||||
this._proxy = isPromise(proxyPromise) ? unpromisify(proxyPromise) : proxyPromise;
|
this._proxyPromise = proxyPromise;
|
||||||
|
this._proxy = isPromise(this._proxyPromise)
|
||||||
|
? unpromisify(this._proxyPromise)
|
||||||
|
: this._proxyPromise;
|
||||||
if (this.bindEvents) {
|
if (this.bindEvents) {
|
||||||
this.catch(this.proxy.onEvent((event, ...args): void => {
|
this.proxy.onEvent((event, ...args): void => {
|
||||||
this.emit(event, ...args);
|
this.emit(event, ...args);
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return this._proxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -102,34 +130,107 @@ export abstract class ClientProxy<T extends ServerProxy> extends EventEmitter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ServerProxyOptions<T> {
|
||||||
|
/**
|
||||||
|
* The events to bind immediately.
|
||||||
|
*/
|
||||||
|
bindEvents: string[];
|
||||||
|
/**
|
||||||
|
* Events that signal the proxy is done.
|
||||||
|
*/
|
||||||
|
doneEvents: string[];
|
||||||
|
/**
|
||||||
|
* Events that should only be bound when asked
|
||||||
|
*/
|
||||||
|
delayedEvents?: string[];
|
||||||
|
/**
|
||||||
|
* Whatever is emitting events (stream, child process, etc).
|
||||||
|
*/
|
||||||
|
instance: T;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Proxy to the actual instance on the server. Every method must only accept
|
* The actual proxy instance on the server. Every method must only accept
|
||||||
* serializable arguments and must return promises with serializable values. If
|
* serializable arguments and must return promises with serializable values.
|
||||||
* a proxy itself has proxies on creation (like how ChildProcess has stdin),
|
*
|
||||||
|
* If a proxy itself has proxies on creation (like how ChildProcess has stdin),
|
||||||
* then it should return all of those at once, otherwise you will miss events
|
* then it should return all of those at once, otherwise you will miss events
|
||||||
* from those child proxies and fail to dispose them properly.
|
* from those child proxies and fail to dispose them properly.
|
||||||
|
*
|
||||||
|
* Events listeners are added client-side (since all events automatically
|
||||||
|
* forward to the client), so onDone and onEvent do not need to be asynchronous.
|
||||||
*/
|
*/
|
||||||
export interface ServerProxy {
|
export abstract class ServerProxy<T extends EventEmitter = EventEmitter> {
|
||||||
|
public readonly instance: T;
|
||||||
|
|
||||||
|
private readonly callbacks = <EventCallback[]>[];
|
||||||
|
|
||||||
|
public constructor(private readonly options: ServerProxyOptions<T>) {
|
||||||
|
this.instance = options.instance;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dispose the proxy.
|
* Dispose the proxy.
|
||||||
*/
|
*/
|
||||||
dispose(): Promise<void>;
|
public async dispose(): Promise<void> {
|
||||||
|
this.instance.removeAllListeners();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is used instead of an event to force it to be implemented since there
|
* This is used instead of an event to force it to be implemented since there
|
||||||
* would be no guarantee the implementation would remember to emit the event.
|
* would be no guarantee the implementation would remember to emit the event.
|
||||||
*/
|
*/
|
||||||
onDone(cb: () => void): Promise<void>;
|
public onDone(cb: () => void): void {
|
||||||
|
this.options.doneEvents.forEach((event) => {
|
||||||
|
this.instance.on(event, cb);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bind an event that will not fire without first binding it and shouldn't be
|
||||||
|
* bound immediately.
|
||||||
|
|
||||||
|
* For example, binding to `data` switches a stream to flowing mode, so we
|
||||||
|
* don't want to do it until we're asked. Otherwise something like `pipe`
|
||||||
|
* won't work because potentially some or all of the data will already have
|
||||||
|
* been flushed out.
|
||||||
|
*/
|
||||||
|
public async bindDelayedEvent(event: string): Promise<void> {
|
||||||
|
if (this.options.delayedEvents
|
||||||
|
&& this.options.delayedEvents.includes(event)
|
||||||
|
&& !this.options.bindEvents.includes(event)) {
|
||||||
|
this.options.bindEvents.push(event);
|
||||||
|
this.callbacks.forEach((cb) => {
|
||||||
|
this.instance.on(event, (...args: any[]) => cb(event, ...args));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listen to all possible events. On the client, this is to reduce boilerplate
|
* Listen to all possible events. On the client, this is to reduce boilerplate
|
||||||
* that would just be a bunch of error-prone forwarding of each individual
|
* that would just be a bunch of error-prone forwarding of each individual
|
||||||
* event from the proxy to its own emitter. It also fixes a timing issue
|
* event from the proxy to its own emitter.
|
||||||
* because we just always send all events from the server, so we never miss
|
*
|
||||||
* any due to listening too late.
|
* It also fixes a timing issue because we just always send all events from
|
||||||
|
* the server, so we never miss any due to listening too late.
|
||||||
|
*
|
||||||
|
* This cannot be async because then we can bind to the events too late.
|
||||||
*/
|
*/
|
||||||
// tslint:disable-next-line no-any
|
public onEvent(cb: EventCallback): void {
|
||||||
onEvent(cb: (event: string, ...args: any[]) => void): Promise<void>;
|
this.callbacks.push(cb);
|
||||||
|
this.options.bindEvents.forEach((event) => {
|
||||||
|
this.instance.on(event, (...args: any[]) => cb(event, ...args));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A server-side proxy stored on the client. The proxy ID only exists on the
|
||||||
|
* client-side version of the server proxy. The event listeners are handled by
|
||||||
|
* the client and the remaining methods are proxied to the server.
|
||||||
|
*/
|
||||||
|
export interface ClientServerProxy<T extends EventEmitter = EventEmitter> extends ServerProxy<T> {
|
||||||
|
proxyId: number | Module;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Argument, Module as ProtoModule, WorkingInit } from "../proto";
|
import { Argument, Module as ProtoModule, WorkingInit } from "../proto";
|
||||||
import { OperatingSystem } from "../common/connection";
|
import { OperatingSystem } from "../common/connection";
|
||||||
import { Module, ServerProxy } from "./proxy";
|
import { ClientServerProxy, Module, ServerProxy } from "./proxy";
|
||||||
|
|
||||||
// tslint:disable no-any
|
// tslint:disable no-any
|
||||||
|
|
||||||
@@ -19,6 +19,8 @@ export const escapePath = (path: string): string => {
|
|||||||
return `'${path.replace(/'/g, "'\\''")}'`;
|
return `'${path.replace(/'/g, "'\\''")}'`;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type EventCallback = (event: string, ...args: any[]) => void;
|
||||||
|
|
||||||
export type IEncodingOptions = {
|
export type IEncodingOptions = {
|
||||||
encoding?: BufferEncoding | null;
|
encoding?: BufferEncoding | null;
|
||||||
flag?: string;
|
flag?: string;
|
||||||
@@ -34,15 +36,26 @@ export type IEncodingOptionsCallback = IEncodingOptions | ((err: NodeJS.ErrnoExc
|
|||||||
* If sending a function is possible, provide `storeFunction`.
|
* If sending a function is possible, provide `storeFunction`.
|
||||||
* If sending a proxy is possible, provide `storeProxy`.
|
* If sending a proxy is possible, provide `storeProxy`.
|
||||||
*/
|
*/
|
||||||
export const argumentToProto = (
|
export const argumentToProto = <P = ClientServerProxy | ServerProxy>(
|
||||||
value: any,
|
value: any,
|
||||||
storeFunction?: (fn: () => void) => number,
|
storeFunction?: (fn: () => void) => number,
|
||||||
storeProxy?: (proxy: ServerProxy) => number,
|
storeProxy?: (proxy: P) => number | Module,
|
||||||
): Argument => {
|
): Argument => {
|
||||||
const convert = (currentValue: any): Argument => {
|
const convert = (currentValue: any): Argument => {
|
||||||
const message = new Argument();
|
const message = new Argument();
|
||||||
|
|
||||||
if (currentValue instanceof Error
|
if (isProxy<P>(currentValue)) {
|
||||||
|
if (!storeProxy) {
|
||||||
|
throw new Error("no way to serialize proxy");
|
||||||
|
}
|
||||||
|
const arg = new Argument.ProxyValue();
|
||||||
|
const id = storeProxy(currentValue);
|
||||||
|
if (typeof id === "string") {
|
||||||
|
throw new Error("unable to serialize module proxy");
|
||||||
|
}
|
||||||
|
arg.setId(id);
|
||||||
|
message.setProxy(arg);
|
||||||
|
} else if (currentValue instanceof Error
|
||||||
|| (currentValue && typeof currentValue.message !== "undefined"
|
|| (currentValue && typeof currentValue.message !== "undefined"
|
||||||
&& typeof currentValue.stack !== "undefined")) {
|
&& typeof currentValue.stack !== "undefined")) {
|
||||||
const arg = new Argument.ErrorValue();
|
const arg = new Argument.ErrorValue();
|
||||||
@@ -58,13 +71,6 @@ export const argumentToProto = (
|
|||||||
const arg = new Argument.ArrayValue();
|
const arg = new Argument.ArrayValue();
|
||||||
arg.setDataList(currentValue.map(convert));
|
arg.setDataList(currentValue.map(convert));
|
||||||
message.setArray(arg);
|
message.setArray(arg);
|
||||||
} else if (isProxy(currentValue)) {
|
|
||||||
if (!storeProxy) {
|
|
||||||
throw new Error("no way to serialize proxy");
|
|
||||||
}
|
|
||||||
const arg = new Argument.ProxyValue();
|
|
||||||
arg.setId(storeProxy(currentValue));
|
|
||||||
message.setProxy(arg);
|
|
||||||
} else if (currentValue instanceof Date
|
} else if (currentValue instanceof Date
|
||||||
|| (currentValue && typeof currentValue.getTime === "function")) {
|
|| (currentValue && typeof currentValue.getTime === "function")) {
|
||||||
const arg = new Argument.DateValue();
|
const arg = new Argument.DateValue();
|
||||||
@@ -218,7 +224,7 @@ export const platformToProto = (platform: NodeJS.Platform): WorkingInit.Operatin
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const isProxy = (value: any): value is ServerProxy => {
|
export const isProxy = <P = ClientServerProxy | ServerProxy>(value: any): value is P => {
|
||||||
return value && typeof value === "object" && typeof value.onEvent === "function";
|
return value && typeof value === "object" && typeof value.onEvent === "function";
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -230,8 +236,11 @@ export const isPromise = (value: any): value is Promise<any> => {
|
|||||||
* When spawning VS Code tries to preserve the environment but since it's in
|
* When spawning VS Code tries to preserve the environment but since it's in
|
||||||
* the browser, it doesn't work.
|
* the browser, it doesn't work.
|
||||||
*/
|
*/
|
||||||
export const preserveEnv = (options?: { env?: NodeJS.ProcessEnv } | null): void => {
|
export const withEnv = <T extends { env?: NodeJS.ProcessEnv }>(options?: T): T | undefined => {
|
||||||
if (options && options.env) {
|
return options && options.env ? {
|
||||||
options.env = { ...process.env, ...options.env };
|
...options,
|
||||||
}
|
env: {
|
||||||
|
...process.env, ...options.env,
|
||||||
|
},
|
||||||
|
} : options;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,35 +1,41 @@
|
|||||||
import * as cp from "child_process";
|
import * as cp from "child_process";
|
||||||
import { ServerProxy } from "../../common/proxy";
|
import { ServerProxy } from "../../common/proxy";
|
||||||
import { preserveEnv } from "../../common/util";
|
import { withEnv } from "../../common/util";
|
||||||
import { WritableProxy, ReadableProxy } from "./stream";
|
import { WritableProxy, ReadableProxy } from "./stream";
|
||||||
|
|
||||||
// tslint:disable completed-docs
|
// tslint:disable completed-docs
|
||||||
|
|
||||||
export type ForkProvider = (modulePath: string, args?: string[], options?: cp.ForkOptions) => cp.ChildProcess;
|
export type ForkProvider = (modulePath: string, args?: string[], options?: cp.ForkOptions) => cp.ChildProcess;
|
||||||
|
|
||||||
export class ChildProcessProxy implements ServerProxy {
|
export class ChildProcessProxy extends ServerProxy<cp.ChildProcess> {
|
||||||
public constructor(private readonly process: cp.ChildProcess) {}
|
public constructor(instance: cp.ChildProcess) {
|
||||||
|
super({
|
||||||
|
bindEvents: ["close", "disconnect", "error", "exit", "message"],
|
||||||
|
doneEvents: ["close"],
|
||||||
|
instance,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public async kill(signal?: string): Promise<void> {
|
public async kill(signal?: string): Promise<void> {
|
||||||
this.process.kill(signal);
|
this.instance.kill(signal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async disconnect(): Promise<void> {
|
public async disconnect(): Promise<void> {
|
||||||
this.process.disconnect();
|
this.instance.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async ref(): Promise<void> {
|
public async ref(): Promise<void> {
|
||||||
this.process.ref();
|
this.instance.ref();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async unref(): Promise<void> {
|
public async unref(): Promise<void> {
|
||||||
this.process.unref();
|
this.instance.unref();
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
// tslint:disable-next-line no-any
|
||||||
public async send(message: any): Promise<void> {
|
public async send(message: any): Promise<void> {
|
||||||
return new Promise((resolve, reject): void => {
|
return new Promise((resolve, reject): void => {
|
||||||
this.process.send(message, (error) => {
|
this.instance.send(message, (error) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
reject(error);
|
reject(error);
|
||||||
} else {
|
} else {
|
||||||
@@ -40,25 +46,13 @@ export class ChildProcessProxy implements ServerProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async getPid(): Promise<number> {
|
public async getPid(): Promise<number> {
|
||||||
return this.process.pid;
|
return this.instance.pid;
|
||||||
}
|
|
||||||
|
|
||||||
public async onDone(cb: () => void): Promise<void> {
|
|
||||||
this.process.on("close", cb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async dispose(): Promise<void> {
|
public async dispose(): Promise<void> {
|
||||||
this.process.kill();
|
this.instance.kill();
|
||||||
setTimeout(() => this.process.kill("SIGKILL"), 5000); // Double tap.
|
setTimeout(() => this.instance.kill("SIGKILL"), 5000); // Double tap.
|
||||||
}
|
await super.dispose();
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public async onEvent(cb: (event: string, ...args: any[]) => void): Promise<void> {
|
|
||||||
this.process.on("close", (code, signal) => cb("close", code, signal));
|
|
||||||
this.process.on("disconnect", () => cb("disconnect"));
|
|
||||||
this.process.on("error", (error) => cb("error", error));
|
|
||||||
this.process.on("exit", (exitCode, signal) => cb("exit", exitCode, signal));
|
|
||||||
this.process.on("message", (message) => cb("message", message));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,29 +71,25 @@ export class ChildProcessModuleProxy {
|
|||||||
options?: { encoding?: string | null } & cp.ExecOptions | null,
|
options?: { encoding?: string | null } & cp.ExecOptions | null,
|
||||||
callback?: ((error: cp.ExecException | null, stdin: string | Buffer, stdout: string | Buffer) => void),
|
callback?: ((error: cp.ExecException | null, stdin: string | Buffer, stdout: string | Buffer) => void),
|
||||||
): Promise<ChildProcessProxies> {
|
): Promise<ChildProcessProxies> {
|
||||||
preserveEnv(options);
|
return this.returnProxies(cp.exec(command, options && withEnv(options), callback));
|
||||||
|
|
||||||
return this.returnProxies(cp.exec(command, options, callback));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async fork(modulePath: string, args?: string[], options?: cp.ForkOptions): Promise<ChildProcessProxies> {
|
public async fork(modulePath: string, args?: string[], options?: cp.ForkOptions): Promise<ChildProcessProxies> {
|
||||||
preserveEnv(options);
|
return this.returnProxies((this.forkProvider || cp.fork)(modulePath, args, withEnv(options)));
|
||||||
|
|
||||||
return this.returnProxies((this.forkProvider || cp.fork)(modulePath, args, options));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async spawn(command: string, args?: string[], options?: cp.SpawnOptions): Promise<ChildProcessProxies> {
|
public async spawn(command: string, args?: string[], options?: cp.SpawnOptions): Promise<ChildProcessProxies> {
|
||||||
preserveEnv(options);
|
return this.returnProxies(cp.spawn(command, args, withEnv(options)));
|
||||||
|
|
||||||
return this.returnProxies(cp.spawn(command, args, options));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private returnProxies(process: cp.ChildProcess): ChildProcessProxies {
|
private returnProxies(process: cp.ChildProcess): ChildProcessProxies {
|
||||||
return {
|
return {
|
||||||
childProcess: new ChildProcessProxy(process),
|
childProcess: new ChildProcessProxy(process),
|
||||||
stdin: process.stdin && new WritableProxy(process.stdin),
|
stdin: process.stdin && new WritableProxy(process.stdin),
|
||||||
stdout: process.stdout && new ReadableProxy(process.stdout),
|
// Child processes streams appear to immediately flow so we need to bind
|
||||||
stderr: process.stderr && new ReadableProxy(process.stderr),
|
// to the data event right away.
|
||||||
|
stdout: process.stdout && new ReadableProxy(process.stdout, ["data"]),
|
||||||
|
stderr: process.stderr && new ReadableProxy(process.stderr, ["data"]),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ import * as fs from "fs";
|
|||||||
import { promisify } from "util";
|
import { promisify } from "util";
|
||||||
import { ServerProxy } from "../../common/proxy";
|
import { ServerProxy } from "../../common/proxy";
|
||||||
import { IEncodingOptions } from "../../common/util";
|
import { IEncodingOptions } from "../../common/util";
|
||||||
import { WritableProxy } from "./stream";
|
import { ReadableProxy, WritableProxy } from "./stream";
|
||||||
|
|
||||||
// tslint:disable completed-docs
|
// tslint:disable completed-docs no-any
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A serializable version of fs.Stats.
|
* A serializable version of fs.Stats.
|
||||||
@@ -37,45 +37,52 @@ export interface Stats {
|
|||||||
_isSocket: boolean;
|
_isSocket: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class WriteStreamProxy extends WritableProxy<fs.WriteStream> {
|
export class ReadStreamProxy extends ReadableProxy<fs.ReadStream> {
|
||||||
|
public constructor(stream: fs.ReadStream) {
|
||||||
|
super(stream, ["open"]);
|
||||||
|
}
|
||||||
|
|
||||||
public async close(): Promise<void> {
|
public async close(): Promise<void> {
|
||||||
this.stream.close();
|
this.instance.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async dispose(): Promise<void> {
|
public async dispose(): Promise<void> {
|
||||||
|
this.instance.close();
|
||||||
await super.dispose();
|
await super.dispose();
|
||||||
this.stream.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public async onEvent(cb: (event: string, ...args: any[]) => void): Promise<void> {
|
|
||||||
await super.onEvent(cb);
|
|
||||||
this.stream.on("open", (fd) => cb("open", fd));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class WatcherProxy implements ServerProxy {
|
export class WriteStreamProxy extends WritableProxy<fs.WriteStream> {
|
||||||
public constructor(private readonly watcher: fs.FSWatcher) {}
|
public constructor(stream: fs.WriteStream) {
|
||||||
|
super(stream, ["open"]);
|
||||||
|
}
|
||||||
|
|
||||||
public async close(): Promise<void> {
|
public async close(): Promise<void> {
|
||||||
this.watcher.close();
|
this.instance.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async dispose(): Promise<void> {
|
public async dispose(): Promise<void> {
|
||||||
this.watcher.close();
|
this.instance.close();
|
||||||
this.watcher.removeAllListeners();
|
await super.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class WatcherProxy extends ServerProxy<fs.FSWatcher> {
|
||||||
|
public constructor(watcher: fs.FSWatcher) {
|
||||||
|
super({
|
||||||
|
bindEvents: ["change", "close", "error"],
|
||||||
|
doneEvents: ["close", "error"],
|
||||||
|
instance: watcher,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async onDone(cb: () => void): Promise<void> {
|
public async close(): Promise<void> {
|
||||||
this.watcher.on("close", cb);
|
this.instance.close();
|
||||||
this.watcher.on("error", cb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
public async dispose(): Promise<void> {
|
||||||
public async onEvent(cb: (event: string, ...args: any[]) => void): Promise<void> {
|
this.instance.close();
|
||||||
this.watcher.on("change", (event, filename) => cb("change", event, filename));
|
await super.dispose();
|
||||||
this.watcher.on("close", () => cb("close"));
|
|
||||||
this.watcher.on("error", (error) => cb("error", error));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +91,6 @@ export class FsModuleProxy {
|
|||||||
return promisify(fs.access)(path, mode);
|
return promisify(fs.access)(path, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public appendFile(file: fs.PathLike | number, data: any, options?: fs.WriteFileOptions): Promise<void> {
|
public appendFile(file: fs.PathLike | number, data: any, options?: fs.WriteFileOptions): Promise<void> {
|
||||||
return promisify(fs.appendFile)(file, data, options);
|
return promisify(fs.appendFile)(file, data, options);
|
||||||
}
|
}
|
||||||
@@ -105,7 +111,10 @@ export class FsModuleProxy {
|
|||||||
return promisify(fs.copyFile)(src, dest, flags);
|
return promisify(fs.copyFile)(src, dest, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
public async createReadStream(path: fs.PathLike, options?: any): Promise<ReadStreamProxy> {
|
||||||
|
return new ReadStreamProxy(fs.createReadStream(path, options));
|
||||||
|
}
|
||||||
|
|
||||||
public async createWriteStream(path: fs.PathLike, options?: any): Promise<WriteStreamProxy> {
|
public async createWriteStream(path: fs.PathLike, options?: any): Promise<WriteStreamProxy> {
|
||||||
return new WriteStreamProxy(fs.createWriteStream(path, options));
|
return new WriteStreamProxy(fs.createWriteStream(path, options));
|
||||||
}
|
}
|
||||||
@@ -236,7 +245,6 @@ export class FsModuleProxy {
|
|||||||
return promisify(fs.write)(fd, buffer, offset, length, position);
|
return promisify(fs.write)(fd, buffer, offset, length, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public writeFile (path: fs.PathLike | number, data: any, options: IEncodingOptions): Promise<void> {
|
public writeFile (path: fs.PathLike | number, data: any, options: IEncodingOptions): Promise<void> {
|
||||||
return promisify(fs.writeFile)(path, data, options);
|
return promisify(fs.writeFile)(path, data, options);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,78 +2,65 @@ import * as net from "net";
|
|||||||
import { ServerProxy } from "../../common/proxy";
|
import { ServerProxy } from "../../common/proxy";
|
||||||
import { DuplexProxy } from "./stream";
|
import { DuplexProxy } from "./stream";
|
||||||
|
|
||||||
// tslint:disable completed-docs
|
// tslint:disable completed-docs no-any
|
||||||
|
|
||||||
export class NetSocketProxy extends DuplexProxy<net.Socket> {
|
export class NetSocketProxy extends DuplexProxy<net.Socket> {
|
||||||
|
public constructor(socket: net.Socket) {
|
||||||
|
super(socket, ["connect", "lookup", "timeout"]);
|
||||||
|
}
|
||||||
|
|
||||||
public async connect(options: number | string | net.SocketConnectOpts, host?: string): Promise<void> {
|
public async connect(options: number | string | net.SocketConnectOpts, host?: string): Promise<void> {
|
||||||
this.stream.connect(options as any, host as any); // tslint:disable-line no-any this works fine
|
this.instance.connect(options as any, host as any);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async unref(): Promise<void> {
|
public async unref(): Promise<void> {
|
||||||
this.stream.unref();
|
this.instance.unref();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async ref(): Promise<void> {
|
public async ref(): Promise<void> {
|
||||||
this.stream.ref();
|
this.instance.ref();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async dispose(): Promise<void> {
|
public async dispose(): Promise<void> {
|
||||||
this.stream.removeAllListeners();
|
this.instance.end();
|
||||||
this.stream.end();
|
this.instance.destroy();
|
||||||
this.stream.destroy();
|
this.instance.unref();
|
||||||
this.stream.unref();
|
await super.dispose();
|
||||||
}
|
|
||||||
|
|
||||||
public async onDone(cb: () => void): Promise<void> {
|
|
||||||
this.stream.on("close", cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public async onEvent(cb: (event: string, ...args: any[]) => void): Promise<void> {
|
|
||||||
await super.onEvent(cb);
|
|
||||||
this.stream.on("connect", () => cb("connect"));
|
|
||||||
this.stream.on("lookup", (error, address, family, host) => cb("lookup", error, address, family, host));
|
|
||||||
this.stream.on("timeout", () => cb("timeout"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class NetServerProxy implements ServerProxy {
|
export class NetServerProxy extends ServerProxy<net.Server> {
|
||||||
public constructor(private readonly server: net.Server) {}
|
public constructor(instance: net.Server) {
|
||||||
|
super({
|
||||||
|
bindEvents: ["close", "error", "listening"],
|
||||||
|
doneEvents: ["close"],
|
||||||
|
instance,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public async listen(handle?: net.ListenOptions | number | string, hostname?: string | number, backlog?: number): Promise<void> {
|
public async listen(handle?: net.ListenOptions | number | string, hostname?: string | number, backlog?: number): Promise<void> {
|
||||||
this.server.listen(handle, hostname as any, backlog as any); // tslint:disable-line no-any this is fine
|
this.instance.listen(handle, hostname as any, backlog as any);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async ref(): Promise<void> {
|
public async ref(): Promise<void> {
|
||||||
this.server.ref();
|
this.instance.ref();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async unref(): Promise<void> {
|
public async unref(): Promise<void> {
|
||||||
this.server.unref();
|
this.instance.unref();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async close(): Promise<void> {
|
public async close(): Promise<void> {
|
||||||
this.server.close();
|
this.instance.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async onConnection(cb: (proxy: NetSocketProxy) => void): Promise<void> {
|
public async onConnection(cb: (proxy: NetSocketProxy) => void): Promise<void> {
|
||||||
this.server.on("connection", (socket) => cb(new NetSocketProxy(socket)));
|
this.instance.on("connection", (socket) => cb(new NetSocketProxy(socket)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public async dispose(): Promise<void> {
|
public async dispose(): Promise<void> {
|
||||||
this.server.close();
|
this.instance.close();
|
||||||
this.server.removeAllListeners();
|
this.instance.removeAllListeners();
|
||||||
}
|
|
||||||
|
|
||||||
public async onDone(cb: () => void): Promise<void> {
|
|
||||||
this.server.on("close", cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public async onEvent(cb: (event: string, ...args: any[]) => void): Promise<void> {
|
|
||||||
this.server.on("close", () => cb("close"));
|
|
||||||
this.server.on("error", (error) => cb("error", error));
|
|
||||||
this.server.on("listening", () => cb("listening"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,7 +70,7 @@ export class NetModuleProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async createConnection(target: string | number | net.NetConnectOpts, host?: string): Promise<NetSocketProxy> {
|
public async createConnection(target: string | number | net.NetConnectOpts, host?: string): Promise<NetSocketProxy> {
|
||||||
return new NetSocketProxy(net.createConnection(target as any, host)); // tslint:disable-line no-any defeat stubborness
|
return new NetSocketProxy(net.createConnection(target as any, host));
|
||||||
}
|
}
|
||||||
|
|
||||||
public async createServer(options?: { allowHalfOpen?: boolean, pauseOnConnect?: boolean }): Promise<NetServerProxy> {
|
public async createServer(options?: { allowHalfOpen?: boolean, pauseOnConnect?: boolean }): Promise<NetServerProxy> {
|
||||||
|
|||||||
@@ -2,25 +2,32 @@
|
|||||||
import { EventEmitter } from "events";
|
import { EventEmitter } from "events";
|
||||||
import * as pty from "node-pty";
|
import * as pty from "node-pty";
|
||||||
import { ServerProxy } from "../../common/proxy";
|
import { ServerProxy } from "../../common/proxy";
|
||||||
import { preserveEnv } from "../../common/util";
|
import { withEnv } from "../../common/util";
|
||||||
|
|
||||||
// tslint:disable completed-docs
|
// tslint:disable completed-docs
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Server-side IPty proxy.
|
* Server-side IPty proxy.
|
||||||
*/
|
*/
|
||||||
export class NodePtyProcessProxy implements ServerProxy {
|
export class NodePtyProcessProxy extends ServerProxy {
|
||||||
private readonly emitter = new EventEmitter();
|
|
||||||
|
|
||||||
public constructor(private readonly process: pty.IPty) {
|
public constructor(private readonly process: pty.IPty) {
|
||||||
|
super({
|
||||||
|
bindEvents: ["process", "data", "exit"],
|
||||||
|
doneEvents: ["exit"],
|
||||||
|
instance: new EventEmitter(),
|
||||||
|
});
|
||||||
|
|
||||||
|
this.process.on("data", (data) => this.instance.emit("data", data));
|
||||||
|
this.process.on("exit", (exitCode, signal) => this.instance.emit("exit", exitCode, signal));
|
||||||
|
|
||||||
let name = process.process;
|
let name = process.process;
|
||||||
setTimeout(() => { // Need to wait for the caller to listen to the event.
|
setTimeout(() => { // Need to wait for the caller to listen to the event.
|
||||||
this.emitter.emit("process", name);
|
this.instance.emit("process", name);
|
||||||
}, 1);
|
}, 1);
|
||||||
const timer = setInterval(() => {
|
const timer = setInterval(() => {
|
||||||
if (process.process !== name) {
|
if (process.process !== name) {
|
||||||
name = process.process;
|
name = process.process;
|
||||||
this.emitter.emit("process", name);
|
this.instance.emit("process", name);
|
||||||
}
|
}
|
||||||
}, 200);
|
}, 200);
|
||||||
|
|
||||||
@@ -47,21 +54,10 @@ export class NodePtyProcessProxy implements ServerProxy {
|
|||||||
this.process.write(data);
|
this.process.write(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async onDone(cb: () => void): Promise<void> {
|
|
||||||
this.process.on("exit", cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async dispose(): Promise<void> {
|
public async dispose(): Promise<void> {
|
||||||
this.process.kill();
|
this.process.kill();
|
||||||
setTimeout(() => this.process.kill("SIGKILL"), 5000); // Double tap.
|
setTimeout(() => this.process.kill("SIGKILL"), 5000); // Double tap.
|
||||||
this.emitter.removeAllListeners();
|
await super.dispose();
|
||||||
}
|
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public async onEvent(cb: (event: string, ...args: any[]) => void): Promise<void> {
|
|
||||||
this.emitter.on("process", (process) => cb("process", process));
|
|
||||||
this.process.on("data", (data) => cb("data", data));
|
|
||||||
this.process.on("exit", (exitCode, signal) => cb("exit", exitCode, signal));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,8 +66,6 @@ export class NodePtyProcessProxy implements ServerProxy {
|
|||||||
*/
|
*/
|
||||||
export class NodePtyModuleProxy {
|
export class NodePtyModuleProxy {
|
||||||
public async spawn(file: string, args: string[] | string, options: pty.IPtyForkOptions): Promise<NodePtyProcessProxy> {
|
public async spawn(file: string, args: string[] | string, options: pty.IPtyForkOptions): Promise<NodePtyProcessProxy> {
|
||||||
preserveEnv(options);
|
return new NodePtyProcessProxy(require("node-pty").spawn(file, args, withEnv(options)));
|
||||||
|
|
||||||
return new NodePtyProcessProxy(require("node-pty").spawn(file, args, options));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,10 +5,14 @@ import { ServerProxy } from "../../common/proxy";
|
|||||||
|
|
||||||
// tslint:disable completed-docs
|
// tslint:disable completed-docs
|
||||||
|
|
||||||
export class RotatingLoggerProxy implements ServerProxy {
|
export class RotatingLoggerProxy extends ServerProxy<EventEmitter> {
|
||||||
private readonly emitter = new EventEmitter();
|
public constructor(private readonly logger: spdlog.RotatingLogger) {
|
||||||
|
super({
|
||||||
public constructor(private readonly logger: spdlog.RotatingLogger) {}
|
bindEvents: [],
|
||||||
|
doneEvents: ["dispose"],
|
||||||
|
instance: new EventEmitter(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public async trace (message: string): Promise<void> { this.logger.trace(message); }
|
public async trace (message: string): Promise<void> { this.logger.trace(message); }
|
||||||
public async debug (message: string): Promise<void> { this.logger.debug(message); }
|
public async debug (message: string): Promise<void> { this.logger.debug(message); }
|
||||||
@@ -21,19 +25,10 @@ export class RotatingLoggerProxy implements ServerProxy {
|
|||||||
public async flush (): Promise<void> { this.logger.flush(); }
|
public async flush (): Promise<void> { this.logger.flush(); }
|
||||||
public async drop (): Promise<void> { this.logger.drop(); }
|
public async drop (): Promise<void> { this.logger.drop(); }
|
||||||
|
|
||||||
public async onDone(cb: () => void): Promise<void> {
|
|
||||||
this.emitter.on("dispose", cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async dispose(): Promise<void> {
|
public async dispose(): Promise<void> {
|
||||||
await this.flush();
|
await this.flush();
|
||||||
this.emitter.emit("dispose");
|
this.instance.emit("dispose");
|
||||||
this.emitter.removeAllListeners();
|
await super.dispose();
|
||||||
}
|
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public async onEvent(_cb: (event: string, ...args: any[]) => void): Promise<void> {
|
|
||||||
// No events.
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,32 +1,38 @@
|
|||||||
|
import { EventEmitter } from "events";
|
||||||
import * as stream from "stream";
|
import * as stream from "stream";
|
||||||
import { ServerProxy } from "../../common/proxy";
|
import { ServerProxy } from "../../common/proxy";
|
||||||
|
|
||||||
// tslint:disable completed-docs
|
// tslint:disable completed-docs no-any
|
||||||
|
|
||||||
export class WritableProxy<T extends stream.Writable = stream.Writable> implements ServerProxy {
|
export class WritableProxy<T extends stream.Writable = stream.Writable> extends ServerProxy<T> {
|
||||||
public constructor(protected readonly stream: T) {}
|
public constructor(instance: T, bindEvents: string[] = [], delayedEvents?: string[]) {
|
||||||
|
super({
|
||||||
public async destroy(): Promise<void> {
|
bindEvents: ["close", "drain", "error", "finish"].concat(bindEvents),
|
||||||
this.stream.destroy();
|
doneEvents: ["close"],
|
||||||
|
delayedEvents,
|
||||||
|
instance,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async destroy(): Promise<void> {
|
||||||
|
this.instance.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public async end(data?: any, encoding?: string): Promise<void> {
|
public async end(data?: any, encoding?: string): Promise<void> {
|
||||||
return new Promise((resolve): void => {
|
return new Promise((resolve): void => {
|
||||||
this.stream.end(data, encoding, () => {
|
this.instance.end(data, encoding, () => {
|
||||||
resolve();
|
resolve();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async setDefaultEncoding(encoding: string): Promise<void> {
|
public async setDefaultEncoding(encoding: string): Promise<void> {
|
||||||
this.stream.setDefaultEncoding(encoding);
|
this.instance.setDefaultEncoding(encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public async write(data: any, encoding?: string): Promise<void> {
|
public async write(data: any, encoding?: string): Promise<void> {
|
||||||
return new Promise((resolve, reject): void => {
|
return new Promise((resolve, reject): void => {
|
||||||
this.stream.write(data, encoding, (error) => {
|
this.instance.write(data, encoding, (error) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
reject(error);
|
reject(error);
|
||||||
} else {
|
} else {
|
||||||
@@ -37,22 +43,8 @@ export class WritableProxy<T extends stream.Writable = stream.Writable> implemen
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async dispose(): Promise<void> {
|
public async dispose(): Promise<void> {
|
||||||
this.stream.end();
|
this.instance.end();
|
||||||
this.stream.removeAllListeners();
|
await super.dispose();
|
||||||
}
|
|
||||||
|
|
||||||
public async onDone(cb: () => void): Promise<void> {
|
|
||||||
this.stream.on("close", cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public async onEvent(cb: (event: string, ...args: any[]) => void): Promise<void> {
|
|
||||||
// Sockets have an extra argument on "close".
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
this.stream.on("close", (...args: any[]) => cb("close", ...args));
|
|
||||||
this.stream.on("drain", () => cb("drain"));
|
|
||||||
this.stream.on("error", (error) => cb("error", error));
|
|
||||||
this.stream.on("finish", () => cb("finish"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,50 +52,58 @@ export class WritableProxy<T extends stream.Writable = stream.Writable> implemen
|
|||||||
* This noise is because we can't do multiple extends and we also can't seem to
|
* This noise is because we can't do multiple extends and we also can't seem to
|
||||||
* do `extends WritableProxy<T> implement ReadableProxy<T>` (for `DuplexProxy`).
|
* do `extends WritableProxy<T> implement ReadableProxy<T>` (for `DuplexProxy`).
|
||||||
*/
|
*/
|
||||||
export interface IReadableProxy extends ServerProxy {
|
export interface IReadableProxy<T extends EventEmitter> extends ServerProxy<T> {
|
||||||
destroy(): Promise<void>;
|
pipe<P extends WritableProxy>(destination: P, options?: { end?: boolean; }): Promise<void>;
|
||||||
setEncoding(encoding: string): Promise<void>;
|
setEncoding(encoding: string): Promise<void>;
|
||||||
dispose(): Promise<void>;
|
|
||||||
onDone(cb: () => void): Promise<void>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ReadableProxy<T extends stream.Readable = stream.Readable> implements IReadableProxy {
|
export class ReadableProxy<T extends stream.Readable = stream.Readable> extends ServerProxy<T> implements IReadableProxy<T> {
|
||||||
public constructor(protected readonly stream: T) {}
|
public constructor(instance: T, bindEvents: string[] = []) {
|
||||||
|
super({
|
||||||
|
bindEvents: ["close", "end", "error"].concat(bindEvents),
|
||||||
|
doneEvents: ["close"],
|
||||||
|
delayedEvents: ["data"],
|
||||||
|
instance,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async pipe<P extends WritableProxy>(destination: P, options?: { end?: boolean; }): Promise<void> {
|
||||||
|
this.instance.pipe(destination.instance, options);
|
||||||
|
// `pipe` switches the stream to flowing mode and makes data start emitting.
|
||||||
|
await this.bindDelayedEvent("data");
|
||||||
|
}
|
||||||
|
|
||||||
public async destroy(): Promise<void> {
|
public async destroy(): Promise<void> {
|
||||||
this.stream.destroy();
|
this.instance.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async setEncoding(encoding: string): Promise<void> {
|
public async setEncoding(encoding: string): Promise<void> {
|
||||||
this.stream.setEncoding(encoding);
|
this.instance.setEncoding(encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async dispose(): Promise<void> {
|
public async dispose(): Promise<void> {
|
||||||
this.stream.destroy();
|
this.instance.destroy();
|
||||||
}
|
await super.dispose();
|
||||||
|
|
||||||
public async onDone(cb: () => void): Promise<void> {
|
|
||||||
this.stream.on("close", cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
|
||||||
public async onEvent(cb: (event: string, ...args: any[]) => void): Promise<void> {
|
|
||||||
this.stream.on("close", () => cb("close"));
|
|
||||||
this.stream.on("data", (chunk) => cb("data", chunk));
|
|
||||||
this.stream.on("end", () => cb("end"));
|
|
||||||
this.stream.on("error", (error) => cb("error", error));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class DuplexProxy<T extends stream.Duplex = stream.Duplex> extends WritableProxy<T> implements IReadableProxy {
|
export class DuplexProxy<T extends stream.Duplex = stream.Duplex> extends WritableProxy<T> implements IReadableProxy<T> {
|
||||||
|
public constructor(stream: T, bindEvents: string[] = []) {
|
||||||
|
super(stream, ["end"].concat(bindEvents), ["data"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async pipe<P extends WritableProxy>(destination: P, options?: { end?: boolean; }): Promise<void> {
|
||||||
|
this.instance.pipe(destination.instance, options);
|
||||||
|
// `pipe` switches the stream to flowing mode and makes data start emitting.
|
||||||
|
await this.bindDelayedEvent("data");
|
||||||
|
}
|
||||||
|
|
||||||
public async setEncoding(encoding: string): Promise<void> {
|
public async setEncoding(encoding: string): Promise<void> {
|
||||||
this.stream.setEncoding(encoding);
|
this.instance.setEncoding(encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
// tslint:disable-next-line no-any
|
public async dispose(): Promise<void> {
|
||||||
public async onEvent(cb: (event: string, ...args: any[]) => void): Promise<void> {
|
this.instance.destroy();
|
||||||
await super.onEvent(cb);
|
await super.dispose();
|
||||||
this.stream.on("data", (chunk) => cb("data", chunk));
|
|
||||||
this.stream.on("end", () => cb("end"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ export interface ServerOptions {
|
|||||||
readonly cacheDirectory: string;
|
readonly cacheDirectory: string;
|
||||||
readonly builtInExtensionsDirectory: string;
|
readonly builtInExtensionsDirectory: string;
|
||||||
readonly extensionsDirectory: string;
|
readonly extensionsDirectory: string;
|
||||||
|
readonly extraExtensionDirectories?: string[];
|
||||||
|
readonly extraBuiltinExtensionDirectories?: string[];
|
||||||
readonly fork?: ForkProvider;
|
readonly fork?: ForkProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,6 +101,8 @@ export class Server {
|
|||||||
initMsg.setTmpDirectory(os.tmpdir());
|
initMsg.setTmpDirectory(os.tmpdir());
|
||||||
initMsg.setOperatingSystem(platformToProto(os.platform()));
|
initMsg.setOperatingSystem(platformToProto(os.platform()));
|
||||||
initMsg.setShell(os.userInfo().shell || global.process.env.SHELL || "");
|
initMsg.setShell(os.userInfo().shell || global.process.env.SHELL || "");
|
||||||
|
initMsg.setExtraExtensionDirectoriesList(this.options.extraExtensionDirectories || []);
|
||||||
|
initMsg.setExtraBuiltinExtensionDirectoriesList(this.options.extraBuiltinExtensionDirectories || []);
|
||||||
const srvMsg = new ServerMessage();
|
const srvMsg = new ServerMessage();
|
||||||
srvMsg.setInit(initMsg);
|
srvMsg.setInit(initMsg);
|
||||||
connection.send(srvMsg.serializeBinary());
|
connection.send(srvMsg.serializeBinary());
|
||||||
@@ -136,6 +140,7 @@ export class Server {
|
|||||||
const args = proxyMessage.getArgsList().map((a) => protoToArgument(
|
const args = proxyMessage.getArgsList().map((a) => protoToArgument(
|
||||||
a,
|
a,
|
||||||
(id, args) => this.sendCallback(proxyId, id, args),
|
(id, args) => this.sendCallback(proxyId, id, args),
|
||||||
|
(id) => this.getProxy(id).instance,
|
||||||
));
|
));
|
||||||
|
|
||||||
logger.trace(() => [
|
logger.trace(() => [
|
||||||
@@ -241,9 +246,7 @@ export class Server {
|
|||||||
this.proxies.set(proxyId, { instance });
|
this.proxies.set(proxyId, { instance });
|
||||||
|
|
||||||
if (isProxy(instance)) {
|
if (isProxy(instance)) {
|
||||||
instance.onEvent((event, ...args) => this.sendEvent(proxyId, event, ...args)).catch((error) => {
|
instance.onEvent((event, ...args) => this.sendEvent(proxyId, event, ...args));
|
||||||
logger.error(error.message);
|
|
||||||
});
|
|
||||||
instance.onDone(() => {
|
instance.onDone(() => {
|
||||||
// It might have finished because we disposed it due to a disconnect.
|
// It might have finished because we disposed it due to a disconnect.
|
||||||
if (!this.disconnected) {
|
if (!this.disconnected) {
|
||||||
@@ -255,8 +258,6 @@ export class Server {
|
|||||||
this.removeProxy(proxyId);
|
this.removeProxy(proxyId);
|
||||||
}, this.responseTimeout);
|
}, this.responseTimeout);
|
||||||
}
|
}
|
||||||
}).catch((error) => {
|
|
||||||
logger.error(error.message);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,4 +42,6 @@ message WorkingInit {
|
|||||||
string shell = 6;
|
string shell = 6;
|
||||||
string builtin_extensions_dir = 7;
|
string builtin_extensions_dir = 7;
|
||||||
string extensions_directory = 8;
|
string extensions_directory = 8;
|
||||||
|
repeated string extra_extension_directories = 9;
|
||||||
|
repeated string extra_builtin_extension_directories = 10;
|
||||||
}
|
}
|
||||||
|
|||||||
12
packages/protocol/src/proto/client_pb.d.ts
vendored
12
packages/protocol/src/proto/client_pb.d.ts
vendored
@@ -135,6 +135,16 @@ export class WorkingInit extends jspb.Message {
|
|||||||
getExtensionsDirectory(): string;
|
getExtensionsDirectory(): string;
|
||||||
setExtensionsDirectory(value: string): void;
|
setExtensionsDirectory(value: string): void;
|
||||||
|
|
||||||
|
clearExtraExtensionDirectoriesList(): void;
|
||||||
|
getExtraExtensionDirectoriesList(): Array<string>;
|
||||||
|
setExtraExtensionDirectoriesList(value: Array<string>): void;
|
||||||
|
addExtraExtensionDirectories(value: string, index?: number): string;
|
||||||
|
|
||||||
|
clearExtraBuiltinExtensionDirectoriesList(): void;
|
||||||
|
getExtraBuiltinExtensionDirectoriesList(): Array<string>;
|
||||||
|
setExtraBuiltinExtensionDirectoriesList(value: Array<string>): void;
|
||||||
|
addExtraBuiltinExtensionDirectories(value: string, index?: number): string;
|
||||||
|
|
||||||
serializeBinary(): Uint8Array;
|
serializeBinary(): Uint8Array;
|
||||||
toObject(includeInstance?: boolean): WorkingInit.AsObject;
|
toObject(includeInstance?: boolean): WorkingInit.AsObject;
|
||||||
static toObject(includeInstance: boolean, msg: WorkingInit): WorkingInit.AsObject;
|
static toObject(includeInstance: boolean, msg: WorkingInit): WorkingInit.AsObject;
|
||||||
@@ -155,6 +165,8 @@ export namespace WorkingInit {
|
|||||||
shell: string,
|
shell: string,
|
||||||
builtinExtensionsDir: string,
|
builtinExtensionsDir: string,
|
||||||
extensionsDirectory: string,
|
extensionsDirectory: string,
|
||||||
|
extraExtensionDirectoriesList: Array<string>,
|
||||||
|
extraBuiltinExtensionDirectoriesList: Array<string>,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum OperatingSystem {
|
export enum OperatingSystem {
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ if (goog.DEBUG && !COMPILED) {
|
|||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
proto.WorkingInit = function(opt_data) {
|
proto.WorkingInit = function(opt_data) {
|
||||||
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
|
jspb.Message.initialize(this, opt_data, 0, -1, proto.WorkingInit.repeatedFields_, null);
|
||||||
};
|
};
|
||||||
goog.inherits(proto.WorkingInit, jspb.Message);
|
goog.inherits(proto.WorkingInit, jspb.Message);
|
||||||
if (goog.DEBUG && !COMPILED) {
|
if (goog.DEBUG && !COMPILED) {
|
||||||
@@ -759,6 +759,13 @@ proto.ServerMessage.prototype.hasSharedProcessActive = function() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of repeated fields within this message type.
|
||||||
|
* @private {!Array<number>}
|
||||||
|
* @const
|
||||||
|
*/
|
||||||
|
proto.WorkingInit.repeatedFields_ = [9,10];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (jspb.Message.GENERATE_TO_OBJECT) {
|
if (jspb.Message.GENERATE_TO_OBJECT) {
|
||||||
@@ -795,7 +802,9 @@ proto.WorkingInit.toObject = function(includeInstance, msg) {
|
|||||||
operatingSystem: jspb.Message.getFieldWithDefault(msg, 5, 0),
|
operatingSystem: jspb.Message.getFieldWithDefault(msg, 5, 0),
|
||||||
shell: jspb.Message.getFieldWithDefault(msg, 6, ""),
|
shell: jspb.Message.getFieldWithDefault(msg, 6, ""),
|
||||||
builtinExtensionsDir: jspb.Message.getFieldWithDefault(msg, 7, ""),
|
builtinExtensionsDir: jspb.Message.getFieldWithDefault(msg, 7, ""),
|
||||||
extensionsDirectory: jspb.Message.getFieldWithDefault(msg, 8, "")
|
extensionsDirectory: jspb.Message.getFieldWithDefault(msg, 8, ""),
|
||||||
|
extraExtensionDirectoriesList: jspb.Message.getRepeatedField(msg, 9),
|
||||||
|
extraBuiltinExtensionDirectoriesList: jspb.Message.getRepeatedField(msg, 10)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (includeInstance) {
|
if (includeInstance) {
|
||||||
@@ -864,6 +873,14 @@ proto.WorkingInit.deserializeBinaryFromReader = function(msg, reader) {
|
|||||||
var value = /** @type {string} */ (reader.readString());
|
var value = /** @type {string} */ (reader.readString());
|
||||||
msg.setExtensionsDirectory(value);
|
msg.setExtensionsDirectory(value);
|
||||||
break;
|
break;
|
||||||
|
case 9:
|
||||||
|
var value = /** @type {string} */ (reader.readString());
|
||||||
|
msg.addExtraExtensionDirectories(value);
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
var value = /** @type {string} */ (reader.readString());
|
||||||
|
msg.addExtraBuiltinExtensionDirectories(value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
reader.skipField();
|
reader.skipField();
|
||||||
break;
|
break;
|
||||||
@@ -949,6 +966,20 @@ proto.WorkingInit.serializeBinaryToWriter = function(message, writer) {
|
|||||||
f
|
f
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
f = message.getExtraExtensionDirectoriesList();
|
||||||
|
if (f.length > 0) {
|
||||||
|
writer.writeRepeatedString(
|
||||||
|
9,
|
||||||
|
f
|
||||||
|
);
|
||||||
|
}
|
||||||
|
f = message.getExtraBuiltinExtensionDirectoriesList();
|
||||||
|
if (f.length > 0) {
|
||||||
|
writer.writeRepeatedString(
|
||||||
|
10,
|
||||||
|
f
|
||||||
|
);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -1081,4 +1112,68 @@ proto.WorkingInit.prototype.setExtensionsDirectory = function(value) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* repeated string extra_extension_directories = 9;
|
||||||
|
* @return {!Array<string>}
|
||||||
|
*/
|
||||||
|
proto.WorkingInit.prototype.getExtraExtensionDirectoriesList = function() {
|
||||||
|
return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 9));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** @param {!Array<string>} value */
|
||||||
|
proto.WorkingInit.prototype.setExtraExtensionDirectoriesList = function(value) {
|
||||||
|
jspb.Message.setField(this, 9, value || []);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} value
|
||||||
|
* @param {number=} opt_index
|
||||||
|
*/
|
||||||
|
proto.WorkingInit.prototype.addExtraExtensionDirectories = function(value, opt_index) {
|
||||||
|
jspb.Message.addToRepeatedField(this, 9, value, opt_index);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the list making it empty but non-null.
|
||||||
|
*/
|
||||||
|
proto.WorkingInit.prototype.clearExtraExtensionDirectoriesList = function() {
|
||||||
|
this.setExtraExtensionDirectoriesList([]);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* repeated string extra_builtin_extension_directories = 10;
|
||||||
|
* @return {!Array<string>}
|
||||||
|
*/
|
||||||
|
proto.WorkingInit.prototype.getExtraBuiltinExtensionDirectoriesList = function() {
|
||||||
|
return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 10));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** @param {!Array<string>} value */
|
||||||
|
proto.WorkingInit.prototype.setExtraBuiltinExtensionDirectoriesList = function(value) {
|
||||||
|
jspb.Message.setField(this, 10, value || []);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} value
|
||||||
|
* @param {number=} opt_index
|
||||||
|
*/
|
||||||
|
proto.WorkingInit.prototype.addExtraBuiltinExtensionDirectories = function(value, opt_index) {
|
||||||
|
jspb.Message.addToRepeatedField(this, 10, value, opt_index);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the list making it empty but non-null.
|
||||||
|
*/
|
||||||
|
proto.WorkingInit.prototype.clearExtraBuiltinExtensionDirectoriesList = function() {
|
||||||
|
this.setExtraBuiltinExtensionDirectoriesList([]);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
goog.object.extend(exports, proto);
|
goog.object.extend(exports, proto);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ describe("child_process", () => {
|
|||||||
const cp = client.modules[Module.ChildProcess];
|
const cp = client.modules[Module.ChildProcess];
|
||||||
|
|
||||||
const getStdout = async (proc: ChildProcess): Promise<string> => {
|
const getStdout = async (proc: ChildProcess): Promise<string> => {
|
||||||
return new Promise((r): Readable => proc.stdout!.on("data", r))
|
return new Promise((r): Readable => proc.stdout!.once("data", r))
|
||||||
.then((s) => s.toString());
|
.then((s) => s.toString());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -70,12 +70,12 @@ describe("fs", () => {
|
|||||||
describe("chown", () => {
|
describe("chown", () => {
|
||||||
it("should chown existing file", async () => {
|
it("should chown existing file", async () => {
|
||||||
const file = await helper.createTmpFile();
|
const file = await helper.createTmpFile();
|
||||||
await expect(util.promisify(fs.chown)(file, 1, 1))
|
await expect(util.promisify(nativeFs.chown)(file, 1000, 1000))
|
||||||
.resolves.toBeUndefined();
|
.resolves.toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should fail to chown nonexistent file", async () => {
|
it("should fail to chown nonexistent file", async () => {
|
||||||
await expect(util.promisify(fs.chown)(helper.tmpFile(), 1, 1))
|
await expect(util.promisify(fs.chown)(helper.tmpFile(), 1000, 1000))
|
||||||
.rejects.toThrow("ENOENT");
|
.rejects.toThrow("ENOENT");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -131,6 +131,42 @@ describe("fs", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("createReadStream", () => {
|
||||||
|
it("should read a file", async () => {
|
||||||
|
const file = helper.tmpFile();
|
||||||
|
const content = "foobar";
|
||||||
|
await util.promisify(nativeFs.writeFile)(file, content);
|
||||||
|
|
||||||
|
const reader = fs.createReadStream(file);
|
||||||
|
|
||||||
|
await expect(new Promise((resolve, reject): void => {
|
||||||
|
let data = "";
|
||||||
|
reader.once("error", reject);
|
||||||
|
reader.once("end", () => resolve(data));
|
||||||
|
reader.on("data", (d) => data += d.toString());
|
||||||
|
})).resolves.toBe(content);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should pipe to a writable stream", async () => {
|
||||||
|
const source = helper.tmpFile();
|
||||||
|
const content = "foo";
|
||||||
|
await util.promisify(nativeFs.writeFile)(source, content);
|
||||||
|
|
||||||
|
const destination = helper.tmpFile();
|
||||||
|
const reader = fs.createReadStream(source);
|
||||||
|
const writer = fs.createWriteStream(destination);
|
||||||
|
|
||||||
|
await new Promise((resolve, reject): void => {
|
||||||
|
reader.once("error", reject);
|
||||||
|
writer.once("error", reject);
|
||||||
|
writer.once("close", resolve);
|
||||||
|
reader.pipe(writer);
|
||||||
|
});
|
||||||
|
|
||||||
|
await expect(util.promisify(nativeFs.readFile)(destination, "utf8")).resolves.toBe(content);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("exists", () => {
|
describe("exists", () => {
|
||||||
it("should output file exists", async () => {
|
it("should output file exists", async () => {
|
||||||
await expect(util.promisify(fs.exists)(__filename))
|
await expect(util.promisify(fs.exists)(__filename))
|
||||||
@@ -162,13 +198,13 @@ describe("fs", () => {
|
|||||||
it("should fchown existing file", async () => {
|
it("should fchown existing file", async () => {
|
||||||
const file = await helper.createTmpFile();
|
const file = await helper.createTmpFile();
|
||||||
const fd = await util.promisify(nativeFs.open)(file, "r");
|
const fd = await util.promisify(nativeFs.open)(file, "r");
|
||||||
await expect(util.promisify(fs.fchown)(fd, 1, 1))
|
await expect(util.promisify(fs.fchown)(fd, 1000, 1000))
|
||||||
.resolves.toBeUndefined();
|
.resolves.toBeUndefined();
|
||||||
await util.promisify(nativeFs.close)(fd);
|
await util.promisify(nativeFs.close)(fd);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should fail to fchown nonexistent file", async () => {
|
it("should fail to fchown nonexistent file", async () => {
|
||||||
await expect(util.promisify(fs.fchown)(99999, 1, 1))
|
await expect(util.promisify(fs.fchown)(99999, 1000, 1000))
|
||||||
.rejects.toThrow("EBADF");
|
.rejects.toThrow("EBADF");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -239,7 +275,7 @@ describe("fs", () => {
|
|||||||
it("should futimes existing file", async () => {
|
it("should futimes existing file", async () => {
|
||||||
const file = await helper.createTmpFile();
|
const file = await helper.createTmpFile();
|
||||||
const fd = await util.promisify(nativeFs.open)(file, "w");
|
const fd = await util.promisify(nativeFs.open)(file, "w");
|
||||||
await expect(util.promisify(fs.futimes)(fd, 1, 1))
|
await expect(util.promisify(fs.futimes)(fd, 1000, 1000))
|
||||||
.resolves.toBeUndefined();
|
.resolves.toBeUndefined();
|
||||||
await util.promisify(nativeFs.close)(fd);
|
await util.promisify(nativeFs.close)(fd);
|
||||||
});
|
});
|
||||||
@@ -275,14 +311,13 @@ describe("fs", () => {
|
|||||||
describe("lchown", () => {
|
describe("lchown", () => {
|
||||||
it("should lchown existing file", async () => {
|
it("should lchown existing file", async () => {
|
||||||
const file = await helper.createTmpFile();
|
const file = await helper.createTmpFile();
|
||||||
await expect(util.promisify(fs.lchown)(file, 1, 1))
|
await expect(util.promisify(fs.lchown)(file, 1000, 1000))
|
||||||
.resolves.toBeUndefined();
|
.resolves.toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: Doesn't fail on my system?
|
|
||||||
it("should fail to lchown nonexistent file", async () => {
|
it("should fail to lchown nonexistent file", async () => {
|
||||||
await expect(util.promisify(fs.lchown)(helper.tmpFile(), 1, 1))
|
await expect(util.promisify(fs.lchown)(helper.tmpFile(), 1000, 1000))
|
||||||
.resolves.toBeUndefined();
|
.rejects.toThrow("ENOENT");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -586,7 +621,10 @@ describe("fs", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should dispose", () => {
|
it("should dispose", (done) => {
|
||||||
client.dispose();
|
setTimeout(() => {
|
||||||
|
client.dispose();
|
||||||
|
done();
|
||||||
|
}, 100);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,9 +3,11 @@ import { createClient } from "./helpers";
|
|||||||
describe("Server", () => {
|
describe("Server", () => {
|
||||||
const dataDirectory = "/tmp/example";
|
const dataDirectory = "/tmp/example";
|
||||||
const workingDirectory = "/working/dir";
|
const workingDirectory = "/working/dir";
|
||||||
|
const extensionsDirectory = "/tmp/example";
|
||||||
const builtInExtensionsDirectory = "/tmp/example";
|
const builtInExtensionsDirectory = "/tmp/example";
|
||||||
const cacheDirectory = "/tmp/cache";
|
const cacheDirectory = "/tmp/cache";
|
||||||
const client = createClient({
|
const client = createClient({
|
||||||
|
extensionsDirectory,
|
||||||
builtInExtensionsDirectory,
|
builtInExtensionsDirectory,
|
||||||
cacheDirectory,
|
cacheDirectory,
|
||||||
dataDirectory,
|
dataDirectory,
|
||||||
|
|||||||
@@ -27,9 +27,10 @@ describe("spdlog", () => {
|
|||||||
.toContain("critical");
|
.toContain("critical");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should dispose", () => {
|
it("should dispose", (done) => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
client.dispose();
|
client.dispose();
|
||||||
|
done();
|
||||||
}, 100);
|
}, 100);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ import * as util from "util";
|
|||||||
import { Module } from "../src/common/proxy";
|
import { Module } from "../src/common/proxy";
|
||||||
import { createClient, Helper } from "./helpers";
|
import { createClient, Helper } from "./helpers";
|
||||||
|
|
||||||
|
// tslint:disable deprecation to use fs.exists
|
||||||
|
|
||||||
describe("trash", () => {
|
describe("trash", () => {
|
||||||
const client = createClient();
|
const client = createClient();
|
||||||
const trash = client.modules[Module.Trash];
|
const trash = client.modules[Module.Trash];
|
||||||
@@ -18,9 +20,10 @@ describe("trash", () => {
|
|||||||
expect(await util.promisify(fs.exists)(file)).toBeFalsy();
|
expect(await util.promisify(fs.exists)(file)).toBeFalsy();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should dispose", () => {
|
it("should dispose", (done) => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
client.dispose();
|
client.dispose();
|
||||||
|
done();
|
||||||
}, 100);
|
}, 100);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -64,29 +64,6 @@ accepts@~1.3.5:
|
|||||||
mime-types "~2.1.18"
|
mime-types "~2.1.18"
|
||||||
negotiator "0.6.1"
|
negotiator "0.6.1"
|
||||||
|
|
||||||
ansi-regex@^2.0.0:
|
|
||||||
version "2.1.1"
|
|
||||||
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=
|
|
||||||
|
|
||||||
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"
|
|
||||||
|
|
||||||
array-flatten@1.1.1:
|
array-flatten@1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
|
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
|
||||||
@@ -114,21 +91,6 @@ balanced-match@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
||||||
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
|
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
|
||||||
|
|
||||||
bindings@^1.3.0:
|
|
||||||
version "1.5.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
|
|
||||||
integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
|
|
||||||
dependencies:
|
|
||||||
file-uri-to-path "1.0.0"
|
|
||||||
|
|
||||||
bl@^1.0.0:
|
|
||||||
version "1.2.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
|
|
||||||
integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
|
|
||||||
dependencies:
|
|
||||||
readable-stream "^2.3.5"
|
|
||||||
safe-buffer "^5.1.1"
|
|
||||||
|
|
||||||
body-parser@1.18.3:
|
body-parser@1.18.3:
|
||||||
version "1.18.3"
|
version "1.18.3"
|
||||||
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
|
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
|
||||||
@@ -153,49 +115,16 @@ brace-expansion@^1.1.7:
|
|||||||
balanced-match "^1.0.0"
|
balanced-match "^1.0.0"
|
||||||
concat-map "0.0.1"
|
concat-map "0.0.1"
|
||||||
|
|
||||||
buffer-alloc-unsafe@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
|
|
||||||
integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
|
|
||||||
|
|
||||||
buffer-alloc@^1.2.0:
|
|
||||||
version "1.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
|
|
||||||
integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
|
|
||||||
dependencies:
|
|
||||||
buffer-alloc-unsafe "^1.1.0"
|
|
||||||
buffer-fill "^1.0.0"
|
|
||||||
|
|
||||||
buffer-fill@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
|
|
||||||
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
|
|
||||||
|
|
||||||
bytes@3.0.0:
|
bytes@3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
|
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
|
||||||
integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
|
integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
|
||||||
|
|
||||||
chownr@^1.0.1:
|
|
||||||
version "1.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
|
|
||||||
integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==
|
|
||||||
|
|
||||||
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=
|
|
||||||
|
|
||||||
concat-map@0.0.1:
|
concat-map@0.0.1:
|
||||||
version "0.0.1"
|
version "0.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||||
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
|
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=
|
|
||||||
|
|
||||||
content-disposition@0.5.2:
|
content-disposition@0.5.2:
|
||||||
version "0.5.2"
|
version "0.5.2"
|
||||||
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
|
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
|
||||||
@@ -216,11 +145,6 @@ cookie@0.3.1:
|
|||||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
|
||||||
integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
|
integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
|
||||||
|
|
||||||
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-async@^2.1.1:
|
cross-spawn-async@^2.1.1:
|
||||||
version "2.2.5"
|
version "2.2.5"
|
||||||
resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc"
|
resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc"
|
||||||
@@ -247,23 +171,6 @@ debug@2.6.9:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ms "2.0.0"
|
ms "2.0.0"
|
||||||
|
|
||||||
decompress-response@^3.3.0:
|
|
||||||
version "3.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
|
|
||||||
integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
|
|
||||||
dependencies:
|
|
||||||
mimic-response "^1.0.0"
|
|
||||||
|
|
||||||
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==
|
|
||||||
|
|
||||||
delegates@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
|
|
||||||
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
|
|
||||||
|
|
||||||
depd@~1.1.2:
|
depd@~1.1.2:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
|
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
|
||||||
@@ -274,11 +181,6 @@ destroy@~1.0.4:
|
|||||||
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
|
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
|
||||||
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
|
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
|
||||||
|
|
||||||
detect-libc@^1.0.3:
|
|
||||||
version "1.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
|
|
||||||
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
|
|
||||||
|
|
||||||
dir-glob@^2.0.0:
|
dir-glob@^2.0.0:
|
||||||
version "2.2.2"
|
version "2.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
|
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
|
||||||
@@ -296,13 +198,6 @@ encodeurl@~1.0.2:
|
|||||||
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
|
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
|
||||||
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
|
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
|
||||||
|
|
||||||
end-of-stream@^1.0.0, end-of-stream@^1.1.0:
|
|
||||||
version "1.4.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
|
|
||||||
integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
|
|
||||||
dependencies:
|
|
||||||
once "^1.4.0"
|
|
||||||
|
|
||||||
escape-html@~1.0.3:
|
escape-html@~1.0.3:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
|
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
|
||||||
@@ -342,11 +237,6 @@ execa@^0.2.2:
|
|||||||
path-key "^1.0.0"
|
path-key "^1.0.0"
|
||||||
strip-eof "^1.0.0"
|
strip-eof "^1.0.0"
|
||||||
|
|
||||||
expand-template@^2.0.3:
|
|
||||||
version "2.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
|
|
||||||
integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
|
|
||||||
|
|
||||||
express@^4.16.4:
|
express@^4.16.4:
|
||||||
version "4.16.4"
|
version "4.16.4"
|
||||||
resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
|
resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
|
||||||
@@ -383,11 +273,6 @@ express@^4.16.4:
|
|||||||
utils-merge "1.0.1"
|
utils-merge "1.0.1"
|
||||||
vary "~1.1.2"
|
vary "~1.1.2"
|
||||||
|
|
||||||
file-uri-to-path@1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
|
|
||||||
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
|
|
||||||
|
|
||||||
finalhandler@1.1.1:
|
finalhandler@1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
|
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
|
||||||
@@ -411,11 +296,6 @@ fresh@0.5.2:
|
|||||||
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
|
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
|
||||||
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
|
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
|
||||||
|
|
||||||
fs-constants@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
|
||||||
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
|
|
||||||
|
|
||||||
fs-extra@^0.30.0:
|
fs-extra@^0.30.0:
|
||||||
version "0.30.0"
|
version "0.30.0"
|
||||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
|
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
|
||||||
@@ -432,30 +312,11 @@ fs.realpath@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
|
||||||
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
|
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
|
||||||
|
|
||||||
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@^3.0.0:
|
get-stream@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
|
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
|
||||||
integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
|
integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
|
||||||
|
|
||||||
github-from-package@0.0.0:
|
|
||||||
version "0.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
|
|
||||||
integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
|
|
||||||
|
|
||||||
glob@^7.1.2, glob@^7.1.3:
|
glob@^7.1.2, glob@^7.1.3:
|
||||||
version "7.1.3"
|
version "7.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
|
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
|
||||||
@@ -490,11 +351,6 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
|
|||||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
|
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
|
||||||
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
|
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
|
||||||
|
|
||||||
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=
|
|
||||||
|
|
||||||
http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
|
http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
|
||||||
version "1.6.3"
|
version "1.6.3"
|
||||||
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
|
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
|
||||||
@@ -525,43 +381,21 @@ inflight@^1.0.4:
|
|||||||
once "^1.3.0"
|
once "^1.3.0"
|
||||||
wrappy "1"
|
wrappy "1"
|
||||||
|
|
||||||
inherits@2, inherits@2.0.3, inherits@~2.0.3:
|
inherits@2, inherits@2.0.3:
|
||||||
version "2.0.3"
|
version "2.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
||||||
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
|
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
|
||||||
|
|
||||||
ini@~1.3.0:
|
|
||||||
version "1.3.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
|
|
||||||
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
|
|
||||||
|
|
||||||
ipaddr.js@1.8.0:
|
ipaddr.js@1.8.0:
|
||||||
version "1.8.0"
|
version "1.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
|
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
|
||||||
integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4=
|
integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4=
|
||||||
|
|
||||||
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-stream@^1.1.0:
|
is-stream@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
||||||
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
|
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
|
||||||
|
|
||||||
isarray@~1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
|
||||||
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
|
|
||||||
|
|
||||||
isexe@^2.0.0:
|
isexe@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
||||||
@@ -621,11 +455,6 @@ mime@1.4.1:
|
|||||||
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
|
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
|
||||||
integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
|
integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
|
||||||
|
|
||||||
mimic-response@^1.0.0:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
|
|
||||||
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
|
|
||||||
|
|
||||||
minimatch@^3.0.4:
|
minimatch@^3.0.4:
|
||||||
version "3.0.4"
|
version "3.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
|
||||||
@@ -633,23 +462,6 @@ minimatch@^3.0.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
brace-expansion "^1.1.7"
|
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.2.0:
|
|
||||||
version "1.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
|
|
||||||
integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
|
|
||||||
|
|
||||||
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"
|
|
||||||
|
|
||||||
mount-point@^3.0.0:
|
mount-point@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/mount-point/-/mount-point-3.0.0.tgz#665cb9edebe80d110e658db56c31d0aef51a8f97"
|
resolved "https://registry.yarnpkg.com/mount-point/-/mount-point-3.0.0.tgz#665cb9edebe80d110e658db56c31d0aef51a8f97"
|
||||||
@@ -664,21 +476,6 @@ ms@2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||||
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
||||||
|
|
||||||
nan@2.10.0:
|
|
||||||
version "2.10.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
|
|
||||||
integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==
|
|
||||||
|
|
||||||
nan@^2.8.0:
|
|
||||||
version "2.12.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552"
|
|
||||||
integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==
|
|
||||||
|
|
||||||
napi-build-utils@^1.0.1:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508"
|
|
||||||
integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==
|
|
||||||
|
|
||||||
negotiator@0.6.1:
|
negotiator@0.6.1:
|
||||||
version "0.6.1"
|
version "0.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
|
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
|
||||||
@@ -689,26 +486,6 @@ nice-try@^1.0.4:
|
|||||||
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
|
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
|
||||||
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
|
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
|
||||||
|
|
||||||
node-abi@^2.7.0:
|
|
||||||
version "2.7.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.7.1.tgz#a8997ae91176a5fbaa455b194976e32683cda643"
|
|
||||||
integrity sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw==
|
|
||||||
dependencies:
|
|
||||||
semver "^5.4.1"
|
|
||||||
|
|
||||||
node-pty-prebuilt@^0.7.6:
|
|
||||||
version "0.7.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/node-pty-prebuilt/-/node-pty-prebuilt-0.7.6.tgz#c04c41e40a527ed894bf0ee801f40e5fd6f5faf6"
|
|
||||||
integrity sha512-aD/77N6WmohtWMhdHaBMunOihpZzDcp5Ig1cHsmtYNxl5NU8+3r9aGkfbKWUDYrPQaFgbJEAWfGeb3NFYd1+0g==
|
|
||||||
dependencies:
|
|
||||||
nan "2.10.0"
|
|
||||||
prebuild-install "^5.0.0"
|
|
||||||
|
|
||||||
noop-logger@^0.1.1:
|
|
||||||
version "0.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
|
|
||||||
integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=
|
|
||||||
|
|
||||||
npm-run-path@^1.0.0:
|
npm-run-path@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f"
|
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f"
|
||||||
@@ -723,22 +500,7 @@ npm-run-path@^2.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
path-key "^2.0.0"
|
path-key "^2.0.0"
|
||||||
|
|
||||||
npmlog@^4.0.1:
|
object-assign@^4.0.1:
|
||||||
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"
|
|
||||||
|
|
||||||
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=
|
|
||||||
|
|
||||||
object-assign@^4.0.1, object-assign@^4.1.0:
|
|
||||||
version "4.1.1"
|
version "4.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||||
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
|
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
|
||||||
@@ -750,14 +512,14 @@ on-finished@~2.3.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ee-first "1.1.1"
|
ee-first "1.1.1"
|
||||||
|
|
||||||
once@^1.3.0, once@^1.3.1, once@^1.4.0:
|
once@^1.3.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
|
||||||
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
|
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
|
||||||
dependencies:
|
dependencies:
|
||||||
wrappy "1"
|
wrappy "1"
|
||||||
|
|
||||||
os-homedir@^1.0.0, os-homedir@^1.0.1:
|
os-homedir@^1.0.0:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
|
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
|
||||||
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
|
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
|
||||||
@@ -831,33 +593,6 @@ pinkie@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
|
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
|
||||||
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
|
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
|
||||||
|
|
||||||
prebuild-install@^5.0.0:
|
|
||||||
version "5.2.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.2.5.tgz#c7485911fe98950b7f7cd15bb9daee11b875cc44"
|
|
||||||
integrity sha512-6uZgMVg7yDfqlP5CPurVhtq3hUKBFNufiar4J5hZrlHTo59DDBEtyxw01xCdFss9j0Zb9+qzFVf/s4niayba3w==
|
|
||||||
dependencies:
|
|
||||||
detect-libc "^1.0.3"
|
|
||||||
expand-template "^2.0.3"
|
|
||||||
github-from-package "0.0.0"
|
|
||||||
minimist "^1.2.0"
|
|
||||||
mkdirp "^0.5.1"
|
|
||||||
napi-build-utils "^1.0.1"
|
|
||||||
node-abi "^2.7.0"
|
|
||||||
noop-logger "^0.1.1"
|
|
||||||
npmlog "^4.0.1"
|
|
||||||
os-homedir "^1.0.1"
|
|
||||||
pump "^2.0.1"
|
|
||||||
rc "^1.2.7"
|
|
||||||
simple-get "^2.7.0"
|
|
||||||
tar-fs "^1.13.0"
|
|
||||||
tunnel-agent "^0.6.0"
|
|
||||||
which-pm-runs "^1.0.0"
|
|
||||||
|
|
||||||
process-nextick-args@~2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
|
|
||||||
integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
|
|
||||||
|
|
||||||
proxy-addr@~2.0.4:
|
proxy-addr@~2.0.4:
|
||||||
version "2.0.4"
|
version "2.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
|
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
|
||||||
@@ -871,22 +606,6 @@ pseudomap@^1.0.2:
|
|||||||
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
|
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
|
||||||
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
|
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
|
||||||
|
|
||||||
pump@^1.0.0:
|
|
||||||
version "1.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954"
|
|
||||||
integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==
|
|
||||||
dependencies:
|
|
||||||
end-of-stream "^1.1.0"
|
|
||||||
once "^1.3.1"
|
|
||||||
|
|
||||||
pump@^2.0.1:
|
|
||||||
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"
|
|
||||||
|
|
||||||
qs@6.5.2:
|
qs@6.5.2:
|
||||||
version "6.5.2"
|
version "6.5.2"
|
||||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
|
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
|
||||||
@@ -907,29 +626,6 @@ raw-body@2.3.3:
|
|||||||
iconv-lite "0.4.23"
|
iconv-lite "0.4.23"
|
||||||
unpipe "1.0.0"
|
unpipe "1.0.0"
|
||||||
|
|
||||||
rc@^1.2.7:
|
|
||||||
version "1.2.8"
|
|
||||||
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
|
|
||||||
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
|
|
||||||
dependencies:
|
|
||||||
deep-extend "^0.6.0"
|
|
||||||
ini "~1.3.0"
|
|
||||||
minimist "^1.2.0"
|
|
||||||
strip-json-comments "~2.0.1"
|
|
||||||
|
|
||||||
readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.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==
|
|
||||||
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"
|
|
||||||
|
|
||||||
rimraf@^2.2.8, rimraf@^2.6.3:
|
rimraf@^2.2.8, rimraf@^2.6.3:
|
||||||
version "2.6.3"
|
version "2.6.3"
|
||||||
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
|
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
|
||||||
@@ -944,7 +640,7 @@ run-applescript@^3.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
execa "^0.10.0"
|
execa "^0.10.0"
|
||||||
|
|
||||||
safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
safe-buffer@5.1.2:
|
||||||
version "5.1.2"
|
version "5.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
||||||
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
||||||
@@ -954,7 +650,7 @@ safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, s
|
|||||||
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
||||||
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
||||||
|
|
||||||
semver@^5.4.1, semver@^5.5.0:
|
semver@^5.5.0:
|
||||||
version "5.6.0"
|
version "5.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
|
||||||
integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
|
integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
|
||||||
@@ -988,11 +684,6 @@ serve-static@1.13.2:
|
|||||||
parseurl "~1.3.2"
|
parseurl "~1.3.2"
|
||||||
send "0.16.2"
|
send "0.16.2"
|
||||||
|
|
||||||
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=
|
|
||||||
|
|
||||||
setprototypeof@1.1.0:
|
setprototypeof@1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
|
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
|
||||||
@@ -1015,34 +706,11 @@ signal-exit@^3.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
|
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
|
||||||
integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
|
integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
|
||||||
|
|
||||||
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=
|
|
||||||
|
|
||||||
simple-get@^2.7.0:
|
|
||||||
version "2.8.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
|
|
||||||
integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
|
|
||||||
dependencies:
|
|
||||||
decompress-response "^3.3.0"
|
|
||||||
once "^1.3.1"
|
|
||||||
simple-concat "^1.0.0"
|
|
||||||
|
|
||||||
slash@^1.0.0:
|
slash@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
|
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
|
||||||
integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
|
integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
|
||||||
|
|
||||||
spdlog@^0.7.2:
|
|
||||||
version "0.7.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/spdlog/-/spdlog-0.7.2.tgz#9298753d7694b9ee9bbfd7e01ea1e4c6ace1e64d"
|
|
||||||
integrity sha512-rHfWCaWMD4NindDnql6rc6kn7Bs8JR92jhiUpCl3D6v+jYcQ6GozMLig0RliOOR8st5mU+IHLZnr15fBys5x/Q==
|
|
||||||
dependencies:
|
|
||||||
bindings "^1.3.0"
|
|
||||||
mkdirp "^0.5.1"
|
|
||||||
nan "^2.8.0"
|
|
||||||
|
|
||||||
"statuses@>= 1.4.0 < 2":
|
"statuses@>= 1.4.0 < 2":
|
||||||
version "1.5.0"
|
version "1.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
|
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
|
||||||
@@ -1053,87 +721,16 @@ statuses@~1.4.0:
|
|||||||
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
|
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
|
||||||
integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
|
integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
|
||||||
|
|
||||||
string-width@^1.0.1:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
|
|
||||||
integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
|
|
||||||
dependencies:
|
|
||||||
code-point-at "^1.0.0"
|
|
||||||
is-fullwidth-code-point "^1.0.0"
|
|
||||||
strip-ansi "^3.0.0"
|
|
||||||
|
|
||||||
"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==
|
|
||||||
dependencies:
|
|
||||||
is-fullwidth-code-point "^2.0.0"
|
|
||||||
strip-ansi "^4.0.0"
|
|
||||||
|
|
||||||
string_decoder@~1.1.1:
|
|
||||||
version "1.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
|
|
||||||
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
|
|
||||||
dependencies:
|
|
||||||
safe-buffer "~5.1.0"
|
|
||||||
|
|
||||||
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
|
|
||||||
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=
|
|
||||||
dependencies:
|
|
||||||
ansi-regex "^3.0.0"
|
|
||||||
|
|
||||||
strip-eof@^1.0.0:
|
strip-eof@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
|
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
|
||||||
integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
|
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=
|
|
||||||
|
|
||||||
tar-fs@^1.13.0:
|
|
||||||
version "1.16.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509"
|
|
||||||
integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==
|
|
||||||
dependencies:
|
|
||||||
chownr "^1.0.1"
|
|
||||||
mkdirp "^0.5.1"
|
|
||||||
pump "^1.0.0"
|
|
||||||
tar-stream "^1.1.2"
|
|
||||||
|
|
||||||
tar-stream@^1.1.2:
|
|
||||||
version "1.6.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
|
|
||||||
integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
|
|
||||||
dependencies:
|
|
||||||
bl "^1.0.0"
|
|
||||||
buffer-alloc "^1.2.0"
|
|
||||||
end-of-stream "^1.0.0"
|
|
||||||
fs-constants "^1.0.0"
|
|
||||||
readable-stream "^2.3.0"
|
|
||||||
to-buffer "^1.1.1"
|
|
||||||
xtend "^4.0.0"
|
|
||||||
|
|
||||||
text-encoding@^0.7.0:
|
text-encoding@^0.7.0:
|
||||||
version "0.7.0"
|
version "0.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz#f895e836e45990624086601798ea98e8f36ee643"
|
resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz#f895e836e45990624086601798ea98e8f36ee643"
|
||||||
integrity sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==
|
integrity sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==
|
||||||
|
|
||||||
to-buffer@^1.1.1:
|
|
||||||
version "1.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
|
|
||||||
integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
|
|
||||||
|
|
||||||
trash@^4.3.0:
|
trash@^4.3.0:
|
||||||
version "4.3.0"
|
version "4.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/trash/-/trash-4.3.0.tgz#6ebeecdea4d666b06e389b47d135ea88e1de5075"
|
resolved "https://registry.yarnpkg.com/trash/-/trash-4.3.0.tgz#6ebeecdea4d666b06e389b47d135ea88e1de5075"
|
||||||
@@ -1156,13 +753,6 @@ ts-protoc-gen@^0.8.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
google-protobuf "^3.6.1"
|
google-protobuf "^3.6.1"
|
||||||
|
|
||||||
tunnel-agent@^0.6.0:
|
|
||||||
version "0.6.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
|
|
||||||
integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
|
|
||||||
dependencies:
|
|
||||||
safe-buffer "^5.0.1"
|
|
||||||
|
|
||||||
type-is@~1.6.16:
|
type-is@~1.6.16:
|
||||||
version "1.6.16"
|
version "1.6.16"
|
||||||
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
|
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
|
||||||
@@ -1183,11 +773,6 @@ user-home@^2.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
os-homedir "^1.0.0"
|
os-homedir "^1.0.0"
|
||||||
|
|
||||||
util-deprecate@~1.0.1:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
|
||||||
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
|
|
||||||
|
|
||||||
utils-merge@1.0.1:
|
utils-merge@1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
|
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
|
||||||
@@ -1203,11 +788,6 @@ vary@~1.1.2:
|
|||||||
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
|
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
|
||||||
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
|
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
|
||||||
|
|
||||||
which-pm-runs@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
|
|
||||||
integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=
|
|
||||||
|
|
||||||
which@^1.2.8, which@^1.2.9:
|
which@^1.2.8, which@^1.2.9:
|
||||||
version "1.3.1"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
|
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
|
||||||
@@ -1215,13 +795,6 @@ which@^1.2.8, which@^1.2.9:
|
|||||||
dependencies:
|
dependencies:
|
||||||
isexe "^2.0.0"
|
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"
|
|
||||||
|
|
||||||
wrappy@1:
|
wrappy@1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||||
@@ -1252,11 +825,6 @@ xdg-trashdir@^2.1.1:
|
|||||||
user-home "^2.0.0"
|
user-home "^2.0.0"
|
||||||
xdg-basedir "^2.0.0"
|
xdg-basedir "^2.0.0"
|
||||||
|
|
||||||
xtend@^4.0.0:
|
|
||||||
version "4.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
|
|
||||||
integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
|
|
||||||
|
|
||||||
yallist@^2.1.2:
|
yallist@^2.1.2:
|
||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"build:binary": "ts-node scripts/nbin.ts"
|
"build:binary": "ts-node scripts/nbin.ts"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@coder/nbin": "^1.0.7",
|
"@coder/nbin": "^1.1.2",
|
||||||
"commander": "^2.19.0",
|
"commander": "^2.19.0",
|
||||||
"express": "^4.16.4",
|
"express": "^4.16.4",
|
||||||
"express-static-gzip": "^1.1.3",
|
"express-static-gzip": "^1.1.3",
|
||||||
|
|||||||
@@ -2,14 +2,26 @@ import { Binary } from "@coder/nbin";
|
|||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import * as os from "os";
|
import * as os from "os";
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
|
import { platform } from "../../../build/platform";
|
||||||
|
|
||||||
const target = `${os.platform()}-${os.arch()}`;
|
const target = `${platform()}-${os.arch()}`;
|
||||||
const rootDir = path.join(__dirname, "..");
|
const rootDir = path.join(__dirname, "..");
|
||||||
const bin = new Binary({
|
const bin = new Binary({
|
||||||
mainFile: path.join(rootDir, "out", "cli.js"),
|
mainFile: path.join(rootDir, "out", "cli.js"),
|
||||||
|
target: platform() === "darwin" ? "darwin" : platform() === "musl" ? "alpine" : "linux",
|
||||||
});
|
});
|
||||||
bin.writeFiles(path.join(rootDir, "build", "**"));
|
bin.writeFiles(path.join(rootDir, "build", "**"));
|
||||||
bin.writeFiles(path.join(rootDir, "out", "**"));
|
bin.writeFiles(path.join(rootDir, "out", "**"));
|
||||||
|
[
|
||||||
|
// Native modules. These are marked as externals in the webpack config.
|
||||||
|
"spdlog",
|
||||||
|
"node-pty",
|
||||||
|
|
||||||
|
// These are spdlog's dependencies.
|
||||||
|
"mkdirp", "bindings",
|
||||||
|
].forEach((name) => {
|
||||||
|
bin.writeModule(path.join(__dirname, "../../../node_modules", name));
|
||||||
|
});
|
||||||
bin.build().then((binaryData) => {
|
bin.build().then((binaryData) => {
|
||||||
const outputPath = path.join(__dirname, "..", `cli-${target}`);
|
const outputPath = path.join(__dirname, "..", `cli-${target}`);
|
||||||
fs.writeFileSync(outputPath, binaryData);
|
fs.writeFileSync(outputPath, binaryData);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { field, logger } from "@coder/logger";
|
import { field, logger } from "@coder/logger";
|
||||||
import { ServerMessage, SharedProcessActive } from "@coder/protocol/src/proto";
|
import { ServerMessage, SharedProcessActive } from "@coder/protocol/src/proto";
|
||||||
import { ChildProcess, fork, ForkOptions, spawn } from "child_process";
|
import { withEnv } from "@coder/protocol";
|
||||||
|
import { ChildProcess, fork, ForkOptions } from "child_process";
|
||||||
import { randomFillSync } from "crypto";
|
import { randomFillSync } from "crypto";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import * as fse from "fs-extra";
|
import * as fse from "fs-extra";
|
||||||
@@ -8,30 +9,37 @@ import * as os from "os";
|
|||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import * as WebSocket from "ws";
|
import * as WebSocket from "ws";
|
||||||
import { buildDir, cacheHome, dataHome, isCli, serveStatic } from "./constants";
|
import { buildDir, cacheHome, dataHome, isCli, serveStatic } from "./constants";
|
||||||
import { setup as setupNativeModules } from "./modules";
|
|
||||||
import { createApp } from "./server";
|
import { createApp } from "./server";
|
||||||
import { forkModule, requireFork, requireModule } from "./vscode/bootstrapFork";
|
import { forkModule, requireModule } from "./vscode/bootstrapFork";
|
||||||
import { SharedProcess, SharedProcessState } from "./vscode/sharedProcess";
|
import { SharedProcess, SharedProcessState } from "./vscode/sharedProcess";
|
||||||
import opn = require("opn");
|
import opn = require("opn");
|
||||||
|
|
||||||
import * as commander from "commander";
|
import * as commander from "commander";
|
||||||
|
|
||||||
|
const collect = <T>(value: T, previous: T[]): T[] => {
|
||||||
|
return previous.concat(value);
|
||||||
|
};
|
||||||
|
|
||||||
commander.version(process.env.VERSION || "development")
|
commander.version(process.env.VERSION || "development")
|
||||||
.name("code-server")
|
.name("code-server")
|
||||||
.description("Run VS Code on a remote server.")
|
.description("Run VS Code on a remote server.")
|
||||||
.option("--cert <value>")
|
.option("--cert <value>")
|
||||||
.option("--cert-key <value>")
|
.option("--cert-key <value>")
|
||||||
.option("-e, --extensions-dir <dir>", "Set the root path for extensions.")
|
.option("-e, --extensions-dir <dir>", "Override the main default path for user extensions.")
|
||||||
.option("-d --user-data-dir <dir>", " Specifies the directory that user data is kept in, useful when running as root.")
|
.option("--extra-extensions-dir [dir]", "Path to an extra user extension directory (repeatable).", collect, [])
|
||||||
|
.option("--extra-builtin-extensions-dir [dir]", "Path to an extra built-in extension directory (repeatable).", collect, [])
|
||||||
|
.option("-d --user-data-dir <dir>", "Specifies the directory that user data is kept in, useful when running as root.")
|
||||||
.option("--data-dir <value>", "DEPRECATED: Use '--user-data-dir' instead. Customize where user-data is stored.")
|
.option("--data-dir <value>", "DEPRECATED: Use '--user-data-dir' instead. Customize where user-data is stored.")
|
||||||
.option("-h, --host <value>", "Customize the hostname.", "0.0.0.0")
|
.option("-h, --host <value>", "Customize the hostname.", "0.0.0.0")
|
||||||
.option("-o, --open", "Open in the browser on startup.", false)
|
.option("-o, --open", "Open in the browser on startup.", false)
|
||||||
.option("-p, --port <number>", "Port to bind on.", 8443)
|
.option("-p, --port <number>", "Port to bind on.", parseInt(process.env.PORT!, 10) || 8443)
|
||||||
.option("-N, --no-auth", "Start without requiring authentication.", undefined)
|
.option("-N, --no-auth", "Start without requiring authentication.", false)
|
||||||
.option("-H, --allow-http", "Allow http connections.", false)
|
.option("-H, --allow-http", "Allow http connections.", false)
|
||||||
.option("-P, --password <value>", "Specify a password for authentication.")
|
.option("-P, --password <value>", "DEPRECATED: Use the PASSWORD environment variable instead. Specify a password for authentication.")
|
||||||
|
.option("--disable-telemetry", "Disables ALL telemetry.", false)
|
||||||
|
.option("--socket <value>", "Listen on a UNIX socket. Host and port will be ignored when set.")
|
||||||
|
.option("--install-extension <value>", "Install an extension by its ID.")
|
||||||
.option("--bootstrap-fork <name>", "Used for development. Never set.")
|
.option("--bootstrap-fork <name>", "Used for development. Never set.")
|
||||||
.option("--fork <name>", "Used for development. Never set.")
|
|
||||||
.option("--extra-args <args>", "Used for development. Never set.")
|
.option("--extra-args <args>", "Used for development. Never set.")
|
||||||
.arguments("Specify working directory.")
|
.arguments("Specify working directory.")
|
||||||
.parse(process.argv);
|
.parse(process.argv);
|
||||||
@@ -39,6 +47,7 @@ commander.version(process.env.VERSION || "development")
|
|||||||
Error.stackTraceLimit = Infinity;
|
Error.stackTraceLimit = Infinity;
|
||||||
if (isCli) {
|
if (isCli) {
|
||||||
require("nbin").shimNativeFs(buildDir);
|
require("nbin").shimNativeFs(buildDir);
|
||||||
|
require("nbin").shimNativeFs("/node_modules");
|
||||||
}
|
}
|
||||||
// Makes strings or numbers bold in stdout
|
// Makes strings or numbers bold in stdout
|
||||||
const bold = (text: string | number): string | number => {
|
const bold = (text: string | number): string | number => {
|
||||||
@@ -52,21 +61,30 @@ const bold = (text: string | number): string | number => {
|
|||||||
readonly allowHttp: boolean;
|
readonly allowHttp: boolean;
|
||||||
readonly host: string;
|
readonly host: string;
|
||||||
readonly port: number;
|
readonly port: number;
|
||||||
|
readonly disableTelemetry: boolean;
|
||||||
|
|
||||||
readonly userDataDir?: string;
|
readonly userDataDir?: string;
|
||||||
readonly extensionsDir?: string;
|
readonly extensionsDir?: string;
|
||||||
|
readonly extraExtensionsDir?: string[];
|
||||||
|
readonly extraBuiltinExtensionsDir?: string[];
|
||||||
|
|
||||||
readonly dataDir?: string;
|
readonly dataDir?: string;
|
||||||
readonly password?: string;
|
readonly password?: string;
|
||||||
readonly open?: boolean;
|
readonly open?: boolean;
|
||||||
readonly cert?: string;
|
readonly cert?: string;
|
||||||
readonly certKey?: string;
|
readonly certKey?: string;
|
||||||
|
readonly socket?: string;
|
||||||
|
|
||||||
|
readonly installExtension?: string;
|
||||||
|
|
||||||
readonly bootstrapFork?: string;
|
readonly bootstrapFork?: string;
|
||||||
readonly fork?: string;
|
|
||||||
readonly extraArgs?: string;
|
readonly extraArgs?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (options.disableTelemetry) {
|
||||||
|
process.env.DISABLE_TELEMETRY = "true";
|
||||||
|
}
|
||||||
|
|
||||||
// Commander has an exception for `--no` prefixes. Here we'll adjust that.
|
// Commander has an exception for `--no` prefixes. Here we'll adjust that.
|
||||||
// tslint:disable-next-line:no-any
|
// tslint:disable-next-line:no-any
|
||||||
const noAuthValue = (commander as any).auth;
|
const noAuthValue = (commander as any).auth;
|
||||||
@@ -74,7 +92,11 @@ const bold = (text: string | number): string | number => {
|
|||||||
|
|
||||||
const dataDir = path.resolve(options.userDataDir || options.dataDir || path.join(dataHome, "code-server"));
|
const dataDir = path.resolve(options.userDataDir || options.dataDir || path.join(dataHome, "code-server"));
|
||||||
const extensionsDir = options.extensionsDir ? path.resolve(options.extensionsDir) : path.resolve(dataDir, "extensions");
|
const extensionsDir = options.extensionsDir ? path.resolve(options.extensionsDir) : path.resolve(dataDir, "extensions");
|
||||||
|
const builtInExtensionsDir = path.resolve(buildDir || path.join(__dirname, ".."), "build/extensions");
|
||||||
|
const extraExtensionDirs = options.extraExtensionsDir ? options.extraExtensionsDir.map((p) => path.resolve(p)) : [];
|
||||||
|
const extraBuiltinExtensionDirs = options.extraBuiltinExtensionsDir ? options.extraBuiltinExtensionsDir.map((p) => path.resolve(p)) : [];
|
||||||
const workingDir = path.resolve(args[0] || process.cwd());
|
const workingDir = path.resolve(args[0] || process.cwd());
|
||||||
|
const dependenciesDir = path.join(os.tmpdir(), "code-server/dependencies");
|
||||||
|
|
||||||
if (!fs.existsSync(dataDir)) {
|
if (!fs.existsSync(dataDir)) {
|
||||||
const oldDataDir = path.resolve(path.join(os.homedir(), ".code-server"));
|
const oldDataDir = path.resolve(path.join(os.homedir(), ".code-server"));
|
||||||
@@ -89,10 +111,24 @@ const bold = (text: string | number): string | number => {
|
|||||||
fse.mkdirp(dataDir),
|
fse.mkdirp(dataDir),
|
||||||
fse.mkdirp(extensionsDir),
|
fse.mkdirp(extensionsDir),
|
||||||
fse.mkdirp(workingDir),
|
fse.mkdirp(workingDir),
|
||||||
|
fse.mkdirp(dependenciesDir),
|
||||||
|
...extraExtensionDirs.map((p) => fse.mkdirp(p)),
|
||||||
|
...extraBuiltinExtensionDirs.map((p) => fse.mkdirp(p)),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
setupNativeModules(dataDir);
|
const unpackExecutable = (binaryName: string): void => {
|
||||||
const builtInExtensionsDir = path.resolve(buildDir || path.join(__dirname, ".."), "build/extensions");
|
const memFile = path.join(isCli ? buildDir! : path.join(__dirname, ".."), "build/dependencies", binaryName);
|
||||||
|
const diskFile = path.join(dependenciesDir, binaryName);
|
||||||
|
if (!fse.existsSync(diskFile)) {
|
||||||
|
fse.writeFileSync(diskFile, fse.readFileSync(memFile));
|
||||||
|
}
|
||||||
|
fse.chmodSync(diskFile, "755");
|
||||||
|
};
|
||||||
|
|
||||||
|
unpackExecutable("rg");
|
||||||
|
// tslint:disable-next-line no-any
|
||||||
|
(<any>global).RIPGREP_LOCATION = path.join(dependenciesDir, "rg");
|
||||||
|
|
||||||
if (options.bootstrapFork) {
|
if (options.bootstrapFork) {
|
||||||
const modulePath = options.bootstrapFork;
|
const modulePath = options.bootstrapFork;
|
||||||
if (!modulePath) {
|
if (!modulePath) {
|
||||||
@@ -100,19 +136,13 @@ const bold = (text: string | number): string | number => {
|
|||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
((options.extraArgs ? JSON.parse(options.extraArgs) : []) as string[]).forEach((arg, i) => {
|
process.argv = [
|
||||||
// [0] contains the binary running the script (`node` for example) and
|
process.argv[0],
|
||||||
// [1] contains the script name, so the arguments come after that.
|
process.argv[1],
|
||||||
process.argv[i + 2] = arg;
|
...(options.extraArgs ? JSON.parse(options.extraArgs) : []),
|
||||||
});
|
];
|
||||||
|
|
||||||
return requireModule(modulePath, dataDir, builtInExtensionsDir);
|
return requireModule(modulePath, builtInExtensionsDir);
|
||||||
}
|
|
||||||
|
|
||||||
if (options.fork) {
|
|
||||||
const modulePath = options.fork;
|
|
||||||
|
|
||||||
return requireFork(modulePath, JSON.parse(options.extraArgs!), builtInExtensionsDir);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const logDir = path.join(cacheHome, "code-server/logs", new Date().toISOString().replace(/[-:.TZ]/g, ""));
|
const logDir = path.join(cacheHome, "code-server/logs", new Date().toISOString().replace(/[-:.TZ]/g, ""));
|
||||||
@@ -156,10 +186,25 @@ const bold = (text: string | number): string | number => {
|
|||||||
logger.warn('"--data-dir" is deprecated. Use "--user-data-dir" instead.');
|
logger.warn('"--data-dir" is deprecated. Use "--user-data-dir" instead.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options.installExtension) {
|
||||||
|
const fork = forkModule("vs/code/node/cli", [
|
||||||
|
"--user-data-dir", dataDir,
|
||||||
|
"--builtin-extensions-dir", builtInExtensionsDir,
|
||||||
|
"--extensions-dir", extensionsDir,
|
||||||
|
"--install-extension", options.installExtension,
|
||||||
|
], withEnv({ env: { VSCODE_ALLOW_IO: "true" } }), dataDir);
|
||||||
|
|
||||||
|
fork.stdout.on("data", (d: Buffer) => d.toString().split("\n").forEach((l) => logger.info(l)));
|
||||||
|
fork.stderr.on("data", (d: Buffer) => d.toString().split("\n").forEach((l) => logger.error(l)));
|
||||||
|
fork.on("exit", () => process.exit());
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: fill in appropriate doc url
|
// TODO: fill in appropriate doc url
|
||||||
logger.info("Additional documentation: http://github.com/codercom/code-server");
|
logger.info("Additional documentation: http://github.com/cdr/code-server");
|
||||||
logger.info("Initializing", field("data-dir", dataDir), field("extensions-dir", extensionsDir), field("working-dir", workingDir), field("log-dir", logDir));
|
logger.info("Initializing", field("data-dir", dataDir), field("extensions-dir", extensionsDir), field("working-dir", workingDir), field("log-dir", logDir));
|
||||||
const sharedProcess = new SharedProcess(dataDir, extensionsDir, builtInExtensionsDir);
|
const sharedProcess = new SharedProcess(dataDir, extensionsDir, builtInExtensionsDir, extraExtensionDirs, extraBuiltinExtensionDirs);
|
||||||
const sendSharedProcessReady = (socket: WebSocket): void => {
|
const sendSharedProcessReady = (socket: WebSocket): void => {
|
||||||
const active = new SharedProcessActive();
|
const active = new SharedProcessActive();
|
||||||
active.setSocketPath(sharedProcess.socketPath);
|
active.setSocketPath(sharedProcess.socketPath);
|
||||||
@@ -174,7 +219,12 @@ const bold = (text: string | number): string | number => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let password = options.password;
|
if (options.password) {
|
||||||
|
logger.warn('"--password" is deprecated. Use the PASSWORD environment variable instead.');
|
||||||
|
}
|
||||||
|
|
||||||
|
let password = options.password || process.env.PASSWORD;
|
||||||
|
const usingCustomPassword = !!password;
|
||||||
if (!password) {
|
if (!password) {
|
||||||
// Generate a random password with a length of 24.
|
// Generate a random password with a length of 24.
|
||||||
const buffer = Buffer.alloc(12);
|
const buffer = Buffer.alloc(12);
|
||||||
@@ -187,20 +237,19 @@ const bold = (text: string | number): string | number => {
|
|||||||
allowHttp: options.allowHttp,
|
allowHttp: options.allowHttp,
|
||||||
bypassAuth: options.noAuth,
|
bypassAuth: options.noAuth,
|
||||||
registerMiddleware: (app): void => {
|
registerMiddleware: (app): void => {
|
||||||
app.use((req, res, next) => {
|
|
||||||
res.on("finish", () => {
|
|
||||||
logger.trace(`\u001B[1m${req.method} ${res.statusCode} \u001B[0m${req.url}`, field("host", req.hostname), field("ip", req.ip));
|
|
||||||
});
|
|
||||||
|
|
||||||
next();
|
|
||||||
});
|
|
||||||
// If we're not running from the binary and we aren't serving the static
|
// If we're not running from the binary and we aren't serving the static
|
||||||
// pre-built version, use webpack to serve the web files.
|
// pre-built version, use webpack to serve the web files.
|
||||||
if (!isCli && !serveStatic) {
|
if (!isCli && !serveStatic) {
|
||||||
const webpackConfig = require(path.resolve(__dirname, "..", "..", "web", "webpack.config.js"));
|
const webpackConfig = require(path.resolve(__dirname, "..", "..", "web", "webpack.config.js"));
|
||||||
const compiler = require("webpack")(webpackConfig);
|
const compiler = require("webpack")(webpackConfig);
|
||||||
app.use(require("webpack-dev-middleware")(compiler, {
|
app.use(require("webpack-dev-middleware")(compiler, {
|
||||||
logger,
|
logger: {
|
||||||
|
trace: (m: string): void => logger.trace("webpack", field("message", m)),
|
||||||
|
debug: (m: string): void => logger.debug("webpack", field("message", m)),
|
||||||
|
info: (m: string): void => logger.info("webpack", field("message", m)),
|
||||||
|
warn: (m: string): void => logger.warn("webpack", field("message", m)),
|
||||||
|
error: (m: string): void => logger.error("webpack", field("message", m)),
|
||||||
|
},
|
||||||
publicPath: webpackConfig.output.publicPath,
|
publicPath: webpackConfig.output.publicPath,
|
||||||
stats: webpackConfig.stats,
|
stats: webpackConfig.stats,
|
||||||
}));
|
}));
|
||||||
@@ -210,6 +259,8 @@ const bold = (text: string | number): string | number => {
|
|||||||
serverOptions: {
|
serverOptions: {
|
||||||
extensionsDirectory: extensionsDir,
|
extensionsDirectory: extensionsDir,
|
||||||
builtInExtensionsDirectory: builtInExtensionsDir,
|
builtInExtensionsDirectory: builtInExtensionsDir,
|
||||||
|
extraExtensionDirectories: extraExtensionDirs,
|
||||||
|
extraBuiltinExtensionDirectories: extraBuiltinExtensionDirs,
|
||||||
dataDirectory: dataDir,
|
dataDirectory: dataDir,
|
||||||
workingDirectory: workingDir,
|
workingDirectory: workingDir,
|
||||||
cacheDirectory: cacheHome,
|
cacheDirectory: cacheHome,
|
||||||
@@ -218,14 +269,7 @@ const bold = (text: string | number): string | number => {
|
|||||||
return forkModule(options.env.AMD_ENTRYPOINT, args, options, dataDir);
|
return forkModule(options.env.AMD_ENTRYPOINT, args, options, dataDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isCli) {
|
return fork(modulePath, args, options);
|
||||||
return spawn(process.execPath, [path.join(buildDir, "out", "cli.js"), "--fork", modulePath, "--extra-args", JSON.stringify(args), "--data-dir", dataDir], {
|
|
||||||
...options,
|
|
||||||
stdio: [null, null, null, "ipc"],
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
return fork(modulePath, args, options);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
password,
|
password,
|
||||||
@@ -236,7 +280,11 @@ const bold = (text: string | number): string | number => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
logger.info("Starting webserver...", field("host", options.host), field("port", options.port));
|
logger.info("Starting webserver...", field("host", options.host), field("port", options.port));
|
||||||
app.server.listen(options.port, options.host);
|
if (options.socket) {
|
||||||
|
app.server.listen(options.socket);
|
||||||
|
} else {
|
||||||
|
app.server.listen(options.port, options.host);
|
||||||
|
}
|
||||||
let clientId = 1;
|
let clientId = 1;
|
||||||
app.wss.on("connection", (ws, req) => {
|
app.wss.on("connection", (ws, req) => {
|
||||||
const id = clientId++;
|
const id = clientId++;
|
||||||
@@ -253,24 +301,32 @@ const bold = (text: string | number): string | number => {
|
|||||||
});
|
});
|
||||||
app.wss.on("error", (err: NodeJS.ErrnoException) => {
|
app.wss.on("error", (err: NodeJS.ErrnoException) => {
|
||||||
if (err.code === "EADDRINUSE") {
|
if (err.code === "EADDRINUSE") {
|
||||||
logger.error(`Port ${bold(options.port)} is in use. Please free up port ${options.port} or specify a different port with the -p flag`);
|
if (options.socket) {
|
||||||
|
logger.error(`Socket ${bold(options.socket)} is in use. Please specify a different socket.`);
|
||||||
|
} else {
|
||||||
|
logger.error(`Port ${bold(options.port)} is in use. Please free up port ${options.port} or specify a different port with the -p flag`);
|
||||||
|
}
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (!options.certKey && !options.cert) {
|
if (!options.certKey && !options.cert) {
|
||||||
logger.warn("No certificate specified. \u001B[1mThis could be insecure.");
|
logger.warn("No certificate specified. \u001B[1mThis could be insecure.");
|
||||||
// TODO: fill in appropriate doc url
|
// TODO: fill in appropriate doc url
|
||||||
logger.warn("Documentation on securing your setup: https://github.com/codercom/code-server/blob/master/doc/security/ssl.md");
|
logger.warn("Documentation on securing your setup: https://github.com/cdr/code-server/blob/master/doc/security/ssl.md");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!options.noAuth) {
|
if (!options.noAuth && !usingCustomPassword) {
|
||||||
logger.info(" ");
|
logger.info(" ");
|
||||||
logger.info(`Password:\u001B[1m ${password}`);
|
logger.info(`Password:\u001B[1m ${password}`);
|
||||||
} else {
|
} else {
|
||||||
logger.warn("Launched without authentication.");
|
logger.warn("Launched without authentication.");
|
||||||
}
|
}
|
||||||
|
if (options.disableTelemetry) {
|
||||||
|
logger.info("Telemetry is disabled");
|
||||||
|
}
|
||||||
|
|
||||||
const url = `http://localhost:${options.port}/`;
|
const protocol = options.allowHttp ? "http" : "https";
|
||||||
|
const url = `${protocol}://localhost:${options.port}/`;
|
||||||
logger.info(" ");
|
logger.info(" ");
|
||||||
logger.info("Started (click the link below to open):");
|
logger.info("Started (click the link below to open):");
|
||||||
logger.info(url);
|
logger.info(url);
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
import * as fs from "fs";
|
|
||||||
import * as path from "path";
|
|
||||||
import * as os from "os";
|
|
||||||
import { isCli, buildDir } from "./constants";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handling of native modules within the CLI
|
|
||||||
*/
|
|
||||||
export const setup = (dataDirectory: string): void => {
|
|
||||||
path.resolve(dataDirectory, "dependencies").split(path.sep).reduce((parentDir, childDir) => {
|
|
||||||
const currentDir = path.join(parentDir, childDir);
|
|
||||||
try {
|
|
||||||
fs.mkdirSync(currentDir);
|
|
||||||
} catch (ex) {
|
|
||||||
if (ex.code !== "EEXIST" && ex.code !== "EISDIR" && ex.code !== "ENOENT") {
|
|
||||||
throw ex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return currentDir;
|
|
||||||
}, os.platform() === "win32" ? undefined! : path.sep); // Might need path.sep here for linux. Having it for windows causes an error because \C:\Users ...
|
|
||||||
|
|
||||||
const unpackModule = (moduleName: string, markExecutable: boolean = false): void => {
|
|
||||||
const memFile = path.join(isCli ? buildDir! : path.join(__dirname, ".."), "build/dependencies", moduleName);
|
|
||||||
const diskFile = path.join(dataDirectory, "dependencies", moduleName);
|
|
||||||
if (!fs.existsSync(diskFile)) {
|
|
||||||
fs.writeFileSync(diskFile, fs.readFileSync(memFile));
|
|
||||||
}
|
|
||||||
if (markExecutable) {
|
|
||||||
fs.chmodSync(diskFile, "755");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* We need to unpack node-pty and patch its `loadNative` function to require our unpacked pty.node
|
|
||||||
* If pty.node isn't unpacked a SIGSEGV is thrown and the application exits. The exact reasoning
|
|
||||||
* for this is unknown ATM, but this patch works around it.
|
|
||||||
*/
|
|
||||||
unpackModule("pty.node");
|
|
||||||
unpackModule("spdlog.node");
|
|
||||||
unpackModule("rg", true);
|
|
||||||
// const nodePtyUtils = require("../../protocol/node_modules/node-pty-prebuilt/lib/utils") as typeof import("../../protocol/node_modules/node-pty-prebuilt/src/utils");
|
|
||||||
// tslint:disable-next-line:no-any
|
|
||||||
// nodePtyUtils.loadNative = (modName: string): any => {
|
|
||||||
// return (typeof __non_webpack_require__ !== "undefined" ? __non_webpack_require__ : require)(path.join(dataDirectory, "dependencies", modName + ".node"));
|
|
||||||
// };
|
|
||||||
(<any>global).RIPGREP_LOCATION = path.join(dataDirectory, "dependencies", "rg");
|
|
||||||
(<any>global).NODEPTY_LOCATION = path.join(dataDirectory, "dependencies", "pty.node");
|
|
||||||
// tslint:disable-next-line:no-any
|
|
||||||
(<any>global).SPDLOG_LOCATION = path.join(dataDirectory, "dependencies", "spdlog.node");
|
|
||||||
// tslint:disable-next-line:no-unused-expression
|
|
||||||
require("../../protocol/node_modules/node-pty-prebuilt/lib/index") as typeof import("../../protocol/node_modules/node-pty-prebuilt/src/index");
|
|
||||||
};
|
|
||||||
@@ -79,7 +79,11 @@ export const createPortScanner = (scanInterval: number = 5000): PortScanner => {
|
|||||||
logger.trace("scanning ports");
|
logger.trace("scanning ports");
|
||||||
scan((error) => {
|
scan((error) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
logger.error(`Port scanning will not be available: ${error.message}.`);
|
if ((error as NodeJS.ErrnoException).code === "ENOENT") {
|
||||||
|
logger.warn("Port scanning will not be available because netstat is not installed");
|
||||||
|
} else {
|
||||||
|
logger.warn(`Port scanning will not be available: ${error.message}`);
|
||||||
|
}
|
||||||
disposed = true;
|
disposed = true;
|
||||||
} else if (!disposed) {
|
} else if (!disposed) {
|
||||||
lastTimeout = setTimeout(doInterval, scanInterval);
|
lastTimeout = setTimeout(doInterval, scanInterval);
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import * as os from "os";
|
|||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import * as pem from "pem";
|
import * as pem from "pem";
|
||||||
import * as util from "util";
|
import * as util from "util";
|
||||||
|
import * as url from "url";
|
||||||
import * as ws from "ws";
|
import * as ws from "ws";
|
||||||
import { buildDir } from "./constants";
|
import { buildDir } from "./constants";
|
||||||
import { createPortScanner } from "./portScanner";
|
import { createPortScanner } from "./portScanner";
|
||||||
@@ -132,7 +133,7 @@ export const createApp = async (options: CreateAppOptions): Promise<{
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const server = httpolyglot.createServer(options.bypassAuth ? {} : options.httpsOptions || certs, app) as http.Server;
|
const server = httpolyglot.createServer(options.allowHttp ? {} : options.httpsOptions || certs, app) as http.Server;
|
||||||
const wss = new ws.Server({ server });
|
const wss = new ws.Server({ server });
|
||||||
|
|
||||||
wss.shouldHandle = (req): boolean => {
|
wss.shouldHandle = (req): boolean => {
|
||||||
@@ -140,13 +141,13 @@ export const createApp = async (options: CreateAppOptions): Promise<{
|
|||||||
};
|
};
|
||||||
|
|
||||||
const portScanner = createPortScanner();
|
const portScanner = createPortScanner();
|
||||||
wss.on("connection", (ws, req) => {
|
wss.on("connection", async (ws, req) => {
|
||||||
if (req.url && req.url.startsWith("/tunnel")) {
|
if (req.url && req.url.startsWith("/tunnel")) {
|
||||||
try {
|
try {
|
||||||
const rawPort = req.url.split("/").pop();
|
const rawPort = req.url.split("/").pop();
|
||||||
const port = Number.parseInt(rawPort!, 10);
|
const port = Number.parseInt(rawPort!, 10);
|
||||||
|
|
||||||
handleTunnel(ws, port);
|
await handleTunnel(ws, port);
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
ws.close(TunnelCloseCode.Error, ex.toString());
|
ws.close(TunnelCloseCode.Error, ex.toString());
|
||||||
}
|
}
|
||||||
@@ -189,31 +190,70 @@ export const createApp = async (options: CreateAppOptions): Promise<{
|
|||||||
new Server(connection, options.serverOptions);
|
new Server(connection, options.serverOptions);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const redirect = (
|
||||||
|
req: express.Request, res: express.Response,
|
||||||
|
to: string = "", from: string = "",
|
||||||
|
code: number = 302, protocol: string = req.protocol,
|
||||||
|
): void => {
|
||||||
|
const currentUrl = `${protocol}://${req.headers.host}${req.originalUrl}`;
|
||||||
|
const newUrl = url.parse(currentUrl);
|
||||||
|
if (from && newUrl.pathname) {
|
||||||
|
newUrl.pathname = newUrl.pathname.replace(new RegExp(`\/${from}\/?$`), "/");
|
||||||
|
}
|
||||||
|
if (to) {
|
||||||
|
newUrl.pathname = (newUrl.pathname || "").replace(/\/$/, "") + `/${to}`;
|
||||||
|
}
|
||||||
|
newUrl.path = undefined; // Path is not necessary for format().
|
||||||
|
const newUrlString = url.format(newUrl);
|
||||||
|
logger.trace(`Redirecting from ${currentUrl} to ${newUrlString}`);
|
||||||
|
|
||||||
|
return res.redirect(code, newUrlString);
|
||||||
|
};
|
||||||
|
|
||||||
const baseDir = buildDir || path.join(__dirname, "..");
|
const baseDir = buildDir || path.join(__dirname, "..");
|
||||||
const authStaticFunc = expressStaticGzip(path.join(baseDir, "build/web/auth"));
|
const staticGzip = expressStaticGzip(path.join(baseDir, "build/web"));
|
||||||
const unauthStaticFunc = expressStaticGzip(path.join(baseDir, "build/web/unauth"));
|
|
||||||
app.use((req, res, next) => {
|
app.use((req, res, next) => {
|
||||||
|
logger.trace(`\u001B[1m${req.method} ${res.statusCode} \u001B[0m${req.originalUrl}`, field("host", req.hostname), field("ip", req.ip));
|
||||||
|
|
||||||
|
// Force HTTPS unless allowing HTTP.
|
||||||
if (!isEncrypted(req.socket) && !options.allowHttp) {
|
if (!isEncrypted(req.socket) && !options.allowHttp) {
|
||||||
return res.redirect(301, `https://${req.headers.host!}${req.path}`);
|
return redirect(req, res, "", "", 301, "https");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isAuthed(req)) {
|
|
||||||
// We can serve the actual VSCode bin
|
|
||||||
authStaticFunc(req, res, next);
|
|
||||||
} else {
|
|
||||||
// Serve only the unauthed version
|
|
||||||
unauthStaticFunc(req, res, next);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// @ts-ignore
|
|
||||||
app.use((err, req, res, next) => {
|
|
||||||
next();
|
next();
|
||||||
});
|
});
|
||||||
app.get("/ping", (req, res) => {
|
|
||||||
|
// @ts-ignore
|
||||||
|
app.use((err, _req, _res, next) => {
|
||||||
|
logger.error(err.message);
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
|
||||||
|
// If not authenticated, redirect to the login page.
|
||||||
|
app.get("/", (req, res, next) => {
|
||||||
|
if (!isAuthed(req)) {
|
||||||
|
return redirect(req, res, "login");
|
||||||
|
}
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
|
||||||
|
// If already authenticated, redirect back to the root.
|
||||||
|
app.get("/login", (req, res, next) => {
|
||||||
|
if (isAuthed(req)) {
|
||||||
|
return redirect(req, res, "", "login");
|
||||||
|
}
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
|
||||||
|
// For getting general server data.
|
||||||
|
app.get("/ping", (_req, res) => {
|
||||||
res.json({
|
res.json({
|
||||||
hostname: os.hostname(),
|
hostname: os.hostname(),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// For getting a resource on disk.
|
||||||
app.get("/resource/:url(*)", async (req, res) => {
|
app.get("/resource/:url(*)", async (req, res) => {
|
||||||
if (!ensureAuthed(req, res)) {
|
if (!ensureAuthed(req, res)) {
|
||||||
return;
|
return;
|
||||||
@@ -254,6 +294,8 @@ export const createApp = async (options: CreateAppOptions): Promise<{
|
|||||||
res.end();
|
res.end();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// For writing a resource to disk.
|
||||||
app.post("/resource/:url(*)", async (req, res) => {
|
app.post("/resource/:url(*)", async (req, res) => {
|
||||||
if (!ensureAuthed(req, res)) {
|
if (!ensureAuthed(req, res)) {
|
||||||
return;
|
return;
|
||||||
@@ -271,7 +313,7 @@ export const createApp = async (options: CreateAppOptions): Promise<{
|
|||||||
const body = data.join("");
|
const body = data.join("");
|
||||||
await mkdirp(path.dirname(fullPath));
|
await mkdirp(path.dirname(fullPath));
|
||||||
fs.writeFileSync(fullPath, body);
|
fs.writeFileSync(fullPath, body);
|
||||||
logger.debug("Wrote resource", field("path", fullPath), field("content-length", body.length));
|
logger.info("Wrote resource", field("path", fullPath), field("content-length", body.length));
|
||||||
res.status(200);
|
res.status(200);
|
||||||
res.end();
|
res.end();
|
||||||
});
|
});
|
||||||
@@ -282,6 +324,9 @@ export const createApp = async (options: CreateAppOptions): Promise<{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Everything else just pulls from the static build directory.
|
||||||
|
app.use(staticGzip);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
express: app,
|
express: app,
|
||||||
server,
|
server,
|
||||||
|
|||||||
@@ -42,54 +42,13 @@ const requireFilesystemModule = (id: string, builtInExtensionsDir: string): any
|
|||||||
return customMod.require(id);
|
return customMod.require(id);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
export const requireModule = (modulePath: string, builtInExtensionsDir: string): void => {
|
||||||
* Called from forking a module
|
|
||||||
*/
|
|
||||||
export const requireFork = (modulePath: string, args: string[], builtInExtensionsDir: string): void => {
|
|
||||||
const Module = require("module") as typeof import("module");
|
|
||||||
const oldRequire = Module.prototype.require;
|
|
||||||
// tslint:disable-next-line:no-any
|
|
||||||
const oldLoad = (Module as any)._findPath;
|
|
||||||
// @ts-ignore
|
|
||||||
(Module as any)._findPath = function (request, parent, isMain): any {
|
|
||||||
const lookupPaths = oldLoad.call(this, request, parent, isMain);
|
|
||||||
|
|
||||||
return lookupPaths;
|
|
||||||
};
|
|
||||||
// tslint:disable-next-line:no-any
|
|
||||||
Module.prototype.require = function (id: string): any {
|
|
||||||
if (id === "typescript") {
|
|
||||||
return require("typescript");
|
|
||||||
}
|
|
||||||
|
|
||||||
// tslint:disable-next-line:no-any
|
|
||||||
return oldRequire.call(this, id as any);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!process.send) {
|
|
||||||
throw new Error("No IPC messaging initialized");
|
|
||||||
}
|
|
||||||
|
|
||||||
process.argv = ["", "", ...args];
|
|
||||||
requireFilesystemModule(modulePath, builtInExtensionsDir);
|
|
||||||
|
|
||||||
if (ipcMsgBuffer && ipcMsgListener) {
|
|
||||||
process.removeListener("message", ipcMsgListener);
|
|
||||||
// tslint:disable-next-line:no-any
|
|
||||||
ipcMsgBuffer.forEach((i) => process.emit("message" as any, i as any));
|
|
||||||
ipcMsgBuffer = undefined;
|
|
||||||
ipcMsgListener = undefined;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const requireModule = (modulePath: string, dataDir: string, builtInExtensionsDir: string): void => {
|
|
||||||
process.env.AMD_ENTRYPOINT = modulePath;
|
process.env.AMD_ENTRYPOINT = modulePath;
|
||||||
const xml = require("xhr2");
|
const xml = require("xhr2");
|
||||||
xml.XMLHttpRequest.prototype._restrictedHeaders["user-agent"] = false;
|
xml.XMLHttpRequest.prototype._restrictedHeaders["user-agent"] = false;
|
||||||
// tslint:disable-next-line no-any this makes installing extensions work.
|
// tslint:disable-next-line no-any this makes installing extensions work.
|
||||||
(global as any).XMLHttpRequest = xml.XMLHttpRequest;
|
(global as any).XMLHttpRequest = xml.XMLHttpRequest;
|
||||||
|
|
||||||
const mod = require("module") as typeof import("module");
|
|
||||||
const promiseFinally = require("promise.prototype.finally") as { shim: () => void };
|
const promiseFinally = require("promise.prototype.finally") as { shim: () => void };
|
||||||
promiseFinally.shim();
|
promiseFinally.shim();
|
||||||
/**
|
/**
|
||||||
@@ -102,16 +61,7 @@ export const requireModule = (modulePath: string, dataDir: string, builtInExtens
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (isCli) {
|
if (isCli) {
|
||||||
/**
|
process.env.NBIN_BYPASS = "true";
|
||||||
* Needed for properly forking external modules within the CLI
|
|
||||||
*/
|
|
||||||
// tslint:disable-next-line:no-any
|
|
||||||
(<any>cp).fork = (modulePath: string, args: ReadonlyArray<string> = [], options?: cp.ForkOptions): cp.ChildProcess => {
|
|
||||||
return cp.spawn(process.execPath, [path.join(buildDir, "out", "cli.js"), "--fork", modulePath, "--extra-args", JSON.stringify(args), "--data-dir", dataDir], {
|
|
||||||
...options,
|
|
||||||
stdio: [null, null, null, "ipc"],
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const baseDir = path.join(buildDir, "build");
|
const baseDir = path.join(buildDir, "build");
|
||||||
@@ -132,7 +82,6 @@ export const requireModule = (modulePath: string, dataDir: string, builtInExtens
|
|||||||
* @param modulePath Path of the VS Code module to load.
|
* @param modulePath Path of the VS Code module to load.
|
||||||
*/
|
*/
|
||||||
export const forkModule = (modulePath: string, args?: string[], options?: cp.ForkOptions, dataDir?: string): cp.ChildProcess => {
|
export const forkModule = (modulePath: string, args?: string[], options?: cp.ForkOptions, dataDir?: string): cp.ChildProcess => {
|
||||||
let proc: cp.ChildProcess;
|
|
||||||
const forkOptions: cp.ForkOptions = {
|
const forkOptions: cp.ForkOptions = {
|
||||||
stdio: [null, null, null, "ipc"],
|
stdio: [null, null, null, "ipc"],
|
||||||
};
|
};
|
||||||
@@ -141,18 +90,27 @@ export const forkModule = (modulePath: string, args?: string[], options?: cp.For
|
|||||||
delete options.env.ELECTRON_RUN_AS_NODE;
|
delete options.env.ELECTRON_RUN_AS_NODE;
|
||||||
forkOptions.env = options.env;
|
forkOptions.env = options.env;
|
||||||
}
|
}
|
||||||
|
|
||||||
const forkArgs = ["--bootstrap-fork", modulePath];
|
const forkArgs = ["--bootstrap-fork", modulePath];
|
||||||
if (args) {
|
if (args) {
|
||||||
forkArgs.push("--extra-args", JSON.stringify(args));
|
forkArgs.push("--extra-args", JSON.stringify(args));
|
||||||
}
|
}
|
||||||
if (dataDir) {
|
if (dataDir) {
|
||||||
forkArgs.push("--data-dir", dataDir);
|
forkArgs.push("--user-data-dir", dataDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const nodeArgs = [];
|
||||||
if (isCli) {
|
if (isCli) {
|
||||||
proc = cp.spawn(process.execPath, [path.join(buildDir, "out", "cli.js"), ...forkArgs], forkOptions);
|
nodeArgs.push(path.join(buildDir, "out", "cli.js"));
|
||||||
} else {
|
} else {
|
||||||
proc = cp.spawn(process.execPath, ["--require", "ts-node/register", "--require", "tsconfig-paths/register", process.argv[1], ...forkArgs], forkOptions);
|
nodeArgs.push(
|
||||||
|
"--require", "ts-node/register",
|
||||||
|
"--require", "tsconfig-paths/register",
|
||||||
|
process.argv[1],
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const proc = cp.spawn(process.execPath, [...nodeArgs, ...forkArgs], forkOptions);
|
||||||
if (args && args[0] === "--type=watcherService" && os.platform() === "linux") {
|
if (args && args[0] === "--type=watcherService" && os.platform() === "linux") {
|
||||||
cp.exec(`renice -n 19 -p ${proc.pid}`, (error) => {
|
cp.exec(`renice -n 19 -p ${proc.pid}`, (error) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import { ChildProcess } from "child_process";
|
import { ChildProcess } from "child_process";
|
||||||
import * as fs from "fs";
|
|
||||||
import * as fse from "fs-extra";
|
|
||||||
import * as os from "os";
|
import * as os from "os";
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import { forkModule } from "./bootstrapFork";
|
import { forkModule } from "./bootstrapFork";
|
||||||
@@ -8,7 +6,8 @@ import { StdioIpcHandler } from "../ipc";
|
|||||||
import { ParsedArgs } from "vs/platform/environment/common/environment";
|
import { ParsedArgs } from "vs/platform/environment/common/environment";
|
||||||
import { Emitter } from "@coder/events/src";
|
import { Emitter } from "@coder/events/src";
|
||||||
import { retry } from "@coder/ide/src/retry";
|
import { retry } from "@coder/ide/src/retry";
|
||||||
import { logger, Level } from "@coder/logger";
|
import { logger, field, Level } from "@coder/logger";
|
||||||
|
import { withEnv } from "@coder/protocol";
|
||||||
|
|
||||||
export enum SharedProcessState {
|
export enum SharedProcessState {
|
||||||
Stopped,
|
Stopped,
|
||||||
@@ -40,6 +39,8 @@ export class SharedProcess {
|
|||||||
private readonly userDataDir: string,
|
private readonly userDataDir: string,
|
||||||
private readonly extensionsDir: string,
|
private readonly extensionsDir: string,
|
||||||
private readonly builtInExtensionsDir: string,
|
private readonly builtInExtensionsDir: string,
|
||||||
|
private readonly extraExtensionDirs: string[],
|
||||||
|
private readonly extraBuiltinExtensionDirs: string[],
|
||||||
) {
|
) {
|
||||||
this.retry.run();
|
this.retry.run();
|
||||||
}
|
}
|
||||||
@@ -90,22 +91,10 @@ export class SharedProcess {
|
|||||||
this.activeProcess.kill();
|
this.activeProcess.kill();
|
||||||
}
|
}
|
||||||
|
|
||||||
const backupsDir = path.join(this.userDataDir, "Backups");
|
const activeProcess = forkModule(
|
||||||
await Promise.all([
|
"vs/code/electron-browser/sharedProcess/sharedProcessMain", [],
|
||||||
fse.mkdirp(backupsDir),
|
withEnv({ env: { VSCODE_ALLOW_IO: "true" } }), this.userDataDir,
|
||||||
]);
|
);
|
||||||
|
|
||||||
const workspacesFile = path.join(backupsDir, "workspaces.json");
|
|
||||||
if (!fs.existsSync(workspacesFile)) {
|
|
||||||
fs.appendFileSync(workspacesFile, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
const activeProcess = forkModule("vs/code/electron-browser/sharedProcess/sharedProcessMain", [], {
|
|
||||||
env: {
|
|
||||||
VSCODE_ALLOW_IO: "true",
|
|
||||||
VSCODE_LOGS: process.env.VSCODE_LOGS,
|
|
||||||
},
|
|
||||||
}, this.userDataDir);
|
|
||||||
this.activeProcess = activeProcess;
|
this.activeProcess = activeProcess;
|
||||||
|
|
||||||
await new Promise((resolve, reject): void => {
|
await new Promise((resolve, reject): void => {
|
||||||
@@ -127,13 +116,13 @@ export class SharedProcess {
|
|||||||
activeProcess.on("exit", doReject);
|
activeProcess.on("exit", doReject);
|
||||||
|
|
||||||
activeProcess.stdout.on("data", (data) => {
|
activeProcess.stdout.on("data", (data) => {
|
||||||
logger.trace(data.toString());
|
logger.trace("stdout", field("data", data.toString()));
|
||||||
});
|
});
|
||||||
|
|
||||||
activeProcess.stderr.on("data", (data) => {
|
activeProcess.stderr.on("data", (data) => {
|
||||||
// Warn instead of error to prevent panic. It's unlikely stderr here is
|
// Warn instead of error to prevent panic. It's unlikely stderr here is
|
||||||
// about anything critical to the functioning of the editor.
|
// about anything critical to the functioning of the editor.
|
||||||
logger.warn(data.toString());
|
logger.warn("stderr", field("data", data.toString()));
|
||||||
});
|
});
|
||||||
|
|
||||||
this.ipcHandler = new StdioIpcHandler(activeProcess);
|
this.ipcHandler = new StdioIpcHandler(activeProcess);
|
||||||
@@ -147,6 +136,8 @@ export class SharedProcess {
|
|||||||
"builtin-extensions-dir": this.builtInExtensionsDir,
|
"builtin-extensions-dir": this.builtInExtensionsDir,
|
||||||
"user-data-dir": this.userDataDir,
|
"user-data-dir": this.userDataDir,
|
||||||
"extensions-dir": this.extensionsDir,
|
"extensions-dir": this.extensionsDir,
|
||||||
|
"extra-extension-dirs": this.extraExtensionDirs,
|
||||||
|
"extra-builtin-extension-dirs": this.extraBuiltinExtensionDirs,
|
||||||
},
|
},
|
||||||
logLevel: this.logger.level,
|
logLevel: this.logger.level,
|
||||||
sharedIPCHandle: this.socketPath,
|
sharedIPCHandle: this.socketPath,
|
||||||
|
|||||||
@@ -6,14 +6,12 @@ const root = path.resolve(__dirname, "../..");
|
|||||||
|
|
||||||
module.exports = merge(
|
module.exports = merge(
|
||||||
require(path.join(root, "scripts/webpack.node.config.js"))({
|
require(path.join(root, "scripts/webpack.node.config.js"))({
|
||||||
// Config options.
|
dirname: __dirname,
|
||||||
}), {
|
}), {
|
||||||
output: {
|
output: {
|
||||||
filename: "cli.js",
|
filename: "cli.js",
|
||||||
path: path.join(__dirname, "out"),
|
|
||||||
libraryTarget: "commonjs",
|
libraryTarget: "commonjs",
|
||||||
},
|
},
|
||||||
mode: "production",
|
|
||||||
node: {
|
node: {
|
||||||
console: false,
|
console: false,
|
||||||
global: false,
|
global: false,
|
||||||
@@ -23,14 +21,8 @@ module.exports = merge(
|
|||||||
__dirname: false,
|
__dirname: false,
|
||||||
setImmediate: false
|
setImmediate: false
|
||||||
},
|
},
|
||||||
resolve: {
|
|
||||||
alias: {
|
|
||||||
"node-pty": "node-pty-prebuilt",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
externals: {
|
externals: {
|
||||||
"nbin": "commonjs nbin",
|
"nbin": "commonjs nbin",
|
||||||
"fsevents": "fsevents",
|
|
||||||
},
|
},
|
||||||
entry: "./packages/server/src/cli.ts",
|
entry: "./packages/server/src/cli.ts",
|
||||||
plugins: [
|
plugins: [
|
||||||
|
|||||||
@@ -7,10 +7,10 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@coder/logger/-/logger-1.0.3.tgz#e0e1ae5496fde5a3c6ef3d748fdfb26a55add8b8"
|
resolved "https://registry.yarnpkg.com/@coder/logger/-/logger-1.0.3.tgz#e0e1ae5496fde5a3c6ef3d748fdfb26a55add8b8"
|
||||||
integrity sha512-1o5qDZX2VZUNnzgz5KfAdMnaqaX6FNeTs0dUdg73MRHfQW94tFTIryFC1xTTCuzxGDjVHOHkaUAI4uHA2bheOA==
|
integrity sha512-1o5qDZX2VZUNnzgz5KfAdMnaqaX6FNeTs0dUdg73MRHfQW94tFTIryFC1xTTCuzxGDjVHOHkaUAI4uHA2bheOA==
|
||||||
|
|
||||||
"@coder/nbin@^1.0.7":
|
"@coder/nbin@^1.1.2":
|
||||||
version "1.0.7"
|
version "1.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/@coder/nbin/-/nbin-1.0.7.tgz#fc6adeb8366bf9d7dc7c301ce0be9e741eccf14b"
|
resolved "https://registry.yarnpkg.com/@coder/nbin/-/nbin-1.1.2.tgz#3af9e4368f37532da446c7c291d476bb52de995d"
|
||||||
integrity sha512-HkCFJnYyFuPaAjk6O8IcafEEBYlHG63SqxgwB0QSyUGwjq/hUekgB23BnKmywbcxNIuX26b9j2AGWt/DBdJlXA==
|
integrity sha512-MkwKpmu1SU9wkBwQ+bZVU2nPzENWUa3Isut9osVq3LG+udovsk+k5c5rjfJ1q8cf4km5snjOSYiulug3n9sdgw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@coder/logger" "^1.0.3"
|
"@coder/logger" "^1.0.3"
|
||||||
fs-extra "^7.0.1"
|
fs-extra "^7.0.1"
|
||||||
|
|||||||
@@ -6,12 +6,17 @@ import { IStatusbarService, StatusbarAlignment } from "vs/platform/statusbar/com
|
|||||||
import * as paths from "./fill/paths";
|
import * as paths from "./fill/paths";
|
||||||
import product from "./fill/product";
|
import product from "./fill/product";
|
||||||
import "./vscode.scss";
|
import "./vscode.scss";
|
||||||
import { MenuId, MenuRegistry } from "vs/platform/actions/common/actions";
|
import { Action } from 'vs/base/common/actions';
|
||||||
|
import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions';
|
||||||
|
import { Registry } from 'vs/platform/registry/common/platform';
|
||||||
|
import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions';
|
||||||
import { CommandsRegistry } from "vs/platform/commands/common/commands";
|
import { CommandsRegistry } from "vs/platform/commands/common/commands";
|
||||||
import { IFileService, FileOperation } from "vs/platform/files/common/files";
|
import { IFileService, FileOperation } from "vs/platform/files/common/files";
|
||||||
import { ITextFileService } from "vs/workbench/services/textfile/common/textfiles";
|
import { ITextFileService } from "vs/workbench/services/textfile/common/textfiles";
|
||||||
import { IModelService } from "vs/editor/common/services/modelService";
|
import { IModelService } from "vs/editor/common/services/modelService";
|
||||||
import { ITerminalService } from "vs/workbench/contrib/terminal/common/terminal";
|
import { ITerminalService } from "vs/workbench/contrib/terminal/common/terminal";
|
||||||
|
import { IStorageService } from "vs/platform/storage/common/storage";
|
||||||
|
|
||||||
// NOTE: shouldn't import anything from VS Code here or anything that will
|
// NOTE: shouldn't import anything from VS Code here or anything that will
|
||||||
// depend on a synchronous fill like `os`.
|
// depend on a synchronous fill like `os`.
|
||||||
|
|
||||||
@@ -32,12 +37,22 @@ class VSClient extends IdeClient {
|
|||||||
window.ide = {
|
window.ide = {
|
||||||
client: ideClientInstance,
|
client: ideClientInstance,
|
||||||
workbench: {
|
workbench: {
|
||||||
|
action: Action,
|
||||||
|
syncActionDescriptor: SyncActionDescriptor,
|
||||||
commandRegistry: CommandsRegistry,
|
commandRegistry: CommandsRegistry,
|
||||||
// tslint:disable-next-line:no-any
|
actionsRegistry: Registry.as<IWorkbenchActionRegistry>(Extensions.WorkbenchActions),
|
||||||
menuRegistry: MenuRegistry as any,
|
menuRegistry: MenuRegistry,
|
||||||
// tslint:disable-next-line:no-any
|
statusbarService: getService<IStatusbarService>(IStatusbarService),
|
||||||
statusbarService: getService<IStatusbarService>(IStatusbarService) as any,
|
|
||||||
notificationService: getService<INotificationService>(INotificationService),
|
notificationService: getService<INotificationService>(INotificationService),
|
||||||
|
terminalService: getService<ITerminalService>(ITerminalService),
|
||||||
|
storageService: {
|
||||||
|
save: (): Promise<void> => {
|
||||||
|
// tslint:disable-next-line:no-any
|
||||||
|
const storageService = getService<IStorageService>(IStorageService) as any;
|
||||||
|
|
||||||
|
return storageService.close();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
onFileCreate: (cb): void => {
|
onFileCreate: (cb): void => {
|
||||||
getService<IFileService>(IFileService).onAfterOperation((e) => {
|
getService<IFileService>(IFileService).onAfterOperation((e) => {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
--primary: #2A2E37;
|
--primary: #2A2E37;
|
||||||
--border: black;
|
--border: black;
|
||||||
--faded: #a0a1a5;
|
--faded: #a0a1a5;
|
||||||
|
--disabled: #888;
|
||||||
--header-background: #161616;
|
--header-background: #161616;
|
||||||
--header-foreground: white;
|
--header-foreground: white;
|
||||||
--list-active-selection-background: rgb(0, 120, 160);
|
--list-active-selection-background: rgb(0, 120, 160);
|
||||||
@@ -78,9 +79,7 @@
|
|||||||
.dialog-entry {
|
.dialog-entry {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
font-size: 1.02em;
|
font-size: 1.02em;
|
||||||
padding: 0px;
|
padding: 0px 8px;
|
||||||
padding-left: 8px;
|
|
||||||
padding-right: 8px;
|
|
||||||
|
|
||||||
.dialog-entry-info {
|
.dialog-entry-info {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -93,6 +92,14 @@
|
|||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dialog-entry-size {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-entry-mtime {
|
||||||
|
padding-left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: var(--list-hover-background);
|
background-color: var(--list-hover-background);
|
||||||
}
|
}
|
||||||
@@ -101,6 +108,12 @@
|
|||||||
background-color: var(--list-active-selection-background);
|
background-color: var(--list-active-selection-background);
|
||||||
color: var(--list-active-selection-foreground);
|
color: var(--list-active-selection-foreground);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.disabled, &.disabled:hover {
|
||||||
|
background-color: var(--primary);
|
||||||
|
color: var(--disabled);
|
||||||
|
cursor: initial;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,6 +147,11 @@
|
|||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
button[disabled], button[disabled]:hover {
|
||||||
|
color: var(--disabled);
|
||||||
|
cursor: initial;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ import { IThemeService } from "vs/platform/theme/common/themeService";
|
|||||||
import { workbench } from "./workbench";
|
import { workbench } from "./workbench";
|
||||||
import "./dialog.scss";
|
import "./dialog.scss";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the type of dialog to show.
|
||||||
|
*/
|
||||||
export enum DialogType {
|
export enum DialogType {
|
||||||
NewFolder,
|
NewFolder,
|
||||||
Save,
|
Save,
|
||||||
@@ -49,7 +52,15 @@ export type DialogOptions = OpenDialogOptions | SaveDialogOptions;
|
|||||||
|
|
||||||
export const showOpenDialog = (options: OpenDialogOptions): Promise<string> => {
|
export const showOpenDialog = (options: OpenDialogOptions): Promise<string> => {
|
||||||
return new Promise<string>((resolve, reject): void => {
|
return new Promise<string>((resolve, reject): void => {
|
||||||
const dialog = new Dialog(DialogType.Open, options);
|
// Make the default to show hidden files and directories since there is no
|
||||||
|
// other way to make them visible in the dialogs currently.
|
||||||
|
const dialog = new Dialog(DialogType.Open, typeof options.properties.showHiddenFiles === "undefined" ? {
|
||||||
|
...options,
|
||||||
|
properties: {
|
||||||
|
...options.properties,
|
||||||
|
showHiddenFiles: true,
|
||||||
|
},
|
||||||
|
} : options);
|
||||||
dialog.onSelect((e) => {
|
dialog.onSelect((e) => {
|
||||||
dialog.dispose();
|
dialog.dispose();
|
||||||
resolve(e);
|
resolve(e);
|
||||||
@@ -68,8 +79,12 @@ interface DialogEntry {
|
|||||||
readonly isDirectory: boolean;
|
readonly isDirectory: boolean;
|
||||||
readonly size: number;
|
readonly size: number;
|
||||||
readonly lastModified: string;
|
readonly lastModified: string;
|
||||||
|
readonly isDisabled?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open and save dialogs.
|
||||||
|
*/
|
||||||
class Dialog {
|
class Dialog {
|
||||||
private _path: string | undefined;
|
private _path: string | undefined;
|
||||||
|
|
||||||
@@ -263,10 +278,12 @@ class Dialog {
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If it's a directory, we want to navigate to it. If it's a file, then we
|
||||||
|
// only want to open it if opening files is supported.
|
||||||
if (element.isDirectory) {
|
if (element.isDirectory) {
|
||||||
this.path = element.fullPath;
|
this.path = element.fullPath;
|
||||||
} else {
|
} else if ((this.options as OpenDialogOptions).properties.openFile) {
|
||||||
// Open
|
|
||||||
this.selectEmitter.emit(element.fullPath);
|
this.selectEmitter.emit(element.fullPath);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -282,12 +299,20 @@ class Dialog {
|
|||||||
});
|
});
|
||||||
buttonsNode.appendChild(cancelBtn);
|
buttonsNode.appendChild(cancelBtn);
|
||||||
const confirmBtn = document.createElement("button");
|
const confirmBtn = document.createElement("button");
|
||||||
confirmBtn.innerText = "Confirm";
|
const openDirectory = (this.options as OpenDialogOptions).properties.openDirectory;
|
||||||
|
confirmBtn.innerText = this.options.buttonLabel || "Confirm";
|
||||||
confirmBtn.addEventListener("click", () => {
|
confirmBtn.addEventListener("click", () => {
|
||||||
if (this._path) {
|
if (this._path && openDirectory) {
|
||||||
this.selectEmitter.emit(this._path);
|
this.selectEmitter.emit(this._path);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
// Disable if we can't open directories, otherwise you can open a directory
|
||||||
|
// as a file which won't work. This is because our button currently just
|
||||||
|
// always opens whatever directory is opened and will not open selected
|
||||||
|
// files. (A single click on a file is used to open it instead.)
|
||||||
|
if (!openDirectory) {
|
||||||
|
confirmBtn.disabled = true;
|
||||||
|
}
|
||||||
buttonsNode.appendChild(confirmBtn);
|
buttonsNode.appendChild(confirmBtn);
|
||||||
this.root.appendChild(buttonsNode);
|
this.root.appendChild(buttonsNode);
|
||||||
this.entryList.layout();
|
this.entryList.layout();
|
||||||
@@ -303,6 +328,9 @@ class Dialog {
|
|||||||
return this.errorEmitter.event;
|
return this.errorEmitter.event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the dialog.
|
||||||
|
*/
|
||||||
public dispose(): void {
|
public dispose(): void {
|
||||||
this.selectEmitter.dispose();
|
this.selectEmitter.dispose();
|
||||||
this.errorEmitter.dispose();
|
this.errorEmitter.dispose();
|
||||||
@@ -310,6 +338,9 @@ class Dialog {
|
|||||||
this.background.remove();
|
this.background.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build and insert the path shown at the top of the dialog.
|
||||||
|
*/
|
||||||
private buildPath(): void {
|
private buildPath(): void {
|
||||||
while (this.pathNode.lastChild) {
|
while (this.pathNode.lastChild) {
|
||||||
this.pathNode.removeChild(this.pathNode.lastChild);
|
this.pathNode.removeChild(this.pathNode.lastChild);
|
||||||
@@ -376,9 +407,12 @@ class Dialog {
|
|||||||
return (<any>this.entryList).typeFilterController.filter._pattern;
|
return (<any>this.entryList).typeFilterController.filter._pattern;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List the files and return dialog entries.
|
||||||
|
*/
|
||||||
private async list(directory: string): Promise<ReadonlyArray<DialogEntry>> {
|
private async list(directory: string): Promise<ReadonlyArray<DialogEntry>> {
|
||||||
const paths = (await util.promisify(fs.readdir)(directory)).sort();
|
const paths = (await util.promisify(fs.readdir)(directory)).sort();
|
||||||
const stats = await Promise.all(paths.map(p => util.promisify(fs.stat)(path.join(directory, p))));
|
const stats = await Promise.all(paths.map(p => util.promisify(fs.lstat)(path.join(directory, p))));
|
||||||
|
|
||||||
return stats.map((stat, index): DialogEntry => ({
|
return stats.map((stat, index): DialogEntry => ({
|
||||||
fullPath: path.join(directory, paths[index]),
|
fullPath: path.join(directory, paths[index]),
|
||||||
@@ -386,6 +420,9 @@ class Dialog {
|
|||||||
isDirectory: stat.isDirectory(),
|
isDirectory: stat.isDirectory(),
|
||||||
lastModified: stat.mtime.toDateString(),
|
lastModified: stat.mtime.toDateString(),
|
||||||
size: stat.size,
|
size: stat.size,
|
||||||
|
// If we can't open files, show them as disabled.
|
||||||
|
isDisabled: !stat.isDirectory()
|
||||||
|
&& !(this.options as OpenDialogOptions).properties.openFile,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -397,11 +434,17 @@ interface DialogEntryData {
|
|||||||
label: HighlightedLabel;
|
label: HighlightedLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rendering for the different parts of a dialog entry.
|
||||||
|
*/
|
||||||
class DialogEntryRenderer implements ITreeRenderer<DialogEntry, string, DialogEntryData> {
|
class DialogEntryRenderer implements ITreeRenderer<DialogEntry, string, DialogEntryData> {
|
||||||
public get templateId(): string {
|
public get templateId(): string {
|
||||||
return "dialog-entry";
|
return "dialog-entry";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append and return containers for each part of the dialog entry.
|
||||||
|
*/
|
||||||
public renderTemplate(container: HTMLElement): DialogEntryData {
|
public renderTemplate(container: HTMLElement): DialogEntryData {
|
||||||
addClass(container, "dialog-entry");
|
addClass(container, "dialog-entry");
|
||||||
addClass(container, "dialog-grid");
|
addClass(container, "dialog-grid");
|
||||||
@@ -422,6 +465,9 @@ class DialogEntryRenderer implements ITreeRenderer<DialogEntry, string, DialogEn
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render a dialog entry.
|
||||||
|
*/
|
||||||
public renderElement(node: ITreeNode<DialogEntry, string>, _index: number, templateData: DialogEntryData): void {
|
public renderElement(node: ITreeNode<DialogEntry, string>, _index: number, templateData: DialogEntryData): void {
|
||||||
templateData.icon.className = "dialog-entry-icon monaco-icon-label";
|
templateData.icon.className = "dialog-entry-icon monaco-icon-label";
|
||||||
const classes = getIconClasses(
|
const classes = getIconClasses(
|
||||||
@@ -442,11 +488,33 @@ class DialogEntryRenderer implements ITreeRenderer<DialogEntry, string, DialogEn
|
|||||||
start: 0,
|
start: 0,
|
||||||
end: node.filterData.length,
|
end: node.filterData.length,
|
||||||
}] : []);
|
}] : []);
|
||||||
templateData.size.innerText = node.element.size.toString();
|
templateData.size.innerText = !node.element.isDirectory ? this.humanReadableSize(node.element.size) : "";
|
||||||
templateData.lastModified.innerText = node.element.lastModified;
|
templateData.lastModified.innerText = node.element.lastModified;
|
||||||
|
|
||||||
|
// We know this exists because we created the template.
|
||||||
|
const entryContainer = templateData.label.element.parentElement!.parentElement!.parentElement!;
|
||||||
|
if (node.element.isDisabled) {
|
||||||
|
entryContainer.classList.add("disabled");
|
||||||
|
} else {
|
||||||
|
entryContainer.classList.remove("disabled");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does nothing (not implemented).
|
||||||
|
*/
|
||||||
public disposeTemplate(_templateData: DialogEntryData): void {
|
public disposeTemplate(_templateData: DialogEntryData): void {
|
||||||
// throw new Error("Method not implemented.");
|
// throw new Error("Method not implemented.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a positive size in bytes, return a string that is more readable for
|
||||||
|
* humans.
|
||||||
|
*/
|
||||||
|
private humanReadableSize(bytes: number): string {
|
||||||
|
const units = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
||||||
|
const i = Math.min(Math.floor(bytes && Math.log(bytes) / Math.log(1000)), units.length - 1);
|
||||||
|
|
||||||
|
return (bytes / Math.pow(1000, i)).toFixed(2) + " " + units[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
170
packages/vscode/src/fill/applicationInsights.ts
Normal file
170
packages/vscode/src/fill/applicationInsights.ts
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
/**
|
||||||
|
* Used by node
|
||||||
|
*/
|
||||||
|
import * as https from "https";
|
||||||
|
import * as os from "os";
|
||||||
|
|
||||||
|
export const defaultClient = "filler";
|
||||||
|
|
||||||
|
export class TelemetryClient {
|
||||||
|
public channel = {
|
||||||
|
setUseDiskRetryCaching: (): void => undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
public constructor() {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
public trackEvent(options: {
|
||||||
|
name: string;
|
||||||
|
properties: object;
|
||||||
|
measurements: object;
|
||||||
|
}): void {
|
||||||
|
if (!options.properties) {
|
||||||
|
options.properties = {};
|
||||||
|
}
|
||||||
|
if (!options.measurements) {
|
||||||
|
options.measurements = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const cpus = os.cpus();
|
||||||
|
// tslint:disable-next-line:no-any
|
||||||
|
(options.measurements as any).cpu = {
|
||||||
|
model: cpus[0].model,
|
||||||
|
cores: cpus.length,
|
||||||
|
};
|
||||||
|
} catch (ex) {
|
||||||
|
// Nothin
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// tslint:disable-next-line:no-any
|
||||||
|
(options.measurements as any).memory = {
|
||||||
|
virtual_free: os.freemem(),
|
||||||
|
virtual_used: os.totalmem(),
|
||||||
|
};
|
||||||
|
} catch (ex) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// tslint:disable:no-any
|
||||||
|
(options.properties as any)["common.shell"] = os.userInfo().shell;
|
||||||
|
(options.properties as any)["common.release"] = os.release();
|
||||||
|
(options.properties as any)["common.arch"] = os.arch();
|
||||||
|
// tslint:enable:no-any
|
||||||
|
} catch (ex) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// tslint:disable-next-line:no-any
|
||||||
|
(options.properties as any)["common.machineId"] = machineIdSync();
|
||||||
|
} catch (ex) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const request = https.request({
|
||||||
|
host: "v1.telemetry.coder.com",
|
||||||
|
port: 443,
|
||||||
|
path: "/track",
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
request.on("error", () => {
|
||||||
|
// Do nothing, we don"t really care
|
||||||
|
});
|
||||||
|
request.write(JSON.stringify(options));
|
||||||
|
request.end();
|
||||||
|
} catch (ex) {
|
||||||
|
// Suppress all errs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public flush(options: {
|
||||||
|
readonly callback: () => void;
|
||||||
|
}): void {
|
||||||
|
options.callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Taken from https://github.com/automation-stack/node-machine-id
|
||||||
|
import { exec, execSync } from "child_process";
|
||||||
|
import { createHash } from "crypto";
|
||||||
|
|
||||||
|
const isWindowsProcessMixedOrNativeArchitecture = (): "" | "mixed" | "native" => {
|
||||||
|
// detect if the node binary is the same arch as the Windows OS.
|
||||||
|
// or if this is 32 bit node on 64 bit windows.
|
||||||
|
if (process.platform !== "win32") {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (process.arch === "ia32" && process.env.hasOwnProperty("PROCESSOR_ARCHITEW6432")) {
|
||||||
|
return "mixed";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "native";
|
||||||
|
};
|
||||||
|
|
||||||
|
let { platform } = process,
|
||||||
|
win32RegBinPath = {
|
||||||
|
native: "%windir%\\System32",
|
||||||
|
mixed: "%windir%\\sysnative\\cmd.exe /c %windir%\\System32",
|
||||||
|
"": "",
|
||||||
|
},
|
||||||
|
guid = {
|
||||||
|
darwin: "ioreg -rd1 -c IOPlatformExpertDevice",
|
||||||
|
win32: `${win32RegBinPath[isWindowsProcessMixedOrNativeArchitecture()]}\\REG ` +
|
||||||
|
"QUERY HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography " +
|
||||||
|
"/v MachineGuid",
|
||||||
|
linux: "( cat /var/lib/dbus/machine-id /etc/machine-id 2> /dev/null || hostname ) | head -n 1 || :",
|
||||||
|
freebsd: "kenv -q smbios.system.uuid || sysctl -n kern.hostuuid",
|
||||||
|
// tslint:disable-next-line:no-any
|
||||||
|
} as any;
|
||||||
|
|
||||||
|
const hash = (guid: string): string => {
|
||||||
|
return createHash("sha256").update(guid).digest("hex");
|
||||||
|
};
|
||||||
|
|
||||||
|
const expose = (result: string): string => {
|
||||||
|
switch (platform) {
|
||||||
|
case "darwin":
|
||||||
|
return result
|
||||||
|
.split("IOPlatformUUID")[1]
|
||||||
|
.split("\n")[0].replace(/\=|\s+|\"/ig, "")
|
||||||
|
.toLowerCase();
|
||||||
|
case "win32":
|
||||||
|
return result
|
||||||
|
.toString()
|
||||||
|
.split("REG_SZ")[1]
|
||||||
|
.replace(/\r+|\n+|\s+/ig, "")
|
||||||
|
.toLowerCase();
|
||||||
|
case "linux":
|
||||||
|
return result
|
||||||
|
.toString()
|
||||||
|
.replace(/\r+|\n+|\s+/ig, "")
|
||||||
|
.toLowerCase();
|
||||||
|
case "freebsd":
|
||||||
|
return result
|
||||||
|
.toString()
|
||||||
|
.replace(/\r+|\n+|\s+/ig, "")
|
||||||
|
.toLowerCase();
|
||||||
|
default:
|
||||||
|
throw new Error(`Unsupported platform: ${process.platform}`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let cachedMachineId: string | undefined;
|
||||||
|
|
||||||
|
const machineIdSync = (): string => {
|
||||||
|
if (cachedMachineId) {
|
||||||
|
return cachedMachineId;
|
||||||
|
}
|
||||||
|
let id: string = expose(execSync(guid[platform]).toString());
|
||||||
|
cachedMachineId = hash(id);
|
||||||
|
|
||||||
|
return cachedMachineId;
|
||||||
|
};
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
import * as path from "path";
|
|
||||||
import * as paths from "./paths";
|
import * as paths from "./paths";
|
||||||
import * as environment from "vs/platform/environment/node/environmentService";
|
import * as environment from "vs/platform/environment/node/environmentService";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Customize paths using data received from the initialization message.
|
||||||
|
*/
|
||||||
export class EnvironmentService extends environment.EnvironmentService {
|
export class EnvironmentService extends environment.EnvironmentService {
|
||||||
public get sharedIPCHandle(): string {
|
public get sharedIPCHandle(): string {
|
||||||
return paths.getSocketPath() || super.sharedIPCHandle;
|
return paths.getSocketPath() || super.sharedIPCHandle;
|
||||||
@@ -10,6 +12,18 @@ export class EnvironmentService extends environment.EnvironmentService {
|
|||||||
public get extensionsPath(): string {
|
public get extensionsPath(): string {
|
||||||
return paths.getExtensionsDirectory();
|
return paths.getExtensionsDirectory();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get builtinExtensionsPath(): string {
|
||||||
|
return paths.getBuiltInExtensionsDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
public get extraExtensionPaths(): string[] {
|
||||||
|
return paths.getExtraExtensionDirectories();
|
||||||
|
}
|
||||||
|
|
||||||
|
public get extraBuiltinExtensionPaths(): string[] {
|
||||||
|
return paths.getExtraBuiltinExtensionDirectories();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const target = environment as typeof environment;
|
const target = environment as typeof environment;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { OpenProcessExplorer } from "vs/workbench/contrib/issue/electron-browser
|
|||||||
import { ToggleDevToolsAction } from "vs/workbench/electron-browser/actions/developerActions";
|
import { ToggleDevToolsAction } from "vs/workbench/electron-browser/actions/developerActions";
|
||||||
import { OpenPrivacyStatementUrlAction, OpenRequestFeatureUrlAction, OpenTwitterUrlAction } from "vs/workbench/electron-browser/actions/helpActions";
|
import { OpenPrivacyStatementUrlAction, OpenRequestFeatureUrlAction, OpenTwitterUrlAction } from "vs/workbench/electron-browser/actions/helpActions";
|
||||||
import { CloseCurrentWindowAction, NewWindowAction, ShowAboutDialogAction } from "vs/workbench/electron-browser/actions/windowActions";
|
import { CloseCurrentWindowAction, NewWindowAction, ShowAboutDialogAction } from "vs/workbench/electron-browser/actions/windowActions";
|
||||||
|
import { REVEAL_IN_OS_COMMAND_ID } from "vs/workbench/contrib/files/browser/fileCommands";
|
||||||
|
|
||||||
const toSkip = [
|
const toSkip = [
|
||||||
ToggleDevToolsAction.ID,
|
ToggleDevToolsAction.ID,
|
||||||
@@ -16,6 +17,7 @@ const toSkip = [
|
|||||||
NewWindowAction.ID,
|
NewWindowAction.ID,
|
||||||
CloseCurrentWindowAction.ID,
|
CloseCurrentWindowAction.ID,
|
||||||
CloseWorkspaceAction.ID,
|
CloseWorkspaceAction.ID,
|
||||||
|
REVEAL_IN_OS_COMMAND_ID,
|
||||||
|
|
||||||
// Unfortunately referenced as a string
|
// Unfortunately referenced as a string
|
||||||
"update.showCurrentReleaseNotes",
|
"update.showCurrentReleaseNotes",
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
import { InitData, SharedProcessData } from "@coder/protocol";
|
import { InitData, SharedProcessData } from "@coder/protocol";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides paths.
|
||||||
|
*/
|
||||||
class Paths {
|
class Paths {
|
||||||
private _appData: string | undefined;
|
private _appData: string | undefined;
|
||||||
private _defaultUserData: string | undefined;
|
private _defaultUserData: string | undefined;
|
||||||
@@ -7,6 +10,8 @@ class Paths {
|
|||||||
private _extensionsDirectory: string | undefined;
|
private _extensionsDirectory: string | undefined;
|
||||||
private _builtInExtensionsDirectory: string | undefined;
|
private _builtInExtensionsDirectory: string | undefined;
|
||||||
private _workingDirectory: string | undefined;
|
private _workingDirectory: string | undefined;
|
||||||
|
private _extraExtensionDirectories: string[] | undefined;
|
||||||
|
private _extraBuiltinExtensionDirectories: string[] | undefined;
|
||||||
|
|
||||||
public get appData(): string {
|
public get appData(): string {
|
||||||
if (typeof this._appData === "undefined") {
|
if (typeof this._appData === "undefined") {
|
||||||
@@ -48,6 +53,22 @@ class Paths {
|
|||||||
return this._builtInExtensionsDirectory;
|
return this._builtInExtensionsDirectory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get extraExtensionDirectories(): string[] {
|
||||||
|
if (!this._extraExtensionDirectories) {
|
||||||
|
throw new Error("trying to access extra extension directories before they have been set");
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._extraExtensionDirectories;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get extraBuiltinExtensionDirectories(): string[] {
|
||||||
|
if (!this._extraBuiltinExtensionDirectories) {
|
||||||
|
throw new Error("trying to access extra builtin extension directories before they have been set");
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._extraBuiltinExtensionDirectories;
|
||||||
|
}
|
||||||
|
|
||||||
public get workingDirectory(): string {
|
public get workingDirectory(): string {
|
||||||
if (!this._workingDirectory) {
|
if (!this._workingDirectory) {
|
||||||
throw new Error("trying to access working directory before it has been set");
|
throw new Error("trying to access working directory before it has been set");
|
||||||
@@ -56,6 +77,9 @@ class Paths {
|
|||||||
return this._workingDirectory;
|
return this._workingDirectory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize paths using the provided data.
|
||||||
|
*/
|
||||||
public initialize(data: InitData, sharedData: SharedProcessData): void {
|
public initialize(data: InitData, sharedData: SharedProcessData): void {
|
||||||
process.env.VSCODE_LOGS = sharedData.logPath;
|
process.env.VSCODE_LOGS = sharedData.logPath;
|
||||||
this._appData = data.dataDirectory;
|
this._appData = data.dataDirectory;
|
||||||
@@ -64,6 +88,8 @@ class Paths {
|
|||||||
this._extensionsDirectory = data.extensionsDirectory;
|
this._extensionsDirectory = data.extensionsDirectory;
|
||||||
this._builtInExtensionsDirectory = data.builtInExtensionsDirectory;
|
this._builtInExtensionsDirectory = data.builtInExtensionsDirectory;
|
||||||
this._workingDirectory = data.workingDirectory;
|
this._workingDirectory = data.workingDirectory;
|
||||||
|
this._extraExtensionDirectories = data.extraExtensionDirectories;
|
||||||
|
this._extraBuiltinExtensionDirectories = data.extraBuiltinExtensionDirectories;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,4 +99,6 @@ export const getDefaultUserDataPath = (): string => _paths.defaultUserData;
|
|||||||
export const getWorkingDirectory = (): string => _paths.workingDirectory;
|
export const getWorkingDirectory = (): string => _paths.workingDirectory;
|
||||||
export const getExtensionsDirectory = (): string => _paths.extensionsDirectory;
|
export const getExtensionsDirectory = (): string => _paths.extensionsDirectory;
|
||||||
export const getBuiltInExtensionsDirectory = (): string => _paths.builtInExtensionsDirectory;
|
export const getBuiltInExtensionsDirectory = (): string => _paths.builtInExtensionsDirectory;
|
||||||
|
export const getExtraExtensionDirectories = (): string[] => _paths.extraExtensionDirectories;
|
||||||
|
export const getExtraBuiltinExtensionDirectories = (): string[] => _paths.extraBuiltinExtensionDirectories;
|
||||||
export const getSocketPath = (): string => _paths.socketPath;
|
export const getSocketPath = (): string => _paths.socketPath;
|
||||||
|
|||||||
@@ -11,7 +11,13 @@ class Product implements IProductConfiguration {
|
|||||||
public introductoryVideosUrl = "https://code.visualstudio.com/docs/getstarted/introvideos";
|
public introductoryVideosUrl = "https://code.visualstudio.com/docs/getstarted/introvideos";
|
||||||
public tipsAndTricksUrl = "https://code.visualstudio.com/docs/getstarted/tips-and-tricks";
|
public tipsAndTricksUrl = "https://code.visualstudio.com/docs/getstarted/tips-and-tricks";
|
||||||
public twitterUrl = "https://twitter.com/code";
|
public twitterUrl = "https://twitter.com/code";
|
||||||
public licenseUrl = "https://github.com/codercom/code-server/blob/master/LICENSE";
|
public licenseUrl = "https://github.com/cdr/code-server/blob/master/LICENSE";
|
||||||
|
public aiConfig = process.env.DISABLE_TELEMETRY ? undefined! : {
|
||||||
|
// Only needed so vscode can see that content exists for this value.
|
||||||
|
// We override the application insights module.
|
||||||
|
asimovKey: "content",
|
||||||
|
};
|
||||||
|
public enableTelemetry = process.env.DISABLE_TELEMETRY ? false : true;
|
||||||
|
|
||||||
private _dataFolderName: string | undefined;
|
private _dataFolderName: string | undefined;
|
||||||
public get dataFolderName(): string {
|
public get dataFolderName(): string {
|
||||||
@@ -26,7 +32,8 @@ class Product implements IProductConfiguration {
|
|||||||
serviceUrl: global && global.process && global.process.env.SERVICE_URL
|
serviceUrl: global && global.process && global.process.env.SERVICE_URL
|
||||||
|| process.env.SERVICE_URL
|
|| process.env.SERVICE_URL
|
||||||
|| "https://v1.extapi.coder.com",
|
|| "https://v1.extapi.coder.com",
|
||||||
};
|
// tslint:disable-next-line:no-any
|
||||||
|
} as any;
|
||||||
|
|
||||||
public extensionExecutionEnvironments = {
|
public extensionExecutionEnvironments = {
|
||||||
"wayou.vscode-todo-highlight": "worker",
|
"wayou.vscode-todo-highlight": "worker",
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import { IStorageService, WillSaveStateReason } from "vs/platform/storage/common
|
|||||||
import * as paths from "./paths";
|
import * as paths from "./paths";
|
||||||
import { workbench } from "../workbench";
|
import { workbench } from "../workbench";
|
||||||
|
|
||||||
|
// tslint:disable completed-docs
|
||||||
|
|
||||||
class StorageDatabase implements workspaceStorage.IStorageDatabase {
|
class StorageDatabase implements workspaceStorage.IStorageDatabase {
|
||||||
public readonly onDidChangeItemsExternal = Event.None;
|
public readonly onDidChangeItemsExternal = Event.None;
|
||||||
private readonly items = new Map<string, string>();
|
private readonly items = new Map<string, string>();
|
||||||
@@ -26,7 +28,8 @@ class StorageDatabase implements workspaceStorage.IStorageDatabase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.triggerFlush(WillSaveStateReason.SHUTDOWN);
|
this.triggerFlush(WillSaveStateReason.SHUTDOWN);
|
||||||
navigator.sendBeacon(`/resource${this.path}`, this.content);
|
const resourceBaseUrl = location.pathname.replace(/\/$/, "") + "/resource";
|
||||||
|
navigator.sendBeacon(`${resourceBaseUrl}/${this.path}`, this.content);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,17 @@ import * as vscodeTextmate from "../../../../lib/vscode/node_modules/vscode-text
|
|||||||
|
|
||||||
const target = vscodeTextmate as typeof vscodeTextmate;
|
const target = vscodeTextmate as typeof vscodeTextmate;
|
||||||
|
|
||||||
|
const ctx = (require as any).context("../../../../lib/extensions", true, /.*\.tmLanguage.json$/);
|
||||||
|
// Maps grammar scope to loaded grammar
|
||||||
|
const scopeToGrammar = {} as any;
|
||||||
|
|
||||||
|
ctx.keys().forEach((key: string) => {
|
||||||
|
const value = ctx(key);
|
||||||
|
if (value.scopeName) {
|
||||||
|
scopeToGrammar[value.scopeName] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
target.Registry = class Registry extends vscodeTextmate.Registry {
|
target.Registry = class Registry extends vscodeTextmate.Registry {
|
||||||
public constructor(opts: vscodeTextmate.RegistryOptions) {
|
public constructor(opts: vscodeTextmate.RegistryOptions) {
|
||||||
super({
|
super({
|
||||||
@@ -21,6 +32,13 @@ target.Registry = class Registry extends vscodeTextmate.Registry {
|
|||||||
}).catch(reason => rej(reason));
|
}).catch(reason => rej(reason));
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
loadGrammar: async (scopeName: string) => {
|
||||||
|
if (scopeToGrammar[scopeName]) {
|
||||||
|
return scopeToGrammar[scopeName];
|
||||||
|
}
|
||||||
|
|
||||||
|
return opts.loadGrammar(scopeName);
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,15 +1,27 @@
|
|||||||
import * as electron from "electron";
|
import * as electron from "electron";
|
||||||
import { Emitter } from "@coder/events";
|
import { Emitter } from "@coder/events";
|
||||||
import { IWindowsService, INativeOpenDialogOptions, MessageBoxOptions, SaveDialogOptions, OpenDialogOptions, IMessageBoxResult, IDevToolsOptions, IEnterWorkspaceResult, CrashReporterStartOptions, INewWindowOptions, IOpenFileRequest, IAddFoldersRequest } from "vs/platform/windows/common/windows";
|
import { logger } from "@coder/logger";
|
||||||
|
import { IWindowsService, INativeOpenDialogOptions, MessageBoxOptions, SaveDialogOptions, OpenDialogOptions, IMessageBoxResult, IDevToolsOptions, IEnterWorkspaceResult, CrashReporterStartOptions, INewWindowOptions, IOpenFileRequest, IAddFoldersRequest, IURIToOpen, IOpenSettings } from "vs/platform/windows/common/windows";
|
||||||
import { ParsedArgs } from "vs/platform/environment/common/environment";
|
import { ParsedArgs } from "vs/platform/environment/common/environment";
|
||||||
import { IWorkspaceIdentifier, IWorkspaceFolderCreationData, ISingleFolderWorkspaceIdentifier } from "vs/platform/workspaces/common/workspaces";
|
import { IWorkspaceIdentifier, IWorkspaceFolderCreationData, ISingleFolderWorkspaceIdentifier } from "vs/platform/workspaces/common/workspaces";
|
||||||
import { URI } from "vs/base/common/uri";
|
import { URI } from "vs/base/common/uri";
|
||||||
import { IRecentlyOpened } from "vs/platform/history/common/history";
|
import { IRecentlyOpened, IRecent } from "vs/platform/history/common/history";
|
||||||
import { ISerializableCommandAction } from "vs/platform/actions/common/actions";
|
import { ISerializableCommandAction } from "vs/platform/actions/common/actions";
|
||||||
import { client } from "../client";
|
import { client } from "../client";
|
||||||
import { showOpenDialog } from "../dialog";
|
import { showOpenDialog } from "../dialog";
|
||||||
import { workbench } from "../workbench";
|
import { workbench } from "../workbench";
|
||||||
|
|
||||||
|
// tslint:disable completed-docs
|
||||||
|
|
||||||
|
// VS Code overrides window.open to call openExternal, but we then call
|
||||||
|
// window.open which results in an infinite loop. Store the function but also
|
||||||
|
// make it unable to be set (doesn't work otherwise).
|
||||||
|
const windowOpen = window.open;
|
||||||
|
Object.defineProperty(window, "open", {
|
||||||
|
set: (): void => { /* Not allowed. */ },
|
||||||
|
get: (): Function => windowOpen,
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instead of going to the shared process, we'll directly run these methods on
|
* Instead of going to the shared process, we'll directly run these methods on
|
||||||
* the client. This setup means we can only control the current window.
|
* the client. This setup means we can only control the current window.
|
||||||
@@ -35,9 +47,9 @@ export class WindowsService implements IWindowsService {
|
|||||||
private readonly window = new electron.BrowserWindow();
|
private readonly window = new electron.BrowserWindow();
|
||||||
|
|
||||||
// Dialogs
|
// Dialogs
|
||||||
public async pickFileFolderAndOpen(_options: INativeOpenDialogOptions): Promise<void> {
|
public async pickFileFolderAndOpen(options: INativeOpenDialogOptions): Promise<void> {
|
||||||
showOpenDialog({
|
showOpenDialog({
|
||||||
...(_options.dialogOptions || {}),
|
...(options.dialogOptions || {}),
|
||||||
properties: {
|
properties: {
|
||||||
openFile: true,
|
openFile: true,
|
||||||
openDirectory: true,
|
openDirectory: true,
|
||||||
@@ -50,13 +62,13 @@ export class WindowsService implements IWindowsService {
|
|||||||
}],
|
}],
|
||||||
} as IOpenFileRequest);
|
} as IOpenFileRequest);
|
||||||
}).catch((ex) => {
|
}).catch((ex) => {
|
||||||
//
|
logger.error(ex.message);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async pickFileAndOpen(_options: INativeOpenDialogOptions): Promise<void> {
|
public async pickFileAndOpen(options: INativeOpenDialogOptions): Promise<void> {
|
||||||
showOpenDialog({
|
showOpenDialog({
|
||||||
...(_options.dialogOptions || {}),
|
...(options.dialogOptions || {}),
|
||||||
properties: {
|
properties: {
|
||||||
openFile: true,
|
openFile: true,
|
||||||
},
|
},
|
||||||
@@ -68,26 +80,32 @@ export class WindowsService implements IWindowsService {
|
|||||||
}],
|
}],
|
||||||
} as IOpenFileRequest);
|
} as IOpenFileRequest);
|
||||||
}).catch((ex) => {
|
}).catch((ex) => {
|
||||||
//
|
logger.error(ex.message);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async pickFolderAndOpen(_options: INativeOpenDialogOptions): Promise<void> {
|
public async pickFolderAndOpen(options: INativeOpenDialogOptions): Promise<void> {
|
||||||
|
if (!options.dialogOptions) {
|
||||||
|
options.dialogOptions = {};
|
||||||
|
}
|
||||||
|
if (!options.dialogOptions.title) {
|
||||||
|
options.dialogOptions.title = "Open Folder";
|
||||||
|
}
|
||||||
showOpenDialog({
|
showOpenDialog({
|
||||||
...(_options.dialogOptions || {}),
|
...(options.dialogOptions || {}),
|
||||||
properties: {
|
properties: {
|
||||||
openDirectory: true,
|
openDirectory: true,
|
||||||
},
|
},
|
||||||
}).then((path) => {
|
}).then((path) => {
|
||||||
workbench.workspace = URI.file(path);
|
workbench.workspace = URI.file(path);
|
||||||
}).catch((ex) => {
|
}).catch((ex) => {
|
||||||
//
|
logger.error(ex.message);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async pickWorkspaceAndOpen(_options: INativeOpenDialogOptions): Promise<void> {
|
public async pickWorkspaceAndOpen(options: INativeOpenDialogOptions): Promise<void> {
|
||||||
showOpenDialog({
|
showOpenDialog({
|
||||||
...(_options.dialogOptions || {}),
|
...(options.dialogOptions || {}),
|
||||||
properties: {
|
properties: {
|
||||||
openDirectory: true,
|
openDirectory: true,
|
||||||
},
|
},
|
||||||
@@ -97,7 +115,7 @@ export class WindowsService implements IWindowsService {
|
|||||||
foldersToAdd: [URI.file(path)],
|
foldersToAdd: [URI.file(path)],
|
||||||
} as IAddFoldersRequest);
|
} as IAddFoldersRequest);
|
||||||
}).catch((ex) => {
|
}).catch((ex) => {
|
||||||
//
|
logger.error(ex.message);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,16 +138,14 @@ export class WindowsService implements IWindowsService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public showOpenDialog(windowId: number, options: OpenDialogOptions): Promise<string[]> {
|
public async showOpenDialog(_windowId: number, options: OpenDialogOptions): Promise<string[]> {
|
||||||
return showOpenDialog({
|
return [await showOpenDialog({
|
||||||
...(options || {}),
|
...(options || {}),
|
||||||
properties: {
|
properties: {
|
||||||
openDirectory: true,
|
openDirectory: options && options.properties && options.properties.includes("openDirectory") || false,
|
||||||
openFile: true,
|
openFile: options && options.properties && options.properties.includes("openFile") || false,
|
||||||
},
|
},
|
||||||
}).then((path) => {
|
})];
|
||||||
return [path];
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public reloadWindow(windowId: number, _args?: ParsedArgs): Promise<void> {
|
public reloadWindow(windowId: number, _args?: ParsedArgs): Promise<void> {
|
||||||
@@ -148,14 +164,14 @@ export class WindowsService implements IWindowsService {
|
|||||||
throw new Error("not implemented");
|
throw new Error("not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
public enterWorkspace(_windowId: number, _path: URI): Promise<IEnterWorkspaceResult> {
|
public enterWorkspace(_windowId: number, uri: URI): Promise<IEnterWorkspaceResult> {
|
||||||
if (_path.path.endsWith(".json")) {
|
if (uri.path.endsWith(".json")) {
|
||||||
workbench.workspace = {
|
workbench.workspace = {
|
||||||
id: "Untitled",
|
id: "Untitled",
|
||||||
configPath: _path.path,
|
configPath: uri,
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
workbench.workspace = _path;
|
workbench.workspace = uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
return undefined!;
|
return undefined!;
|
||||||
@@ -179,7 +195,7 @@ export class WindowsService implements IWindowsService {
|
|||||||
return Promise.resolve(this.getWindowById(windowId).setRepresentedFilename(fileName));
|
return Promise.resolve(this.getWindowById(windowId).setRepresentedFilename(fileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
public addRecentlyOpened(_files: URI[]): Promise<void> {
|
public addRecentlyOpened(_files: IRecent[]): Promise<void> {
|
||||||
throw new Error("not implemented");
|
throw new Error("not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,7 +299,7 @@ export class WindowsService implements IWindowsService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Global methods
|
// Global methods
|
||||||
public openWindow(_windowId: number, _paths: URI[], _options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean, args?: ParsedArgs }): Promise<void> {
|
public openWindow(_windowId: number, _uris: IURIToOpen[], _options?: IOpenSettings): Promise<void> {
|
||||||
throw new Error("not implemented");
|
throw new Error("not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,8 +323,8 @@ export class WindowsService implements IWindowsService {
|
|||||||
throw new Error("not implemented");
|
throw new Error("not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async showItemInFolder(_path: string): Promise<void> {
|
public async showItemInFolder(uri: URI): Promise<void> {
|
||||||
workbench.workspace = URI.file(_path);
|
workbench.workspace = uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
public getActiveWindowId(): Promise<number | undefined> {
|
public getActiveWindowId(): Promise<number | undefined> {
|
||||||
|
|||||||
@@ -53,3 +53,7 @@
|
|||||||
width: 56px !important;
|
width: 56px !important;
|
||||||
margin-right: 4px;
|
margin-right: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.window-controls-container {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
@@ -29,8 +29,6 @@ import { LogLevel } from "vs/platform/log/common/log";
|
|||||||
import { RawContextKey, IContextKeyService } from "vs/platform/contextkey/common/contextkey";
|
import { RawContextKey, IContextKeyService } from "vs/platform/contextkey/common/contextkey";
|
||||||
import { ServiceCollection } from "vs/platform/instantiation/common/serviceCollection";
|
import { ServiceCollection } from "vs/platform/instantiation/common/serviceCollection";
|
||||||
import { URI } from "vs/base/common/uri";
|
import { URI } from "vs/base/common/uri";
|
||||||
import { BackupMainService } from "vs/platform/backup/electron-main/backupMainService";
|
|
||||||
import { IInstantiationService } from "vs/platform/instantiation/common/instantiation";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes VS Code and provides a way to call into general client
|
* Initializes VS Code and provides a way to call into general client
|
||||||
@@ -131,14 +129,6 @@ export class Workbench {
|
|||||||
public set serviceCollection(collection: ServiceCollection) {
|
public set serviceCollection(collection: ServiceCollection) {
|
||||||
this._serviceCollection = collection;
|
this._serviceCollection = collection;
|
||||||
|
|
||||||
// TODO: If possible it might be better to start the app from vs/code/electron-main/app.
|
|
||||||
// For now, manually initialize services from there as needed.
|
|
||||||
const inst = this._serviceCollection.get(IInstantiationService) as IInstantiationService;
|
|
||||||
const backupMainService = inst.createInstance(BackupMainService) as BackupMainService;
|
|
||||||
backupMainService.initialize().catch((error) => {
|
|
||||||
logger.error(error.message);
|
|
||||||
});
|
|
||||||
|
|
||||||
const contextKeys = this.serviceCollection.get(IContextKeyService) as IContextKeyService;
|
const contextKeys = this.serviceCollection.get(IContextKeyService) as IContextKeyService;
|
||||||
const bounded = this.clipboardContextKey.bindTo(contextKeys);
|
const bounded = this.clipboardContextKey.bindTo(contextKeys);
|
||||||
client.clipboard.onPermissionChange((enabled) => {
|
client.clipboard.onPermissionChange((enabled) => {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ const vsFills = path.join(root, "packages/vscode/src/fill");
|
|||||||
|
|
||||||
module.exports = merge(
|
module.exports = merge(
|
||||||
require(path.join(root, "scripts/webpack.node.config.js"))({
|
require(path.join(root, "scripts/webpack.node.config.js"))({
|
||||||
|
dirname: __dirname,
|
||||||
typescriptCompilerOptions: {
|
typescriptCompilerOptions: {
|
||||||
target: "es6",
|
target: "es6",
|
||||||
},
|
},
|
||||||
@@ -15,7 +16,6 @@ module.exports = merge(
|
|||||||
mode: "development",
|
mode: "development",
|
||||||
output: {
|
output: {
|
||||||
chunkFilename: "[name].bundle.js",
|
chunkFilename: "[name].bundle.js",
|
||||||
path: path.resolve(__dirname, "out"),
|
|
||||||
publicPath: "/",
|
publicPath: "/",
|
||||||
filename: "bootstrap-fork.js",
|
filename: "bootstrap-fork.js",
|
||||||
libraryTarget: "commonjs",
|
libraryTarget: "commonjs",
|
||||||
@@ -55,12 +55,13 @@ module.exports = merge(
|
|||||||
"vscode-sqlite3": path.resolve(fills, "empty.ts"),
|
"vscode-sqlite3": path.resolve(fills, "empty.ts"),
|
||||||
"vs/base/browser/browser": path.resolve(fills, "empty.ts"),
|
"vs/base/browser/browser": path.resolve(fills, "empty.ts"),
|
||||||
|
|
||||||
|
"applicationinsights": path.join(vsFills, "applicationInsights.ts"),
|
||||||
"electron": path.join(vsFills, "stdioElectron.ts"),
|
"electron": path.join(vsFills, "stdioElectron.ts"),
|
||||||
"vscode-ripgrep": path.join(vsFills, "ripgrep.ts"),
|
"vscode-ripgrep": path.join(vsFills, "ripgrep.ts"),
|
||||||
"native-keymap": path.join(vsFills, "native-keymap.ts"),
|
"native-keymap": path.join(vsFills, "native-keymap.ts"),
|
||||||
"native-watchdog": path.join(vsFills, "native-watchdog.ts"),
|
"native-watchdog": path.join(vsFills, "native-watchdog.ts"),
|
||||||
"vs/base/common/amd": path.resolve(vsFills, "amd.ts"),
|
"vs/base/common/amd": path.resolve(vsFills, "amd.ts"),
|
||||||
"vs/base/node/paths": path.resolve(vsFills, "paths.ts"),
|
"vs/base/node/paths": path.join(vsFills, "paths.ts"),
|
||||||
"vs/platform/product/node/package": path.resolve(vsFills, "package.ts"),
|
"vs/platform/product/node/package": path.resolve(vsFills, "package.ts"),
|
||||||
"vs/platform/product/node/product": path.resolve(vsFills, "product.ts"),
|
"vs/platform/product/node/product": path.resolve(vsFills, "product.ts"),
|
||||||
"vs/base/node/zip": path.resolve(vsFills, "zip.ts"),
|
"vs/base/node/zip": path.resolve(vsFills, "zip.ts"),
|
||||||
|
|||||||
BIN
packages/web/assets/logo.png
Normal file
BIN
packages/web/assets/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@coder/web",
|
"name": "@coder/web",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "../../node_modules/.bin/cross-env UV_THREADPOOL_SIZE=100 node --max-old-space-size=32384 ../../node_modules/webpack/bin/webpack.js --config ./webpack.config.js"
|
"build": "../../node_modules/.bin/cross-env UV_THREADPOOL_SIZE=100 node --max-old-space-size=32384 ../../node_modules/webpack/bin/webpack.js --config ./webpack.config.js"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,14 @@
|
|||||||
}
|
}
|
||||||
document.body.style.background = bg;
|
document.body.style.background = bg;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
// Check that service workers are registered
|
||||||
|
if ("serviceWorker" in navigator) {
|
||||||
|
// Use the window load event to keep the page load performant
|
||||||
|
window.addEventListener("load", () => {
|
||||||
|
navigator.serviceWorker.register("/service-worker.js");
|
||||||
|
});
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
</html>
|
||||||
</html>
|
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ const vsFills = path.join(root, "packages/vscode/src/fill");
|
|||||||
|
|
||||||
module.exports = merge(
|
module.exports = merge(
|
||||||
require(path.join(root, "scripts/webpack.client.config.js"))({
|
require(path.join(root, "scripts/webpack.client.config.js"))({
|
||||||
|
dirname: __dirname,
|
||||||
entry: path.join(root, "packages/web/src/index.ts"),
|
entry: path.join(root, "packages/web/src/index.ts"),
|
||||||
|
name: "ide",
|
||||||
template: path.join(root, "packages/web/src/index.html"),
|
template: path.join(root, "packages/web/src/index.html"),
|
||||||
typescriptCompilerOptions: {
|
typescriptCompilerOptions: {
|
||||||
"target": "es5",
|
"target": "es5",
|
||||||
@@ -15,11 +17,6 @@ module.exports = merge(
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
), {
|
), {
|
||||||
output: {
|
|
||||||
chunkFilename: "[name]-[hash:6].bundle.js",
|
|
||||||
path: path.join(__dirname, "out"),
|
|
||||||
filename: "[hash:6].bundle.js",
|
|
||||||
},
|
|
||||||
node: {
|
node: {
|
||||||
module: "empty",
|
module: "empty",
|
||||||
crypto: "empty",
|
crypto: "empty",
|
||||||
|
|||||||
@@ -1,4 +1,32 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -euxo pipefail
|
||||||
|
|
||||||
yarn task build:server:binary
|
# Variables to be set:
|
||||||
|
# $IMAGE
|
||||||
|
function docker_build() {
|
||||||
|
containerID=$(docker create -it -v $(pwd)/.cache:/src/.cache $IMAGE)
|
||||||
|
docker start $containerID
|
||||||
|
docker exec $containerID mkdir -p /src
|
||||||
|
|
||||||
|
function exec() {
|
||||||
|
docker exec $containerID bash -c "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
docker cp ./. $containerID:/src
|
||||||
|
exec "cd /src && yarn"
|
||||||
|
exec "cd /src && npm rebuild"
|
||||||
|
exec "cd /src && NODE_ENV=production VERSION=$VERSION yarn task build:server:binary"
|
||||||
|
exec "cd /src && yarn task package $VERSION"
|
||||||
|
docker cp $containerID:/src/release/. ./release/
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
|
NODE_ENV=production yarn task build:server:binary
|
||||||
|
else
|
||||||
|
if [[ "$TARGET" == "alpine" ]]; then
|
||||||
|
IMAGE="codercom/nbin-alpine"
|
||||||
|
else
|
||||||
|
IMAGE="codercom/nbin-centos"
|
||||||
|
fi
|
||||||
|
docker_build
|
||||||
|
fi
|
||||||
|
|||||||
@@ -21,3 +21,15 @@ Object.defineProperty(fs.read, util.promisify.custom, {
|
|||||||
global.requestAnimationFrame = (cb) => {
|
global.requestAnimationFrame = (cb) => {
|
||||||
setTimeout(cb, 0);
|
setTimeout(cb, 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// lchmod might not be available. Jest runs graceful-fs which makes this a no-op
|
||||||
|
// when it doesn't exist but that doesn't seem to always run when running
|
||||||
|
// multiple tests (or maybe it gets undone after a test).
|
||||||
|
if (!fs.lchmod) {
|
||||||
|
fs.lchmod = function (path, mode, cb) {
|
||||||
|
if (cb) {
|
||||||
|
process.nextTick(cb);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fs.lchmodSync = function () {};
|
||||||
|
}
|
||||||
|
|||||||
@@ -98,6 +98,14 @@ index f68ae90..d6b9ea7 100644
|
|||||||
@@ -24 +24 @@ import { disposableTimeout } from 'vs/base/common/async';
|
@@ -24 +24 @@ import { disposableTimeout } from 'vs/base/common/async';
|
||||||
-import { isMacintosh } from 'vs/base/common/platform';
|
-import { isMacintosh } from 'vs/base/common/platform';
|
||||||
+import { isMacintosh } from 'vs/base/browser/browser';
|
+import { isMacintosh } from 'vs/base/browser/browser';
|
||||||
|
diff --git a/src/vs/base/node/config.ts b/src/vs/base/node/config.ts
|
||||||
|
index 5ef2193..a232b6c 100644
|
||||||
|
--- a/src/vs/base/node/config.ts
|
||||||
|
+++ b/src/vs/base/node/config.ts
|
||||||
|
@@ -79,0 +80,3 @@ export class ConfigWatcher<T> implements IConfigWatcher<T>, IDisposable {
|
||||||
|
+ } else {
|
||||||
|
+ this.cache = config; // update config
|
||||||
|
+ this._onDidUpdateConfiguration.fire({ config });
|
||||||
diff --git a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts
|
diff --git a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts
|
||||||
index 74148e4..041205b 100644
|
index 74148e4..041205b 100644
|
||||||
--- a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts
|
--- a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts
|
||||||
@@ -121,9 +129,12 @@ index f91ca2b..ef6fce9 100644
|
|||||||
- const isMac = platform.isMacintosh;
|
- const isMac = platform.isMacintosh;
|
||||||
+ const isMac = browser.isMacintosh;
|
+ const isMac = browser.isMacintosh;
|
||||||
diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts
|
diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts
|
||||||
index f08c996..f9de58c 100644
|
index f08c996..7db13fa 100644
|
||||||
--- a/src/vs/code/electron-browser/issue/issueReporterMain.ts
|
--- a/src/vs/code/electron-browser/issue/issueReporterMain.ts
|
||||||
+++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts
|
+++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts
|
||||||
|
@@ -296 +296 @@ export class IssueReporter extends Disposable {
|
||||||
|
- const piiPaths = [this.environmentService.appRoot, this.environmentService.extensionsPath];
|
||||||
|
+ const piiPaths = [this.environmentService.appRoot, this.environmentService.extensionsPath, ...this.environmentService.extraExtensionPaths];
|
||||||
@@ -425 +425 @@ export class IssueReporter extends Disposable {
|
@@ -425 +425 @@ export class IssueReporter extends Disposable {
|
||||||
- const cmdOrCtrlKey = platform.isMacintosh ? e.metaKey : e.ctrlKey;
|
- const cmdOrCtrlKey = platform.isMacintosh ? e.metaKey : e.ctrlKey;
|
||||||
+ const cmdOrCtrlKey = browser.isMacintosh ? e.metaKey : e.ctrlKey;
|
+ const cmdOrCtrlKey = browser.isMacintosh ? e.metaKey : e.ctrlKey;
|
||||||
@@ -138,14 +149,44 @@ index e0ff793..885de12 100644
|
|||||||
- const cmdOrCtrlKey = platform.isMacintosh ? e.metaKey : e.ctrlKey;
|
- const cmdOrCtrlKey = platform.isMacintosh ? e.metaKey : e.ctrlKey;
|
||||||
+ const cmdOrCtrlKey = browser.isMacintosh ? e.metaKey : e.ctrlKey;
|
+ const cmdOrCtrlKey = browser.isMacintosh ? e.metaKey : e.ctrlKey;
|
||||||
diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts
|
diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts
|
||||||
index 6fd8249..796aed7 100644
|
index 6fd8249..6ae6b11 100644
|
||||||
--- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts
|
--- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts
|
||||||
+++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts
|
+++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts
|
||||||
@@ -223,0 +224,2 @@ async function handshake(configuration: ISharedProcessConfiguration): Promise<vo
|
@@ -50,0 +51,2 @@ import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiatio
|
||||||
+
|
+import { BackupMainService } from 'vs/platform/backup/electron-main/backupMainService';
|
||||||
|
+import { mkdirp } from 'vs/base/node/pfs';
|
||||||
|
@@ -93,0 +96,10 @@ function main(server: Server, initData: ISharedProcessInitData, configuration: I
|
||||||
|
+ Promise.all<boolean | undefined>([ // Copied from src/vs/code/electron-main/main.ts
|
||||||
|
+ environmentService.extensionsPath,
|
||||||
|
+ environmentService.nodeCachedDataDir,
|
||||||
|
+ environmentService.logsPath,
|
||||||
|
+ environmentService.globalStorageHome,
|
||||||
|
+ environmentService.workspaceStorageHome,
|
||||||
|
+ environmentService.backupHome,
|
||||||
|
+ ...environmentService.extraExtensionPaths,
|
||||||
|
+ ...environmentService.extraBuiltinExtensionPaths,
|
||||||
|
+ ].map((path): undefined | Promise<boolean> => path ? mkdirp(path) : undefined));
|
||||||
|
@@ -119,0 +132,2 @@ function main(server: Server, initData: ISharedProcessInitData, configuration: I
|
||||||
|
+ const backupMainService = instantiationService.createInstance(BackupMainService) as BackupMainService;
|
||||||
|
+ backupMainService.initialize().catch(console.error);
|
||||||
|
@@ -124 +138 @@ function main(server: Server, initData: ISharedProcessInitData, configuration: I
|
||||||
|
- const { appRoot, extensionsPath, extensionDevelopmentLocationURI, isBuilt, installSourcePath } = environmentService;
|
||||||
|
+ const { appRoot, extensionsPath, extraExtensionPaths, extensionDevelopmentLocationURI, isBuilt, installSourcePath } = environmentService;
|
||||||
|
@@ -138 +152 @@ function main(server: Server, initData: ISharedProcessInitData, configuration: I
|
||||||
|
- piiPaths: [appRoot, extensionsPath]
|
||||||
|
+ piiPaths: [appRoot, extensionsPath, ...extraExtensionPaths]
|
||||||
|
@@ -223,0 +238 @@ async function handshake(configuration: ISharedProcessConfiguration): Promise<vo
|
||||||
+startup({ machineId: "1" });
|
+startup({ machineId: "1" });
|
||||||
|
diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts
|
||||||
|
index 1f8b17a..2a875f9 100644
|
||||||
|
--- a/src/vs/code/node/cli.ts
|
||||||
|
+++ b/src/vs/code/node/cli.ts
|
||||||
|
@@ -43,0 +44,3 @@ export async function main(argv: string[]): Promise<any> {
|
||||||
|
+ const cli = await new Promise<IMainCli>((c, e) => require(['vs/code/node/cliProcessMain'], c, e));
|
||||||
|
+ await cli.main(args);
|
||||||
|
+ return; // Always just do this for now.
|
||||||
diff --git a/src/vs/editor/browser/config/configuration.ts b/src/vs/editor/browser/config/configuration.ts
|
diff --git a/src/vs/editor/browser/config/configuration.ts b/src/vs/editor/browser/config/configuration.ts
|
||||||
index f97a692..0206957 100644
|
index f97a692..8059a67 100644
|
||||||
--- a/src/vs/editor/browser/config/configuration.ts
|
--- a/src/vs/editor/browser/config/configuration.ts
|
||||||
+++ b/src/vs/editor/browser/config/configuration.ts
|
+++ b/src/vs/editor/browser/config/configuration.ts
|
||||||
@@ -10 +9,0 @@ import { Disposable } from 'vs/base/common/lifecycle';
|
@@ -10 +9,0 @@ import { Disposable } from 'vs/base/common/lifecycle';
|
||||||
@@ -157,9 +198,6 @@ index f97a692..0206957 100644
|
|||||||
@@ -367 +366 @@ export class Configuration extends CommonEditorConfiguration {
|
@@ -367 +366 @@ export class Configuration extends CommonEditorConfiguration {
|
||||||
- if (platform.isMacintosh) {
|
- if (platform.isMacintosh) {
|
||||||
+ if (browser.isMacintosh) {
|
+ if (browser.isMacintosh) {
|
||||||
@@ -378 +377 @@ export class Configuration extends CommonEditorConfiguration {
|
|
||||||
- emptySelectionClipboard: browser.isWebKit || browser.isFirefox,
|
|
||||||
+ emptySelectionClipboard: false, // browser.isWebKit || browser.isFirefox,
|
|
||||||
diff --git a/src/vs/editor/browser/controller/mouseHandler.ts b/src/vs/editor/browser/controller/mouseHandler.ts
|
diff --git a/src/vs/editor/browser/controller/mouseHandler.ts b/src/vs/editor/browser/controller/mouseHandler.ts
|
||||||
index b3b4472..f888d63 100644
|
index b3b4472..f888d63 100644
|
||||||
--- a/src/vs/editor/browser/controller/mouseHandler.ts
|
--- a/src/vs/editor/browser/controller/mouseHandler.ts
|
||||||
@@ -220,32 +258,55 @@ index c69ea3f..b8d87f7 100644
|
|||||||
-const GOLDEN_LINE_HEIGHT_RATIO = platform.isMacintosh ? 1.5 : 1.35;
|
-const GOLDEN_LINE_HEIGHT_RATIO = platform.isMacintosh ? 1.5 : 1.35;
|
||||||
+const GOLDEN_LINE_HEIGHT_RATIO = browser.isMacintosh ? 1.5 : 1.35;
|
+const GOLDEN_LINE_HEIGHT_RATIO = browser.isMacintosh ? 1.5 : 1.35;
|
||||||
diff --git a/src/vs/editor/contrib/clipboard/clipboard.ts b/src/vs/editor/contrib/clipboard/clipboard.ts
|
diff --git a/src/vs/editor/contrib/clipboard/clipboard.ts b/src/vs/editor/contrib/clipboard/clipboard.ts
|
||||||
index 990be3a..8a326c6 100644
|
index 990be3a..18ae0d5 100644
|
||||||
--- a/src/vs/editor/contrib/clipboard/clipboard.ts
|
--- a/src/vs/editor/contrib/clipboard/clipboard.ts
|
||||||
+++ b/src/vs/editor/contrib/clipboard/clipboard.ts
|
+++ b/src/vs/editor/contrib/clipboard/clipboard.ts
|
||||||
@@ -29 +29,2 @@ const supportsCopyWithSyntaxHighlighting = (supportsCopy && !browser.isEdgeOrIE)
|
@@ -18,0 +19 @@ import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegis
|
||||||
|
+import { clipboard } from 'electron';
|
||||||
|
@@ -29 +30,2 @@ const supportsCopyWithSyntaxHighlighting = (supportsCopy && !browser.isEdgeOrIE)
|
||||||
-const supportsPaste = (platform.isNative || (!browser.isChrome && document.queryCommandSupported('paste')));
|
-const supportsPaste = (platform.isNative || (!browser.isChrome && document.queryCommandSupported('paste')));
|
||||||
+// const supportsPaste = (platform.isNative || (!browser.isChrome && document.queryCommandSupported('paste')));
|
+// const supportsPaste = (platform.isNative || (!browser.isChrome && document.queryCommandSupported('paste')));
|
||||||
+const supportsPaste = true;
|
+const supportsPaste = true;
|
||||||
@@ -176,0 +178 @@ class ExecCommandPasteAction extends ExecCommandAction {
|
@@ -71 +73 @@ class ExecCommandCutAction extends ExecCommandAction {
|
||||||
|
- kbOpts = null;
|
||||||
|
+ // kbOpts = null;
|
||||||
|
@@ -119 +121 @@ class ExecCommandCopyAction extends ExecCommandAction {
|
||||||
|
- kbOpts = null;
|
||||||
|
+ // kbOpts = null;
|
||||||
|
@@ -174 +176 @@ class ExecCommandPasteAction extends ExecCommandAction {
|
||||||
|
- kbOpts = null;
|
||||||
|
+ // kbOpts = null;
|
||||||
|
@@ -176,0 +179 @@ class ExecCommandPasteAction extends ExecCommandAction {
|
||||||
+ const { workbench } = require('vs/../../../../packages/vscode/src/workbench') as typeof import ('vs/../../../../packages/vscode/src/workbench');
|
+ const { workbench } = require('vs/../../../../packages/vscode/src/workbench') as typeof import ('vs/../../../../packages/vscode/src/workbench');
|
||||||
@@ -181 +183 @@ class ExecCommandPasteAction extends ExecCommandAction {
|
@@ -181 +184 @@ class ExecCommandPasteAction extends ExecCommandAction {
|
||||||
- precondition: EditorContextKeys.writable,
|
- precondition: EditorContextKeys.writable,
|
||||||
+ precondition: (require('vs/platform/contextkey/common/contextkey') as typeof import('vs/platform/contextkey/common/contextkey')).ContextKeyExpr.and(EditorContextKeys.writable, workbench.clipboardContextKey),
|
+ precondition: (require('vs/platform/contextkey/common/contextkey') as typeof import('vs/platform/contextkey/common/contextkey')).ContextKeyExpr.and(EditorContextKeys.writable, workbench.clipboardContextKey),
|
||||||
@@ -191 +193,2 @@ class ExecCommandPasteAction extends ExecCommandAction {
|
@@ -191 +194,2 @@ class ExecCommandPasteAction extends ExecCommandAction {
|
||||||
- order: 3
|
- order: 3
|
||||||
+ order: 3,
|
+ order: 3,
|
||||||
+ when: workbench.clipboardContextKey,
|
+ when: workbench.clipboardContextKey,
|
||||||
@@ -194,0 +198,14 @@ class ExecCommandPasteAction extends ExecCommandAction {
|
@@ -194,0 +199,26 @@ class ExecCommandPasteAction extends ExecCommandAction {
|
||||||
+
|
+
|
||||||
+ public async run(accessor, editor: ICodeEditor): Promise<void> {
|
+ public async run(accessor, editor: ICodeEditor): Promise<void> {
|
||||||
+ if (editor instanceof (require('vs/editor/browser/widget/codeEditorWidget') as typeof import('vs/editor/browser/widget/codeEditorWidget')).CodeEditorWidget) {
|
+ if (editor instanceof (require('vs/editor/browser/widget/codeEditorWidget') as typeof import('vs/editor/browser/widget/codeEditorWidget')).CodeEditorWidget) {
|
||||||
+ try {
|
+ try {
|
||||||
+ editor.trigger('', (require('vs/editor/common/editorCommon') as typeof import ('vs/editor/common/editorCommon')).Handler.Paste, {
|
+ editor.focus();
|
||||||
+ text: await (require('vs/../../../../packages/vscode/src/workbench') as typeof import ('vs/../../../../packages/vscode/src/workbench')).workbench.clipboardText,
|
+ const textInput = document.activeElement! as HTMLTextAreaElement;
|
||||||
|
+ const dataTransfer = new DataTransfer();
|
||||||
|
+ const value = await clipboard.readText();
|
||||||
|
+ dataTransfer.setData("text/plain", value);
|
||||||
|
+ const pasteEvent = new ClipboardEvent("paste", {
|
||||||
|
+ clipboardData: dataTransfer,
|
||||||
+ });
|
+ });
|
||||||
|
+ textInput.dispatchEvent(pasteEvent);
|
||||||
+ } catch (ex) {
|
+ } catch (ex) {
|
||||||
+ super.run(accessor, editor);
|
+ try {
|
||||||
|
+ editor.trigger('', (require('vs/editor/common/editorCommon') as typeof import ('vs/editor/common/editorCommon')).Handler.Paste, {
|
||||||
|
+ text: await (require('vs/../../../../packages/vscode/src/workbench') as typeof import ('vs/../../../../packages/vscode/src/workbench')).workbench.clipboardText,
|
||||||
|
+ });
|
||||||
|
+ } catch (ex) {
|
||||||
|
+ super.run(accessor, editor);
|
||||||
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+ } else {
|
+ } else {
|
||||||
+ super.run(accessor, editor);
|
+ super.run(accessor, editor);
|
||||||
@@ -333,6 +394,81 @@ index 9952574..908a9ae 100644
|
|||||||
@@ -9 +9 @@ import { URI } from 'vs/base/common/uri';
|
@@ -9 +9 @@ import { URI } from 'vs/base/common/uri';
|
||||||
-import { isMacintosh } from 'vs/base/common/platform';
|
-import { isMacintosh } from 'vs/base/common/platform';
|
||||||
+import { isMacintosh } from 'vs/base/browser/browser';
|
+import { isMacintosh } from 'vs/base/browser/browser';
|
||||||
|
diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts
|
||||||
|
index eb1873c..dbbacd0 100644
|
||||||
|
--- a/src/vs/platform/environment/common/environment.ts
|
||||||
|
+++ b/src/vs/platform/environment/common/environment.ts
|
||||||
|
@@ -120,0 +121,2 @@ export interface IEnvironmentService {
|
||||||
|
+ extraExtensionPaths: string[];
|
||||||
|
+ extraBuiltinExtensionPaths: string[];
|
||||||
|
diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts
|
||||||
|
index 43866f8..e69b513 100644
|
||||||
|
--- a/src/vs/platform/environment/node/environmentService.ts
|
||||||
|
+++ b/src/vs/platform/environment/node/environmentService.ts
|
||||||
|
@@ -172,0 +173,8 @@ export class EnvironmentService implements IEnvironmentService {
|
||||||
|
+ @memoize
|
||||||
|
+ get extraExtensionPaths(): string[] {
|
||||||
|
+ return this._args['extra-extension-dirs'] || [];
|
||||||
|
+ }
|
||||||
|
+ @memoize
|
||||||
|
+ get extraBuiltinExtensionPaths(): string[] {
|
||||||
|
+ return this._args['extra-builtin-extension-dirs'] || [];
|
||||||
|
+ }
|
||||||
|
diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts
|
||||||
|
index c897029..f84d9b6 100644
|
||||||
|
--- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts
|
||||||
|
+++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts
|
||||||
|
@@ -733,5 +733,9 @@ export class ExtensionManagementService extends Disposable implements IExtension
|
||||||
|
- const systemExtensionsPromise = this.scanExtensions(this.systemExtensionsPath, ExtensionType.System)
|
||||||
|
- .then(result => {
|
||||||
|
- this.logService.info('Scanned system extensions:', result.length);
|
||||||
|
- return result;
|
||||||
|
- });
|
||||||
|
+ const systemExtensionsPromise = Promise.all([
|
||||||
|
+ this.scanExtensions(this.systemExtensionsPath, ExtensionType.System),
|
||||||
|
+ ...this.environmentService.extraBuiltinExtensionPaths
|
||||||
|
+ .map((path) => this.scanExtensions(path, ExtensionType.System))
|
||||||
|
+ ]).then((results) => {
|
||||||
|
+ const result = results.reduce((flat, current) => flat.concat(current), []);
|
||||||
|
+ this.logService.info('Scanned system extensions:', result.length);
|
||||||
|
+ return result;
|
||||||
|
+ });
|
||||||
|
@@ -761 +765 @@ export class ExtensionManagementService extends Disposable implements IExtension
|
||||||
|
- return Promise.all([this.getUninstalledExtensions(), this.scanExtensions(this.extensionsPath, ExtensionType.User)])
|
||||||
|
+ return Promise.all([this.getUninstalledExtensions(), this.scanAllUserExtensions(this.extensionsPath, ExtensionType.User)])
|
||||||
|
@@ -772,0 +777,7 @@ export class ExtensionManagementService extends Disposable implements IExtension
|
||||||
|
+ private scanAllUserExtensions(folderName: string, type: ExtensionType): Promise<ILocalExtension[]> {
|
||||||
|
+ return Promise.all([
|
||||||
|
+ this.scanExtensions(folderName, type),
|
||||||
|
+ ...this.environmentService.extraExtensionPaths.map((p) => this.scanExtensions(p, ExtensionType.User))
|
||||||
|
+ ]).then((results) => results.reduce((flat, current) => flat.concat(current), []));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
@@ -805 +816 @@ export class ExtensionManagementService extends Disposable implements IExtension
|
||||||
|
- .then(uninstalled => this.scanExtensions(this.extensionsPath, ExtensionType.User) // All user extensions
|
||||||
|
+ .then(uninstalled => this.scanAllUserExtensions(this.extensionsPath, ExtensionType.User) // All user extensions
|
||||||
|
@@ -814 +825 @@ export class ExtensionManagementService extends Disposable implements IExtension
|
||||||
|
- return this.scanExtensions(this.extensionsPath, ExtensionType.User) // All user extensions
|
||||||
|
+ return this.scanAllUserExtensions(this.extensionsPath, ExtensionType.User) // All user extensions
|
||||||
|
diff --git a/src/vs/platform/storage/node/storageMainService.ts b/src/vs/platform/storage/node/storageMainService.ts
|
||||||
|
index 9845da1..567c195 100644
|
||||||
|
--- a/src/vs/platform/storage/node/storageMainService.ts
|
||||||
|
+++ b/src/vs/platform/storage/node/storageMainService.ts
|
||||||
|
@@ -169 +169,6 @@ export class StorageMainService extends Disposable implements IStorageMainServic
|
||||||
|
- return readdir(this.environmentService.extensionsPath).then(extensions => {
|
||||||
|
+ return Promise.all([
|
||||||
|
+ this.environmentService.extensionsPath,
|
||||||
|
+ ...this.environmentService.extraExtensionPaths,
|
||||||
|
+ ].map((p) => readdir(p)))
|
||||||
|
+ .then((results) => results.reduce((flat, current) => flat.concat(current), []))
|
||||||
|
+ .then(extensions => {
|
||||||
|
diff --git a/src/vs/platform/telemetry/electron-browser/telemetryService.ts b/src/vs/platform/telemetry/electron-browser/telemetryService.ts
|
||||||
|
index 31d0309..5b166af 100644
|
||||||
|
--- a/src/vs/platform/telemetry/electron-browser/telemetryService.ts
|
||||||
|
+++ b/src/vs/platform/telemetry/electron-browser/telemetryService.ts
|
||||||
|
@@ -42 +42 @@ export class TelemetryService extends Disposable implements ITelemetryService {
|
||||||
|
- piiPaths: [environmentService.appRoot, environmentService.extensionsPath]
|
||||||
|
+ piiPaths: [environmentService.appRoot, environmentService.extensionsPath, ...environmentService.extraExtensionPaths]
|
||||||
diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts
|
diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts
|
||||||
index cbc55b3..9d27c01 100644
|
index cbc55b3..9d27c01 100644
|
||||||
--- a/src/vs/platform/windows/common/windows.ts
|
--- a/src/vs/platform/windows/common/windows.ts
|
||||||
@@ -349,6 +485,17 @@ index 25e74c8..0bed89e 100644
|
|||||||
@@ -769 +769 @@ function loadCommonJSModule<T>(logService: ILogService, modulePath: string, acti
|
@@ -769 +769 @@ function loadCommonJSModule<T>(logService: ILogService, modulePath: string, acti
|
||||||
- r = require.__$__nodeRequire<T>(modulePath);
|
- r = require.__$__nodeRequire<T>(modulePath);
|
||||||
+ r = (global as any).nativeNodeRequire(modulePath);
|
+ r = (global as any).nativeNodeRequire(modulePath);
|
||||||
|
diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts
|
||||||
|
index 84406b8..cffd952 100644
|
||||||
|
--- a/src/vs/workbench/api/node/extHostTypeConverters.ts
|
||||||
|
+++ b/src/vs/workbench/api/node/extHostTypeConverters.ts
|
||||||
|
@@ -26 +25,0 @@ import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumen
|
||||||
|
-import { isString, isNumber } from 'vs/base/common/types';
|
||||||
|
@@ -31 +29,0 @@ import { LogLevel as _MainLogLevel } from 'vs/platform/log/common/log';
|
||||||
|
-import { coalesce } from 'vs/base/common/arrays';
|
||||||
|
@@ -117,0 +116,2 @@ export namespace Diagnostic {
|
||||||
|
+ const { isString, isNumber } = require('vs/base/common/types');
|
||||||
|
+ const { coalesce } = require('vs/base/common/arrays');
|
||||||
diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts
|
diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts
|
||||||
index 7b6ad89..3190356 100644
|
index 7b6ad89..3190356 100644
|
||||||
--- a/src/vs/workbench/browser/dnd.ts
|
--- a/src/vs/workbench/browser/dnd.ts
|
||||||
@@ -357,19 +504,35 @@ index 7b6ad89..3190356 100644
|
|||||||
- return;
|
- return;
|
||||||
+ return (require('vs/../../../../packages/vscode/src/workbench') as typeof import ('vs/../../../../packages/vscode/src/workbench')).workbench.handleDrop(event, resolveTargetGroup, afterDrop, targetIndex);
|
+ return (require('vs/../../../../packages/vscode/src/workbench') as typeof import ('vs/../../../../packages/vscode/src/workbench')).workbench.handleDrop(event, resolveTargetGroup, afterDrop, targetIndex);
|
||||||
diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts
|
diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts
|
||||||
index c25c940..9f11d98 100644
|
index c25c940..f2004f8 100644
|
||||||
--- a/src/vs/workbench/browser/layout.ts
|
--- a/src/vs/workbench/browser/layout.ts
|
||||||
+++ b/src/vs/workbench/browser/layout.ts
|
+++ b/src/vs/workbench/browser/layout.ts
|
||||||
@@ -12 +12 @@ import { Registry } from 'vs/platform/registry/common/platform';
|
@@ -12 +12 @@ import { Registry } from 'vs/platform/registry/common/platform';
|
||||||
-import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform';
|
-import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform';
|
||||||
+import { isWindows, isLinux, isMacintosh, isNative, isWeb } from 'vs/base/common/platform';
|
+import { isWindows, isLinux, isMacintosh, isNative } from 'vs/base/common/platform';
|
||||||
@@ -210 +210 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
|
@@ -210 +210 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
|
||||||
- if ((isWindows || isLinux) && getTitleBarStyle(this.configurationService, this.environmentService) === 'custom') {
|
- if ((isWindows || isLinux) && getTitleBarStyle(this.configurationService, this.environmentService) === 'custom') {
|
||||||
+ if ((isWeb || isWindows || isLinux) && getTitleBarStyle(this.configurationService, this.environmentService) === 'custom') {
|
+ // if ((isWeb || isWindows || isLinux) && getTitleBarStyle(this.configurationService, this.environmentService) === 'custom') {
|
||||||
@@ -535 +535 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
|
@@ -212 +212 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
|
||||||
|
- }
|
||||||
|
+ // }
|
||||||
|
@@ -219 +219 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
|
||||||
|
- if (this.state.fullscreen && (this.state.menuBar.visibility === 'toggle' || this.state.menuBar.visibility === 'default')) {
|
||||||
|
+ if ((this.state.menuBar.visibility === 'toggle' || this.state.menuBar.visibility === 'default')) {
|
||||||
|
@@ -531 +531,5 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
|
||||||
|
- if (getTitleBarStyle(this.configurationService, this.environmentService) === 'native') {
|
||||||
|
+ if (this.state.menuBar.visibility === 'hidden') {
|
||||||
|
+ return false;
|
||||||
|
+ } else if (this.state.menuBar.visibility === 'toggle') {
|
||||||
|
+ return this.state.menuBar.toggled;
|
||||||
|
+ } else if (getTitleBarStyle(this.configurationService, this.environmentService) === 'native') {
|
||||||
|
@@ -535 +539 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
|
||||||
- } else if (isMacintosh) {
|
- } else if (isMacintosh) {
|
||||||
+ } else if (isNative && isMacintosh) {
|
+ } else if (isNative && isMacintosh) {
|
||||||
@@ -567 +567 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
|
@@ -539,2 +542,0 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
|
||||||
|
- } else if (this.state.menuBar.visibility === 'toggle' || this.state.menuBar.visibility === 'default') {
|
||||||
|
- return this.state.menuBar.toggled;
|
||||||
|
@@ -567 +569 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
|
||||||
- if (isMacintosh || this.state.menuBar.visibility === 'hidden') {
|
- if (isMacintosh || this.state.menuBar.visibility === 'hidden') {
|
||||||
+ if ((isNative && isMacintosh) || this.state.menuBar.visibility === 'hidden') {
|
+ if ((isNative && isMacintosh) || this.state.menuBar.visibility === 'hidden') {
|
||||||
diff --git a/src/vs/workbench/browser/legacyLayout.ts b/src/vs/workbench/browser/legacyLayout.ts
|
diff --git a/src/vs/workbench/browser/legacyLayout.ts b/src/vs/workbench/browser/legacyLayout.ts
|
||||||
@@ -481,7 +644,7 @@ index a822341..43b882a 100644
|
|||||||
- if (!isMacintosh && this.currentTitlebarStyleSetting === 'custom') {
|
- if (!isMacintosh && this.currentTitlebarStyleSetting === 'custom') {
|
||||||
+ if (!(isNative && isMacintosh) && this.currentTitlebarStyleSetting === 'custom') {
|
+ if (!(isNative && isMacintosh) && this.currentTitlebarStyleSetting === 'custom') {
|
||||||
diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts
|
diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts
|
||||||
index 028f375..4bfe956 100644
|
index 028f375..f740471 100644
|
||||||
--- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts
|
--- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts
|
||||||
+++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts
|
+++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts
|
||||||
@@ -11 +11 @@ import { ITitleService, ITitleProperties } from 'vs/workbench/services/title/com
|
@@ -11 +11 @@ import { ITitleService, ITitleProperties } from 'vs/workbench/services/title/com
|
||||||
@@ -495,7 +658,10 @@ index 028f375..4bfe956 100644
|
|||||||
+ if (!(isNative && isMacintosh)) {
|
+ if (!(isNative && isMacintosh)) {
|
||||||
@@ -343 +343 @@ export class TitlebarPart extends Part implements ITitleService {
|
@@ -343 +343 @@ export class TitlebarPart extends Part implements ITitleService {
|
||||||
- if (!isMacintosh) {
|
- if (!isMacintosh) {
|
||||||
+ if (!(isNative && isMacintosh)) {
|
+ // if (!(isNative && isMacintosh)) {
|
||||||
|
@@ -346 +346 @@ export class TitlebarPart extends Part implements ITitleService {
|
||||||
|
- }
|
||||||
|
+ // }
|
||||||
@@ -549 +549 @@ export class TitlebarPart extends Part implements ITitleService {
|
@@ -549 +549 @@ export class TitlebarPart extends Part implements ITitleService {
|
||||||
- if (!isMacintosh &&
|
- if (!isMacintosh &&
|
||||||
+ if (!(isNative && isMacintosh) &&
|
+ if (!(isNative && isMacintosh) &&
|
||||||
@@ -711,11 +877,14 @@ index 1f8088e..f5b0551 100644
|
|||||||
- included: platform.isMacintosh
|
- included: platform.isMacintosh
|
||||||
+ included: platform.isNative && platform.isMacintosh
|
+ included: platform.isNative && platform.isMacintosh
|
||||||
diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts
|
diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts
|
||||||
index 24ba122..fca7faf 100644
|
index 24ba122..3ab8804 100644
|
||||||
--- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts
|
--- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts
|
||||||
+++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts
|
+++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts
|
||||||
@@ -12,0 +13 @@ import * as nls from 'vs/nls';
|
@@ -12,0 +13 @@ import * as nls from 'vs/nls';
|
||||||
+import * as browser from 'vs/base/browser/browser';
|
+import * as browser from 'vs/base/browser/browser';
|
||||||
|
@@ -185 +186 @@ configurationRegistry.registerConfiguration({
|
||||||
|
- default: 'auto',
|
||||||
|
+ default: browser.isSafari ? 'dom' : 'auto',
|
||||||
@@ -196 +197 @@ configurationRegistry.registerConfiguration({
|
@@ -196 +197 @@ configurationRegistry.registerConfiguration({
|
||||||
- default: platform.isMacintosh ? 'selectWord' : platform.isWindows ? 'copyPaste' : 'default',
|
- default: platform.isMacintosh ? 'selectWord' : platform.isWindows ? 'copyPaste' : 'default',
|
||||||
+ default: browser.isMacintosh ? 'selectWord' : browser.isWindows ? 'copyPaste' : 'default',
|
+ default: browser.isMacintosh ? 'selectWord' : browser.isWindows ? 'copyPaste' : 'default',
|
||||||
@@ -744,7 +913,7 @@ index 780147c..2e8c9af 100644
|
|||||||
- if (platform.isMacintosh) {
|
- if (platform.isMacintosh) {
|
||||||
+ if (browser.isMacintosh) {
|
+ if (browser.isMacintosh) {
|
||||||
diff --git a/src/vs/workbench/contrib/webview/electron-browser/webview-pre.js b/src/vs/workbench/contrib/webview/electron-browser/webview-pre.js
|
diff --git a/src/vs/workbench/contrib/webview/electron-browser/webview-pre.js b/src/vs/workbench/contrib/webview/electron-browser/webview-pre.js
|
||||||
index 74fc798..03728d0 100644
|
index 74fc798..0b6b5eb 100644
|
||||||
--- a/src/vs/workbench/contrib/webview/electron-browser/webview-pre.js
|
--- a/src/vs/workbench/contrib/webview/electron-browser/webview-pre.js
|
||||||
+++ b/src/vs/workbench/contrib/webview/electron-browser/webview-pre.js
|
+++ b/src/vs/workbench/contrib/webview/electron-browser/webview-pre.js
|
||||||
@@ -10 +10,19 @@
|
@@ -10 +10,19 @@
|
||||||
@@ -783,6 +952,11 @@ index 74fc798..03728d0 100644
|
|||||||
+ // supportFetchAPI: true,
|
+ // supportFetchAPI: true,
|
||||||
+ // corsEnabled: true
|
+ // corsEnabled: true
|
||||||
+ // });
|
+ // });
|
||||||
|
@@ -328 +346,3 @@
|
||||||
|
- newFrame.contentWindow.focus();
|
||||||
|
+ if (document.hasFocus()) {
|
||||||
|
+ newFrame.contentWindow.focus();
|
||||||
|
+ }
|
||||||
diff --git a/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts b/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts
|
diff --git a/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts b/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts
|
||||||
index 484ff86..f3f57cb 100644
|
index 484ff86..f3f57cb 100644
|
||||||
--- a/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts
|
--- a/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts
|
||||||
@@ -844,13 +1018,19 @@ index 48ef482..dc47f81 100644
|
|||||||
- placeHolder: isMacintosh ? nls.localize('openRecentPlaceHolderMac', "Select to open (hold Cmd-key to open in new window)") : nls.localize('openRecentPlaceHolder', "Select to open (hold Ctrl-key to open in new window)"),
|
- placeHolder: isMacintosh ? nls.localize('openRecentPlaceHolderMac', "Select to open (hold Cmd-key to open in new window)") : nls.localize('openRecentPlaceHolder', "Select to open (hold Ctrl-key to open in new window)"),
|
||||||
+ placeHolder: browser.isMacintosh ? nls.localize('openRecentPlaceHolderMac', "Select to open (hold Cmd-key to open in new window)") : nls.localize('openRecentPlaceHolder', "Select to open (hold Ctrl-key to open in new window)"),
|
+ placeHolder: browser.isMacintosh ? nls.localize('openRecentPlaceHolderMac', "Select to open (hold Cmd-key to open in new window)") : nls.localize('openRecentPlaceHolder', "Select to open (hold Ctrl-key to open in new window)"),
|
||||||
diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts
|
diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts
|
||||||
index 71bc992..59a1a20 100644
|
index 71bc992..a76dad4 100644
|
||||||
--- a/src/vs/workbench/electron-browser/main.contribution.ts
|
--- a/src/vs/workbench/electron-browser/main.contribution.ts
|
||||||
+++ b/src/vs/workbench/electron-browser/main.contribution.ts
|
+++ b/src/vs/workbench/electron-browser/main.contribution.ts
|
||||||
@@ -13 +13,2 @@ import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes';
|
@@ -13 +13,2 @@ import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes';
|
||||||
-import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform';
|
-import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform';
|
||||||
+import { isNative, isWeb } from 'vs/base/common/platform';
|
+import { isNative, isWeb } from 'vs/base/common/platform';
|
||||||
+import { isMacintosh, isWindows, isLinux } from 'vs/base/browser/browser';
|
+import { isMacintosh, isWindows, isLinux } from 'vs/base/browser/browser';
|
||||||
|
@@ -37 +38 @@ import { LogStorageAction } from 'vs/platform/storage/node/storageService';
|
||||||
|
- if (isMacintosh) {
|
||||||
|
+ if (isNative && isMacintosh) {
|
||||||
|
@@ -225 +226 @@ import { LogStorageAction } from 'vs/platform/storage/node/storageService';
|
||||||
|
- if (isMacintosh) {
|
||||||
|
+ if (isNative && isMacintosh) {
|
||||||
@@ -306 +307 @@ import { LogStorageAction } from 'vs/platform/storage/node/storageService';
|
@@ -306 +307 @@ import { LogStorageAction } from 'vs/platform/storage/node/storageService';
|
||||||
- when: IsMacContext.toNegated()
|
- when: IsMacContext.toNegated()
|
||||||
+ // when: IsMacContext.toNegated()
|
+ // when: IsMacContext.toNegated()
|
||||||
@@ -866,8 +1046,10 @@ index 71bc992..59a1a20 100644
|
|||||||
@@ -633 +634 @@ import { LogStorageAction } from 'vs/platform/storage/node/storageService';
|
@@ -633 +634 @@ import { LogStorageAction } from 'vs/platform/storage/node/storageService';
|
||||||
- 'included': isWindows || isLinux
|
- 'included': isWindows || isLinux
|
||||||
+ 'included': isWeb || isWindows || isLinux
|
+ 'included': isWeb || isWindows || isLinux
|
||||||
@@ -650 +651 @@ import { LogStorageAction } from 'vs/platform/storage/node/storageService';
|
@@ -649,2 +650,2 @@ import { LogStorageAction } from 'vs/platform/storage/node/storageService';
|
||||||
|
- 'enum': ['native', 'custom'],
|
||||||
- 'default': isLinux ? 'native' : 'custom',
|
- 'default': isLinux ? 'native' : 'custom',
|
||||||
|
+ 'enum': ['custom'],
|
||||||
+ 'default': isNative && isLinux ? 'native' : 'custom',
|
+ 'default': isNative && isLinux ? 'native' : 'custom',
|
||||||
@@ -659 +660 @@ import { LogStorageAction } from 'vs/platform/storage/node/storageService';
|
@@ -659 +660 @@ import { LogStorageAction } from 'vs/platform/storage/node/storageService';
|
||||||
- 'included': isMacintosh && parseFloat(os.release()) >= 16 // Minimum: macOS Sierra (10.12.x = darwin 16.x)
|
- 'included': isMacintosh && parseFloat(os.release()) >= 16 // Minimum: macOS Sierra (10.12.x = darwin 16.x)
|
||||||
@@ -903,11 +1085,30 @@ index 75f0026..2e94683 100644
|
|||||||
- if (!isMacintosh && getTitleBarStyle(configurationService, environmentService) === 'custom') {
|
- if (!isMacintosh && getTitleBarStyle(configurationService, environmentService) === 'custom') {
|
||||||
+ if (!(isNative && isMacintosh) && getTitleBarStyle(configurationService, environmentService) === 'custom') {
|
+ if (!(isNative && isMacintosh) && getTitleBarStyle(configurationService, environmentService) === 'custom') {
|
||||||
diff --git a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts
|
diff --git a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts
|
||||||
index 059f821..2dde675 100644
|
index 059f821..b19f292 100644
|
||||||
--- a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts
|
--- a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts
|
||||||
+++ b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts
|
+++ b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts
|
||||||
@@ -32,0 +33 @@ function getSystemExtensionsRoot(): string {
|
@@ -32,0 +33 @@ function getSystemExtensionsRoot(): string {
|
||||||
+ return (require('vs/../../../../packages/vscode/src/fill/paths') as typeof import ('vs/../../../../packages/vscode/src/fill/paths')).getBuiltInExtensionsDirectory();
|
+ return (require('vs/../../../../packages/vscode/src/fill/paths') as typeof import ('vs/../../../../packages/vscode/src/fill/paths')).getBuiltInExtensionsDirectory();
|
||||||
|
@@ -191,2 +192,3 @@ export class CachedExtensionScanner {
|
||||||
|
- const folderStat = await pfs.stat(input.absoluteFolderPath);
|
||||||
|
- input.mtime = folderStat.mtime.getTime();
|
||||||
|
+ const folderStats = await Promise.all([pfs.stat(input.absoluteFolderPath), ...input.extraFolderPaths.map((p) => pfs.stat(p))]);
|
||||||
|
+ input.mtime = folderStats[0].mtime.getTime();
|
||||||
|
+ input.extraMtimes = folderStats.slice(1).map((s) => s.mtime.getTime());
|
||||||
|
@@ -259 +261 @@ export class CachedExtensionScanner {
|
||||||
|
- new ExtensionScannerInput(version, commit, locale, devMode, getSystemExtensionsRoot(), true, false, translations),
|
||||||
|
+ new ExtensionScannerInput(version, commit, locale, devMode, getSystemExtensionsRoot(), true, false, translations, environmentService.extraBuiltinExtensionPaths),
|
||||||
|
@@ -290 +292 @@ export class CachedExtensionScanner {
|
||||||
|
- new ExtensionScannerInput(version, commit, locale, devMode, environmentService.extensionsPath, false, false, translations),
|
||||||
|
+ new ExtensionScannerInput(version, commit, locale, devMode, environmentService.extensionsPath, false, false, translations, environmentService.extraExtensionPaths),
|
||||||
|
diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts
|
||||||
|
index 9133b7e..8c801b7 100644
|
||||||
|
--- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts
|
||||||
|
+++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts
|
||||||
|
@@ -461 +461 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
|
||||||
|
- if (errorMessage === this._lastExtensionHostError) {
|
||||||
|
+ if (errorMessage === this._lastExtensionHostError || errorMessage === "disconnected") {
|
||||||
diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts
|
diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts
|
||||||
index b337206..0477464 100644
|
index b337206..0477464 100644
|
||||||
--- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts
|
--- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts
|
||||||
@@ -925,6 +1126,54 @@ index 838a9c7..2308cee 100644
|
|||||||
@@ -192 +192 @@ function connectToRenderer(protocol: IMessagePassingProtocol): Promise<IRenderer
|
@@ -192 +192 @@ function connectToRenderer(protocol: IMessagePassingProtocol): Promise<IRenderer
|
||||||
- process.kill(initData.parentPid, 0); // throws an exception if the main process doesn't exist anymore.
|
- process.kill(initData.parentPid, 0); // throws an exception if the main process doesn't exist anymore.
|
||||||
+ // process.kill(initData.parentPid, 0); // throws an exception if the main process doesn't exist anymore.
|
+ // process.kill(initData.parentPid, 0); // throws an exception if the main process doesn't exist anymore.
|
||||||
|
diff --git a/src/vs/workbench/services/extensions/node/extensionPoints.ts b/src/vs/workbench/services/extensions/node/extensionPoints.ts
|
||||||
|
index 6e2179d..e6f38c9 100644
|
||||||
|
--- a/src/vs/workbench/services/extensions/node/extensionPoints.ts
|
||||||
|
+++ b/src/vs/workbench/services/extensions/node/extensionPoints.ts
|
||||||
|
@@ -445,0 +446 @@ export class ExtensionScannerInput {
|
||||||
|
+ public extraMtimes: number[] = [];
|
||||||
|
@@ -455 +456,2 @@ export class ExtensionScannerInput {
|
||||||
|
- public readonly tanslations: Translations
|
||||||
|
+ public readonly tanslations: Translations,
|
||||||
|
+ public readonly extraFolderPaths: string[] = [],
|
||||||
|
@@ -469,0 +472,16 @@ export class ExtensionScannerInput {
|
||||||
|
+ // Allow extra folder paths in any order. Doesn't account for duplicates though.
|
||||||
|
+ const eq = (a: string[] = [], b: string[] = [], atimes: number[] = [], btimes: number[] = []): boolean => {
|
||||||
|
+ if (a.length !== b.length || atimes.length !== btimes.length) {
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ for (let i = 0; i < a.length; ++i) {
|
||||||
|
+ const index = b.indexOf(a[i]);
|
||||||
|
+ if (index === -1) {
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ if (atimes[i] !== btimes[index]) {
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return true;
|
||||||
|
+ };
|
||||||
|
@@ -479,0 +498 @@ export class ExtensionScannerInput {
|
||||||
|
+ && eq(a.extraFolderPaths, b.extraFolderPaths, a.extraMtimes, b.extraMtimes)
|
||||||
|
@@ -530 +549 @@ export class ExtensionScanner {
|
||||||
|
- * Scan a list of extensions defined in `absoluteFolderPath`
|
||||||
|
+ * Scan a list of extensions defined in `absoluteFolderPath` and `extraFolderPaths`
|
||||||
|
@@ -532 +551 @@ export class ExtensionScanner {
|
||||||
|
- public static async scanExtensions(input: ExtensionScannerInput, log: ILog, resolver: IExtensionResolver | null = null): Promise<IExtensionDescription[]> {
|
||||||
|
+ public static async scanExtensions(input: ExtensionScannerInput, log: ILog, resolvers: IExtensionResolver | IExtensionResolver[] | null = null): Promise<IExtensionDescription[]> {
|
||||||
|
@@ -533,0 +553 @@ export class ExtensionScanner {
|
||||||
|
+ const extraFolderPaths = input.extraFolderPaths;
|
||||||
|
@@ -537,2 +557,4 @@ export class ExtensionScanner {
|
||||||
|
- if (!resolver) {
|
||||||
|
- resolver = new DefaultExtensionResolver(absoluteFolderPath);
|
||||||
|
+ if (!resolvers) {
|
||||||
|
+ resolvers = [absoluteFolderPath, ...extraFolderPaths].map((p) => new DefaultExtensionResolver(p));
|
||||||
|
+ } else if (!Array.isArray(resolvers)) {
|
||||||
|
+ resolvers = [resolvers];
|
||||||
|
@@ -552 +574,2 @@ export class ExtensionScanner {
|
||||||
|
- let refs = await resolver.resolveExtensions();
|
||||||
|
+ let refs = await Promise.all(resolvers.map((resolver) => resolver.resolveExtensions()))
|
||||||
|
+ .then((results) => results.reduce((flat, current) => flat.concat(current), []));
|
||||||
diff --git a/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts b/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts
|
diff --git a/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts b/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts
|
||||||
index 33d3697..af71b01 100644
|
index 33d3697..af71b01 100644
|
||||||
--- a/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts
|
--- a/src/vs/workbench/services/files/node/watcher/nsfw/watcherService.ts
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ set -euxo pipefail
|
|||||||
# Builds a tarfile containing vscode sourcefiles neccessary for CI.
|
# Builds a tarfile containing vscode sourcefiles neccessary for CI.
|
||||||
# Done outside the CI and uploaded to object storage to reduce CI time.
|
# Done outside the CI and uploaded to object storage to reduce CI time.
|
||||||
|
|
||||||
branch=1.33.0
|
branch=1.33.1
|
||||||
dir=/tmp/vstar
|
dir=/tmp/vstar
|
||||||
outfile=/tmp/vstar-$branch.tar.gz
|
outfile=/tmp/vstar-$branch.tar.gz
|
||||||
rm -rf $dir
|
rm -rf $dir
|
||||||
|
|||||||
@@ -4,10 +4,12 @@ const merge = require("webpack-merge");
|
|||||||
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
||||||
const PreloadWebpackPlugin = require("preload-webpack-plugin");
|
const PreloadWebpackPlugin = require("preload-webpack-plugin");
|
||||||
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
||||||
// const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer");
|
const WebpackPwaManifest = require("webpack-pwa-manifest");
|
||||||
|
const { GenerateSW } = require("workbox-webpack-plugin");
|
||||||
|
|
||||||
const root = path.join(__dirname, "..");
|
const root = path.join(__dirname, "..");
|
||||||
const prod = process.env.NODE_ENV === "production" || process.env.CI === "true";
|
const prod = process.env.NODE_ENV === "production" || process.env.CI === "true";
|
||||||
|
const cachePattern = /\.(?:png|jpg|jpeg|svg|css|js|ttf|woff|eot|woff2|wasm)$/;
|
||||||
|
|
||||||
module.exports = (options = {}) => merge(
|
module.exports = (options = {}) => merge(
|
||||||
require("./webpack.general.config")(options), {
|
require("./webpack.general.config")(options), {
|
||||||
@@ -44,18 +46,43 @@ module.exports = (options = {}) => merge(
|
|||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
new MiniCssExtractPlugin({
|
new MiniCssExtractPlugin({
|
||||||
filename: "[name].css",
|
chunkFilename: `${options.name || "client"}.[name].[hash:6].css`,
|
||||||
chunkFilename: "[id].css",
|
filename: `${options.name || "client"}.[name].[hash:6].css`
|
||||||
}),
|
}),
|
||||||
new HtmlWebpackPlugin({
|
new HtmlWebpackPlugin({
|
||||||
template: options.template,
|
template: options.template
|
||||||
}),
|
}),
|
||||||
new PreloadWebpackPlugin({
|
new PreloadWebpackPlugin({
|
||||||
rel: "preload",
|
rel: "preload",
|
||||||
as: "script",
|
as: "script"
|
||||||
}),
|
}),
|
||||||
].concat(prod ? [] : [
|
new WebpackPwaManifest({
|
||||||
new webpack.HotModuleReplacementPlugin(),
|
name: "Coder",
|
||||||
]),
|
short_name: "Coder",
|
||||||
target: "web",
|
description: "Run VS Code on a remote server",
|
||||||
|
background_color: "#e5e5e5",
|
||||||
|
icons: [{
|
||||||
|
src: path.join(root, "packages/web/assets/logo.png"),
|
||||||
|
sizes: [96, 128, 192, 256, 384],
|
||||||
|
}],
|
||||||
|
})
|
||||||
|
].concat(prod ? [
|
||||||
|
new GenerateSW({
|
||||||
|
include: [cachePattern],
|
||||||
|
runtimeCaching: [{
|
||||||
|
urlPattern: cachePattern,
|
||||||
|
handler: "StaleWhileRevalidate",
|
||||||
|
options: {
|
||||||
|
cacheName: "code-server",
|
||||||
|
expiration: {
|
||||||
|
maxAgeSeconds: 86400,
|
||||||
|
},
|
||||||
|
cacheableResponse: {
|
||||||
|
statuses: [0, 200],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]}),
|
||||||
|
] : [new webpack.HotModuleReplacementPlugin()]),
|
||||||
|
target: "web"
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -10,18 +10,28 @@ const root = path.join(__dirname, "..");
|
|||||||
module.exports = (options = {}) => ({
|
module.exports = (options = {}) => ({
|
||||||
context: root,
|
context: root,
|
||||||
devtool: "none",
|
devtool: "none",
|
||||||
externals: ["fsevents"],
|
externals: {
|
||||||
|
fsevents: "fsevents",
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
path: path.join(options.dirname || __dirname, "out"),
|
||||||
|
chunkFilename: `${options.name || "general"}.[name].[hash:6].js`,
|
||||||
|
filename: `${options.name || "general"}.[name].[hash:6].js`
|
||||||
|
},
|
||||||
module: {
|
module: {
|
||||||
rules: [{
|
rules: [{
|
||||||
loader: "string-replace-loader",
|
loader: "string-replace-loader",
|
||||||
test: /\.(j|t)s/,
|
test: /\.(j|t)s/,
|
||||||
options: {
|
options: {
|
||||||
multiple: [{
|
multiple: [{
|
||||||
// These will be handled by file-loader. We need the location because
|
// These will be handled by file-loader. Must be a fully formed URI.
|
||||||
// they are parsed as URIs and will throw errors if not fully formed.
|
// The !! prefix causes it to ignore other loaders.
|
||||||
// The !! prefix causes it to ignore other loaders (doesn't work).
|
|
||||||
search: "require\\.toUrl\\(",
|
search: "require\\.toUrl\\(",
|
||||||
replace: "location.protocol + '//' + location.host + '/' + require('!!file-loader?name=[path][name].[ext]!' + ",
|
replace: `${
|
||||||
|
options.node
|
||||||
|
? "'file://'"
|
||||||
|
: "location.protocol + '//' + location.host + location.pathname.replace(/\\/$/,'')"
|
||||||
|
} + '/' + require('!!file-loader?name=[path][name].[ext]!' + `,
|
||||||
flags: "g",
|
flags: "g",
|
||||||
}, {
|
}, {
|
||||||
search: "require\\.__\\$__nodeRequire",
|
search: "require\\.__\\$__nodeRequire",
|
||||||
@@ -44,48 +54,6 @@ module.exports = (options = {}) => ({
|
|||||||
}, {
|
}, {
|
||||||
test: /\.wasm$/,
|
test: /\.wasm$/,
|
||||||
type: "javascript/auto",
|
type: "javascript/auto",
|
||||||
}, {
|
|
||||||
// Fixes spdlog.
|
|
||||||
test: /spdlog(\\|\/)index\.js/,
|
|
||||||
loader: "string-replace-loader",
|
|
||||||
options: {
|
|
||||||
multiple: [{
|
|
||||||
search: "const spdlog.*;",
|
|
||||||
replace: "const spdlog = __non_webpack_require__(global.SPDLOG_LOCATION);",
|
|
||||||
flags: "g",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
// This is required otherwise it attempts to require("package.json")
|
|
||||||
test: /@oclif(\\|\/)command(\\|\/)lib(\\|\/)index\.js/,
|
|
||||||
loader: "string-replace-loader",
|
|
||||||
options: {
|
|
||||||
multiple: [{
|
|
||||||
search: "checkNodeVersion\\(\\);",
|
|
||||||
replace: "",
|
|
||||||
flags: "g",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
test: /node\-pty\-prebuilt(\\|\/)lib(\\|\/)index\.js/,
|
|
||||||
loader: "string-replace-loader",
|
|
||||||
options: {
|
|
||||||
multiple: [{
|
|
||||||
search: "exports\\.native.*;",
|
|
||||||
replace: "exports.native = null;",
|
|
||||||
flags: "g",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
test: /node\-pty\-prebuilt(\\|\/)lib(\\|\/).*\.js/,
|
|
||||||
loader: "string-replace-loader",
|
|
||||||
options: {
|
|
||||||
multiple: [{
|
|
||||||
search: "var pty = .*pty\.node.*;",
|
|
||||||
replace: "var pty = __non_webpack_require__(global.NODEPTY_LOCATION);",
|
|
||||||
flags: "g",
|
|
||||||
}],
|
|
||||||
},
|
|
||||||
}],
|
}],
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
|
|||||||
@@ -1,8 +1,15 @@
|
|||||||
const merge = require("webpack-merge");
|
const merge = require("webpack-merge");
|
||||||
|
|
||||||
module.exports = (options = {}) => merge(
|
module.exports = (options = {}) => merge(
|
||||||
require("./webpack.general.config")(options), {
|
require("./webpack.general.config")({
|
||||||
|
...options,
|
||||||
|
node: true,
|
||||||
|
}), {
|
||||||
devtool: "none",
|
devtool: "none",
|
||||||
mode: "production",
|
mode: "production",
|
||||||
target: "node",
|
target: "node",
|
||||||
|
externals: {
|
||||||
|
spdlog: "commonjs spdlog",
|
||||||
|
"node-pty": "commonjs node-pty",
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -23,9 +23,6 @@
|
|||||||
],
|
],
|
||||||
"vs/*": [
|
"vs/*": [
|
||||||
"./lib/vscode/src/vs/*"
|
"./lib/vscode/src/vs/*"
|
||||||
],
|
|
||||||
"node-pty": [
|
|
||||||
"./packages/protocol/node_modules/node-pty-prebuilt"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
616
yarn.lock
616
yarn.lock
@@ -2,6 +2,20 @@
|
|||||||
# yarn lockfile v1
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
"@babel/runtime@^7.0.0":
|
||||||
|
version "7.3.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83"
|
||||||
|
integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==
|
||||||
|
dependencies:
|
||||||
|
regenerator-runtime "^0.12.0"
|
||||||
|
|
||||||
|
"@babel/runtime@^7.3.4":
|
||||||
|
version "7.4.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.3.tgz#79888e452034223ad9609187a0ad1fe0d2ad4bdc"
|
||||||
|
integrity sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA==
|
||||||
|
dependencies:
|
||||||
|
regenerator-runtime "^0.13.2"
|
||||||
|
|
||||||
"@types/fs-extra@^5.0.4":
|
"@types/fs-extra@^5.0.4":
|
||||||
version "5.0.5"
|
version "5.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.5.tgz#080d90a792f3fa2c5559eb44bd8ef840aae9104b"
|
resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.5.tgz#080d90a792f3fa2c5559eb44bd8ef840aae9104b"
|
||||||
@@ -458,6 +472,39 @@ babel-code-frame@^6.22.0:
|
|||||||
esutils "^2.0.2"
|
esutils "^2.0.2"
|
||||||
js-tokens "^3.0.2"
|
js-tokens "^3.0.2"
|
||||||
|
|
||||||
|
babel-extract-comments@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21"
|
||||||
|
integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==
|
||||||
|
dependencies:
|
||||||
|
babylon "^6.18.0"
|
||||||
|
|
||||||
|
babel-plugin-syntax-object-rest-spread@^6.8.0:
|
||||||
|
version "6.13.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
|
||||||
|
integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=
|
||||||
|
|
||||||
|
babel-plugin-transform-object-rest-spread@^6.26.0:
|
||||||
|
version "6.26.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
|
||||||
|
integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=
|
||||||
|
dependencies:
|
||||||
|
babel-plugin-syntax-object-rest-spread "^6.8.0"
|
||||||
|
babel-runtime "^6.26.0"
|
||||||
|
|
||||||
|
babel-runtime@^6.26.0:
|
||||||
|
version "6.26.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
|
||||||
|
integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
|
||||||
|
dependencies:
|
||||||
|
core-js "^2.4.0"
|
||||||
|
regenerator-runtime "^0.11.0"
|
||||||
|
|
||||||
|
babylon@^6.18.0:
|
||||||
|
version "6.18.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
|
||||||
|
integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
|
||||||
|
|
||||||
balanced-match@^1.0.0:
|
balanced-match@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
|
||||||
@@ -513,11 +560,21 @@ big.js@^5.2.2:
|
|||||||
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
|
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
|
||||||
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
|
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
|
||||||
|
|
||||||
|
bignumber.js@^2.1.0:
|
||||||
|
version "2.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8"
|
||||||
|
integrity sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=
|
||||||
|
|
||||||
binary-extensions@^1.0.0:
|
binary-extensions@^1.0.0:
|
||||||
version "1.12.0"
|
version "1.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
|
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
|
||||||
integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==
|
integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==
|
||||||
|
|
||||||
|
bindings@1.3.0, bindings@^1.3.0:
|
||||||
|
version "1.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7"
|
||||||
|
integrity sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==
|
||||||
|
|
||||||
block-stream@*:
|
block-stream@*:
|
||||||
version "0.0.9"
|
version "0.0.9"
|
||||||
resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
|
resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
|
||||||
@@ -530,6 +587,11 @@ bluebird@^3.5.1, bluebird@^3.5.3:
|
|||||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
|
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
|
||||||
integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
|
integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
|
||||||
|
|
||||||
|
bmp-js@0.0.3:
|
||||||
|
version "0.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.3.tgz#64113e9c7cf1202b376ed607bf30626ebe57b18a"
|
||||||
|
integrity sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=
|
||||||
|
|
||||||
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
|
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
|
||||||
version "4.11.8"
|
version "4.11.8"
|
||||||
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
|
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
|
||||||
@@ -656,6 +718,11 @@ browserify-zlib@^0.2.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
pako "~1.0.5"
|
pako "~1.0.5"
|
||||||
|
|
||||||
|
buffer-equal@0.0.1:
|
||||||
|
version "0.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
|
||||||
|
integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=
|
||||||
|
|
||||||
buffer-from@^1.0.0, buffer-from@^1.1.0:
|
buffer-from@^1.0.0, buffer-from@^1.1.0:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
|
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
|
||||||
@@ -929,16 +996,16 @@ commander@2.17.x, commander@~2.17.1:
|
|||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
|
||||||
integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
|
integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
|
||||||
|
|
||||||
commander@^2.12.1, commander@^2.18.0:
|
commander@^2.12.1, commander@^2.18.0, commander@^2.19.0:
|
||||||
version "2.19.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
|
|
||||||
integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
|
|
||||||
|
|
||||||
commander@^2.19.0:
|
|
||||||
version "2.20.0"
|
version "2.20.0"
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
|
||||||
integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
|
integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
|
||||||
|
|
||||||
|
common-tags@^1.8.0:
|
||||||
|
version "1.8.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
|
||||||
|
integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==
|
||||||
|
|
||||||
commondir@^1.0.1:
|
commondir@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
|
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
|
||||||
@@ -1043,6 +1110,11 @@ copy-descriptor@^0.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
|
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
|
||||||
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
|
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
|
||||||
|
|
||||||
|
core-js@^2.4.0:
|
||||||
|
version "2.6.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895"
|
||||||
|
integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==
|
||||||
|
|
||||||
core-js@^2.5.7:
|
core-js@^2.5.7:
|
||||||
version "2.6.2"
|
version "2.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.2.tgz#267988d7268323b349e20b4588211655f0e83944"
|
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.2.tgz#267988d7268323b349e20b4588211655f0e83944"
|
||||||
@@ -1128,6 +1200,11 @@ crypto-browserify@^3.11.0, crypto-browserify@^3.12.0:
|
|||||||
randombytes "^2.0.0"
|
randombytes "^2.0.0"
|
||||||
randomfill "^1.0.3"
|
randomfill "^1.0.3"
|
||||||
|
|
||||||
|
css-color-names@0.0.4:
|
||||||
|
version "0.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
|
||||||
|
integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=
|
||||||
|
|
||||||
css-loader@^2.1.0:
|
css-loader@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.0.tgz#42952ac22bca5d076978638e9813abce49b8f0cc"
|
resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.0.tgz#42952ac22bca5d076978638e9813abce49b8f0cc"
|
||||||
@@ -1398,6 +1475,11 @@ dom-serializer@0:
|
|||||||
domelementtype "~1.1.1"
|
domelementtype "~1.1.1"
|
||||||
entities "~1.1.1"
|
entities "~1.1.1"
|
||||||
|
|
||||||
|
dom-walk@^0.1.0:
|
||||||
|
version "0.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
|
||||||
|
integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=
|
||||||
|
|
||||||
domain-browser@^1.1.1:
|
domain-browser@^1.1.1:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
|
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
|
||||||
@@ -1526,7 +1608,7 @@ error-ex@^1.2.0, error-ex@^1.3.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-arrayish "^0.2.1"
|
is-arrayish "^0.2.1"
|
||||||
|
|
||||||
es-abstract@^1.4.3, es-abstract@^1.5.1:
|
es-abstract@^1.4.3, es-abstract@^1.5.0, es-abstract@^1.5.1:
|
||||||
version "1.13.0"
|
version "1.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
|
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
|
||||||
integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
|
integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
|
||||||
@@ -1547,6 +1629,11 @@ es-to-primitive@^1.2.0:
|
|||||||
is-date-object "^1.0.1"
|
is-date-object "^1.0.1"
|
||||||
is-symbol "^1.0.2"
|
is-symbol "^1.0.2"
|
||||||
|
|
||||||
|
es6-promise@^3.0.2:
|
||||||
|
version "3.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
|
||||||
|
integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=
|
||||||
|
|
||||||
escape-html@~1.0.3:
|
escape-html@~1.0.3:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
|
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
|
||||||
@@ -1643,6 +1730,11 @@ execa@^1.0.0:
|
|||||||
signal-exit "^3.0.0"
|
signal-exit "^3.0.0"
|
||||||
strip-eof "^1.0.0"
|
strip-eof "^1.0.0"
|
||||||
|
|
||||||
|
exif-parser@^0.1.9:
|
||||||
|
version "0.1.12"
|
||||||
|
resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922"
|
||||||
|
integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=
|
||||||
|
|
||||||
expand-brackets@^2.1.4:
|
expand-brackets@^2.1.4:
|
||||||
version "2.1.4"
|
version "2.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
|
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
|
||||||
@@ -1785,6 +1877,11 @@ file-loader@^3.0.1:
|
|||||||
loader-utils "^1.0.2"
|
loader-utils "^1.0.2"
|
||||||
schema-utils "^1.0.0"
|
schema-utils "^1.0.0"
|
||||||
|
|
||||||
|
file-type@^3.1.0:
|
||||||
|
version "3.9.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
|
||||||
|
integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
|
||||||
|
|
||||||
filesize@^3.6.1:
|
filesize@^3.6.1:
|
||||||
version "3.6.1"
|
version "3.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
|
resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
|
||||||
@@ -1862,6 +1959,13 @@ follow-redirects@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
debug "=3.1.0"
|
debug "=3.1.0"
|
||||||
|
|
||||||
|
for-each@^0.3.3:
|
||||||
|
version "0.3.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
|
||||||
|
integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
|
||||||
|
dependencies:
|
||||||
|
is-callable "^1.1.3"
|
||||||
|
|
||||||
for-in@^0.1.3:
|
for-in@^0.1.3:
|
||||||
version "0.1.8"
|
version "0.1.8"
|
||||||
resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
|
resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
|
||||||
@@ -1930,6 +2034,15 @@ from2@^2.1.0:
|
|||||||
inherits "^2.0.1"
|
inherits "^2.0.1"
|
||||||
readable-stream "^2.0.0"
|
readable-stream "^2.0.0"
|
||||||
|
|
||||||
|
fs-extra@^4.0.2:
|
||||||
|
version "4.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
|
||||||
|
integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
|
||||||
|
dependencies:
|
||||||
|
graceful-fs "^4.1.2"
|
||||||
|
jsonfile "^4.0.0"
|
||||||
|
universalify "^0.1.0"
|
||||||
|
|
||||||
fs-extra@^7.0.1:
|
fs-extra@^7.0.1:
|
||||||
version "7.0.1"
|
version "7.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
|
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
|
||||||
@@ -2010,6 +2123,11 @@ get-caller-file@^1.0.1, get-caller-file@^1.0.2:
|
|||||||
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
|
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
|
||||||
integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
|
integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
|
||||||
|
|
||||||
|
get-own-enumerable-property-symbols@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203"
|
||||||
|
integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==
|
||||||
|
|
||||||
get-stdin@^4.0.1:
|
get-stdin@^4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
|
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
|
||||||
@@ -2084,6 +2202,14 @@ global-prefix@^1.0.1:
|
|||||||
is-windows "^1.0.1"
|
is-windows "^1.0.1"
|
||||||
which "^1.2.14"
|
which "^1.2.14"
|
||||||
|
|
||||||
|
global@~4.3.0:
|
||||||
|
version "4.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
|
||||||
|
integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
|
||||||
|
dependencies:
|
||||||
|
min-document "^2.19.0"
|
||||||
|
process "~0.5.1"
|
||||||
|
|
||||||
globby@^6.1.0:
|
globby@^6.1.0:
|
||||||
version "6.1.0"
|
version "6.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
|
resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
|
||||||
@@ -2235,6 +2361,11 @@ hmac-drbg@^1.0.0:
|
|||||||
minimalistic-assert "^1.0.0"
|
minimalistic-assert "^1.0.0"
|
||||||
minimalistic-crypto-utils "^1.0.1"
|
minimalistic-crypto-utils "^1.0.1"
|
||||||
|
|
||||||
|
hoek@6.x.x:
|
||||||
|
version "6.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c"
|
||||||
|
integrity sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==
|
||||||
|
|
||||||
homedir-polyfill@^1.0.1:
|
homedir-polyfill@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
|
resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
|
||||||
@@ -2488,6 +2619,11 @@ invert-kv@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
|
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
|
||||||
integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
|
integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
|
||||||
|
|
||||||
|
ip-regex@^1.0.1:
|
||||||
|
version "1.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd"
|
||||||
|
integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=
|
||||||
|
|
||||||
ip-regex@^2.1.0:
|
ip-regex@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
|
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
|
||||||
@@ -2546,7 +2682,7 @@ is-builtin-module@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
builtin-modules "^1.0.0"
|
builtin-modules "^1.0.0"
|
||||||
|
|
||||||
is-callable@^1.1.4:
|
is-callable@^1.1.3, is-callable@^1.1.4:
|
||||||
version "1.1.4"
|
version "1.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
|
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
|
||||||
integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
|
integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
|
||||||
@@ -2624,6 +2760,11 @@ is-fullwidth-code-point@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
|
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
|
||||||
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
|
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
|
||||||
|
|
||||||
|
is-function@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
|
||||||
|
integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
|
||||||
|
|
||||||
is-glob@^3.1.0:
|
is-glob@^3.1.0:
|
||||||
version "3.1.0"
|
version "3.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
|
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
|
||||||
@@ -2645,6 +2786,11 @@ is-number@^3.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
kind-of "^3.0.2"
|
kind-of "^3.0.2"
|
||||||
|
|
||||||
|
is-obj@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
|
||||||
|
integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
|
||||||
|
|
||||||
is-path-cwd@^1.0.0:
|
is-path-cwd@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
|
resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
|
||||||
@@ -2678,6 +2824,11 @@ is-regex@^1.0.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
has "^1.0.1"
|
has "^1.0.1"
|
||||||
|
|
||||||
|
is-regexp@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
|
||||||
|
integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk=
|
||||||
|
|
||||||
is-stream@^1.1.0:
|
is-stream@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
||||||
@@ -2720,6 +2871,13 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
||||||
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
|
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
|
||||||
|
|
||||||
|
isemail@3.x.x:
|
||||||
|
version "3.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c"
|
||||||
|
integrity sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==
|
||||||
|
dependencies:
|
||||||
|
punycode "2.x.x"
|
||||||
|
|
||||||
isexe@^2.0.0:
|
isexe@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
||||||
@@ -2742,6 +2900,42 @@ isstream@~0.1.2:
|
|||||||
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
|
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
|
||||||
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
|
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
|
||||||
|
|
||||||
|
jimp@^0.2.28:
|
||||||
|
version "0.2.28"
|
||||||
|
resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.28.tgz#dd529a937190f42957a7937d1acc3a7762996ea2"
|
||||||
|
integrity sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=
|
||||||
|
dependencies:
|
||||||
|
bignumber.js "^2.1.0"
|
||||||
|
bmp-js "0.0.3"
|
||||||
|
es6-promise "^3.0.2"
|
||||||
|
exif-parser "^0.1.9"
|
||||||
|
file-type "^3.1.0"
|
||||||
|
jpeg-js "^0.2.0"
|
||||||
|
load-bmfont "^1.2.3"
|
||||||
|
mime "^1.3.4"
|
||||||
|
mkdirp "0.5.1"
|
||||||
|
pixelmatch "^4.0.0"
|
||||||
|
pngjs "^3.0.0"
|
||||||
|
read-chunk "^1.0.1"
|
||||||
|
request "^2.65.0"
|
||||||
|
stream-to-buffer "^0.1.0"
|
||||||
|
tinycolor2 "^1.1.2"
|
||||||
|
url-regex "^3.0.0"
|
||||||
|
|
||||||
|
joi@^14.3.1:
|
||||||
|
version "14.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/joi/-/joi-14.3.1.tgz#164a262ec0b855466e0c35eea2a885ae8b6c703c"
|
||||||
|
integrity sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==
|
||||||
|
dependencies:
|
||||||
|
hoek "6.x.x"
|
||||||
|
isemail "3.x.x"
|
||||||
|
topo "3.x.x"
|
||||||
|
|
||||||
|
jpeg-js@^0.2.0:
|
||||||
|
version "0.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482"
|
||||||
|
integrity sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=
|
||||||
|
|
||||||
js-base64@^2.1.8:
|
js-base64@^2.1.8:
|
||||||
version "2.5.0"
|
version "2.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.0.tgz#42255ba183ab67ce59a0dee640afdc00ab5ae93e"
|
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.0.tgz#42255ba183ab67ce59a0dee640afdc00ab5ae93e"
|
||||||
@@ -2785,6 +2979,13 @@ json-schema@0.2.3:
|
|||||||
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
|
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
|
||||||
integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
|
integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
|
||||||
|
|
||||||
|
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"
|
||||||
|
integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
|
||||||
|
dependencies:
|
||||||
|
jsonify "~0.0.0"
|
||||||
|
|
||||||
json-stringify-safe@5.0.1, json-stringify-safe@~5.0.1:
|
json-stringify-safe@5.0.1, json-stringify-safe@~5.0.1:
|
||||||
version "5.0.1"
|
version "5.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
|
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
|
||||||
@@ -2877,6 +3078,20 @@ lightercollective@^0.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/lightercollective/-/lightercollective-0.1.0.tgz#70df102c530dcb8d0ccabfe6175a8d00d5f61300"
|
resolved "https://registry.yarnpkg.com/lightercollective/-/lightercollective-0.1.0.tgz#70df102c530dcb8d0ccabfe6175a8d00d5f61300"
|
||||||
integrity sha512-J9tg5uraYoQKaWbmrzDDexbG6hHnMcWS1qLYgJSWE+mpA3U5OCSeMUhb+K55otgZJ34oFdR0ECvdIb3xuO5JOQ==
|
integrity sha512-J9tg5uraYoQKaWbmrzDDexbG6hHnMcWS1qLYgJSWE+mpA3U5OCSeMUhb+K55otgZJ34oFdR0ECvdIb3xuO5JOQ==
|
||||||
|
|
||||||
|
load-bmfont@^1.2.3:
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b"
|
||||||
|
integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==
|
||||||
|
dependencies:
|
||||||
|
buffer-equal "0.0.1"
|
||||||
|
mime "^1.3.4"
|
||||||
|
parse-bmfont-ascii "^1.0.3"
|
||||||
|
parse-bmfont-binary "^1.0.5"
|
||||||
|
parse-bmfont-xml "^1.1.4"
|
||||||
|
phin "^2.9.1"
|
||||||
|
xhr "^2.0.1"
|
||||||
|
xtend "^4.0.0"
|
||||||
|
|
||||||
load-json-file@^1.0.0:
|
load-json-file@^1.0.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
|
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
|
||||||
@@ -2939,6 +3154,11 @@ locate-path@^3.0.0:
|
|||||||
p-locate "^3.0.0"
|
p-locate "^3.0.0"
|
||||||
path-exists "^3.0.0"
|
path-exists "^3.0.0"
|
||||||
|
|
||||||
|
lodash._reinterpolate@~3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
|
||||||
|
integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
|
||||||
|
|
||||||
lodash.assign@^4.2.0:
|
lodash.assign@^4.2.0:
|
||||||
version "4.2.0"
|
version "4.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
|
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
|
||||||
@@ -2964,6 +3184,21 @@ lodash.tail@^4.1.1:
|
|||||||
resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
|
resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
|
||||||
integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=
|
integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=
|
||||||
|
|
||||||
|
lodash.template@^4.4.0:
|
||||||
|
version "4.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0"
|
||||||
|
integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=
|
||||||
|
dependencies:
|
||||||
|
lodash._reinterpolate "~3.0.0"
|
||||||
|
lodash.templatesettings "^4.0.0"
|
||||||
|
|
||||||
|
lodash.templatesettings@^4.0.0:
|
||||||
|
version "4.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316"
|
||||||
|
integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=
|
||||||
|
dependencies:
|
||||||
|
lodash._reinterpolate "~3.0.0"
|
||||||
|
|
||||||
lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.5, lodash@~4.17.10:
|
lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.5, lodash@~4.17.10:
|
||||||
version "4.17.11"
|
version "4.17.11"
|
||||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
|
||||||
@@ -3144,6 +3379,11 @@ mime@1.4.1:
|
|||||||
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
|
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
|
||||||
integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
|
integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
|
||||||
|
|
||||||
|
mime@^1.3.4, mime@^1.6.0:
|
||||||
|
version "1.6.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
|
||||||
|
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
|
||||||
|
|
||||||
mime@^2.0.3, mime@^2.3.1:
|
mime@^2.0.3, mime@^2.3.1:
|
||||||
version "2.4.0"
|
version "2.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6"
|
resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6"
|
||||||
@@ -3154,6 +3394,13 @@ mimic-fn@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
|
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
|
||||||
integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
|
integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
|
||||||
|
|
||||||
|
min-document@^2.19.0:
|
||||||
|
version "2.19.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
|
||||||
|
integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
|
||||||
|
dependencies:
|
||||||
|
dom-walk "^0.1.0"
|
||||||
|
|
||||||
mini-css-extract-plugin@^0.5.0:
|
mini-css-extract-plugin@^0.5.0:
|
||||||
version "0.5.0"
|
version "0.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0"
|
resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0"
|
||||||
@@ -3237,7 +3484,7 @@ mixin-object@^2.0.1:
|
|||||||
for-in "^0.1.3"
|
for-in "^0.1.3"
|
||||||
is-extendable "^0.1.1"
|
is-extendable "^0.1.1"
|
||||||
|
|
||||||
mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
|
mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
|
||||||
version "0.5.1"
|
version "0.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
||||||
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
|
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
|
||||||
@@ -3292,11 +3539,16 @@ multicast-dns@^6.0.1:
|
|||||||
dns-packet "^1.3.1"
|
dns-packet "^1.3.1"
|
||||||
thunky "^1.0.2"
|
thunky "^1.0.2"
|
||||||
|
|
||||||
nan@^2.10.0, nan@^2.9.2:
|
nan@2.12.1, nan@^2.10.0, nan@^2.9.2:
|
||||||
version "2.12.1"
|
version "2.12.1"
|
||||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552"
|
resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552"
|
||||||
integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==
|
integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==
|
||||||
|
|
||||||
|
nan@^2.8.0:
|
||||||
|
version "2.13.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
|
||||||
|
integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==
|
||||||
|
|
||||||
nanomatch@^1.2.9:
|
nanomatch@^1.2.9:
|
||||||
version "1.2.13"
|
version "1.2.13"
|
||||||
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
|
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
|
||||||
@@ -3418,6 +3670,13 @@ node-pre-gyp@^0.10.0:
|
|||||||
semver "^5.3.0"
|
semver "^5.3.0"
|
||||||
tar "^4"
|
tar "^4"
|
||||||
|
|
||||||
|
node-pty@0.8.1:
|
||||||
|
version "0.8.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.8.1.tgz#94b457bec013e7a09b8d9141f63b0787fa25c23f"
|
||||||
|
integrity sha512-j+/g0Q5dR+vkELclpJpz32HcS3O/3EdPSGPvDXJZVJQLCvgG0toEbfmymxAEyQyZEpaoKHAcoL+PvKM+4N9nlw==
|
||||||
|
dependencies:
|
||||||
|
nan "2.12.1"
|
||||||
|
|
||||||
node-sass@^4.11.0:
|
node-sass@^4.11.0:
|
||||||
version "4.11.0"
|
version "4.11.0"
|
||||||
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.11.0.tgz#183faec398e9cbe93ba43362e2768ca988a6369a"
|
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.11.0.tgz#183faec398e9cbe93ba43362e2768ca988a6369a"
|
||||||
@@ -3736,6 +3995,32 @@ parse-asn1@^5.0.0:
|
|||||||
evp_bytestokey "^1.0.0"
|
evp_bytestokey "^1.0.0"
|
||||||
pbkdf2 "^3.0.3"
|
pbkdf2 "^3.0.3"
|
||||||
|
|
||||||
|
parse-bmfont-ascii@^1.0.3:
|
||||||
|
version "1.0.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285"
|
||||||
|
integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=
|
||||||
|
|
||||||
|
parse-bmfont-binary@^1.0.5:
|
||||||
|
version "1.0.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006"
|
||||||
|
integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=
|
||||||
|
|
||||||
|
parse-bmfont-xml@^1.1.4:
|
||||||
|
version "1.1.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389"
|
||||||
|
integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==
|
||||||
|
dependencies:
|
||||||
|
xml-parse-from-string "^1.0.0"
|
||||||
|
xml2js "^0.4.5"
|
||||||
|
|
||||||
|
parse-headers@^2.0.0:
|
||||||
|
version "2.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34"
|
||||||
|
integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==
|
||||||
|
dependencies:
|
||||||
|
for-each "^0.3.3"
|
||||||
|
string.prototype.trim "^1.1.2"
|
||||||
|
|
||||||
parse-json@^2.2.0:
|
parse-json@^2.2.0:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
|
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
|
||||||
@@ -3850,6 +4135,11 @@ performance-now@^2.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
|
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
|
||||||
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
|
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
|
||||||
|
|
||||||
|
phin@^2.9.1:
|
||||||
|
version "2.9.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
|
||||||
|
integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
|
||||||
|
|
||||||
pidtree@^0.3.0:
|
pidtree@^0.3.0:
|
||||||
version "0.3.0"
|
version "0.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.0.tgz#f6fada10fccc9f99bf50e90d0b23d72c9ebc2e6b"
|
resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.0.tgz#f6fada10fccc9f99bf50e90d0b23d72c9ebc2e6b"
|
||||||
@@ -3877,6 +4167,13 @@ pinkie@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
|
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
|
||||||
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
|
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
|
||||||
|
|
||||||
|
pixelmatch@^4.0.0:
|
||||||
|
version "4.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854"
|
||||||
|
integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=
|
||||||
|
dependencies:
|
||||||
|
pngjs "^3.0.0"
|
||||||
|
|
||||||
pkg-dir@^3.0.0:
|
pkg-dir@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
|
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
|
||||||
@@ -3884,6 +4181,11 @@ pkg-dir@^3.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
find-up "^3.0.0"
|
find-up "^3.0.0"
|
||||||
|
|
||||||
|
pngjs@^3.0.0:
|
||||||
|
version "3.3.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b"
|
||||||
|
integrity sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q==
|
||||||
|
|
||||||
portfinder@^1.0.9:
|
portfinder@^1.0.9:
|
||||||
version "1.0.20"
|
version "1.0.20"
|
||||||
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a"
|
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a"
|
||||||
@@ -3952,6 +4254,11 @@ preload-webpack-plugin@^3.0.0-beta.2:
|
|||||||
core-js "^2.5.7"
|
core-js "^2.5.7"
|
||||||
url-parse "^1.4.3"
|
url-parse "^1.4.3"
|
||||||
|
|
||||||
|
pretty-bytes@^5.1.0:
|
||||||
|
version "5.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.1.0.tgz#6237ecfbdc6525beaef4de722cc60a58ae0e6c6d"
|
||||||
|
integrity sha512-wa5+qGVg9Yt7PB6rYm3kXlKzgzgivYTLRandezh43jjRqgyDyP+9YxfJpJiLs9yKD1WeU8/OvtToWpW7255FtA==
|
||||||
|
|
||||||
pretty-error@^2.0.2:
|
pretty-error@^2.0.2:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
|
resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
|
||||||
@@ -3970,6 +4277,11 @@ process@^0.11.10:
|
|||||||
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
||||||
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
|
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
|
||||||
|
|
||||||
|
process@~0.5.1:
|
||||||
|
version "0.5.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
|
||||||
|
integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
|
||||||
|
|
||||||
promise-inflight@^1.0.1:
|
promise-inflight@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
|
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
|
||||||
@@ -4040,16 +4352,16 @@ punycode@1.3.2:
|
|||||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
|
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
|
||||||
integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
|
integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
|
||||||
|
|
||||||
|
punycode@2.x.x, punycode@^2.1.0:
|
||||||
|
version "2.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
|
||||||
|
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
|
||||||
|
|
||||||
punycode@^1.2.4, punycode@^1.4.1:
|
punycode@^1.2.4, punycode@^1.4.1:
|
||||||
version "1.4.1"
|
version "1.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
|
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
|
||||||
integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
|
integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
|
||||||
|
|
||||||
punycode@^2.1.0:
|
|
||||||
version "2.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
|
|
||||||
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
|
|
||||||
|
|
||||||
qs@6.5.2, qs@~6.5.2:
|
qs@6.5.2, qs@~6.5.2:
|
||||||
version "6.5.2"
|
version "6.5.2"
|
||||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
|
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
|
||||||
@@ -4110,6 +4422,11 @@ rc@^1.2.7:
|
|||||||
minimist "^1.2.0"
|
minimist "^1.2.0"
|
||||||
strip-json-comments "~2.0.1"
|
strip-json-comments "~2.0.1"
|
||||||
|
|
||||||
|
read-chunk@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194"
|
||||||
|
integrity sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=
|
||||||
|
|
||||||
read-pkg-up@^1.0.1:
|
read-pkg-up@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
|
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
|
||||||
@@ -4190,6 +4507,21 @@ regenerate@^1.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
|
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
|
||||||
integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
|
integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
|
||||||
|
|
||||||
|
regenerator-runtime@^0.11.0:
|
||||||
|
version "0.11.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
|
||||||
|
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
|
||||||
|
|
||||||
|
regenerator-runtime@^0.12.0:
|
||||||
|
version "0.12.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
|
||||||
|
integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==
|
||||||
|
|
||||||
|
regenerator-runtime@^0.13.2:
|
||||||
|
version "0.13.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447"
|
||||||
|
integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==
|
||||||
|
|
||||||
regex-not@^1.0.0, regex-not@^1.0.2:
|
regex-not@^1.0.0, regex-not@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
|
resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
|
||||||
@@ -4257,7 +4589,7 @@ repeating@^2.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-finite "^1.0.0"
|
is-finite "^1.0.0"
|
||||||
|
|
||||||
request@^2.87.0, request@^2.88.0:
|
request@^2.65.0, request@^2.87.0, request@^2.88.0:
|
||||||
version "2.88.0"
|
version "2.88.0"
|
||||||
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
|
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
|
||||||
integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
|
integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
|
||||||
@@ -4396,7 +4728,7 @@ sass-loader@^7.1.0:
|
|||||||
pify "^3.0.0"
|
pify "^3.0.0"
|
||||||
semver "^5.5.0"
|
semver "^5.5.0"
|
||||||
|
|
||||||
sax@^1.2.4:
|
sax@>=0.6.0, sax@^1.2.4:
|
||||||
version "1.2.4"
|
version "1.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
|
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
|
||||||
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
|
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
|
||||||
@@ -4683,6 +5015,15 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
|
|||||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||||
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||||
|
|
||||||
|
spdlog@0.8.1:
|
||||||
|
version "0.8.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/spdlog/-/spdlog-0.8.1.tgz#dfb3f3422ab3efe32be79e4769b95440ed72699f"
|
||||||
|
integrity sha512-W0s8IOXpn86md+8PJ4mJeB/22thykzH5YaNc3Rgnql4x4/zFIhvNiEx6/a1arnqvmJF0HtRO0Ehlswg0WcwTLQ==
|
||||||
|
dependencies:
|
||||||
|
bindings "^1.3.0"
|
||||||
|
mkdirp "^0.5.1"
|
||||||
|
nan "^2.8.0"
|
||||||
|
|
||||||
spdx-correct@^3.0.0:
|
spdx-correct@^3.0.0:
|
||||||
version "3.1.0"
|
version "3.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
|
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
|
||||||
@@ -4823,6 +5164,18 @@ stream-shift@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
|
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
|
||||||
integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
|
integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=
|
||||||
|
|
||||||
|
stream-to-buffer@^0.1.0:
|
||||||
|
version "0.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz#26799d903ab2025c9bd550ac47171b00f8dd80a9"
|
||||||
|
integrity sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=
|
||||||
|
dependencies:
|
||||||
|
stream-to "~0.2.0"
|
||||||
|
|
||||||
|
stream-to@~0.2.0:
|
||||||
|
version "0.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d"
|
||||||
|
integrity sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=
|
||||||
|
|
||||||
string-replace-loader@^2.1.1:
|
string-replace-loader@^2.1.1:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-2.1.1.tgz#b72e7b57b6ef04efe615aff0ad989b5c14ca63d1"
|
resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-2.1.1.tgz#b72e7b57b6ef04efe615aff0ad989b5c14ca63d1"
|
||||||
@@ -4857,6 +5210,15 @@ string.prototype.padend@^3.0.0:
|
|||||||
es-abstract "^1.4.3"
|
es-abstract "^1.4.3"
|
||||||
function-bind "^1.0.2"
|
function-bind "^1.0.2"
|
||||||
|
|
||||||
|
string.prototype.trim@^1.1.2:
|
||||||
|
version "1.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea"
|
||||||
|
integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=
|
||||||
|
dependencies:
|
||||||
|
define-properties "^1.1.2"
|
||||||
|
es-abstract "^1.5.0"
|
||||||
|
function-bind "^1.0.2"
|
||||||
|
|
||||||
string_decoder@^1.0.0, string_decoder@^1.1.1:
|
string_decoder@^1.0.0, string_decoder@^1.1.1:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
|
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
|
||||||
@@ -4876,6 +5238,15 @@ string_decoder@~1.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
safe-buffer "~5.1.0"
|
safe-buffer "~5.1.0"
|
||||||
|
|
||||||
|
stringify-object@^3.3.0:
|
||||||
|
version "3.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629"
|
||||||
|
integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==
|
||||||
|
dependencies:
|
||||||
|
get-own-enumerable-property-symbols "^3.0.0"
|
||||||
|
is-obj "^1.0.1"
|
||||||
|
is-regexp "^1.0.0"
|
||||||
|
|
||||||
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
|
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
|
||||||
version "3.0.1"
|
version "3.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
|
||||||
@@ -4902,6 +5273,14 @@ strip-bom@^3.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
|
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
|
||||||
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
|
integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
|
||||||
|
|
||||||
|
strip-comments@^1.0.2:
|
||||||
|
version "1.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d"
|
||||||
|
integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==
|
||||||
|
dependencies:
|
||||||
|
babel-extract-comments "^1.0.0"
|
||||||
|
babel-plugin-transform-object-rest-spread "^6.26.0"
|
||||||
|
|
||||||
strip-eof@^1.0.0:
|
strip-eof@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
|
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
|
||||||
@@ -5039,6 +5418,11 @@ timers-browserify@^2.0.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
setimmediate "^1.0.4"
|
setimmediate "^1.0.4"
|
||||||
|
|
||||||
|
tinycolor2@^1.1.2:
|
||||||
|
version "1.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"
|
||||||
|
integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=
|
||||||
|
|
||||||
to-arraybuffer@^1.0.0:
|
to-arraybuffer@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
|
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
|
||||||
@@ -5069,6 +5453,13 @@ to-regex@^3.0.1, to-regex@^3.0.2:
|
|||||||
regex-not "^1.0.2"
|
regex-not "^1.0.2"
|
||||||
safe-regex "^1.1.0"
|
safe-regex "^1.1.0"
|
||||||
|
|
||||||
|
topo@3.x.x:
|
||||||
|
version "3.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.3.tgz#d5a67fb2e69307ebeeb08402ec2a2a6f5f7ad95c"
|
||||||
|
integrity sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==
|
||||||
|
dependencies:
|
||||||
|
hoek "6.x.x"
|
||||||
|
|
||||||
toposort@^1.0.0:
|
toposort@^1.0.0:
|
||||||
version "1.0.7"
|
version "1.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
|
resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
|
||||||
@@ -5312,6 +5703,13 @@ url-parse@^1.4.3:
|
|||||||
querystringify "^2.0.0"
|
querystringify "^2.0.0"
|
||||||
requires-port "^1.0.0"
|
requires-port "^1.0.0"
|
||||||
|
|
||||||
|
url-regex@^3.0.0:
|
||||||
|
version "3.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724"
|
||||||
|
integrity sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=
|
||||||
|
dependencies:
|
||||||
|
ip-regex "^1.0.1"
|
||||||
|
|
||||||
url@^0.11.0:
|
url@^0.11.0:
|
||||||
version "0.11.0"
|
version "0.11.0"
|
||||||
resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
|
resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
|
||||||
@@ -5573,6 +5971,15 @@ webpack-merge@^4.2.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lodash "^4.17.5"
|
lodash "^4.17.5"
|
||||||
|
|
||||||
|
webpack-pwa-manifest@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/webpack-pwa-manifest/-/webpack-pwa-manifest-4.0.0.tgz#a7c12debe497f61f5948ddb079bb8a955152abd9"
|
||||||
|
integrity sha512-655TpvoOLGHI2hgx7AmmdgHLc+xDtAi6J5fz7bTnuhxWtEVH/NI2qGlDY40HErlblOV74VtVz5S/C0u7ZpPlvQ==
|
||||||
|
dependencies:
|
||||||
|
css-color-names "0.0.4"
|
||||||
|
jimp "^0.2.28"
|
||||||
|
mime "^1.6.0"
|
||||||
|
|
||||||
webpack-sources@^1.1.0, webpack-sources@^1.3.0:
|
webpack-sources@^1.1.0, webpack-sources@^1.3.0:
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
|
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
|
||||||
@@ -5648,6 +6055,141 @@ wide-align@^1.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
string-width "^1.0.2 || 2"
|
string-width "^1.0.2 || 2"
|
||||||
|
|
||||||
|
workbox-background-sync@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.1.1.tgz#0d4439d9e364854f4030ad8f44c8b34b0bbce2e7"
|
||||||
|
integrity sha512-z8iKAx7f3cfQpGaRrrl2CpP4dGe+vHk05vJbzscwA7e1K8vyNl6zALBtIyyAvEZzMsofsiGEZqt2g/8CfyfQ5g==
|
||||||
|
dependencies:
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
|
||||||
|
workbox-broadcast-update@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.1.1.tgz#93a2b455673f6b73027890cb362f66156a3701f1"
|
||||||
|
integrity sha512-gq83a8F6ESQobfltaxzoUTz0mEpTOsXHmy9Po9kKMT1UjXTWh/4NDF3HwQYaxJckOER9NITB3BuoXlXr3tI8aA==
|
||||||
|
dependencies:
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
|
||||||
|
workbox-build@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.1.1.tgz#d75d9f4ff70ba5c960be4043bfc4c25c62f22a45"
|
||||||
|
integrity sha512-+QRtNFKDq7RlIpigsh26joUNoEN+c3pQ+yT8Rs29RtpM50S1nKggFUQY0HoRvN7tzvuzIgxCrx3osxOQ8hmj7Q==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.3.4"
|
||||||
|
common-tags "^1.8.0"
|
||||||
|
fs-extra "^4.0.2"
|
||||||
|
glob "^7.1.3"
|
||||||
|
joi "^14.3.1"
|
||||||
|
lodash.template "^4.4.0"
|
||||||
|
pretty-bytes "^5.1.0"
|
||||||
|
stringify-object "^3.3.0"
|
||||||
|
strip-comments "^1.0.2"
|
||||||
|
workbox-background-sync "^4.1.1"
|
||||||
|
workbox-broadcast-update "^4.1.1"
|
||||||
|
workbox-cacheable-response "^4.1.1"
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
workbox-expiration "^4.1.1"
|
||||||
|
workbox-google-analytics "^4.1.1"
|
||||||
|
workbox-navigation-preload "^4.1.1"
|
||||||
|
workbox-precaching "^4.1.1"
|
||||||
|
workbox-range-requests "^4.1.1"
|
||||||
|
workbox-routing "^4.1.1"
|
||||||
|
workbox-strategies "^4.1.1"
|
||||||
|
workbox-streams "^4.1.1"
|
||||||
|
workbox-sw "^4.1.1"
|
||||||
|
workbox-window "^4.1.1"
|
||||||
|
|
||||||
|
workbox-cacheable-response@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.1.1.tgz#f01032f0a08f2eedb9c420f1267b4738c6dfd58e"
|
||||||
|
integrity sha512-uc1zkeidJgAMXHvUbspKJt3NzXHAcb5D+7sX6HrCZIMneS4ZxMvdB86giIR3bveV4PaOssqIYVrWUJvIehK/NA==
|
||||||
|
dependencies:
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
|
||||||
|
workbox-core@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.1.1.tgz#eaad7132762727373377ca1c8a2130cfa641cc90"
|
||||||
|
integrity sha512-RbzMWnDW7UvfstwOs8ERDFTH6zr7akm4wIbIednFs1TnAvZbN3gpIBoEv53kaMr0uMYDSXI2KxaLmmz9WX1PXA==
|
||||||
|
|
||||||
|
workbox-expiration@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.1.1.tgz#d676fc24dd99576d4f62372d342ed7cea6bd968a"
|
||||||
|
integrity sha512-N/fbypqCbFrrKDhVnTyGXhkFTgjA8aRUydkxCpgJM1ajf7udQYD4XWTQxXosPJC2UVsa2/kPCBYFQOQ1Fu/2TA==
|
||||||
|
dependencies:
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
|
||||||
|
workbox-google-analytics@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.1.1.tgz#e3901d9edc00ce269db1a86aef8d2e12b3fca222"
|
||||||
|
integrity sha512-ByZYHv61u4dFQXQAXZZ1bNgcJ45yA85C8OAlSDGwqOuv72dZoybG3EMtJo/0ChO6irxWI1pictF2pTW7JxcCkQ==
|
||||||
|
dependencies:
|
||||||
|
workbox-background-sync "^4.1.1"
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
workbox-routing "^4.1.1"
|
||||||
|
workbox-strategies "^4.1.1"
|
||||||
|
|
||||||
|
workbox-navigation-preload@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.1.1.tgz#0990ffe94b2110141d48f2b516084c363f538d4e"
|
||||||
|
integrity sha512-U+QEpcOgakBFZ6Aiv438DTvkZQX518qxfu280kEPZnFU88wIFBAK9V4MmJcoX60fk1INTD//YnfSxI0cLy1N+g==
|
||||||
|
dependencies:
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
|
||||||
|
workbox-precaching@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.1.1.tgz#05ddbe82d06f5c07b3cf077389d451ec4df5d157"
|
||||||
|
integrity sha512-GuoBH85MzVpzmF8c5Sql1i9HYdOqcpRDdNPLrIkWEfuvURO5M/jT+cGcyfFq35Xo7xRb4kE79H4hnF3EnCkFRw==
|
||||||
|
dependencies:
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
|
||||||
|
workbox-range-requests@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.1.1.tgz#01f81716f86b04e398bfd11df2a34cd73d52e4bc"
|
||||||
|
integrity sha512-i9i7tRTcXveCJdi4lK7XstgHweTwkqEGR7GPauYIDGAZplWrxDOAOUDSvkH8ibOxEgO6f0VFhyYY6fPB6u+oSA==
|
||||||
|
dependencies:
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
|
||||||
|
workbox-routing@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.1.1.tgz#c31d663c6c4c0e9a6f03b5a6fdfe79fb6ee7f29d"
|
||||||
|
integrity sha512-slOb+2Nfn8V3fG/TtN0c0k4OOyuwLSnZUv+zyZeJafSU3MrQPC58bPeG7HOZZDwoQAsBG9VSukjRDFR0F1lXKg==
|
||||||
|
dependencies:
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
|
||||||
|
workbox-strategies@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.1.1.tgz#5289b977dbc56ef97f17a3a99722f174b8cf6933"
|
||||||
|
integrity sha512-ejmRqmjwn9DYsl1QVZkRb1V/iaBzhsh3YwJelfXQk68JpB36WjwY9csFQ2gSvlLCCg3d4MVFFxKfmHVyVnhwAA==
|
||||||
|
dependencies:
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
|
||||||
|
workbox-streams@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.1.1.tgz#f49418d7a2388c89838c4022229ba6ee23af60fd"
|
||||||
|
integrity sha512-6TKC4rrvnjbLpWtgHIYWjWS28h0SqSWogkJIKC1f/6MjJCmi2qM7PYJwXR0/t8lJVZj61ujVSulZ92XQmy3GhQ==
|
||||||
|
dependencies:
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
|
||||||
|
workbox-sw@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.1.1.tgz#037031ec107c9befe568064679d16fc03748ff02"
|
||||||
|
integrity sha512-3nQFWFyG1W21x7TUVBsobrLoFDEy7ck/3nx2W1I3c+DhLCIu7B+IAnQVdefK+oRju5fIDWwOQ63fok8Uz7E/Gw==
|
||||||
|
|
||||||
|
workbox-webpack-plugin@^4.1.0:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.1.1.tgz#4e3f40fb5d0bb6aed21e617e47032bafe8cbedb2"
|
||||||
|
integrity sha512-Fygc8qrh/IOeJeZ4NETs9arYtJEwcO0Yy7JRkX5DSOHCSkWHxOX1ryazAcK0ACyMJOQuU9zJVmx+mnn0zqYKtA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.0.0"
|
||||||
|
json-stable-stringify "^1.0.1"
|
||||||
|
workbox-build "^4.1.1"
|
||||||
|
|
||||||
|
workbox-window@^4.1.1:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.1.1.tgz#0c449b87406baa4dc9f7c82d015ac63a031b3ed7"
|
||||||
|
integrity sha512-KadE/DdNY1f6Va3MMOSigheLSgNxWHV/K/iDHnLMpo2EBGVpfwRCOuEwJNHlWA3G5WdpZlyTmtShf/5Mbb6dNg==
|
||||||
|
dependencies:
|
||||||
|
workbox-core "^4.1.1"
|
||||||
|
|
||||||
worker-farm@^1.5.2:
|
worker-farm@^1.5.2:
|
||||||
version "1.6.0"
|
version "1.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
|
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
|
||||||
@@ -5669,9 +6211,9 @@ wrappy@1:
|
|||||||
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
|
||||||
|
|
||||||
write-file-atomic@^2.3.0:
|
write-file-atomic@^2.3.0:
|
||||||
version "2.3.0"
|
version "2.4.2"
|
||||||
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
|
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9"
|
||||||
integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==
|
integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==
|
||||||
dependencies:
|
dependencies:
|
||||||
graceful-fs "^4.1.11"
|
graceful-fs "^4.1.11"
|
||||||
imurmurhash "^0.1.4"
|
imurmurhash "^0.1.4"
|
||||||
@@ -5691,12 +6233,40 @@ write-file-webpack-plugin@^4.5.0:
|
|||||||
write-file-atomic "^2.3.0"
|
write-file-atomic "^2.3.0"
|
||||||
|
|
||||||
ws@^6.0.0:
|
ws@^6.0.0:
|
||||||
version "6.1.2"
|
version "6.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8"
|
resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
|
||||||
integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==
|
integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
|
||||||
dependencies:
|
dependencies:
|
||||||
async-limiter "~1.0.0"
|
async-limiter "~1.0.0"
|
||||||
|
|
||||||
|
xhr@^2.0.1:
|
||||||
|
version "2.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd"
|
||||||
|
integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==
|
||||||
|
dependencies:
|
||||||
|
global "~4.3.0"
|
||||||
|
is-function "^1.0.1"
|
||||||
|
parse-headers "^2.0.0"
|
||||||
|
xtend "^4.0.0"
|
||||||
|
|
||||||
|
xml-parse-from-string@^1.0.0:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28"
|
||||||
|
integrity sha1-qQKekp09vN7RafPG4oI42VpdWig=
|
||||||
|
|
||||||
|
xml2js@^0.4.5:
|
||||||
|
version "0.4.19"
|
||||||
|
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
|
||||||
|
integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==
|
||||||
|
dependencies:
|
||||||
|
sax ">=0.6.0"
|
||||||
|
xmlbuilder "~9.0.1"
|
||||||
|
|
||||||
|
xmlbuilder@~9.0.1:
|
||||||
|
version "9.0.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
|
||||||
|
integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
|
||||||
|
|
||||||
xregexp@4.0.0:
|
xregexp@4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"
|
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"
|
||||||
|
|||||||
Reference in New Issue
Block a user