├── icon.png ├── snapshots ├── coding-with-API-docs.jpg ├── coding-with-preview.jpg └── coding-with-searching.jpg ├── .vscodeignore ├── .vscode ├── extensions.json ├── tasks.json ├── settings.json └── launch.json ├── CHANGELOG.md ├── tslint.json ├── src ├── storage.ts ├── test │ ├── suite │ │ ├── extension.test.ts │ │ └── index.ts │ └── runTest.ts ├── extension.ts ├── index.html.ts ├── proxy.ts └── WebviewPanel.ts ├── tsconfig.json ├── LICENSE ├── README-zhCN.md ├── media ├── awesomplete.min.css ├── index.css ├── index.js └── awesomplete.min.js ├── package.json ├── README.md ├── .gitignore ├── vsc-extension-quickstart.md └── yarn.lock /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayqy/browser/HEAD/icon.png -------------------------------------------------------------------------------- /snapshots/coding-with-API-docs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayqy/browser/HEAD/snapshots/coding-with-API-docs.jpg -------------------------------------------------------------------------------- /snapshots/coding-with-preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayqy/browser/HEAD/snapshots/coding-with-preview.jpg -------------------------------------------------------------------------------- /snapshots/coding-with-searching.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ayqy/browser/HEAD/snapshots/coding-with-searching.jpg -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | src/** 5 | .gitignore 6 | vsc-extension-quickstart.md 7 | **/tsconfig.json 8 | **/tslint.json 9 | **/*.map 10 | **/*.ts -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "ms-vscode.vscode-typescript-tslint-plugin" 6 | ] 7 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to the "browser" extension will be documented in this file. 4 | 5 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. 6 | 7 | ## [Unreleased] 8 | 9 | - Initial release -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-string-throw": true, 4 | "no-unused-expression": true, 5 | "no-duplicate-variable": true, 6 | "curly": true, 7 | "class-name": true, 8 | "semicolon": [ 9 | true, 10 | "always" 11 | ], 12 | "triple-equals": true 13 | }, 14 | "defaultSeverity": "warning" 15 | } 16 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": "$tsc-watch", 10 | "isBackground": true, 11 | "presentation": { 12 | "reveal": "never" 13 | }, 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | } 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | }, 9 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 10 | "typescript.tsc.autoDetect": "off" 11 | } -------------------------------------------------------------------------------- /src/storage.ts: -------------------------------------------------------------------------------- 1 | import { ExtensionContext } from 'vscode'; 2 | 3 | class Storage { 4 | context: ExtensionContext | null; 5 | 6 | public constructor() { 7 | this.context = null; 8 | } 9 | 10 | bindContext(context: ExtensionContext) { 11 | this.context = context; 12 | } 13 | 14 | set(key: string, value: any) { 15 | this.context?.globalState.update(key, value); 16 | } 17 | 18 | get(key: string) { 19 | return this.context?.globalState.get(key); 20 | } 21 | } 22 | 23 | export default new Storage(); 24 | -------------------------------------------------------------------------------- /src/test/suite/extension.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from 'assert'; 2 | 3 | // You can import and use all API from the 'vscode' module 4 | // as well as import your extension to test it 5 | import * as vscode from 'vscode'; 6 | // import * as myExtension from '../extension'; 7 | 8 | suite('Extension Test Suite', () => { 9 | vscode.window.showInformationMessage('Start all tests.'); 10 | 11 | test('Sample test', () => { 12 | assert.equal(-1, [1, 2, 3].indexOf(5)); 13 | assert.equal(-1, [1, 2, 3].indexOf(0)); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/test/runTest.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | 3 | import { runTests } from 'vscode-test'; 4 | 5 | async function main() { 6 | try { 7 | // The folder containing the Extension Manifest package.json 8 | // Passed to `--extensionDevelopmentPath` 9 | const extensionDevelopmentPath = path.resolve(__dirname, '../../'); 10 | 11 | // The path to test runner 12 | // Passed to --extensionTestsPath 13 | const extensionTestsPath = path.resolve(__dirname, './suite/index'); 14 | 15 | // Download VS Code, unzip it and run the integration test 16 | await runTests({ extensionDevelopmentPath, extensionTestsPath }); 17 | } catch (err) { 18 | console.error('Failed to run tests'); 19 | process.exit(1); 20 | } 21 | } 22 | 23 | main(); 24 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "lib": [ 7 | "es6" 8 | ], 9 | "typeRoots": ["node_modules/@types"], 10 | "types": ["node"], 11 | "sourceMap": true, 12 | "rootDir": "src", 13 | "strict": true /* enable all strict type-checking options */ 14 | /* Additional Checks */ 15 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 16 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 17 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 18 | }, 19 | "exclude": [ 20 | "node_modules", 21 | ".vscode-test" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /src/test/suite/index.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as Mocha from 'mocha'; 3 | import * as glob from 'glob'; 4 | 5 | export function run(): Promise { 6 | // Create the mocha test 7 | const mocha = new Mocha({ 8 | ui: 'tdd', 9 | }); 10 | mocha.useColors(true); 11 | 12 | const testsRoot = path.resolve(__dirname, '..'); 13 | 14 | return new Promise((c, e) => { 15 | glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { 16 | if (err) { 17 | return e(err); 18 | } 19 | 20 | // Add files to the test suite 21 | files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); 22 | 23 | try { 24 | // Run the mocha test 25 | mocha.run(failures => { 26 | if (failures > 0) { 27 | e(new Error(`${failures} tests failed.`)); 28 | } else { 29 | c(); 30 | } 31 | }); 32 | } catch (err) { 33 | e(err); 34 | } 35 | }); 36 | }); 37 | } 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 黯羽轻扬 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Run Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ], 16 | "outFiles": [ 17 | "${workspaceFolder}/out/**/*.js" 18 | ], 19 | "preLaunchTask": "${defaultBuildTask}" 20 | }, 21 | { 22 | "name": "Extension Tests", 23 | "type": "extensionHost", 24 | "request": "launch", 25 | "runtimeExecutable": "${execPath}", 26 | "args": [ 27 | "--extensionDevelopmentPath=${workspaceFolder}", 28 | "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" 29 | ], 30 | "outFiles": [ 31 | "${workspaceFolder}/out/test/**/*.js" 32 | ], 33 | "preLaunchTask": "${defaultBuildTask}" 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /README-zhCN.md: -------------------------------------------------------------------------------- 1 | # EmbeddedBrowser 2 | 3 | VS Code 内嵌浏览器。 4 | 5 | ## 功能特性 6 | 7 | 直接在你的 VS Code 中打开一个浏览器。 8 | 9 | 比如,边写代码边 Google 搜索: 10 | 11 | ![coding-with-searching](https://raw.githubusercontent.com/ayqy/browser/master/snapshots/coding-with-searching.jpg) 12 | 13 | 比如,边写代码边查 API 文档: 14 | 15 | ![coding-with-API-docs](https://raw.githubusercontent.com/ayqy/browser/master/snapshots/coding-with-API-docs.jpg) 16 | 17 | 又比如,边写代码边预览本地效果: 18 | 19 | ![coding-with-preview](https://raw.githubusercontent.com/ayqy/browser/master/snapshots/coding-with-preview.jpg) 20 | 21 | ### 完整功能列表 22 | 23 | - 在你的 VS Code 中打开任意 HTTP/HTTPS 链接。 24 | 25 | - 跳转、前进、后退、刷新全都支持。 26 | 27 | - 支持历史记录,网址自动补全。 28 | 29 | - VS Code 重启时自动恢复开着的浏览器面板。 30 | 31 | ## 安装 32 | 33 | [即装即用](https://marketplace.visualstudio.com/items?itemName=ayqy.browser) 34 | 35 | ## 使用 36 | 37 | [输入命令](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette) `Open Browser` 即可。 38 | 39 | ### 命令 40 | 41 | - `Open Browser`: 在另一栏打开一个浏览器面板。 42 | 43 | - `Close Browser`: 关掉浏览器面板。 44 | 45 | - `Clear Hisotry`: 清空浏览历史。 46 | 47 | ## 反馈 48 | 49 | 如遇任何问题,或有功能建议,都可以[通过 issue 反馈](https://github.com/ayqy/browser/issues)。 50 | 51 | 另外,欢迎共同参与。 52 | 53 | ## 版本 54 | 55 | ### 1.0.0 56 | 57 | - 初版发布 58 | 59 | #### 1.0.1 60 | 61 | - 改名为独一无二的 EmbeddedBrowser 62 | 63 | - 补充用法文档 64 | 65 | #### 1.1.0 66 | 67 | - 支持 Clear History 68 | 69 | - 修复不记录历史的问题 70 | 71 | - 补充命令文档 72 | -------------------------------------------------------------------------------- /media/awesomplete.min.css: -------------------------------------------------------------------------------- 1 | .awesomplete [hidden]{display:none}.awesomplete .visually-hidden{position:absolute;clip:rect(0,0,0,0)}.awesomplete{display:inline-block;position:relative}.awesomplete>input{display:block}.awesomplete>ul{position:absolute;left:0;z-index:1;min-width:100%;box-sizing:border-box;list-style:none;padding:0;margin:0;background:#fff}.awesomplete>ul:empty{display:none}.awesomplete>ul{border-radius:.3em;margin:.2em 0 0;background:hsla(0,0%,100%,.9);background:linear-gradient(to bottom right,#fff,hsla(0,0%,100%,.8));border:1px solid rgba(0,0,0,.3);box-shadow:.05em .2em .6em rgba(0,0,0,.2);text-shadow:none}@supports (transform:scale(0)){.awesomplete>ul{transition:.3s cubic-bezier(.4,.2,.5,1.4);transform-origin:1.43em -.43em}.awesomplete>ul:empty,.awesomplete>ul[hidden]{opacity:0;transform:scale(0);display:block;transition-timing-function:ease}}.awesomplete>ul:before{content:"";position:absolute;top:-.43em;left:1em;width:0;height:0;padding:.4em;background:#fff;border:inherit;border-right:0;border-bottom:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.awesomplete>ul>li{position:relative;padding:.2em .5em;cursor:pointer}.awesomplete>ul>li:hover{background:#b7d2e0;color:#000}.awesomplete>ul>li[aria-selected=true]{background:#3d6c8e;color:#fff}.awesomplete mark{background:#e9ff00}.awesomplete li:hover mark{background:#b5d100}.awesomplete li[aria-selected=true] mark{background:#3c6b00;color:inherit} 2 | /*# sourceMappingURL=awesomplete.min.css.map */ -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import WebviewPanel from './WebviewPanel'; 3 | import { start, stop } from './proxy'; 4 | import storage from './storage'; 5 | 6 | export function activate(context: vscode.ExtensionContext) { 7 | context.subscriptions.push( 8 | vscode.commands.registerCommand('browser.open', () => { 9 | WebviewPanel.createOrShow(context.extensionPath); 10 | }) 11 | ); 12 | context.subscriptions.push( 13 | vscode.commands.registerCommand('browser.close', () => { 14 | if (WebviewPanel.currentPanel) { 15 | WebviewPanel.currentPanel.close(); 16 | } 17 | }) 18 | ); 19 | context.subscriptions.push( 20 | vscode.commands.registerCommand('browser.clearHistory', () => { 21 | if (WebviewPanel.currentPanel) { 22 | WebviewPanel.currentPanel.clearHistory(); 23 | } 24 | else { 25 | WebviewPanel.clearHistory(); 26 | } 27 | }) 28 | ); 29 | 30 | if (vscode.window.registerWebviewPanelSerializer) { 31 | // Make sure we register a serializer in activation event 32 | vscode.window.registerWebviewPanelSerializer(WebviewPanel.viewType, { 33 | async deserializeWebviewPanel( 34 | webviewPanel: vscode.WebviewPanel, 35 | state: any 36 | ) { 37 | WebviewPanel.revive(webviewPanel, context.extensionPath); 38 | } 39 | }); 40 | } 41 | 42 | // Bind global storage context 43 | storage.bindContext(context); 44 | 45 | // Start local proxy server 46 | start(); 47 | } 48 | 49 | // this method is called when your extension is deactivated 50 | export function deactivate() { 51 | stop(); 52 | } 53 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "browser", 3 | "displayName": "EmbeddedBrowser", 4 | "description": "An embedded browser for your VS Code.", 5 | "version": "1.1.0", 6 | "homepage": "https://marketplace.visualstudio.com/items?itemName=ayqy.browser", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/ayqy/browser.git" 10 | }, 11 | "publisher": "ayqy", 12 | "author": "ayqy", 13 | "engines": { 14 | "vscode": "^1.40.0" 15 | }, 16 | "keywords": [ 17 | "Embedded browser", 18 | "Open browser", 19 | "Open URL", 20 | "Open Web Page", 21 | "Preview HTML" 22 | ], 23 | "categories": [ 24 | "Other" 25 | ], 26 | "activationEvents": [ 27 | "onCommand:browser.open", 28 | "onWebviewPanel:browser.webview" 29 | ], 30 | "icon": "icon.png", 31 | "main": "./out/extension.js", 32 | "contributes": { 33 | "commands": [ 34 | { 35 | "command": "browser.open", 36 | "title": "Open Browser" 37 | }, 38 | { 39 | "command": "browser.close", 40 | "title": "Close Browser" 41 | }, 42 | { 43 | "command": "browser.clearHistory", 44 | "title": "Clear Hisotry" 45 | } 46 | ] 47 | }, 48 | "scripts": { 49 | "vscode:prepublish": "yarn run compile", 50 | "compile": "tsc -t ESNEXT -p ./", 51 | "watch": "tsc -watch -p ./", 52 | "pretest": "yarn run compile", 53 | "test": "node ./out/test/runTest.js" 54 | }, 55 | "devDependencies": { 56 | "@types/content-type": "^1.1.3", 57 | "@types/follow-redirects": "^1.8.0", 58 | "@types/glob": "^7.1.1", 59 | "@types/mocha": "^5.2.7", 60 | "@types/node": "^12.11.7", 61 | "@types/vscode": "^1.40.0", 62 | "glob": "^7.1.5", 63 | "mocha": "^6.2.2", 64 | "tslint": "^5.20.0", 65 | "typescript": "^3.6.4", 66 | "vscode-test": "^1.2.2" 67 | }, 68 | "dependencies": { 69 | "content-type": "^1.0.4", 70 | "follow-redirects": "^1.9.0" 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EmbeddedBrowser 2 | 3 | An embedded browser for your VS Code. 4 | 5 | Other languages: [中文](https://github.com/ayqy/browser/blob/master/README-zhCN.md) 6 | 7 | ## Features 8 | 9 | Open a browser just inside your VS Code. 10 | 11 | Like this (Google searching on the other side): 12 | 13 | ![coding-with-searching](https://raw.githubusercontent.com/ayqy/browser/master/snapshots/coding-with-searching.jpg) 14 | 15 | Like this (Looking up API docs on the other side): 16 | 17 | ![coding-with-API-docs](https://raw.githubusercontent.com/ayqy/browser/master/snapshots/coding-with-API-docs.jpg) 18 | 19 | Or this (Previewing local web page on the the other side): 20 | 21 | ![coding-with-preview](https://raw.githubusercontent.com/ayqy/browser/master/snapshots/coding-with-preview.jpg) 22 | 23 | ### Full Feature List 24 | 25 | - Open any HTTP/HTTPS URL inside your VS Code. 26 | 27 | - Navigation, forwarding, backwarding, refreshing are all available. 28 | 29 | - Record history locally, and autocomplete on typing address. 30 | 31 | - Restore opening Browser Panel after VS Code restart. 32 | 33 | ## Installation 34 | 35 | No extra requirements, [install and enjoy now](https://marketplace.visualstudio.com/items?itemName=ayqy.browser). 36 | 37 | ## Usage 38 | 39 | Just type `Open Browser` at [Command Palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette). 40 | 41 | ### All Commands 42 | 43 | - `Open Browser`: Open an embedded browser on the other side. 44 | 45 | - `Close Browser`: Close the embedded browser immediately. 46 | 47 | - `Clear Hisotry`: Clear local hisotry. 48 | 49 | ## Known Issues 50 | 51 | Feel free to [file an issue](https://github.com/ayqy/browser/issues), and contributions are very welcome. 52 | 53 | ## Release Notes 54 | 55 | ### 1.0.0 56 | 57 | - Initial release of Browser. 58 | 59 | #### 1.0.1 60 | 61 | - Rename to unique EmbeddedBrowser 62 | 63 | - Completing the usage docs. 64 | 65 | #### 1.1.0 66 | 67 | - Clear History command is available now. 68 | 69 | - Fix broken history. 70 | 71 | - Completing the commands docs. 72 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Extension output 2 | out 3 | .vscode-test/ 4 | *.vsix 5 | 6 | # Logs 7 | logs 8 | *.log 9 | npm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | lerna-debug.log* 13 | 14 | # Diagnostic reports (https://nodejs.org/api/report.html) 15 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 16 | 17 | # Runtime data 18 | pids 19 | *.pid 20 | *.seed 21 | *.pid.lock 22 | 23 | # Directory for instrumented libs generated by jscoverage/JSCover 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | coverage 28 | *.lcov 29 | 30 | # nyc test coverage 31 | .nyc_output 32 | 33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 34 | .grunt 35 | 36 | # Bower dependency directory (https://bower.io/) 37 | bower_components 38 | 39 | # node-waf configuration 40 | .lock-wscript 41 | 42 | # Compiled binary addons (https://nodejs.org/api/addons.html) 43 | build/Release 44 | 45 | # Dependency directories 46 | node_modules/ 47 | jspm_packages/ 48 | 49 | # TypeScript v1 declaration files 50 | typings/ 51 | 52 | # TypeScript cache 53 | *.tsbuildinfo 54 | 55 | # Optional npm cache directory 56 | .npm 57 | 58 | # Optional eslint cache 59 | .eslintcache 60 | 61 | # Microbundle cache 62 | .rpt2_cache/ 63 | .rts2_cache_cjs/ 64 | .rts2_cache_es/ 65 | .rts2_cache_umd/ 66 | 67 | # Optional REPL history 68 | .node_repl_history 69 | 70 | # Output of 'npm pack' 71 | *.tgz 72 | 73 | # Yarn Integrity file 74 | .yarn-integrity 75 | 76 | # dotenv environment variables file 77 | .env 78 | .env.test 79 | 80 | # parcel-bundler cache (https://parceljs.org/) 81 | .cache 82 | 83 | # Next.js build output 84 | .next 85 | 86 | # Nuxt.js build / generate output 87 | .nuxt 88 | dist 89 | 90 | # Gatsby files 91 | .cache/ 92 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 93 | # https://nextjs.org/blog/next-9-1#public-directory-support 94 | # public 95 | 96 | # vuepress build output 97 | .vuepress/dist 98 | 99 | # Serverless directories 100 | .serverless/ 101 | 102 | # FuseBox cache 103 | .fusebox/ 104 | 105 | # DynamoDB Local files 106 | .dynamodb/ 107 | 108 | # TernJS port file 109 | .tern-port 110 | -------------------------------------------------------------------------------- /media/index.css: -------------------------------------------------------------------------------- 1 | /* =reset */ 2 | body { 3 | margin: 0; 4 | padding: 0; 5 | } 6 | input, textarea { 7 | -webkit-appearance: none; 8 | } 9 | 10 | 11 | /* =style */ 12 | html, body, .page { 13 | width: 100%; 14 | height: 100%; 15 | overflow: hidden; 16 | } 17 | .page { 18 | display: flex; 19 | flex-direction: column; 20 | } 21 | .header { 22 | display: flex; 23 | box-sizing: border-box; 24 | padding: 5px 10px; 25 | background-color: #f8f8f8; 26 | border: 1px solid #ccc; 27 | margin: -1px; 28 | margin-bottom: 0; 29 | transition: transform 0.3s, opacity 0.3s, margin-bottom 0.3s; 30 | z-index: 3; 31 | } 32 | @media (prefers-color-scheme: dark) { 33 | .header { 34 | background-color: #0000; 35 | } 36 | } 37 | .header.folded { 38 | margin-bottom: -41px; 39 | } 40 | .header.folded:not(:hover) { 41 | transform: translateX(calc(100% - 15px)); 42 | opacity: 0.5; 43 | } 44 | .button { 45 | display: inline-block; 46 | box-sizing: border-box; 47 | width: 30px; 48 | height: 30px; 49 | margin: 0 5px; 50 | transform: scale(0.68); 51 | cursor: pointer; 52 | background-color: inherit; 53 | } 54 | .button:hover { 55 | transition: transform ease-in-out 0.1s; 56 | transform: scale(0.8); 57 | outline: 1px solid #eee; 58 | outline-offset: 4px; 59 | } 60 | .button:active { 61 | transform: scale(0.5); 62 | } 63 | .button svg{ 64 | fill: #333; 65 | } 66 | @media (prefers-color-scheme: dark) { 67 | .button svg { 68 | fill: #ccc; 69 | } 70 | } 71 | #fold { 72 | width: 10px; 73 | margin-right: -10px; 74 | } 75 | #search { 76 | flex-grow: 1; 77 | margin: 0; 78 | } 79 | .awesomplete { 80 | width: 100%; 81 | } 82 | #address { 83 | width: 100%; 84 | display: inline-block; 85 | box-sizing: border-box; 86 | height: 30px; 87 | font-size: 14px; 88 | line-height: 1; 89 | border: 1px solid #eee; 90 | border-radius: 4px; 91 | outline: none; 92 | color: #333; 93 | text-indent: 4px; 94 | } 95 | @media (prefers-color-scheme: dark) { 96 | #address { 97 | background-color: #0000; 98 | border-color: #999; 99 | color: #ddd; 100 | } 101 | } 102 | #iframe { 103 | flex-grow: 1; 104 | width: 100%; 105 | transition: margin-top 0.3s, transform 0.3s; 106 | } 107 | .header.folded:hover + #iframe { 108 | transform: translateY(41px); 109 | } 110 | -------------------------------------------------------------------------------- /vsc-extension-quickstart.md: -------------------------------------------------------------------------------- 1 | # Welcome to your VS Code Extension 2 | 3 | ## What's in the folder 4 | 5 | * This folder contains all of the files necessary for your extension. 6 | * `package.json` - this is the manifest file in which you declare your extension and command. 7 | * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. 8 | * `src/extension.ts` - this is the main file where you will provide the implementation of your command. 9 | * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. 10 | * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. 11 | 12 | ## Get up and running straight away 13 | 14 | * Press `F5` to open a new window with your extension loaded. 15 | * Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. 16 | * Set breakpoints in your code inside `src/extension.ts` to debug your extension. 17 | * Find output from your extension in the debug console. 18 | 19 | ## Make changes 20 | 21 | * You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. 22 | * You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. 23 | 24 | 25 | ## Explore the API 26 | 27 | * You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. 28 | 29 | ## Run tests 30 | 31 | * Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Extension Tests`. 32 | * Press `F5` to run the tests in a new window with your extension loaded. 33 | * See the output of the test result in the debug console. 34 | * Make changes to `src/test/suite/extension.test.ts` or create new test files inside the `test/suite` folder. 35 | * The provided test runner will only consider files matching the name pattern `**.test.ts`. 36 | * You can create folders inside the `test` folder to structure your tests any way you want. 37 | 38 | ## Go further 39 | 40 | * Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). 41 | * [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VSCode extension marketplace. 42 | * Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). 43 | -------------------------------------------------------------------------------- /src/index.html.ts: -------------------------------------------------------------------------------- 1 | export default function(resourceRoot: string, proxyUrl = '') { 2 | return ` 3 | 4 | 5 | 6 | 7 | 8 | 9 | Browser 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 |
20 |
21 |
22 | 23 |
24 |
25 | 26 |
27 |
28 | 29 |
30 | 33 |
34 |
35 | 36 |
37 | 38 | 39 | 40 | ` 41 | }; 42 | -------------------------------------------------------------------------------- /src/proxy.ts: -------------------------------------------------------------------------------- 1 | import { IncomingMessage, ServerResponse, ClientRequest, Server } from 'http'; 2 | import { http, https, RedirectableRequest } from 'follow-redirects'; 3 | import { parse } from 'querystring'; 4 | import * as url from 'url'; 5 | import { Transform } from 'stream'; 6 | import * as type from 'content-type'; 7 | 8 | const protocolMap = { http, https }; 9 | const portMap = { http: 80, https: 443 }; 10 | 11 | let refererUrl = ''; 12 | function onRequest(req: IncomingMessage, res: ServerResponse) { 13 | const originUrl = url.parse(req.url!); 14 | const qs = parse(originUrl.query!); 15 | let targetUrl = qs['target'] as string; 16 | if (!targetUrl) { 17 | targetUrl = url.resolve(refererUrl, originUrl.path!); 18 | } 19 | 20 | const proxy = proxyRequest(targetUrl, res); 21 | if (proxy) { 22 | req.pipe(proxy, { 23 | end: true 24 | }); 25 | } 26 | } 27 | 28 | function proxyRequest(targetUrl: string, res: ServerResponse) { 29 | const target = url.parse(targetUrl); 30 | const protocol = target.protocol!.slice(0, -1); 31 | if (protocol !== 'http' && protocol !== 'https') { 32 | res.statusCode = 500; 33 | res.end(`${protocol} is not supported yet.`); 34 | return; 35 | } 36 | 37 | const options = { 38 | hostname: target.hostname, 39 | port: target.port || portMap[protocol!], 40 | path: target.path, 41 | method: 'GET' 42 | }; 43 | 44 | const proxy: RedirectableRequest = protocolMap[protocol].request(options, (_res: IncomingMessage) => { 45 | // Copy headers 46 | const fieldsToRemove = ['x-frame-options', 'content-security-policy']; 47 | Object.keys(_res.headers).forEach(field => { 48 | if (!fieldsToRemove.includes(field.toLocaleLowerCase())) { 49 | res.setHeader(field, _res.headers[field]!); 50 | } 51 | }); 52 | const transformed = transformBody(_res, targetUrl); 53 | 54 | transformed.pipe(res, { 55 | end: true 56 | }); 57 | }); 58 | 59 | return proxy; 60 | } 61 | 62 | function transformBody(res: IncomingMessage, targetUrl: string) { 63 | const rawType = res.headers['content-type'] || ''; 64 | // Do not transform unknown content 65 | if (!rawType) { 66 | return res; 67 | } 68 | const contentType = type.parse(rawType).type; 69 | // Do not transform non-text content 70 | if (contentType.indexOf('text') === -1) { 71 | return res; 72 | } 73 | 74 | function replaceUrl(match: string, p1: string, p2: string, offset: number, s: string) { 75 | let prefixed = p2; 76 | if (!p2.startsWith('http')) { 77 | prefixed = url.resolve(targetUrl, p2); 78 | } 79 | prefixed = proxyUrl(prefixed); 80 | return `${p1}${prefixed}` 81 | } 82 | let transformer = new Transform({ 83 | transform(chunk, encoding, callback) { callback(); } 84 | }); 85 | // Replace HTML img src, script src, link href 86 | if (contentType === 'text/html') { 87 | transformer = new Transform({ 88 | transform(chunk, encoding, callback) { 89 | let content = chunk.toString(); 90 | // Replace ]*src=['"])([^'"]+)/g, replaceUrl); 92 | // Replace ]*href=['"])([^'"]+)/g, replaceUrl); 94 | // Remove ]*)(integrity=\S+)/g, '$1'); 96 | this.push(content); 97 | callback(); 98 | } 99 | }); 100 | // Assume the comming HTML is the next page to show 101 | refererUrl = targetUrl; 102 | } 103 | // Replace CSS url() 104 | else if (contentType === 'text/css') { 105 | transformer = new Transform({ 106 | transform(chunk, encoding, callback) { 107 | let content = chunk.toString(); 108 | // replace url(xxx) 109 | content = content.replace(/(url\(['"]?)([^'")]+)/g, replaceUrl); 110 | this.push(content); 111 | callback(); 112 | } 113 | }); 114 | } 115 | 116 | return res.pipe(transformer); 117 | } 118 | 119 | let server: Server; 120 | let port: number; 121 | export function start() { 122 | port = 21707 + process.pid % 1024; 123 | console.log(`Proxy server is starting at ${port} .`); 124 | server = http.createServer(onRequest).listen(port); 125 | } 126 | 127 | export function stop() { 128 | console.log(`Proxy server at ${port} stopped.`); 129 | server.close(); 130 | } 131 | 132 | export function proxyUrl(target?: string) { 133 | return `http://localhost:${port}/?target=${target ? encodeURIComponent(target) : ''}`; 134 | } 135 | -------------------------------------------------------------------------------- /src/WebviewPanel.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as vscode from 'vscode'; 3 | import homePage from './index.html'; 4 | import { proxyUrl } from './proxy'; 5 | import storage from './storage'; 6 | 7 | /** 8 | * Manages webview panel 9 | */ 10 | export default class WebviewPanel { 11 | /** 12 | * Track the currently panel. Only allow a single panel to exist at a time. 13 | */ 14 | public static currentPanel: WebviewPanel | undefined; 15 | 16 | public static readonly viewType = 'browser.webview'; 17 | 18 | private readonly _panel: vscode.WebviewPanel; 19 | private readonly _extensionPath: string; 20 | private _disposables: vscode.Disposable[] = []; 21 | 22 | public static createOrShow(extensionPath: string) { 23 | const column = vscode.window.activeTextEditor 24 | ? vscode.window.activeTextEditor.viewColumn 25 | : undefined; 26 | 27 | // If we already have a panel, show it. 28 | if (WebviewPanel.currentPanel) { 29 | WebviewPanel.currentPanel._panel.reveal(column); 30 | return; 31 | } 32 | 33 | // Otherwise, create a new panel. 34 | const panel = vscode.window.createWebviewPanel( 35 | WebviewPanel.viewType, 36 | 'Browser', 37 | vscode.ViewColumn.Two, 38 | { 39 | // Enable javascript in the webview 40 | enableScripts: true, 41 | // Enable retainContextWhenHidden by default 42 | retainContextWhenHidden: true, 43 | // And restrict the webview to only loading content from our extension's `media` directory. 44 | localResourceRoots: [ 45 | vscode.Uri.file(path.join(extensionPath, 'media/')) 46 | ] 47 | } 48 | ); 49 | 50 | WebviewPanel.currentPanel = new WebviewPanel(panel, extensionPath); 51 | } 52 | 53 | public static revive(panel: vscode.WebviewPanel, extensionPath: string) { 54 | WebviewPanel.currentPanel = new WebviewPanel(panel, extensionPath); 55 | } 56 | 57 | public static clearHistory() { 58 | storage.set('historyStack', []); 59 | } 60 | 61 | private constructor(panel: vscode.WebviewPanel, extensionPath: string) { 62 | this._panel = panel; 63 | this._extensionPath = extensionPath; 64 | 65 | // Set the webview's initial html content 66 | this.open(panel.webview); 67 | 68 | // Listen for when the panel is disposed 69 | // This happens when the user closes the panel or when the panel is closed programatically 70 | this._panel.onDidDispose(() => this.dispose(), null, this._disposables); 71 | 72 | // Update the content based on view changes 73 | // this._panel.onDidChangeViewState( 74 | // e => { 75 | // if (this._panel.visible) { 76 | // this._update(); 77 | // } 78 | // }, 79 | // null, 80 | // this._disposables 81 | // ); 82 | 83 | // Handle messages from the webview 84 | const webview = panel.webview; 85 | webview.onDidReceiveMessage( 86 | message => { 87 | console.log(message); 88 | const params = message.params || []; 89 | switch (message.action) { 90 | case 'error': 91 | vscode.window.showErrorMessage.apply(vscode.window, params); 92 | break; 93 | case 'log': 94 | console.log.apply(console, params); 95 | break; 96 | case 'storage.get': 97 | const value = storage.get.apply(storage, params); 98 | webview.postMessage({ 99 | action: '_', 100 | id: message.id, 101 | result: value 102 | }); 103 | break; 104 | case 'storage.set': 105 | storage.set.apply(storage, params); 106 | break; 107 | } 108 | }, 109 | null, 110 | this._disposables 111 | ); 112 | } 113 | 114 | public close() { 115 | this._panel.dispose(); 116 | } 117 | 118 | public clearHistory() { 119 | const webview = this._panel.webview; 120 | webview.postMessage({ 121 | action: 'clearHistory' 122 | }); 123 | } 124 | 125 | public dispose() { 126 | WebviewPanel.currentPanel = undefined; 127 | 128 | // Clean up our resources 129 | this._panel.dispose(); 130 | 131 | while (this._disposables.length) { 132 | const x = this._disposables.pop(); 133 | if (x) { 134 | x.dispose(); 135 | } 136 | } 137 | } 138 | 139 | private open(webview: vscode.Webview) { 140 | this._panel.title = 'Browser'; 141 | this._panel.webview.html = this.getHomePage(webview); 142 | } 143 | 144 | private getHomePage(webview: vscode.Webview) { 145 | // Local path to main script run in the webview 146 | const resourceRoot = 147 | webview 148 | .asWebviewUri(vscode.Uri.file(path.join(this._extensionPath, 'media'))) 149 | .toString() + '/'; 150 | 151 | return homePage(resourceRoot, proxyUrl()); 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /media/index.js: -------------------------------------------------------------------------------- 1 | const $ = document.querySelector.bind(document); 2 | const vscode = acquireVsCodeApi(); 3 | 4 | let autocomplete = null; 5 | const historyStack = { 6 | // Has been restored from storage 7 | isFullyRestored: false, 8 | stack: [], 9 | push(url = '') { 10 | const index = this.stack.indexOf(url); 11 | if (index !== -1) { 12 | this.stack.splice(index, 1); 13 | } 14 | this.stack.unshift(url); 15 | // Update state 16 | vscode.setState({ historyStack: this.stack }); 17 | if (this.isFullyRestored) { 18 | executeCommand('storage.set', 'historyStack', this.stack); 19 | } 20 | }, 21 | pop() { 22 | const top = this.stack.shift(); 23 | // Update state 24 | vscode.setState({ historyStack: this.stack }); 25 | executeCommand('storage.set', 'historyStack', this.stack); 26 | return top; 27 | }, 28 | peek() { 29 | return this.stack[0]; 30 | }, 31 | clear() { 32 | this.stack = []; 33 | executeCommand('storage.set', 'historyStack', this.stack); 34 | }, 35 | restore(stack = []) { 36 | if (Array.isArray(stack) && stack.length) { 37 | if (!this.stack.length) { 38 | this.stack = stack; 39 | } 40 | else { 41 | // Merge 42 | stack.forEach(url => { 43 | if (this.stack.indexOf(url) === -1) { 44 | this.stack.push(url); 45 | } 46 | }); 47 | } 48 | if (autocomplete) { 49 | autocomplete.list = this.stack; 50 | } 51 | } 52 | } 53 | }; 54 | 55 | const callbacks = []; 56 | /** 57 | * Send messages to extension 58 | * @param {string} command Custom commands 59 | * @param {...any} params Other parameters, which can be serialized 60 | */ 61 | function executeCommand(command, ...params) { 62 | const callback = params[params.length - 1]; 63 | if (typeof callback === 'function') { 64 | callbacks.push(params.pop()); 65 | } 66 | const id = callbacks.length - 1; 67 | 68 | // Send: webview -> extension 69 | console.log([command, params]); 70 | vscode.postMessage({ 71 | action: command, 72 | params, 73 | id 74 | }); 75 | } 76 | 77 | /** 78 | * Receive messages from extension 79 | */ 80 | function onMessage() { 81 | // Receive: extension -> webview 82 | window.addEventListener('message', event => { 83 | console.log(event); 84 | const message = event.data; 85 | switch (message.action) { 86 | case 'clearHistory': 87 | historyStack.clear(); 88 | break; 89 | default: 90 | const id = message.id; 91 | if (typeof id === 'number' && callbacks[id]) { 92 | callbacks[id].call(null, message.result); 93 | } 94 | break; 95 | } 96 | }); 97 | } 98 | 99 | const alert = executeCommand.bind(null, 'error'); 100 | const log = executeCommand.bind(null, 'log'); 101 | // Debug only 102 | // window.onerror = function(error) { 103 | // alert(`${error.message || error.toString()}${error.stack ? error.stack : ''}`); 104 | // }; 105 | 106 | 107 | function init() { 108 | addListeners(); 109 | onMessage(); 110 | restoreHistory(); 111 | loadUrl(); 112 | initAutoComplete(); 113 | } 114 | 115 | /** 116 | * Handle DOM events 117 | */ 118 | function addListeners() { 119 | $('#search').addEventListener('submit', (e) => { 120 | const inputUrl = $('#address').value || ''; 121 | if (inputUrl.trim().length) { 122 | loadUrl(inputUrl); 123 | } 124 | e.preventDefault(); 125 | return false; 126 | }); 127 | $('#backward').addEventListener('click', () => { 128 | window.history.back(); 129 | }); 130 | $('#forward').addEventListener('click', () => { 131 | window.history.forward(); 132 | }); 133 | $('#refresh').addEventListener('click', () => { 134 | loadUrl(); 135 | }); 136 | $('#fold').addEventListener('click', () => { 137 | $('.header').classList.toggle('folded'); 138 | }); 139 | } 140 | 141 | /** 142 | * Load input URL inside iframe 143 | * @param {string} targetUrl the target URL 144 | */ 145 | function loadUrl(targetUrl = '') { 146 | targetUrl = targetUrl.trim() || historyStack.peek() || ''; 147 | const $iframe = $('#iframe'); 148 | if (targetUrl) { 149 | $iframe.src = proxy(targetUrl); 150 | console.log(`Load ${targetUrl}`); 151 | // Fill address when init and refresh 152 | if (!arguments.length) { 153 | $('#address').value = targetUrl; 154 | } 155 | historyStack.push(targetUrl); 156 | } 157 | } 158 | 159 | /** 160 | * Wrap url with proxy prefix 161 | * @param {string} url HTTP/HTTPS URL 162 | */ 163 | function proxy(url) { 164 | if (window.proxyUrl) { 165 | return `${proxyUrl}${encodeURIComponent(url)}`; 166 | } 167 | return url; 168 | } 169 | 170 | function restoreHistory() { 171 | const state = vscode.getState(); 172 | console.log(state); 173 | historyStack.restore(state && state.historyStack); 174 | executeCommand('storage.get', 'historyStack', (stack) => { 175 | historyStack.isFullyRestored = true; 176 | if (stack && stack.length) { 177 | const blank = !historyStack.stack.length; 178 | historyStack.restore(stack); 179 | console.log('historyStack', stack); 180 | if (blank) { 181 | loadUrl(); 182 | } 183 | } 184 | }); 185 | } 186 | 187 | function initAutoComplete() { 188 | const $address = $('#address'); 189 | autocomplete = new Awesomplete($address, { 190 | list: historyStack.stack 191 | }); 192 | $address.addEventListener('awesomplete-selectcomplete', ({ text, origin }) => { 193 | loadUrl(text); 194 | }); 195 | } 196 | 197 | init(); 198 | -------------------------------------------------------------------------------- /media/awesomplete.min.js: -------------------------------------------------------------------------------- 1 | // Awesomplete - Lea Verou - MIT license 2 | !function(){function t(t){var e=Array.isArray(t)?{label:t[0],value:t[1]}:"object"==typeof t&&"label"in t&&"value"in t?t:{label:t,value:t};this.label=e.label||e.value,this.value=e.value}function e(t,e,i){for(var n in e){var s=e[n],r=t.input.getAttribute("data-"+n.toLowerCase());"number"==typeof s?t[n]=parseInt(r):!1===s?t[n]=null!==r:s instanceof Function?t[n]=null:t[n]=r,t[n]||0===t[n]||(t[n]=n in i?i[n]:s)}}function i(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function n(t,e){return o.call((e||document).querySelectorAll(t))}function s(){n("input.awesomplete").forEach(function(t){new r(t)})}var r=function(t,n){var s=this;r.count=(r.count||0)+1,this.count=r.count,this.isOpened=!1,this.input=i(t),this.input.setAttribute("autocomplete","off"),this.input.setAttribute("aria-expanded","false"),this.input.setAttribute("aria-owns","awesomplete_list_"+this.count),this.input.setAttribute("role","combobox"),this.options=n=n||{},e(this,{minChars:2,maxItems:10,autoFirst:!1,data:r.DATA,filter:r.FILTER_CONTAINS,sort:!1!==n.sort&&r.SORT_BYLENGTH,container:r.CONTAINER,item:r.ITEM,replace:r.REPLACE,tabSelect:!1},n),this.index=-1,this.container=this.container(t),this.ul=i.create("ul",{hidden:"hidden",role:"listbox",id:"awesomplete_list_"+this.count,inside:this.container}),this.status=i.create("span",{className:"visually-hidden",role:"status","aria-live":"assertive","aria-atomic":!0,inside:this.container,textContent:0!=this.minChars?"Type "+this.minChars+" or more characters for results.":"Begin typing for results."}),this._events={input:{input:this.evaluate.bind(this),blur:this.close.bind(this,{reason:"blur"}),keydown:function(t){var e=t.keyCode;s.opened&&(13===e&&s.selected?(t.preventDefault(),s.select()):9===e&&s.selected&&s.tabSelect?s.select():27===e?s.close({reason:"esc"}):38!==e&&40!==e||(t.preventDefault(),s[38===e?"previous":"next"]()))}},form:{submit:this.close.bind(this,{reason:"submit"})},ul:{mousedown:function(t){t.preventDefault()},click:function(t){var e=t.target;if(e!==this){for(;e&&!/li/i.test(e.nodeName);)e=e.parentNode;e&&0===t.button&&(t.preventDefault(),s.select(e,t.target))}}}},i.bind(this.input,this._events.input),i.bind(this.input.form,this._events.form),i.bind(this.ul,this._events.ul),this.input.hasAttribute("list")?(this.list="#"+this.input.getAttribute("list"),this.input.removeAttribute("list")):this.list=this.input.getAttribute("data-list")||n.list||[],r.all.push(this)};r.prototype={set list(t){if(Array.isArray(t))this._list=t;else if("string"==typeof t&&t.indexOf(",")>-1)this._list=t.split(/\s*,\s*/);else if((t=i(t))&&t.children){var e=[];o.apply(t.children).forEach(function(t){if(!t.disabled){var i=t.textContent.trim(),n=t.value||i,s=t.label||i;""!==n&&e.push({label:s,value:n})}}),this._list=e}document.activeElement===this.input&&this.evaluate()},get selected(){return this.index>-1},get opened(){return this.isOpened},close:function(t){this.opened&&(this.input.setAttribute("aria-expanded","false"),this.ul.setAttribute("hidden",""),this.isOpened=!1,this.index=-1,this.status.setAttribute("hidden",""),i.fire(this.input,"awesomplete-close",t||{}))},open:function(){this.input.setAttribute("aria-expanded","true"),this.ul.removeAttribute("hidden"),this.isOpened=!0,this.status.removeAttribute("hidden"),this.autoFirst&&-1===this.index&&this.goto(0),i.fire(this.input,"awesomplete-open")},destroy:function(){if(i.unbind(this.input,this._events.input),i.unbind(this.input.form,this._events.form),!this.options.container){var t=this.container.parentNode;t.insertBefore(this.input,this.container),t.removeChild(this.container)}this.input.removeAttribute("autocomplete"),this.input.removeAttribute("aria-autocomplete");var e=r.all.indexOf(this);-1!==e&&r.all.splice(e,1)},next:function(){var t=this.ul.children.length;this.goto(this.index-1&&e.length>0&&(e[t].setAttribute("aria-selected","true"),this.status.textContent=e[t].textContent+", list item "+(t+1)+" of "+e.length,this.input.setAttribute("aria-activedescendant",this.ul.id+"_item_"+this.index),this.ul.scrollTop=e[t].offsetTop-this.ul.clientHeight+e[t].clientHeight,i.fire(this.input,"awesomplete-highlight",{text:this.suggestions[this.index]}))},select:function(t,e){if(t?this.index=i.siblingIndex(t):t=this.ul.children[this.index],t){var n=this.suggestions[this.index];i.fire(this.input,"awesomplete-select",{text:n,origin:e||t})&&(this.replace(n),this.close({reason:"select"}),i.fire(this.input,"awesomplete-selectcomplete",{text:n}))}},evaluate:function(){var e=this,i=this.input.value;i.length>=this.minChars&&this._list&&this._list.length>0?(this.index=-1,this.ul.innerHTML="",this.suggestions=this._list.map(function(n){return new t(e.data(n,i))}).filter(function(t){return e.filter(t,i)}),!1!==this.sort&&(this.suggestions=this.suggestions.sort(this.sort)),this.suggestions=this.suggestions.slice(0,this.maxItems),this.suggestions.forEach(function(t,n){e.ul.appendChild(e.item(t,i,n))}),0===this.ul.children.length?(this.status.textContent="No results found",this.close({reason:"nomatches"})):(this.open(),this.status.textContent=this.ul.children.length+" results found")):(this.close({reason:"nomatches"}),this.status.textContent="No results found")}},r.all=[],r.FILTER_CONTAINS=function(t,e){return RegExp(i.regExpEscape(e.trim()),"i").test(t)},r.FILTER_STARTSWITH=function(t,e){return RegExp("^"+i.regExpEscape(e.trim()),"i").test(t)},r.SORT_BYLENGTH=function(t,e){return t.length!==e.length?t.length-e.length:t$&"),role:"option","aria-selected":"false",id:"awesomplete_list_"+this.count+"_item_"+n})},r.REPLACE=function(t){this.input.value=t.value},r.DATA=function(t){return t},Object.defineProperty(t.prototype=Object.create(String.prototype),"length",{get:function(){return this.label.length}}),t.prototype.toString=t.prototype.valueOf=function(){return""+this.label};var o=Array.prototype.slice;i.create=function(t,e){var n=document.createElement(t);for(var s in e){var r=e[s];if("inside"===s)i(r).appendChild(n);else if("around"===s){var o=i(r);o.parentNode.insertBefore(n,o),n.appendChild(o),null!=o.getAttribute("autofocus")&&o.focus()}else s in n?n[s]=r:n.setAttribute(s,r)}return n},i.bind=function(t,e){if(t)for(var i in e){var n=e[i];i.split(/\s+/).forEach(function(e){t.addEventListener(e,n)})}},i.unbind=function(t,e){if(t)for(var i in e){var n=e[i];i.split(/\s+/).forEach(function(e){t.removeEventListener(e,n)})}},i.fire=function(t,e,i){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0);for(var s in i)n[s]=i[s];return t.dispatchEvent(n)},i.regExpEscape=function(t){return t.replace(/[-\\^$*+?.()|[\]{}]/g,"\\$&")},i.siblingIndex=function(t){for(var e=0;t=t.previousElementSibling;e++);return e},"undefined"!=typeof self&&(self.Awesomplete=r),"undefined"!=typeof Document&&("loading"!==document.readyState?s():document.addEventListener("DOMContentLoaded",s)),r.$=i,r.$$=n,"object"==typeof module&&module.exports&&(module.exports=r)}(); 3 | //# sourceMappingURL=awesomplete.min.js.map 4 | -------------------------------------------------------------------------------- /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/content-type@^1.1.3": 22 | version "1.1.3" 23 | resolved "https://registry.yarnpkg.com/@types/content-type/-/content-type-1.1.3.tgz#3688bd77fc12f935548eef102a4e34c512b03a07" 24 | integrity sha512-pv8VcFrZ3fN93L4rTNIbbUzdkzjEyVMp5mPVjsFfOYTDOZMZiZ8P1dhu+kEv3faYyKzZgLlSvnyQNFg+p/v5ug== 25 | 26 | "@types/events@*": 27 | version "3.0.0" 28 | resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" 29 | integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== 30 | 31 | "@types/follow-redirects@^1.8.0": 32 | version "1.8.0" 33 | resolved "https://registry.yarnpkg.com/@types/follow-redirects/-/follow-redirects-1.8.0.tgz#a6f47222546aee59d9a09aaea1146bc1a6726ec7" 34 | integrity sha512-xFTn5zG9x9clBXhiTlmVrHDkBPEiYGmAoKr9dQdy8lZUoXcr01xVhXQW/MmUiYZZu2c1SpOleM90B7mN+CuXhA== 35 | dependencies: 36 | "@types/node" "*" 37 | 38 | "@types/glob@^7.1.1": 39 | version "7.1.1" 40 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" 41 | integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== 42 | dependencies: 43 | "@types/events" "*" 44 | "@types/minimatch" "*" 45 | "@types/node" "*" 46 | 47 | "@types/minimatch@*": 48 | version "3.0.3" 49 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" 50 | integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== 51 | 52 | "@types/mocha@^5.2.7": 53 | version "5.2.7" 54 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" 55 | integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== 56 | 57 | "@types/node@*": 58 | version "13.1.1" 59 | resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.1.tgz#6d11a8c2d58405b3db9388ab740106cbfa64c3c9" 60 | integrity sha512-hx6zWtudh3Arsbl3cXay+JnkvVgCKzCWKv42C9J01N2T2np4h8w5X8u6Tpz5mj38kE3M9FM0Pazx8vKFFMnjLQ== 61 | 62 | "@types/node@^12.11.7": 63 | version "12.12.22" 64 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.22.tgz#b8d9eae3328b96910a373cf06ac8d3c5abe9c200" 65 | integrity sha512-r5i93jqbPWGXYXxianGATOxTelkp6ih/U0WVnvaqAvTqM+0U6J3kw6Xk6uq/dWNRkEVw/0SLcO5ORXbVNz4FMQ== 66 | 67 | "@types/vscode@^1.40.0": 68 | version "1.41.0" 69 | resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.41.0.tgz#b0d75920220f84e07093285e59180c0f11d336cd" 70 | integrity sha512-7SfeY5u9jgiELwxyLB3z7l6l/GbN9CqpCQGkcRlB7tKRFBxzbz2PoBfGrLxI1vRfUCIq5+hg5vtDHExwq5j3+A== 71 | 72 | agent-base@4, agent-base@^4.3.0: 73 | version "4.3.0" 74 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" 75 | integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== 76 | dependencies: 77 | es6-promisify "^5.0.0" 78 | 79 | ansi-colors@3.2.3: 80 | version "3.2.3" 81 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" 82 | integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== 83 | 84 | ansi-regex@^3.0.0: 85 | version "3.0.0" 86 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 87 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 88 | 89 | ansi-regex@^4.1.0: 90 | version "4.1.0" 91 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 92 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 93 | 94 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 95 | version "3.2.1" 96 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 97 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 98 | dependencies: 99 | color-convert "^1.9.0" 100 | 101 | argparse@^1.0.7: 102 | version "1.0.10" 103 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 104 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 105 | dependencies: 106 | sprintf-js "~1.0.2" 107 | 108 | balanced-match@^1.0.0: 109 | version "1.0.0" 110 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 111 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 112 | 113 | brace-expansion@^1.1.7: 114 | version "1.1.11" 115 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 116 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 117 | dependencies: 118 | balanced-match "^1.0.0" 119 | concat-map "0.0.1" 120 | 121 | browser-stdout@1.3.1: 122 | version "1.3.1" 123 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 124 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 125 | 126 | builtin-modules@^1.1.1: 127 | version "1.1.1" 128 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 129 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 130 | 131 | camelcase@^5.0.0: 132 | version "5.3.1" 133 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 134 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 135 | 136 | chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0: 137 | version "2.4.2" 138 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 139 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 140 | dependencies: 141 | ansi-styles "^3.2.1" 142 | escape-string-regexp "^1.0.5" 143 | supports-color "^5.3.0" 144 | 145 | cliui@^5.0.0: 146 | version "5.0.0" 147 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 148 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 149 | dependencies: 150 | string-width "^3.1.0" 151 | strip-ansi "^5.2.0" 152 | wrap-ansi "^5.1.0" 153 | 154 | color-convert@^1.9.0: 155 | version "1.9.3" 156 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 157 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 158 | dependencies: 159 | color-name "1.1.3" 160 | 161 | color-name@1.1.3: 162 | version "1.1.3" 163 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 164 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 165 | 166 | commander@^2.12.1: 167 | version "2.20.3" 168 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 169 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 170 | 171 | concat-map@0.0.1: 172 | version "0.0.1" 173 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 174 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 175 | 176 | content-type@^1.0.4: 177 | version "1.0.4" 178 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 179 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 180 | 181 | debug@3.1.0: 182 | version "3.1.0" 183 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 184 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 185 | dependencies: 186 | ms "2.0.0" 187 | 188 | debug@3.2.6, debug@^3.0.0, debug@^3.1.0: 189 | version "3.2.6" 190 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 191 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 192 | dependencies: 193 | ms "^2.1.1" 194 | 195 | decamelize@^1.2.0: 196 | version "1.2.0" 197 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 198 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 199 | 200 | define-properties@^1.1.2, define-properties@^1.1.3: 201 | version "1.1.3" 202 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 203 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 204 | dependencies: 205 | object-keys "^1.0.12" 206 | 207 | diff@3.5.0: 208 | version "3.5.0" 209 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 210 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 211 | 212 | diff@^4.0.1: 213 | version "4.0.1" 214 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" 215 | integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== 216 | 217 | emoji-regex@^7.0.1: 218 | version "7.0.3" 219 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 220 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 221 | 222 | es-abstract@^1.17.0-next.1: 223 | version "1.17.0" 224 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" 225 | integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== 226 | dependencies: 227 | es-to-primitive "^1.2.1" 228 | function-bind "^1.1.1" 229 | has "^1.0.3" 230 | has-symbols "^1.0.1" 231 | is-callable "^1.1.5" 232 | is-regex "^1.0.5" 233 | object-inspect "^1.7.0" 234 | object-keys "^1.1.1" 235 | object.assign "^4.1.0" 236 | string.prototype.trimleft "^2.1.1" 237 | string.prototype.trimright "^2.1.1" 238 | 239 | es-to-primitive@^1.2.1: 240 | version "1.2.1" 241 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 242 | integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== 243 | dependencies: 244 | is-callable "^1.1.4" 245 | is-date-object "^1.0.1" 246 | is-symbol "^1.0.2" 247 | 248 | es6-promise@^4.0.3: 249 | version "4.2.8" 250 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" 251 | integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== 252 | 253 | es6-promisify@^5.0.0: 254 | version "5.0.0" 255 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 256 | integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= 257 | dependencies: 258 | es6-promise "^4.0.3" 259 | 260 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 261 | version "1.0.5" 262 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 263 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 264 | 265 | esprima@^4.0.0: 266 | version "4.0.1" 267 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 268 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 269 | 270 | esutils@^2.0.2: 271 | version "2.0.3" 272 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 273 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 274 | 275 | find-up@3.0.0, find-up@^3.0.0: 276 | version "3.0.0" 277 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 278 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 279 | dependencies: 280 | locate-path "^3.0.0" 281 | 282 | flat@^4.1.0: 283 | version "4.1.0" 284 | resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 285 | integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== 286 | dependencies: 287 | is-buffer "~2.0.3" 288 | 289 | follow-redirects@^1.9.0: 290 | version "1.9.0" 291 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f" 292 | integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A== 293 | dependencies: 294 | debug "^3.0.0" 295 | 296 | fs.realpath@^1.0.0: 297 | version "1.0.0" 298 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 299 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 300 | 301 | function-bind@^1.1.1: 302 | version "1.1.1" 303 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 304 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 305 | 306 | get-caller-file@^2.0.1: 307 | version "2.0.5" 308 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 309 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 310 | 311 | glob@7.1.3: 312 | version "7.1.3" 313 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 314 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 315 | dependencies: 316 | fs.realpath "^1.0.0" 317 | inflight "^1.0.4" 318 | inherits "2" 319 | minimatch "^3.0.4" 320 | once "^1.3.0" 321 | path-is-absolute "^1.0.0" 322 | 323 | glob@^7.1.1, glob@^7.1.3, glob@^7.1.5: 324 | version "7.1.6" 325 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 326 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 327 | dependencies: 328 | fs.realpath "^1.0.0" 329 | inflight "^1.0.4" 330 | inherits "2" 331 | minimatch "^3.0.4" 332 | once "^1.3.0" 333 | path-is-absolute "^1.0.0" 334 | 335 | growl@1.10.5: 336 | version "1.10.5" 337 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 338 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 339 | 340 | has-flag@^3.0.0: 341 | version "3.0.0" 342 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 343 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 344 | 345 | has-symbols@^1.0.0, has-symbols@^1.0.1: 346 | version "1.0.1" 347 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 348 | integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== 349 | 350 | has@^1.0.3: 351 | version "1.0.3" 352 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 353 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 354 | dependencies: 355 | function-bind "^1.1.1" 356 | 357 | he@1.2.0: 358 | version "1.2.0" 359 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 360 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 361 | 362 | http-proxy-agent@^2.1.0: 363 | version "2.1.0" 364 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" 365 | integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== 366 | dependencies: 367 | agent-base "4" 368 | debug "3.1.0" 369 | 370 | https-proxy-agent@^2.2.4: 371 | version "2.2.4" 372 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" 373 | integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== 374 | dependencies: 375 | agent-base "^4.3.0" 376 | debug "^3.1.0" 377 | 378 | inflight@^1.0.4: 379 | version "1.0.6" 380 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 381 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 382 | dependencies: 383 | once "^1.3.0" 384 | wrappy "1" 385 | 386 | inherits@2: 387 | version "2.0.4" 388 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 389 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 390 | 391 | is-buffer@~2.0.3: 392 | version "2.0.4" 393 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" 394 | integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== 395 | 396 | is-callable@^1.1.4, is-callable@^1.1.5: 397 | version "1.1.5" 398 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" 399 | integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== 400 | 401 | is-date-object@^1.0.1: 402 | version "1.0.2" 403 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 404 | integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 405 | 406 | is-fullwidth-code-point@^2.0.0: 407 | version "2.0.0" 408 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 409 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 410 | 411 | is-regex@^1.0.5: 412 | version "1.0.5" 413 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" 414 | integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== 415 | dependencies: 416 | has "^1.0.3" 417 | 418 | is-symbol@^1.0.2: 419 | version "1.0.3" 420 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 421 | integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== 422 | dependencies: 423 | has-symbols "^1.0.1" 424 | 425 | isexe@^2.0.0: 426 | version "2.0.0" 427 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 428 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 429 | 430 | js-tokens@^4.0.0: 431 | version "4.0.0" 432 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 433 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 434 | 435 | js-yaml@3.13.1, js-yaml@^3.13.1: 436 | version "3.13.1" 437 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 438 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 439 | dependencies: 440 | argparse "^1.0.7" 441 | esprima "^4.0.0" 442 | 443 | locate-path@^3.0.0: 444 | version "3.0.0" 445 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 446 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 447 | dependencies: 448 | p-locate "^3.0.0" 449 | path-exists "^3.0.0" 450 | 451 | lodash@^4.17.15: 452 | version "4.17.19" 453 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" 454 | integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== 455 | 456 | log-symbols@2.2.0: 457 | version "2.2.0" 458 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" 459 | integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== 460 | dependencies: 461 | chalk "^2.0.1" 462 | 463 | minimatch@3.0.4, minimatch@^3.0.4: 464 | version "3.0.4" 465 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 466 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 467 | dependencies: 468 | brace-expansion "^1.1.7" 469 | 470 | minimist@0.0.8: 471 | version "0.0.8" 472 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 473 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 474 | 475 | mkdirp@0.5.1, mkdirp@^0.5.1: 476 | version "0.5.1" 477 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 478 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 479 | dependencies: 480 | minimist "0.0.8" 481 | 482 | mocha@^6.2.2: 483 | version "6.2.2" 484 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.2.tgz#5d8987e28940caf8957a7d7664b910dc5b2fea20" 485 | integrity sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A== 486 | dependencies: 487 | ansi-colors "3.2.3" 488 | browser-stdout "1.3.1" 489 | debug "3.2.6" 490 | diff "3.5.0" 491 | escape-string-regexp "1.0.5" 492 | find-up "3.0.0" 493 | glob "7.1.3" 494 | growl "1.10.5" 495 | he "1.2.0" 496 | js-yaml "3.13.1" 497 | log-symbols "2.2.0" 498 | minimatch "3.0.4" 499 | mkdirp "0.5.1" 500 | ms "2.1.1" 501 | node-environment-flags "1.0.5" 502 | object.assign "4.1.0" 503 | strip-json-comments "2.0.1" 504 | supports-color "6.0.0" 505 | which "1.3.1" 506 | wide-align "1.1.3" 507 | yargs "13.3.0" 508 | yargs-parser "13.1.1" 509 | yargs-unparser "1.6.0" 510 | 511 | ms@2.0.0: 512 | version "2.0.0" 513 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 514 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 515 | 516 | ms@2.1.1: 517 | version "2.1.1" 518 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 519 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 520 | 521 | ms@^2.1.1: 522 | version "2.1.2" 523 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 524 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 525 | 526 | node-environment-flags@1.0.5: 527 | version "1.0.5" 528 | resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" 529 | integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== 530 | dependencies: 531 | object.getownpropertydescriptors "^2.0.3" 532 | semver "^5.7.0" 533 | 534 | object-inspect@^1.7.0: 535 | version "1.7.0" 536 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 537 | integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== 538 | 539 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 540 | version "1.1.1" 541 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 542 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 543 | 544 | object.assign@4.1.0, object.assign@^4.1.0: 545 | version "4.1.0" 546 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 547 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 548 | dependencies: 549 | define-properties "^1.1.2" 550 | function-bind "^1.1.1" 551 | has-symbols "^1.0.0" 552 | object-keys "^1.0.11" 553 | 554 | object.getownpropertydescriptors@^2.0.3: 555 | version "2.1.0" 556 | resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" 557 | integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== 558 | dependencies: 559 | define-properties "^1.1.3" 560 | es-abstract "^1.17.0-next.1" 561 | 562 | once@^1.3.0: 563 | version "1.4.0" 564 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 565 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 566 | dependencies: 567 | wrappy "1" 568 | 569 | p-limit@^2.0.0: 570 | version "2.2.1" 571 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" 572 | integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== 573 | dependencies: 574 | p-try "^2.0.0" 575 | 576 | p-locate@^3.0.0: 577 | version "3.0.0" 578 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 579 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 580 | dependencies: 581 | p-limit "^2.0.0" 582 | 583 | p-try@^2.0.0: 584 | version "2.2.0" 585 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 586 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 587 | 588 | path-exists@^3.0.0: 589 | version "3.0.0" 590 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 591 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 592 | 593 | path-is-absolute@^1.0.0: 594 | version "1.0.1" 595 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 596 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 597 | 598 | path-parse@^1.0.6: 599 | version "1.0.6" 600 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 601 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 602 | 603 | require-directory@^2.1.1: 604 | version "2.1.1" 605 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 606 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 607 | 608 | require-main-filename@^2.0.0: 609 | version "2.0.0" 610 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 611 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 612 | 613 | resolve@^1.3.2: 614 | version "1.14.1" 615 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" 616 | integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg== 617 | dependencies: 618 | path-parse "^1.0.6" 619 | 620 | rimraf@^2.6.3: 621 | version "2.7.1" 622 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 623 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 624 | dependencies: 625 | glob "^7.1.3" 626 | 627 | semver@^5.3.0, semver@^5.7.0: 628 | version "5.7.1" 629 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 630 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 631 | 632 | set-blocking@^2.0.0: 633 | version "2.0.0" 634 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 635 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 636 | 637 | sprintf-js@~1.0.2: 638 | version "1.0.3" 639 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 640 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 641 | 642 | "string-width@^1.0.2 || 2": 643 | version "2.1.1" 644 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 645 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 646 | dependencies: 647 | is-fullwidth-code-point "^2.0.0" 648 | strip-ansi "^4.0.0" 649 | 650 | string-width@^3.0.0, string-width@^3.1.0: 651 | version "3.1.0" 652 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 653 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 654 | dependencies: 655 | emoji-regex "^7.0.1" 656 | is-fullwidth-code-point "^2.0.0" 657 | strip-ansi "^5.1.0" 658 | 659 | string.prototype.trimleft@^2.1.1: 660 | version "2.1.1" 661 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" 662 | integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== 663 | dependencies: 664 | define-properties "^1.1.3" 665 | function-bind "^1.1.1" 666 | 667 | string.prototype.trimright@^2.1.1: 668 | version "2.1.1" 669 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" 670 | integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== 671 | dependencies: 672 | define-properties "^1.1.3" 673 | function-bind "^1.1.1" 674 | 675 | strip-ansi@^4.0.0: 676 | version "4.0.0" 677 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 678 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 679 | dependencies: 680 | ansi-regex "^3.0.0" 681 | 682 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 683 | version "5.2.0" 684 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 685 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 686 | dependencies: 687 | ansi-regex "^4.1.0" 688 | 689 | strip-json-comments@2.0.1: 690 | version "2.0.1" 691 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 692 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 693 | 694 | supports-color@6.0.0: 695 | version "6.0.0" 696 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" 697 | integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== 698 | dependencies: 699 | has-flag "^3.0.0" 700 | 701 | supports-color@^5.3.0: 702 | version "5.5.0" 703 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 704 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 705 | dependencies: 706 | has-flag "^3.0.0" 707 | 708 | tslib@^1.8.0, tslib@^1.8.1: 709 | version "1.10.0" 710 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 711 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 712 | 713 | tslint@^5.20.0: 714 | version "5.20.1" 715 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" 716 | integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== 717 | dependencies: 718 | "@babel/code-frame" "^7.0.0" 719 | builtin-modules "^1.1.1" 720 | chalk "^2.3.0" 721 | commander "^2.12.1" 722 | diff "^4.0.1" 723 | glob "^7.1.1" 724 | js-yaml "^3.13.1" 725 | minimatch "^3.0.4" 726 | mkdirp "^0.5.1" 727 | resolve "^1.3.2" 728 | semver "^5.3.0" 729 | tslib "^1.8.0" 730 | tsutils "^2.29.0" 731 | 732 | tsutils@^2.29.0: 733 | version "2.29.0" 734 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 735 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 736 | dependencies: 737 | tslib "^1.8.1" 738 | 739 | typescript@^3.6.4: 740 | version "3.7.4" 741 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.4.tgz#1743a5ec5fef6a1fa9f3e4708e33c81c73876c19" 742 | integrity sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw== 743 | 744 | vscode-test@^1.2.2: 745 | version "1.3.0" 746 | resolved "https://registry.yarnpkg.com/vscode-test/-/vscode-test-1.3.0.tgz#3310ab385d9b887b4c82e8f52be1030e7cf9493d" 747 | integrity sha512-LddukcBiSU2FVTDr3c1D8lwkiOvwlJdDL2hqVbn6gIz+rpTqUCkMZSKYm94Y1v0WXlHSDQBsXyY+tchWQgGVsw== 748 | dependencies: 749 | http-proxy-agent "^2.1.0" 750 | https-proxy-agent "^2.2.4" 751 | rimraf "^2.6.3" 752 | 753 | which-module@^2.0.0: 754 | version "2.0.0" 755 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 756 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 757 | 758 | which@1.3.1: 759 | version "1.3.1" 760 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 761 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 762 | dependencies: 763 | isexe "^2.0.0" 764 | 765 | wide-align@1.1.3: 766 | version "1.1.3" 767 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 768 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 769 | dependencies: 770 | string-width "^1.0.2 || 2" 771 | 772 | wrap-ansi@^5.1.0: 773 | version "5.1.0" 774 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 775 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 776 | dependencies: 777 | ansi-styles "^3.2.0" 778 | string-width "^3.0.0" 779 | strip-ansi "^5.0.0" 780 | 781 | wrappy@1: 782 | version "1.0.2" 783 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 784 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 785 | 786 | y18n@^4.0.0: 787 | version "4.0.0" 788 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 789 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 790 | 791 | yargs-parser@13.1.1, yargs-parser@^13.1.1: 792 | version "13.1.1" 793 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" 794 | integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== 795 | dependencies: 796 | camelcase "^5.0.0" 797 | decamelize "^1.2.0" 798 | 799 | yargs-unparser@1.6.0: 800 | version "1.6.0" 801 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" 802 | integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== 803 | dependencies: 804 | flat "^4.1.0" 805 | lodash "^4.17.15" 806 | yargs "^13.3.0" 807 | 808 | yargs@13.3.0, yargs@^13.3.0: 809 | version "13.3.0" 810 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" 811 | integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== 812 | dependencies: 813 | cliui "^5.0.0" 814 | find-up "^3.0.0" 815 | get-caller-file "^2.0.1" 816 | require-directory "^2.1.1" 817 | require-main-filename "^2.0.0" 818 | set-blocking "^2.0.0" 819 | string-width "^3.0.0" 820 | which-module "^2.0.0" 821 | y18n "^4.0.0" 822 | yargs-parser "^13.1.1" 823 | --------------------------------------------------------------------------------