├── .gitignore ├── assets └── demo.png ├── .vscodeignore ├── .vscode ├── settings.json ├── launch.json └── tasks.json ├── README.md ├── src ├── log.ts ├── types.ts ├── extension.ts ├── utils.ts └── service.ts ├── LICENSE.md ├── CHANGELOG.md ├── tsconfig.json ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | out/ 2 | node_modules/ 3 | *.vsix 4 | -------------------------------------------------------------------------------- /assets/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sokra/vscode-inline-types/HEAD/assets/demo.png -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | src 3 | assets 4 | out/*.js.map 5 | tsconfig.json 6 | *.vsix 7 | CHANGELOG.md -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.exclude": { 3 | "**/node_modules": true, 4 | "**/package-lock.json": true 5 | }, 6 | "typescript.tsdk": "./node_modules/typescript/lib", 7 | "typescript.tsc.autoDetect": "off" 8 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vscode-inline-types 2 | 3 | A Visual Studio Code extension that will inline-render inferred types in TypeScript documents. 4 | 5 | ![Inline rendering in action](assets/demo.png) 6 | 7 | ## Install 8 | 9 | Inside VSCode, press `Ctrl+P`, and enter: 10 | 11 | ``` 12 | ext install ts-inline-types 13 | ``` 14 | 15 | [[Source](https://marketplace.visualstudio.com/items?itemName=sokra.ts-inline-types)] 16 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | // List of configurations. Add new configurations or edit existing ones. 4 | "configurations": [ 5 | { 6 | "name": "Launch Client", 7 | "type": "extensionHost", 8 | "request": "launch", 9 | "runtimeExecutable": "${execPath}", 10 | "args": [ 11 | "--extensionDevelopmentPath=${workspaceRoot}" 12 | ], 13 | "stopOnEntry": false, 14 | "sourceMaps": true, 15 | "outFiles": [ 16 | "${workspaceRoot}/out/**/*.js" 17 | ], 18 | "preLaunchTask": "watch" 19 | } 20 | ] 21 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "compile", 6 | "type": "npm", 7 | "script": "compile", 8 | "group": "build", 9 | "presentation": { 10 | "panel": "dedicated", 11 | "reveal": "never" 12 | }, 13 | "problemMatcher": [ 14 | "$tsc" 15 | ] 16 | }, 17 | { 18 | "label": "watch", 19 | "type": "npm", 20 | "script": "watch", 21 | "isBackground": true, 22 | "group": "build", 23 | "presentation": { 24 | "panel": "dedicated", 25 | "reveal": "never" 26 | }, 27 | "problemMatcher": [ 28 | "$tsc-watch" 29 | ] 30 | }, 31 | ] 32 | } -------------------------------------------------------------------------------- /src/log.ts: -------------------------------------------------------------------------------- 1 | import chalk from 'chalk'; 2 | 3 | function getTimestamp(): string { 4 | const date = new Date(); 5 | const hours = ('0' + date.getHours()).slice(-2); 6 | const minutes = ('0' + date.getMinutes()).slice(-2); 7 | const seconds = ('0' + date.getSeconds()).slice(-2); 8 | const milliSeconds = ('0000' + date.getMilliseconds()).slice(-4); 9 | return chalk.yellowBright(`[${hours}:${minutes}:${seconds}.${milliSeconds}]`); 10 | } 11 | 12 | function log(message: string, timestamped: boolean = true): void { 13 | const timestamp = timestamped ? `${getTimestamp()} ` : ''; 14 | console.log(`${timestamp}${message}`); 15 | } 16 | 17 | export function error(message: string): void { 18 | log(chalk.redBright(message)); 19 | } 20 | 21 | export function info(message: string): void { 22 | log(chalk.greenBright(message)); 23 | } 24 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Martin Johns 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 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | 3 | export interface Position { 4 | readonly line: number; 5 | readonly character: number; 6 | } 7 | 8 | export interface Decoration { 9 | readonly textBefore: string; 10 | readonly textAfter: string; 11 | readonly hoverMessage?: vscode.MarkdownString | vscode.MarkdownString[]; 12 | readonly startPosition: Position; 13 | readonly endPosition: Position; 14 | readonly isWarning: boolean; 15 | readonly isIncomplete: boolean; 16 | } 17 | 18 | export interface TextChange { 19 | readonly start: Position; 20 | readonly end: Position; 21 | readonly newText: string; 22 | } 23 | 24 | export type FileChangeType = 'Created' | 'Changed' | 'Deleted'; 25 | export const FileChangeTypes: { readonly [P in FileChangeType]: P } = { 26 | Created: 'Created', 27 | Changed: 'Changed', 28 | Deleted: 'Deleted' 29 | }; 30 | 31 | export interface Service { 32 | notifyDocumentChange(fileName: string, textChanges: ReadonlyArray): void; 33 | notifyFileChange(fileName: string, fileChangeType: FileChangeType): void; 34 | getDecorations(fileName: string): ReadonlyArray; 35 | isUpToDate(fileName: string): boolean; 36 | } 37 | 38 | export type FeatureType = 39 | | 'variableType' 40 | | 'functionVariableType' 41 | | 'functionReturnType' 42 | | 'functionParameterType' 43 | | 'propertyType' 44 | | 'objectPatternType' 45 | | 'arrayPatternType' 46 | | 'objectLiteralType' 47 | | 'parameterName' 48 | | 'highlightAny' 49 | | 'showIncompleteInfo' 50 | 51 | export interface Configuration { 52 | readonly features: { readonly [P in FeatureType]: boolean }; 53 | readonly updateDelay: number; 54 | readonly compileDelay: number; 55 | readonly lightThemeDecorationStyle: DecorationStyle; 56 | readonly darkThemeDecorationStyle: DecorationStyle; 57 | } 58 | 59 | export interface DecorationStyle { 60 | readonly opacity: number; 61 | readonly color: string; 62 | readonly warnColor: string; 63 | } 64 | 65 | export interface Disposable { 66 | dispose(): any; 67 | } 68 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | 6 | # [0.3.0](https://github.com/MartinJohns/vscode-inline-types/compare/v0.2.0...v0.3.0) (2018-07-03) 7 | 8 | 9 | ### Features 10 | 11 | * add configuration for styling the decorations ([650f728](https://github.com/MartinJohns/vscode-inline-types/commit/650f728)), closes [#14](https://github.com/MartinJohns/vscode-inline-types/issues/14) 12 | * don't add decoration for arrow function variables ([3eee520](https://github.com/MartinJohns/vscode-inline-types/commit/3eee520)), closes [#15](https://github.com/MartinJohns/vscode-inline-types/issues/15) 13 | * support paraterName for class constructor ([#11](https://github.com/MartinJohns/vscode-inline-types/issues/11)) ([93276ae](https://github.com/MartinJohns/vscode-inline-types/commit/93276ae)) 14 | * support tsx ([#19](https://github.com/MartinJohns/vscode-inline-types/issues/19)) ([955bf20](https://github.com/MartinJohns/vscode-inline-types/commit/955bf20)), closes [#13](https://github.com/MartinJohns/vscode-inline-types/issues/13) 15 | 16 | 17 | 18 | 19 | # [0.2.0](https://github.com/MartinJohns/vscode-inline-types/compare/v0.1.0...v0.2.0) (2018-04-08) 20 | 21 | 22 | ### Bug Fixes 23 | 24 | * don't omit module name of imported types ([11e2fd0](https://github.com/MartinJohns/vscode-inline-types/commit/11e2fd0)), closes [#2](https://github.com/MartinJohns/vscode-inline-types/issues/2) 25 | * fix missing return type decoration for methods ([89bcece](https://github.com/MartinJohns/vscode-inline-types/commit/89bcece)), closes [#10](https://github.com/MartinJohns/vscode-inline-types/issues/10) 26 | 27 | 28 | ### Features 29 | 30 | * add option to disable features using the configuration ([04d848a](https://github.com/MartinJohns/vscode-inline-types/commit/04d848a)), closes [#3](https://github.com/MartinJohns/vscode-inline-types/issues/3) 31 | * add option to introduce an update delay ([5ec2780](https://github.com/MartinJohns/vscode-inline-types/commit/5ec2780)), closes [#5](https://github.com/MartinJohns/vscode-inline-types/issues/5) 32 | * highlight inferred 'any' types with a warning color ([9e72be0](https://github.com/MartinJohns/vscode-inline-types/commit/9e72be0)), closes [#7](https://github.com/MartinJohns/vscode-inline-types/issues/7) 33 | * render parameter names on function calls ([cd7ec69](https://github.com/MartinJohns/vscode-inline-types/commit/cd7ec69)), closes [#1](https://github.com/MartinJohns/vscode-inline-types/issues/1) 34 | 35 | 36 | 37 | 38 | # 0.1.0 (2018-04-02) 39 | 40 | 41 | ### Features 42 | 43 | * initial commit ([c4836bc](https://github.com/MartinJohns/vscode-inline-types/commit/c4836bc)) 44 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ 5 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 6 | "lib": ["es2016"], /* Specify library files to be included in the compilation. */ 7 | // "allowJs": true, /* Allow javascript files to be compiled. */ 8 | // "checkJs": true, /* Report errors in .js files. */ 9 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 10 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 11 | "sourceMap": true, /* Generates corresponding '.map' file. */ 12 | // "outFile": "./", /* Concatenate and emit output to single file. */ 13 | "outDir": "./out/", /* Redirect output structure to the directory. */ 14 | "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 15 | // "removeComments": true, /* Do not emit comments to output. */ 16 | // "noEmit": true, /* Do not emit outputs. */ 17 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 18 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 19 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 20 | 21 | /* Strict Type-Checking Options */ 22 | "strict": true, /* Enable all strict type-checking options. */ 23 | "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 24 | "strictNullChecks": true, /* Enable strict null checks. */ 25 | "strictFunctionTypes": true, /* Enable strict checking of function types. */ 26 | "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 27 | "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 28 | "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 29 | 30 | /* Additional Checks */ 31 | "noUnusedLocals": true, /* Report errors on unused locals. */ 32 | "noUnusedParameters": true, /* Report errors on unused parameters. */ 33 | "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 34 | "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 35 | 36 | /* Module Resolution Options */ 37 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 38 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 39 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 40 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 41 | // "typeRoots": [], /* List of folders to include type definitions from. */ 42 | // "types": [], /* Type declaration files to be included in compilation. */ 43 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 44 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 45 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 46 | 47 | /* Source Map Options */ 48 | // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 49 | // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ 50 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 51 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 52 | 53 | /* Experimental Options */ 54 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 55 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 56 | }, 57 | "exclude": [ 58 | "node_modules" 59 | ] 60 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-inline-types", 3 | "description": "A Visual Studio Code extension to render inferred types in TypeScript/Javascript documents.", 4 | "author": "Martin Johns and Tobias Koppers", 5 | "license": "MIT", 6 | "version": "1.1.0", 7 | "publisher": "sokra", 8 | "engines": { 9 | "vscode": "^1.39.0" 10 | }, 11 | "activationEvents": [ 12 | "onLanguage:typescript", 13 | "onLanguage:javascript", 14 | "onLanguage:javascriptreact", 15 | "onLanguage:typescriptreact" 16 | ], 17 | "main": "./out/src/extension", 18 | "scripts": { 19 | "vscode:prepublish": "yarn clean && yarn compile", 20 | "clean": "rimraf out/ *.vsix", 21 | "compile": "tsc -p ./", 22 | "watch": "tsc -w -p ./", 23 | "update-vscode": "node ./node_modules/vscode/bin/install", 24 | "postinstall": "node ./node_modules/vscode/bin/install", 25 | "prerelease": "vsce package --yarn" 26 | }, 27 | "dependencies": { 28 | "chalk": "^3.0.0", 29 | "typescript": "^3.7.2" 30 | }, 31 | "devDependencies": { 32 | "@types/node": "^13.1.8", 33 | "rimraf": "^3.0.0", 34 | "vsce": "^1.69.0", 35 | "vscode": "^1.1.36" 36 | }, 37 | "repository": { 38 | "type": "git", 39 | "url": "https://github.com/sokra/vscode-inline-types" 40 | }, 41 | "contributes": { 42 | "configuration": { 43 | "type": "object", 44 | "title": "inline-types extension configuration", 45 | "properties": { 46 | "inlineTypes.features.variableType": { 47 | "type": "boolean", 48 | "default": true, 49 | "description": "Render the type of variables (unless they're functions)." 50 | }, 51 | "inlineTypes.features.functionVariableType": { 52 | "type": "boolean", 53 | "default": false, 54 | "description": "Render the type of variables even when they're functions." 55 | }, 56 | "inlineTypes.features.functionReturnType": { 57 | "type": "boolean", 58 | "default": true, 59 | "description": "Render the return type of functions." 60 | }, 61 | "inlineTypes.features.functionParameterType": { 62 | "type": "boolean", 63 | "default": true, 64 | "description": "Render the type of function parameters." 65 | }, 66 | "inlineTypes.features.propertyType": { 67 | "type": "boolean", 68 | "default": true, 69 | "description": "Render the type of properties." 70 | }, 71 | "inlineTypes.features.objectPatternType": { 72 | "type": "boolean", 73 | "default": true, 74 | "description": "Render the type of properties in object pattern." 75 | }, 76 | "inlineTypes.features.arrayPatternType": { 77 | "type": "boolean", 78 | "default": true, 79 | "description": "Render the type of items in array pattern." 80 | }, 81 | "inlineTypes.features.objectLiteralType": { 82 | "type": "boolean", 83 | "default": true, 84 | "description": "Render the type of items in object literals." 85 | }, 86 | "inlineTypes.features.parameterName": { 87 | "type": "boolean", 88 | "default": true, 89 | "description": "Render the names of parameters in function calls." 90 | }, 91 | "inlineTypes.features.highlightAny": { 92 | "type": "boolean", 93 | "default": true, 94 | "description": "Render an inferred 'any' type with a warning color." 95 | }, 96 | "inlineTypes.features.showIncompleteInfo": { 97 | "type": "boolean", 98 | "default": false, 99 | "description": "Render a '...' during type computation." 100 | }, 101 | "inlineTypes.updateDelay": { 102 | "type": "integer", 103 | "default": 50, 104 | "minimum": 0, 105 | "description": "A delay for propagating decoration updates to the editor in milliseconds." 106 | }, 107 | "inlineTypes.lightThemeDecorationStyle.opacity": { 108 | "type": "number", 109 | "description": "Opacity used for the decoration in light theme.", 110 | "default": 0.5 111 | }, 112 | "inlineTypes.lightThemeDecorationStyle.color": { 113 | "type": "string", 114 | "description": "The color used for the decoration in light theme.", 115 | "default": "black" 116 | }, 117 | "inlineTypes.lightThemeDecorationStyle.warnColor": { 118 | "type": "string", 119 | "description": "The color used for warning decorations in light theme.", 120 | "default": "#FF2400" 121 | }, 122 | "inlineTypes.darkThemeDecorationStyle.opacity": { 123 | "type": "number", 124 | "description": "Opacity used for the decoration in dark theme.", 125 | "default": 0.5 126 | }, 127 | "inlineTypes.darkThemeDecorationStyle.color": { 128 | "type": "string", 129 | "description": "The color used for the decoration in dark theme.", 130 | "default": "white" 131 | }, 132 | "inlineTypes.darkThemeDecorationStyle.warnColor": { 133 | "type": "string", 134 | "description": "The color used for warning decorations in dark theme.", 135 | "default": "#FF2400" 136 | } 137 | } 138 | } 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | 3 | import { error as logError } from './log'; 4 | import { createService } from './service'; 5 | import { FileChangeTypes, Decoration, TextChange, Position, Service, Configuration, Disposable } from './types'; 6 | 7 | export function activate(extensionContext: vscode.ExtensionContext): void { 8 | const rootPath = vscode.workspace.rootPath; 9 | if (!rootPath) { 10 | logError(`No root path found. Aborting.`); 11 | return; 12 | } 13 | 14 | const subscriptions: Disposable[] = []; 15 | function dispose(): void { 16 | let nextSubscription: Disposable | undefined; 17 | while ((nextSubscription = subscriptions.pop()) !== undefined) { 18 | nextSubscription.dispose(); 19 | } 20 | } 21 | extensionContext.subscriptions.push({ dispose }); 22 | 23 | createServiceForExtension(rootPath, subscriptions); 24 | extensionContext.subscriptions.push(vscode.workspace.onDidChangeConfiguration(e => { 25 | if (e.affectsConfiguration('inlineTypes')) { 26 | dispose(); 27 | createServiceForExtension(rootPath, subscriptions); 28 | } 29 | })); 30 | } 31 | 32 | function createServiceForExtension( 33 | rootPath: string, 34 | subscriptions: Disposable[] 35 | ): Service { 36 | const decorationType: vscode.TextEditorDecorationType = vscode.window.createTextEditorDecorationType({}); 37 | subscriptions.push(decorationType); 38 | 39 | const configuration: Configuration = mapConfiguration(vscode.workspace.getConfiguration('inlineTypes')); 40 | const service = createService( 41 | rootPath, 42 | configuration, 43 | () => updateDecorations(decorationType, service, configuration)); 44 | updateDecorations(decorationType, service, configuration); 45 | 46 | const fileWatcher = vscode.workspace.createFileSystemWatcher('{!node_modules,**}/*.{ts,js,tsx,jsx}'); 47 | fileWatcher.onDidCreate(e => service.notifyFileChange(normalizeFileName(e.fsPath), FileChangeTypes.Created)); 48 | fileWatcher.onDidChange(e => service.notifyFileChange(normalizeFileName(e.fsPath), FileChangeTypes.Changed)); 49 | fileWatcher.onDidDelete(e => service.notifyFileChange(normalizeFileName(e.fsPath), FileChangeTypes.Deleted)); 50 | subscriptions.push(fileWatcher); 51 | 52 | vscode.window.onDidChangeActiveTextEditor(() => updateDecorations(decorationType, service, configuration)); 53 | vscode.workspace.onDidChangeTextDocument(e => service.notifyDocumentChange( 54 | normalizeFileName(e.document.fileName), 55 | e.contentChanges.map(mapContentChange))); 56 | 57 | return service; 58 | } 59 | 60 | function mapConfiguration(configuration: vscode.WorkspaceConfiguration): Configuration { 61 | return { 62 | features: configuration.features, 63 | updateDelay: configuration.updateDelay, 64 | compileDelay: configuration.compileDelay, 65 | lightThemeDecorationStyle: configuration.lightThemeDecorationStyle, 66 | darkThemeDecorationStyle: configuration.darkThemeDecorationStyle 67 | }; 68 | } 69 | 70 | function updateDecorations( 71 | decorationType: vscode.TextEditorDecorationType, 72 | service: Service, 73 | configuration: Configuration 74 | ): void { 75 | let isSomethingIncomplete = false; 76 | const visibleTextEditors = vscode.window.visibleTextEditors.filter(isSupportedLanguage); 77 | for (const visibleTextEditor of visibleTextEditors) { 78 | const fileName = normalizeFileName(visibleTextEditor.document.fileName); 79 | if (service.isUpToDate(fileName)) { 80 | const decorations = service.getDecorations(fileName); 81 | const isIncomplete = decorations.some(d => d.isIncomplete); 82 | isSomethingIncomplete = isSomethingIncomplete || isIncomplete; 83 | if (configuration.features.showIncompleteInfo || !isIncomplete) { 84 | const decorationOptions: vscode.DecorationOptions[] = []; 85 | for (const d of decorations) { 86 | decorationOptions.push(...createDecorationOptions(d, configuration)); 87 | } 88 | visibleTextEditor.setDecorations(decorationType, decorationOptions); 89 | } 90 | } 91 | } 92 | if (isSomethingIncomplete) { 93 | setTimeout(() => updateDecorations(decorationType, service, configuration), configuration.updateDelay); 94 | } 95 | } 96 | 97 | function createDecorationOptions(decoration: Decoration, configuration: Configuration): vscode.DecorationOptions[] { 98 | const lightThemeTextDecoration = decoration.isWarning ? undefined : `none; opacity: ${configuration.lightThemeDecorationStyle.opacity}`; 99 | const darkThemeTextDecoration = decoration.isWarning ? undefined : `none; opacity: ${configuration.darkThemeDecorationStyle.opacity}`; 100 | const lightThemeColor = decoration.isWarning === true 101 | ? configuration.lightThemeDecorationStyle.warnColor 102 | : configuration.lightThemeDecorationStyle.color; 103 | const darkThemeColor = decoration.isWarning === true 104 | ? configuration.darkThemeDecorationStyle.warnColor 105 | : configuration.darkThemeDecorationStyle.color; 106 | const startPosition = mapServicePosition(decoration.startPosition); 107 | const endPosition = mapServicePosition(decoration.endPosition); 108 | const nextEndPosition = mapServicePosition(decoration.endPosition, 1); 109 | const decos: vscode.DecorationOptions[] = []; 110 | if (decoration.hoverMessage) { 111 | decos.push({ 112 | range: new vscode.Range(startPosition, endPosition), 113 | hoverMessage: decoration.hoverMessage 114 | }); 115 | } 116 | if (decoration.textBefore) { 117 | decos.push({ 118 | range: new vscode.Range(startPosition, endPosition), 119 | renderOptions: { 120 | light: { 121 | before: { contentText: decoration.textBefore, textDecoration: lightThemeTextDecoration, color: lightThemeColor }, 122 | }, 123 | dark: { 124 | before: { contentText: decoration.textBefore, textDecoration: darkThemeTextDecoration, color: darkThemeColor }, 125 | } 126 | } 127 | }); 128 | } 129 | if (decoration.textAfter) { 130 | decos.push({ 131 | range: new vscode.Range(endPosition, nextEndPosition), 132 | renderOptions: { 133 | light: { 134 | before: { contentText: decoration.textAfter, textDecoration: lightThemeTextDecoration, color: lightThemeColor }, 135 | }, 136 | dark: { 137 | before: { contentText: decoration.textAfter, textDecoration: darkThemeTextDecoration, color: darkThemeColor }, 138 | } 139 | } 140 | }); 141 | } 142 | return decos; 143 | } 144 | 145 | function mapContentChange(contentChange: vscode.TextDocumentContentChangeEvent): TextChange { 146 | return { 147 | start: contentChange.range.start, 148 | end: contentChange.range.end, 149 | newText: contentChange.text 150 | }; 151 | } 152 | 153 | function mapServicePosition(position: Position, offset: number = 0): vscode.Position { 154 | return new vscode.Position(position.line, position.character + offset); 155 | } 156 | 157 | function normalizeFileName(fileName: string): string { 158 | return fileName.replace(/\\/g, '/'); 159 | } 160 | 161 | const SUPPORTED_LANGUAGES = ['typescript', 'javascript', 'javascriptreact', 'typescriptreact']; 162 | 163 | function isSupportedLanguage(value: vscode.TextEditor): boolean { 164 | return SUPPORTED_LANGUAGES.includes(value.document.languageId); 165 | } 166 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | 3 | import * as log from './log'; 4 | 5 | export function assertNever(x: never): never { 6 | throw new Error(`Unexpected value: ${x}`); 7 | } 8 | 9 | export function isUndefined(value: T | undefined): value is undefined { 10 | return value === undefined; 11 | } 12 | 13 | export function throwError(message: string): never { 14 | log.error(message); 15 | throw new Error(message); 16 | } 17 | 18 | export function isRestParameter(parameter: ts.Symbol): boolean { 19 | return !!( 20 | parameter.valueDeclaration 21 | && ts.isParameter(parameter.valueDeclaration) 22 | && parameter.valueDeclaration.dotDotDotToken); 23 | } 24 | 25 | export function curry( func: (_1: T1) => TR, _1: T1): () => TR; 26 | export function curry( func: (_1: T1, _2: T2) => TR, _1: T1): (_2: T2) => TR; 27 | export function curry( func: (_1: T1, _2: T2, _3: T3) => TR, _1: T1): (_2: T2, _3: T3) => TR; 28 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4) => TR, _1: T1): (_2: T2, _3: T3, _4: T4) => TR; 29 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5) => TR, _1: T1): (_2: T2, _3: T3, _4: T4, _5: T5) => TR; 30 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6) => TR, _1: T1): (_2: T2, _3: T3, _4: T4, _5: T5, _6: T6) => TR; 31 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7) => TR, _1: T1): (_2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7) => TR; 32 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8) => TR, _1: T1): (_2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8) => TR; 33 | export function curry(func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR, _1: T1): (_2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR; 34 | export function curry( func: (_1: T1, _2: T2) => TR, _1: T1, _2: T2): () => TR; 35 | export function curry( func: (_1: T1, _2: T2, _3: T3) => TR, _1: T1, _2: T2): (_3: T3) => TR; 36 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4) => TR, _1: T1, _2: T2): (_3: T3, _4: T4) => TR; 37 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5) => TR, _1: T1, _2: T2): (_3: T3, _4: T4, _5: T5) => TR; 38 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6) => TR, _1: T1, _2: T2): (_3: T3, _4: T4, _5: T5, _6: T6) => TR; 39 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7) => TR, _1: T1, _2: T2): (_3: T3, _4: T4, _5: T5, _6: T6, _7: T7) => TR; 40 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8) => TR, _1: T1, _2: T2): (_3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8) => TR; 41 | export function curry(func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR, _1: T1, _2: T2): (_3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR; 42 | export function curry( func: (_1: T1, _2: T2, _3: T3) => TR, _1: T1, _2: T2, _3: T3): () => TR; 43 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4) => TR, _1: T1, _2: T2, _3: T3): (_4: T4) => TR; 44 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5) => TR, _1: T1, _2: T2, _3: T3): (_4: T4, _5: T5) => TR; 45 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6) => TR, _1: T1, _2: T2, _3: T3): (_4: T4, _5: T5, _6: T6) => TR; 46 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7) => TR, _1: T1, _2: T2, _3: T3): (_4: T4, _5: T5, _6: T6, _7: T7) => TR; 47 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8) => TR, _1: T1, _2: T2, _3: T3): (_4: T4, _5: T5, _6: T6, _7: T7, _8: T8) => TR; 48 | export function curry(func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR, _1: T1, _2: T2, _3: T3): (_4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR; 49 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4) => TR, _1: T1, _2: T2, _3: T3, _4: T4): () => TR; 50 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5) => TR, _1: T1, _2: T2, _3: T3, _4: T4): (_5: T5) => TR; 51 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6) => TR, _1: T1, _2: T2, _3: T3, _4: T4): (_5: T5, _6: T6) => TR; 52 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7) => TR, _1: T1, _2: T2, _3: T3, _4: T4): (_5: T5, _6: T6, _7: T7) => TR; 53 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8) => TR, _1: T1, _2: T2, _3: T3, _4: T4): (_5: T5, _6: T6, _7: T7, _8: T8) => TR; 54 | export function curry(func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR, _1: T1, _2: T2, _3: T3, _4: T4): (_5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR; 55 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5): () => TR; 56 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5): (_6: T6) => TR; 57 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5): (_6: T6, _7: T7) => TR; 58 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5): (_6: T6, _7: T7, _8: T8) => TR; 59 | export function curry(func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5): (_6: T6, _7: T7, _8: T8, _9: T9) => TR; 60 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6): () => TR; 61 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6): (_7: T7) => TR; 62 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6): (_7: T7, _8: T8) => TR; 63 | export function curry(func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6): (_7: T7, _8: T8, _9: T9) => TR; 64 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7): () => TR; 65 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7): (_8: T8) => TR; 66 | export function curry(func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7): (_8: T8, _9: T9) => TR; 67 | export function curry( func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8): () => TR; 68 | export function curry(func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8): (_9: T9) => TR; 69 | export function curry(func: (_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) => TR, _1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9): () => TR; 70 | export function curry(functor: Function, ...args: any[]) { 71 | return (...innerArgs: any[]) => functor(...args, ...innerArgs); 72 | } 73 | -------------------------------------------------------------------------------- /src/service.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | import * as vscode from 'vscode'; 3 | import { join as joinPath } from 'path'; 4 | 5 | import { throwError, isUndefined, assertNever, curry, isRestParameter } from './utils'; 6 | import { error as logError } from './log'; 7 | import { TextChange, Service, FileChangeType, FileChangeTypes, Decoration, Position, Configuration } from './types'; 8 | 9 | interface ServiceContext { 10 | readonly rootPath: string; 11 | readonly configuration: Configuration; 12 | readonly sourceFilesCache: Map; 13 | readonly updateProgram: () => void; 14 | readonly updateParsedCommandLine: () => void; 15 | readonly getCommittedSourceFilesCache: () => Map; 16 | readonly getProgram: () => ts.Program; 17 | readonly getParsedCommandLine: () => ts.ParsedCommandLine; 18 | readonly getOptions: () => ts.CompilerOptions; 19 | readonly getTypeChecker: () => ts.TypeChecker; 20 | readonly getRootFileNames: () => ReadonlyArray; 21 | } 22 | 23 | export function createService( 24 | rootPath: string, 25 | configuration: Configuration, 26 | onUpdate: () => void 27 | ): Service { 28 | const context = createServiceContext( 29 | rootPath, 30 | configuration, 31 | onUpdate); 32 | 33 | return { 34 | isUpToDate: curry(isUpToDate, context), 35 | getDecorations: curry(getDecorations, context), 36 | notifyFileChange: curry(notifyFileChange, context), 37 | notifyDocumentChange: curry(notifyDocumentChange, context) 38 | }; 39 | } 40 | 41 | function getDelayedOnUpdate(delay: number, onUpdate: () => void): () => void { 42 | if (delay === 0) { return onUpdate; } 43 | 44 | let updateTimeout: NodeJS.Timer | undefined = undefined; 45 | return () => { 46 | if (updateTimeout !== undefined) { 47 | clearTimeout(updateTimeout); 48 | } 49 | 50 | updateTimeout = setTimeout(onUpdate, delay); 51 | }; 52 | } 53 | 54 | function createServiceContext( 55 | rootPath: string, 56 | configuration: Configuration, 57 | onUpdate: () => void 58 | ): ServiceContext { 59 | const sourceFilesCache = new Map(); 60 | let committedSourceFilesCache = new Map(); 61 | let parsedCommandLine = getParsedCommandLine(rootPath); 62 | let program: ts.Program = createProgram(parsedCommandLine, committedSourceFilesCache, sourceFilesCache); 63 | const context: ServiceContext = { 64 | rootPath, 65 | configuration, 66 | sourceFilesCache, 67 | updateProgram: getDelayedOnUpdate( 68 | configuration.updateDelay, 69 | () => { 70 | committedSourceFilesCache = new Map(context.sourceFilesCache); 71 | program = createProgram(parsedCommandLine, committedSourceFilesCache, sourceFilesCache, program); 72 | onUpdate(); 73 | } 74 | ), 75 | updateParsedCommandLine: getDelayedOnUpdate(configuration.updateDelay, () => { 76 | parsedCommandLine = getParsedCommandLine(rootPath); 77 | context.updateProgram(); 78 | }), 79 | getParsedCommandLine: () => parsedCommandLine, 80 | getCommittedSourceFilesCache: () => committedSourceFilesCache, 81 | getProgram: () => program, 82 | getOptions: () => program.getCompilerOptions(), 83 | getTypeChecker: () => program.getTypeChecker(), 84 | getRootFileNames: () => program.getRootFileNames() 85 | }; 86 | return context; 87 | } 88 | 89 | function createProgram(parsedCommandLine: ts.ParsedCommandLine, committedSourceFilesCache: Map, sourceFilesCache: Map, oldProgram?: ts.Program): ts.Program { 90 | const { fileNames, options } = parsedCommandLine; 91 | const compilerHost = createCompilerHost(options, committedSourceFilesCache, sourceFilesCache); 92 | const program = ts.createProgram(fileNames, options, compilerHost, oldProgram); 93 | return program; 94 | } 95 | 96 | let queue: Set<() => void> | undefined = undefined; 97 | function queueWork(fn: () => void): void { 98 | if (queue === undefined) { 99 | queue = new Set([fn]); 100 | processQueue(); 101 | } else { 102 | queue.add(fn); 103 | } 104 | } 105 | 106 | function processQueue(): void { 107 | setTimeout(() => { 108 | if (queue === undefined) return; 109 | if (queue.size === 0) { 110 | queue = undefined; 111 | return; 112 | } 113 | const start = Date.now(); 114 | for (const item of queue) { 115 | item(); 116 | queue.delete(item); 117 | if (Date.now() - start > 100) { 118 | break; 119 | } 120 | } 121 | processQueue(); 122 | }, 0); 123 | } 124 | 125 | const INCOMPLETE_TYPE = Symbol("incomplete"); 126 | const INCOMPLETE_SIGNATURE = Symbol("incomplete"); 127 | const INCOMPLETE_TYPENAME = "..."; 128 | 129 | function createQueuedCacheMethod(fn: (typeChecker: ts.TypeChecker, value: T, ...args: Args) => R, incompleteResult: I, errorResult: E) { 130 | const outerCache = new WeakMap, 132 | inProgress: WeakSet 133 | }>(); 134 | 135 | function getEntry(typeChecker: ts.TypeChecker) { 136 | let entry = outerCache.get(typeChecker); 137 | if (entry !== undefined) return entry; 138 | const newEntry = { 139 | cache: new WeakMap(), 140 | inProgress: new WeakSet() 141 | } 142 | outerCache.set(typeChecker, newEntry); 143 | return newEntry; 144 | } 145 | 146 | return (typeChecker: ts.TypeChecker, value: T, ...args: Args): R | E | I => { 147 | if (typeof value === "object" && value !== null) { 148 | const { cache, inProgress } = getEntry(typeChecker); 149 | const cacheEntry: [R | E] | undefined = cache.get(value); 150 | if (cacheEntry !== undefined) return cacheEntry[0]; 151 | if (!inProgress.has(value)) { 152 | inProgress.add(value); 153 | queueWork(() => { 154 | try { 155 | cache!.set(value, [fn(typeChecker, value, ...args)]); 156 | } catch (e) { 157 | cache!.set(value, [errorResult]); 158 | } 159 | }); 160 | } 161 | return incompleteResult; 162 | } else { 163 | try { 164 | return fn(typeChecker, value, ...args); 165 | } catch (e) { 166 | return errorResult; 167 | } 168 | } 169 | } 170 | } 171 | 172 | const getTypeAtLocation = createQueuedCacheMethod((typeChecker: ts.TypeChecker, node: ts.Node) => typeChecker.getTypeAtLocation(node), INCOMPLETE_TYPE, null); 173 | const getReturnType = createQueuedCacheMethod( 174 | (_typeChecker: ts.TypeChecker, signature: ts.Signature | typeof INCOMPLETE_SIGNATURE) => signature === INCOMPLETE_SIGNATURE ? INCOMPLETE_TYPE : signature.getReturnType(), 175 | INCOMPLETE_TYPE, 176 | null 177 | ); 178 | const getResolvedSignature = createQueuedCacheMethod((typeChecker: ts.TypeChecker, node: ts.CallLikeExpression) => typeChecker.getResolvedSignature(node), INCOMPLETE_SIGNATURE, null); 179 | const getSignatureFromDeclaration = createQueuedCacheMethod((typeChecker: ts.TypeChecker, node: ts.SignatureDeclaration) => typeChecker.getSignatureFromDeclaration(node), INCOMPLETE_SIGNATURE, null); 180 | const getShortTypeName = createQueuedCacheMethod((typeChecker: ts.TypeChecker, type: ts.Type, enclosingDeclaration?: ts.Node) => typeChecker.typeToString( 181 | type, 182 | enclosingDeclaration, 183 | ts.TypeFormatFlags.WriteArrowStyleSignature | 184 | ts.TypeFormatFlags.UseAliasDefinedOutsideCurrentScope 185 | ), INCOMPLETE_TYPENAME, "ERROR"); 186 | const getLongTypeName = createQueuedCacheMethod( 187 | (typeChecker: ts.TypeChecker, type: ts.Type, enclosingDeclaration?: ts.Node) => typeChecker.typeToString( 188 | type, 189 | enclosingDeclaration, 190 | ts.TypeFormatFlags.UseFullyQualifiedType | 191 | ts.TypeFormatFlags.NoTruncation | 192 | ts.TypeFormatFlags.UseStructuralFallback | 193 | ts.TypeFormatFlags.AllowUniqueESSymbolType | 194 | ts.TypeFormatFlags.WriteArrowStyleSignature | 195 | ts.TypeFormatFlags.WriteTypeArgumentsOfSignature 196 | ).replace(/;(\s(?=\s*\}))?/g, ";\n"), 197 | INCOMPLETE_TYPENAME, 198 | "ERROR" 199 | ); 200 | 201 | 202 | function isUpToDate( 203 | context: ServiceContext, 204 | fileName: string 205 | ): boolean { 206 | const committedFile = context.getCommittedSourceFilesCache().get(fileName); 207 | const currentFile = context.sourceFilesCache.get(fileName) 208 | return committedFile === currentFile; 209 | } 210 | 211 | function getDecorations( 212 | context: ServiceContext, 213 | fileName: string 214 | ): ReadonlyArray { 215 | const sourceFile = context.getCommittedSourceFilesCache().get(fileName); 216 | if (!sourceFile) { 217 | logError(`Failed to find source file '${fileName}' in cache.`); 218 | return []; 219 | } 220 | 221 | const typeChecker = context.getTypeChecker(); 222 | const configuration = context.configuration; 223 | const result: Decoration[] = []; 224 | const skipTypes = new WeakSet(); 225 | aux(sourceFile); 226 | return result; 227 | 228 | function aux(node: ts.Node): void { 229 | node.forEachChild(aux); 230 | 231 | if (skipTypes.has(node)) return; 232 | 233 | try { 234 | if (ts.isVariableDeclaration(node) && !node.type) { 235 | const isFunction = node.initializer && ts.isFunctionLike(node.initializer); 236 | const shouldAddDecoration = isFunction 237 | ? context.configuration.features.functionVariableType 238 | : context.configuration.features.variableType; 239 | if (shouldAddDecoration) { 240 | result.push(getDecoration(sourceFile!, typeChecker, configuration, node.name)); 241 | } 242 | } else if (ts.isPropertySignature(node) && !node.type && context.configuration.features.propertyType) { 243 | result.push(getDecoration(sourceFile!, typeChecker, configuration, node.name)) 244 | } else if (ts.isParameter(node) && !node.type && context.configuration.features.functionParameterType) { 245 | result.push(getDecoration(sourceFile!, typeChecker, configuration, node.name)) 246 | } else if (ts.isFunctionDeclaration(node) && !node.type && context.configuration.features.functionReturnType) { 247 | const signature = getSignatureFromDeclaration(typeChecker, node); 248 | result.push(getDecoration(sourceFile!, typeChecker, configuration, node, node.body, signature && getReturnType(typeChecker, signature), false, false)); 249 | } else if (ts.isMethodDeclaration(node) && !node.type && context.configuration.features.functionReturnType) { 250 | const signature = getSignatureFromDeclaration(typeChecker, node); 251 | result.push(getDecoration(sourceFile!, typeChecker, configuration, node, node.body, signature && getReturnType(typeChecker, signature), false, false)); 252 | } else if (ts.isArrowFunction(node) && !node.type && context.configuration.features.functionReturnType) { 253 | const signature = getSignatureFromDeclaration(typeChecker, node); 254 | const returnsFunction = ts.isFunctionLike(node.body); 255 | if (!returnsFunction) { 256 | result.push(getDecoration(sourceFile!, typeChecker, configuration, node, node.equalsGreaterThanToken, signature && getReturnType(typeChecker, signature), node.parameters.length === 1, false)); 257 | } 258 | } else if (ts.isObjectBindingPattern(node) && context.configuration.features.objectPatternType) { 259 | node.forEachChild(child => { 260 | if (skipTypes.has(child)) return; 261 | if (ts.isBindingElement(child)) { 262 | result.push(getDecoration(sourceFile!, typeChecker, configuration, child)); 263 | } 264 | }); 265 | if (node.parent) skipTypes.add(node.parent); 266 | } else if (ts.isArrayBindingPattern(node) && context.configuration.features.arrayPatternType) { 267 | node.forEachChild(child => { 268 | if (skipTypes.has(child)) return; 269 | if (ts.isBindingElement(child)) { 270 | result.push(getDecoration(sourceFile!, typeChecker, configuration, child)); 271 | } 272 | }); 273 | if (node.parent) skipTypes.add(node.parent); 274 | } else if (ts.isObjectLiteralExpression(node) && context.configuration.features.objectLiteralType) { 275 | let current = node.parent; 276 | if (current && ts.isParenthesizedExpression(current)) 277 | current = current.parent; 278 | if (current && ts.isReturnStatement(current)) 279 | current = current.parent; 280 | while (current && ( 281 | ts.isBlock(current) || 282 | ts.isIfStatement(current) 283 | )) current = current.parent; 284 | if (current && ts.isFunctionLike(current)) { 285 | const signature = typeChecker.getSignatureFromDeclaration(current); 286 | if (signature) { 287 | const returnObject = getReturnType(typeChecker, signature); 288 | if (returnObject === INCOMPLETE_TYPE) { 289 | const startPosition = sourceFile!.getLineAndCharacterOfPosition(node.pos + node.getLeadingTriviaWidth()); 290 | const endPosition = sourceFile!.getLineAndCharacterOfPosition(node.end); 291 | result.push({ 292 | textBefore: '', 293 | textAfter: ': ...', 294 | startPosition, 295 | endPosition, 296 | isWarning: false, 297 | isIncomplete: true 298 | }); 299 | } else if (returnObject) { 300 | let numberOfTypes = 0; 301 | node.forEachChild(child => { 302 | if (( 303 | ts.isPropertyAssignment(child) || 304 | ts.isShorthandPropertyAssignment(child) 305 | ) && ts.isIdentifier(child.name)) { 306 | const symbol = returnObject.getProperty(child.name.text); 307 | if (symbol && symbol.valueDeclaration) { 308 | numberOfTypes++; 309 | const type = getTypeAtLocation(typeChecker, symbol.valueDeclaration); 310 | if (type) { 311 | result.push(getDecoration(sourceFile!, typeChecker, configuration, child.name, undefined, type)); 312 | } 313 | } 314 | } 315 | }); 316 | if (current && numberOfTypes > 0 && numberOfTypes === returnObject.getProperties().length) skipTypes.add(current); 317 | } 318 | } 319 | } 320 | } else if ((ts.isCallExpression(node) || ts.isNewExpression(node)) && node.arguments && node.arguments.length > 0 && context.configuration.features.parameterName) { 321 | const resolvedSignature = getResolvedSignature(typeChecker, node); 322 | 323 | if (resolvedSignature) { 324 | for (let i = 0; i < node.arguments.length; ++i) { 325 | const argument = node.arguments[i]; 326 | const startPosition = sourceFile!.getLineAndCharacterOfPosition(argument.pos + argument.getLeadingTriviaWidth()); 327 | const endPosition = sourceFile!.getLineAndCharacterOfPosition(argument.end); 328 | if (resolvedSignature === INCOMPLETE_SIGNATURE) { 329 | result.push({ 330 | textBefore: '...: ', 331 | textAfter: '', 332 | startPosition, 333 | endPosition, 334 | isWarning: false, 335 | isIncomplete: true 336 | }); 337 | } else { 338 | const parameter = resolvedSignature.parameters[i]; 339 | if (parameter) { 340 | const parameterName = (isRestParameter(parameter) ? '...' : '') + parameter.name; 341 | if (parameterName !== argument.getText()) { 342 | result.push({ 343 | textBefore: `${parameterName}: `, 344 | textAfter: '', 345 | startPosition, 346 | endPosition, 347 | isWarning: false, 348 | isIncomplete: false 349 | }); 350 | } 351 | } 352 | } 353 | } 354 | } 355 | } 356 | } catch (e) { 357 | logError(e.message); 358 | } 359 | } 360 | } 361 | 362 | function getDecoration( 363 | sourceFile: ts.SourceFile, 364 | typeChecker: ts.TypeChecker, 365 | configuration: Configuration, 366 | node: ts.Node, 367 | endNode: ts.Node | undefined = undefined, 368 | type: ts.Type | null | typeof INCOMPLETE_TYPE = getTypeAtLocation(typeChecker, node), 369 | wrap: boolean = false, 370 | hover: boolean = true 371 | ): Decoration { 372 | const leadingTriviaWidth = node.getLeadingTriviaWidth(); 373 | const startPosition = sourceFile.getLineAndCharacterOfPosition(node.pos + leadingTriviaWidth); 374 | const endPosition = sourceFile.getLineAndCharacterOfPosition(endNode ? endNode.pos : node.end); 375 | 376 | let typeName = INCOMPLETE_TYPENAME; 377 | let longTypeName = INCOMPLETE_TYPENAME; 378 | 379 | if (type === null) { 380 | typeName = "???"; 381 | longTypeName = "???"; 382 | } else if (type !== INCOMPLETE_TYPE) { 383 | typeName = getShortTypeName(typeChecker, type, node.parent); 384 | longTypeName = getLongTypeName(typeChecker, type, node.parent); 385 | } 386 | 387 | const textBefore = wrap ? '(' : ''; 388 | const textAfter = (wrap ? ')' : '') + ': ' + typeName; 389 | let hoverMessage = undefined; 390 | if (longTypeName !== typeName && hover) { 391 | hoverMessage = new vscode.MarkdownString(); 392 | hoverMessage.appendCodeblock(longTypeName, "typescript"); 393 | } 394 | const isWarning = configuration.features.highlightAny && /\bany\b/.test(typeName); 395 | const isIncomplete = typeName === INCOMPLETE_TYPENAME || longTypeName === INCOMPLETE_TYPENAME; 396 | 397 | return { textBefore, textAfter, hoverMessage, startPosition, endPosition, isWarning, isIncomplete }; 398 | } 399 | 400 | function notifyDocumentChange( 401 | context: ServiceContext, 402 | fileName: string, 403 | textChanges: ReadonlyArray 404 | ): void { 405 | const cachedSourceFile = context.sourceFilesCache.get(fileName); 406 | if (!cachedSourceFile) { 407 | logError(`Failed to find cached source file for '${fileName}'.`); 408 | return; 409 | } 410 | 411 | try { 412 | const newSourceFile = textChanges.reduce(updateSourceFile, cachedSourceFile); 413 | if (newSourceFile !== cachedSourceFile) { 414 | context.sourceFilesCache.set(fileName, newSourceFile); 415 | context.updateProgram(); 416 | } 417 | } catch (e) { 418 | logError(e.message); 419 | context.sourceFilesCache.delete(fileName); 420 | context.updateProgram(); 421 | } 422 | } 423 | 424 | function notifyFileChange( 425 | context: ServiceContext, 426 | fileName: string, 427 | fileChangeType: FileChangeType 428 | ): void { 429 | switch (fileChangeType) { 430 | case FileChangeTypes.Created: 431 | const isNewRootFile = context.getParsedCommandLine().fileNames.some(rootFile => rootFile === fileName); 432 | if (isNewRootFile) { 433 | context.updateParsedCommandLine(); 434 | } 435 | break; 436 | 437 | case FileChangeTypes.Deleted: 438 | const wasSourceFile = context.getRootFileNames().some(rootFile => rootFile === fileName); 439 | if (wasSourceFile) { 440 | context.sourceFilesCache.delete(fileName); 441 | context.updateProgram(); 442 | } 443 | break; 444 | 445 | case FileChangeTypes.Changed: 446 | const isSourceFile = context.getRootFileNames().some(rootFile => rootFile === fileName); 447 | if (isSourceFile) { 448 | updateCachedSourceFile(context, fileName); 449 | } 450 | if (fileName.endsWith("tsconfig.json")) { 451 | context.updateParsedCommandLine(); 452 | } 453 | break; 454 | 455 | default: 456 | throw assertNever(fileChangeType); 457 | } 458 | } 459 | 460 | function updateCachedSourceFile( 461 | context: ServiceContext, 462 | fileName: string 463 | ): void { 464 | const cachedSourceFile = context.sourceFilesCache.get(fileName); 465 | if (!cachedSourceFile) { 466 | return context.updateProgram(); 467 | } 468 | 469 | const fileContent = ts.sys.readFile(fileName, context.getProgram().getCompilerOptions().charset); 470 | if (fileContent === undefined) { 471 | logError(`Failed to read file content for '${fileName}'.`); 472 | return; 473 | } 474 | 475 | if (fileContent === cachedSourceFile.text) { 476 | return; 477 | } 478 | 479 | const newSourceFile = cachedSourceFile.update(fileContent, { 480 | newLength: fileContent.length, 481 | span: { start: 0, length: cachedSourceFile.text.length } 482 | }); 483 | context.sourceFilesCache.set(fileName, newSourceFile); 484 | return context.updateProgram(); 485 | } 486 | 487 | function getSourceFile( 488 | fileName: string, 489 | languageVersion: ts.ScriptTarget, 490 | shouldCreateNewSourceFile: boolean | undefined, 491 | options: ts.CompilerOptions, 492 | committedSourceFilesCache: Map, 493 | sourceFilesCache: Map 494 | ): ts.SourceFile | undefined { 495 | if (fileName === ts.getDefaultLibFileName(options)) { 496 | fileName = ts.getDefaultLibFilePath(options); 497 | } 498 | 499 | const cachedSourceFile = shouldCreateNewSourceFile ? undefined : committedSourceFilesCache.get(fileName); 500 | if (cachedSourceFile) { 501 | return cachedSourceFile; 502 | } 503 | 504 | const fileContent = ts.sys.readFile(fileName, options.charset); 505 | if (fileContent === undefined) { 506 | logError(`Failed to read file content for '${fileName}'.`); 507 | return undefined; 508 | } 509 | 510 | const sourceFile = ts.createSourceFile(fileName, fileContent, languageVersion); 511 | committedSourceFilesCache.set(fileName, sourceFile); 512 | sourceFilesCache.set(fileName, sourceFile); 513 | return sourceFile; 514 | } 515 | 516 | function createCompilerHost(options: ts.CompilerOptions, committedSourceFilesCache: Map, sourceFilesCache: Map): ts.CompilerHost { 517 | const defaultCompilerHost = ts.createCompilerHost(options); 518 | return { 519 | ...defaultCompilerHost, 520 | getSourceFile: (fileName, languageVersion, _, shouldCreateNewSourceFile) => 521 | getSourceFile(fileName, languageVersion, shouldCreateNewSourceFile, options, committedSourceFilesCache, sourceFilesCache) 522 | }; 523 | } 524 | 525 | function getParsedCommandLine(rootPath: string): ts.ParsedCommandLine { 526 | const configPath = joinPath(rootPath, 'tsconfig.json'); 527 | const configContent = ts.sys.readFile(configPath); 528 | if (!configContent) { 529 | throw throwError(`Failed to read config file.`); 530 | } 531 | 532 | const configJsonFile = ts.parseJsonText(configPath, configContent); 533 | const parsedConfig = ts.parseJsonSourceFileConfigFileContent(configJsonFile, ts.sys, rootPath, { noEmit: true }); 534 | if (!isUndefined(parsedConfig.errors) && parsedConfig.errors.length > 0) { 535 | throw throwError(`Failed to parse config file.`); 536 | } 537 | 538 | return parsedConfig; 539 | } 540 | 541 | function getOffsetInSourceFile(sourceFile: ts.SourceFile, position: Position): number { 542 | return sourceFile.getPositionOfLineAndCharacter( 543 | position.line, 544 | position.character); 545 | } 546 | 547 | function updateSourceFile(sourceFile: ts.SourceFile, textChange: TextChange) { 548 | const currentSource = sourceFile.getFullText(); 549 | const updateStartPosition = getOffsetInSourceFile(sourceFile, textChange.start); 550 | const updateEndPosition = getOffsetInSourceFile(sourceFile, textChange.end); 551 | const oldSourceBeforeChange = currentSource.slice(0, updateStartPosition); 552 | const oldSourceAfterChange = currentSource.slice(updateEndPosition); 553 | const newSource = oldSourceBeforeChange + textChange.newText + oldSourceAfterChange; 554 | const textChangeRange: ts.TextChangeRange = { 555 | span: { 556 | start: updateStartPosition, 557 | length: updateEndPosition - updateStartPosition 558 | }, 559 | newLength: textChange.newText.length 560 | }; 561 | return sourceFile.update(newSource, textChangeRange); 562 | } 563 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/color-name@^1.1.1": 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 8 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 9 | 10 | "@types/node@*", "@types/node@^13.1.8": 11 | version "13.1.8" 12 | resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.8.tgz#1d590429fe8187a02707720ecf38a6fe46ce294b" 13 | integrity sha512-6XzyyNM9EKQW4HKuzbo/CkOIjn/evtCmsU+MUM1xDfJ+3/rNjBttM1NgN7AOQvN6tP1Sl1D1PIKMreTArnxM9A== 14 | 15 | agent-base@4, agent-base@^4.3.0: 16 | version "4.3.0" 17 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" 18 | integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== 19 | dependencies: 20 | es6-promisify "^5.0.0" 21 | 22 | ajv@^6.5.5: 23 | version "6.11.0" 24 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" 25 | integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== 26 | dependencies: 27 | fast-deep-equal "^3.1.1" 28 | fast-json-stable-stringify "^2.0.0" 29 | json-schema-traverse "^0.4.1" 30 | uri-js "^4.2.2" 31 | 32 | ansi-styles@^3.2.1: 33 | version "3.2.1" 34 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 35 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 36 | dependencies: 37 | color-convert "^1.9.0" 38 | 39 | ansi-styles@^4.1.0: 40 | version "4.2.1" 41 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 42 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 43 | dependencies: 44 | "@types/color-name" "^1.1.1" 45 | color-convert "^2.0.1" 46 | 47 | argparse@^1.0.7: 48 | version "1.0.10" 49 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 50 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 51 | dependencies: 52 | sprintf-js "~1.0.2" 53 | 54 | asn1@~0.2.3: 55 | version "0.2.4" 56 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 57 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 58 | dependencies: 59 | safer-buffer "~2.1.0" 60 | 61 | assert-plus@1.0.0, assert-plus@^1.0.0: 62 | version "1.0.0" 63 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 64 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 65 | 66 | asynckit@^0.4.0: 67 | version "0.4.0" 68 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 69 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 70 | 71 | aws-sign2@~0.7.0: 72 | version "0.7.0" 73 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 74 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 75 | 76 | aws4@^1.8.0: 77 | version "1.9.1" 78 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" 79 | integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== 80 | 81 | azure-devops-node-api@^7.2.0: 82 | version "7.2.0" 83 | resolved "https://registry.yarnpkg.com/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz#131d4e01cf12ebc6e45569b5e0c5c249e4114d6d" 84 | integrity sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w== 85 | dependencies: 86 | os "0.1.1" 87 | tunnel "0.0.4" 88 | typed-rest-client "1.2.0" 89 | underscore "1.8.3" 90 | 91 | balanced-match@^1.0.0: 92 | version "1.0.0" 93 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 94 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 95 | 96 | bcrypt-pbkdf@^1.0.0: 97 | version "1.0.2" 98 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 99 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 100 | dependencies: 101 | tweetnacl "^0.14.3" 102 | 103 | boolbase@~1.0.0: 104 | version "1.0.0" 105 | resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 106 | integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= 107 | 108 | brace-expansion@^1.1.7: 109 | version "1.1.11" 110 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 111 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 112 | dependencies: 113 | balanced-match "^1.0.0" 114 | concat-map "0.0.1" 115 | 116 | browser-stdout@1.3.1: 117 | version "1.3.1" 118 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 119 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 120 | 121 | buffer-crc32@~0.2.3: 122 | version "0.2.13" 123 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 124 | integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 125 | 126 | buffer-from@^1.0.0: 127 | version "1.1.1" 128 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 129 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 130 | 131 | caseless@~0.12.0: 132 | version "0.12.0" 133 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 134 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 135 | 136 | chalk@^2.4.2: 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 | chalk@^3.0.0: 146 | version "3.0.0" 147 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 148 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 149 | dependencies: 150 | ansi-styles "^4.1.0" 151 | supports-color "^7.1.0" 152 | 153 | cheerio@^1.0.0-rc.1: 154 | version "1.0.0-rc.3" 155 | resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" 156 | integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== 157 | dependencies: 158 | css-select "~1.2.0" 159 | dom-serializer "~0.1.1" 160 | entities "~1.1.1" 161 | htmlparser2 "^3.9.1" 162 | lodash "^4.15.0" 163 | parse5 "^3.0.1" 164 | 165 | color-convert@^1.9.0: 166 | version "1.9.3" 167 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 168 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 169 | dependencies: 170 | color-name "1.1.3" 171 | 172 | color-convert@^2.0.1: 173 | version "2.0.1" 174 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 175 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 176 | dependencies: 177 | color-name "~1.1.4" 178 | 179 | color-name@1.1.3: 180 | version "1.1.3" 181 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 182 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 183 | 184 | color-name@~1.1.4: 185 | version "1.1.4" 186 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 187 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 188 | 189 | combined-stream@^1.0.6, combined-stream@~1.0.6: 190 | version "1.0.8" 191 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 192 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 193 | dependencies: 194 | delayed-stream "~1.0.0" 195 | 196 | commander@2.15.1: 197 | version "2.15.1" 198 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" 199 | integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== 200 | 201 | commander@^2.8.1: 202 | version "2.20.3" 203 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 204 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 205 | 206 | concat-map@0.0.1: 207 | version "0.0.1" 208 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 209 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 210 | 211 | core-util-is@1.0.2: 212 | version "1.0.2" 213 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 214 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 215 | 216 | css-select@~1.2.0: 217 | version "1.2.0" 218 | resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" 219 | integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= 220 | dependencies: 221 | boolbase "~1.0.0" 222 | css-what "2.1" 223 | domutils "1.5.1" 224 | nth-check "~1.0.1" 225 | 226 | css-what@2.1: 227 | version "2.1.3" 228 | resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" 229 | integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== 230 | 231 | dashdash@^1.12.0: 232 | version "1.14.1" 233 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 234 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 235 | dependencies: 236 | assert-plus "^1.0.0" 237 | 238 | debug@3.1.0: 239 | version "3.1.0" 240 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 241 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 242 | dependencies: 243 | ms "2.0.0" 244 | 245 | debug@^3.1.0: 246 | version "3.2.6" 247 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 248 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 249 | dependencies: 250 | ms "^2.1.1" 251 | 252 | delayed-stream@~1.0.0: 253 | version "1.0.0" 254 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 255 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 256 | 257 | denodeify@^1.2.1: 258 | version "1.2.1" 259 | resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" 260 | integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE= 261 | 262 | didyoumean@^1.2.1: 263 | version "1.2.1" 264 | resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.1.tgz#e92edfdada6537d484d73c0172fd1eba0c4976ff" 265 | integrity sha1-6S7f2tplN9SE1zwBcv0eugxJdv8= 266 | 267 | diff@3.5.0: 268 | version "3.5.0" 269 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 270 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 271 | 272 | dom-serializer@0: 273 | version "0.2.2" 274 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" 275 | integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== 276 | dependencies: 277 | domelementtype "^2.0.1" 278 | entities "^2.0.0" 279 | 280 | dom-serializer@~0.1.1: 281 | version "0.1.1" 282 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" 283 | integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== 284 | dependencies: 285 | domelementtype "^1.3.0" 286 | entities "^1.1.1" 287 | 288 | domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: 289 | version "1.3.1" 290 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" 291 | integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== 292 | 293 | domelementtype@^2.0.1: 294 | version "2.0.1" 295 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" 296 | integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== 297 | 298 | domhandler@^2.3.0: 299 | version "2.4.2" 300 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" 301 | integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== 302 | dependencies: 303 | domelementtype "1" 304 | 305 | domutils@1.5.1: 306 | version "1.5.1" 307 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" 308 | integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= 309 | dependencies: 310 | dom-serializer "0" 311 | domelementtype "1" 312 | 313 | domutils@^1.5.1: 314 | version "1.7.0" 315 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" 316 | integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== 317 | dependencies: 318 | dom-serializer "0" 319 | domelementtype "1" 320 | 321 | ecc-jsbn@~0.1.1: 322 | version "0.1.2" 323 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 324 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 325 | dependencies: 326 | jsbn "~0.1.0" 327 | safer-buffer "^2.1.0" 328 | 329 | entities@^1.1.1, entities@~1.1.1: 330 | version "1.1.2" 331 | resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" 332 | integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== 333 | 334 | entities@^2.0.0: 335 | version "2.0.0" 336 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" 337 | integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== 338 | 339 | es6-promise@^4.0.3: 340 | version "4.2.8" 341 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" 342 | integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== 343 | 344 | es6-promisify@^5.0.0: 345 | version "5.0.0" 346 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 347 | integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= 348 | dependencies: 349 | es6-promise "^4.0.3" 350 | 351 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 352 | version "1.0.5" 353 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 354 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 355 | 356 | extend@~3.0.2: 357 | version "3.0.2" 358 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 359 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 360 | 361 | extsprintf@1.3.0: 362 | version "1.3.0" 363 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 364 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 365 | 366 | extsprintf@^1.2.0: 367 | version "1.4.0" 368 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 369 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 370 | 371 | fast-deep-equal@^3.1.1: 372 | version "3.1.1" 373 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" 374 | integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== 375 | 376 | fast-json-stable-stringify@^2.0.0: 377 | version "2.1.0" 378 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 379 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 380 | 381 | fd-slicer@~1.1.0: 382 | version "1.1.0" 383 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" 384 | integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= 385 | dependencies: 386 | pend "~1.2.0" 387 | 388 | forever-agent@~0.6.1: 389 | version "0.6.1" 390 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 391 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 392 | 393 | form-data@~2.3.2: 394 | version "2.3.3" 395 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 396 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 397 | dependencies: 398 | asynckit "^0.4.0" 399 | combined-stream "^1.0.6" 400 | mime-types "^2.1.12" 401 | 402 | fs.realpath@^1.0.0: 403 | version "1.0.0" 404 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 405 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 406 | 407 | getpass@^0.1.1: 408 | version "0.1.7" 409 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 410 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 411 | dependencies: 412 | assert-plus "^1.0.0" 413 | 414 | glob@7.1.2: 415 | version "7.1.2" 416 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 417 | integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== 418 | dependencies: 419 | fs.realpath "^1.0.0" 420 | inflight "^1.0.4" 421 | inherits "2" 422 | minimatch "^3.0.4" 423 | once "^1.3.0" 424 | path-is-absolute "^1.0.0" 425 | 426 | glob@^7.0.6, glob@^7.1.2, glob@^7.1.3: 427 | version "7.1.6" 428 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 429 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 430 | dependencies: 431 | fs.realpath "^1.0.0" 432 | inflight "^1.0.4" 433 | inherits "2" 434 | minimatch "^3.0.4" 435 | once "^1.3.0" 436 | path-is-absolute "^1.0.0" 437 | 438 | growl@1.10.5: 439 | version "1.10.5" 440 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 441 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 442 | 443 | har-schema@^2.0.0: 444 | version "2.0.0" 445 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 446 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 447 | 448 | har-validator@~5.1.0: 449 | version "5.1.3" 450 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 451 | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 452 | dependencies: 453 | ajv "^6.5.5" 454 | har-schema "^2.0.0" 455 | 456 | has-flag@^3.0.0: 457 | version "3.0.0" 458 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 459 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 460 | 461 | has-flag@^4.0.0: 462 | version "4.0.0" 463 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 464 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 465 | 466 | he@1.1.1: 467 | version "1.1.1" 468 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 469 | integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= 470 | 471 | htmlparser2@^3.9.1: 472 | version "3.10.1" 473 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" 474 | integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== 475 | dependencies: 476 | domelementtype "^1.3.1" 477 | domhandler "^2.3.0" 478 | domutils "^1.5.1" 479 | entities "^1.1.1" 480 | inherits "^2.0.1" 481 | readable-stream "^3.1.1" 482 | 483 | http-proxy-agent@^2.1.0: 484 | version "2.1.0" 485 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" 486 | integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== 487 | dependencies: 488 | agent-base "4" 489 | debug "3.1.0" 490 | 491 | http-signature@~1.2.0: 492 | version "1.2.0" 493 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 494 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 495 | dependencies: 496 | assert-plus "^1.0.0" 497 | jsprim "^1.2.2" 498 | sshpk "^1.7.0" 499 | 500 | https-proxy-agent@^2.2.1: 501 | version "2.2.4" 502 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" 503 | integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== 504 | dependencies: 505 | agent-base "^4.3.0" 506 | debug "^3.1.0" 507 | 508 | inflight@^1.0.4: 509 | version "1.0.6" 510 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 511 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 512 | dependencies: 513 | once "^1.3.0" 514 | wrappy "1" 515 | 516 | inherits@2, inherits@^2.0.1, inherits@^2.0.3: 517 | version "2.0.4" 518 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 519 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 520 | 521 | is-typedarray@~1.0.0: 522 | version "1.0.0" 523 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 524 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 525 | 526 | isstream@~0.1.2: 527 | version "0.1.2" 528 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 529 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 530 | 531 | jsbn@~0.1.0: 532 | version "0.1.1" 533 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 534 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 535 | 536 | json-schema-traverse@^0.4.1: 537 | version "0.4.1" 538 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 539 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 540 | 541 | json-schema@0.2.3: 542 | version "0.2.3" 543 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 544 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 545 | 546 | json-stringify-safe@~5.0.1: 547 | version "5.0.1" 548 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 549 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 550 | 551 | jsprim@^1.2.2: 552 | version "1.4.1" 553 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 554 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 555 | dependencies: 556 | assert-plus "1.0.0" 557 | extsprintf "1.3.0" 558 | json-schema "0.2.3" 559 | verror "1.10.0" 560 | 561 | linkify-it@^2.0.0: 562 | version "2.2.0" 563 | resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" 564 | integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== 565 | dependencies: 566 | uc.micro "^1.0.1" 567 | 568 | lodash@^4.15.0, lodash@^4.17.10: 569 | version "4.17.15" 570 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 571 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 572 | 573 | markdown-it@^8.3.1: 574 | version "8.4.2" 575 | resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" 576 | integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== 577 | dependencies: 578 | argparse "^1.0.7" 579 | entities "~1.1.1" 580 | linkify-it "^2.0.0" 581 | mdurl "^1.0.1" 582 | uc.micro "^1.0.5" 583 | 584 | mdurl@^1.0.1: 585 | version "1.0.1" 586 | resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" 587 | integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= 588 | 589 | mime-db@1.43.0: 590 | version "1.43.0" 591 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" 592 | integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== 593 | 594 | mime-types@^2.1.12, mime-types@~2.1.19: 595 | version "2.1.26" 596 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" 597 | integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== 598 | dependencies: 599 | mime-db "1.43.0" 600 | 601 | mime@^1.3.4: 602 | version "1.6.0" 603 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 604 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 605 | 606 | minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: 607 | version "3.0.4" 608 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 609 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 610 | dependencies: 611 | brace-expansion "^1.1.7" 612 | 613 | minimist@0.0.8: 614 | version "0.0.8" 615 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 616 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 617 | 618 | mkdirp@0.5.1: 619 | version "0.5.1" 620 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 621 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 622 | dependencies: 623 | minimist "0.0.8" 624 | 625 | mocha@^5.2.0: 626 | version "5.2.0" 627 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" 628 | integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== 629 | dependencies: 630 | browser-stdout "1.3.1" 631 | commander "2.15.1" 632 | debug "3.1.0" 633 | diff "3.5.0" 634 | escape-string-regexp "1.0.5" 635 | glob "7.1.2" 636 | growl "1.10.5" 637 | he "1.1.1" 638 | minimatch "3.0.4" 639 | mkdirp "0.5.1" 640 | supports-color "5.4.0" 641 | 642 | ms@2.0.0: 643 | version "2.0.0" 644 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 645 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 646 | 647 | ms@^2.1.1: 648 | version "2.1.2" 649 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 650 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 651 | 652 | mute-stream@~0.0.4: 653 | version "0.0.8" 654 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 655 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 656 | 657 | nth-check@~1.0.1: 658 | version "1.0.2" 659 | resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" 660 | integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== 661 | dependencies: 662 | boolbase "~1.0.0" 663 | 664 | oauth-sign@~0.9.0: 665 | version "0.9.0" 666 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 667 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 668 | 669 | once@^1.3.0: 670 | version "1.4.0" 671 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 672 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 673 | dependencies: 674 | wrappy "1" 675 | 676 | os-homedir@^1.0.0: 677 | version "1.0.2" 678 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 679 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 680 | 681 | os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: 682 | version "1.0.2" 683 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 684 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 685 | 686 | os@0.1.1: 687 | version "0.1.1" 688 | resolved "https://registry.yarnpkg.com/os/-/os-0.1.1.tgz#208845e89e193ad4d971474b93947736a56d13f3" 689 | integrity sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M= 690 | 691 | osenv@^0.1.3: 692 | version "0.1.5" 693 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 694 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 695 | dependencies: 696 | os-homedir "^1.0.0" 697 | os-tmpdir "^1.0.0" 698 | 699 | parse-semver@^1.1.1: 700 | version "1.1.1" 701 | resolved "https://registry.yarnpkg.com/parse-semver/-/parse-semver-1.1.1.tgz#9a4afd6df063dc4826f93fba4a99cf223f666cb8" 702 | integrity sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg= 703 | dependencies: 704 | semver "^5.1.0" 705 | 706 | parse5@^3.0.1: 707 | version "3.0.3" 708 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" 709 | integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== 710 | dependencies: 711 | "@types/node" "*" 712 | 713 | path-is-absolute@^1.0.0: 714 | version "1.0.1" 715 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 716 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 717 | 718 | pend@~1.2.0: 719 | version "1.2.0" 720 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 721 | integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= 722 | 723 | performance-now@^2.1.0: 724 | version "2.1.0" 725 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 726 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 727 | 728 | psl@^1.1.24: 729 | version "1.7.0" 730 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" 731 | integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== 732 | 733 | punycode@^1.4.1: 734 | version "1.4.1" 735 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 736 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 737 | 738 | punycode@^2.1.0: 739 | version "2.1.1" 740 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 741 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 742 | 743 | qs@~6.5.2: 744 | version "6.5.2" 745 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 746 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 747 | 748 | querystringify@^2.1.1: 749 | version "2.1.1" 750 | resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" 751 | integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== 752 | 753 | read@^1.0.7: 754 | version "1.0.7" 755 | resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" 756 | integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= 757 | dependencies: 758 | mute-stream "~0.0.4" 759 | 760 | readable-stream@^3.1.1: 761 | version "3.5.0" 762 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606" 763 | integrity sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA== 764 | dependencies: 765 | inherits "^2.0.3" 766 | string_decoder "^1.1.1" 767 | util-deprecate "^1.0.1" 768 | 769 | request@^2.88.0: 770 | version "2.88.0" 771 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 772 | integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== 773 | dependencies: 774 | aws-sign2 "~0.7.0" 775 | aws4 "^1.8.0" 776 | caseless "~0.12.0" 777 | combined-stream "~1.0.6" 778 | extend "~3.0.2" 779 | forever-agent "~0.6.1" 780 | form-data "~2.3.2" 781 | har-validator "~5.1.0" 782 | http-signature "~1.2.0" 783 | is-typedarray "~1.0.0" 784 | isstream "~0.1.2" 785 | json-stringify-safe "~5.0.1" 786 | mime-types "~2.1.19" 787 | oauth-sign "~0.9.0" 788 | performance-now "^2.1.0" 789 | qs "~6.5.2" 790 | safe-buffer "^5.1.2" 791 | tough-cookie "~2.4.3" 792 | tunnel-agent "^0.6.0" 793 | uuid "^3.3.2" 794 | 795 | requires-port@^1.0.0: 796 | version "1.0.0" 797 | resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" 798 | integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= 799 | 800 | rimraf@^3.0.0: 801 | version "3.0.0" 802 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" 803 | integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== 804 | dependencies: 805 | glob "^7.1.3" 806 | 807 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: 808 | version "5.2.0" 809 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 810 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 811 | 812 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 813 | version "2.1.2" 814 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 815 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 816 | 817 | semver@^5.1.0, semver@^5.4.1: 818 | version "5.7.1" 819 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 820 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 821 | 822 | source-map-support@^0.5.0: 823 | version "0.5.16" 824 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" 825 | integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== 826 | dependencies: 827 | buffer-from "^1.0.0" 828 | source-map "^0.6.0" 829 | 830 | source-map@^0.6.0: 831 | version "0.6.1" 832 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 833 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 834 | 835 | sprintf-js@~1.0.2: 836 | version "1.0.3" 837 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 838 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 839 | 840 | sshpk@^1.7.0: 841 | version "1.16.1" 842 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 843 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 844 | dependencies: 845 | asn1 "~0.2.3" 846 | assert-plus "^1.0.0" 847 | bcrypt-pbkdf "^1.0.0" 848 | dashdash "^1.12.0" 849 | ecc-jsbn "~0.1.1" 850 | getpass "^0.1.1" 851 | jsbn "~0.1.0" 852 | safer-buffer "^2.0.2" 853 | tweetnacl "~0.14.0" 854 | 855 | string_decoder@^1.1.1: 856 | version "1.3.0" 857 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 858 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 859 | dependencies: 860 | safe-buffer "~5.2.0" 861 | 862 | supports-color@5.4.0: 863 | version "5.4.0" 864 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 865 | integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== 866 | dependencies: 867 | has-flag "^3.0.0" 868 | 869 | supports-color@^5.3.0: 870 | version "5.5.0" 871 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 872 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 873 | dependencies: 874 | has-flag "^3.0.0" 875 | 876 | supports-color@^7.1.0: 877 | version "7.1.0" 878 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 879 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 880 | dependencies: 881 | has-flag "^4.0.0" 882 | 883 | tmp@0.0.29: 884 | version "0.0.29" 885 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" 886 | integrity sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA= 887 | dependencies: 888 | os-tmpdir "~1.0.1" 889 | 890 | tough-cookie@~2.4.3: 891 | version "2.4.3" 892 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 893 | integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== 894 | dependencies: 895 | psl "^1.1.24" 896 | punycode "^1.4.1" 897 | 898 | tunnel-agent@^0.6.0: 899 | version "0.6.0" 900 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 901 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 902 | dependencies: 903 | safe-buffer "^5.0.1" 904 | 905 | tunnel@0.0.4: 906 | version "0.0.4" 907 | resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.4.tgz#2d3785a158c174c9a16dc2c046ec5fc5f1742213" 908 | integrity sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM= 909 | 910 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 911 | version "0.14.5" 912 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 913 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 914 | 915 | typed-rest-client@1.2.0: 916 | version "1.2.0" 917 | resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.2.0.tgz#723085d203f38d7d147271e5ed3a75488eb44a02" 918 | integrity sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw== 919 | dependencies: 920 | tunnel "0.0.4" 921 | underscore "1.8.3" 922 | 923 | typescript@^3.7.2: 924 | version "3.7.5" 925 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" 926 | integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== 927 | 928 | uc.micro@^1.0.1, uc.micro@^1.0.5: 929 | version "1.0.6" 930 | resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" 931 | integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== 932 | 933 | underscore@1.8.3: 934 | version "1.8.3" 935 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" 936 | integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= 937 | 938 | uri-js@^4.2.2: 939 | version "4.2.2" 940 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 941 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 942 | dependencies: 943 | punycode "^2.1.0" 944 | 945 | url-join@^1.1.0: 946 | version "1.1.0" 947 | resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78" 948 | integrity sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg= 949 | 950 | url-parse@^1.4.4: 951 | version "1.4.7" 952 | resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" 953 | integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== 954 | dependencies: 955 | querystringify "^2.1.1" 956 | requires-port "^1.0.0" 957 | 958 | util-deprecate@^1.0.1: 959 | version "1.0.2" 960 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 961 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 962 | 963 | uuid@^3.3.2: 964 | version "3.4.0" 965 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 966 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 967 | 968 | verror@1.10.0: 969 | version "1.10.0" 970 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 971 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 972 | dependencies: 973 | assert-plus "^1.0.0" 974 | core-util-is "1.0.2" 975 | extsprintf "^1.2.0" 976 | 977 | vsce@^1.69.0: 978 | version "1.71.0" 979 | resolved "https://registry.yarnpkg.com/vsce/-/vsce-1.71.0.tgz#3018cbea9e4dff4aeae86a09c3416e45b46bb6b3" 980 | integrity sha512-7k+LPC4oJYPyyxs0a5nh4A8CleQ6+2EMPiAiX/bDyN+PmwJFm2FFPqLRxdIsIWfFnkW4ZMQBf10+W62dCRd9kQ== 981 | dependencies: 982 | azure-devops-node-api "^7.2.0" 983 | chalk "^2.4.2" 984 | cheerio "^1.0.0-rc.1" 985 | commander "^2.8.1" 986 | denodeify "^1.2.1" 987 | didyoumean "^1.2.1" 988 | glob "^7.0.6" 989 | lodash "^4.17.10" 990 | markdown-it "^8.3.1" 991 | mime "^1.3.4" 992 | minimatch "^3.0.3" 993 | osenv "^0.1.3" 994 | parse-semver "^1.1.1" 995 | read "^1.0.7" 996 | semver "^5.1.0" 997 | tmp "0.0.29" 998 | typed-rest-client "1.2.0" 999 | url-join "^1.1.0" 1000 | yauzl "^2.3.1" 1001 | yazl "^2.2.2" 1002 | 1003 | vscode-test@^0.4.1: 1004 | version "0.4.3" 1005 | resolved "https://registry.yarnpkg.com/vscode-test/-/vscode-test-0.4.3.tgz#461ebf25fc4bc93d77d982aed556658a2e2b90b8" 1006 | integrity sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w== 1007 | dependencies: 1008 | http-proxy-agent "^2.1.0" 1009 | https-proxy-agent "^2.2.1" 1010 | 1011 | vscode@^1.1.36: 1012 | version "1.1.36" 1013 | resolved "https://registry.yarnpkg.com/vscode/-/vscode-1.1.36.tgz#5e1a0d1bf4977d0c7bc5159a9a13d5b104d4b1b6" 1014 | integrity sha512-cGFh9jmGLcTapCpPCKvn8aG/j9zVQ+0x5hzYJq5h5YyUXVGa1iamOaB2M2PZXoumQPES4qeAP1FwkI0b6tL4bQ== 1015 | dependencies: 1016 | glob "^7.1.2" 1017 | mocha "^5.2.0" 1018 | request "^2.88.0" 1019 | semver "^5.4.1" 1020 | source-map-support "^0.5.0" 1021 | url-parse "^1.4.4" 1022 | vscode-test "^0.4.1" 1023 | 1024 | wrappy@1: 1025 | version "1.0.2" 1026 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1027 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1028 | 1029 | yauzl@^2.3.1: 1030 | version "2.10.0" 1031 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" 1032 | integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= 1033 | dependencies: 1034 | buffer-crc32 "~0.2.3" 1035 | fd-slicer "~1.1.0" 1036 | 1037 | yazl@^2.2.2: 1038 | version "2.5.1" 1039 | resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35" 1040 | integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw== 1041 | dependencies: 1042 | buffer-crc32 "~0.2.3" 1043 | --------------------------------------------------------------------------------