├── .gitignore ├── assets ├── icon.png ├── example.gif ├── icon_v1.png ├── icon_original.png └── icon.svg ├── .vscodeignore ├── .vscode ├── extensions.json ├── tasks.json ├── settings.json └── launch.json ├── src ├── modules │ ├── configModels.ts │ ├── cleancode │ │ ├── models.ts │ │ └── executor.ts │ ├── inspectcode │ │ ├── models.ts │ │ ├── utils.ts │ │ ├── diagnostics.ts │ │ ├── xmlparser.ts │ │ ├── tree.ts │ │ └── executor.ts │ └── config.ts ├── test │ ├── suite │ │ ├── extension.test.ts │ │ └── index.ts │ └── runTest.ts ├── constants.ts ├── utils │ ├── file.ts │ ├── jetbrainsinstaller.ts │ └── workspace.ts └── extension.ts ├── .editorconfig ├── .eslintrc.json ├── .github └── workflows │ └── test.yml ├── tsconfig.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── vsc-extension-quickstart.md ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | .vscode-test/ 4 | *.vsix 5 | -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/resharper-community/resharper-vscode/HEAD/assets/icon.png -------------------------------------------------------------------------------- /assets/example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/resharper-community/resharper-vscode/HEAD/assets/example.gif -------------------------------------------------------------------------------- /assets/icon_v1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/resharper-community/resharper-vscode/HEAD/assets/icon_v1.png -------------------------------------------------------------------------------- /assets/icon_original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/resharper-community/resharper-vscode/HEAD/assets/icon_original.png -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | src/** 5 | .gitignore 6 | vsc-extension-quickstart.md 7 | **/tsconfig.json 8 | **/.eslintrc.json 9 | **/*.map 10 | **/*.ts 11 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "dbaeumer.vscode-eslint" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /src/modules/configModels.ts: -------------------------------------------------------------------------------- 1 | export interface CliOptions { 2 | ConfigPath?: string, 3 | Debug?: boolean, 4 | Verbosity?: string, 5 | ExcludePaths?: Array, 6 | CachesHomePath?: string, 7 | MsBuildProperties?: string, 8 | TargetForReference?: string, 9 | TargetsForItems?: string 10 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | charset = utf-8 9 | end_of_line = lf 10 | indent_style = tab 11 | tab_width = 4 12 | trim_trailing_whitespace = true 13 | insert_final_newline = true 14 | -------------------------------------------------------------------------------- /src/modules/cleancode/models.ts: -------------------------------------------------------------------------------- 1 | import { CliOptions } from "../configModels"; 2 | 3 | export interface CCCliOptions extends CliOptions { 4 | SettingsPath?: string, 5 | ProfileName?: string, 6 | IncludePaths?: Array, 7 | Toolset?: string, 8 | ToolsetPath?: string, 9 | MonoPath?: string, 10 | DotnetCorePath?: string, 11 | DotnetCoreSdk?: string, 12 | DisableSettingsLayer?: string, 13 | Extensions?: string 14 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": "$tsc-watch", 10 | "isBackground": true, 11 | "presentation": { 12 | "reveal": "never" 13 | }, 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | } 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "parserOptions": { 5 | "ecmaVersion": 6, 6 | "sourceType": "module" 7 | }, 8 | "plugins": [ 9 | "@typescript-eslint" 10 | ], 11 | "rules": { 12 | "@typescript-eslint/class-name-casing": "warn", 13 | "@typescript-eslint/semi": "warn", 14 | "curly": "warn", 15 | "eqeqeq": "warn", 16 | "no-throw-literal": "warn", 17 | "semi": "off" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/test/suite/extension.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from 'assert'; 2 | 3 | // You can import and use all API from the 'vscode' module 4 | // as well as import your extension to test it 5 | import * as vscode from 'vscode'; 6 | // import * as myExtension from '../extension'; 7 | 8 | suite('Extension Test Suite', () => { 9 | vscode.window.showInformationMessage('Start all tests.'); 10 | 11 | test('Sample test', () => { 12 | assert.equal(-1, [1, 2, 3].indexOf(5)); 13 | assert.equal(-1, [1, 2, 3].indexOf(0)); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | strategy: 8 | matrix: 9 | os: [macos-latest, ubuntu-latest, windows-latest] 10 | runs-on: ${{ matrix.os }} 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v2 14 | - name: Install Node.js 15 | uses: actions/setup-node@v1 16 | with: 17 | node-version: 8.x 18 | - run: npm install 19 | - name: Run tests 20 | uses: GabrielBB/xvfb-action@v1.0 21 | with: 22 | run: npm test 23 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "lib": [ 7 | "es6" 8 | ], 9 | "sourceMap": true, 10 | "rootDir": "src", 11 | "strict": true /* enable all strict type-checking options */ 12 | /* Additional Checks */ 13 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 14 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 15 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 16 | }, 17 | "exclude": [ 18 | "node_modules", 19 | ".vscode-test" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | export const EXTENSION_DISPLAY_NAME: string = "ReSharper Runner"; 2 | export const EXTENSION_NAME: string = "resharpervscode"; 3 | export const INSPECTION_FILENAME: string = "inspectcode.xml"; 4 | export const JB_COMMAND: string = 'jb'; 5 | export const CLEANCODE_COMMAND: string = JB_COMMAND + ' cleanupcode'; 6 | export const INSPECTION_COMMAND: string = JB_COMMAND + ' inspectcode'; 7 | export const JB_INSTALLATION_COMMAND: string = 'dotnet tool install -g JetBrains.ReSharper.GlobalTools'; 8 | export const NO_SLN_WARN: string = 'Could not find a solution file (*.sln), please create one with the dotnet CLI.'; 9 | export const NONZERO_RET_CODE: string = 'Process did not exit with 0 code. Please check output.'; 10 | -------------------------------------------------------------------------------- /src/test/runTest.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | 3 | import { runTests } from 'vscode-test'; 4 | 5 | async function main() { 6 | try { 7 | // The folder containing the Extension Manifest package.json 8 | // Passed to `--extensionDevelopmentPath` 9 | const extensionDevelopmentPath = path.resolve(__dirname, '../../'); 10 | 11 | // The path to test runner 12 | // Passed to --extensionTestsPath 13 | const extensionTestsPath = path.resolve(__dirname, './suite/index'); 14 | 15 | // Download VS Code, unzip it and run the integration test 16 | await runTests({ extensionDevelopmentPath, extensionTestsPath }); 17 | } catch (err) { 18 | console.error('Failed to run tests'); 19 | process.exit(1); 20 | } 21 | } 22 | 23 | main(); 24 | -------------------------------------------------------------------------------- /src/utils/file.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | 3 | export const BOM_CHAR_CODE: number = 65279; 4 | 5 | /** 6 | * Synchronously reads the entire contents of a file. 7 | * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. 8 | * URL support is _experimental_. 9 | * If a file descriptor is provided, the underlying file will _not_ be closed automatically. 10 | */ 11 | export function readFileSync(path: string): string { 12 | let data: string = fs.readFileSync(path).toString(); 13 | 14 | return removeBOM(data); 15 | } 16 | 17 | export function removeBOM(data: string): string { 18 | if (data.length > 0 && data.charCodeAt(0) === BOM_CHAR_CODE) { 19 | data = data.substring(1); 20 | } 21 | 22 | return data; 23 | } 24 | -------------------------------------------------------------------------------- /src/utils/jetbrainsinstaller.ts: -------------------------------------------------------------------------------- 1 | import { INSPECTION_COMMAND, JB_INSTALLATION_COMMAND } from "../constants"; 2 | import { execSync } from 'child_process'; 3 | import * as vscode from 'vscode'; 4 | 5 | export class JetBrainsInstaller { 6 | 7 | public constructor( 8 | private readonly output: vscode.OutputChannel) { 9 | } 10 | 11 | verifyInstallation() { 12 | this.output.appendLine(''); 13 | try{ 14 | execSync(`${INSPECTION_COMMAND} --version`).toString(); 15 | } catch { 16 | this.runInstallation(); 17 | } 18 | } 19 | 20 | private runInstallation() { 21 | this.output.appendLine('Running Jetbrains installation'); 22 | 23 | try{ 24 | const output = execSync(JB_INSTALLATION_COMMAND).toString(); 25 | this.output.append(output); 26 | this.output.appendLine('Done.'); 27 | } catch (error) { 28 | this.output.append((error as any).toString()); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/test/suite/index.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as Mocha from 'mocha'; 3 | import * as glob from 'glob'; 4 | 5 | export function run(): Promise { 6 | // Create the mocha test 7 | const mocha = new Mocha({ 8 | ui: 'tdd', 9 | }); 10 | mocha.useColors(true); 11 | 12 | const testsRoot = path.resolve(__dirname, '..'); 13 | 14 | return new Promise((c, e) => { 15 | glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { 16 | if (err) { 17 | return e(err); 18 | } 19 | 20 | // Add files to the test suite 21 | files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); 22 | 23 | try { 24 | // Run the mocha test 25 | mocha.run(failures => { 26 | if (failures > 0) { 27 | e(new Error(`${failures} tests failed.`)); 28 | } else { 29 | c(); 30 | } 31 | }); 32 | } catch (err) { 33 | console.error(err); 34 | e(err); 35 | } 36 | }); 37 | }); 38 | } 39 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | }, 9 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 10 | "typescript.tsc.autoDetect": "off", 11 | "cSpell.words": [ 12 | "cleanalldiagnostics", 13 | "cleancode", 14 | "cleandiagnostics", 15 | "cleanupcode", 16 | "dotnetcore", 17 | "dotnetcoresdk", 18 | "inspectcode", 19 | "Jetbrains", 20 | "jetbrainsinstaller", 21 | "reloaddiagnostics", 22 | "resharpervscode", 23 | "showoutput", 24 | "swea", 25 | "toolset", 26 | "xmlparser" 27 | ] 28 | } -------------------------------------------------------------------------------- /src/modules/inspectcode/models.ts: -------------------------------------------------------------------------------- 1 | import { CliOptions } from "../configModels"; 2 | 3 | export type File = { 4 | path: string; 5 | issues: Issue[]; 6 | }; 7 | 8 | export type Issue = { 9 | typeId: string; 10 | file: string; 11 | fullPath: string; 12 | offset: Range; 13 | line: number; 14 | message: string; 15 | 16 | issueType: IssueType; 17 | }; 18 | 19 | export type IssueType = { 20 | id: string; 21 | category: string; 22 | categoryId: string; 23 | description: string; 24 | severity: 'ERROR' | 'HINT' | 'INFORMATION' | 'SUGGESTION' | 'WARNING'; 25 | wikiUrl: string | undefined; 26 | }; 27 | 28 | export type Range = { 29 | start: number; 30 | end: number; 31 | }; 32 | 33 | export interface ICCliOptions extends CliOptions { 34 | ProfilePath?: string, 35 | Exclude?: string, 36 | NoSwea?: boolean, 37 | Swea?: boolean, 38 | Severity?: string, 39 | Project?: string, 40 | Include?: string, 41 | Toolset?: string, 42 | ToolsetPath?: string, 43 | MonoPath?: string, 44 | DotnetCorePath?: string, 45 | DotnetCoreSdk?: string, 46 | DisableSettingsLayer?: string, 47 | Extensions?: string 48 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Run Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ], 16 | "outFiles": [ 17 | "${workspaceFolder}/out/**/*.js" 18 | ], 19 | "preLaunchTask": "${defaultBuildTask}" 20 | }, 21 | { 22 | "name": "Extension Tests", 23 | "type": "extensionHost", 24 | "request": "launch", 25 | "runtimeExecutable": "${execPath}", 26 | "args": [ 27 | "--extensionDevelopmentPath=${workspaceFolder}", 28 | "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" 29 | ], 30 | "outFiles": [ 31 | "${workspaceFolder}/out/test/**/*.js" 32 | ], 33 | "preLaunchTask": "${defaultBuildTask}" 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to the "resharper-vscode" extension will be documented in this file. 4 | 5 | ## 0.9.15 6 | * Enhancement: [Make the link in the problem view clickable](https://github.com/resharper-community/resharper-vscode/issues/5) 7 | 8 | ## 0.9.13 9 | * Support Resharper CLI 2024.1.1 10 | * Bugfix: [Solution files containing spaces are not correctly escaped](https://github.com/resharper-community/resharper-vscode/issues/2) 11 | 12 | ## 0.9.11 13 | * Add icons to issue tree 14 | * Show "Inspect Code" button again after cleanup diagnostics 15 | * Upgrade packages 16 | 17 | ## 0.9.7 18 | * Show progress in the InspectCode window 19 | * Improve the issue tree view 20 | * New icon on the Activity bar 21 | 22 | ## 0.9.4 23 | * Print the command before running JB tool 24 | 25 | ## 0.9.3 26 | * Remove dupfiles which is not support by JetBrains anymore 27 | * If InspectCode cannot find the correct dotnet SDK version, the extension can auto-fix the problem for users 28 | 29 | ## 0.9.2 30 | * Add InspectCode window to show all code issues in one list 31 | * Group code issues by issue type 32 | 33 | ## Forked from fakesharpersetting at 0.4.3 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2023 resharper-vscode 4 | Copyright (c) 2020 TwoUnderscorez 5 | Copyright (c) 2020 fakesharper 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in 15 | all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23 | THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /src/utils/workspace.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as vscode from 'vscode'; 3 | 4 | export function findFiles(glob: vscode.GlobPattern, maxResults?: number, token?: vscode.CancellationToken | undefined): Thenable { 5 | return vscode.workspace.findFiles(glob, '**/node_modules/**', maxResults, token); 6 | } 7 | 8 | export function selectFile(glob: vscode.GlobPattern, onSelect: ((path: string | undefined) => void)): void { 9 | if (!vscode.workspace.workspaceFolders) { 10 | vscode.window.showWarningMessage('There is no open folder.'); 11 | return; 12 | } 13 | 14 | findFiles(glob) 15 | .then(value => { 16 | if (value.length === 0) { 17 | onSelect(undefined); 18 | } else if (value.length === 1) { 19 | onSelect(value[0].fsPath); 20 | } else { 21 | const items: vscode.QuickPickItem[] = value.map(x => ({ 22 | label: path.basename(x.fsPath), 23 | description: x.fsPath 24 | })); 25 | 26 | vscode.window.showQuickPick(items, { placeHolder: 'Select file' }) 27 | .then(value => { 28 | if (value) { 29 | onSelect(value.description as string); 30 | } 31 | }); 32 | } 33 | }); 34 | } 35 | 36 | export function selectSolutionFile(onSelect: ((path: string | undefined) => void)): void { 37 | selectFile('**/*.sln', onSelect); 38 | } 39 | -------------------------------------------------------------------------------- /src/modules/config.ts: -------------------------------------------------------------------------------- 1 | import { CCCliOptions } from "./cleancode/models"; 2 | import { ICCliOptions } from "./inspectcode/models"; 3 | import * as vscode from "vscode"; 4 | import { EXTENSION_NAME } from "../constants"; 5 | 6 | export class Config { 7 | static conf: Config; 8 | cleanupCodeConfig: CCCliOptions; 9 | inspectCodeConfig: ICCliOptions; 10 | private constructor() { 11 | this.cleanupCodeConfig = {}; 12 | this.inspectCodeConfig = {}; 13 | } 14 | static getConfig() { 15 | if (Config.conf === undefined) { 16 | Config.conf = new Config(); 17 | } 18 | return Config.conf; 19 | } 20 | loadConfig() { 21 | let config = vscode.workspace.getConfiguration(EXTENSION_NAME); 22 | this.cleanupCodeConfig = config.get("cleanupcode", this.cleanupCodeConfig); 23 | this.inspectCodeConfig = config.get("inspectcode", this.inspectCodeConfig); 24 | } 25 | 26 | saveInspectCodeDotnetSdkConfig(dotnetCoreSdk: string) { 27 | let config = vscode.workspace.getConfiguration(EXTENSION_NAME); 28 | this.inspectCodeConfig = config.get("inspectcode", this.inspectCodeConfig); 29 | this.inspectCodeConfig.DotnetCoreSdk = dotnetCoreSdk; 30 | config.update("inspectcode", this.inspectCodeConfig); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/modules/inspectcode/utils.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as vscode from 'vscode'; 3 | import { File, Issue } from "./models"; 4 | 5 | /** 6 | * Converts relative path to absolute path. The file path format is relative in xml. 7 | * @param basePath *.sln file's directory path. 8 | * @param files File model array. 9 | */ 10 | export function restoreRelativePaths(basePath: string, files: File[]): void { 11 | files.forEach(file => { 12 | file.path = path.join(basePath, file.path); 13 | }); 14 | } 15 | 16 | /** 17 | * Get DiagnosticSeverity from Issue model. 18 | * @param issue Issue model. 19 | */ 20 | export function getIssueSeverity(issue: Issue): vscode.DiagnosticSeverity { 21 | switch (issue.issueType.severity) { 22 | case 'ERROR': return vscode.DiagnosticSeverity.Error; 23 | case 'HINT': return vscode.DiagnosticSeverity.Hint; 24 | case 'INFORMATION': return vscode.DiagnosticSeverity.Information; 25 | case 'SUGGESTION': return vscode.DiagnosticSeverity.Information; 26 | case 'WARNING': return vscode.DiagnosticSeverity.Warning; 27 | } 28 | } 29 | 30 | /** 31 | * Creates Range from Issue. 32 | * @param data File data string. 33 | * @param issue Issue model. 34 | */ 35 | export function getIssueRange(data: string, issue: Issue): vscode.Range { 36 | const lineIndex: number = issue.line - 1; 37 | let startIndex: number = issue.offset.start; 38 | let endIndex: number = issue.offset.end; 39 | 40 | const lines: string[] = data.split('\n'); 41 | 42 | let index: number = 0; 43 | 44 | for (let i = 0; i < lineIndex; i++) { 45 | index += lines[i].length + 1; 46 | } 47 | 48 | startIndex -= index; 49 | endIndex -= index; 50 | 51 | return new vscode.Range(lineIndex, startIndex, lineIndex, endIndex); 52 | } 53 | -------------------------------------------------------------------------------- /assets/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 24 | 26 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ReSharper Runner 2 | 3 | This extension provides a wrapper for the ReSharper CLI. The CLI executables are available as commands in the command pallette and any command line arguments can be configurable from the VS Code config files. 4 | 5 | This extension is a fork of fakesharpersettings which is a fork of fakesharper 6 | 7 | Any bug or feature suggestion, please feel free to create a github issue [here](https://github.com/resharper-community/resharper-vscode/issues). 8 | 9 | ## Inspect Code 10 | 11 | ![example](https://raw.githubusercontent.com/resharper-community/resharper-vscode/master/assets/example.gif) 12 | 13 | ## Features 14 | 15 | * `Inspect Code`: Inspecting and linting. 16 | * `Clean All Diagnostics`: Clean all diagnostics on workspace. 17 | * `Reload Diagnostics`: Show diagnostics on editor from all found inspectcode.xml files. 18 | * `Cleanup Code`: Format and cleanup code. 19 | 20 | ## FAQ 21 | 22 | ### Is ReSharper free? 23 | 24 | **Yes!** We use free tool of [JetBrains](https://www.jetbrains.com/) [ReSharper](https://www.jetbrains.com/resharper/) called [ReSharper Command Line](https://www.jetbrains.com/resharper/features/command-line.html) tool for this extension. 25 | 26 | ### Does this extension make Visual Studio Code slower? 27 | 28 | **No!** This extension works only when you run any command. 29 | 30 | ----------------------------------------------------------------------------------------------------------- 31 | 32 | ## Thanks 33 | 34 | [JetBrains](https://www.jetbrains.com/) for the free awesome [ReSharper](https://www.jetbrains.com/resharper/) [Command Line](https://www.jetbrains.com/resharper/features/command-line.html) tool. 35 | 36 | [fakesharpersettings](https://marketplace.visualstudio.com/items?itemName=TwoUnderscorez.fakesharpersettings) and [fakesharper](https://marketplace.visualstudio.com/items?itemName=fakesharper.fakesharper). This extension is based on the work of these two amazing tools. 37 | 38 | Any bug or feature suggestion, please feel free to create a github issue [here](https://github.com/resharper-community/resharper-vscode/issues). 39 | 40 | **Enjoy!** 41 | -------------------------------------------------------------------------------- /src/modules/inspectcode/diagnostics.ts: -------------------------------------------------------------------------------- 1 | import * as fs from "fs"; 2 | import { EOL } from "os"; 3 | import * as path from "path"; 4 | import * as vscode from "vscode"; 5 | import { EXTENSION_DISPLAY_NAME, INSPECTION_FILENAME } from "../../constants"; 6 | import { readFileSync } from '../../utils/file'; 7 | import { File, Issue } from "./models"; 8 | import { getIssueRange, getIssueSeverity, restoreRelativePaths } from "./utils"; 9 | import { findFiles } from '../../utils/workspace'; 10 | import { parseFile } from "./xmlparser"; 11 | import { InspectCodeTreeDataProvider } from "./tree"; 12 | import { Uri } from "vscode"; 13 | 14 | export function reloadAllDiagnostics(diagnosticCollection: vscode.DiagnosticCollection, dataProvider: InspectCodeTreeDataProvider) { 15 | findFiles(`**/${INSPECTION_FILENAME}`) 16 | .then(files => { 17 | diagnosticCollection.clear(); 18 | 19 | let allIssues: Issue[] = []; 20 | files.forEach((file) => { 21 | const issues = loadDiagnostics(path.dirname(file.fsPath), diagnosticCollection); 22 | allIssues.push(...issues); 23 | }); 24 | dataProvider.dataSource = allIssues; 25 | }); 26 | } 27 | 28 | export function loadDiagnostics(basePath: string, diagnosticCollection: vscode.DiagnosticCollection): Issue[] { 29 | const xmlPath = path.join(basePath, INSPECTION_FILENAME); 30 | if (!fs.existsSync(xmlPath)) { 31 | return []; 32 | } 33 | 34 | try { 35 | const files: File[] = parseFile(xmlPath); 36 | restoreRelativePaths(basePath, files); 37 | updateDiagnostics(files, diagnosticCollection); 38 | let issues: Issue[] = []; 39 | for (let i = 0; i < files.length; i++) { 40 | const file: File = files[i]; 41 | issues.push(...file.issues); 42 | } 43 | return issues; 44 | } catch (err) { 45 | vscode.window.showErrorMessage(`${(err as any)?.message || err}`); 46 | return []; 47 | } 48 | } 49 | 50 | export function updateDiagnostics(files: File[], diagnosticCollection: vscode.DiagnosticCollection): void { 51 | for (let i = 0; i < files.length; i++) { 52 | const file: File = files[i]; 53 | 54 | const data: string = readFileSync(file.path); 55 | const uri: vscode.Uri = vscode.Uri.file(file.path); 56 | 57 | diagnosticCollection.set(uri, file.issues.map(issue => ({ 58 | message: issue.message + EOL, 59 | range: getIssueRange(data, issue), 60 | severity: getIssueSeverity(issue), 61 | code: issue.issueType.wikiUrl ? { value: issue.issueType.wikiUrl, target: Uri.parse(issue.issueType.wikiUrl) } : issue.typeId, 62 | source: EXTENSION_DISPLAY_NAME 63 | }))); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /vsc-extension-quickstart.md: -------------------------------------------------------------------------------- 1 | # Welcome to your VS Code Extension 2 | 3 | ## What's in the folder 4 | 5 | * This folder contains all of the files necessary for your extension. 6 | * `package.json` - this is the manifest file in which you declare your extension and command. 7 | * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. 8 | * `src/extension.ts` - this is the main file where you will provide the implementation of your command. 9 | * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. 10 | * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. 11 | 12 | ## Get up and running straight away 13 | 14 | * Press `F5` to open a new window with your extension loaded. 15 | * Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. 16 | * Set breakpoints in your code inside `src/extension.ts` to debug your extension. 17 | * Find output from your extension in the debug console. 18 | 19 | ## Make changes 20 | 21 | * You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. 22 | * You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. 23 | 24 | 25 | ## Explore the API 26 | 27 | * You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. 28 | 29 | ## Run tests 30 | 31 | * Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Extension Tests`. 32 | * Press `F5` to run the tests in a new window with your extension loaded. 33 | * See the output of the test result in the debug console. 34 | * Make changes to `src/test/suite/extension.test.ts` or create new test files inside the `test/suite` folder. 35 | * The provided test runner will only consider files matching the name pattern `**.test.ts`. 36 | * You can create folders inside the `test` folder to structure your tests any way you want. 37 | 38 | ## Go further 39 | 40 | * Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). 41 | * [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VSCode extension marketplace. 42 | * Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). 43 | -------------------------------------------------------------------------------- /src/modules/inspectcode/xmlparser.ts: -------------------------------------------------------------------------------- 1 | import * as fxp from 'fast-xml-parser'; 2 | import * as path from 'path'; 3 | import * as file from '../../utils/file'; 4 | import { IssueType, Issue, File } from "./models"; 5 | 6 | /** 7 | * Parses xml file data to File model array 8 | * @param filePath Xml file path 9 | */ 10 | export function parseFile(filePath: string): File[] { 11 | const dir = path.dirname(filePath); 12 | const xml: string = file.readFileSync(filePath); 13 | 14 | const parser = new fxp.XMLParser({ 15 | attributesGroupName: 'attributes', 16 | ignoreAttributes: false, 17 | parseAttributeValue: true 18 | }); 19 | const json: any = parser.parse(xml); 20 | 21 | const fileIssueLists: File[] = []; 22 | const issueTypes: IssueType[] = []; 23 | 24 | if (json.Report.IssueTypes === "") { 25 | return fileIssueLists; 26 | } 27 | 28 | for (let i = 0; i < json.Report.IssueTypes.IssueType.length; i++) { 29 | const item: any = json.Report.IssueTypes.IssueType[i]; 30 | const issueType: IssueType = { 31 | category: item.attributes["@_Category"], 32 | categoryId: item.attributes["@_CategoryId"], 33 | description: item.attributes["@_Description"], 34 | id: item.attributes["@_Id"], 35 | severity: item.attributes["@_Severity"], 36 | wikiUrl: item.attributes["@_WikiUrl"] 37 | }; 38 | issueTypes.push(issueType); 39 | } 40 | 41 | const addIssue = function (item: any): void { 42 | const file = item.attributes["@_File"].replace(/\\/g, path.sep); 43 | const issue: Issue = { 44 | file: file, 45 | fullPath: path.join(dir, file), 46 | line: parseInt(item.attributes["@_Line"]), 47 | message: item.attributes["@_Message"], 48 | offset: { 49 | start: parseInt(item.attributes["@_Offset"].split('-')[0]), 50 | end: parseInt(item.attributes["@_Offset"].split('-')[1]), 51 | }, 52 | typeId: item.attributes["@_TypeId"], 53 | 54 | issueType: issueTypes.filter(x => x.id === item.attributes["@_TypeId"])[0] 55 | }; 56 | 57 | let added: boolean = false; 58 | 59 | for (let i = 0; i < fileIssueLists.length; i++) { 60 | if (fileIssueLists[i].path === issue.file) { 61 | fileIssueLists[i].issues.push(issue); 62 | added = true; 63 | break; 64 | } 65 | } 66 | 67 | if (!added) { 68 | fileIssueLists.push({ 69 | path: issue.file, 70 | issues: [issue] 71 | }); 72 | } 73 | }; 74 | 75 | if (json.Report.Issues.Project.Issue) { 76 | for (let i = 0; i < json.Report.Issues.Project.Issue.length; i++) { 77 | const item: any = json.Report.Issues.Project.Issue[i]; 78 | addIssue(item); 79 | } 80 | } else { 81 | for (let i = 0; i < json.Report.Issues.Project.length; i++) { 82 | for (let j = 0; j < json.Report.Issues.Project[i].Issue.length; j++) { 83 | const item: any = json.Report.Issues.Project[i].Issue[j]; 84 | addIssue(item); 85 | } 86 | } 87 | } 88 | 89 | return fileIssueLists; 90 | } 91 | -------------------------------------------------------------------------------- /src/modules/cleancode/executor.ts: -------------------------------------------------------------------------------- 1 | import { spawn } from 'child_process'; 2 | import * as vscode from 'vscode'; 3 | import { EXTENSION_NAME, CLEANCODE_COMMAND, NO_SLN_WARN, NONZERO_RET_CODE, EXTENSION_DISPLAY_NAME } from '../../constants'; 4 | import { selectSolutionFile } from '../../utils/workspace'; 5 | import { Config } from "../config"; 6 | 7 | export class CleanupCodeExecutor { 8 | public constructor( 9 | private readonly output: vscode.OutputChannel, 10 | private readonly statusBarItem: vscode.StatusBarItem 11 | ) { } 12 | 13 | private showStatusBarItem() { 14 | this.statusBarItem.text = "$(sync~spin) ReSharper: Cleanup Code"; 15 | this.statusBarItem.tooltip = `${EXTENSION_DISPLAY_NAME}: Cleaning up code`; 16 | this.statusBarItem.command = `${EXTENSION_NAME}.showoutput`; 17 | this.statusBarItem.show(); 18 | } 19 | 20 | private hideStatusBarItem() { 21 | this.statusBarItem.text = EXTENSION_NAME; 22 | this.statusBarItem.tooltip = undefined; 23 | this.statusBarItem.command = undefined; 24 | this.statusBarItem.hide(); 25 | } 26 | 27 | private executeCleanupCode(filePath: string): void { 28 | this.output.appendLine(`Cleanup Code command is running for '${filePath}'...`); 29 | 30 | let args: Array = []; 31 | let config = Config.getConfig().cleanupCodeConfig; 32 | args.push( 33 | (config.ConfigPath) ? `--config=${config.ConfigPath}` : "", 34 | (config.SettingsPath) ? `-s=${config.SettingsPath}` : "", 35 | (config.ProfileName) ? `-p=${config.ProfileName}` : "", 36 | (config.IncludePaths) ? `--include=${config.IncludePaths.join(';')}` : "", 37 | (config.ExcludePaths) ? `--exclude=${config.ExcludePaths.join(';')}` : "", 38 | (config.Debug) ? `--debug=True` : "", 39 | (config.Verbosity) ? `--verbosity=${config.Verbosity}` : "", 40 | (config.Toolset) ? `--toolset=${config.Toolset}` : "", 41 | (config.ToolsetPath) ? `--toolset-path=${config.ToolsetPath}` : "", 42 | (config.MsBuildProperties) ? `--properties=${config.MsBuildProperties}` : "", 43 | (config.MonoPath) ? `--mono=${config.MonoPath}` : "", 44 | (config.DotnetCorePath) ? `--dotnetcore=${config.DotnetCorePath}` : "", 45 | (config.DotnetCoreSdk) ? `--dotnetcoresdk=${config.DotnetCoreSdk}` : "", 46 | (config.DisableSettingsLayer) ? `-dsl=${config.DisableSettingsLayer}` : "", 47 | (config.CachesHomePath) ? `--caches-home=${config.CachesHomePath}` : "", 48 | (config.TargetForReference) ? `--targets-for-references=${config.TargetForReference}` : "", 49 | (config.TargetsForItems) ? `--targets-for-items=${config.TargetsForItems}` : "", 50 | (config.Extensions) ? `-x=${config.Extensions}` : "", 51 | `"${filePath}"` 52 | ); 53 | 54 | this.output.appendLine(`${CLEANCODE_COMMAND} ${args.filter(x => x.length > 0).join(' ')}`); 55 | const cp = spawn(CLEANCODE_COMMAND, args, { shell: true }); 56 | 57 | cp.stdin?.addListener('data', message => this.output.append(message.toString())); 58 | cp.stdout?.addListener('data', message => this.output.append(message.toString())); 59 | cp.stderr?.addListener('data', message => this.output.append(message.toString())); 60 | 61 | cp.on('exit', code => { 62 | if (code !== 0) { 63 | vscode.window.showErrorMessage(NONZERO_RET_CODE); 64 | } 65 | 66 | this.hideStatusBarItem(); 67 | this.output.appendLine('Finished Cleanup Code command.'); 68 | }); 69 | } 70 | 71 | public run() { 72 | selectSolutionFile(filePath => { 73 | if (!filePath) { 74 | vscode.window.showWarningMessage(NO_SLN_WARN); 75 | return; 76 | } 77 | 78 | vscode.window.showQuickPick(['No. Do not change my codes.', 'Yes. Cleanup my codes.'], { 79 | placeHolder: 'WARNING! Your code will be modified by ReSharper, continue?' 80 | }).then(value => { 81 | if (value && value.startsWith('Yes')) { 82 | this.showStatusBarItem(); 83 | this.executeCleanupCode(filePath); 84 | } 85 | }); 86 | }); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import { EXTENSION_DISPLAY_NAME, EXTENSION_NAME } from './constants'; 3 | import { reloadAllDiagnostics } from './modules/inspectcode/diagnostics'; 4 | import { InspectCodeExecutor } from './modules/inspectcode/executor'; 5 | import { CleanupCodeExecutor } from './modules/cleancode/executor'; 6 | import { JetBrainsInstaller } from './utils/jetbrainsinstaller'; 7 | import { Config } from './modules/config'; 8 | import { InspectCodeTreeDataProvider } from './modules/inspectcode/tree'; 9 | import { Issue } from './modules/inspectcode/models'; 10 | 11 | export function activate(context: vscode.ExtensionContext) { 12 | const config = Config.getConfig(); 13 | config.loadConfig(); 14 | 15 | vscode.workspace.onDidChangeConfiguration(function (event) { 16 | config.loadConfig(); 17 | }); 18 | 19 | const diagnosticCollection = vscode.languages.createDiagnosticCollection(EXTENSION_NAME); 20 | 21 | const output = vscode.window.createOutputChannel(EXTENSION_DISPLAY_NAME); 22 | const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left); 23 | 24 | const jbInstaller = new JetBrainsInstaller(output); 25 | jbInstaller.verifyInstallation(); 26 | 27 | const dataProvider = new InspectCodeTreeDataProvider(); 28 | const tree = vscode.window.createTreeView(`${EXTENSION_NAME}.inspectcode`, { 29 | canSelectMany: false, 30 | treeDataProvider: dataProvider 31 | }); 32 | 33 | let disposableShowOutput = vscode.commands.registerCommand(`${EXTENSION_NAME}.showoutput`, () => { 34 | output.show(); 35 | }); 36 | 37 | let disposable = vscode.commands.registerCommand(`${EXTENSION_NAME}.inspectcode`, () => { 38 | new InspectCodeExecutor(output, statusBarItem, diagnosticCollection, dataProvider).run(); 39 | }); 40 | 41 | let disposable2 = vscode.commands.registerTextEditorCommand(`${EXTENSION_NAME}.cleandiagnostics`, (textEditor) => { 42 | output.appendLine(`Clean Diagnostics command is running for '${textEditor.document.uri.fsPath}'...`); 43 | diagnosticCollection.delete(textEditor.document.uri); 44 | output.appendLine('Finished Clean Diagnostics command.'); 45 | }); 46 | 47 | let disposable3 = vscode.commands.registerCommand(`${EXTENSION_NAME}.cleanalldiagnostics`, () => { 48 | output.appendLine(`Clean All Diagnostics command is running...`); 49 | diagnosticCollection.clear(); 50 | dataProvider.dataSource = undefined; 51 | output.appendLine('Finished Clean All Diagnostics command.'); 52 | vscode.commands.executeCommand('setContext', 'resharpervscode:hideWelcome', false); 53 | }); 54 | 55 | let disposable4 = vscode.commands.registerCommand(`${EXTENSION_NAME}.cleanupcode`, () => { 56 | new CleanupCodeExecutor(output, statusBarItem).run(); 57 | }); 58 | 59 | let disposable5 = vscode.commands.registerCommand(`${EXTENSION_NAME}.reloaddiagnostics`, () => { 60 | output.appendLine(`Reload Diagnostics command is running...`); 61 | reloadAllDiagnostics(diagnosticCollection, dataProvider); 62 | output.appendLine('Finished Reload Diagnostics command.'); 63 | }); 64 | 65 | let disposable9 = vscode.commands.registerCommand(`${EXTENSION_NAME}.issue.show`, async (issue: Issue) => { 66 | const textDocument = await vscode.workspace.openTextDocument(issue.fullPath); 67 | const textEditor = await vscode.window.showTextDocument(textDocument); 68 | 69 | const p11 = textDocument.positionAt(issue.offset.start); 70 | const p12 = textDocument.positionAt(issue.offset.end); 71 | 72 | textEditor.selection = new vscode.Selection(p11, p12); 73 | 74 | textEditor.revealRange(textEditor.selection, vscode.TextEditorRevealType.InCenter); 75 | }); 76 | 77 | context.subscriptions.push( 78 | output, 79 | statusBarItem, 80 | tree, 81 | disposableShowOutput, 82 | disposable, 83 | disposable2, 84 | disposable3, 85 | disposable4, 86 | disposable5, 87 | disposable9 88 | ); 89 | } 90 | 91 | export function deactivate() { } 92 | -------------------------------------------------------------------------------- /src/modules/inspectcode/tree.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as vscode from 'vscode'; 3 | import { EXTENSION_NAME } from '../../constants'; 4 | import { Issue, IssueType } from './models'; 5 | 6 | export class IssueTreeItem extends vscode.TreeItem { 7 | constructor( 8 | public readonly issueGroup: IssueGroup, 9 | public readonly collapsibleState: vscode.TreeItemCollapsibleState, 10 | public readonly children: IssueTreeItem[], 11 | public readonly issue: Issue | undefined 12 | ) { 13 | super(issue === undefined ? `${issueGroup.issueType.id} (${issueGroup.issues.length})` : `${path.basename(issue.file)}`, collapsibleState); 14 | const dirname = this.issue === undefined ? '' : path.dirname(this.issue.file); 15 | let icon: vscode.ThemeIcon | undefined; 16 | if (!issue) { 17 | switch (issueGroup.issueType.severity) 18 | { 19 | case 'ERROR': 20 | icon = new vscode.ThemeIcon('error'); 21 | break; 22 | case 'WARNING': 23 | icon = new vscode.ThemeIcon('warning'); 24 | break; 25 | default: 26 | icon = new vscode.ThemeIcon('info'); 27 | break; 28 | }; 29 | } 30 | this.iconPath = icon; 31 | this.description = dirname === '.' ? '' : dirname; 32 | this.tooltip = this.issue === undefined ? this.issueGroup.issueType.description : `Line: ${this.issue.line} (${this.issue.offset.start}, ${this.issue.offset.end})`; 33 | } 34 | } 35 | 36 | export class IssueGroup { 37 | constructor( 38 | public readonly issueType: IssueType, 39 | public readonly issues: Issue[] 40 | ) 41 | {} 42 | } 43 | 44 | export class InspectCodeTreeDataProvider implements vscode.TreeDataProvider { 45 | private _onDidChangeTreeData: vscode.EventEmitter = new vscode.EventEmitter(); 46 | public readonly onDidChangeTreeData?: vscode.Event = this._onDidChangeTreeData.event; 47 | 48 | private _issueGroups: IssueGroup[] | undefined = undefined; 49 | 50 | public set dataSource(issues: Issue[] | undefined) { 51 | if (issues === undefined) { 52 | this._issueGroups = undefined; 53 | } 54 | else { 55 | const map = new Map(); 56 | for (let i = 0; i < issues.length; i++) { 57 | const issue = issues[i]; 58 | var key = issue.issueType.id; 59 | var issueGroup = map.get(key); 60 | if (issueGroup === undefined) { 61 | issueGroup = new IssueGroup(issue.issueType, [ issue ]); 62 | map.set(key, issueGroup); 63 | } 64 | else { 65 | issueGroup.issues.push(issue); 66 | } 67 | } 68 | this._issueGroups = [...map.values()].sort((a, b) => a.issueType.id.localeCompare(b.issueType.id)); 69 | } 70 | this.refresh(); 71 | } 72 | 73 | public refresh(): void { 74 | this._onDidChangeTreeData.fire(); 75 | } 76 | 77 | public getTreeItem(element: IssueTreeItem): vscode.TreeItem { 78 | return element; 79 | } 80 | 81 | public getChildren(element?: IssueTreeItem | undefined): vscode.ProviderResult { 82 | if (this._issueGroups === undefined) { 83 | return null; 84 | } 85 | 86 | if (element === undefined) { 87 | return this._issueGroups.map(group => this.createParentItem(group)); 88 | } else { 89 | return element.children.length === 0 ? null : element.children; 90 | } 91 | } 92 | 93 | private createParentItem(group: IssueGroup): IssueTreeItem { 94 | const children = group.issues.map(issue => this.createChildItem(group, issue));; 95 | const item = new IssueTreeItem(group, vscode.TreeItemCollapsibleState.Collapsed, children, undefined); 96 | return item; 97 | } 98 | 99 | private createChildItem(group: IssueGroup, issue: Issue): IssueTreeItem { 100 | const item = new IssueTreeItem(group, vscode.TreeItemCollapsibleState.None, [], issue); 101 | item.command = { 102 | command: `${EXTENSION_NAME}.issue.show`, 103 | title: 'Show issue', 104 | arguments: [issue] 105 | }; 106 | return item; 107 | } 108 | 109 | public getParent(node: IssueTreeItem): IssueTreeItem | null { 110 | return null; 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /src/modules/inspectcode/executor.ts: -------------------------------------------------------------------------------- 1 | import { execSync, spawn } from 'child_process'; 2 | import * as path from 'path'; 3 | import * as vscode from 'vscode'; 4 | import { EXTENSION_NAME, INSPECTION_FILENAME, INSPECTION_COMMAND, NONZERO_RET_CODE, NO_SLN_WARN } from '../../constants'; 5 | import { selectSolutionFile } from '../../utils/workspace'; 6 | import { loadDiagnostics } from './diagnostics'; 7 | import { Config } from '../config'; 8 | import { InspectCodeTreeDataProvider } from './tree'; 9 | 10 | export class InspectCodeExecutor { 11 | private progressResolve: null | ((value: void | PromiseLike) => void) = null; 12 | 13 | constructor( 14 | private readonly output: vscode.OutputChannel, 15 | private readonly statusBarItem: vscode.StatusBarItem, 16 | private readonly diagnosticCollection: vscode.DiagnosticCollection, 17 | private readonly dataProvider: InspectCodeTreeDataProvider 18 | ) { } 19 | 20 | private showStatusBarItem(): void { 21 | this.statusBarItem.text = "$(sync~spin) ReSharper: Inspect Code"; 22 | this.statusBarItem.tooltip = "Inspect Code command is running"; 23 | this.statusBarItem.command = `${EXTENSION_NAME}.showoutput`; 24 | this.statusBarItem.show(); 25 | 26 | vscode.window.withProgress( 27 | { location: { viewId: `${EXTENSION_NAME}.inspectcode` } }, 28 | (_, __) => 29 | { 30 | const p = new Promise(resolve => { 31 | this.progressResolve = resolve; 32 | }); 33 | return p; 34 | } 35 | ); 36 | }; 37 | 38 | private hideStatusBarItem(): void { 39 | this.statusBarItem.text = EXTENSION_NAME; 40 | this.statusBarItem.tooltip = undefined; 41 | this.statusBarItem.command = undefined; 42 | this.statusBarItem.hide(); 43 | 44 | if (this.progressResolve) { 45 | this.progressResolve(); 46 | } 47 | } 48 | 49 | private executeInspectCode(filePath: string, xmlPath: string): void { 50 | vscode.commands.executeCommand('setContext', 'resharpervscode:hideWelcome', true); 51 | 52 | this.output.appendLine(`Inspect Code command is running for '${filePath}'...`); 53 | const wd: string = path.dirname(filePath); 54 | 55 | let args: Array = []; 56 | let config = Config.getConfig().inspectCodeConfig; 57 | args.push( 58 | (config.ConfigPath) ? `--config=${config.ConfigPath}` : "", 59 | (config.ProfilePath) ? `--profile=${config.ProfilePath}` : "", 60 | (config.Exclude) ? `--exclude=${config.Exclude}` : "", 61 | (config.Include) ? `--include=${config.Include}` : "", 62 | (config.Debug) ? `--debug=True` : "", 63 | (config.NoSwea) ? `--no-swea=True` : "", 64 | (config.Swea) ? `--swea=True` : "", 65 | (config.Verbosity) ? `--verbosity=${config.Verbosity}` : "", 66 | (config.Toolset) ? `--toolset=${config.Toolset}` : "", 67 | (config.Severity) ? `--severity=${config.Severity}` : "", 68 | (config.Project) ? `--project=${config.Project}` : "", 69 | (config.ToolsetPath) ? `--toolset-path=${config.ToolsetPath}` : "", 70 | (config.MonoPath) ? `--mono=${config.MonoPath}` : "", 71 | (config.DotnetCorePath) ? `--dotnetcore=${config.DotnetCorePath}` : "", 72 | (config.DotnetCoreSdk) ? `--dotnetcoresdk=${config.DotnetCoreSdk}` : "", 73 | (config.DisableSettingsLayer) ? `-dsl=${config.DisableSettingsLayer}` : "", 74 | (config.MsBuildProperties) ? `--properties=${config.MsBuildProperties}` : "", 75 | (config.CachesHomePath) ? `--caches-home=${config.CachesHomePath}` : "", 76 | (config.TargetForReference) ? `--targets-for-references=${config.TargetForReference}` : "", 77 | (config.TargetsForItems) ? `--targets-for-items=${config.TargetsForItems}` : "", 78 | (config.Extensions) ? `-x=${config.Extensions}` : "", 79 | '-f="xml"', 80 | `--output="${xmlPath}"`, 81 | `"${filePath}"` 82 | ); 83 | 84 | this.output.appendLine(`${INSPECTION_COMMAND} ${args.filter(x => x.length > 0).join(' ')}`); 85 | const cp = spawn(INSPECTION_COMMAND, args, { 86 | cwd: wd, 87 | shell: true 88 | }); 89 | 90 | const inspectCodeOutput: string[] = []; 91 | cp.stdin?.addListener('data', message => { const m = message.toString(); inspectCodeOutput.push(m); this.output.append(m); }); 92 | cp.stdout?.addListener('data', message => { const m = message.toString(); inspectCodeOutput.push(m); this.output.append(m); }); 93 | cp.stderr?.addListener('data', message => { const m = message.toString(); inspectCodeOutput.push(m); this.output.append(m); }); 94 | 95 | cp.on('exit', async code => { 96 | if (code !== 0) { 97 | this.statusBarItem.hide(); 98 | if (!await this.tryToFix(inspectCodeOutput)) { 99 | vscode.window.showErrorMessage(NONZERO_RET_CODE); 100 | } 101 | } else { 102 | this.diagnosticCollection.clear(); 103 | var issues = loadDiagnostics(wd, this.diagnosticCollection); 104 | this.dataProvider.dataSource = issues; 105 | 106 | this.hideStatusBarItem(); 107 | this.output.appendLine('Finished Inspect Code command.'); 108 | } 109 | }); 110 | } 111 | 112 | public run(): void { 113 | selectSolutionFile(filePath => { 114 | if (!filePath) { 115 | vscode.window.showWarningMessage(NO_SLN_WARN); 116 | return; 117 | } 118 | 119 | const xmlPath = path.join(path.dirname(filePath), INSPECTION_FILENAME); 120 | 121 | this.showStatusBarItem(); 122 | this.executeInspectCode(filePath, xmlPath); 123 | }); 124 | } 125 | 126 | private async tryToFix(inspectCodeOutput: string[]): Promise { 127 | let canFix = false; 128 | if (inspectCodeOutput.find(m => m.indexOf("The SDK 'Microsoft.NET.SDK.WorkloadAutoImportPropsLocator' specified could not be found") >= 0)) { 129 | canFix = true; 130 | } 131 | 132 | if (canFix) 133 | { 134 | let config = Config.getConfig().inspectCodeConfig; 135 | if (!config.DotnetCoreSdk) { 136 | let dotnetSdkVersion: string; 137 | try{ 138 | dotnetSdkVersion = execSync(`dotnet --version`).toString().trim(); 139 | } 140 | catch { 141 | dotnetSdkVersion = ''; 142 | } 143 | 144 | if (dotnetSdkVersion) { 145 | const selection = await vscode.window.showErrorMessage('Failed to inspect code. It was probably because ReSharper cannot find the correct dotnet SDK version.', "Try To Fix", "Show Output"); 146 | if (selection === "Try To Fix") { 147 | Config.getConfig().saveInspectCodeDotnetSdkConfig(dotnetSdkVersion); 148 | vscode.commands.executeCommand(`${EXTENSION_NAME}.inspectcode`); 149 | } 150 | else if (selection === "Show Output") { 151 | vscode.commands.executeCommand(`${EXTENSION_NAME}.showoutput`); 152 | } 153 | } 154 | } 155 | return true; 156 | } 157 | return false; 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "resharpervscode", 3 | "publisher": "dev-land", 4 | "displayName": "ReSharper Runner", 5 | "description": "Provides ReSharper features for Visual Studio Code", 6 | "version": "0.9.15", 7 | "preview": true, 8 | "icon": "assets/icon.png", 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/resharper-community/resharper-vscode" 12 | }, 13 | "engines": { 14 | "vscode": "^1.31.0" 15 | }, 16 | "categories": [ 17 | "Formatters", 18 | "Linters" 19 | ], 20 | "keywords": [ 21 | "C#", 22 | "csharp", 23 | ".NET", 24 | ".NET Core", 25 | "ASP.NET", 26 | "dotnet", 27 | "resharper", 28 | "fakesharper" 29 | ], 30 | "activationEvents": [ 31 | "workspaceContains:**/*.sln", 32 | "onCommand:resharpervscode.inspectcode", 33 | "onCommand:resharpervscode.cleandiagnostics", 34 | "onCommand:resharpervscode.cleanalldiagnostics", 35 | "onCommand:resharpervscode.cleanupcode", 36 | "onCommand:resharpervscode.reloaddiagnostics" 37 | ], 38 | "main": "./out/extension.js", 39 | "contributes": { 40 | "commands": [ 41 | { 42 | "command": "resharpervscode.inspectcode", 43 | "title": "ReSharper: Inspect Code" 44 | }, 45 | { 46 | "command": "resharpervscode.cleandiagnostics", 47 | "title": "ReSharper: Clean Diagnostics" 48 | }, 49 | { 50 | "command": "resharpervscode.cleanalldiagnostics", 51 | "title": "ReSharper: Clean All Diagnostics" 52 | }, 53 | { 54 | "command": "resharpervscode.cleanupcode", 55 | "title": "ReSharper: Cleanup Code" 56 | }, 57 | { 58 | "command": "resharpervscode.reloaddiagnostics", 59 | "title": "ReSharper: Reload Diagnostics" 60 | } 61 | ], 62 | "viewsContainers": { 63 | "activitybar": [ 64 | { 65 | "id": "resharpervscode", 66 | "title": "ReSharper VSCode", 67 | "icon": "assets/icon.svg" 68 | } 69 | ] 70 | }, 71 | "views": { 72 | "resharpervscode": [ 73 | { 74 | "id": "resharpervscode.inspectcode", 75 | "name": "Inspectcode" 76 | } 77 | ] 78 | }, 79 | "viewsWelcome": [ 80 | { 81 | "view": "resharpervscode.inspectcode", 82 | "contents": "You can start to inspect code.\n[Inspect Code](command:resharpervscode.inspectcode)", 83 | "when": "!resharpervscode:hideWelcome" 84 | } 85 | ], 86 | "menus": { 87 | "view/title": [ 88 | { 89 | "command": "resharpervscode.cleanupcode", 90 | "when": "view == resharpervscode.inspectcode", 91 | "group": "cleanupcode" 92 | }, 93 | { 94 | "command": "resharpervscode.inspectcode", 95 | "when": "view == resharpervscode.inspectcode", 96 | "group": "inspectcode" 97 | }, 98 | { 99 | "command": "resharpervscode.cleanalldiagnostics", 100 | "when": "view == resharpervscode.inspectcode", 101 | "group": "inspectcode" 102 | } 103 | ] 104 | }, 105 | "configuration": [ 106 | { 107 | "title": "ReSharper VSCode", 108 | "properties": { 109 | "resharpervscode.cleanupcode": { 110 | "type": "object", 111 | "default": {}, 112 | "description": "CLI args for code cleanup", 113 | "additionalProperties": false, 114 | "properties": { 115 | "ConfigPath": { 116 | "type": "string", 117 | "default": "", 118 | "description": "Path to configuration file here parameters are specified (use 'config-create' option to create sample file)" 119 | }, 120 | "SettingsPath": { 121 | "type": "string", 122 | "default": "", 123 | "description": "Path to the file to use custom settings from (default: Use ReSharper's solution shared settings if exists)." 124 | }, 125 | "ProfileName": { 126 | "type": "string", 127 | "default": "", 128 | "description": "Name of the code cleanup profile. Full cleanup profile is used if nothing specified." 129 | }, 130 | "Verbosity": { 131 | "type": "string", 132 | "default": "", 133 | "description": "Display this amount of information in the log", 134 | "enum": [ 135 | "OFF", 136 | "FATAL", 137 | "ERROR", 138 | "WARN", 139 | "INFO", 140 | "VERBOSE", 141 | "TRACE" 142 | ] 143 | }, 144 | "Toolset": { 145 | "type": "string", 146 | "default": "", 147 | "description": "MsBuild toolset version. Highest available is used by default. Example: --toolset=12.0." 148 | }, 149 | "ToolsetPath": { 150 | "type": "string", 151 | "default": "", 152 | "description": "MsBuild toolset (exe/dll) path. Example: --dotnetcore=/usr/local/msbuild/bin/current/MSBuild.exe" 153 | }, 154 | "MonoPath": { 155 | "type": "string", 156 | "default": "Mono path. Empty to ignore Mono. Not specified for autodetect. Example: --mono=/Library/Frameworks/Mono.framework/Versions/Current/bin/mono." 157 | }, 158 | "DotnetCorePath": { 159 | "type": "string", 160 | "default": ".NET Core path. Empty to ignore .NET Core. Not specified for autodetect. Example: --dotnetcore=/usr/local/share/dotnet/dotnet." 161 | }, 162 | "DotnetCoreSdk": { 163 | "type": "string", 164 | "default": ".NET Core SDK version. Example: --dotnetcoresdk=3.0.100." 165 | }, 166 | "DisableSettingsLayer": { 167 | "type": "string", 168 | "default": "Disable specified settings layers. Possible values: GlobalAll, GlobalPerProduct, SolutionShared, SolutionPersonal, ProjectShared, ProjectPersonal." 169 | }, 170 | "CachesHomePath": { 171 | "type": "string", 172 | "default": " Path to the directory where produced caches will be stored." 173 | }, 174 | "MsBuildProperties": { 175 | "type": "string", 176 | "default": " MSBuild properties." 177 | }, 178 | "TargetForReference": { 179 | "type": "string", 180 | "default": "MSBuild targets. These targets will be executed to get referenced assemblies of projects.." 181 | }, 182 | "TargetsForItems": { 183 | "type": "string", 184 | "default": "MSBuild targets. These targets will be executed to get other items (e.g. Compile item) of projects.." 185 | }, 186 | "Extensions": { 187 | "type": "string", 188 | "default": "Install and use specified extensions." 189 | }, 190 | "Debug": { 191 | "type": "boolean", 192 | "default": "False", 193 | "description": "Show debugging messages (default: False)." 194 | }, 195 | "IncludePaths": { 196 | "type": "array", 197 | "default": [], 198 | "description": "Array of relative paths that defines which files should be cleaned up. Might contains single ('*') and double ('**') wildcards.." 199 | }, 200 | "ExcludePaths": { 201 | "type": "array", 202 | "default": [], 203 | "description": "Array of relative paths that defines which files should not be cleaned up. Might contains single ('*') and double ('**') wildcards. If defined along with 'included' takes higher priority')." 204 | } 205 | } 206 | }, 207 | "resharpervscode.inspectcode": { 208 | "type": "object", 209 | "default": {}, 210 | "description": "CLI args for code inspection", 211 | "additionalProperties": false, 212 | "properties": { 213 | "ConfigPath": { 214 | "type": "string", 215 | "default": "", 216 | "description": "Path to configuration file here parameters are specified (use 'config-create' option to create sample file)" 217 | }, 218 | "ProfilePath": { 219 | "type": "string", 220 | "default": "", 221 | "description": "Path to the file to use custom settings from (default: Use ReSharper's solution shared settings if exists)." 222 | }, 223 | "Verbosity": { 224 | "type": "string", 225 | "default": "", 226 | "description": "Display this amount of information in the log", 227 | "enum": [ 228 | "OFF", 229 | "FATAL", 230 | "ERROR", 231 | "WARN", 232 | "INFO", 233 | "VERBOSE", 234 | "TRACE" 235 | ] 236 | }, 237 | "Toolset": { 238 | "type": "string", 239 | "default": "", 240 | "description": "MsBuild toolset version. Highest available is used by default. Example: --toolset=12.0." 241 | }, 242 | "ToolsetPath": { 243 | "type": "string", 244 | "default": "", 245 | "description": "MsBuild toolset (exe/dll) path. Example: --dotnetcore=/usr/local/msbuild/bin/current/MSBuild.exe" 246 | }, 247 | "MonoPath": { 248 | "type": "string", 249 | "default": "Mono path. Empty to ignore Mono. Not specified for autodetect. Example: --mono=/Library/Frameworks/Mono.framework/Versions/Current/bin/mono." 250 | }, 251 | "DotnetCorePath": { 252 | "type": "string", 253 | "default": ".NET Core path. Empty to ignore .NET Core. Not specified for autodetect. Example: --dotnetcore=/usr/local/share/dotnet/dotnet." 254 | }, 255 | "DotnetCoreSdk": { 256 | "type": "string", 257 | "default": ".NET Core SDK version. Example: --dotnetcoresdk=3.0.100." 258 | }, 259 | "DisableSettingsLayer": { 260 | "type": "string", 261 | "default": "Disable specified settings layers. Possible values: GlobalAll, GlobalPerProduct, SolutionShared, SolutionPersonal, ProjectShared, ProjectPersonal." 262 | }, 263 | "CachesHomePath": { 264 | "type": "string", 265 | "default": " Path to the directory where produced caches will be stored." 266 | }, 267 | "MsBuildProperties": { 268 | "type": "string", 269 | "default": " MSBuild properties." 270 | }, 271 | "TargetForReference": { 272 | "type": "string", 273 | "default": "MSBuild targets. These targets will be executed to get referenced assemblies of projects.." 274 | }, 275 | "TargetsForItems": { 276 | "type": "string", 277 | "default": "MSBuild targets. These targets will be executed to get other items (e.g. Compile item) of projects.." 278 | }, 279 | "Extensions": { 280 | "type": "string", 281 | "default": "Install and use specified extensions." 282 | }, 283 | "Project": { 284 | "type": "string", 285 | "default": "Analyze only projects selected by provided wildcards (default: analyze all projects in solution)." 286 | }, 287 | "Severity": { 288 | "type": "string", 289 | "default": "Minimal severity level to report. (default: SUGGESTION)", 290 | "enum": [ 291 | "INFO", 292 | "HINT", 293 | "SUGGESTION", 294 | "WARNING", 295 | "ERROR" 296 | ] 297 | }, 298 | "Debug": { 299 | "type": "boolean", 300 | "default": "False", 301 | "description": "Show debugging messages (default: False)." 302 | }, 303 | "NoSWea": { 304 | "type": "boolean", 305 | "default": "False", 306 | "description": "Force disable solution-wide analysis (default: False)" 307 | }, 308 | "Swea": { 309 | "type": "boolean", 310 | "default": "False", 311 | "description": "Force enable solution-wide analysis (default: False)" 312 | }, 313 | "Include": { 314 | "type": "string", 315 | "default": "", 316 | "description": "Analyze only files selected by provided wildcards (default: analyze all files in solution)." 317 | }, 318 | "Exclude": { 319 | "type": "string", 320 | "default": "", 321 | "description": "Exclude files selected by provided wildcards from analysis (default: analyze all files in solution)." 322 | } 323 | } 324 | } 325 | } 326 | } 327 | ] 328 | }, 329 | "scripts": { 330 | "vscode:prepublish": "yarn run compile", 331 | "compile": "tsc -p ./", 332 | "lint": "eslint src --ext ts", 333 | "watch": "tsc -watch -p ./", 334 | "pretest": "yarn run compile && yarn run lint", 335 | "test": "node ./out/test/runTest.js" 336 | }, 337 | "devDependencies": { 338 | "@types/glob": "^7.1.1", 339 | "@types/mocha": "^7.0.1", 340 | "@types/node": "^12.11.7", 341 | "@types/vscode": "^1.31.0", 342 | "@typescript-eslint/eslint-plugin": "^2.18.0", 343 | "@typescript-eslint/parser": "^2.18.0", 344 | "eslint": "^6.8.0", 345 | "glob": "^7.1.6", 346 | "mocha": "^10.2.0", 347 | "typescript": "^3.7.5", 348 | "vscode-test": "^1.3.0" 349 | }, 350 | "dependencies": { 351 | "fast-xml-parser": "^4.3.2" 352 | } 353 | } 354 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | "integrity" "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==" 7 | "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz" 8 | "version" "7.8.3" 9 | dependencies: 10 | "@babel/highlight" "^7.8.3" 11 | 12 | "@babel/helper-validator-identifier@^7.9.0": 13 | "integrity" "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" 14 | "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz" 15 | "version" "7.9.5" 16 | 17 | "@babel/highlight@^7.8.3": 18 | "integrity" "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==" 19 | "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz" 20 | "version" "7.9.0" 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.9.0" 23 | "chalk" "^2.0.0" 24 | "js-tokens" "^4.0.0" 25 | 26 | "@types/color-name@^1.1.1": 27 | "integrity" "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" 28 | "resolved" "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz" 29 | "version" "1.1.1" 30 | 31 | "@types/eslint-visitor-keys@^1.0.0": 32 | "integrity" "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" 33 | "resolved" "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz" 34 | "version" "1.0.0" 35 | 36 | "@types/events@*": 37 | "integrity" "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" 38 | "resolved" "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz" 39 | "version" "3.0.0" 40 | 41 | "@types/glob@^7.1.1": 42 | "integrity" "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==" 43 | "resolved" "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz" 44 | "version" "7.1.1" 45 | dependencies: 46 | "@types/events" "*" 47 | "@types/minimatch" "*" 48 | "@types/node" "*" 49 | 50 | "@types/json-schema@^7.0.3": 51 | "integrity" "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==" 52 | "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz" 53 | "version" "7.0.4" 54 | 55 | "@types/minimatch@*": 56 | "integrity" "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" 57 | "resolved" "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz" 58 | "version" "3.0.3" 59 | 60 | "@types/mocha@^7.0.1": 61 | "integrity" "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==" 62 | "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz" 63 | "version" "7.0.2" 64 | 65 | "@types/node@*", "@types/node@^12.11.7": 66 | "integrity" "sha512-4mXKoDptrXAwZErQHrLzpe0FN/0Wmf5JRniSVIdwUrtDf9wnmEV1teCNLBo/TwuXhkK/bVegoEn/wmb+x0AuPg==" 67 | "resolved" "https://registry.npmjs.org/@types/node/-/node-12.12.37.tgz" 68 | "version" "12.12.37" 69 | 70 | "@types/vscode@^1.31.0": 71 | "integrity" "sha512-WJZtZlinE3meRdH+I7wTsIhpz/GLhqEQwmPGeh4s1irWLwMzCeTV8WZ+pgPTwrDXoafVUWwo1LiZ9HJVHFlJSQ==" 72 | "resolved" "https://registry.npmjs.org/@types/vscode/-/vscode-1.44.0.tgz" 73 | "version" "1.44.0" 74 | 75 | "@typescript-eslint/eslint-plugin@^2.18.0": 76 | "integrity" "sha512-PGejii0qIZ9Q40RB2jIHyUpRWs1GJuHP1pkoCiaeicfwO9z7Fx03NQzupuyzAmv+q9/gFNHu7lo1ByMXe8PNyg==" 77 | "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.30.0.tgz" 78 | "version" "2.30.0" 79 | dependencies: 80 | "@typescript-eslint/experimental-utils" "2.30.0" 81 | "functional-red-black-tree" "^1.0.1" 82 | "regexpp" "^3.0.0" 83 | "tsutils" "^3.17.1" 84 | 85 | "@typescript-eslint/experimental-utils@2.30.0": 86 | "integrity" "sha512-L3/tS9t+hAHksy8xuorhOzhdefN0ERPDWmR9CclsIGOUqGKy6tqc/P+SoXeJRye5gazkuPO0cK9MQRnolykzkA==" 87 | "resolved" "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz" 88 | "version" "2.30.0" 89 | dependencies: 90 | "@types/json-schema" "^7.0.3" 91 | "@typescript-eslint/typescript-estree" "2.30.0" 92 | "eslint-scope" "^5.0.0" 93 | "eslint-utils" "^2.0.0" 94 | 95 | "@typescript-eslint/parser@^2.0.0", "@typescript-eslint/parser@^2.18.0": 96 | "integrity" "sha512-9kDOxzp0K85UnpmPJqUzdWaCNorYYgk1yZmf4IKzpeTlSAclnFsrLjfwD9mQExctLoLoGAUXq1co+fbr+3HeFw==" 97 | "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.30.0.tgz" 98 | "version" "2.30.0" 99 | dependencies: 100 | "@types/eslint-visitor-keys" "^1.0.0" 101 | "@typescript-eslint/experimental-utils" "2.30.0" 102 | "@typescript-eslint/typescript-estree" "2.30.0" 103 | "eslint-visitor-keys" "^1.1.0" 104 | 105 | "@typescript-eslint/typescript-estree@2.30.0": 106 | "integrity" "sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw==" 107 | "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz" 108 | "version" "2.30.0" 109 | dependencies: 110 | "debug" "^4.1.1" 111 | "eslint-visitor-keys" "^1.1.0" 112 | "glob" "^7.1.6" 113 | "is-glob" "^4.0.1" 114 | "lodash" "^4.17.15" 115 | "semver" "^6.3.0" 116 | "tsutils" "^3.17.1" 117 | 118 | "acorn-jsx@^5.2.0": 119 | "integrity" "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" 120 | "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz" 121 | "version" "5.2.0" 122 | 123 | "acorn@^6.0.0 || ^7.0.0", "acorn@^7.1.1": 124 | "integrity" "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" 125 | "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz" 126 | "version" "7.1.1" 127 | 128 | "agent-base@^4.3.0", "agent-base@4": 129 | "integrity" "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==" 130 | "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz" 131 | "version" "4.3.0" 132 | dependencies: 133 | "es6-promisify" "^5.0.0" 134 | 135 | "ajv@^6.10.0", "ajv@^6.10.2": 136 | "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" 137 | "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" 138 | "version" "6.12.6" 139 | dependencies: 140 | "fast-deep-equal" "^3.1.1" 141 | "fast-json-stable-stringify" "^2.0.0" 142 | "json-schema-traverse" "^0.4.1" 143 | "uri-js" "^4.2.2" 144 | 145 | "ansi-colors@4.1.1": 146 | "integrity" "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" 147 | "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" 148 | "version" "4.1.1" 149 | 150 | "ansi-escapes@^4.2.1": 151 | "integrity" "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==" 152 | "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz" 153 | "version" "4.3.1" 154 | dependencies: 155 | "type-fest" "^0.11.0" 156 | 157 | "ansi-regex@^4.1.0": 158 | "integrity" "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" 159 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" 160 | "version" "4.1.1" 161 | 162 | "ansi-regex@^5.0.0", "ansi-regex@^5.0.1": 163 | "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 164 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" 165 | "version" "5.0.1" 166 | 167 | "ansi-styles@^3.2.0", "ansi-styles@^3.2.1": 168 | "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" 169 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 170 | "version" "3.2.1" 171 | dependencies: 172 | "color-convert" "^1.9.0" 173 | 174 | "ansi-styles@^4.0.0": 175 | "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" 176 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 177 | "version" "4.3.0" 178 | dependencies: 179 | "color-convert" "^2.0.1" 180 | 181 | "ansi-styles@^4.1.0": 182 | "integrity" "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==" 183 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz" 184 | "version" "4.2.1" 185 | dependencies: 186 | "@types/color-name" "^1.1.1" 187 | "color-convert" "^2.0.1" 188 | 189 | "anymatch@~3.1.2": 190 | "integrity" "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==" 191 | "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" 192 | "version" "3.1.3" 193 | dependencies: 194 | "normalize-path" "^3.0.0" 195 | "picomatch" "^2.0.4" 196 | 197 | "argparse@^1.0.7": 198 | "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" 199 | "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" 200 | "version" "1.0.10" 201 | dependencies: 202 | "sprintf-js" "~1.0.2" 203 | 204 | "argparse@^2.0.1": 205 | "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" 206 | "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" 207 | "version" "2.0.1" 208 | 209 | "astral-regex@^1.0.0": 210 | "integrity" "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" 211 | "resolved" "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz" 212 | "version" "1.0.0" 213 | 214 | "balanced-match@^1.0.0": 215 | "integrity" "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 216 | "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" 217 | "version" "1.0.0" 218 | 219 | "binary-extensions@^2.0.0": 220 | "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" 221 | "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" 222 | "version" "2.2.0" 223 | 224 | "brace-expansion@^1.1.7": 225 | "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" 226 | "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 227 | "version" "1.1.11" 228 | dependencies: 229 | "balanced-match" "^1.0.0" 230 | "concat-map" "0.0.1" 231 | 232 | "brace-expansion@^2.0.1": 233 | "integrity" "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==" 234 | "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" 235 | "version" "2.0.1" 236 | dependencies: 237 | "balanced-match" "^1.0.0" 238 | 239 | "braces@~3.0.2": 240 | "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" 241 | "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" 242 | "version" "3.0.2" 243 | dependencies: 244 | "fill-range" "^7.0.1" 245 | 246 | "browser-stdout@1.3.1": 247 | "integrity" "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" 248 | "resolved" "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" 249 | "version" "1.3.1" 250 | 251 | "callsites@^3.0.0": 252 | "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" 253 | "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" 254 | "version" "3.1.0" 255 | 256 | "camelcase@^6.0.0": 257 | "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" 258 | "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" 259 | "version" "6.3.0" 260 | 261 | "chalk@^2.0.0", "chalk@^2.1.0": 262 | "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" 263 | "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 264 | "version" "2.4.2" 265 | dependencies: 266 | "ansi-styles" "^3.2.1" 267 | "escape-string-regexp" "^1.0.5" 268 | "supports-color" "^5.3.0" 269 | 270 | "chalk@^3.0.0": 271 | "integrity" "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==" 272 | "resolved" "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" 273 | "version" "3.0.0" 274 | dependencies: 275 | "ansi-styles" "^4.1.0" 276 | "supports-color" "^7.1.0" 277 | 278 | "chalk@^4.1.0": 279 | "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" 280 | "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" 281 | "version" "4.1.2" 282 | dependencies: 283 | "ansi-styles" "^4.1.0" 284 | "supports-color" "^7.1.0" 285 | 286 | "chardet@^0.7.0": 287 | "integrity" "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 288 | "resolved" "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" 289 | "version" "0.7.0" 290 | 291 | "chokidar@3.5.3": 292 | "integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==" 293 | "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" 294 | "version" "3.5.3" 295 | dependencies: 296 | "anymatch" "~3.1.2" 297 | "braces" "~3.0.2" 298 | "glob-parent" "~5.1.2" 299 | "is-binary-path" "~2.1.0" 300 | "is-glob" "~4.0.1" 301 | "normalize-path" "~3.0.0" 302 | "readdirp" "~3.6.0" 303 | optionalDependencies: 304 | "fsevents" "~2.3.2" 305 | 306 | "cli-cursor@^3.1.0": 307 | "integrity" "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==" 308 | "resolved" "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" 309 | "version" "3.1.0" 310 | dependencies: 311 | "restore-cursor" "^3.1.0" 312 | 313 | "cli-width@^2.0.0": 314 | "integrity" "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" 315 | "resolved" "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz" 316 | "version" "2.2.1" 317 | 318 | "cliui@^7.0.2": 319 | "integrity" "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==" 320 | "resolved" "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" 321 | "version" "7.0.4" 322 | dependencies: 323 | "string-width" "^4.2.0" 324 | "strip-ansi" "^6.0.0" 325 | "wrap-ansi" "^7.0.0" 326 | 327 | "color-convert@^1.9.0": 328 | "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" 329 | "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 330 | "version" "1.9.3" 331 | dependencies: 332 | "color-name" "1.1.3" 333 | 334 | "color-convert@^2.0.1": 335 | "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" 336 | "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 337 | "version" "2.0.1" 338 | dependencies: 339 | "color-name" "~1.1.4" 340 | 341 | "color-name@~1.1.4": 342 | "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 343 | "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 344 | "version" "1.1.4" 345 | 346 | "color-name@1.1.3": 347 | "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 348 | "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 349 | "version" "1.1.3" 350 | 351 | "concat-map@0.0.1": 352 | "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 353 | "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 354 | "version" "0.0.1" 355 | 356 | "cross-spawn@^6.0.5": 357 | "integrity" "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==" 358 | "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" 359 | "version" "6.0.5" 360 | dependencies: 361 | "nice-try" "^1.0.4" 362 | "path-key" "^2.0.1" 363 | "semver" "^5.5.0" 364 | "shebang-command" "^1.2.0" 365 | "which" "^1.2.9" 366 | 367 | "debug@^3.1.0": 368 | "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" 369 | "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" 370 | "version" "3.2.7" 371 | dependencies: 372 | "ms" "^2.1.1" 373 | 374 | "debug@^4.0.1", "debug@^4.1.1", "debug@4.3.4": 375 | "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" 376 | "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" 377 | "version" "4.3.4" 378 | dependencies: 379 | "ms" "2.1.2" 380 | 381 | "debug@3.1.0": 382 | "integrity" "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==" 383 | "resolved" "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" 384 | "version" "3.1.0" 385 | dependencies: 386 | "ms" "2.0.0" 387 | 388 | "decamelize@^4.0.0": 389 | "integrity" "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" 390 | "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" 391 | "version" "4.0.0" 392 | 393 | "deep-is@~0.1.3": 394 | "integrity" "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 395 | "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" 396 | "version" "0.1.3" 397 | 398 | "diff@5.0.0": 399 | "integrity" "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" 400 | "resolved" "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" 401 | "version" "5.0.0" 402 | 403 | "doctrine@^3.0.0": 404 | "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" 405 | "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" 406 | "version" "3.0.0" 407 | dependencies: 408 | "esutils" "^2.0.2" 409 | 410 | "emoji-regex@^7.0.1": 411 | "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 412 | "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" 413 | "version" "7.0.3" 414 | 415 | "emoji-regex@^8.0.0": 416 | "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 417 | "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 418 | "version" "8.0.0" 419 | 420 | "es6-promise@^4.0.3": 421 | "integrity" "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 422 | "resolved" "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" 423 | "version" "4.2.8" 424 | 425 | "es6-promisify@^5.0.0": 426 | "integrity" "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=" 427 | "resolved" "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz" 428 | "version" "5.0.0" 429 | dependencies: 430 | "es6-promise" "^4.0.3" 431 | 432 | "escalade@^3.1.1": 433 | "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 434 | "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" 435 | "version" "3.1.1" 436 | 437 | "escape-string-regexp@^1.0.5": 438 | "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 439 | "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 440 | "version" "1.0.5" 441 | 442 | "escape-string-regexp@4.0.0": 443 | "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" 444 | "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" 445 | "version" "4.0.0" 446 | 447 | "eslint-scope@^5.0.0": 448 | "integrity" "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==" 449 | "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz" 450 | "version" "5.0.0" 451 | dependencies: 452 | "esrecurse" "^4.1.0" 453 | "estraverse" "^4.1.1" 454 | 455 | "eslint-utils@^1.4.3": 456 | "integrity" "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==" 457 | "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz" 458 | "version" "1.4.3" 459 | dependencies: 460 | "eslint-visitor-keys" "^1.1.0" 461 | 462 | "eslint-utils@^2.0.0": 463 | "integrity" "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==" 464 | "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz" 465 | "version" "2.0.0" 466 | dependencies: 467 | "eslint-visitor-keys" "^1.1.0" 468 | 469 | "eslint-visitor-keys@^1.1.0": 470 | "integrity" "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" 471 | "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz" 472 | "version" "1.1.0" 473 | 474 | "eslint@*", "eslint@^5.0.0 || ^6.0.0", "eslint@^6.8.0": 475 | "integrity" "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==" 476 | "resolved" "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz" 477 | "version" "6.8.0" 478 | dependencies: 479 | "@babel/code-frame" "^7.0.0" 480 | "ajv" "^6.10.0" 481 | "chalk" "^2.1.0" 482 | "cross-spawn" "^6.0.5" 483 | "debug" "^4.0.1" 484 | "doctrine" "^3.0.0" 485 | "eslint-scope" "^5.0.0" 486 | "eslint-utils" "^1.4.3" 487 | "eslint-visitor-keys" "^1.1.0" 488 | "espree" "^6.1.2" 489 | "esquery" "^1.0.1" 490 | "esutils" "^2.0.2" 491 | "file-entry-cache" "^5.0.1" 492 | "functional-red-black-tree" "^1.0.1" 493 | "glob-parent" "^5.0.0" 494 | "globals" "^12.1.0" 495 | "ignore" "^4.0.6" 496 | "import-fresh" "^3.0.0" 497 | "imurmurhash" "^0.1.4" 498 | "inquirer" "^7.0.0" 499 | "is-glob" "^4.0.0" 500 | "js-yaml" "^3.13.1" 501 | "json-stable-stringify-without-jsonify" "^1.0.1" 502 | "levn" "^0.3.0" 503 | "lodash" "^4.17.14" 504 | "minimatch" "^3.0.4" 505 | "mkdirp" "^0.5.1" 506 | "natural-compare" "^1.4.0" 507 | "optionator" "^0.8.3" 508 | "progress" "^2.0.0" 509 | "regexpp" "^2.0.1" 510 | "semver" "^6.1.2" 511 | "strip-ansi" "^5.2.0" 512 | "strip-json-comments" "^3.0.1" 513 | "table" "^5.2.3" 514 | "text-table" "^0.2.0" 515 | "v8-compile-cache" "^2.0.3" 516 | 517 | "espree@^6.1.2": 518 | "integrity" "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==" 519 | "resolved" "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz" 520 | "version" "6.2.1" 521 | dependencies: 522 | "acorn" "^7.1.1" 523 | "acorn-jsx" "^5.2.0" 524 | "eslint-visitor-keys" "^1.1.0" 525 | 526 | "esprima@^4.0.0": 527 | "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 528 | "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" 529 | "version" "4.0.1" 530 | 531 | "esquery@^1.0.1": 532 | "integrity" "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==" 533 | "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz" 534 | "version" "1.3.1" 535 | dependencies: 536 | "estraverse" "^5.1.0" 537 | 538 | "esrecurse@^4.1.0": 539 | "integrity" "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==" 540 | "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz" 541 | "version" "4.2.1" 542 | dependencies: 543 | "estraverse" "^4.1.0" 544 | 545 | "estraverse@^4.1.0", "estraverse@^4.1.1": 546 | "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" 547 | "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" 548 | "version" "4.3.0" 549 | 550 | "estraverse@^5.1.0": 551 | "integrity" "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==" 552 | "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz" 553 | "version" "5.1.0" 554 | 555 | "esutils@^2.0.2": 556 | "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 557 | "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" 558 | "version" "2.0.3" 559 | 560 | "external-editor@^3.0.3": 561 | "integrity" "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==" 562 | "resolved" "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" 563 | "version" "3.1.0" 564 | dependencies: 565 | "chardet" "^0.7.0" 566 | "iconv-lite" "^0.4.24" 567 | "tmp" "^0.0.33" 568 | 569 | "fast-deep-equal@^3.1.1": 570 | "integrity" "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" 571 | "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz" 572 | "version" "3.1.1" 573 | 574 | "fast-json-stable-stringify@^2.0.0": 575 | "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 576 | "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" 577 | "version" "2.1.0" 578 | 579 | "fast-levenshtein@~2.0.6": 580 | "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 581 | "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" 582 | "version" "2.0.6" 583 | 584 | "fast-xml-parser@^4.3.2": 585 | "integrity" "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==" 586 | "resolved" "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz" 587 | "version" "4.3.2" 588 | dependencies: 589 | "strnum" "^1.0.5" 590 | 591 | "figures@^3.0.0": 592 | "integrity" "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==" 593 | "resolved" "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" 594 | "version" "3.2.0" 595 | dependencies: 596 | "escape-string-regexp" "^1.0.5" 597 | 598 | "file-entry-cache@^5.0.1": 599 | "integrity" "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==" 600 | "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz" 601 | "version" "5.0.1" 602 | dependencies: 603 | "flat-cache" "^2.0.1" 604 | 605 | "fill-range@^7.0.1": 606 | "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" 607 | "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" 608 | "version" "7.0.1" 609 | dependencies: 610 | "to-regex-range" "^5.0.1" 611 | 612 | "find-up@5.0.0": 613 | "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" 614 | "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" 615 | "version" "5.0.0" 616 | dependencies: 617 | "locate-path" "^6.0.0" 618 | "path-exists" "^4.0.0" 619 | 620 | "flat-cache@^2.0.1": 621 | "integrity" "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==" 622 | "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" 623 | "version" "2.0.1" 624 | dependencies: 625 | "flatted" "^2.0.0" 626 | "rimraf" "2.6.3" 627 | "write" "1.0.3" 628 | 629 | "flat@^5.0.2": 630 | "integrity" "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" 631 | "resolved" "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" 632 | "version" "5.0.2" 633 | 634 | "flatted@^2.0.0": 635 | "integrity" "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" 636 | "resolved" "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz" 637 | "version" "2.0.2" 638 | 639 | "fs.realpath@^1.0.0": 640 | "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 641 | "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 642 | "version" "1.0.0" 643 | 644 | "functional-red-black-tree@^1.0.1": 645 | "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" 646 | "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" 647 | "version" "1.0.1" 648 | 649 | "get-caller-file@^2.0.5": 650 | "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 651 | "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" 652 | "version" "2.0.5" 653 | 654 | "glob-parent@^5.0.0", "glob-parent@~5.1.2": 655 | "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" 656 | "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 657 | "version" "5.1.2" 658 | dependencies: 659 | "is-glob" "^4.0.1" 660 | 661 | "glob@^7.1.3", "glob@^7.1.6", "glob@7.2.0": 662 | "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==" 663 | "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" 664 | "version" "7.2.0" 665 | dependencies: 666 | "fs.realpath" "^1.0.0" 667 | "inflight" "^1.0.4" 668 | "inherits" "2" 669 | "minimatch" "^3.0.4" 670 | "once" "^1.3.0" 671 | "path-is-absolute" "^1.0.0" 672 | 673 | "globals@^12.1.0": 674 | "integrity" "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==" 675 | "resolved" "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" 676 | "version" "12.4.0" 677 | dependencies: 678 | "type-fest" "^0.8.1" 679 | 680 | "has-flag@^3.0.0": 681 | "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 682 | "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 683 | "version" "3.0.0" 684 | 685 | "has-flag@^4.0.0": 686 | "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 687 | "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" 688 | "version" "4.0.0" 689 | 690 | "he@1.2.0": 691 | "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" 692 | "resolved" "https://registry.npmjs.org/he/-/he-1.2.0.tgz" 693 | "version" "1.2.0" 694 | 695 | "http-proxy-agent@^2.1.0": 696 | "integrity" "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==" 697 | "resolved" "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz" 698 | "version" "2.1.0" 699 | dependencies: 700 | "agent-base" "4" 701 | "debug" "3.1.0" 702 | 703 | "https-proxy-agent@^2.2.4": 704 | "integrity" "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==" 705 | "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz" 706 | "version" "2.2.4" 707 | dependencies: 708 | "agent-base" "^4.3.0" 709 | "debug" "^3.1.0" 710 | 711 | "iconv-lite@^0.4.24": 712 | "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" 713 | "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" 714 | "version" "0.4.24" 715 | dependencies: 716 | "safer-buffer" ">= 2.1.2 < 3" 717 | 718 | "ignore@^4.0.6": 719 | "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" 720 | "resolved" "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" 721 | "version" "4.0.6" 722 | 723 | "import-fresh@^3.0.0": 724 | "integrity" "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==" 725 | "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz" 726 | "version" "3.2.1" 727 | dependencies: 728 | "parent-module" "^1.0.0" 729 | "resolve-from" "^4.0.0" 730 | 731 | "imurmurhash@^0.1.4": 732 | "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 733 | "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" 734 | "version" "0.1.4" 735 | 736 | "inflight@^1.0.4": 737 | "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" 738 | "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 739 | "version" "1.0.6" 740 | dependencies: 741 | "once" "^1.3.0" 742 | "wrappy" "1" 743 | 744 | "inherits@2": 745 | "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 746 | "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 747 | "version" "2.0.4" 748 | 749 | "inquirer@^7.0.0": 750 | "integrity" "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==" 751 | "resolved" "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz" 752 | "version" "7.1.0" 753 | dependencies: 754 | "ansi-escapes" "^4.2.1" 755 | "chalk" "^3.0.0" 756 | "cli-cursor" "^3.1.0" 757 | "cli-width" "^2.0.0" 758 | "external-editor" "^3.0.3" 759 | "figures" "^3.0.0" 760 | "lodash" "^4.17.15" 761 | "mute-stream" "0.0.8" 762 | "run-async" "^2.4.0" 763 | "rxjs" "^6.5.3" 764 | "string-width" "^4.1.0" 765 | "strip-ansi" "^6.0.0" 766 | "through" "^2.3.6" 767 | 768 | "is-binary-path@~2.1.0": 769 | "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" 770 | "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" 771 | "version" "2.1.0" 772 | dependencies: 773 | "binary-extensions" "^2.0.0" 774 | 775 | "is-extglob@^2.1.1": 776 | "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 777 | "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 778 | "version" "2.1.1" 779 | 780 | "is-fullwidth-code-point@^2.0.0": 781 | "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 782 | "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" 783 | "version" "2.0.0" 784 | 785 | "is-fullwidth-code-point@^3.0.0": 786 | "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 787 | "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 788 | "version" "3.0.0" 789 | 790 | "is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@~4.0.1": 791 | "integrity" "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==" 792 | "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" 793 | "version" "4.0.1" 794 | dependencies: 795 | "is-extglob" "^2.1.1" 796 | 797 | "is-number@^7.0.0": 798 | "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 799 | "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 800 | "version" "7.0.0" 801 | 802 | "is-plain-obj@^2.1.0": 803 | "integrity" "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" 804 | "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" 805 | "version" "2.1.0" 806 | 807 | "is-unicode-supported@^0.1.0": 808 | "integrity" "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" 809 | "resolved" "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" 810 | "version" "0.1.0" 811 | 812 | "isexe@^2.0.0": 813 | "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 814 | "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 815 | "version" "2.0.0" 816 | 817 | "js-tokens@^4.0.0": 818 | "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 819 | "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 820 | "version" "4.0.0" 821 | 822 | "js-yaml@^3.13.1": 823 | "integrity" "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==" 824 | "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" 825 | "version" "3.13.1" 826 | dependencies: 827 | "argparse" "^1.0.7" 828 | "esprima" "^4.0.0" 829 | 830 | "js-yaml@4.1.0": 831 | "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==" 832 | "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" 833 | "version" "4.1.0" 834 | dependencies: 835 | "argparse" "^2.0.1" 836 | 837 | "json-schema-traverse@^0.4.1": 838 | "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 839 | "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" 840 | "version" "0.4.1" 841 | 842 | "json-stable-stringify-without-jsonify@^1.0.1": 843 | "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 844 | "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" 845 | "version" "1.0.1" 846 | 847 | "levn@^0.3.0", "levn@~0.3.0": 848 | "integrity" "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=" 849 | "resolved" "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" 850 | "version" "0.3.0" 851 | dependencies: 852 | "prelude-ls" "~1.1.2" 853 | "type-check" "~0.3.2" 854 | 855 | "locate-path@^6.0.0": 856 | "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" 857 | "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" 858 | "version" "6.0.0" 859 | dependencies: 860 | "p-locate" "^5.0.0" 861 | 862 | "lodash@^4.17.14", "lodash@^4.17.15": 863 | "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 864 | "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" 865 | "version" "4.17.21" 866 | 867 | "log-symbols@4.1.0": 868 | "integrity" "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==" 869 | "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" 870 | "version" "4.1.0" 871 | dependencies: 872 | "chalk" "^4.1.0" 873 | "is-unicode-supported" "^0.1.0" 874 | 875 | "mimic-fn@^2.1.0": 876 | "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 877 | "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" 878 | "version" "2.1.0" 879 | 880 | "minimatch@^3.0.4": 881 | "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" 882 | "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" 883 | "version" "3.1.2" 884 | dependencies: 885 | "brace-expansion" "^1.1.7" 886 | 887 | "minimatch@5.0.1": 888 | "integrity" "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==" 889 | "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" 890 | "version" "5.0.1" 891 | dependencies: 892 | "brace-expansion" "^2.0.1" 893 | 894 | "minimist@^1.2.5": 895 | "integrity" "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" 896 | "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" 897 | "version" "1.2.8" 898 | 899 | "mkdirp@^0.5.1": 900 | "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==" 901 | "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" 902 | "version" "0.5.5" 903 | dependencies: 904 | "minimist" "^1.2.5" 905 | 906 | "mocha@^10.2.0": 907 | "integrity" "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==" 908 | "resolved" "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz" 909 | "version" "10.2.0" 910 | dependencies: 911 | "ansi-colors" "4.1.1" 912 | "browser-stdout" "1.3.1" 913 | "chokidar" "3.5.3" 914 | "debug" "4.3.4" 915 | "diff" "5.0.0" 916 | "escape-string-regexp" "4.0.0" 917 | "find-up" "5.0.0" 918 | "glob" "7.2.0" 919 | "he" "1.2.0" 920 | "js-yaml" "4.1.0" 921 | "log-symbols" "4.1.0" 922 | "minimatch" "5.0.1" 923 | "ms" "2.1.3" 924 | "nanoid" "3.3.3" 925 | "serialize-javascript" "6.0.0" 926 | "strip-json-comments" "3.1.1" 927 | "supports-color" "8.1.1" 928 | "workerpool" "6.2.1" 929 | "yargs" "16.2.0" 930 | "yargs-parser" "20.2.4" 931 | "yargs-unparser" "2.0.0" 932 | 933 | "ms@^2.1.1", "ms@2.1.2": 934 | "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 935 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 936 | "version" "2.1.2" 937 | 938 | "ms@2.0.0": 939 | "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 940 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" 941 | "version" "2.0.0" 942 | 943 | "ms@2.1.3": 944 | "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 945 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 946 | "version" "2.1.3" 947 | 948 | "mute-stream@0.0.8": 949 | "integrity" "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 950 | "resolved" "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" 951 | "version" "0.0.8" 952 | 953 | "nanoid@3.3.3": 954 | "integrity" "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==" 955 | "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" 956 | "version" "3.3.3" 957 | 958 | "natural-compare@^1.4.0": 959 | "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" 960 | "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" 961 | "version" "1.4.0" 962 | 963 | "nice-try@^1.0.4": 964 | "integrity" "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 965 | "resolved" "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" 966 | "version" "1.0.5" 967 | 968 | "normalize-path@^3.0.0", "normalize-path@~3.0.0": 969 | "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 970 | "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 971 | "version" "3.0.0" 972 | 973 | "once@^1.3.0": 974 | "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" 975 | "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 976 | "version" "1.4.0" 977 | dependencies: 978 | "wrappy" "1" 979 | 980 | "onetime@^5.1.0": 981 | "integrity" "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==" 982 | "resolved" "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz" 983 | "version" "5.1.0" 984 | dependencies: 985 | "mimic-fn" "^2.1.0" 986 | 987 | "optionator@^0.8.3": 988 | "integrity" "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==" 989 | "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" 990 | "version" "0.8.3" 991 | dependencies: 992 | "deep-is" "~0.1.3" 993 | "fast-levenshtein" "~2.0.6" 994 | "levn" "~0.3.0" 995 | "prelude-ls" "~1.1.2" 996 | "type-check" "~0.3.2" 997 | "word-wrap" "~1.2.3" 998 | 999 | "os-tmpdir@~1.0.2": 1000 | "integrity" "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 1001 | "resolved" "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" 1002 | "version" "1.0.2" 1003 | 1004 | "p-limit@^3.0.2": 1005 | "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" 1006 | "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" 1007 | "version" "3.1.0" 1008 | dependencies: 1009 | "yocto-queue" "^0.1.0" 1010 | 1011 | "p-locate@^5.0.0": 1012 | "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" 1013 | "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" 1014 | "version" "5.0.0" 1015 | dependencies: 1016 | "p-limit" "^3.0.2" 1017 | 1018 | "parent-module@^1.0.0": 1019 | "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" 1020 | "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" 1021 | "version" "1.0.1" 1022 | dependencies: 1023 | "callsites" "^3.0.0" 1024 | 1025 | "path-exists@^4.0.0": 1026 | "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 1027 | "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" 1028 | "version" "4.0.0" 1029 | 1030 | "path-is-absolute@^1.0.0": 1031 | "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1032 | "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 1033 | "version" "1.0.1" 1034 | 1035 | "path-key@^2.0.1": 1036 | "integrity" "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 1037 | "resolved" "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" 1038 | "version" "2.0.1" 1039 | 1040 | "picomatch@^2.0.4", "picomatch@^2.2.1": 1041 | "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 1042 | "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 1043 | "version" "2.3.1" 1044 | 1045 | "prelude-ls@~1.1.2": 1046 | "integrity" "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 1047 | "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" 1048 | "version" "1.1.2" 1049 | 1050 | "progress@^2.0.0": 1051 | "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 1052 | "resolved" "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" 1053 | "version" "2.0.3" 1054 | 1055 | "punycode@^2.1.0": 1056 | "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1057 | "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" 1058 | "version" "2.1.1" 1059 | 1060 | "randombytes@^2.1.0": 1061 | "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" 1062 | "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" 1063 | "version" "2.1.0" 1064 | dependencies: 1065 | "safe-buffer" "^5.1.0" 1066 | 1067 | "readdirp@~3.6.0": 1068 | "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" 1069 | "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" 1070 | "version" "3.6.0" 1071 | dependencies: 1072 | "picomatch" "^2.2.1" 1073 | 1074 | "regexpp@^2.0.1": 1075 | "integrity" "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" 1076 | "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz" 1077 | "version" "2.0.1" 1078 | 1079 | "regexpp@^3.0.0": 1080 | "integrity" "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" 1081 | "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz" 1082 | "version" "3.1.0" 1083 | 1084 | "require-directory@^2.1.1": 1085 | "integrity" "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" 1086 | "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" 1087 | "version" "2.1.1" 1088 | 1089 | "resolve-from@^4.0.0": 1090 | "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" 1091 | "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" 1092 | "version" "4.0.0" 1093 | 1094 | "restore-cursor@^3.1.0": 1095 | "integrity" "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==" 1096 | "resolved" "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" 1097 | "version" "3.1.0" 1098 | dependencies: 1099 | "onetime" "^5.1.0" 1100 | "signal-exit" "^3.0.2" 1101 | 1102 | "rimraf@^2.6.3", "rimraf@2.6.3": 1103 | "integrity" "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==" 1104 | "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" 1105 | "version" "2.6.3" 1106 | dependencies: 1107 | "glob" "^7.1.3" 1108 | 1109 | "run-async@^2.4.0": 1110 | "integrity" "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" 1111 | "resolved" "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" 1112 | "version" "2.4.1" 1113 | 1114 | "rxjs@^6.5.3": 1115 | "integrity" "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==" 1116 | "resolved" "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz" 1117 | "version" "6.5.5" 1118 | dependencies: 1119 | "tslib" "^1.9.0" 1120 | 1121 | "safe-buffer@^5.1.0": 1122 | "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1123 | "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 1124 | "version" "5.2.1" 1125 | 1126 | "safer-buffer@>= 2.1.2 < 3": 1127 | "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1128 | "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 1129 | "version" "2.1.2" 1130 | 1131 | "semver@^5.5.0": 1132 | "integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" 1133 | "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" 1134 | "version" "5.7.2" 1135 | 1136 | "semver@^6.1.2", "semver@^6.3.0": 1137 | "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" 1138 | "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" 1139 | "version" "6.3.1" 1140 | 1141 | "serialize-javascript@6.0.0": 1142 | "integrity" "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==" 1143 | "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" 1144 | "version" "6.0.0" 1145 | dependencies: 1146 | "randombytes" "^2.1.0" 1147 | 1148 | "shebang-command@^1.2.0": 1149 | "integrity" "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=" 1150 | "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" 1151 | "version" "1.2.0" 1152 | dependencies: 1153 | "shebang-regex" "^1.0.0" 1154 | 1155 | "shebang-regex@^1.0.0": 1156 | "integrity" "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 1157 | "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" 1158 | "version" "1.0.0" 1159 | 1160 | "signal-exit@^3.0.2": 1161 | "integrity" "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 1162 | "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz" 1163 | "version" "3.0.3" 1164 | 1165 | "slice-ansi@^2.1.0": 1166 | "integrity" "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==" 1167 | "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz" 1168 | "version" "2.1.0" 1169 | dependencies: 1170 | "ansi-styles" "^3.2.0" 1171 | "astral-regex" "^1.0.0" 1172 | "is-fullwidth-code-point" "^2.0.0" 1173 | 1174 | "sprintf-js@~1.0.2": 1175 | "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 1176 | "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" 1177 | "version" "1.0.3" 1178 | 1179 | "string-width@^3.0.0": 1180 | "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==" 1181 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" 1182 | "version" "3.1.0" 1183 | dependencies: 1184 | "emoji-regex" "^7.0.1" 1185 | "is-fullwidth-code-point" "^2.0.0" 1186 | "strip-ansi" "^5.1.0" 1187 | 1188 | "string-width@^4.1.0", "string-width@^4.2.0": 1189 | "integrity" "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==" 1190 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz" 1191 | "version" "4.2.0" 1192 | dependencies: 1193 | "emoji-regex" "^8.0.0" 1194 | "is-fullwidth-code-point" "^3.0.0" 1195 | "strip-ansi" "^6.0.0" 1196 | 1197 | "strip-ansi@^5.1.0", "strip-ansi@^5.2.0": 1198 | "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" 1199 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" 1200 | "version" "5.2.0" 1201 | dependencies: 1202 | "ansi-regex" "^4.1.0" 1203 | 1204 | "strip-ansi@^6.0.0": 1205 | "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" 1206 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" 1207 | "version" "6.0.1" 1208 | dependencies: 1209 | "ansi-regex" "^5.0.1" 1210 | 1211 | "strip-json-comments@^3.0.1", "strip-json-comments@3.1.1": 1212 | "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" 1213 | "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" 1214 | "version" "3.1.1" 1215 | 1216 | "strnum@^1.0.5": 1217 | "integrity" "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" 1218 | "resolved" "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" 1219 | "version" "1.0.5" 1220 | 1221 | "supports-color@^5.3.0": 1222 | "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" 1223 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 1224 | "version" "5.5.0" 1225 | dependencies: 1226 | "has-flag" "^3.0.0" 1227 | 1228 | "supports-color@^7.1.0": 1229 | "integrity" "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==" 1230 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz" 1231 | "version" "7.1.0" 1232 | dependencies: 1233 | "has-flag" "^4.0.0" 1234 | 1235 | "supports-color@8.1.1": 1236 | "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" 1237 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" 1238 | "version" "8.1.1" 1239 | dependencies: 1240 | "has-flag" "^4.0.0" 1241 | 1242 | "table@^5.2.3": 1243 | "integrity" "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==" 1244 | "resolved" "https://registry.npmjs.org/table/-/table-5.4.6.tgz" 1245 | "version" "5.4.6" 1246 | dependencies: 1247 | "ajv" "^6.10.2" 1248 | "lodash" "^4.17.14" 1249 | "slice-ansi" "^2.1.0" 1250 | "string-width" "^3.0.0" 1251 | 1252 | "text-table@^0.2.0": 1253 | "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" 1254 | "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" 1255 | "version" "0.2.0" 1256 | 1257 | "through@^2.3.6": 1258 | "integrity" "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1259 | "resolved" "https://registry.npmjs.org/through/-/through-2.3.8.tgz" 1260 | "version" "2.3.8" 1261 | 1262 | "tmp@^0.0.33": 1263 | "integrity" "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==" 1264 | "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" 1265 | "version" "0.0.33" 1266 | dependencies: 1267 | "os-tmpdir" "~1.0.2" 1268 | 1269 | "to-regex-range@^5.0.1": 1270 | "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" 1271 | "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 1272 | "version" "5.0.1" 1273 | dependencies: 1274 | "is-number" "^7.0.0" 1275 | 1276 | "tslib@^1.8.1", "tslib@^1.9.0": 1277 | "integrity" "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" 1278 | "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz" 1279 | "version" "1.11.1" 1280 | 1281 | "tsutils@^3.17.1": 1282 | "integrity" "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==" 1283 | "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz" 1284 | "version" "3.17.1" 1285 | dependencies: 1286 | "tslib" "^1.8.1" 1287 | 1288 | "type-check@~0.3.2": 1289 | "integrity" "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=" 1290 | "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" 1291 | "version" "0.3.2" 1292 | dependencies: 1293 | "prelude-ls" "~1.1.2" 1294 | 1295 | "type-fest@^0.11.0": 1296 | "integrity" "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" 1297 | "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz" 1298 | "version" "0.11.0" 1299 | 1300 | "type-fest@^0.8.1": 1301 | "integrity" "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" 1302 | "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" 1303 | "version" "0.8.1" 1304 | 1305 | "typescript@^3.7.5", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta": 1306 | "integrity" "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" 1307 | "resolved" "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz" 1308 | "version" "3.8.3" 1309 | 1310 | "uri-js@^4.2.2": 1311 | "integrity" "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==" 1312 | "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz" 1313 | "version" "4.2.2" 1314 | dependencies: 1315 | "punycode" "^2.1.0" 1316 | 1317 | "v8-compile-cache@^2.0.3": 1318 | "integrity" "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" 1319 | "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz" 1320 | "version" "2.1.0" 1321 | 1322 | "vscode-test@^1.3.0": 1323 | "integrity" "sha512-LddukcBiSU2FVTDr3c1D8lwkiOvwlJdDL2hqVbn6gIz+rpTqUCkMZSKYm94Y1v0WXlHSDQBsXyY+tchWQgGVsw==" 1324 | "resolved" "https://registry.npmjs.org/vscode-test/-/vscode-test-1.3.0.tgz" 1325 | "version" "1.3.0" 1326 | dependencies: 1327 | "http-proxy-agent" "^2.1.0" 1328 | "https-proxy-agent" "^2.2.4" 1329 | "rimraf" "^2.6.3" 1330 | 1331 | "which@^1.2.9": 1332 | "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" 1333 | "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz" 1334 | "version" "1.3.1" 1335 | dependencies: 1336 | "isexe" "^2.0.0" 1337 | 1338 | "word-wrap@~1.2.3": 1339 | "integrity" "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" 1340 | "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" 1341 | "version" "1.2.5" 1342 | 1343 | "workerpool@6.2.1": 1344 | "integrity" "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" 1345 | "resolved" "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" 1346 | "version" "6.2.1" 1347 | 1348 | "wrap-ansi@^7.0.0": 1349 | "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" 1350 | "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" 1351 | "version" "7.0.0" 1352 | dependencies: 1353 | "ansi-styles" "^4.0.0" 1354 | "string-width" "^4.1.0" 1355 | "strip-ansi" "^6.0.0" 1356 | 1357 | "wrappy@1": 1358 | "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1359 | "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 1360 | "version" "1.0.2" 1361 | 1362 | "write@1.0.3": 1363 | "integrity" "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==" 1364 | "resolved" "https://registry.npmjs.org/write/-/write-1.0.3.tgz" 1365 | "version" "1.0.3" 1366 | dependencies: 1367 | "mkdirp" "^0.5.1" 1368 | 1369 | "y18n@^5.0.5": 1370 | "integrity" "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 1371 | "resolved" "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" 1372 | "version" "5.0.8" 1373 | 1374 | "yargs-parser@^20.2.2", "yargs-parser@20.2.4": 1375 | "integrity" "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" 1376 | "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" 1377 | "version" "20.2.4" 1378 | 1379 | "yargs-unparser@2.0.0": 1380 | "integrity" "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==" 1381 | "resolved" "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" 1382 | "version" "2.0.0" 1383 | dependencies: 1384 | "camelcase" "^6.0.0" 1385 | "decamelize" "^4.0.0" 1386 | "flat" "^5.0.2" 1387 | "is-plain-obj" "^2.1.0" 1388 | 1389 | "yargs@16.2.0": 1390 | "integrity" "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==" 1391 | "resolved" "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" 1392 | "version" "16.2.0" 1393 | dependencies: 1394 | "cliui" "^7.0.2" 1395 | "escalade" "^3.1.1" 1396 | "get-caller-file" "^2.0.5" 1397 | "require-directory" "^2.1.1" 1398 | "string-width" "^4.2.0" 1399 | "y18n" "^5.0.5" 1400 | "yargs-parser" "^20.2.2" 1401 | 1402 | "yocto-queue@^0.1.0": 1403 | "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" 1404 | "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" 1405 | "version" "0.1.0" 1406 | --------------------------------------------------------------------------------