├── .travis.yml ├── src ├── tests │ └── data │ │ ├── test2.js │ │ └── test.js ├── tslint.json ├── debugAdapter.ts ├── tsconfig.json ├── sourcemapArguments.ts ├── extension.ts ├── sourcemapSession.ts └── quickjsDebug.ts ├── .gitignore ├── images ├── quickjs-debug-demo.png └── quickjs-debug-icon.png ├── .vscodeignore ├── appveyor.yml ├── .vscode ├── settings.json ├── tasks.json └── launch.json ├── LICENSE.txt ├── CHANGELOG.md ├── ThirdPartyNotices.txt ├── readme.md ├── protocol.md ├── package.json └── yarn.lock /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "7.9" 4 | sudo: false 5 | -------------------------------------------------------------------------------- /src/tests/data/test2.js: -------------------------------------------------------------------------------- 1 | export function boops() { 2 | console.log('hello!'); 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | out/ 4 | npm-debug.log 5 | mock-debug.txt 6 | *.vsix 7 | -------------------------------------------------------------------------------- /images/quickjs-debug-demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koush/vscode-quickjs-debug/HEAD/images/quickjs-debug-demo.png -------------------------------------------------------------------------------- /images/quickjs-debug-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koush/vscode-quickjs-debug/HEAD/images/quickjs-debug-icon.png -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/**/* 2 | .gitignore 3 | .travis.yml 4 | appveyor.yml 5 | src/**/* 6 | out/tests/**/* 7 | **/*.js.map 8 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | install: 2 | - ps: Install-Product node 7.9 x64 3 | 4 | build_script: 5 | - npm install 6 | 7 | test_script: 8 | - npm test 9 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings.FALSE 2 | { 3 | "javascript.validate.enable": false, 4 | "typescript.tsdk": "node_modules/typescript/lib", 5 | "files.trimTrailingWhitespace": true, 6 | "editor.insertSpaces": false 7 | } -------------------------------------------------------------------------------- /src/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-unused-expression": true, 4 | "no-duplicate-variable": true, 5 | "curly": false, 6 | "class-name": true, 7 | "semicolon": true, 8 | "triple-equals": true, 9 | "no-var-keyword": true, 10 | "no-bitwise": true 11 | } 12 | } -------------------------------------------------------------------------------- /src/debugAdapter.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------- 2 | * Copyright (C) Microsoft Corporation. All rights reserved. 3 | *--------------------------------------------------------*/ 4 | 5 | import { QuickJSDebugSession } from './quickjsDebug'; 6 | 7 | QuickJSDebugSession.run(QuickJSDebugSession); 8 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "npm", 6 | "script": "watch", 7 | "problemMatcher": "$tsc-watch", 8 | "isBackground": true, 9 | "presentation": { 10 | "reveal": "never" 11 | }, 12 | "group": { 13 | "kind": "build", 14 | "isDefault": true 15 | } 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | 6 | "noImplicitAny": false, 7 | "removeComments": false, 8 | "noUnusedLocals": true, 9 | "noImplicitThis": true, 10 | "inlineSourceMap": false, 11 | "sourceMap": true, 12 | "outDir": "../out", 13 | "preserveConstEnums": true, 14 | "strictNullChecks": true, 15 | "noUnusedParameters": false 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2020 Koushik Dutta 2 | 3 | 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: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | 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 SOFTWA 8 | -------------------------------------------------------------------------------- /src/sourcemapArguments.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface SourcemapArguments { 3 | /** 4 | * Typically the workspace root. localRoot is used to construct a relative path 5 | * for source files that are also present in the remoteRoot. 6 | * Thus, this argument is not used when files are transpiled and have sourcemaps. See sourceMaps argument. 7 | */ 8 | localRoot?: string; 9 | /** 10 | * The default root path of JavaScript files in a remote environment. Used to resolve 11 | * files in the VS Code local file system to files in a remote file system. 12 | */ 13 | remoteRoot?: string; 14 | /** 15 | * The sourcemaps to load to resolve source files (like Typescript) in a local file system 16 | * to absolute paths in the remote file system. 17 | * The keys are the paths to the source map. 18 | * The values are the remoteRoot for that sourcemapped file. 19 | * Specify null to use the default remoteRoot: '/remote/root/webpack.main.js' 20 | * Specify an empty string to use the relative path: 'webpack.main.js' 21 | */ 22 | sourceMaps?: object; 23 | } 24 | -------------------------------------------------------------------------------- /src/tests/data/test.js: -------------------------------------------------------------------------------- 1 | import {boops} from './test2.js' 2 | 3 | boops(); 4 | 5 | const gg = 9; 6 | function foo (t) { 7 | var a = 55; 8 | var b = 33; 9 | var c = { 10 | d: true, 11 | e: 'hello', 12 | f: 34.55, 13 | }; 14 | 15 | var arr2 = new Uint8Array(10000); 16 | var arr = []; 17 | for (var i = 0; i < 10000; i++) { 18 | arr.push(i); 19 | arr2[i] = i; 20 | } 21 | 22 | function noob() { 23 | console.log('f;asdsad`') 24 | console.log(a); 25 | console.log(t); 26 | console.log('supsups') 27 | console.log('ubgasdsad') 28 | } 29 | noob(); 30 | } 31 | 32 | function bar() { 33 | foo(3); 34 | console.log('asdsad'); 35 | console.log('about to throw!'); 36 | try { 37 | throw new Error('whoops'); 38 | } 39 | catch (e) { 40 | } 41 | } 42 | 43 | class Blub { 44 | constructor() { 45 | this.peeps = 3; 46 | } 47 | jib() { 48 | console.log(this); 49 | bar(); 50 | } 51 | } 52 | 53 | var blub = new Blub(); 54 | blub.jib(); 55 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Extension", 6 | "type": "extensionHost", 7 | "request": "launch", 8 | "runtimeExecutable": "${execPath}", 9 | "args": [ 10 | "--extensionDevelopmentPath=${workspaceFolder}" 11 | ], 12 | "outFiles": [ 13 | "${workspaceFolder}/out/**/*.js" 14 | ], 15 | "preLaunchTask": "npm: watch" 16 | }, 17 | { 18 | "name": "Server", 19 | "type": "node", 20 | "request": "launch", 21 | "cwd": "${workspaceFolder}", 22 | "program": "${workspaceFolder}/src/debugAdapter.ts", 23 | "args": [ 24 | "--server=4711" 25 | ], 26 | "outFiles": [ 27 | "${workspaceFolder}/out/**/*.js" 28 | ] 29 | }, 30 | { 31 | "name": "Launch QuickJS", 32 | "type": "quickjs", 33 | "request": "launch", 34 | "program": "${workspaceFolder}/src/tests/data/test.js", 35 | "runtimeExecutable": "/Volumes/Dev/quickjs/qjs-debug" 36 | }, 37 | { 38 | "name": "Attach QuickJS (connect)", 39 | "type": "quickjs", 40 | "request": "launch", 41 | "program": "${workspaceFolder}/src/tests/data/test.js", 42 | "runtimeExecutable": "/Volumes/Dev/quickjs/qjs-debug", 43 | "localRoot": "${workspaceFolder}/src/tests/data/", 44 | "mode": "connect", 45 | "attach": true, 46 | "port": 5555 47 | }, 48 | { 49 | "name": "Attach QuickJS", 50 | "type": "quickjs", 51 | "request": "launch", 52 | "attach": true, 53 | "port": 5555, 54 | "program": "${workspaceFolder}/src/tests/data/test.js", 55 | "localRoot": "${workspaceFolder}/src/tests/data/", 56 | "runtimeExecutable": "/Volumes/Dev/quickjs/qjs-debug" 57 | } 58 | ], 59 | "compounds": [ 60 | { 61 | "name": "Extension + Server", 62 | "configurations": [ "Extension", "Server" ] 63 | } 64 | ] 65 | } 66 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | ## 0.35.0 3 | * Support the 'breakpointLocations' request. 4 | * Make 'variables' request cancelable. 5 | 6 | ## 0.34.0 7 | * Add support for persisted data breakpoints. 8 | 9 | ## 0.33.0 10 | * Add support for (sorted) REPL completions. 11 | 12 | ## 0.32.0 13 | * Add support for data breakpoints. 14 | 15 | ## 0.31.0 16 | * Added code to show how to control what debug executable is used. 17 | 18 | ## 0.30.0 19 | * Updated dependencies. 20 | 21 | ## 0.29.0 22 | * Move off proposed API for the EMBED_DEBUG_ADAPTER mode: embedded debug adapter now uses vscode.DebugAdapterDescriptorFactory. 23 | 24 | ## 0.28.0 25 | * Update dependencies. 26 | 27 | ## 0.27.0 28 | * Update dependencies. 29 | 30 | ## 0.26.0 31 | * Improved the launch configuration snippet and added a `"stopOnEntry": true`. 32 | 33 | ## 0.25.0 34 | * Added the `"multi-root ready"` keyword. 35 | 36 | ## 0.24.0 37 | * Add support for starting a debug session without a launch configuration. 38 | * Require 1.17 version of VS Code. 39 | 40 | ## 0.23.0 41 | * Added supported for creating and deleting breakpoints from the REPL. Use `new 123` to create a breakpoint in line 123, and `del 123` to delete it. 42 | * Use 1.24.0 version of Debug Adapter Protocol and libraries. 43 | 44 | ## 0.22.0 45 | * Refactored the 'Mock Debugger' functionality into a separate class. This makes it more obvious how a debug adapter 'adapts' to a debugger or runtime. 46 | 47 | ## 0.21.0 48 | * Shows the source location of log output. A `log(any text)` in the input sends the text in parenthesis to the debug console. 49 | 50 | ## 0.20.0 51 | * Use 1.23.0 version of Debug Adapter Protocol and libraries. 52 | 53 | ## 0.19.0 54 | * Add tslint 55 | * Use 1.19.0 version of Debug Adapter Protocol and libraries. 56 | 57 | ## 0.18.2 58 | * Added 'trace' attribute to launch configuration: set it to 'true' to enable logging of the Debug Adapter Protocol. 59 | 60 | -------------------------------------------------------------------------------- /ThirdPartyNotices.txt: -------------------------------------------------------------------------------- 1 | THIRD-PARTY SOFTWARE NOTICES AND INFORMATION 2 | Do Not Translate or Localize 3 | 4 | This project incorporates material from the project(s) listed below (collectively, “Third Party Code”). 5 | Microsoft is not the original author of the Third Party Code. The original copyright notice and license 6 | under which Microsoft received such Third Party Code are set out below. This Third Party Code is licensed 7 | to you under their original license terms set forth below. Microsoft reserves all other rights not 8 | expressly granted, whether by implication, estoppel or otherwise. 9 | 10 | 11 | 1. DefinitelyTyped version 0.0.1 (https://github.com/borisyankov/DefinitelyTyped) 12 | 13 | 14 | %% DefinitelyTyped NOTICES AND INFORMATION BEGIN HERE 15 | ========================================= 16 | This project is licensed under the MIT license. 17 | Copyrights are respective of each contributor listed at the beginning of each definition file. 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | ========================================= 37 | END OF DefinitelyTyped NOTICES AND INFORMATION 38 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # QuickJS Debug for VS Code 2 | 3 | This is a VS Code debug adapter for [QuickJS](https://bellard.org/quickjs/). 4 | 5 | QuickJS Debugger supports *stepping*, *continue*, *breakpoints*, *evaluation*, and 6 | *variable access*. 7 | 8 | **The official QuickJS release does not have any debugger support.** The QuickJS Debugger requires a forked version of QuickJS, that has minimal changes necessary to support debugging. 9 | 10 | ## Using QuickJS Debug 11 | 12 | * Install the [**QuickJS Debug** extension](https://marketplace.visualstudio.com/items?itemName=koush.quickjs-debug) in VS Code. 13 | * Build the [QuickJS fork](https://github.com/koush/quickjs) from koush. 14 | * Specify the qjs runtime path in [.vscode/launch.json](https://github.com/koush/vscode-quickjs-debug/blob/master/.vscode/launch.json). 15 | * Switch to the debug viewlet and press the gear dropdown. 16 | * Select the debug environment "Launch QuickJS". 17 | * Press the green 'play' button to start debugging. 18 | 19 | You can now step through the `test.js` file, set and hit breakpoints. 20 | 21 | ![QuickJS Debug](images/quickjs-debug-demo.png) 22 | 23 | # Embedding 24 | 25 | To listen for a connection in embedded quickjs (attach + connect with vscode debugger): 26 | ```c 27 | // address is in format "0.0.0.0:6666" to listen on all addresses on port 6666 28 | void js_debugger_wait_connection(JSContext *ctx, const char* address); 29 | ``` 30 | 31 | To initiate a connection in embedded quickjs (attach + listen with vscode debugger): 32 | ```c 33 | // address is in format "192.168.1.66:6666" to connect to 192.168.1.66 on port 6666 34 | void js_debugger_connect(JSContext *ctx, const char* address); 35 | ``` 36 | 37 | Alternatively, provide one of the following environment variables before starting the process embedded with QuickJS: 38 | 39 | `QUICKJS_DEBUG_ADDRESS` or `QUICKJS_DEBUG_LISTEN_ADDRESS` with the same value as above. 40 | 41 | Using these methods will block execution until the debugger has attached. 42 | 43 | QuickJS does not provide an event loop, so the debugger should (optionally, but recommended) be periodically called from your event loop to check for messages. Otherwise, debugger messages may go unhandled until the next time Javascript is invoked. This can be done with: 44 | 45 | ```c 46 | void js_debugger_cooperate(JSContext *ctx); 47 | ``` 48 | 49 | ## Protocol 50 | 51 | Protocol documentation is [here](protocol.md). 52 | -------------------------------------------------------------------------------- /protocol.md: -------------------------------------------------------------------------------- 1 | # Connection 2 | 3 | The default debugger transport is a TCP/IP connection from the qjs binary to the QuickJS VS Code extension. This can be changed by implementing a different [transport](https://github.com/koush/quickjs/blob/master/quickjs-debugger-transport-unix.c). 4 | 5 | # Wire Protocol and Framing 6 | 7 | Once a connection has been initiated, debugger protocol messages begin being sent. The wire protocol messages are framed similarly to chunked encoding and is human readable: 8 | 9 | ``` 10 | <8 character hex length>\n\n 11 | ``` 12 | 13 | For example, sending hello world: 14 | 15 | ``` 16 | 0000000B\nhello world\n 17 | ``` 18 | 19 | # JSON Messages 20 | 21 | All debugger protocol messages are JSON payloads. 22 | 23 | ``` 24 | 00000019\n{"message": "hello world"}\n 25 | ``` 26 | 27 | For on the wire readability, the JSON messages are ended with a new line (but this is not required, as the JSON is parseable with or without a new line): 28 | 29 | ``` 30 | 0000001A\n{"message": "hello world"}\n 31 | ``` 32 | 33 | So when viewing it in sniffer, the message would look as follows in the console (new lines are printed here): 34 | 35 | ``` 36 | 0000001A 37 | {"message": "hello world"} 38 | ``` 39 | 40 | # QuickJS Debug Protocol 41 | 42 | ### Message Flow 43 | ``` 44 | [qjs] <-----> [QuickJS Debug Extension] <-----> [VS Code] 45 | ``` 46 | 47 | ## Terminology 48 | * Debug Server: the qjs runtime and debugger that handles debugging requests. 49 | * Debug Adapter: the QuickJS Debug VS Code extension that handles communication with the debug server on the behalf of VSCode. 50 | 51 | VS Code [debug protocol messages](https://github.com/microsoft/vscode/blob/master/src/vs/workbench/contrib/debug/common/debugProtocol.d.ts) delivered to the extension are basically sent as-is across the wire to the QuickJS debugger runtime. 52 | 53 | The debug protocol messages will not be documented here. Refer to the [official documentation](https://code.visualstudio.com/blogs/2018/08/07/debug-adapter-protocol-website). 54 | 55 | The debug adapter handles the following requests: 56 | 57 | * launch 58 | * terminate 59 | * continue 60 | * pause 61 | * next 62 | * stepIn 63 | * stepOut 64 | * setBreakpoints 65 | * setExceptionBreakpoints 66 | * threads 67 | * stackTrace 68 | * scopes 69 | * variables 70 | * evaluate 71 | * completions 72 | 73 | ## QuickJS Debug Session 74 | 75 | The default transport works as following: 76 | 77 | 1. The debug adapter starts and waits for incoming connections on the specified port. 78 | 2. The qjs binary or embedded binary with the debug server starts and connects with one of the following mechanisms: 79 | * programatically via the `js_debugger_connect(JSContext *ctx, const char *address)` method. 80 | * automatically via the `QUICKJS_DEBUG_ADDRESS` environment variable, which is in `address:port` notation. 81 | 82 | The debug adapter simply serves as a proxy for debug protocol messages. The debug server and debug adapter send messages back and forth, until the session ends. 83 | 84 | ## Debugging Multiple JSContexts 85 | 86 | The QuickJS Debug extension supports debugging multiple JSContexts. 87 | * The QuickJS Debug Server will initiate one connection per JSContext. This keeps the implementation simple on the runtime side. The Debug Server is implemented as if it is a single instance. 88 | * The QuickJS Debug Adapter will accept connections from multiple Debug Servers. 89 | 90 | Each JSContext is represented as a "thread" by the Debug Adapter (see threads request). All identifiers sent 91 | from the debug server are namespaced to the originating thread by the Debug Adapter. The debug adapter 92 | will intercept the following requests and translate the references of variables before sending them along to VS Code: 93 | * stackTrace 94 | * scopes 95 | * variables 96 | * evaluate 97 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------- 2 | * Copyright (C) Microsoft Corporation. All rights reserved. 3 | *--------------------------------------------------------*/ 4 | 5 | 'use strict'; 6 | 7 | import * as vscode from 'vscode'; 8 | import { WorkspaceFolder, DebugConfiguration, ProviderResult, CancellationToken } from 'vscode'; 9 | import { QuickJSDebugSession } from './quickjsDebug'; 10 | import * as Net from 'net'; 11 | 12 | /* 13 | * Set the following compile time flag to true if the 14 | * debug adapter should run inside the extension host. 15 | * Please note: the test suite does not (yet) work in this mode. 16 | */ 17 | const EMBED_DEBUG_ADAPTER = true; 18 | 19 | export function activate(context: vscode.ExtensionContext) { 20 | // register a configuration provider for 'quickjs' debug type 21 | const provider = new QuickJSConfigurationProvider(); 22 | context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider('quickjs', provider)); 23 | 24 | if (EMBED_DEBUG_ADAPTER) { 25 | // The following use of a DebugAdapter factory shows how to run the debug adapter inside the extension host (and not as a separate process). 26 | const factory = new QuickJSDebugAdapterDescriptorFactory(); 27 | context.subscriptions.push(vscode.debug.registerDebugAdapterDescriptorFactory('quickjs', factory)); 28 | context.subscriptions.push(factory); 29 | } else { 30 | // The following use of a DebugAdapter factory shows how to control what debug adapter executable is used. 31 | // Since the code implements the default behavior, it is absolutely not neccessary and we show it here only for educational purpose. 32 | context.subscriptions.push(vscode.debug.registerDebugAdapterDescriptorFactory('quickjs', { 33 | createDebugAdapterDescriptor: (session: vscode.DebugSession, executable: vscode.DebugAdapterExecutable | undefined) => { 34 | // param "executable" contains the executable optionally specified in the package.json (if any) 35 | 36 | // use the executable specified in the package.json if it exists or determine it based on some other information (e.g. the session) 37 | if (!executable) { 38 | const command = "absolute path to my DA executable"; 39 | const args = [ 40 | "some args", 41 | "another arg" 42 | ]; 43 | const options = { 44 | cwd: "working directory for executable", 45 | env: { "VAR": "some value" } 46 | }; 47 | executable = new vscode.DebugAdapterExecutable(command, args, options); 48 | } 49 | 50 | // make VS Code launch the DA executable 51 | return executable; 52 | } 53 | })); 54 | } 55 | } 56 | 57 | export function deactivate() { 58 | // nothing to do 59 | } 60 | 61 | 62 | class QuickJSConfigurationProvider implements vscode.DebugConfigurationProvider { 63 | 64 | /** 65 | * Massage a debug configuration just before a debug session is being launched, 66 | * e.g. add all missing attributes to the debug configuration. 67 | */ 68 | resolveDebugConfiguration(folder: WorkspaceFolder | undefined, config: DebugConfiguration, token?: CancellationToken): ProviderResult { 69 | return config; 70 | } 71 | } 72 | 73 | class QuickJSDebugAdapterDescriptorFactory implements vscode.DebugAdapterDescriptorFactory { 74 | 75 | private server?: Net.Server; 76 | 77 | createDebugAdapterDescriptor(session: vscode.DebugSession, executable: vscode.DebugAdapterExecutable | undefined): vscode.ProviderResult { 78 | 79 | if (!this.server) { 80 | // start listening on a random port 81 | this.server = Net.createServer(socket => { 82 | const session = new QuickJSDebugSession(); 83 | session.setRunAsServer(true); 84 | session.start(socket, socket); 85 | }).listen(0); 86 | } 87 | 88 | // make VS Code connect to debug server 89 | return new vscode.DebugAdapterServer((this.server.address()).port); 90 | } 91 | 92 | dispose() { 93 | if (this.server) { 94 | this.server.close(); 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/sourcemapSession.ts: -------------------------------------------------------------------------------- 1 | import { BasicSourceMapConsumer, MappedPosition, SourceMapConsumer } from 'source-map'; 2 | import { LoggingDebugSession } from 'vscode-debugadapter'; 3 | import { SourcemapArguments } from "./sourcemapArguments"; 4 | const path = require('path'); 5 | const fs = require('fs'); 6 | 7 | export abstract class SourcemapSession extends LoggingDebugSession { 8 | // a map of all absolute file sources found in the sourcemaps 9 | private _fileToSourceMap = new Map(); 10 | private _sourceMapsLoading: Promise|undefined; 11 | // keep track of the sourcemaps and the location of the file.map used to load it 12 | private _sourceMaps = new Map(); 13 | 14 | abstract async logTrace(message: string); 15 | abstract async getArguments(): Promise; 16 | 17 | async loadSourceMaps() { 18 | const commonArgs = await this.getArguments(); 19 | if (this._sourceMapsLoading) 20 | return await this._sourceMapsLoading; 21 | 22 | let sourceMaps = Object.keys(commonArgs.sourceMaps || {}) || []; 23 | 24 | let promises = sourceMaps.map(sourcemap => (async () => { 25 | try { 26 | let json = JSON.parse(fs.readFileSync(sourcemap).toString()); 27 | let smc = await new SourceMapConsumer(json); 28 | this._sourceMaps.set(smc, sourcemap); 29 | let sourceMapRoot = path.dirname(sourcemap); 30 | let sources = smc.sources.map(source => path.join(sourceMapRoot, source) as string); 31 | for (let source of sources) { 32 | const other = this._fileToSourceMap.get(source); 33 | if (other) { 34 | this.logTrace(`sourcemap for ${source} found in ${other.file}.map and ${sourcemap}`); 35 | } 36 | else { 37 | this._fileToSourceMap.set(source, smc); 38 | } 39 | } 40 | } 41 | catch (e) { 42 | } 43 | })()); 44 | 45 | this._sourceMapsLoading = Promise.all(promises); 46 | 47 | return await this._sourceMapsLoading; 48 | } 49 | 50 | async translateFileToRemote(file: string): Promise { 51 | await this.loadSourceMaps(); 52 | 53 | const sm = this._fileToSourceMap.get(file); 54 | if (!sm) 55 | return file; 56 | return sm.file; 57 | } 58 | 59 | private async getRemoteAbsolutePath(remoteFile: string, remoteRoot?: string): Promise { 60 | const commonArgs = await this.getArguments(); 61 | if (remoteRoot === null) 62 | remoteRoot = commonArgs.remoteRoot; 63 | if (remoteRoot) 64 | remoteFile = path.join(remoteRoot, remoteFile); 65 | return remoteFile; 66 | } 67 | 68 | private async getRemoteRelativePath(remoteFile: string, remoteRoot?: string): Promise { 69 | const commonArgs = await this.getArguments(); 70 | if (remoteRoot === null) 71 | remoteRoot = commonArgs.remoteRoot; 72 | if (remoteRoot) 73 | return path.relative(remoteRoot, remoteFile); 74 | return remoteFile; 75 | } 76 | 77 | private async getLocalAbsolutePath(localFile: string): Promise { 78 | const commonArgs = await this.getArguments(); 79 | if (commonArgs.localRoot) 80 | return path.join(commonArgs.localRoot, localFile); 81 | return localFile; 82 | } 83 | private async getLocalRelativePath(localFile: string): Promise { 84 | const commonArgs = await this.getArguments(); 85 | if (commonArgs.localRoot) 86 | return path.relative(commonArgs.localRoot, localFile); 87 | return localFile; 88 | } 89 | 90 | 91 | async translateFileLocationToRemote(sourceLocation: MappedPosition): Promise { 92 | await this.loadSourceMaps(); 93 | const commonArgs = await this.getArguments(); 94 | 95 | // step 1: translate the absolute local source position to a relative source position. 96 | // (has sourcemap) /local/path/to/test.ts:10 -> test.js:15 97 | // (no sourcemap) /local/path/to/test.js:10 -> test.js:10 98 | // step 2: translate the relative source file to an absolute remote source file 99 | // (has sourcemap) test.js:15 -> /remote/path/to/test.js:15 100 | // (no sourcemap) test.js:10 -> /remote/path/to/test.js:10 101 | // (no remote root)test.js:10 -> test.js:10 102 | 103 | try { 104 | const sm = this._fileToSourceMap.get(sourceLocation.source); 105 | if (!sm) 106 | throw new Error('no source map'); 107 | const sourcemap = this._sourceMaps.get(sm); 108 | if (!sourcemap) 109 | throw new Error(); 110 | const actualSourceLocation = Object.assign({}, sourceLocation); 111 | this.logTrace(`translateFileLocationToRemote: ${JSON.stringify(sourceLocation)} to: ${JSON.stringify(actualSourceLocation)}`); 112 | // convert the local absolute path into a sourcemap relative path. 113 | actualSourceLocation.source = path.relative(path.dirname(sourcemap), sourceLocation.source); 114 | delete actualSourceLocation.column; 115 | // let unmappedPosition: NullablePosition = sm.generatedPositionFor(actualSourceLocation); 116 | let unmappedPositions = sm.allGeneratedPositionsFor(actualSourceLocation); 117 | if (!unmappedPositions || !unmappedPositions.length) 118 | throw new Error('map failed'); 119 | // now given a source mapped relative path, translate that into a remote path. 120 | const smp = this._sourceMaps.get(sm); 121 | let remoteRoot = commonArgs.sourceMaps && commonArgs.sourceMaps[smp!]; 122 | let remoteFile = await this.getRemoteAbsolutePath(sm.file, remoteRoot); 123 | return unmappedPositions.map(unmappedPosition => ({ 124 | source: remoteFile, 125 | line: (unmappedPosition.line || 0), 126 | column: unmappedPosition.column || 0, 127 | })); 128 | // return { 129 | // source: remoteFile, 130 | // // the source-map docs indicate that line is 1 based, but that seems to be wrong. 131 | // line: (unmappedPosition.line || 0) + 1, 132 | // column: unmappedPosition.column || 0, 133 | // }; 134 | } 135 | catch (e) { 136 | // local files need to be resolved to remote files. 137 | let ret = Object.assign({}, sourceLocation); 138 | ret.source = await this.getRemoteAbsolutePath(await this.getLocalRelativePath(sourceLocation.source)); 139 | return [ret]; 140 | } 141 | } 142 | 143 | async translateRemoteLocationToLocal(sourceLocation: MappedPosition): Promise { 144 | await this.loadSourceMaps(); 145 | const commonArgs = await this.getArguments(); 146 | 147 | try { 148 | for (let sm of this._sourceMaps.keys()) { 149 | const smp = this._sourceMaps.get(sm); 150 | 151 | // given a remote path, translate that into a source map relative path for lookup 152 | let remoteRoot = commonArgs.sourceMaps && commonArgs.sourceMaps[smp!]; 153 | let relativeFile = await this.getRemoteRelativePath(sourceLocation.source, remoteRoot); 154 | 155 | if (relativeFile !== sm.file) 156 | continue; 157 | 158 | const original = sm.originalPositionFor({ 159 | column: sourceLocation.column, 160 | line: sourceLocation.line, 161 | }); 162 | this.logTrace(`translateRemoteLocationToLocal: ${JSON.stringify(sourceLocation)} to: ${JSON.stringify(original)}`); 163 | if (original.line === null || original.column === null || original.source === null) 164 | throw new Error("unable to map"); 165 | 166 | // now given a source mapped relative path, translate that into a local path. 167 | return { 168 | source: path.join(path.dirname(smp), original.source), 169 | line: original.line, 170 | column: original.column, 171 | }; 172 | } 173 | throw new Error(); 174 | } 175 | catch (e) { 176 | // remote files need to be resolved to local files. 177 | let ret = Object.assign({}, sourceLocation); 178 | ret.source = await this.getLocalAbsolutePath(await this.getRemoteRelativePath(sourceLocation.source)); 179 | return ret; 180 | } 181 | } 182 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "quickjs-debug", 3 | "displayName": "QuickJS Debugger", 4 | "version": "0.0.15", 5 | "publisher": "koush", 6 | "description": "Debug the QuickJS runtime.", 7 | "author": { 8 | "name": "Koushik Dutta", 9 | "email": "koushd@gmail.com" 10 | }, 11 | "license": "MIT", 12 | "keywords": [ 13 | "multi-root ready" 14 | ], 15 | "engines": { 16 | "vscode": "^1.33.0", 17 | "node": "^10.15.1" 18 | }, 19 | "icon": "images/quickjs-debug-icon.png", 20 | "categories": [ 21 | "Debuggers" 22 | ], 23 | "private": true, 24 | "repository": { 25 | "type": "git", 26 | "url": "https://github.com/koush/vscode-quickjs-debug.git" 27 | }, 28 | "bugs": { 29 | "url": "https://github.com/koush/vscode-quickjs-debug/issues" 30 | }, 31 | "scripts": { 32 | "prepublish": "tsc -p ./src", 33 | "compile": "tsc -p ./src", 34 | "tslint": "tslint ./src/**/*.ts", 35 | "watch": "tsc -w -p ./src", 36 | "postinstall": "node ./node_modules/vscode/bin/install", 37 | "package": "vsce package", 38 | "publish": "vsce publish" 39 | }, 40 | "dependencies": { 41 | "await-notify": "1.0.1", 42 | "source-map": "^0.7.3", 43 | "stream-parser": "^0.3.1", 44 | "vscode-debugadapter": "^1.41.1" 45 | }, 46 | "devDependencies": { 47 | "@types/node": "10.12.12", 48 | "@types/mocha": "5.2.7", 49 | "typescript": "3.5.3", 50 | "mocha": "6.2.0", 51 | "vscode": "1.1.36", 52 | "vscode-debugadapter-testsupport": "1.37.0", 53 | "tslint": "5.18.0", 54 | "vsce": "1.66.0" 55 | }, 56 | "main": "./out/extension", 57 | "activationEvents": [ 58 | "onDebug" 59 | ], 60 | "contributes": { 61 | "breakpoints": [ 62 | { 63 | "language": "markdown" 64 | } 65 | ], 66 | "debuggers": [ 67 | { 68 | "type": "quickjs", 69 | "label": "QuickJS Debug", 70 | "program": "./out/debugAdapter.js", 71 | "runtime": "node", 72 | "configurationAttributes": { 73 | "launch": { 74 | "required": [ 75 | "program", 76 | "runtimeExecutable" 77 | ], 78 | "properties": { 79 | "program": { 80 | "type": "string", 81 | "description": "Absolute path to a js file.", 82 | "default": "${workspaceFolder}/main.js" 83 | }, 84 | "console": { 85 | "type": "string", 86 | "enum": [ 87 | "internalConsole", 88 | "integratedTerminal", 89 | "externalTerminal" 90 | ], 91 | "default": "internalConsole" 92 | }, 93 | "args": { 94 | "type": "array", 95 | "items": { 96 | "type": "string" 97 | }, 98 | "default": [] 99 | }, 100 | "cwd": { 101 | "type": "string", 102 | "default": "${workspaceFolder}" 103 | }, 104 | "runtimeExecutable": { 105 | "type": "string", 106 | "description": "Path to qjs executable" 107 | }, 108 | "mode": { 109 | "type": "string", 110 | "description": "The debugger connection mode. Use 'listen' to have VS Code wait for QuickJS to connect. Use 'connect' to have VSCode attach to a QuickJS runtime that is listening for a debugger.", 111 | "enum": [ 112 | "connect", 113 | "listen" 114 | ], 115 | "default": "listen" 116 | }, 117 | "address": { 118 | "type": "string", 119 | "description": "The address used by he debug extension for incoming/outgoing sessions (connection 'mode' dependent).", 120 | "default": "localhost" 121 | }, 122 | "port": { 123 | "type": "number", 124 | "description": "The port used by he debug extension for incoming/outgoing sessions. (connection 'mode' dependent)", 125 | "default": 0 126 | }, 127 | "localRoot": { 128 | "type": "string", 129 | "description": "The local source root use for files that do not have source maps.", 130 | "default": "${workspaceFolder}/" 131 | }, 132 | "remoteRoot": { 133 | "type": "string", 134 | "description": "The remote root use for files that do not have source maps.", 135 | "default": "" 136 | }, 137 | "trace": { 138 | "type": "boolean", 139 | "description": "Enable logging of the Debug Adapter Protocol.", 140 | "default": true 141 | }, 142 | "sourceMaps": { 143 | "type": "object", 144 | "description": "The sourcemaps from a transpilation tool like webpack and their corresponding remoteRoots. Specifying null will use the default remoteRoot.", 145 | "default": { 146 | "${workspaceFolder}/out/main.quickjs.js.map": "${workspaceFolder}/src" 147 | } 148 | } 149 | } 150 | }, 151 | "attach": { 152 | "properties": { 153 | "mode": { 154 | "type": "string", 155 | "description": "The debugger connection mode. Use 'listen' to have VS Code wait for QuickJS to connect. Use 'connect' to have VSCode attach to a QuickJS runtime that is listening for a debugger.", 156 | "enum": [ 157 | "connect", 158 | "listen" 159 | ], 160 | "default": "listen" 161 | }, 162 | "address": { 163 | "type": "string", 164 | "description": "The address used by he debug extension for incoming/outgoing sessions (connection 'mode' dependent).", 165 | "default": "localhost" 166 | }, 167 | "port": { 168 | "type": "number", 169 | "description": "The port used by he debug extension for incoming/outgoing sessions. (connection 'mode' dependent)", 170 | "default": 0 171 | }, 172 | "localRoot": { 173 | "type": "string", 174 | "description": "The local source root used for unqualified files.", 175 | "default": "${workspaceFolder}/" 176 | }, 177 | "remoteRoot": { 178 | "type": "string", 179 | "description": "The remote root use for files that do not have source maps.", 180 | "default": "" 181 | }, 182 | "trace": { 183 | "type": "boolean", 184 | "description": "Enable logging of the Debug Adapter Protocol.", 185 | "default": true 186 | }, 187 | "sourceMaps": { 188 | "type": "object", 189 | "description": "The sourcemaps from a transpilation tool like webpack and their corresponding remoteRoots. Specifying null will use the default remoteRoot.", 190 | "default": { 191 | "${workspaceFolder}/out/main.quickjs.js.map": "${workspaceFolder}/src" 192 | } 193 | } 194 | } 195 | } 196 | }, 197 | "initialConfigurations": [ 198 | { 199 | "type": "quickjs", 200 | "request": "launch", 201 | "name": "Launch QuickJS", 202 | "runtimeExecutable": "/path/to/qjs", 203 | "program": "^\"${workspaceFolder}/main.js\"" 204 | } 205 | ], 206 | "configurationSnippets": [ 207 | { 208 | "label": "QuickJS Debug: Launch", 209 | "description": "A new configuration for launching and debugging a JavaScript file in QuickJS.", 210 | "body": { 211 | "type": "quickjs", 212 | "request": "launch", 213 | "name": "Launch QuickJS", 214 | "runtimeExecutable": "/path/to/qjs", 215 | "program": "^\"\\${workspaceFolder}/main.js\"" 216 | } 217 | }, 218 | { 219 | "label": "QuickJS Debug: Attach", 220 | "description": "A new configuration for launching and waiting fpr QuickJS to attach.", 221 | "body": { 222 | "type": "quickjs", 223 | "request": "launch", 224 | "name": "Attach QuickJS", 225 | "localRoot": "^\"\\${workspaceFolder}/\"" 226 | } 227 | } 228 | ] 229 | } 230 | ] 231 | } 232 | } 233 | -------------------------------------------------------------------------------- /src/quickjsDebug.ts: -------------------------------------------------------------------------------- 1 | import * as CP from 'child_process'; 2 | import { AddressInfo, createConnection, Server, Socket } from 'net'; 3 | import { basename } from 'path'; 4 | import { MappedPosition } from 'source-map'; 5 | import { InitializedEvent, Logger, logger, OutputEvent, Scope, Source, StackFrame, StoppedEvent, TerminatedEvent, Thread, ThreadEvent } from 'vscode-debugadapter'; 6 | import { DebugProtocol } from 'vscode-debugprotocol'; 7 | import { SourcemapArguments } from './sourcemapArguments'; 8 | import { SourcemapSession } from "./sourcemapSession"; 9 | const path = require('path'); 10 | const Parser = require('stream-parser'); 11 | const Transform = require('stream').Transform; 12 | const { Subject } = require('await-notify'); 13 | 14 | interface CommonArguments extends SourcemapArguments { 15 | program: string; 16 | args?: string[]; 17 | cwd?: string; 18 | runtimeExecutable: string; 19 | mode: string; 20 | address: string; 21 | port: number; 22 | console?: ConsoleType; 23 | trace?: boolean; 24 | } 25 | interface LaunchRequestArguments extends CommonArguments, DebugProtocol.LaunchRequestArguments { 26 | } 27 | interface AttachRequestArguments extends CommonArguments, DebugProtocol.AttachRequestArguments { 28 | } 29 | 30 | /** 31 | * Messages from the qjs binary are in big endian length prefix json payloads. 32 | * The protocol is roughly just the JSON stringification of the requests. 33 | * Responses are intercepted to translate references into thread scoped references. 34 | */ 35 | class MessageParser extends Transform { 36 | constructor() { 37 | super(); 38 | this._bytes(9, this.onLength); 39 | } 40 | 41 | private onLength(buffer: Buffer) { 42 | let length = parseInt(buffer.toString(), 16); 43 | this.emit('length', length); 44 | this._bytes(length, this.onMessage); 45 | } 46 | 47 | private onMessage(buffer: Buffer) { 48 | let json = JSON.parse(buffer.toString()); 49 | this.emit('message', json); 50 | this._bytes(9, this.onLength); 51 | } 52 | } 53 | Parser(MessageParser.prototype); 54 | 55 | type ConsoleType = 'internalConsole' | 'integratedTerminal' | 'externalTerminal'; 56 | 57 | interface PendingResponse { 58 | resolve: Function; 59 | reject: Function; 60 | } 61 | 62 | export class QuickJSDebugSession extends SourcemapSession { 63 | private static RUNINTERMINAL_TIMEOUT = 5000; 64 | 65 | private _server?: Server; 66 | private _supportsRunInTerminalRequest = false; 67 | private _console: ConsoleType = 'internalConsole'; 68 | private _isTerminated: boolean; 69 | private _threads = new Set(); 70 | private _connection?: Socket; 71 | private _requests = new Map(); 72 | // contains a list of real source files and their source mapped breakpoints. 73 | // ie: file1.ts -> webpack.main.js:59 74 | // file2.ts -> webpack.main.js:555 75 | // when sending breakpoint messages, perform the mapping, note which mapped files changed, 76 | // then filter the breakpoint values for those touched files. 77 | // sending only the mapped breakpoints from file1.ts would clobber existing 78 | // breakpoints from file2.ts, as they both map to webpack.main.js. 79 | private _breakpoints = new Map(); 80 | private _stopOnException = false; 81 | private _stackFrames = new Map(); 82 | private _variables = new Map(); 83 | private _commonArgs: CommonArguments; 84 | private _argsSubject = new Subject(); 85 | private _argsReady = (async () => { 86 | await this._argsSubject.wait(); 87 | })(); 88 | 89 | public constructor() { 90 | super("quickjs-debug.txt"); 91 | 92 | this.setDebuggerLinesStartAt1(true); 93 | this.setDebuggerColumnsStartAt1(true); 94 | } 95 | 96 | protected initializeRequest(response: DebugProtocol.InitializeResponse, args: DebugProtocol.InitializeRequestArguments): void { 97 | 98 | if (typeof args.supportsRunInTerminalRequest === 'boolean') { 99 | this._supportsRunInTerminalRequest = args.supportsRunInTerminalRequest; 100 | } 101 | 102 | // build and return the capabilities of this debug adapter: 103 | response.body = response.body || {}; 104 | 105 | // make VS Code to use 'evaluate' when hovering over source 106 | response.body.supportsEvaluateForHovers = true; 107 | response.body.exceptionBreakpointFilters = [{ 108 | label: "All Exceptions", 109 | filter: "exceptions", 110 | }]; 111 | 112 | // make VS Code to support data breakpoints 113 | // response.body.supportsDataBreakpoints = true; 114 | 115 | // make VS Code to support completion in REPL 116 | response.body.supportsCompletionsRequest = true; 117 | response.body.completionTriggerCharacters = [".", "["]; 118 | 119 | // make VS Code to send cancelRequests 120 | // response.body.supportsCancelRequest = true; 121 | 122 | // make VS Code send the breakpointLocations request 123 | // response.body.supportsBreakpointLocationsRequest = true; 124 | 125 | response.body.supportsConfigurationDoneRequest = true; 126 | 127 | response.body.supportsTerminateRequest = true; 128 | 129 | this.sendResponse(response); 130 | 131 | this.sendEvent(new InitializedEvent()); 132 | } 133 | 134 | private handleEvent(thread: number, event: any) { 135 | if (event.type === 'StoppedEvent') { 136 | if (event.reason !== 'entry') 137 | this.sendEvent(new StoppedEvent(event.reason, thread)); 138 | } 139 | else if (event.type === 'terminated') { 140 | this._terminated('remote terminated'); 141 | } 142 | else if (event.type === "ThreadEvent") { 143 | const threadEvent = new ThreadEvent(event.reason, thread); 144 | if (threadEvent.body.reason === 'new') 145 | this._threads.add(thread); 146 | else if (threadEvent.body.reason === 'exited') 147 | this._threads.delete(thread); 148 | this.sendEvent(threadEvent); 149 | } 150 | } 151 | 152 | private handleResponse(json: any) { 153 | let request_seq: number = json.request_seq; 154 | let pending = this._requests.get(request_seq); 155 | if (!pending) { 156 | this.logTrace(`request not found: ${request_seq}`); 157 | return; 158 | } 159 | this._requests.delete(request_seq); 160 | if (json.error) 161 | pending.reject(new Error(json.error)); 162 | else 163 | pending.resolve(json.body); 164 | } 165 | 166 | private async newSession() { 167 | let files = new Set(); 168 | for (let bps of this._breakpoints.values()) { 169 | for (let bp of bps) { 170 | files.add(bp.source); 171 | } 172 | } 173 | for (let file of files) { 174 | await this.sendBreakpointMessage(file); 175 | } 176 | 177 | this.sendThreadMessage({ 178 | type: 'stopOnException', 179 | stopOnException: this._stopOnException, 180 | }); 181 | 182 | this.sendThreadMessage({ type: 'continue' }); 183 | } 184 | 185 | private onSocket(socket: Socket) { 186 | this.closeConnection(); 187 | this._connection = socket; 188 | this.newSession(); 189 | 190 | let parser = new MessageParser(); 191 | parser.on('message', json => { 192 | // the very first message will include the thread id, as it will be a stopped event. 193 | if (json.type === 'event') { 194 | const thread = json.event.thread; 195 | if (!this._threads.has(thread)) { 196 | this._threads.add(thread); 197 | this.sendEvent(new ThreadEvent("new", thread)); 198 | this.emit('quickjs-thread'); 199 | } 200 | this.logTrace(`received message (thread ${thread}): ${JSON.stringify(json)}`); 201 | this.handleEvent(thread, json.event); 202 | } 203 | else if (json.type === 'response') { 204 | this.handleResponse(json); 205 | } 206 | else { 207 | this.logTrace(`unknown message ${json.type}`); 208 | } 209 | }); 210 | 211 | socket.pipe(parser as any); 212 | socket.on('error', e => this._terminated(e.toString())); 213 | socket.on('close', () => this._terminated('close')); 214 | } 215 | 216 | protected disconnectRequest(response: DebugProtocol.DisconnectResponse, args: DebugProtocol.DisconnectArguments, request?: DebugProtocol.Request): void { 217 | this.closeServer(); 218 | this.closeConnection(); 219 | this.sendResponse(response); 220 | } 221 | 222 | protected async attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments, request?: DebugProtocol.Request) { 223 | this._commonArgs = args; 224 | this._argsSubject.notify(); 225 | this.beforeConnection({}); 226 | this.afterConnection(); 227 | this.sendResponse(response); 228 | } 229 | 230 | protected async launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments) { 231 | this._commonArgs = args; 232 | this._argsSubject.notify(); 233 | 234 | this._commonArgs.localRoot = args.localRoot; 235 | this.closeServer(); 236 | 237 | let env = {}; 238 | try { 239 | this.beforeConnection(env); 240 | } 241 | catch (e) { 242 | this.sendErrorResponse(response, 17, e.message); 243 | return; 244 | } 245 | let cwd = args.cwd || path.dirname(args.program); 246 | 247 | if (typeof args.console === 'string') { 248 | switch (args.console) { 249 | case 'internalConsole': 250 | case 'integratedTerminal': 251 | case 'externalTerminal': 252 | this._console = args.console; 253 | break; 254 | default: 255 | this.sendErrorResponse(response, 2028, `Unknown console type '${args.console}'.`); 256 | return; 257 | } 258 | } 259 | 260 | let qjsArgs = (args.args || []).slice(); 261 | qjsArgs.unshift(args.program); 262 | 263 | if (this._supportsRunInTerminalRequest && (this._console === 'externalTerminal' || this._console === 'integratedTerminal')) { 264 | 265 | const termArgs: DebugProtocol.RunInTerminalRequestArguments = { 266 | kind: this._console === 'integratedTerminal' ? 'integrated' : 'external', 267 | title: "QuickJS Debug Console", 268 | cwd, 269 | args: qjsArgs, 270 | env, 271 | }; 272 | 273 | this.runInTerminalRequest(termArgs, QuickJSDebugSession.RUNINTERMINAL_TIMEOUT, runResponse => { 274 | if (runResponse.success) { 275 | // this._attach(response, args, port, address, timeout); 276 | } else { 277 | this.sendErrorResponse(response, 2011, `Cannot launch debug target in terminal (${runResponse.message}).`); 278 | // this._terminated('terminal error: ' + runResponse.message); 279 | } 280 | }); 281 | } else { 282 | const options: CP.SpawnOptions = { 283 | cwd, 284 | env, 285 | }; 286 | 287 | const nodeProcess = CP.spawn(args.runtimeExecutable, qjsArgs, options); 288 | nodeProcess.on('error', (error) => { 289 | // tslint:disable-next-line:no-bitwise 290 | this.sendErrorResponse(response, 2017, `Cannot launch debug target (${error.message}).`); 291 | this._terminated(`failed to launch target (${error})`); 292 | }); 293 | nodeProcess.on('exit', () => { 294 | this._terminated('target exited'); 295 | }); 296 | nodeProcess.on('close', (code) => { 297 | this._terminated('target closed'); 298 | }); 299 | 300 | this._captureOutput(nodeProcess); 301 | } 302 | 303 | try { 304 | this.afterConnection(); 305 | } 306 | catch (e) { 307 | this.sendErrorResponse(response, 18, e.message); 308 | return; 309 | } 310 | 311 | this.sendResponse(response); 312 | } 313 | 314 | 315 | private beforeConnection(env: any) { 316 | // make sure to 'Stop' the buffered logging if 'trace' is not set 317 | logger.setup(this._commonArgs.trace ? Logger.LogLevel.Verbose : Logger.LogLevel.Stop, false); 318 | 319 | const address = this._commonArgs.address || 'localhost'; 320 | if (this._commonArgs.mode === 'connect') { 321 | // connect to a quickjs runtime that is instructed to listen for a connection. 322 | // typically connect should not be used with launching, because it 323 | // needs to wait for quickjs to spin up and listen. 324 | // connect should be used with attach. 325 | 326 | if (!this._commonArgs.port) 327 | throw new Error("Must specify a 'port' for 'connect'"); 328 | env['QUICKJS_DEBUG_LISTEN_ADDRESS'] = `${address}:${this._commonArgs.port}`; 329 | } 330 | else { 331 | this._server = new Server(socket => { 332 | this.closeServer(); 333 | this.onSocket(socket); 334 | }); 335 | this._server.listen(this._commonArgs.port || 0); 336 | let port = (this._server.address()).port; 337 | this.log(`QuickJS Debug Port: ${port}`); 338 | 339 | env['QUICKJS_DEBUG_ADDRESS'] = `localhost:${port}`; 340 | } 341 | } 342 | 343 | private async afterConnection() { 344 | if (this._commonArgs.mode === 'connect') { 345 | 346 | let socket: Socket | undefined = undefined; 347 | for (let attempt = 0; attempt < 10; attempt++) { 348 | try { 349 | socket = await new Promise((resolve, reject) => { 350 | let socket = createConnection(this._commonArgs.port, this._commonArgs.address); 351 | socket.on('connect', () => { 352 | socket.removeAllListeners(); 353 | resolve(socket); 354 | }); 355 | 356 | socket.on('close', reject); 357 | socket.on('error', reject); 358 | }); 359 | break; 360 | } 361 | catch (e) { 362 | await new Promise(resolve => setTimeout(resolve, 1000)); 363 | } 364 | } 365 | 366 | if (!socket) { 367 | const address = this._commonArgs.address || 'localhost'; 368 | throw new Error(`Cannot launch connect (${address}:${this._commonArgs.port}).`); 369 | } 370 | 371 | this.onSocket(socket); 372 | } 373 | } 374 | 375 | private _captureOutput(process: CP.ChildProcess) { 376 | process.stdout.on('data', (data: string) => { 377 | this.sendEvent(new OutputEvent(data.toString(), 'stdout')); 378 | }); 379 | process.stderr.on('data', (data: string) => { 380 | this.sendEvent(new OutputEvent(data.toString(), 'stderr')); 381 | }); 382 | } 383 | 384 | async getArguments(): Promise { 385 | await this._argsReady; 386 | return this._commonArgs; 387 | } 388 | 389 | public async logTrace(message: string) { 390 | await this._argsReady; 391 | if (this._commonArgs.trace) 392 | this.log(message); 393 | } 394 | 395 | public log(message: string) { 396 | this.sendEvent(new OutputEvent(message + '\n', 'console')); 397 | } 398 | 399 | private _terminated(reason: string): void { 400 | this.log(`Debug Session Ended: ${reason}`); 401 | this.closeServer(); 402 | this.closeConnection(); 403 | 404 | if (!this._isTerminated) { 405 | this._isTerminated = true; 406 | this.sendEvent(new TerminatedEvent()); 407 | } 408 | } 409 | 410 | private async closeServer() { 411 | if (this._server) { 412 | this._server.close(); 413 | this._server = undefined; 414 | } 415 | } 416 | private async closeConnection() { 417 | if (this._connection) 418 | this._connection.destroy(); 419 | this._connection = undefined; 420 | this._threads.clear(); 421 | } 422 | 423 | protected async terminateRequest(response: DebugProtocol.TerminateResponse, args: DebugProtocol.TerminateArguments, request?: DebugProtocol.Request) { 424 | this.closeServer(); 425 | this.sendResponse(response); 426 | } 427 | 428 | private async sendBreakpointMessage(file: string) { 429 | const breakpoints: DebugProtocol.SourceBreakpoint[] = []; 430 | 431 | for (let bpList of this._breakpoints.values()) { 432 | for (let bp of bpList.filter(bp => bp.source === file)) { 433 | breakpoints.push({ 434 | line: bp.line, 435 | column: bp.column, 436 | }); 437 | } 438 | } 439 | const envelope = { 440 | type: 'breakpoints', 441 | breakpoints: { 442 | path: file, 443 | breakpoints: breakpoints.length ? breakpoints : undefined, 444 | }, 445 | }; 446 | this.sendThreadMessage(envelope); 447 | } 448 | 449 | protected async setBreakPointsRequest(response: DebugProtocol.SetBreakpointsResponse, args: DebugProtocol.SetBreakpointsArguments) { 450 | response.body = { 451 | breakpoints: [] 452 | }; 453 | 454 | this.logTrace(`setBreakPointsRequest: ${JSON.stringify(args)}`); 455 | 456 | if (!args.source.path) { 457 | this.sendResponse(response); 458 | return; 459 | } 460 | 461 | // before clobbering the map entry, note which files currently have mapped breakpoints. 462 | const dirtySources = new Set(); 463 | for (const existingBreakpoint of (this._breakpoints.get(args.source.path) || [])) { 464 | dirtySources.add(existingBreakpoint.source); 465 | } 466 | 467 | // map the new breakpoints for a file, and mapped files that get touched. 468 | const bps = args.breakpoints || []; 469 | const mappedBreakpoints: MappedPosition[] = []; 470 | for (let bp of bps) { 471 | const mappedPositions = await this.translateFileLocationToRemote({ 472 | source: args.source.path, 473 | column: bp.column || 0, 474 | line: bp.line, 475 | }); 476 | 477 | for (let mapped of mappedPositions) { 478 | dirtySources.add(mapped.source); 479 | mappedBreakpoints.push(mapped); 480 | } 481 | } 482 | 483 | // update the entry for this file 484 | if (args.breakpoints) { 485 | this._breakpoints.set(args.source.path, mappedBreakpoints); 486 | } 487 | else { 488 | this._breakpoints.delete(args.source.path); 489 | } 490 | 491 | for (let file of dirtySources) { 492 | await this.sendBreakpointMessage(file); 493 | } 494 | this.sendResponse(response); 495 | } 496 | 497 | protected setExceptionBreakPointsRequest(response: DebugProtocol.SetExceptionBreakpointsResponse, args: DebugProtocol.SetExceptionBreakpointsArguments, request?: DebugProtocol.Request) { 498 | this.sendResponse(response); 499 | 500 | this._stopOnException = args.filters.length > 0; 501 | 502 | this.sendThreadMessage({ 503 | type: 'stopOnException', 504 | stopOnException: this._stopOnException, 505 | }); 506 | } 507 | 508 | protected async threadsRequest(response: DebugProtocol.ThreadsResponse): Promise { 509 | if (this._threads.size === 0) { 510 | await new Promise((resolve, reject) => { 511 | this.once('quickjs-thread', () => { 512 | resolve(); 513 | }); 514 | }); 515 | } 516 | response.body = { 517 | threads: Array.from(this._threads.keys()).map(thread => new Thread(thread, `thread 0x${thread.toString(16)}`)) 518 | }; 519 | this.sendResponse(response); 520 | } 521 | 522 | protected async stackTraceRequest(response: DebugProtocol.StackTraceResponse, args: DebugProtocol.StackTraceArguments) { 523 | const thread = args.threadId; 524 | const body = await this.sendThreadRequest(args.threadId, response, args); 525 | 526 | const stackFrames: StackFrame[] = []; 527 | for (const { id, name, filename, line, column } of body) { 528 | let mappedId = id + thread; 529 | this._stackFrames.set(mappedId, thread); 530 | 531 | try { 532 | const mappedLocation = await this.translateRemoteLocationToLocal({ 533 | source: filename, 534 | line: line || 0, 535 | column: column || 0, 536 | }); 537 | if (!mappedLocation.source) 538 | throw new Error('map failed'); 539 | const source = new Source(basename(mappedLocation.source), this.convertClientPathToDebugger(mappedLocation.source)); 540 | stackFrames.push(new StackFrame(mappedId, name, source, mappedLocation.line, mappedLocation.column)); 541 | } 542 | catch (e) { 543 | stackFrames.push(new StackFrame(mappedId, name, filename, line, column)); 544 | } 545 | } 546 | 547 | const totalFrames = body.length; 548 | 549 | response.body = { 550 | stackFrames, 551 | totalFrames, 552 | }; 553 | this.sendResponse(response); 554 | } 555 | 556 | protected async scopesRequest(response: DebugProtocol.ScopesResponse, args: DebugProtocol.ScopesArguments) { 557 | const thread = this._stackFrames.get(args.frameId); 558 | if (!thread) { 559 | this.sendErrorResponse(response, 2030, 'scopesRequest: thread not found'); 560 | return; 561 | } 562 | args.frameId -= thread; 563 | const body = await this.sendThreadRequest(thread, response, args); 564 | const scopes = body.map(({ name, reference, expensive }) => { 565 | // todo: use counter mapping 566 | let mappedReference = reference + thread; 567 | this._variables.set(mappedReference, thread); 568 | return new Scope(name, mappedReference, expensive); 569 | }); 570 | 571 | response.body = { 572 | scopes, 573 | }; 574 | this.sendResponse(response); 575 | } 576 | 577 | protected async variablesRequest(response: DebugProtocol.VariablesResponse, args: DebugProtocol.VariablesArguments, request?: DebugProtocol.Request) { 578 | const thread = this._variables.get(args.variablesReference); 579 | if (!thread) { 580 | this.sendErrorResponse(response, 2030, 'scopesRequest: thread not found'); 581 | return; 582 | } 583 | 584 | args.variablesReference -= thread; 585 | const body = await this.sendThreadRequest(thread, response, args); 586 | const variables = body.map(({ name, value, type, variablesReference, indexedVariables }) => { 587 | // todo: use counter mapping 588 | variablesReference = variablesReference ? variablesReference + thread : 0; 589 | this._variables.set(variablesReference, thread); 590 | return { name, value, type, variablesReference, indexedVariables }; 591 | }); 592 | 593 | response.body = { 594 | variables, 595 | }; 596 | this.sendResponse(response); 597 | } 598 | 599 | private sendThreadMessage(envelope: any) { 600 | if (!this._connection) { 601 | this.logTrace(`debug connection not avaiable`); 602 | return; 603 | } 604 | 605 | this.logTrace(`sent: ${JSON.stringify(envelope)}`); 606 | 607 | let json = JSON.stringify(envelope); 608 | 609 | let jsonBuffer = Buffer.from(json); 610 | // length prefix is 8 hex followed by newline = 012345678\n 611 | // not efficient, but protocol is then human readable. 612 | // json = 1 line json + new line 613 | let messageLength = jsonBuffer.byteLength + 1; 614 | let length = '00000000' + messageLength.toString(16) + '\n'; 615 | length = length.substr(length.length - 9); 616 | let lengthBuffer = Buffer.from(length); 617 | let newline = Buffer.from('\n'); 618 | let buffer = Buffer.concat([lengthBuffer, jsonBuffer, newline]); 619 | this._connection.write(buffer); 620 | } 621 | 622 | private sendThreadRequest(thread: number, response: DebugProtocol.Response, args: any): Promise { 623 | return new Promise((resolve, reject) => { 624 | let request_seq = response.request_seq; 625 | // todo: don't actually need to cache this. can send across wire. 626 | this._requests.set(request_seq, { 627 | resolve, 628 | reject, 629 | }); 630 | 631 | let envelope = { 632 | type: 'request', 633 | request: { 634 | request_seq, 635 | command: response.command, 636 | args, 637 | } 638 | }; 639 | 640 | this.sendThreadMessage(envelope); 641 | }); 642 | } 643 | 644 | protected async continueRequest(response: DebugProtocol.ContinueResponse, args: DebugProtocol.ContinueArguments) { 645 | response.body = await this.sendThreadRequest(args.threadId, response, args); 646 | this.sendResponse(response); 647 | } 648 | 649 | protected async nextRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments) { 650 | response.body = await this.sendThreadRequest(args.threadId, response, args); 651 | this.sendResponse(response); 652 | } 653 | 654 | protected async stepInRequest(response: DebugProtocol.StepInResponse, args: DebugProtocol.StepInArguments, request?: DebugProtocol.Request) { 655 | response.body = await this.sendThreadRequest(args.threadId, response, args); 656 | this.sendResponse(response); 657 | } 658 | 659 | protected async stepOutRequest(response: DebugProtocol.StepOutResponse, args: DebugProtocol.StepOutArguments, request?: DebugProtocol.Request) { 660 | response.body = await this.sendThreadRequest(args.threadId, response, args); 661 | this.sendResponse(response); 662 | } 663 | 664 | protected async evaluateRequest(response: DebugProtocol.EvaluateResponse, args: DebugProtocol.EvaluateArguments) { 665 | if (!args.frameId) { 666 | this.sendErrorResponse(response, 2030, 'scopesRequest: frameId not specified'); 667 | return; 668 | } 669 | let thread = this._stackFrames.get(args.frameId); 670 | if (!thread) { 671 | this.sendErrorResponse(response, 2030, 'scopesRequest: thread not found'); 672 | return; 673 | } 674 | args.frameId -= thread; 675 | 676 | const body = await this.sendThreadRequest(thread, response, args); 677 | let variablesReference = body.variablesReference; 678 | variablesReference = variablesReference ? variablesReference + thread : 0; 679 | this._variables.set(variablesReference, thread); 680 | body.variablesReference = variablesReference; 681 | 682 | response.body = body; 683 | this.sendResponse(response); 684 | } 685 | 686 | protected async pauseRequest(response: DebugProtocol.PauseResponse, args: DebugProtocol.PauseArguments, request?: DebugProtocol.Request) { 687 | response.body = await this.sendThreadRequest(args.threadId, response, args); 688 | this.sendResponse(response); 689 | } 690 | 691 | protected async completionsRequest(response: DebugProtocol.CompletionsResponse, args: DebugProtocol.CompletionsArguments) { 692 | if (!args.frameId) { 693 | this.sendErrorResponse(response, 2030, 'completionsRequest: frameId not specified'); 694 | return; 695 | } 696 | let thread = this._stackFrames.get(args.frameId); 697 | if (!thread) { 698 | this.sendErrorResponse(response, 2030, 'completionsRequest: thread not found'); 699 | return; 700 | } 701 | args.frameId -= thread; 702 | 703 | let expression = args.text.substr(0, args.text.length - 1); 704 | if (!expression) { 705 | this.sendErrorResponse(response, 2032, "no completion available for empty string"); 706 | return; 707 | } 708 | 709 | const evaluateArgs: DebugProtocol.EvaluateArguments = { 710 | frameId: args.frameId, 711 | expression, 712 | }; 713 | response.command = 'evaluate'; 714 | 715 | let body = await this.sendThreadRequest(thread, response, evaluateArgs); 716 | if (!body.variablesReference) { 717 | this.sendErrorResponse(response, 2032, "no completion available for expression"); 718 | return; 719 | } 720 | 721 | if (body.indexedVariables !== undefined) { 722 | this.sendErrorResponse(response, 2032, "no completion available for arrays"); 723 | return; 724 | } 725 | 726 | const variableArgs: DebugProtocol.VariablesArguments = { 727 | variablesReference: body.variablesReference, 728 | }; 729 | response.command = 'variables'; 730 | body = await this.sendThreadRequest(thread, response, variableArgs); 731 | 732 | response.command = 'completions'; 733 | response.body = { 734 | targets: body.map(property => ({ 735 | label: property.name, 736 | type: 'field', 737 | })) 738 | }; 739 | 740 | this.sendResponse(response); 741 | } 742 | } 743 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.5.5" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" 8 | integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/highlight@^7.0.0": 13 | version "7.5.0" 14 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" 15 | integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== 16 | dependencies: 17 | chalk "^2.0.0" 18 | esutils "^2.0.2" 19 | js-tokens "^4.0.0" 20 | 21 | "@types/mocha@5.2.7": 22 | version "5.2.7" 23 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" 24 | integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== 25 | 26 | "@types/node@*": 27 | version "10.12.10" 28 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.10.tgz#4fa76e6598b7de3f0cb6ec3abacc4f59e5b3a2ce" 29 | integrity sha512-8xZEYckCbUVgK8Eg7lf5Iy4COKJ5uXlnIOnePN0WUwSQggy9tolM+tDJf7wMOnT/JT/W9xDYIaYggt3mRV2O5w== 30 | 31 | "@types/node@10.12.12": 32 | version "10.12.12" 33 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.12.tgz#e15a9d034d9210f00320ef718a50c4a799417c47" 34 | integrity sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A== 35 | 36 | agent-base@4, agent-base@^4.3.0: 37 | version "4.3.0" 38 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" 39 | integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== 40 | dependencies: 41 | es6-promisify "^5.0.0" 42 | 43 | ajv@^6.5.5: 44 | version "6.5.5" 45 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1" 46 | integrity sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg== 47 | dependencies: 48 | fast-deep-equal "^2.0.1" 49 | fast-json-stable-stringify "^2.0.0" 50 | json-schema-traverse "^0.4.1" 51 | uri-js "^4.2.2" 52 | 53 | ansi-colors@3.2.3: 54 | version "3.2.3" 55 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" 56 | integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== 57 | 58 | ansi-regex@^2.0.0: 59 | version "2.1.1" 60 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 61 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 62 | 63 | ansi-regex@^3.0.0: 64 | version "3.0.0" 65 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 66 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 67 | 68 | ansi-regex@^4.1.0: 69 | version "4.1.0" 70 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 71 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 72 | 73 | ansi-styles@^3.2.1: 74 | version "3.2.1" 75 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 76 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 77 | dependencies: 78 | color-convert "^1.9.0" 79 | 80 | argparse@^1.0.7: 81 | version "1.0.10" 82 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 83 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 84 | dependencies: 85 | sprintf-js "~1.0.2" 86 | 87 | asn1@~0.2.3: 88 | version "0.2.4" 89 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 90 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 91 | dependencies: 92 | safer-buffer "~2.1.0" 93 | 94 | assert-plus@1.0.0, assert-plus@^1.0.0: 95 | version "1.0.0" 96 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 97 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 98 | 99 | asynckit@^0.4.0: 100 | version "0.4.0" 101 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 102 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 103 | 104 | await-notify@1.0.1: 105 | version "1.0.1" 106 | resolved "https://registry.yarnpkg.com/await-notify/-/await-notify-1.0.1.tgz#0b48133b22e524181e11557665185f2a2f3ce47c" 107 | integrity sha1-C0gTOyLlJBgeEVV2ZRhfKi885Hw= 108 | 109 | aws-sign2@~0.7.0: 110 | version "0.7.0" 111 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 112 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 113 | 114 | aws4@^1.8.0: 115 | version "1.8.0" 116 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 117 | integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== 118 | 119 | azure-devops-node-api@^7.2.0: 120 | version "7.2.0" 121 | resolved "https://registry.yarnpkg.com/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz#131d4e01cf12ebc6e45569b5e0c5c249e4114d6d" 122 | integrity sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w== 123 | dependencies: 124 | os "0.1.1" 125 | tunnel "0.0.4" 126 | typed-rest-client "1.2.0" 127 | underscore "1.8.3" 128 | 129 | balanced-match@^1.0.0: 130 | version "1.0.0" 131 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 132 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 133 | 134 | bcrypt-pbkdf@^1.0.0: 135 | version "1.0.2" 136 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 137 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 138 | dependencies: 139 | tweetnacl "^0.14.3" 140 | 141 | boolbase@~1.0.0: 142 | version "1.0.0" 143 | resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 144 | integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= 145 | 146 | brace-expansion@^1.1.7: 147 | version "1.1.11" 148 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 149 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 150 | dependencies: 151 | balanced-match "^1.0.0" 152 | concat-map "0.0.1" 153 | 154 | browser-stdout@1.3.1: 155 | version "1.3.1" 156 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 157 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 158 | 159 | buffer-crc32@~0.2.3: 160 | version "0.2.13" 161 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 162 | integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 163 | 164 | buffer-from@^1.0.0: 165 | version "1.1.1" 166 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 167 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 168 | 169 | builtin-modules@^1.1.1: 170 | version "1.1.1" 171 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 172 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 173 | 174 | camelcase@^5.0.0: 175 | version "5.3.1" 176 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 177 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 178 | 179 | caseless@~0.12.0: 180 | version "0.12.0" 181 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 182 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 183 | 184 | chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: 185 | version "2.4.2" 186 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 187 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 188 | dependencies: 189 | ansi-styles "^3.2.1" 190 | escape-string-regexp "^1.0.5" 191 | supports-color "^5.3.0" 192 | 193 | chalk@^2.3.0: 194 | version "2.4.1" 195 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 196 | integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== 197 | dependencies: 198 | ansi-styles "^3.2.1" 199 | escape-string-regexp "^1.0.5" 200 | supports-color "^5.3.0" 201 | 202 | cheerio@^1.0.0-rc.1: 203 | version "1.0.0-rc.2" 204 | resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" 205 | integrity sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs= 206 | dependencies: 207 | css-select "~1.2.0" 208 | dom-serializer "~0.1.0" 209 | entities "~1.1.1" 210 | htmlparser2 "^3.9.1" 211 | lodash "^4.15.0" 212 | parse5 "^3.0.1" 213 | 214 | cliui@^4.0.0: 215 | version "4.1.0" 216 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" 217 | integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== 218 | dependencies: 219 | string-width "^2.1.1" 220 | strip-ansi "^4.0.0" 221 | wrap-ansi "^2.0.0" 222 | 223 | code-point-at@^1.0.0: 224 | version "1.1.0" 225 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 226 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 227 | 228 | color-convert@^1.9.0: 229 | version "1.9.3" 230 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 231 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 232 | dependencies: 233 | color-name "1.1.3" 234 | 235 | color-name@1.1.3: 236 | version "1.1.3" 237 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 238 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 239 | 240 | combined-stream@^1.0.6, combined-stream@~1.0.6: 241 | version "1.0.7" 242 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" 243 | integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== 244 | dependencies: 245 | delayed-stream "~1.0.0" 246 | 247 | commander@2.15.1: 248 | version "2.15.1" 249 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" 250 | integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== 251 | 252 | commander@^2.12.1, commander@^2.8.1: 253 | version "2.19.0" 254 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" 255 | integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== 256 | 257 | concat-map@0.0.1: 258 | version "0.0.1" 259 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 260 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 261 | 262 | core-util-is@1.0.2: 263 | version "1.0.2" 264 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 265 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 266 | 267 | cross-spawn@^6.0.0: 268 | version "6.0.5" 269 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 270 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 271 | dependencies: 272 | nice-try "^1.0.4" 273 | path-key "^2.0.1" 274 | semver "^5.5.0" 275 | shebang-command "^1.2.0" 276 | which "^1.2.9" 277 | 278 | css-select@~1.2.0: 279 | version "1.2.0" 280 | resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" 281 | integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= 282 | dependencies: 283 | boolbase "~1.0.0" 284 | css-what "2.1" 285 | domutils "1.5.1" 286 | nth-check "~1.0.1" 287 | 288 | css-what@2.1: 289 | version "2.1.2" 290 | resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" 291 | integrity sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ== 292 | 293 | dashdash@^1.12.0: 294 | version "1.14.1" 295 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 296 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 297 | dependencies: 298 | assert-plus "^1.0.0" 299 | 300 | debug@3.1.0: 301 | version "3.1.0" 302 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 303 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 304 | dependencies: 305 | ms "2.0.0" 306 | 307 | debug@3.2.6, debug@^3.1.0: 308 | version "3.2.6" 309 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 310 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 311 | dependencies: 312 | ms "^2.1.1" 313 | 314 | decamelize@^1.2.0: 315 | version "1.2.0" 316 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 317 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 318 | 319 | define-properties@^1.1.2: 320 | version "1.1.3" 321 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 322 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 323 | dependencies: 324 | object-keys "^1.0.12" 325 | 326 | delayed-stream@~1.0.0: 327 | version "1.0.0" 328 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 329 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 330 | 331 | denodeify@^1.2.1: 332 | version "1.2.1" 333 | resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" 334 | integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE= 335 | 336 | didyoumean@^1.2.1: 337 | version "1.2.1" 338 | resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.1.tgz#e92edfdada6537d484d73c0172fd1eba0c4976ff" 339 | integrity sha1-6S7f2tplN9SE1zwBcv0eugxJdv8= 340 | 341 | diff@3.5.0, diff@^3.2.0: 342 | version "3.5.0" 343 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 344 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 345 | 346 | dom-serializer@0, dom-serializer@~0.1.0: 347 | version "0.1.0" 348 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" 349 | integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= 350 | dependencies: 351 | domelementtype "~1.1.1" 352 | entities "~1.1.1" 353 | 354 | domelementtype@1: 355 | version "1.2.1" 356 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.2.1.tgz#578558ef23befac043a1abb0db07635509393479" 357 | integrity sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA== 358 | 359 | domelementtype@^1.3.0: 360 | version "1.3.0" 361 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" 362 | integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI= 363 | 364 | domelementtype@~1.1.1: 365 | version "1.1.3" 366 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" 367 | integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= 368 | 369 | domhandler@^2.3.0: 370 | version "2.4.2" 371 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" 372 | integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== 373 | dependencies: 374 | domelementtype "1" 375 | 376 | domutils@1.5.1: 377 | version "1.5.1" 378 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" 379 | integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= 380 | dependencies: 381 | dom-serializer "0" 382 | domelementtype "1" 383 | 384 | domutils@^1.5.1: 385 | version "1.7.0" 386 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" 387 | integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== 388 | dependencies: 389 | dom-serializer "0" 390 | domelementtype "1" 391 | 392 | ecc-jsbn@~0.1.1: 393 | version "0.1.2" 394 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 395 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 396 | dependencies: 397 | jsbn "~0.1.0" 398 | safer-buffer "^2.1.0" 399 | 400 | emoji-regex@^7.0.1: 401 | version "7.0.3" 402 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 403 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 404 | 405 | end-of-stream@^1.1.0: 406 | version "1.4.1" 407 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 408 | integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== 409 | dependencies: 410 | once "^1.4.0" 411 | 412 | entities@^1.1.1, entities@~1.1.1: 413 | version "1.1.2" 414 | resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" 415 | integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== 416 | 417 | es-abstract@^1.5.1: 418 | version "1.13.0" 419 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" 420 | integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== 421 | dependencies: 422 | es-to-primitive "^1.2.0" 423 | function-bind "^1.1.1" 424 | has "^1.0.3" 425 | is-callable "^1.1.4" 426 | is-regex "^1.0.4" 427 | object-keys "^1.0.12" 428 | 429 | es-to-primitive@^1.2.0: 430 | version "1.2.0" 431 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" 432 | integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== 433 | dependencies: 434 | is-callable "^1.1.4" 435 | is-date-object "^1.0.1" 436 | is-symbol "^1.0.2" 437 | 438 | es6-promise@^4.0.3: 439 | version "4.2.8" 440 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" 441 | integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== 442 | 443 | es6-promisify@^5.0.0: 444 | version "5.0.0" 445 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 446 | integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= 447 | dependencies: 448 | es6-promise "^4.0.3" 449 | 450 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 451 | version "1.0.5" 452 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 453 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 454 | 455 | esprima@^4.0.0: 456 | version "4.0.1" 457 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 458 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 459 | 460 | esutils@^2.0.2: 461 | version "2.0.2" 462 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 463 | integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 464 | 465 | execa@^1.0.0: 466 | version "1.0.0" 467 | resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" 468 | integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== 469 | dependencies: 470 | cross-spawn "^6.0.0" 471 | get-stream "^4.0.0" 472 | is-stream "^1.1.0" 473 | npm-run-path "^2.0.0" 474 | p-finally "^1.0.0" 475 | signal-exit "^3.0.0" 476 | strip-eof "^1.0.0" 477 | 478 | extend@~3.0.2: 479 | version "3.0.2" 480 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 481 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 482 | 483 | extsprintf@1.3.0: 484 | version "1.3.0" 485 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 486 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 487 | 488 | extsprintf@^1.2.0: 489 | version "1.4.0" 490 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 491 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 492 | 493 | fast-deep-equal@^2.0.1: 494 | version "2.0.1" 495 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 496 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 497 | 498 | fast-json-stable-stringify@^2.0.0: 499 | version "2.0.0" 500 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 501 | integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 502 | 503 | fd-slicer@~1.1.0: 504 | version "1.1.0" 505 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" 506 | integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= 507 | dependencies: 508 | pend "~1.2.0" 509 | 510 | find-up@3.0.0, find-up@^3.0.0: 511 | version "3.0.0" 512 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 513 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 514 | dependencies: 515 | locate-path "^3.0.0" 516 | 517 | flat@^4.1.0: 518 | version "4.1.0" 519 | resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 520 | integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== 521 | dependencies: 522 | is-buffer "~2.0.3" 523 | 524 | forever-agent@~0.6.1: 525 | version "0.6.1" 526 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 527 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 528 | 529 | form-data@~2.3.2: 530 | version "2.3.3" 531 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 532 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 533 | dependencies: 534 | asynckit "^0.4.0" 535 | combined-stream "^1.0.6" 536 | mime-types "^2.1.12" 537 | 538 | fs.realpath@^1.0.0: 539 | version "1.0.0" 540 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 541 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 542 | 543 | function-bind@^1.1.1: 544 | version "1.1.1" 545 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 546 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 547 | 548 | get-caller-file@^1.0.1: 549 | version "1.0.3" 550 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" 551 | integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== 552 | 553 | get-caller-file@^2.0.1: 554 | version "2.0.5" 555 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 556 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 557 | 558 | get-stream@^4.0.0: 559 | version "4.1.0" 560 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 561 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 562 | dependencies: 563 | pump "^3.0.0" 564 | 565 | getpass@^0.1.1: 566 | version "0.1.7" 567 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 568 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 569 | dependencies: 570 | assert-plus "^1.0.0" 571 | 572 | glob@7.1.2: 573 | version "7.1.2" 574 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 575 | integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== 576 | dependencies: 577 | fs.realpath "^1.0.0" 578 | inflight "^1.0.4" 579 | inherits "2" 580 | minimatch "^3.0.4" 581 | once "^1.3.0" 582 | path-is-absolute "^1.0.0" 583 | 584 | glob@7.1.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2: 585 | version "7.1.3" 586 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 587 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 588 | dependencies: 589 | fs.realpath "^1.0.0" 590 | inflight "^1.0.4" 591 | inherits "2" 592 | minimatch "^3.0.4" 593 | once "^1.3.0" 594 | path-is-absolute "^1.0.0" 595 | 596 | growl@1.10.5: 597 | version "1.10.5" 598 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 599 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 600 | 601 | har-schema@^2.0.0: 602 | version "2.0.0" 603 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 604 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 605 | 606 | har-validator@~5.1.0: 607 | version "5.1.3" 608 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 609 | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 610 | dependencies: 611 | ajv "^6.5.5" 612 | har-schema "^2.0.0" 613 | 614 | has-flag@^3.0.0: 615 | version "3.0.0" 616 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 617 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 618 | 619 | has-symbols@^1.0.0: 620 | version "1.0.0" 621 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 622 | integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= 623 | 624 | has@^1.0.1, has@^1.0.3: 625 | version "1.0.3" 626 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 627 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 628 | dependencies: 629 | function-bind "^1.1.1" 630 | 631 | he@1.1.1: 632 | version "1.1.1" 633 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 634 | integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= 635 | 636 | he@1.2.0: 637 | version "1.2.0" 638 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 639 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 640 | 641 | htmlparser2@^3.9.1: 642 | version "3.10.0" 643 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464" 644 | integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ== 645 | dependencies: 646 | domelementtype "^1.3.0" 647 | domhandler "^2.3.0" 648 | domutils "^1.5.1" 649 | entities "^1.1.1" 650 | inherits "^2.0.1" 651 | readable-stream "^3.0.6" 652 | 653 | http-proxy-agent@^2.1.0: 654 | version "2.1.0" 655 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" 656 | integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== 657 | dependencies: 658 | agent-base "4" 659 | debug "3.1.0" 660 | 661 | http-signature@~1.2.0: 662 | version "1.2.0" 663 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 664 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 665 | dependencies: 666 | assert-plus "^1.0.0" 667 | jsprim "^1.2.2" 668 | sshpk "^1.7.0" 669 | 670 | https-proxy-agent@^2.2.1: 671 | version "2.2.2" 672 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz#271ea8e90f836ac9f119daccd39c19ff7dfb0793" 673 | integrity sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg== 674 | dependencies: 675 | agent-base "^4.3.0" 676 | debug "^3.1.0" 677 | 678 | inflight@^1.0.4: 679 | version "1.0.6" 680 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 681 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 682 | dependencies: 683 | once "^1.3.0" 684 | wrappy "1" 685 | 686 | inherits@2, inherits@^2.0.1, inherits@^2.0.3: 687 | version "2.0.3" 688 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 689 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 690 | 691 | invert-kv@^2.0.0: 692 | version "2.0.0" 693 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" 694 | integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== 695 | 696 | is-buffer@~2.0.3: 697 | version "2.0.3" 698 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" 699 | integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== 700 | 701 | is-callable@^1.1.4: 702 | version "1.1.4" 703 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 704 | integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== 705 | 706 | is-date-object@^1.0.1: 707 | version "1.0.1" 708 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 709 | integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= 710 | 711 | is-fullwidth-code-point@^1.0.0: 712 | version "1.0.0" 713 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 714 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 715 | dependencies: 716 | number-is-nan "^1.0.0" 717 | 718 | is-fullwidth-code-point@^2.0.0: 719 | version "2.0.0" 720 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 721 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 722 | 723 | is-regex@^1.0.4: 724 | version "1.0.4" 725 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 726 | integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= 727 | dependencies: 728 | has "^1.0.1" 729 | 730 | is-stream@^1.1.0: 731 | version "1.1.0" 732 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 733 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 734 | 735 | is-symbol@^1.0.2: 736 | version "1.0.2" 737 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" 738 | integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== 739 | dependencies: 740 | has-symbols "^1.0.0" 741 | 742 | is-typedarray@~1.0.0: 743 | version "1.0.0" 744 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 745 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 746 | 747 | isexe@^2.0.0: 748 | version "2.0.0" 749 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 750 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 751 | 752 | isstream@~0.1.2: 753 | version "0.1.2" 754 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 755 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 756 | 757 | js-tokens@^4.0.0: 758 | version "4.0.0" 759 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 760 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 761 | 762 | js-yaml@3.13.1, js-yaml@^3.13.1: 763 | version "3.13.1" 764 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 765 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 766 | dependencies: 767 | argparse "^1.0.7" 768 | esprima "^4.0.0" 769 | 770 | jsbn@~0.1.0: 771 | version "0.1.1" 772 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 773 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 774 | 775 | json-schema-traverse@^0.4.1: 776 | version "0.4.1" 777 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 778 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 779 | 780 | json-schema@0.2.3: 781 | version "0.2.3" 782 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 783 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 784 | 785 | json-stringify-safe@~5.0.1: 786 | version "5.0.1" 787 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 788 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 789 | 790 | jsprim@^1.2.2: 791 | version "1.4.1" 792 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 793 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 794 | dependencies: 795 | assert-plus "1.0.0" 796 | extsprintf "1.3.0" 797 | json-schema "0.2.3" 798 | verror "1.10.0" 799 | 800 | lcid@^2.0.0: 801 | version "2.0.0" 802 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" 803 | integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== 804 | dependencies: 805 | invert-kv "^2.0.0" 806 | 807 | linkify-it@^2.0.0: 808 | version "2.0.3" 809 | resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" 810 | integrity sha1-2UpGSPmxwXnWT6lykSaL22zpQ08= 811 | dependencies: 812 | uc.micro "^1.0.1" 813 | 814 | locate-path@^3.0.0: 815 | version "3.0.0" 816 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 817 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 818 | dependencies: 819 | p-locate "^3.0.0" 820 | path-exists "^3.0.0" 821 | 822 | lodash@^4.15.0, lodash@^4.17.10: 823 | version "4.17.11" 824 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 825 | integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== 826 | 827 | lodash@^4.17.11: 828 | version "4.17.15" 829 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 830 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 831 | 832 | log-symbols@2.2.0: 833 | version "2.2.0" 834 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" 835 | integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== 836 | dependencies: 837 | chalk "^2.0.1" 838 | 839 | map-age-cleaner@^0.1.1: 840 | version "0.1.3" 841 | resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" 842 | integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== 843 | dependencies: 844 | p-defer "^1.0.0" 845 | 846 | markdown-it@^8.3.1: 847 | version "8.4.2" 848 | resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" 849 | integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== 850 | dependencies: 851 | argparse "^1.0.7" 852 | entities "~1.1.1" 853 | linkify-it "^2.0.0" 854 | mdurl "^1.0.1" 855 | uc.micro "^1.0.5" 856 | 857 | mdurl@^1.0.1: 858 | version "1.0.1" 859 | resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" 860 | integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= 861 | 862 | mem@^4.0.0: 863 | version "4.3.0" 864 | resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" 865 | integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== 866 | dependencies: 867 | map-age-cleaner "^0.1.1" 868 | mimic-fn "^2.0.0" 869 | p-is-promise "^2.0.0" 870 | 871 | mime-db@~1.37.0: 872 | version "1.37.0" 873 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" 874 | integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== 875 | 876 | mime-types@^2.1.12, mime-types@~2.1.19: 877 | version "2.1.21" 878 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" 879 | integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== 880 | dependencies: 881 | mime-db "~1.37.0" 882 | 883 | mime@^1.3.4: 884 | version "1.6.0" 885 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 886 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 887 | 888 | mimic-fn@^2.0.0: 889 | version "2.1.0" 890 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 891 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 892 | 893 | minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: 894 | version "3.0.4" 895 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 896 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 897 | dependencies: 898 | brace-expansion "^1.1.7" 899 | 900 | minimist@0.0.8: 901 | version "0.0.8" 902 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 903 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 904 | 905 | mkdirp@0.5.1, mkdirp@^0.5.1: 906 | version "0.5.1" 907 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 908 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 909 | dependencies: 910 | minimist "0.0.8" 911 | 912 | mocha@6.2.0: 913 | version "6.2.0" 914 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.0.tgz#f896b642843445d1bb8bca60eabd9206b8916e56" 915 | integrity sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ== 916 | dependencies: 917 | ansi-colors "3.2.3" 918 | browser-stdout "1.3.1" 919 | debug "3.2.6" 920 | diff "3.5.0" 921 | escape-string-regexp "1.0.5" 922 | find-up "3.0.0" 923 | glob "7.1.3" 924 | growl "1.10.5" 925 | he "1.2.0" 926 | js-yaml "3.13.1" 927 | log-symbols "2.2.0" 928 | minimatch "3.0.4" 929 | mkdirp "0.5.1" 930 | ms "2.1.1" 931 | node-environment-flags "1.0.5" 932 | object.assign "4.1.0" 933 | strip-json-comments "2.0.1" 934 | supports-color "6.0.0" 935 | which "1.3.1" 936 | wide-align "1.1.3" 937 | yargs "13.2.2" 938 | yargs-parser "13.0.0" 939 | yargs-unparser "1.5.0" 940 | 941 | mocha@^5.2.0: 942 | version "5.2.0" 943 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" 944 | integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== 945 | dependencies: 946 | browser-stdout "1.3.1" 947 | commander "2.15.1" 948 | debug "3.1.0" 949 | diff "3.5.0" 950 | escape-string-regexp "1.0.5" 951 | glob "7.1.2" 952 | growl "1.10.5" 953 | he "1.1.1" 954 | minimatch "3.0.4" 955 | mkdirp "0.5.1" 956 | supports-color "5.4.0" 957 | 958 | ms@2.0.0: 959 | version "2.0.0" 960 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 961 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 962 | 963 | ms@2.1.1: 964 | version "2.1.1" 965 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 966 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 967 | 968 | ms@^2.1.1: 969 | version "2.1.2" 970 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 971 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 972 | 973 | mute-stream@~0.0.4: 974 | version "0.0.7" 975 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 976 | integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= 977 | 978 | nice-try@^1.0.4: 979 | version "1.0.5" 980 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 981 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 982 | 983 | node-environment-flags@1.0.5: 984 | version "1.0.5" 985 | resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" 986 | integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== 987 | dependencies: 988 | object.getownpropertydescriptors "^2.0.3" 989 | semver "^5.7.0" 990 | 991 | npm-run-path@^2.0.0: 992 | version "2.0.2" 993 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 994 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 995 | dependencies: 996 | path-key "^2.0.0" 997 | 998 | nth-check@~1.0.1: 999 | version "1.0.2" 1000 | resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" 1001 | integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== 1002 | dependencies: 1003 | boolbase "~1.0.0" 1004 | 1005 | number-is-nan@^1.0.0: 1006 | version "1.0.1" 1007 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1008 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1009 | 1010 | oauth-sign@~0.9.0: 1011 | version "0.9.0" 1012 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 1013 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 1014 | 1015 | object-keys@^1.0.11, object-keys@^1.0.12: 1016 | version "1.0.12" 1017 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" 1018 | integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== 1019 | 1020 | object.assign@4.1.0: 1021 | version "4.1.0" 1022 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1023 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1024 | dependencies: 1025 | define-properties "^1.1.2" 1026 | function-bind "^1.1.1" 1027 | has-symbols "^1.0.0" 1028 | object-keys "^1.0.11" 1029 | 1030 | object.getownpropertydescriptors@^2.0.3: 1031 | version "2.0.3" 1032 | resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" 1033 | integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= 1034 | dependencies: 1035 | define-properties "^1.1.2" 1036 | es-abstract "^1.5.1" 1037 | 1038 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1039 | version "1.4.0" 1040 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1041 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1042 | dependencies: 1043 | wrappy "1" 1044 | 1045 | os-homedir@^1.0.0: 1046 | version "1.0.2" 1047 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1048 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1049 | 1050 | os-locale@^3.0.0, os-locale@^3.1.0: 1051 | version "3.1.0" 1052 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" 1053 | integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== 1054 | dependencies: 1055 | execa "^1.0.0" 1056 | lcid "^2.0.0" 1057 | mem "^4.0.0" 1058 | 1059 | os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: 1060 | version "1.0.2" 1061 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1062 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1063 | 1064 | os@0.1.1: 1065 | version "0.1.1" 1066 | resolved "https://registry.yarnpkg.com/os/-/os-0.1.1.tgz#208845e89e193ad4d971474b93947736a56d13f3" 1067 | integrity sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M= 1068 | 1069 | osenv@^0.1.3: 1070 | version "0.1.5" 1071 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1072 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 1073 | dependencies: 1074 | os-homedir "^1.0.0" 1075 | os-tmpdir "^1.0.0" 1076 | 1077 | p-defer@^1.0.0: 1078 | version "1.0.0" 1079 | resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" 1080 | integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= 1081 | 1082 | p-finally@^1.0.0: 1083 | version "1.0.0" 1084 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1085 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 1086 | 1087 | p-is-promise@^2.0.0: 1088 | version "2.1.0" 1089 | resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" 1090 | integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== 1091 | 1092 | p-limit@^2.0.0: 1093 | version "2.2.0" 1094 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" 1095 | integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== 1096 | dependencies: 1097 | p-try "^2.0.0" 1098 | 1099 | p-locate@^3.0.0: 1100 | version "3.0.0" 1101 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1102 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1103 | dependencies: 1104 | p-limit "^2.0.0" 1105 | 1106 | p-try@^2.0.0: 1107 | version "2.2.0" 1108 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1109 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1110 | 1111 | parse-semver@^1.1.1: 1112 | version "1.1.1" 1113 | resolved "https://registry.yarnpkg.com/parse-semver/-/parse-semver-1.1.1.tgz#9a4afd6df063dc4826f93fba4a99cf223f666cb8" 1114 | integrity sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg= 1115 | dependencies: 1116 | semver "^5.1.0" 1117 | 1118 | parse5@^3.0.1: 1119 | version "3.0.3" 1120 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" 1121 | integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== 1122 | dependencies: 1123 | "@types/node" "*" 1124 | 1125 | path-exists@^3.0.0: 1126 | version "3.0.0" 1127 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1128 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1129 | 1130 | path-is-absolute@^1.0.0: 1131 | version "1.0.1" 1132 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1133 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1134 | 1135 | path-key@^2.0.0, path-key@^2.0.1: 1136 | version "2.0.1" 1137 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1138 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1139 | 1140 | path-parse@^1.0.5: 1141 | version "1.0.6" 1142 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1143 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1144 | 1145 | pend@~1.2.0: 1146 | version "1.2.0" 1147 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 1148 | integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= 1149 | 1150 | performance-now@^2.1.0: 1151 | version "2.1.0" 1152 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1153 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 1154 | 1155 | psl@^1.1.24: 1156 | version "1.1.29" 1157 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" 1158 | integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== 1159 | 1160 | pump@^3.0.0: 1161 | version "3.0.0" 1162 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1163 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1164 | dependencies: 1165 | end-of-stream "^1.1.0" 1166 | once "^1.3.1" 1167 | 1168 | punycode@^1.4.1: 1169 | version "1.4.1" 1170 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1171 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 1172 | 1173 | punycode@^2.1.0: 1174 | version "2.1.1" 1175 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1176 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1177 | 1178 | qs@~6.5.2: 1179 | version "6.5.2" 1180 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1181 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 1182 | 1183 | querystringify@^2.1.1: 1184 | version "2.1.1" 1185 | resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" 1186 | integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== 1187 | 1188 | read@^1.0.7: 1189 | version "1.0.7" 1190 | resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" 1191 | integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= 1192 | dependencies: 1193 | mute-stream "~0.0.4" 1194 | 1195 | readable-stream@^3.0.6: 1196 | version "3.0.6" 1197 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.6.tgz#351302e4c68b5abd6a2ed55376a7f9a25be3057a" 1198 | integrity sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg== 1199 | dependencies: 1200 | inherits "^2.0.3" 1201 | string_decoder "^1.1.1" 1202 | util-deprecate "^1.0.1" 1203 | 1204 | request@^2.88.0: 1205 | version "2.88.0" 1206 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 1207 | integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== 1208 | dependencies: 1209 | aws-sign2 "~0.7.0" 1210 | aws4 "^1.8.0" 1211 | caseless "~0.12.0" 1212 | combined-stream "~1.0.6" 1213 | extend "~3.0.2" 1214 | forever-agent "~0.6.1" 1215 | form-data "~2.3.2" 1216 | har-validator "~5.1.0" 1217 | http-signature "~1.2.0" 1218 | is-typedarray "~1.0.0" 1219 | isstream "~0.1.2" 1220 | json-stringify-safe "~5.0.1" 1221 | mime-types "~2.1.19" 1222 | oauth-sign "~0.9.0" 1223 | performance-now "^2.1.0" 1224 | qs "~6.5.2" 1225 | safe-buffer "^5.1.2" 1226 | tough-cookie "~2.4.3" 1227 | tunnel-agent "^0.6.0" 1228 | uuid "^3.3.2" 1229 | 1230 | require-directory@^2.1.1: 1231 | version "2.1.1" 1232 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1233 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1234 | 1235 | require-main-filename@^1.0.1: 1236 | version "1.0.1" 1237 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1238 | integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= 1239 | 1240 | require-main-filename@^2.0.0: 1241 | version "2.0.0" 1242 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1243 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1244 | 1245 | requires-port@^1.0.0: 1246 | version "1.0.0" 1247 | resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" 1248 | integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= 1249 | 1250 | resolve@^1.3.2: 1251 | version "1.8.1" 1252 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 1253 | integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== 1254 | dependencies: 1255 | path-parse "^1.0.5" 1256 | 1257 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0: 1258 | version "5.1.2" 1259 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1260 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1261 | 1262 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1263 | version "2.1.2" 1264 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1265 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1266 | 1267 | semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: 1268 | version "5.6.0" 1269 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 1270 | integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== 1271 | 1272 | semver@^5.5.0, semver@^5.7.0: 1273 | version "5.7.0" 1274 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 1275 | integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 1276 | 1277 | set-blocking@^2.0.0: 1278 | version "2.0.0" 1279 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1280 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1281 | 1282 | shebang-command@^1.2.0: 1283 | version "1.2.0" 1284 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1285 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1286 | dependencies: 1287 | shebang-regex "^1.0.0" 1288 | 1289 | shebang-regex@^1.0.0: 1290 | version "1.0.0" 1291 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1292 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1293 | 1294 | signal-exit@^3.0.0: 1295 | version "3.0.2" 1296 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1297 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1298 | 1299 | source-map-support@^0.5.0: 1300 | version "0.5.9" 1301 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" 1302 | integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== 1303 | dependencies: 1304 | buffer-from "^1.0.0" 1305 | source-map "^0.6.0" 1306 | 1307 | source-map@^0.6.0: 1308 | version "0.6.1" 1309 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1310 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1311 | 1312 | sprintf-js@~1.0.2: 1313 | version "1.0.3" 1314 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1315 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1316 | 1317 | sshpk@^1.7.0: 1318 | version "1.15.2" 1319 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" 1320 | integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA== 1321 | dependencies: 1322 | asn1 "~0.2.3" 1323 | assert-plus "^1.0.0" 1324 | bcrypt-pbkdf "^1.0.0" 1325 | dashdash "^1.12.0" 1326 | ecc-jsbn "~0.1.1" 1327 | getpass "^0.1.1" 1328 | jsbn "~0.1.0" 1329 | safer-buffer "^2.0.2" 1330 | tweetnacl "~0.14.0" 1331 | 1332 | string-width@^1.0.1: 1333 | version "1.0.2" 1334 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1335 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 1336 | dependencies: 1337 | code-point-at "^1.0.0" 1338 | is-fullwidth-code-point "^1.0.0" 1339 | strip-ansi "^3.0.0" 1340 | 1341 | "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: 1342 | version "2.1.1" 1343 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1344 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1345 | dependencies: 1346 | is-fullwidth-code-point "^2.0.0" 1347 | strip-ansi "^4.0.0" 1348 | 1349 | string-width@^3.0.0: 1350 | version "3.1.0" 1351 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1352 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1353 | dependencies: 1354 | emoji-regex "^7.0.1" 1355 | is-fullwidth-code-point "^2.0.0" 1356 | strip-ansi "^5.1.0" 1357 | 1358 | string_decoder@^1.1.1: 1359 | version "1.1.1" 1360 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1361 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1362 | dependencies: 1363 | safe-buffer "~5.1.0" 1364 | 1365 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1366 | version "3.0.1" 1367 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1368 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 1369 | dependencies: 1370 | ansi-regex "^2.0.0" 1371 | 1372 | strip-ansi@^4.0.0: 1373 | version "4.0.0" 1374 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1375 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1376 | dependencies: 1377 | ansi-regex "^3.0.0" 1378 | 1379 | strip-ansi@^5.1.0: 1380 | version "5.2.0" 1381 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1382 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1383 | dependencies: 1384 | ansi-regex "^4.1.0" 1385 | 1386 | strip-eof@^1.0.0: 1387 | version "1.0.0" 1388 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1389 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 1390 | 1391 | strip-json-comments@2.0.1: 1392 | version "2.0.1" 1393 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1394 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1395 | 1396 | supports-color@5.4.0: 1397 | version "5.4.0" 1398 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 1399 | integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== 1400 | dependencies: 1401 | has-flag "^3.0.0" 1402 | 1403 | supports-color@6.0.0: 1404 | version "6.0.0" 1405 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" 1406 | integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== 1407 | dependencies: 1408 | has-flag "^3.0.0" 1409 | 1410 | supports-color@^5.3.0: 1411 | version "5.5.0" 1412 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1413 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1414 | dependencies: 1415 | has-flag "^3.0.0" 1416 | 1417 | tmp@0.0.29: 1418 | version "0.0.29" 1419 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" 1420 | integrity sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA= 1421 | dependencies: 1422 | os-tmpdir "~1.0.1" 1423 | 1424 | tough-cookie@~2.4.3: 1425 | version "2.4.3" 1426 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 1427 | integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== 1428 | dependencies: 1429 | psl "^1.1.24" 1430 | punycode "^1.4.1" 1431 | 1432 | tslib@^1.8.0, tslib@^1.8.1: 1433 | version "1.9.3" 1434 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 1435 | integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== 1436 | 1437 | tslint@5.18.0: 1438 | version "5.18.0" 1439 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.18.0.tgz#f61a6ddcf372344ac5e41708095bbf043a147ac6" 1440 | integrity sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w== 1441 | dependencies: 1442 | "@babel/code-frame" "^7.0.0" 1443 | builtin-modules "^1.1.1" 1444 | chalk "^2.3.0" 1445 | commander "^2.12.1" 1446 | diff "^3.2.0" 1447 | glob "^7.1.1" 1448 | js-yaml "^3.13.1" 1449 | minimatch "^3.0.4" 1450 | mkdirp "^0.5.1" 1451 | resolve "^1.3.2" 1452 | semver "^5.3.0" 1453 | tslib "^1.8.0" 1454 | tsutils "^2.29.0" 1455 | 1456 | tsutils@^2.29.0: 1457 | version "2.29.0" 1458 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 1459 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 1460 | dependencies: 1461 | tslib "^1.8.1" 1462 | 1463 | tunnel-agent@^0.6.0: 1464 | version "0.6.0" 1465 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1466 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 1467 | dependencies: 1468 | safe-buffer "^5.0.1" 1469 | 1470 | tunnel@0.0.4: 1471 | version "0.0.4" 1472 | resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.4.tgz#2d3785a158c174c9a16dc2c046ec5fc5f1742213" 1473 | integrity sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM= 1474 | 1475 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1476 | version "0.14.5" 1477 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1478 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 1479 | 1480 | typed-rest-client@1.2.0: 1481 | version "1.2.0" 1482 | resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.2.0.tgz#723085d203f38d7d147271e5ed3a75488eb44a02" 1483 | integrity sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw== 1484 | dependencies: 1485 | tunnel "0.0.4" 1486 | underscore "1.8.3" 1487 | 1488 | typescript@3.5.3: 1489 | version "3.5.3" 1490 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" 1491 | integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== 1492 | 1493 | uc.micro@^1.0.1, uc.micro@^1.0.5: 1494 | version "1.0.5" 1495 | resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" 1496 | integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== 1497 | 1498 | underscore@1.8.3: 1499 | version "1.8.3" 1500 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" 1501 | integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= 1502 | 1503 | uri-js@^4.2.2: 1504 | version "4.2.2" 1505 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1506 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1507 | dependencies: 1508 | punycode "^2.1.0" 1509 | 1510 | url-join@^1.1.0: 1511 | version "1.1.0" 1512 | resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78" 1513 | integrity sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg= 1514 | 1515 | url-parse@^1.4.4: 1516 | version "1.4.7" 1517 | resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" 1518 | integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== 1519 | dependencies: 1520 | querystringify "^2.1.1" 1521 | requires-port "^1.0.0" 1522 | 1523 | util-deprecate@^1.0.1: 1524 | version "1.0.2" 1525 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1526 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1527 | 1528 | uuid@^3.3.2: 1529 | version "3.3.2" 1530 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 1531 | integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== 1532 | 1533 | verror@1.10.0: 1534 | version "1.10.0" 1535 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 1536 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 1537 | dependencies: 1538 | assert-plus "^1.0.0" 1539 | core-util-is "1.0.2" 1540 | extsprintf "^1.2.0" 1541 | 1542 | vsce@1.66.0: 1543 | version "1.66.0" 1544 | resolved "https://registry.yarnpkg.com/vsce/-/vsce-1.66.0.tgz#8cf1d64a4825d5d0523ea5efd0bf41e2c6829565" 1545 | integrity sha512-Zf4+WD4PhEcOr7jkU08SI9lwFqDhmhk73YOCGQ/tNLaBy+PnnX4eSdqj9LdzDLuI2dsyomJLXzDSNgxuaInxCQ== 1546 | dependencies: 1547 | azure-devops-node-api "^7.2.0" 1548 | chalk "^2.4.2" 1549 | cheerio "^1.0.0-rc.1" 1550 | commander "^2.8.1" 1551 | denodeify "^1.2.1" 1552 | didyoumean "^1.2.1" 1553 | glob "^7.0.6" 1554 | lodash "^4.17.10" 1555 | markdown-it "^8.3.1" 1556 | mime "^1.3.4" 1557 | minimatch "^3.0.3" 1558 | osenv "^0.1.3" 1559 | parse-semver "^1.1.1" 1560 | read "^1.0.7" 1561 | semver "^5.1.0" 1562 | tmp "0.0.29" 1563 | typed-rest-client "1.2.0" 1564 | url-join "^1.1.0" 1565 | yauzl "^2.3.1" 1566 | yazl "^2.2.2" 1567 | 1568 | vscode-debugadapter-testsupport@1.37.0: 1569 | version "1.37.0" 1570 | resolved "https://registry.yarnpkg.com/vscode-debugadapter-testsupport/-/vscode-debugadapter-testsupport-1.37.0.tgz#7f8822c451d9b2240702a8605345afed93c244da" 1571 | integrity sha512-WzE27nn+QOdIF9f4A0ZQA9sUF4fpAT4DPVzJf7TRvOvsku03HGaydf5tyGaSIEFxLYqUNkZ2ipQqQBDnWKjDjA== 1572 | dependencies: 1573 | vscode-debugprotocol "1.37.0" 1574 | 1575 | vscode-debugadapter@1.37.0: 1576 | version "1.37.0" 1577 | resolved "https://registry.yarnpkg.com/vscode-debugadapter/-/vscode-debugadapter-1.37.0.tgz#3ecb77c992c206fcde787cd8679d3eabadd4ab72" 1578 | integrity sha512-vd+4KpNYSzrU4YIb0ryZDLMFPyFOZqo/FcbK8/58g2Asr/gRY0vQ6lsETQ4aDWLI8IpZP6Ry7g+HYpzMa+4I5g== 1579 | dependencies: 1580 | mkdirp "^0.5.1" 1581 | vscode-debugprotocol "1.37.0" 1582 | 1583 | vscode-debugprotocol@1.37.0: 1584 | version "1.37.0" 1585 | resolved "https://registry.yarnpkg.com/vscode-debugprotocol/-/vscode-debugprotocol-1.37.0.tgz#e8c4694a078d18ea1a639553a7a241b35c1e6f6d" 1586 | integrity sha512-ppZLEBbFRVNsK0YpfgFi/x2CDyihx0F+UpdKmgeJcvi05UgSXYdO0n9sDVYwoGvvYQPvlpDQeWuY0nloOC4mPA== 1587 | 1588 | vscode-test@^0.4.1: 1589 | version "0.4.3" 1590 | resolved "https://registry.yarnpkg.com/vscode-test/-/vscode-test-0.4.3.tgz#461ebf25fc4bc93d77d982aed556658a2e2b90b8" 1591 | integrity sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w== 1592 | dependencies: 1593 | http-proxy-agent "^2.1.0" 1594 | https-proxy-agent "^2.2.1" 1595 | 1596 | vscode@1.1.36: 1597 | version "1.1.36" 1598 | resolved "https://registry.yarnpkg.com/vscode/-/vscode-1.1.36.tgz#5e1a0d1bf4977d0c7bc5159a9a13d5b104d4b1b6" 1599 | integrity sha512-cGFh9jmGLcTapCpPCKvn8aG/j9zVQ+0x5hzYJq5h5YyUXVGa1iamOaB2M2PZXoumQPES4qeAP1FwkI0b6tL4bQ== 1600 | dependencies: 1601 | glob "^7.1.2" 1602 | mocha "^5.2.0" 1603 | request "^2.88.0" 1604 | semver "^5.4.1" 1605 | source-map-support "^0.5.0" 1606 | url-parse "^1.4.4" 1607 | vscode-test "^0.4.1" 1608 | 1609 | which-module@^2.0.0: 1610 | version "2.0.0" 1611 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1612 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1613 | 1614 | which@1.3.1, which@^1.2.9: 1615 | version "1.3.1" 1616 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1617 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1618 | dependencies: 1619 | isexe "^2.0.0" 1620 | 1621 | wide-align@1.1.3: 1622 | version "1.1.3" 1623 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1624 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1625 | dependencies: 1626 | string-width "^1.0.2 || 2" 1627 | 1628 | wrap-ansi@^2.0.0: 1629 | version "2.1.0" 1630 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 1631 | integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= 1632 | dependencies: 1633 | string-width "^1.0.1" 1634 | strip-ansi "^3.0.1" 1635 | 1636 | wrappy@1: 1637 | version "1.0.2" 1638 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1639 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1640 | 1641 | "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: 1642 | version "4.0.0" 1643 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 1644 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 1645 | 1646 | yargs-parser@13.0.0: 1647 | version "13.0.0" 1648 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" 1649 | integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== 1650 | dependencies: 1651 | camelcase "^5.0.0" 1652 | decamelize "^1.2.0" 1653 | 1654 | yargs-parser@^11.1.1: 1655 | version "11.1.1" 1656 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" 1657 | integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== 1658 | dependencies: 1659 | camelcase "^5.0.0" 1660 | decamelize "^1.2.0" 1661 | 1662 | yargs-parser@^13.0.0: 1663 | version "13.1.1" 1664 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" 1665 | integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== 1666 | dependencies: 1667 | camelcase "^5.0.0" 1668 | decamelize "^1.2.0" 1669 | 1670 | yargs-unparser@1.5.0: 1671 | version "1.5.0" 1672 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.5.0.tgz#f2bb2a7e83cbc87bb95c8e572828a06c9add6e0d" 1673 | integrity sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw== 1674 | dependencies: 1675 | flat "^4.1.0" 1676 | lodash "^4.17.11" 1677 | yargs "^12.0.5" 1678 | 1679 | yargs@13.2.2: 1680 | version "13.2.2" 1681 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" 1682 | integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA== 1683 | dependencies: 1684 | cliui "^4.0.0" 1685 | find-up "^3.0.0" 1686 | get-caller-file "^2.0.1" 1687 | os-locale "^3.1.0" 1688 | require-directory "^2.1.1" 1689 | require-main-filename "^2.0.0" 1690 | set-blocking "^2.0.0" 1691 | string-width "^3.0.0" 1692 | which-module "^2.0.0" 1693 | y18n "^4.0.0" 1694 | yargs-parser "^13.0.0" 1695 | 1696 | yargs@^12.0.5: 1697 | version "12.0.5" 1698 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" 1699 | integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== 1700 | dependencies: 1701 | cliui "^4.0.0" 1702 | decamelize "^1.2.0" 1703 | find-up "^3.0.0" 1704 | get-caller-file "^1.0.1" 1705 | os-locale "^3.0.0" 1706 | require-directory "^2.1.1" 1707 | require-main-filename "^1.0.1" 1708 | set-blocking "^2.0.0" 1709 | string-width "^2.0.0" 1710 | which-module "^2.0.0" 1711 | y18n "^3.2.1 || ^4.0.0" 1712 | yargs-parser "^11.1.1" 1713 | 1714 | yauzl@^2.3.1: 1715 | version "2.10.0" 1716 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" 1717 | integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= 1718 | dependencies: 1719 | buffer-crc32 "~0.2.3" 1720 | fd-slicer "~1.1.0" 1721 | 1722 | yazl@^2.2.2: 1723 | version "2.5.0" 1724 | resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.0.tgz#1ab8de8cd3c3c252986c7fa2f6562784d7288e49" 1725 | integrity sha512-rgptqKwX/f1/7bIRF1FHb4HGsP5k11QyxBpDl1etUDfNpTa7CNjDOYNPFnIaEzZ9dRq0c47IEJS+sy+T39JCLw== 1726 | dependencies: 1727 | buffer-crc32 "~0.2.3" 1728 | --------------------------------------------------------------------------------