diff --git a/.gitignore b/.gitignore index 67045665..f60e0890 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,8 @@ dist # TernJS port file .tern-port + +vscode +dist +demo/lib +demo/extensions.js \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index c53a2f6d..00000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 Félix B - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md index 0b3111fa..f3ede17f 100644 --- a/README.md +++ b/README.md @@ -1 +1,28 @@ -# vscode-web \ No newline at end of file +# VSCode Web +This project is aimed to build a web version of VSCode, this is not a fork, simply a web compilation of the VSCode project. + +## Sample +Sample demo site can be found here : +[Demo](https://vscode-web-test-playground.azurewebsites.net/) + + +## Build from source + +To build from sources, you need same prerequisites as vscode : +[VSCode Prerequisites](https://github.com/microsoft/vscode/wiki/How-to-Contribute#prerequisites) + +Then simply run following commands + +``` +yarn +yarn build +``` + +## Run demo + +To run the demo you need to build from source, then run de following commands + +``` +yarn prepare-demo +yarn demo +``` \ No newline at end of file diff --git a/build.js b/build.js new file mode 100644 index 00000000..df425a4a --- /dev/null +++ b/build.js @@ -0,0 +1,95 @@ +const process = require("process"); +const child_process = require("child_process"); +const fs = require("fs"); +const fse = require("fs-extra"); +const glob = require("glob"); + +const vscodeVersion = "1.50.1"; + +if (!fs.existsSync("vscode")) { + child_process.execSync("git clone https://github.com/microsoft/vscode.git", { + stdio: "inherit", + }); +} +process.chdir("vscode"); + +child_process.execSync(`git checkout -q ${vscodeVersion}`, { + stdio: "inherit", +}); +if (!fs.existsSync("node_modules")) { + child_process.execSync("yarn", { stdio: "inherit" }); +} +// Use simple workbench +fs.copyFileSync( + "../workbench.ts", + "src/vs/code/browser/workbench/workbench.ts" +); + +// Adapt compilation to web +const gulpfilePath = "./build/gulpfile.vscode.js"; +let gulpfile = fs.readFileSync(gulpfilePath, { encoding: "utf8", flag: "r" }); + +gulpfile = gulpfile + .replace( + /vs\/workbench\/workbench.desktop.main/g, + "vs/workbench/workbench.web.api" + ) + .replace( + /buildfile.workbenchDesktop/g, + "buildfile.workbenchWeb,buildfile.keyboardMaps" + ); + +fs.writeFileSync(gulpfilePath, gulpfile); + +// Compile +child_process.execSync("yarn gulp compile-build", { stdio: "inherit" }); +child_process.execSync("yarn gulp minify-vscode", { stdio: "inherit" }); +child_process.execSync("yarn compile-web", { stdio: "inherit" }); + +// Remove maps +const mapFiles = glob.sync("out-vscode-min/**/*.js.map", {}); +mapFiles.forEach((mapFile) => { + fs.unlinkSync(mapFile); +}); + +// Extract compiled files +if (fs.existsSync("../dist")) { + fs.rmdirSync("../dist", { recursive: true }); +} +fs.mkdirSync("../dist"); +fse.copySync("out-vscode-min", "../dist/vscode"); + +const extensionNM = glob.sync("extensions/**/node_modules", {}); +extensionNM.forEach((modules) => { + fs.rmdirSync(modules, { recursive: true }); +}); +fse.copySync("extensions", "../dist/extensions"); + +// Add built in extensions +const extensions = []; + +const extensionsFolderPath = "extensions"; +const extensionsContent = fs.readdirSync(extensionsFolderPath); +for (const extension of extensionsContent) { + const extensionPath = `${extensionsFolderPath}/${extension}`; + if (fs.statSync(extensionPath).isDirectory()) { + const extensionPackagePath = `${extensionPath}/package.json`; + + if (!fs.existsSync(extensionPackagePath)) { + continue; + } + + const packageJSON = JSON.parse(fs.readFileSync(extensionPackagePath)); + extensions.push({ + packageJSON, + extensionPath: extension, + }); + } +} + +const extensionsVar = + "var extensions =" + JSON.stringify(extensions, { space: "\t", quote: "" }); + +fs.writeFileSync("../dist/extensions.js", extensionsVar); + + diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 00000000..08ab4274 --- /dev/null +++ b/demo/index.html @@ -0,0 +1,57 @@ + + + + + VSCode Web + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/playground.js b/demo/playground.js new file mode 100644 index 00000000..85625f46 --- /dev/null +++ b/demo/playground.js @@ -0,0 +1 @@ +var playground=[{"packageJSON":{"name":"vscode-web-playground","description":"Web playground for VS Code","version":"0.0.9","publisher":"vscode","license":"MIT","enableProposedApi":true,"private":true,"activationEvents":["onFileSystem:memfs","onFileSystem:github","onFileSystem:codespace","onDebug"],"browser":"./dist/extension","engines":{"vscode":"^1.48.0"},"contributes":{"viewsWelcome":[{"view":"debug","contents":"In order to run and debug you'll need to [create a local workspace](command:vscode.webPlayground.cloneRepository).","when":"github-context"},{"view":"terminal","contents":"In order to use the terminal you'll need to [create a local workspace](command:vscode.webPlayground.cloneRepository).","when":"github-context"}],"menus":{"statusBar/windowIndicator":[{"command":"vscode.webPlayground.cloneRepository","when":"github-context"}]},"commands":[{"command":"vscode.webPlayground.cloneRepository","title":"Clone and Open the Repository in VS Code","enablement":"github-context"}],"taskDefinitions":[{"type":"custombuildscript","required":["flavor"],"properties":{"flavor":{"type":"string","description":"The build flavor. Should be either '32' or '64'."},"flags":{"type":"array","description":"Additional build flags."}}}],"resourceLabelFormatters":[{"scheme":"github","authority":"*","formatting":{"label":"${authority}${path}","separator":"/","workspaceSuffix":"GitHub"}}]},"scripts":{"compile":"yarn webpack-cli --config extension.webpack.config --mode production","watch":"yarn webpack-cli --config extension.webpack.config --mode production --watch --info-verbosity verbose","prepublish":"yarn webpack-cli --config extension.webpack.config --mode production"},"devDependencies":{"@types/vscode":"^1.48.0","ts-loader":"^4.4.2","typescript":"^3.9.7","webpack":"^4.43.0","webpack-cli":"^3.3.12"}},"extensionPath":"vscode-web-playground"}] \ No newline at end of file diff --git a/demo/product.json b/demo/product.json new file mode 100644 index 00000000..561f246a --- /dev/null +++ b/demo/product.json @@ -0,0 +1,13 @@ +{ + "productConfiguration": { + "nameShort": "Code Web", + "nameLong": "Code Web", + "applicationName": "code-web", + "dataFolderName": ".vscode-web", + "version": "1.2.3" + }, + "folderUri": { + "scheme": "memfs", + "path": "/sample-folder" + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 00000000..e27e87d8 --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "vscode-web", + "version": "1.0.0", + "description": "", + "scripts": { + "build": "node build.js", + "prepare-demo": "node prepare-demo.js", + "demo": "http-server ./demo --cors" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Felx-B/vscode-web.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/Felx-B/vscode-web/issues" + }, + "homepage": "https://github.com/Felx-B/vscode-web#readme", + "devDependencies": { + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "semver-umd": "^5.5.7", + "vscode-oniguruma": "^1.4.0", + "vscode-textmate": "^5.2.0", + "http-server": "^0.12.3" + }, + "dependencies": { + } +} diff --git a/prepare-demo.js b/prepare-demo.js new file mode 100644 index 00000000..781b5638 --- /dev/null +++ b/prepare-demo.js @@ -0,0 +1,39 @@ +var fs = require("fs"); +const fse = require("fs-extra"); +const child_process = require("child_process"); + +if (fs.existsSync("./demo/dist")) { + fs.rmdirSync("./demo/dist", { recursive: true }); +} + +if (fs.existsSync("./demo/lib")) { + fs.rmdirSync("./demo/lib", { recursive: true }); +} + +fse.copySync("./dist", "./demo/dist"); +fse.copySync("./node_modules/semver-umd", "./demo/lib/semver-umd"); +fse.copySync("./node_modules/vscode-oniguruma", "./demo/lib/vscode-oniguruma"); +fse.copySync("./node_modules/vscode-textmate", "./demo/lib/vscode-textmate"); + +if(fs.existsSync('./demo/dist/extensions/vscode-web-playground')){ + fs.rmdirSync('./demo/dist/extensions/vscode-web-playground', { recursive: true }) +} +child_process.execSync('git clone https://github.com/microsoft/vscode-web-playground.git demo/dist/extensions/vscode-web-playground', {stdio: 'inherit'}); +process.chdir('demo/dist/extensions/vscode-web-playground'); +child_process.execSync('yarn', {stdio: 'inherit'}); +child_process.execSync('yarn compile', {stdio: 'inherit'}); + +process.chdir('../../../..'); + +// if (fs.existsSync("./demo/dist/extensions.js")) { +// fs.unlinkSync("./demo/dist/extensions.js"); +// } + +const packageJSON = fs.readFileSync( + "./demo/dist/extensions/vscode-web-playground/package.json" +); +const extensions = [{ packageJSON: JSON.parse(packageJSON), extensionPath: "vscode-web-playground"}] + +const content = `var playground=${JSON.stringify(extensions)}`; + +fs.writeFileSync("./demo/playground.js", content); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..653db20f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "module": "amd", + "moduleResolution": "node", + "experimentalDecorators": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "allowUnreachableCode": false, + "strict": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": ".", + "paths": { + "vs/*": [ + "./vscode/src/vs/*" + ] + }, + "lib": [ + "ES2015" + ] + }, + "include": ["workbench.ts"] +} \ No newline at end of file diff --git a/workbench.ts b/workbench.ts new file mode 100644 index 00000000..23599062 --- /dev/null +++ b/workbench.ts @@ -0,0 +1,31 @@ +import { create, IWorkbenchConstructionOptions, IWorkspaceProvider } from 'vs/workbench/workbench.web.api'; +import { URI, UriComponents} from 'vs/base/common/uri'; + +(async function () { + // create workbench + const result = await fetch('product.json'); + let config: IWorkbenchConstructionOptions & { folderUri?: UriComponents, workspaceUri?: UriComponents } = await result.json(); + + + if (Array.isArray(config.staticExtensions)) { + config.staticExtensions.forEach(extension => { + extension.extensionLocation = URI.revive(extension.extensionLocation); + }); + } + + let workspace; + if (config.folderUri) { + workspace = { folderUri: URI.revive(config.folderUri) }; + } else if (config.workspaceUri) { + workspace = { workspaceUri: URI.revive(config.workspaceUri) }; + } else { + workspace = undefined; + } + + if(workspace){ + const workspaceProvider: IWorkspaceProvider = { workspace, open: async () => {} } + config = { ...config, workspaceProvider }; + } + + create(document.body, config); +})(); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..781b6fb8 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,271 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +basic-auth@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" + integrity sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +corser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" + integrity sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c= + +debug@^3.1.1: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +ecstatic@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-3.3.2.tgz#6d1dd49814d00594682c652adb66076a69d46c48" + integrity sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog== + dependencies: + he "^1.1.1" + mime "^1.6.0" + minimist "^1.1.0" + url-join "^2.0.5" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +follow-redirects@^1.0.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== + +fs-extra@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +he@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +http-proxy@^1.18.0: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-server@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.12.3.tgz#ba0471d0ecc425886616cb35c4faf279140a0d37" + integrity sha512-be0dKG6pni92bRjq0kvExtj/NrrAd28/8fCXkaI/4piTwQMSDSLMhWyW0NI1V+DBI3aa1HMlQu46/HjVLfmugA== + dependencies: + basic-auth "^1.0.3" + colors "^1.4.0" + corser "^2.0.1" + ecstatic "^3.3.2" + http-proxy "^1.18.0" + minimist "^1.2.5" + opener "^1.5.1" + portfinder "^1.0.25" + secure-compare "3.0.1" + union "~0.5.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +jsonfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" + integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + dependencies: + universalify "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +lodash@^4.17.14: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +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== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +opener@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +portfinder@^1.0.25: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +qs@^6.4.0: + version "6.9.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" + integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +secure-compare@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" + integrity sha1-8aAymzCLIh+uN7mXTz1XjQypmeM= + +semver-umd@^5.5.7: + version "5.5.7" + resolved "https://registry.yarnpkg.com/semver-umd/-/semver-umd-5.5.7.tgz#966beb5e96c7da6fbf09c3da14c2872d6836c528" + integrity sha512-XgjPNlD0J6aIc8xoTN6GQGwWc2Xg0kq8NzrqMVuKG/4Arl6ab1F8+Am5Y/XKKCR+FceFr2yN/Uv5ZJBhRyRqKg== + +union@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" + integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== + dependencies: + qs "^6.4.0" + +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + +url-join@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728" + integrity sha1-WvIvGMBSoACkjXuCxenC4v7tpyg= + +vscode-oniguruma@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.4.0.tgz#3795fd1ef9633a4a33f208bce92c008e64a6fc8f" + integrity sha512-VvTl/jIAADEqWWpEYRsOI1sXiYOTDA8KYNgK60+Mb3T+an9zPz3Cqc6RVJeYgOx/P5G+4M4jygB3X5xLLfYD0g== + +vscode-textmate@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=