├── .eslintignore ├── .eslintrc.js ├── .eslintrc.json ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── Makefile ├── README.md ├── TODO.md ├── client ├── package-lock.json ├── package.json ├── src │ ├── extension.ts │ └── test │ │ ├── completion.test.ts │ │ ├── diagnostics.test.ts │ │ ├── helper.ts │ │ ├── index.ts │ │ └── runTest.ts ├── testFixture │ ├── completion.txt │ └── diagnostics.txt └── tsconfig.json ├── libexec └── .gitkeep ├── package-lock.json ├── package.json ├── scripts └── e2e.sh ├── solidity-configuration.json ├── solidity-snippets.json ├── solidity-syntax.json └── tsconfig.json /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/** 2 | client/node_modules/** 3 | client/out/** 4 | server/node_modules/** 5 | server/out/** -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | /**@type {import('eslint').Linter.Config} */ 2 | // eslint-disable-next-line no-undef 3 | module.exports = { 4 | root: true, 5 | parser: '@typescript-eslint/parser', 6 | plugins: [ 7 | '@typescript-eslint', 8 | ], 9 | extends: [ 10 | 'eslint:recommended', 11 | 'plugin:@typescript-eslint/recommended', 12 | ], 13 | rules: { 14 | 'semi': [2, "always"], 15 | '@typescript-eslint/no-unused-vars': 0, 16 | '@typescript-eslint/no-explicit-any': 0, 17 | '@typescript-eslint/explicit-module-boundary-types': 0, 18 | '@typescript-eslint/no-non-null-assertion': 0, 19 | } 20 | }; -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "@typescript-eslint/parser", 3 | "parserOptions": { 4 | "ecmaVersion": 6, 5 | "sourceType": "module" 6 | }, 7 | "env": { 8 | "node": true 9 | }, 10 | "rules": { 11 | "semi": "error", 12 | "no-extra-semi": "warn", 13 | "curly": "warn", 14 | "quotes": ["error", "single", { "allowTemplateLiterals": true } ], 15 | "eqeqeq": "error", 16 | "indent": ["warn", "tab", { "SwitchCase": 1 } ] 17 | } 18 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | npm-debug.log 3 | Thumbs.db 4 | */out/ 5 | */.vs/ 6 | */node_modules/ 7 | node_modules 8 | 9 | # vscode extension package, generated via `vsce package` 10 | *.vsix 11 | .azure-access-token.txt 12 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. 3 | // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp 4 | 5 | // List of extensions which should be recommended for users of this workspace. 6 | "recommendations": [ 7 | ] 8 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | { 3 | "version": "0.2.0", 4 | "configurations": [ 5 | { 6 | "type": "extensionHost", 7 | "request": "launch", 8 | "name": "Launch LSP Client", 9 | "runtimeExecutable": "${execPath}", 10 | "args": ["--extensionDevelopmentPath=${workspaceRoot}"], 11 | "outFiles": ["${workspaceRoot}/client/out/**/*.js"], 12 | "preLaunchTask": { 13 | "type": "npm", 14 | "script": "watch" 15 | } 16 | }, 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.insertSpaces": false, 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "npm", 6 | "script": "compile", 7 | "group": "build", 8 | "presentation": { 9 | "panel": "dedicated", 10 | "reveal": "never" 11 | }, 12 | "problemMatcher": [ 13 | "$tsc" 14 | ] 15 | }, 16 | { 17 | "type": "npm", 18 | "script": "watch", 19 | "isBackground": true, 20 | "group": { 21 | "kind": "build", 22 | "isDefault": true 23 | }, 24 | "presentation": { 25 | "panel": "dedicated", 26 | "reveal": "never" 27 | }, 28 | "problemMatcher": [ 29 | "$tsc-watch" 30 | ] 31 | } 32 | ] 33 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | **/*.ts 3 | **/*.map 4 | .gitignore 5 | .gitkeep 6 | **/tsconfig.json 7 | **/tsconfig.base.json 8 | contributing.md 9 | .travis.yml 10 | client/node_modules/** 11 | !client/node_modules/vscode-jsonrpc/** 12 | !client/node_modules/vscode-languageclient/** 13 | !client/node_modules/vscode-languageserver-protocol/** 14 | !client/node_modules/vscode-languageserver-types/** 15 | !client/node_modules/semver/** 16 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # "Visual Studio Code Extensions", a tool for managing VScode extensions 2 | # -> install via: npm install -g vsce 3 | VSCE = vsce 4 | PACKAGE_VERSION = 0.0.1 5 | 6 | clean: 7 | rm -f solidity-*.vsix 8 | 9 | package: 10 | $(VSCE) package 11 | 12 | install: 13 | code --install-extension solidity-$(PACKAGE_VERSION).vsix 14 | 15 | .PHONY: package install clean 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Native Solidity Language Server for Visual Studio Code 2 | 3 | **IMPORTANT: THIS PROJECT IS IN ALPHA STAGE & ACTIVE DEVELOPMENT** 4 | 5 | This Visual Studio Code extension is using the `solc` builtin language server to provide 6 | LSP capabilities to the editor. 7 | 8 | ### Configuration 9 | 10 | * `Solidity.solc.path`: path to native solc executable or `null` to use the bundled solc binary. 11 | * `Solidity.solc.logpath`: path to logfile `solc` should log to or `null` to disable logging. 12 | * `Solidity.trace.server`: One of `Off`, `Messages`, `Verbose` to configure LSP level logging on the client side. 13 | 14 | ### Note 15 | 16 | The bundled `solc` binary was built on Ubuntu 20.10 and may not work on every machine. 17 | This will be changed to a static build for Linux and also extended to OS/X and Windows binaries soon. 18 | 19 | ### Remarks 20 | 21 | Some source files (`solidity-snippets.json`, `solidity-syntax.json`, `solidity-configuration.json`) were 22 | originally taking from https://github.com/juanfranblanco/vscode-solidity/. 23 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | # TODO 2 | 3 | - [x] get it initially working 4 | - [x] local solc executable path be configurable 5 | - [x] How to make use of a custom settings object to be passed to the client. 6 | - [ ] config: path to server side log file 7 | -------------------------------------------------------------------------------- /client/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "solidity-lsp", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/vscode": { 8 | "version": "1.43.0", 9 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.43.0.tgz", 10 | "integrity": "sha512-kIaR9qzd80rJOxePKpCB/mdy00mz8Apt2QA5Y6rdrKFn13QNFNeP3Hzmsf37Bwh/3cS7QjtAeGSK7wSqAU0sYQ==", 11 | "dev": true 12 | }, 13 | "agent-base": { 14 | "version": "4.3.0", 15 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 16 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 17 | "dev": true, 18 | "requires": { 19 | "es6-promisify": "^5.0.0" 20 | } 21 | }, 22 | "balanced-match": { 23 | "version": "1.0.0", 24 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 25 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 26 | "dev": true 27 | }, 28 | "brace-expansion": { 29 | "version": "1.1.11", 30 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 31 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 32 | "dev": true, 33 | "requires": { 34 | "balanced-match": "^1.0.0", 35 | "concat-map": "0.0.1" 36 | } 37 | }, 38 | "concat-map": { 39 | "version": "0.0.1", 40 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 41 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 42 | "dev": true 43 | }, 44 | "debug": { 45 | "version": "3.1.0", 46 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 47 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 48 | "dev": true, 49 | "requires": { 50 | "ms": "2.0.0" 51 | } 52 | }, 53 | "es6-promise": { 54 | "version": "4.2.8", 55 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 56 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 57 | "dev": true 58 | }, 59 | "es6-promisify": { 60 | "version": "5.0.0", 61 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 62 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 63 | "dev": true, 64 | "requires": { 65 | "es6-promise": "^4.0.3" 66 | } 67 | }, 68 | "fs.realpath": { 69 | "version": "1.0.0", 70 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 71 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 72 | "dev": true 73 | }, 74 | "glob": { 75 | "version": "7.1.6", 76 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 77 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 78 | "dev": true, 79 | "requires": { 80 | "fs.realpath": "^1.0.0", 81 | "inflight": "^1.0.4", 82 | "inherits": "2", 83 | "minimatch": "^3.0.4", 84 | "once": "^1.3.0", 85 | "path-is-absolute": "^1.0.0" 86 | } 87 | }, 88 | "http-proxy-agent": { 89 | "version": "2.1.0", 90 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 91 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 92 | "dev": true, 93 | "requires": { 94 | "agent-base": "4", 95 | "debug": "3.1.0" 96 | } 97 | }, 98 | "https-proxy-agent": { 99 | "version": "2.2.4", 100 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 101 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 102 | "dev": true, 103 | "requires": { 104 | "agent-base": "^4.3.0", 105 | "debug": "^3.1.0" 106 | } 107 | }, 108 | "inflight": { 109 | "version": "1.0.6", 110 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 111 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 112 | "dev": true, 113 | "requires": { 114 | "once": "^1.3.0", 115 | "wrappy": "1" 116 | } 117 | }, 118 | "inherits": { 119 | "version": "2.0.4", 120 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 121 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 122 | "dev": true 123 | }, 124 | "minimatch": { 125 | "version": "3.0.4", 126 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 127 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 128 | "dev": true, 129 | "requires": { 130 | "brace-expansion": "^1.1.7" 131 | } 132 | }, 133 | "ms": { 134 | "version": "2.0.0", 135 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 136 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 137 | "dev": true 138 | }, 139 | "once": { 140 | "version": "1.4.0", 141 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 142 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 143 | "dev": true, 144 | "requires": { 145 | "wrappy": "1" 146 | } 147 | }, 148 | "path-is-absolute": { 149 | "version": "1.0.1", 150 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 151 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 152 | "dev": true 153 | }, 154 | "rimraf": { 155 | "version": "2.7.1", 156 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 157 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 158 | "dev": true, 159 | "requires": { 160 | "glob": "^7.1.3" 161 | } 162 | }, 163 | "vscode-jsonrpc": { 164 | "version": "5.0.1", 165 | "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz", 166 | "integrity": "sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==" 167 | }, 168 | "vscode-languageclient": { 169 | "version": "6.1.3", 170 | "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-6.1.3.tgz", 171 | "integrity": "sha512-YciJxk08iU5LmWu7j5dUt9/1OLjokKET6rME3cI4BRpiF6HZlusm2ZwPt0MYJ0lV5y43sZsQHhyon2xBg4ZJVA==", 172 | "requires": { 173 | "semver": "^6.3.0", 174 | "vscode-languageserver-protocol": "^3.15.3" 175 | }, 176 | "dependencies": { 177 | "semver": { 178 | "version": "6.3.0", 179 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 180 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 181 | } 182 | } 183 | }, 184 | "vscode-languageserver-protocol": { 185 | "version": "3.15.3", 186 | "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz", 187 | "integrity": "sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw==", 188 | "requires": { 189 | "vscode-jsonrpc": "^5.0.1", 190 | "vscode-languageserver-types": "3.15.1" 191 | } 192 | }, 193 | "vscode-languageserver-types": { 194 | "version": "3.15.1", 195 | "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz", 196 | "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==" 197 | }, 198 | "vscode-test": { 199 | "version": "1.3.0", 200 | "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.3.0.tgz", 201 | "integrity": "sha512-LddukcBiSU2FVTDr3c1D8lwkiOvwlJdDL2hqVbn6gIz+rpTqUCkMZSKYm94Y1v0WXlHSDQBsXyY+tchWQgGVsw==", 202 | "dev": true, 203 | "requires": { 204 | "http-proxy-agent": "^2.1.0", 205 | "https-proxy-agent": "^2.2.4", 206 | "rimraf": "^2.6.3" 207 | } 208 | }, 209 | "wrappy": { 210 | "version": "1.0.2", 211 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 212 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 213 | "dev": true 214 | } 215 | } 216 | } 217 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "solidity-lsp", 3 | "description": "VSCode (client) part of the Solidity language server", 4 | "author": "Solidity developers at Ethereum Foundation", 5 | "license": "MIT", 6 | "version": "0.0.1", 7 | "publisher": "ethereum", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/christianparpart/solidity-language-client-vscode" 11 | }, 12 | "engines": { 13 | "vscode": "^1.43.0" 14 | }, 15 | "dependencies": { 16 | "vscode-languageclient": "^6.1.3" 17 | }, 18 | "devDependencies": { 19 | "@types/vscode": "1.43.0", 20 | "vscode-test": "^1.3.0" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /client/src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as vscode from 'vscode'; 3 | import { workspace, ExtensionContext } from 'vscode'; 4 | 5 | import { 6 | LanguageClient, 7 | LanguageClientOptions, 8 | ServerOptions, 9 | Trace, 10 | TransportKind, 11 | } from 'vscode-languageclient'; 12 | 13 | let client: LanguageClient; 14 | 15 | interface SoliditySettings { 16 | // option for backward compatibilities, please use "linter" option instead 17 | solcPath: string | null; 18 | linter: boolean | string; 19 | enabledAsYouTypeCompilationErrorCheck: boolean; 20 | compileUsingLocalVersion: string; 21 | compileUsingRemoteVersion: string; 22 | nodemodulespackage: string; 23 | defaultCompiler: string; 24 | soliumRules: any; 25 | solhintRules: any; 26 | validationDelay: number; 27 | packageDefaultDependenciesDirectory: string; 28 | packageDefaultDependenciesContractsDirectory: string; 29 | } 30 | 31 | interface Settings { 32 | solidity: SoliditySettings; 33 | } 34 | 35 | export function activate(context: ExtensionContext) 36 | { 37 | let config = vscode.workspace.getConfiguration('Solidity'); 38 | let solcPath = config.get("solc.path"); 39 | let traceServer = config.get("trace.server"); 40 | 41 | const builtinSolcPath = context.extensionPath + '/libexec/solc-linux64'; 42 | 43 | if (solcPath == null || solcPath.trim() == '') 44 | solcPath = builtinSolcPath; 45 | 46 | console.log("Using solc binary: " + solcPath); 47 | 48 | let solcArgs = []; 49 | solcArgs.push('--lsp'); 50 | 51 | // If the extension is launched in debug mode then the debug server options are used 52 | // Otherwise the run options are used 53 | let serverOptions: ServerOptions = { 54 | run: { transport: TransportKind.stdio, command: solcPath, args: solcArgs }, 55 | debug: { transport: TransportKind.stdio, command: solcPath, args: solcArgs } 56 | }; 57 | 58 | // Options to control the language client 59 | let clientOptions: LanguageClientOptions = { 60 | // Register the server for plain text documents 61 | documentSelector: [{ scheme: 'file', language: 'solidity' }], 62 | synchronize: { 63 | // Notify the server about file changes to '.clientrc files contained in the workspace 64 | fileEvents: workspace.createFileSystemWatcher('**/.clientrc') 65 | } 66 | }; 67 | 68 | // Create the language client and start the client. 69 | client = new LanguageClient( 70 | 'SoliditylanguageServer', 71 | 'Solidity Language Server', 72 | serverOptions, 73 | clientOptions 74 | ); 75 | 76 | // Configure communicatio1111n trace level. 77 | client.trace = Trace.fromString(traceServer); 78 | 79 | // Start the client. This will also launch the server 80 | client.start(); 81 | } 82 | 83 | export function deactivate(): Thenable | undefined { 84 | if (!client) { 85 | return undefined; 86 | } 87 | return client.stop(); 88 | } 89 | -------------------------------------------------------------------------------- /client/src/test/completion.test.ts: -------------------------------------------------------------------------------- 1 | /* -------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | * ------------------------------------------------------------------------------------------ */ 5 | 6 | import * as vscode from 'vscode'; 7 | import * as assert from 'assert'; 8 | import { getDocUri, activate } from './helper'; 9 | 10 | suite('Should do completion', () => { 11 | const docUri = getDocUri('completion.txt'); 12 | 13 | test('Completes JS/TS in txt file', async () => { 14 | await testCompletion(docUri, new vscode.Position(0, 0), { 15 | items: [ 16 | { label: 'JavaScript', kind: vscode.CompletionItemKind.Text }, 17 | { label: 'TypeScript', kind: vscode.CompletionItemKind.Text } 18 | ] 19 | }); 20 | }); 21 | }); 22 | 23 | async function testCompletion( 24 | docUri: vscode.Uri, 25 | position: vscode.Position, 26 | expectedCompletionList: vscode.CompletionList 27 | ) { 28 | await activate(docUri); 29 | 30 | // Executing the command `vscode.executeCompletionItemProvider` to simulate triggering completion 31 | const actualCompletionList = (await vscode.commands.executeCommand( 32 | 'vscode.executeCompletionItemProvider', 33 | docUri, 34 | position 35 | )) as vscode.CompletionList; 36 | 37 | assert.ok(actualCompletionList.items.length >= 2); 38 | expectedCompletionList.items.forEach((expectedItem, i) => { 39 | const actualItem = actualCompletionList.items[i]; 40 | assert.equal(actualItem.label, expectedItem.label); 41 | assert.equal(actualItem.kind, expectedItem.kind); 42 | }); 43 | } 44 | -------------------------------------------------------------------------------- /client/src/test/diagnostics.test.ts: -------------------------------------------------------------------------------- 1 | /* -------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | * ------------------------------------------------------------------------------------------ */ 5 | 6 | import * as vscode from 'vscode'; 7 | import * as assert from 'assert'; 8 | import { getDocUri, activate } from './helper'; 9 | 10 | suite('Should get diagnostics', () => { 11 | const docUri = getDocUri('diagnostics.txt'); 12 | 13 | test('Diagnoses uppercase texts', async () => { 14 | await testDiagnostics(docUri, [ 15 | { message: 'ANY is all uppercase.', range: toRange(0, 0, 0, 3), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' }, 16 | { message: 'ANY is all uppercase.', range: toRange(0, 14, 0, 17), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' }, 17 | { message: 'OS is all uppercase.', range: toRange(0, 18, 0, 20), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' } 18 | ]); 19 | }); 20 | }); 21 | 22 | function toRange(sLine: number, sChar: number, eLine: number, eChar: number) { 23 | const start = new vscode.Position(sLine, sChar); 24 | const end = new vscode.Position(eLine, eChar); 25 | return new vscode.Range(start, end); 26 | } 27 | 28 | async function testDiagnostics(docUri: vscode.Uri, expectedDiagnostics: vscode.Diagnostic[]) { 29 | await activate(docUri); 30 | 31 | const actualDiagnostics = vscode.languages.getDiagnostics(docUri); 32 | 33 | assert.equal(actualDiagnostics.length, expectedDiagnostics.length); 34 | 35 | expectedDiagnostics.forEach((expectedDiagnostic, i) => { 36 | const actualDiagnostic = actualDiagnostics[i]; 37 | assert.equal(actualDiagnostic.message, expectedDiagnostic.message); 38 | assert.deepEqual(actualDiagnostic.range, expectedDiagnostic.range); 39 | assert.equal(actualDiagnostic.severity, expectedDiagnostic.severity); 40 | }); 41 | } -------------------------------------------------------------------------------- /client/src/test/helper.ts: -------------------------------------------------------------------------------- 1 | /* -------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | * ------------------------------------------------------------------------------------------ */ 5 | 6 | import * as vscode from 'vscode'; 7 | import * as path from 'path'; 8 | 9 | export let doc: vscode.TextDocument; 10 | export let editor: vscode.TextEditor; 11 | export let documentEol: string; 12 | export let platformEol: string; 13 | 14 | /** 15 | * Activates the vscode.lsp-sample extension 16 | */ 17 | export async function activate(docUri: vscode.Uri) { 18 | // The extensionId is `publisher.name` from package.json 19 | const ext = vscode.extensions.getExtension('vscode-samples.lsp-sample')!; 20 | await ext.activate(); 21 | try { 22 | doc = await vscode.workspace.openTextDocument(docUri); 23 | editor = await vscode.window.showTextDocument(doc); 24 | await sleep(2000); // Wait for server activation 25 | } catch (e) { 26 | console.error(e); 27 | } 28 | } 29 | 30 | async function sleep(ms: number) { 31 | return new Promise(resolve => setTimeout(resolve, ms)); 32 | } 33 | 34 | export const getDocPath = (p: string) => { 35 | return path.resolve(__dirname, '../../testFixture', p); 36 | }; 37 | export const getDocUri = (p: string) => { 38 | return vscode.Uri.file(getDocPath(p)); 39 | }; 40 | 41 | export async function setTestContent(content: string): Promise { 42 | const all = new vscode.Range( 43 | doc.positionAt(0), 44 | doc.positionAt(doc.getText().length) 45 | ); 46 | return editor.edit(eb => eb.replace(all, content)); 47 | } 48 | -------------------------------------------------------------------------------- /client/src/test/index.ts: -------------------------------------------------------------------------------- 1 | /* -------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | * ------------------------------------------------------------------------------------------ */ 5 | import * as path from 'path'; 6 | import * as Mocha from 'mocha'; 7 | import * as glob from 'glob'; 8 | 9 | export function run(): Promise { 10 | // Create the mocha test 11 | const mocha = new Mocha({ 12 | ui: 'tdd', 13 | color: true 14 | }); 15 | mocha.timeout(100000); 16 | 17 | const testsRoot = __dirname; 18 | 19 | return new Promise((resolve, reject) => { 20 | glob('**.test.js', { cwd: testsRoot }, (err, files) => { 21 | if (err) { 22 | return reject(err); 23 | } 24 | 25 | // Add files to the test suite 26 | files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); 27 | 28 | try { 29 | // Run the mocha test 30 | mocha.run(failures => { 31 | if (failures > 0) { 32 | reject(new Error(`${failures} tests failed.`)); 33 | } else { 34 | resolve(); 35 | } 36 | }); 37 | } catch (err) { 38 | console.error(err); 39 | reject(err); 40 | } 41 | }); 42 | }); 43 | } -------------------------------------------------------------------------------- /client/src/test/runTest.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | *--------------------------------------------------------------------------------------------*/ 5 | import * as path from 'path'; 6 | 7 | import { runTests } from 'vscode-test'; 8 | 9 | async function main() { 10 | try { 11 | // The folder containing the Extension Manifest package.json 12 | // Passed to `--extensionDevelopmentPath` 13 | const extensionDevelopmentPath = path.resolve(__dirname, '../../../'); 14 | 15 | // The path to test runner 16 | // Passed to --extensionTestsPath 17 | const extensionTestsPath = path.resolve(__dirname, './index'); 18 | 19 | // Download VS Code, unzip it and run the integration test 20 | await runTests({ extensionDevelopmentPath, extensionTestsPath }); 21 | } catch (err) { 22 | console.error('Failed to run tests'); 23 | process.exit(1); 24 | } 25 | } 26 | 27 | main(); -------------------------------------------------------------------------------- /client/testFixture/completion.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/christianparpart/solidity-language-client-vscode/7b790e979e225bfe930c18b16faf96351dea2b4d/client/testFixture/completion.txt -------------------------------------------------------------------------------- /client/testFixture/diagnostics.txt: -------------------------------------------------------------------------------- 1 | ANY browsers, ANY OS. -------------------------------------------------------------------------------- /client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es2019", 5 | "lib": ["ES2019"], 6 | "outDir": "out", 7 | "rootDir": "src", 8 | "sourceMap": true 9 | }, 10 | "include": ["src"], 11 | "exclude": ["node_modules", ".vscode-test"] 12 | } 13 | -------------------------------------------------------------------------------- /libexec/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/christianparpart/solidity-language-client-vscode/7b790e979e225bfe930c18b16faf96351dea2b4d/libexec/.gitkeep -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "solidity", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.10.4", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 19 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.10.4", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 25 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.10.4", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | } 32 | }, 33 | "@types/color-name": { 34 | "version": "1.1.1", 35 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 36 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 37 | "dev": true 38 | }, 39 | "@types/eslint-visitor-keys": { 40 | "version": "1.0.0", 41 | "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 42 | "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", 43 | "dev": true 44 | }, 45 | "@types/json-schema": { 46 | "version": "7.0.5", 47 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", 48 | "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", 49 | "dev": true 50 | }, 51 | "@types/mocha": { 52 | "version": "8.2.3", 53 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", 54 | "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", 55 | "dev": true 56 | }, 57 | "@types/node": { 58 | "version": "12.20.37", 59 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.37.tgz", 60 | "integrity": "sha512-i1KGxqcvJaLQali+WuypQnXwcplhtNtjs66eNsZpp2P2FL/trJJxx/VWsM0YCL2iMoIJrbXje48lvIQAQ4p2ZA==", 61 | "dev": true 62 | }, 63 | "@typescript-eslint/experimental-utils": { 64 | "version": "2.34.0", 65 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", 66 | "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", 67 | "dev": true, 68 | "requires": { 69 | "@types/json-schema": "^7.0.3", 70 | "@typescript-eslint/typescript-estree": "2.34.0", 71 | "eslint-scope": "^5.0.0", 72 | "eslint-utils": "^2.0.0" 73 | } 74 | }, 75 | "@typescript-eslint/parser": { 76 | "version": "2.34.0", 77 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", 78 | "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", 79 | "dev": true, 80 | "requires": { 81 | "@types/eslint-visitor-keys": "^1.0.0", 82 | "@typescript-eslint/experimental-utils": "2.34.0", 83 | "@typescript-eslint/typescript-estree": "2.34.0", 84 | "eslint-visitor-keys": "^1.1.0" 85 | } 86 | }, 87 | "@typescript-eslint/typescript-estree": { 88 | "version": "2.34.0", 89 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", 90 | "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", 91 | "dev": true, 92 | "requires": { 93 | "debug": "^4.1.1", 94 | "eslint-visitor-keys": "^1.1.0", 95 | "glob": "^7.1.6", 96 | "is-glob": "^4.0.1", 97 | "lodash": "^4.17.15", 98 | "semver": "^7.3.2", 99 | "tsutils": "^3.17.1" 100 | } 101 | }, 102 | "@ungap/promise-all-settled": { 103 | "version": "1.1.2", 104 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 105 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", 106 | "dev": true 107 | }, 108 | "acorn": { 109 | "version": "7.3.1", 110 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", 111 | "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", 112 | "dev": true 113 | }, 114 | "acorn-jsx": { 115 | "version": "5.2.0", 116 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", 117 | "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", 118 | "dev": true 119 | }, 120 | "ajv": { 121 | "version": "6.12.3", 122 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", 123 | "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", 124 | "dev": true, 125 | "requires": { 126 | "fast-deep-equal": "^3.1.1", 127 | "fast-json-stable-stringify": "^2.0.0", 128 | "json-schema-traverse": "^0.4.1", 129 | "uri-js": "^4.2.2" 130 | } 131 | }, 132 | "ansi-colors": { 133 | "version": "4.1.1", 134 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 135 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 136 | "dev": true 137 | }, 138 | "ansi-escapes": { 139 | "version": "4.3.1", 140 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", 141 | "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", 142 | "dev": true, 143 | "requires": { 144 | "type-fest": "^0.11.0" 145 | }, 146 | "dependencies": { 147 | "type-fest": { 148 | "version": "0.11.0", 149 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", 150 | "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", 151 | "dev": true 152 | } 153 | } 154 | }, 155 | "ansi-regex": { 156 | "version": "5.0.0", 157 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 158 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 159 | "dev": true 160 | }, 161 | "ansi-styles": { 162 | "version": "3.2.1", 163 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 164 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 165 | "dev": true, 166 | "requires": { 167 | "color-convert": "^1.9.0" 168 | } 169 | }, 170 | "anymatch": { 171 | "version": "3.1.2", 172 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 173 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 174 | "dev": true, 175 | "requires": { 176 | "normalize-path": "^3.0.0", 177 | "picomatch": "^2.0.4" 178 | } 179 | }, 180 | "argparse": { 181 | "version": "1.0.10", 182 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 183 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 184 | "dev": true, 185 | "requires": { 186 | "sprintf-js": "~1.0.2" 187 | } 188 | }, 189 | "astral-regex": { 190 | "version": "1.0.0", 191 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 192 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 193 | "dev": true 194 | }, 195 | "balanced-match": { 196 | "version": "1.0.0", 197 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 198 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 199 | "dev": true 200 | }, 201 | "binary-extensions": { 202 | "version": "2.2.0", 203 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 204 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 205 | "dev": true 206 | }, 207 | "brace-expansion": { 208 | "version": "1.1.11", 209 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 210 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 211 | "dev": true, 212 | "requires": { 213 | "balanced-match": "^1.0.0", 214 | "concat-map": "0.0.1" 215 | } 216 | }, 217 | "braces": { 218 | "version": "3.0.2", 219 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 220 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 221 | "dev": true, 222 | "requires": { 223 | "fill-range": "^7.0.1" 224 | } 225 | }, 226 | "browser-stdout": { 227 | "version": "1.3.1", 228 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 229 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 230 | "dev": true 231 | }, 232 | "callsites": { 233 | "version": "3.1.0", 234 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 235 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 236 | "dev": true 237 | }, 238 | "camelcase": { 239 | "version": "6.2.1", 240 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", 241 | "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", 242 | "dev": true 243 | }, 244 | "chalk": { 245 | "version": "2.4.2", 246 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 247 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 248 | "dev": true, 249 | "requires": { 250 | "ansi-styles": "^3.2.1", 251 | "escape-string-regexp": "^1.0.5", 252 | "supports-color": "^5.3.0" 253 | } 254 | }, 255 | "chardet": { 256 | "version": "0.7.0", 257 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 258 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 259 | "dev": true 260 | }, 261 | "chokidar": { 262 | "version": "3.5.1", 263 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 264 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 265 | "dev": true, 266 | "requires": { 267 | "anymatch": "~3.1.1", 268 | "braces": "~3.0.2", 269 | "fsevents": "~2.3.1", 270 | "glob-parent": "~5.1.0", 271 | "is-binary-path": "~2.1.0", 272 | "is-glob": "~4.0.1", 273 | "normalize-path": "~3.0.0", 274 | "readdirp": "~3.5.0" 275 | } 276 | }, 277 | "cli-cursor": { 278 | "version": "3.1.0", 279 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 280 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 281 | "dev": true, 282 | "requires": { 283 | "restore-cursor": "^3.1.0" 284 | } 285 | }, 286 | "cli-width": { 287 | "version": "3.0.0", 288 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", 289 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", 290 | "dev": true 291 | }, 292 | "cliui": { 293 | "version": "7.0.4", 294 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 295 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 296 | "dev": true, 297 | "requires": { 298 | "string-width": "^4.2.0", 299 | "strip-ansi": "^6.0.0", 300 | "wrap-ansi": "^7.0.0" 301 | }, 302 | "dependencies": { 303 | "ansi-regex": { 304 | "version": "5.0.1", 305 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 306 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 307 | "dev": true 308 | }, 309 | "strip-ansi": { 310 | "version": "6.0.1", 311 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 312 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 313 | "dev": true, 314 | "requires": { 315 | "ansi-regex": "^5.0.1" 316 | } 317 | } 318 | } 319 | }, 320 | "color-convert": { 321 | "version": "1.9.3", 322 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 323 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 324 | "dev": true, 325 | "requires": { 326 | "color-name": "1.1.3" 327 | } 328 | }, 329 | "color-name": { 330 | "version": "1.1.3", 331 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 332 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 333 | "dev": true 334 | }, 335 | "concat-map": { 336 | "version": "0.0.1", 337 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 338 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 339 | "dev": true 340 | }, 341 | "cross-spawn": { 342 | "version": "6.0.5", 343 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 344 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 345 | "dev": true, 346 | "requires": { 347 | "nice-try": "^1.0.4", 348 | "path-key": "^2.0.1", 349 | "semver": "^5.5.0", 350 | "shebang-command": "^1.2.0", 351 | "which": "^1.2.9" 352 | }, 353 | "dependencies": { 354 | "semver": { 355 | "version": "5.7.1", 356 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 357 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 358 | "dev": true 359 | } 360 | } 361 | }, 362 | "debug": { 363 | "version": "4.1.1", 364 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 365 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 366 | "dev": true, 367 | "requires": { 368 | "ms": "^2.1.1" 369 | } 370 | }, 371 | "decamelize": { 372 | "version": "4.0.0", 373 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 374 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 375 | "dev": true 376 | }, 377 | "deep-is": { 378 | "version": "0.1.3", 379 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 380 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 381 | "dev": true 382 | }, 383 | "diff": { 384 | "version": "5.0.0", 385 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 386 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 387 | "dev": true 388 | }, 389 | "doctrine": { 390 | "version": "3.0.0", 391 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 392 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 393 | "dev": true, 394 | "requires": { 395 | "esutils": "^2.0.2" 396 | } 397 | }, 398 | "emoji-regex": { 399 | "version": "8.0.0", 400 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 401 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 402 | "dev": true 403 | }, 404 | "escalade": { 405 | "version": "3.1.1", 406 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 407 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 408 | "dev": true 409 | }, 410 | "escape-string-regexp": { 411 | "version": "1.0.5", 412 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 413 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 414 | "dev": true 415 | }, 416 | "eslint": { 417 | "version": "6.8.0", 418 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", 419 | "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", 420 | "dev": true, 421 | "requires": { 422 | "@babel/code-frame": "^7.0.0", 423 | "ajv": "^6.10.0", 424 | "chalk": "^2.1.0", 425 | "cross-spawn": "^6.0.5", 426 | "debug": "^4.0.1", 427 | "doctrine": "^3.0.0", 428 | "eslint-scope": "^5.0.0", 429 | "eslint-utils": "^1.4.3", 430 | "eslint-visitor-keys": "^1.1.0", 431 | "espree": "^6.1.2", 432 | "esquery": "^1.0.1", 433 | "esutils": "^2.0.2", 434 | "file-entry-cache": "^5.0.1", 435 | "functional-red-black-tree": "^1.0.1", 436 | "glob-parent": "^5.0.0", 437 | "globals": "^12.1.0", 438 | "ignore": "^4.0.6", 439 | "import-fresh": "^3.0.0", 440 | "imurmurhash": "^0.1.4", 441 | "inquirer": "^7.0.0", 442 | "is-glob": "^4.0.0", 443 | "js-yaml": "^3.13.1", 444 | "json-stable-stringify-without-jsonify": "^1.0.1", 445 | "levn": "^0.3.0", 446 | "lodash": "^4.17.14", 447 | "minimatch": "^3.0.4", 448 | "mkdirp": "^0.5.1", 449 | "natural-compare": "^1.4.0", 450 | "optionator": "^0.8.3", 451 | "progress": "^2.0.0", 452 | "regexpp": "^2.0.1", 453 | "semver": "^6.1.2", 454 | "strip-ansi": "^5.2.0", 455 | "strip-json-comments": "^3.0.1", 456 | "table": "^5.2.3", 457 | "text-table": "^0.2.0", 458 | "v8-compile-cache": "^2.0.3" 459 | }, 460 | "dependencies": { 461 | "eslint-utils": { 462 | "version": "1.4.3", 463 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 464 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 465 | "dev": true, 466 | "requires": { 467 | "eslint-visitor-keys": "^1.1.0" 468 | } 469 | }, 470 | "semver": { 471 | "version": "6.3.0", 472 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 473 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 474 | "dev": true 475 | } 476 | } 477 | }, 478 | "eslint-scope": { 479 | "version": "5.1.0", 480 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", 481 | "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", 482 | "dev": true, 483 | "requires": { 484 | "esrecurse": "^4.1.0", 485 | "estraverse": "^4.1.1" 486 | } 487 | }, 488 | "eslint-utils": { 489 | "version": "2.1.0", 490 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 491 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 492 | "dev": true, 493 | "requires": { 494 | "eslint-visitor-keys": "^1.1.0" 495 | } 496 | }, 497 | "eslint-visitor-keys": { 498 | "version": "1.3.0", 499 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 500 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 501 | "dev": true 502 | }, 503 | "espree": { 504 | "version": "6.2.1", 505 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", 506 | "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", 507 | "dev": true, 508 | "requires": { 509 | "acorn": "^7.1.1", 510 | "acorn-jsx": "^5.2.0", 511 | "eslint-visitor-keys": "^1.1.0" 512 | } 513 | }, 514 | "esprima": { 515 | "version": "4.0.1", 516 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 517 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 518 | "dev": true 519 | }, 520 | "esquery": { 521 | "version": "1.3.1", 522 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", 523 | "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", 524 | "dev": true, 525 | "requires": { 526 | "estraverse": "^5.1.0" 527 | }, 528 | "dependencies": { 529 | "estraverse": { 530 | "version": "5.1.0", 531 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", 532 | "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", 533 | "dev": true 534 | } 535 | } 536 | }, 537 | "esrecurse": { 538 | "version": "4.2.1", 539 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 540 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 541 | "dev": true, 542 | "requires": { 543 | "estraverse": "^4.1.0" 544 | } 545 | }, 546 | "estraverse": { 547 | "version": "4.3.0", 548 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 549 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 550 | "dev": true 551 | }, 552 | "esutils": { 553 | "version": "2.0.3", 554 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 555 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 556 | "dev": true 557 | }, 558 | "external-editor": { 559 | "version": "3.1.0", 560 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 561 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 562 | "dev": true, 563 | "requires": { 564 | "chardet": "^0.7.0", 565 | "iconv-lite": "^0.4.24", 566 | "tmp": "^0.0.33" 567 | } 568 | }, 569 | "fast-deep-equal": { 570 | "version": "3.1.3", 571 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 572 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 573 | "dev": true 574 | }, 575 | "fast-json-stable-stringify": { 576 | "version": "2.1.0", 577 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 578 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 579 | "dev": true 580 | }, 581 | "fast-levenshtein": { 582 | "version": "2.0.6", 583 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 584 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 585 | "dev": true 586 | }, 587 | "figures": { 588 | "version": "3.2.0", 589 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 590 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 591 | "dev": true, 592 | "requires": { 593 | "escape-string-regexp": "^1.0.5" 594 | } 595 | }, 596 | "file-entry-cache": { 597 | "version": "5.0.1", 598 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 599 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 600 | "dev": true, 601 | "requires": { 602 | "flat-cache": "^2.0.1" 603 | } 604 | }, 605 | "fill-range": { 606 | "version": "7.0.1", 607 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 608 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 609 | "dev": true, 610 | "requires": { 611 | "to-regex-range": "^5.0.1" 612 | } 613 | }, 614 | "find-up": { 615 | "version": "5.0.0", 616 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 617 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 618 | "dev": true, 619 | "requires": { 620 | "locate-path": "^6.0.0", 621 | "path-exists": "^4.0.0" 622 | } 623 | }, 624 | "flat": { 625 | "version": "5.0.2", 626 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 627 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 628 | "dev": true 629 | }, 630 | "flat-cache": { 631 | "version": "2.0.1", 632 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 633 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 634 | "dev": true, 635 | "requires": { 636 | "flatted": "^2.0.0", 637 | "rimraf": "2.6.3", 638 | "write": "1.0.3" 639 | } 640 | }, 641 | "flatted": { 642 | "version": "2.0.2", 643 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 644 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 645 | "dev": true 646 | }, 647 | "fs.realpath": { 648 | "version": "1.0.0", 649 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 650 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 651 | "dev": true 652 | }, 653 | "fsevents": { 654 | "version": "2.3.2", 655 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 656 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 657 | "dev": true, 658 | "optional": true 659 | }, 660 | "functional-red-black-tree": { 661 | "version": "1.0.1", 662 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 663 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 664 | "dev": true 665 | }, 666 | "get-caller-file": { 667 | "version": "2.0.5", 668 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 669 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 670 | "dev": true 671 | }, 672 | "glob": { 673 | "version": "7.1.6", 674 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 675 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 676 | "dev": true, 677 | "requires": { 678 | "fs.realpath": "^1.0.0", 679 | "inflight": "^1.0.4", 680 | "inherits": "2", 681 | "minimatch": "^3.0.4", 682 | "once": "^1.3.0", 683 | "path-is-absolute": "^1.0.0" 684 | } 685 | }, 686 | "glob-parent": { 687 | "version": "5.1.1", 688 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 689 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 690 | "dev": true, 691 | "requires": { 692 | "is-glob": "^4.0.1" 693 | } 694 | }, 695 | "globals": { 696 | "version": "12.4.0", 697 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 698 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 699 | "dev": true, 700 | "requires": { 701 | "type-fest": "^0.8.1" 702 | } 703 | }, 704 | "growl": { 705 | "version": "1.10.5", 706 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 707 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 708 | "dev": true 709 | }, 710 | "has-flag": { 711 | "version": "3.0.0", 712 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 713 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 714 | "dev": true 715 | }, 716 | "he": { 717 | "version": "1.2.0", 718 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 719 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 720 | "dev": true 721 | }, 722 | "iconv-lite": { 723 | "version": "0.4.24", 724 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 725 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 726 | "dev": true, 727 | "requires": { 728 | "safer-buffer": ">= 2.1.2 < 3" 729 | } 730 | }, 731 | "ignore": { 732 | "version": "4.0.6", 733 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 734 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 735 | "dev": true 736 | }, 737 | "import-fresh": { 738 | "version": "3.2.1", 739 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 740 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 741 | "dev": true, 742 | "requires": { 743 | "parent-module": "^1.0.0", 744 | "resolve-from": "^4.0.0" 745 | } 746 | }, 747 | "imurmurhash": { 748 | "version": "0.1.4", 749 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 750 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 751 | "dev": true 752 | }, 753 | "inflight": { 754 | "version": "1.0.6", 755 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 756 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 757 | "dev": true, 758 | "requires": { 759 | "once": "^1.3.0", 760 | "wrappy": "1" 761 | } 762 | }, 763 | "inherits": { 764 | "version": "2.0.4", 765 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 766 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 767 | "dev": true 768 | }, 769 | "inquirer": { 770 | "version": "7.3.0", 771 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.0.tgz", 772 | "integrity": "sha512-K+LZp6L/6eE5swqIcVXrxl21aGDU4S50gKH0/d96OMQnSBCyGyZl/oZhbkVmdp5sBoINHd4xZvFSARh2dk6DWA==", 773 | "dev": true, 774 | "requires": { 775 | "ansi-escapes": "^4.2.1", 776 | "chalk": "^4.1.0", 777 | "cli-cursor": "^3.1.0", 778 | "cli-width": "^3.0.0", 779 | "external-editor": "^3.0.3", 780 | "figures": "^3.0.0", 781 | "lodash": "^4.17.15", 782 | "mute-stream": "0.0.8", 783 | "run-async": "^2.4.0", 784 | "rxjs": "^6.6.0", 785 | "string-width": "^4.1.0", 786 | "strip-ansi": "^6.0.0", 787 | "through": "^2.3.6" 788 | }, 789 | "dependencies": { 790 | "ansi-styles": { 791 | "version": "4.2.1", 792 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 793 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 794 | "dev": true, 795 | "requires": { 796 | "@types/color-name": "^1.1.1", 797 | "color-convert": "^2.0.1" 798 | } 799 | }, 800 | "chalk": { 801 | "version": "4.1.0", 802 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 803 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 804 | "dev": true, 805 | "requires": { 806 | "ansi-styles": "^4.1.0", 807 | "supports-color": "^7.1.0" 808 | } 809 | }, 810 | "color-convert": { 811 | "version": "2.0.1", 812 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 813 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 814 | "dev": true, 815 | "requires": { 816 | "color-name": "~1.1.4" 817 | } 818 | }, 819 | "color-name": { 820 | "version": "1.1.4", 821 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 822 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 823 | "dev": true 824 | }, 825 | "has-flag": { 826 | "version": "4.0.0", 827 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 828 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 829 | "dev": true 830 | }, 831 | "strip-ansi": { 832 | "version": "6.0.0", 833 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 834 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 835 | "dev": true, 836 | "requires": { 837 | "ansi-regex": "^5.0.0" 838 | } 839 | }, 840 | "supports-color": { 841 | "version": "7.1.0", 842 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 843 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 844 | "dev": true, 845 | "requires": { 846 | "has-flag": "^4.0.0" 847 | } 848 | } 849 | } 850 | }, 851 | "is-binary-path": { 852 | "version": "2.1.0", 853 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 854 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 855 | "dev": true, 856 | "requires": { 857 | "binary-extensions": "^2.0.0" 858 | } 859 | }, 860 | "is-extglob": { 861 | "version": "2.1.1", 862 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 863 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 864 | "dev": true 865 | }, 866 | "is-fullwidth-code-point": { 867 | "version": "3.0.0", 868 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 869 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 870 | "dev": true 871 | }, 872 | "is-glob": { 873 | "version": "4.0.1", 874 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 875 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 876 | "dev": true, 877 | "requires": { 878 | "is-extglob": "^2.1.1" 879 | } 880 | }, 881 | "is-number": { 882 | "version": "7.0.0", 883 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 884 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 885 | "dev": true 886 | }, 887 | "is-plain-obj": { 888 | "version": "2.1.0", 889 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 890 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 891 | "dev": true 892 | }, 893 | "isexe": { 894 | "version": "2.0.0", 895 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 896 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 897 | "dev": true 898 | }, 899 | "js-tokens": { 900 | "version": "4.0.0", 901 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 902 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 903 | "dev": true 904 | }, 905 | "js-yaml": { 906 | "version": "3.14.0", 907 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 908 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 909 | "dev": true, 910 | "requires": { 911 | "argparse": "^1.0.7", 912 | "esprima": "^4.0.0" 913 | } 914 | }, 915 | "json-schema-traverse": { 916 | "version": "0.4.1", 917 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 918 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 919 | "dev": true 920 | }, 921 | "json-stable-stringify-without-jsonify": { 922 | "version": "1.0.1", 923 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 924 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 925 | "dev": true 926 | }, 927 | "levn": { 928 | "version": "0.3.0", 929 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 930 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 931 | "dev": true, 932 | "requires": { 933 | "prelude-ls": "~1.1.2", 934 | "type-check": "~0.3.2" 935 | } 936 | }, 937 | "locate-path": { 938 | "version": "6.0.0", 939 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 940 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 941 | "dev": true, 942 | "requires": { 943 | "p-locate": "^5.0.0" 944 | } 945 | }, 946 | "lodash": { 947 | "version": "4.17.19", 948 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 949 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", 950 | "dev": true 951 | }, 952 | "log-symbols": { 953 | "version": "4.0.0", 954 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", 955 | "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", 956 | "dev": true, 957 | "requires": { 958 | "chalk": "^4.0.0" 959 | }, 960 | "dependencies": { 961 | "ansi-styles": { 962 | "version": "4.3.0", 963 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 964 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 965 | "dev": true, 966 | "requires": { 967 | "color-convert": "^2.0.1" 968 | } 969 | }, 970 | "chalk": { 971 | "version": "4.1.2", 972 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 973 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 974 | "dev": true, 975 | "requires": { 976 | "ansi-styles": "^4.1.0", 977 | "supports-color": "^7.1.0" 978 | } 979 | }, 980 | "color-convert": { 981 | "version": "2.0.1", 982 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 983 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 984 | "dev": true, 985 | "requires": { 986 | "color-name": "~1.1.4" 987 | } 988 | }, 989 | "color-name": { 990 | "version": "1.1.4", 991 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 992 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 993 | "dev": true 994 | }, 995 | "has-flag": { 996 | "version": "4.0.0", 997 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 998 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 999 | "dev": true 1000 | }, 1001 | "supports-color": { 1002 | "version": "7.2.0", 1003 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1004 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1005 | "dev": true, 1006 | "requires": { 1007 | "has-flag": "^4.0.0" 1008 | } 1009 | } 1010 | } 1011 | }, 1012 | "mimic-fn": { 1013 | "version": "2.1.0", 1014 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1015 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1016 | "dev": true 1017 | }, 1018 | "minimatch": { 1019 | "version": "3.0.4", 1020 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1021 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1022 | "dev": true, 1023 | "requires": { 1024 | "brace-expansion": "^1.1.7" 1025 | } 1026 | }, 1027 | "minimist": { 1028 | "version": "1.2.5", 1029 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1030 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1031 | "dev": true 1032 | }, 1033 | "mkdirp": { 1034 | "version": "0.5.5", 1035 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1036 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1037 | "dev": true, 1038 | "requires": { 1039 | "minimist": "^1.2.5" 1040 | } 1041 | }, 1042 | "mocha": { 1043 | "version": "8.4.0", 1044 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", 1045 | "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", 1046 | "dev": true, 1047 | "requires": { 1048 | "@ungap/promise-all-settled": "1.1.2", 1049 | "ansi-colors": "4.1.1", 1050 | "browser-stdout": "1.3.1", 1051 | "chokidar": "3.5.1", 1052 | "debug": "4.3.1", 1053 | "diff": "5.0.0", 1054 | "escape-string-regexp": "4.0.0", 1055 | "find-up": "5.0.0", 1056 | "glob": "7.1.6", 1057 | "growl": "1.10.5", 1058 | "he": "1.2.0", 1059 | "js-yaml": "4.0.0", 1060 | "log-symbols": "4.0.0", 1061 | "minimatch": "3.0.4", 1062 | "ms": "2.1.3", 1063 | "nanoid": "3.1.20", 1064 | "serialize-javascript": "5.0.1", 1065 | "strip-json-comments": "3.1.1", 1066 | "supports-color": "8.1.1", 1067 | "which": "2.0.2", 1068 | "wide-align": "1.1.3", 1069 | "workerpool": "6.1.0", 1070 | "yargs": "16.2.0", 1071 | "yargs-parser": "20.2.4", 1072 | "yargs-unparser": "2.0.0" 1073 | }, 1074 | "dependencies": { 1075 | "argparse": { 1076 | "version": "2.0.1", 1077 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1078 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1079 | "dev": true 1080 | }, 1081 | "debug": { 1082 | "version": "4.3.1", 1083 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1084 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1085 | "dev": true, 1086 | "requires": { 1087 | "ms": "2.1.2" 1088 | }, 1089 | "dependencies": { 1090 | "ms": { 1091 | "version": "2.1.2", 1092 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1093 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1094 | "dev": true 1095 | } 1096 | } 1097 | }, 1098 | "escape-string-regexp": { 1099 | "version": "4.0.0", 1100 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1101 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1102 | "dev": true 1103 | }, 1104 | "has-flag": { 1105 | "version": "4.0.0", 1106 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1107 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1108 | "dev": true 1109 | }, 1110 | "js-yaml": { 1111 | "version": "4.0.0", 1112 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", 1113 | "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", 1114 | "dev": true, 1115 | "requires": { 1116 | "argparse": "^2.0.1" 1117 | } 1118 | }, 1119 | "ms": { 1120 | "version": "2.1.3", 1121 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1122 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1123 | "dev": true 1124 | }, 1125 | "strip-json-comments": { 1126 | "version": "3.1.1", 1127 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1128 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1129 | "dev": true 1130 | }, 1131 | "supports-color": { 1132 | "version": "8.1.1", 1133 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1134 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1135 | "dev": true, 1136 | "requires": { 1137 | "has-flag": "^4.0.0" 1138 | } 1139 | }, 1140 | "which": { 1141 | "version": "2.0.2", 1142 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1143 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1144 | "dev": true, 1145 | "requires": { 1146 | "isexe": "^2.0.0" 1147 | } 1148 | } 1149 | } 1150 | }, 1151 | "ms": { 1152 | "version": "2.1.2", 1153 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1154 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1155 | "dev": true 1156 | }, 1157 | "mute-stream": { 1158 | "version": "0.0.8", 1159 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1160 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 1161 | "dev": true 1162 | }, 1163 | "nanoid": { 1164 | "version": "3.1.20", 1165 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", 1166 | "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", 1167 | "dev": true 1168 | }, 1169 | "natural-compare": { 1170 | "version": "1.4.0", 1171 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1172 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1173 | "dev": true 1174 | }, 1175 | "nice-try": { 1176 | "version": "1.0.5", 1177 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1178 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1179 | "dev": true 1180 | }, 1181 | "normalize-path": { 1182 | "version": "3.0.0", 1183 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1184 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1185 | "dev": true 1186 | }, 1187 | "once": { 1188 | "version": "1.4.0", 1189 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1190 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1191 | "dev": true, 1192 | "requires": { 1193 | "wrappy": "1" 1194 | } 1195 | }, 1196 | "onetime": { 1197 | "version": "5.1.0", 1198 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 1199 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 1200 | "dev": true, 1201 | "requires": { 1202 | "mimic-fn": "^2.1.0" 1203 | } 1204 | }, 1205 | "optionator": { 1206 | "version": "0.8.3", 1207 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1208 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1209 | "dev": true, 1210 | "requires": { 1211 | "deep-is": "~0.1.3", 1212 | "fast-levenshtein": "~2.0.6", 1213 | "levn": "~0.3.0", 1214 | "prelude-ls": "~1.1.2", 1215 | "type-check": "~0.3.2", 1216 | "word-wrap": "~1.2.3" 1217 | } 1218 | }, 1219 | "os-tmpdir": { 1220 | "version": "1.0.2", 1221 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1222 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1223 | "dev": true 1224 | }, 1225 | "p-limit": { 1226 | "version": "3.1.0", 1227 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1228 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1229 | "dev": true, 1230 | "requires": { 1231 | "yocto-queue": "^0.1.0" 1232 | } 1233 | }, 1234 | "p-locate": { 1235 | "version": "5.0.0", 1236 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1237 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1238 | "dev": true, 1239 | "requires": { 1240 | "p-limit": "^3.0.2" 1241 | } 1242 | }, 1243 | "parent-module": { 1244 | "version": "1.0.1", 1245 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1246 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1247 | "dev": true, 1248 | "requires": { 1249 | "callsites": "^3.0.0" 1250 | } 1251 | }, 1252 | "path-exists": { 1253 | "version": "4.0.0", 1254 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1255 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1256 | "dev": true 1257 | }, 1258 | "path-is-absolute": { 1259 | "version": "1.0.1", 1260 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1261 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1262 | "dev": true 1263 | }, 1264 | "path-key": { 1265 | "version": "2.0.1", 1266 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1267 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1268 | "dev": true 1269 | }, 1270 | "picomatch": { 1271 | "version": "2.3.0", 1272 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 1273 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", 1274 | "dev": true 1275 | }, 1276 | "prelude-ls": { 1277 | "version": "1.1.2", 1278 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1279 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1280 | "dev": true 1281 | }, 1282 | "progress": { 1283 | "version": "2.0.3", 1284 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1285 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1286 | "dev": true 1287 | }, 1288 | "punycode": { 1289 | "version": "2.1.1", 1290 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1291 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1292 | "dev": true 1293 | }, 1294 | "randombytes": { 1295 | "version": "2.1.0", 1296 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1297 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1298 | "dev": true, 1299 | "requires": { 1300 | "safe-buffer": "^5.1.0" 1301 | } 1302 | }, 1303 | "readdirp": { 1304 | "version": "3.5.0", 1305 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 1306 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 1307 | "dev": true, 1308 | "requires": { 1309 | "picomatch": "^2.2.1" 1310 | } 1311 | }, 1312 | "regexpp": { 1313 | "version": "2.0.1", 1314 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1315 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1316 | "dev": true 1317 | }, 1318 | "require-directory": { 1319 | "version": "2.1.1", 1320 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1321 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1322 | "dev": true 1323 | }, 1324 | "resolve-from": { 1325 | "version": "4.0.0", 1326 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1327 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1328 | "dev": true 1329 | }, 1330 | "restore-cursor": { 1331 | "version": "3.1.0", 1332 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1333 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1334 | "dev": true, 1335 | "requires": { 1336 | "onetime": "^5.1.0", 1337 | "signal-exit": "^3.0.2" 1338 | } 1339 | }, 1340 | "rimraf": { 1341 | "version": "2.6.3", 1342 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1343 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1344 | "dev": true, 1345 | "requires": { 1346 | "glob": "^7.1.3" 1347 | } 1348 | }, 1349 | "run-async": { 1350 | "version": "2.4.1", 1351 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 1352 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 1353 | "dev": true 1354 | }, 1355 | "rxjs": { 1356 | "version": "6.6.0", 1357 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz", 1358 | "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==", 1359 | "dev": true, 1360 | "requires": { 1361 | "tslib": "^1.9.0" 1362 | } 1363 | }, 1364 | "safe-buffer": { 1365 | "version": "5.2.1", 1366 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1367 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1368 | "dev": true 1369 | }, 1370 | "safer-buffer": { 1371 | "version": "2.1.2", 1372 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1373 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1374 | "dev": true 1375 | }, 1376 | "semver": { 1377 | "version": "7.3.2", 1378 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", 1379 | "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", 1380 | "dev": true 1381 | }, 1382 | "serialize-javascript": { 1383 | "version": "5.0.1", 1384 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", 1385 | "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", 1386 | "dev": true, 1387 | "requires": { 1388 | "randombytes": "^2.1.0" 1389 | } 1390 | }, 1391 | "shebang-command": { 1392 | "version": "1.2.0", 1393 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1394 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1395 | "dev": true, 1396 | "requires": { 1397 | "shebang-regex": "^1.0.0" 1398 | } 1399 | }, 1400 | "shebang-regex": { 1401 | "version": "1.0.0", 1402 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1403 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1404 | "dev": true 1405 | }, 1406 | "signal-exit": { 1407 | "version": "3.0.3", 1408 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1409 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 1410 | "dev": true 1411 | }, 1412 | "slice-ansi": { 1413 | "version": "2.1.0", 1414 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1415 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1416 | "dev": true, 1417 | "requires": { 1418 | "ansi-styles": "^3.2.0", 1419 | "astral-regex": "^1.0.0", 1420 | "is-fullwidth-code-point": "^2.0.0" 1421 | }, 1422 | "dependencies": { 1423 | "is-fullwidth-code-point": { 1424 | "version": "2.0.0", 1425 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1426 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1427 | "dev": true 1428 | } 1429 | } 1430 | }, 1431 | "sprintf-js": { 1432 | "version": "1.0.3", 1433 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1434 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1435 | "dev": true 1436 | }, 1437 | "string-width": { 1438 | "version": "4.2.0", 1439 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1440 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 1441 | "dev": true, 1442 | "requires": { 1443 | "emoji-regex": "^8.0.0", 1444 | "is-fullwidth-code-point": "^3.0.0", 1445 | "strip-ansi": "^6.0.0" 1446 | }, 1447 | "dependencies": { 1448 | "strip-ansi": { 1449 | "version": "6.0.0", 1450 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1451 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1452 | "dev": true, 1453 | "requires": { 1454 | "ansi-regex": "^5.0.0" 1455 | } 1456 | } 1457 | } 1458 | }, 1459 | "strip-ansi": { 1460 | "version": "5.2.0", 1461 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1462 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1463 | "dev": true, 1464 | "requires": { 1465 | "ansi-regex": "^4.1.0" 1466 | }, 1467 | "dependencies": { 1468 | "ansi-regex": { 1469 | "version": "4.1.0", 1470 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1471 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1472 | "dev": true 1473 | } 1474 | } 1475 | }, 1476 | "strip-json-comments": { 1477 | "version": "3.1.0", 1478 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", 1479 | "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", 1480 | "dev": true 1481 | }, 1482 | "supports-color": { 1483 | "version": "5.5.0", 1484 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1485 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1486 | "dev": true, 1487 | "requires": { 1488 | "has-flag": "^3.0.0" 1489 | } 1490 | }, 1491 | "table": { 1492 | "version": "5.4.6", 1493 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1494 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1495 | "dev": true, 1496 | "requires": { 1497 | "ajv": "^6.10.2", 1498 | "lodash": "^4.17.14", 1499 | "slice-ansi": "^2.1.0", 1500 | "string-width": "^3.0.0" 1501 | }, 1502 | "dependencies": { 1503 | "emoji-regex": { 1504 | "version": "7.0.3", 1505 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1506 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 1507 | "dev": true 1508 | }, 1509 | "is-fullwidth-code-point": { 1510 | "version": "2.0.0", 1511 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1512 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1513 | "dev": true 1514 | }, 1515 | "string-width": { 1516 | "version": "3.1.0", 1517 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1518 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1519 | "dev": true, 1520 | "requires": { 1521 | "emoji-regex": "^7.0.1", 1522 | "is-fullwidth-code-point": "^2.0.0", 1523 | "strip-ansi": "^5.1.0" 1524 | } 1525 | } 1526 | } 1527 | }, 1528 | "text-table": { 1529 | "version": "0.2.0", 1530 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1531 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1532 | "dev": true 1533 | }, 1534 | "through": { 1535 | "version": "2.3.8", 1536 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1537 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1538 | "dev": true 1539 | }, 1540 | "tmp": { 1541 | "version": "0.0.33", 1542 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1543 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1544 | "dev": true, 1545 | "requires": { 1546 | "os-tmpdir": "~1.0.2" 1547 | } 1548 | }, 1549 | "to-regex-range": { 1550 | "version": "5.0.1", 1551 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1552 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1553 | "dev": true, 1554 | "requires": { 1555 | "is-number": "^7.0.0" 1556 | } 1557 | }, 1558 | "tslib": { 1559 | "version": "1.13.0", 1560 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 1561 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", 1562 | "dev": true 1563 | }, 1564 | "tsutils": { 1565 | "version": "3.17.1", 1566 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", 1567 | "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", 1568 | "dev": true, 1569 | "requires": { 1570 | "tslib": "^1.8.1" 1571 | } 1572 | }, 1573 | "type-check": { 1574 | "version": "0.3.2", 1575 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1576 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1577 | "dev": true, 1578 | "requires": { 1579 | "prelude-ls": "~1.1.2" 1580 | } 1581 | }, 1582 | "type-fest": { 1583 | "version": "0.8.1", 1584 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1585 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 1586 | "dev": true 1587 | }, 1588 | "typescript": { 1589 | "version": "4.5.4", 1590 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", 1591 | "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", 1592 | "dev": true 1593 | }, 1594 | "uri-js": { 1595 | "version": "4.2.2", 1596 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1597 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1598 | "dev": true, 1599 | "requires": { 1600 | "punycode": "^2.1.0" 1601 | } 1602 | }, 1603 | "v8-compile-cache": { 1604 | "version": "2.1.1", 1605 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", 1606 | "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", 1607 | "dev": true 1608 | }, 1609 | "which": { 1610 | "version": "1.3.1", 1611 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1612 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1613 | "dev": true, 1614 | "requires": { 1615 | "isexe": "^2.0.0" 1616 | } 1617 | }, 1618 | "wide-align": { 1619 | "version": "1.1.3", 1620 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1621 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1622 | "dev": true, 1623 | "requires": { 1624 | "string-width": "^1.0.2 || 2" 1625 | }, 1626 | "dependencies": { 1627 | "ansi-regex": { 1628 | "version": "3.0.0", 1629 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1630 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1631 | "dev": true 1632 | }, 1633 | "is-fullwidth-code-point": { 1634 | "version": "2.0.0", 1635 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1636 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1637 | "dev": true 1638 | }, 1639 | "string-width": { 1640 | "version": "2.1.1", 1641 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1642 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1643 | "dev": true, 1644 | "requires": { 1645 | "is-fullwidth-code-point": "^2.0.0", 1646 | "strip-ansi": "^4.0.0" 1647 | } 1648 | }, 1649 | "strip-ansi": { 1650 | "version": "4.0.0", 1651 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1652 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1653 | "dev": true, 1654 | "requires": { 1655 | "ansi-regex": "^3.0.0" 1656 | } 1657 | } 1658 | } 1659 | }, 1660 | "word-wrap": { 1661 | "version": "1.2.3", 1662 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1663 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1664 | "dev": true 1665 | }, 1666 | "workerpool": { 1667 | "version": "6.1.0", 1668 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", 1669 | "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", 1670 | "dev": true 1671 | }, 1672 | "wrap-ansi": { 1673 | "version": "7.0.0", 1674 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1675 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1676 | "dev": true, 1677 | "requires": { 1678 | "ansi-styles": "^4.0.0", 1679 | "string-width": "^4.1.0", 1680 | "strip-ansi": "^6.0.0" 1681 | }, 1682 | "dependencies": { 1683 | "ansi-regex": { 1684 | "version": "5.0.1", 1685 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1686 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1687 | "dev": true 1688 | }, 1689 | "ansi-styles": { 1690 | "version": "4.3.0", 1691 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1692 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1693 | "dev": true, 1694 | "requires": { 1695 | "color-convert": "^2.0.1" 1696 | } 1697 | }, 1698 | "color-convert": { 1699 | "version": "2.0.1", 1700 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1701 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1702 | "dev": true, 1703 | "requires": { 1704 | "color-name": "~1.1.4" 1705 | } 1706 | }, 1707 | "color-name": { 1708 | "version": "1.1.4", 1709 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1710 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1711 | "dev": true 1712 | }, 1713 | "strip-ansi": { 1714 | "version": "6.0.1", 1715 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1716 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1717 | "dev": true, 1718 | "requires": { 1719 | "ansi-regex": "^5.0.1" 1720 | } 1721 | } 1722 | } 1723 | }, 1724 | "wrappy": { 1725 | "version": "1.0.2", 1726 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1727 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1728 | "dev": true 1729 | }, 1730 | "write": { 1731 | "version": "1.0.3", 1732 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1733 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1734 | "dev": true, 1735 | "requires": { 1736 | "mkdirp": "^0.5.1" 1737 | } 1738 | }, 1739 | "y18n": { 1740 | "version": "5.0.8", 1741 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1742 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1743 | "dev": true 1744 | }, 1745 | "yargs": { 1746 | "version": "16.2.0", 1747 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1748 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1749 | "dev": true, 1750 | "requires": { 1751 | "cliui": "^7.0.2", 1752 | "escalade": "^3.1.1", 1753 | "get-caller-file": "^2.0.5", 1754 | "require-directory": "^2.1.1", 1755 | "string-width": "^4.2.0", 1756 | "y18n": "^5.0.5", 1757 | "yargs-parser": "^20.2.2" 1758 | } 1759 | }, 1760 | "yargs-parser": { 1761 | "version": "20.2.4", 1762 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1763 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1764 | "dev": true 1765 | }, 1766 | "yargs-unparser": { 1767 | "version": "2.0.0", 1768 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1769 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1770 | "dev": true, 1771 | "requires": { 1772 | "camelcase": "^6.0.0", 1773 | "decamelize": "^4.0.0", 1774 | "flat": "^5.0.2", 1775 | "is-plain-obj": "^2.1.0" 1776 | } 1777 | }, 1778 | "yocto-queue": { 1779 | "version": "0.1.0", 1780 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1781 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1782 | "dev": true 1783 | } 1784 | } 1785 | } 1786 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "solidity", 3 | "description": "A language client for Solidity using compiler's builtin language server.", 4 | "author": "Solidity Compiler Developers", 5 | "license": "MIT", 6 | "version": "0.0.1", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/ethereum/solidity-lsp-vscode" 10 | }, 11 | "publisher": "ethereum", 12 | "categories": [], 13 | "keywords": [ 14 | "solidity" 15 | ], 16 | "engines": { 17 | "vscode": "^1.43.0" 18 | }, 19 | "activationEvents": [ 20 | "onLanguage:solidity" 21 | ], 22 | "main": "./client/out/extension", 23 | "contributes": { 24 | "grammars": [ 25 | { 26 | "language": "solidity", 27 | "scopeName": "source.solidity", 28 | "path": "./solidity-syntax.json" 29 | } 30 | ], 31 | "languages": [ 32 | { 33 | "id": "solidity", 34 | "extensions": [ 35 | ".sol" 36 | ], 37 | "aliases": [ 38 | "Solidity", 39 | "solidity" 40 | ], 41 | "configuration": "./solidity-configuration.json" 42 | } 43 | ], 44 | "configuration": { 45 | "type": "object", 46 | "title": "Solidity Language Server Configuration", 47 | "properties": { 48 | "Solidity.solc.path": { 49 | "scope": "resource", 50 | "type": [ 51 | "string", 52 | "null" 53 | ], 54 | "default": "solc", 55 | "description": "Path to native solc executable." 56 | }, 57 | "Solidity.trace.server": { 58 | "scope": "window", 59 | "type": "string", 60 | "enum": [ 61 | "off", 62 | "messages", 63 | "verbose" 64 | ], 65 | "default": "off", 66 | "description": "Traces the communication between VS Code and the language server." 67 | } 68 | } 69 | } 70 | }, 71 | "scripts": { 72 | "vscode:prepublish": "npm run compile", 73 | "compile": "tsc -b", 74 | "watch": "tsc -b -w", 75 | "postinstall": "cd client && npm install && cd ..", 76 | "test": "sh ./scripts/endToEndTest.sh" 77 | }, 78 | "devDependencies": { 79 | "@types/mocha": "^8.2.3", 80 | "@types/node": "^12.20.37", 81 | "@typescript-eslint/parser": "^2.3.0", 82 | "eslint": "^6.4.0", 83 | "mocha": "^8.4.0", 84 | "typescript": "^4.5.4" 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /scripts/e2e.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | export CODE_TESTS_PATH="$(pwd)/client/out/test" 4 | export CODE_TESTS_WORKSPACE="$(pwd)/client/testFixture" 5 | 6 | node "$(pwd)/client/out/test/runTest" -------------------------------------------------------------------------------- /solidity-configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": { 3 | "lineComment": "//", 4 | "blockComment": [ "/*", "*/" ] 5 | }, 6 | "brackets": [ 7 | ["{", "}"], 8 | ["[", "]"], 9 | ["(", ")"] 10 | ], 11 | "autoClosingPairs": [ 12 | { "open": "{", "close": "}" }, 13 | { "open": "[", "close": "]" }, 14 | { "open": "(", "close": ")" }, 15 | { "open": "/**", "close": " */", "notIn": ["string"] } 16 | ], 17 | "surroundingPairs": [ 18 | ["{", "}"], 19 | ["[", "]"], 20 | ["(", ")"] 21 | ] 22 | } -------------------------------------------------------------------------------- /solidity-snippets.json: -------------------------------------------------------------------------------- 1 | { 2 | ".source.solidity": { 3 | "sdpx license": { 4 | "prefix": "sdpx", 5 | "body": "// SPDX-License-Identifier: MIT", 6 | "description": "SDPX License" 7 | }, 8 | "pragma solidity":{ 9 | "prefix": "pragm", 10 | "body": "pragma solidity ${1:version};" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /solidity-syntax.json: -------------------------------------------------------------------------------- 1 | { 2 | "fileTypes": [ 3 | "sol" 4 | ], 5 | "name": "Solidity", 6 | "patterns": [ 7 | { 8 | "include": "#natspec" 9 | }, 10 | { 11 | "include": "#comment" 12 | }, 13 | { 14 | "include": "#operator" 15 | }, 16 | { 17 | "include": "#control" 18 | }, 19 | { 20 | "include": "#constant" 21 | }, 22 | { 23 | "include": "#number" 24 | }, 25 | { 26 | "include": "#string" 27 | }, 28 | { 29 | "include": "#type" 30 | }, 31 | { 32 | "include": "#global" 33 | }, 34 | { 35 | "include": "#declaration" 36 | }, 37 | { 38 | "include": "#function-call" 39 | }, 40 | { 41 | "include": "#assembly" 42 | }, 43 | { 44 | "include": "#punctuation" 45 | } 46 | ], 47 | "repository": { 48 | "natspec": { 49 | "patterns": [ 50 | { 51 | "begin": "/\\*\\*", 52 | "end": "\\*/", 53 | "name": "comment.block.documentation.solidity", 54 | "patterns": [ 55 | { 56 | "include": "#natspec-tags" 57 | } 58 | ] 59 | }, 60 | { 61 | "begin": "///", 62 | "end": "$", 63 | "name": "comment.block.documentation.solidity", 64 | "patterns": [ 65 | { 66 | "include": "#natspec-tags" 67 | } 68 | ] 69 | } 70 | ] 71 | }, 72 | "natspec-tags": { 73 | "patterns": [ 74 | { 75 | "include": "#natspec-tag-title" 76 | }, 77 | { 78 | "include": "#natspec-tag-author" 79 | }, 80 | { 81 | "include": "#natspec-tag-notice" 82 | }, 83 | { 84 | "include": "#natspec-tag-dev" 85 | }, 86 | { 87 | "include": "#natspec-tag-param" 88 | }, 89 | { 90 | "include": "#natspec-tag-return" 91 | } 92 | ] 93 | }, 94 | "natspec-tag-title": { 95 | "match": "(@title)\\b", 96 | "name": "storage.type.title.natspec" 97 | }, 98 | "natspec-tag-author": { 99 | "match": "(@author)\\b", 100 | "name": "storage.type.author.natspec" 101 | }, 102 | "natspec-tag-notice": { 103 | "match": "(@notice)\\b", 104 | "name": "storage.type.dev.natspec" 105 | }, 106 | "natspec-tag-dev": { 107 | "match": "(@dev)\\b", 108 | "name": "storage.type.dev.natspec" 109 | }, 110 | "natspec-tag-param": { 111 | "match": "(@param)(\\s+([A-Za-z_]\\w*))?\\b", 112 | "captures": { 113 | "1": { 114 | "name": "storage.type.param.natspec" 115 | }, 116 | "3": { 117 | "name": "variable.other.natspec" 118 | } 119 | } 120 | }, 121 | "natspec-tag-return": { 122 | "match": "(@return)\\b", 123 | "name": "storage.type.return.natspec" 124 | }, 125 | "comment": { 126 | "patterns": [ 127 | { 128 | "include": "#comment-line" 129 | }, 130 | { 131 | "include": "#comment-block" 132 | } 133 | ] 134 | }, 135 | "comment-line": { 136 | "match": "(?(?!>)|>=|\\&\\&|\\|\\||\\:(?!=)|\\?)", 165 | "name": "keyword.operator.logic.solidity" 166 | }, 167 | "operator-mapping": { 168 | "match": "(=>)", 169 | "name": "keyword.operator.mapping.solidity" 170 | }, 171 | "operator-arithmetic": { 172 | "match": "(\\+|\\-|\\/|\\*)", 173 | "name": "keyword.operator.arithmetic.solidity" 174 | }, 175 | "operator-binary": { 176 | "match": "(\\^|\\&|\\||<<|>>)", 177 | "name": "keyword.operator.binary.solidity" 178 | }, 179 | "operator-assignment": { 180 | "match": "(\\:?=)", 181 | "name": "keyword.operator.assignment.solidity" 182 | }, 183 | "control": { 184 | "patterns": [ 185 | { 186 | "include": "#control-flow" 187 | }, 188 | { 189 | "include": "#control-using" 190 | }, 191 | { 192 | "include": "#control-import" 193 | }, 194 | { 195 | "include": "#control-pragma" 196 | }, 197 | { 198 | "include": "#control-underscore" 199 | }, 200 | { 201 | "include": "#control-unchecked" 202 | }, 203 | { 204 | "include": "#control-other" 205 | } 206 | ] 207 | }, 208 | "control-flow": { 209 | "match": "\\b(if|else|for|while|do|break|continue|throw|returns?)\\b", 210 | "name": "keyword.control.flow.solidity" 211 | }, 212 | "control-using": { 213 | "match": "\\b(using)\\b", 214 | "name": "keyword.control.using.solidity" 215 | }, 216 | "control-import": { 217 | "match": "\\b(import)\\b", 218 | "name": "keyword.control.import.solidity" 219 | }, 220 | "control-unchecked": { 221 | "match": "\\b(unchecked)\\b", 222 | "name": "keyword.control.unchecked.solidity" 223 | }, 224 | "control-pragma": { 225 | "match": "\\b(pragma)(?:\\s+([A-Za-z_]\\w+)\\s+([^\\s]+))?\\b", 226 | "captures": { 227 | "1": { 228 | "name": "keyword.control.pragma.solidity" 229 | }, 230 | "2": { 231 | "name": "entity.name.tag.pragma.solidity" 232 | }, 233 | "3": { 234 | "name": "constant.other.pragma.solidity" 235 | } 236 | } 237 | }, 238 | "control-underscore": { 239 | "match": "\\b(_)\\b", 240 | "name": "constant.other.underscore.solidity" 241 | }, 242 | "control-other": { 243 | "match": "\\b(new|delete|emit)\\b", 244 | "name": "keyword.control.solidity" 245 | }, 246 | "constant": { 247 | "patterns": [ 248 | { 249 | "include": "#constant-boolean" 250 | }, 251 | { 252 | "include": "#constant-time" 253 | }, 254 | { 255 | "include": "#constant-currency" 256 | } 257 | ] 258 | }, 259 | "constant-boolean": { 260 | "match": "\\b(true|false)\\b", 261 | "name": "constant.language.boolean.solidity" 262 | }, 263 | "constant-time": { 264 | "match": "\\b(seconds|minutes|hours|days|weeks|years)\\b", 265 | "name": "constant.language.time.solidity" 266 | }, 267 | "constant-currency": { 268 | "match": "\\b(ether|wei|finney|szabo)\\b", 269 | "name": "constant.language.currency.solidity" 270 | }, 271 | "number": { 272 | "patterns": [ 273 | { 274 | "include": "#number-decimal" 275 | }, 276 | { 277 | "include": "#number-hex" 278 | } 279 | ] 280 | }, 281 | "number-decimal": { 282 | "match": "\\b(\\d+(\\.\\d+)?)\\b", 283 | "name": "constant.numeric.decimal.solidity" 284 | }, 285 | "number-hex": { 286 | "match": "\\b(0[xX][a-fA-F0-9]+)\\b", 287 | "name": "constant.numeric.hexadecimal.solidity" 288 | }, 289 | "string": { 290 | "patterns": [ 291 | { 292 | "match": "\\\".*?\\\"", 293 | "name": "string.quoted.double.solidity" 294 | }, 295 | { 296 | "match": "\\'.*?\\'", 297 | "name": "string.quoted.single.solidity" 298 | } 299 | ] 300 | }, 301 | "type": { 302 | "patterns": [ 303 | { 304 | "include": "#type-primitive" 305 | } 306 | ] 307 | }, 308 | "type-primitive": { 309 | "match": "\\b(address|string\\d*|bytes\\d*|int\\d*|uint\\d*|bool|hash\\d*)\\b", 310 | "name": "support.type.primitive.solidity" 311 | }, 312 | "global": { 313 | "patterns": [ 314 | { 315 | "include": "#global-variables" 316 | }, 317 | { 318 | "include": "#global-functions" 319 | } 320 | ] 321 | }, 322 | "global-variables": { 323 | "patterns": [ 324 | { 325 | "match": "\\b(msg|block|tx|now)\\b", 326 | "name": "variable.language.transaction.solidity" 327 | }, 328 | { 329 | "match": "\\b(this)\\b", 330 | "name": "variable.language.this.solidity" 331 | }, 332 | { 333 | "match": "\\b(super)\\b", 334 | "name": "variable.language.super.solidity" 335 | } 336 | ] 337 | }, 338 | "global-functions": { 339 | "patterns": [ 340 | { 341 | "match": "\\b(require|assert|revert)\\b", 342 | "name": "keyword.control.exceptions.solidity" 343 | }, 344 | { 345 | "match": "\\b(selfdestruct|suicide)\\b", 346 | "name": "keyword.control.contract.solidity" 347 | }, 348 | { 349 | "match": "\\b(addmod|mulmod|keccak256|sha256|sha3|ripemd160|ecrecover|unicode)\\b", 350 | "name": "support.function.math.solidity" 351 | }, 352 | { 353 | "match": "\\b(blockhash|gasleft)\\b", 354 | "name": "variable.language.transaction.solidity" 355 | } 356 | ] 357 | }, 358 | "declaration": { 359 | "patterns": [ 360 | { 361 | "include": "#declaration-contract" 362 | }, 363 | { 364 | "include": "#declaration-interface" 365 | }, 366 | { 367 | "include": "#declaration-library" 368 | }, 369 | { 370 | "include": "#declaration-struct" 371 | }, 372 | { 373 | "include": "#declaration-event" 374 | }, 375 | { 376 | "include": "#declaration-enum" 377 | }, 378 | { 379 | "include": "#declaration-function" 380 | }, 381 | { 382 | "include": "#declaration-constructor" 383 | }, 384 | { 385 | "include": "#declaration-modifier" 386 | }, 387 | { 388 | "include": "#declaration-mapping" 389 | } 390 | ] 391 | }, 392 | "declaration-contract": { 393 | "patterns": [ 394 | { 395 | "match": "\\b(contract)(\\s+([A-Za-z_]\\w*))?\\b", 396 | "captures": { 397 | "1": { 398 | "name": "storage.type.contract.solidity" 399 | }, 400 | "3": { 401 | "name": "entity.name.type.contract.solidity" 402 | } 403 | } 404 | }, 405 | { 406 | "match": "\\b(is)\\b", 407 | "name": "storage.modifier.is.solidity" 408 | } 409 | ] 410 | }, 411 | "declaration-interface": { 412 | "match": "\\b(interface)(\\s+([A-Za-z_]\\w*))?\\b", 413 | "captures": { 414 | "1": { 415 | "name": "storage.type.interface.solidity" 416 | }, 417 | "3": { 418 | "name": "entity.name.type.interface.solidity" 419 | } 420 | } 421 | }, 422 | "declaration-library": { 423 | "match": "\\b(library)(\\s+([A-Za-z_]\\w*))?\\b", 424 | "captures": { 425 | "1": { 426 | "name": "storage.type.library.solidity" 427 | }, 428 | "3": { 429 | "name": "entity.name.type.library.solidity" 430 | } 431 | } 432 | }, 433 | "declaration-struct": { 434 | "match": "\\b(struct)(\\s+([A-Za-z_]\\w*))?\\b", 435 | "captures": { 436 | "1": { 437 | "name": "storage.type.struct.solidity" 438 | }, 439 | "3": { 440 | "name": "entity.name.type.struct.solidity" 441 | } 442 | } 443 | }, 444 | "declaration-event": { 445 | "match": "\\b(event)(\\s+([A-Za-z_]\\w*))?\\b", 446 | "captures": { 447 | "1": { 448 | "name": "storage.type.event.solidity" 449 | }, 450 | "3": { 451 | "name": "entity.name.type.event.solidity" 452 | } 453 | } 454 | }, 455 | "declaration-constructor": { 456 | "match": "\\b(constructor)\\b", 457 | "captures": { 458 | "1": { 459 | "name": "storage.type.constructor.solidity" 460 | } 461 | } 462 | }, 463 | "declaration-enum": { 464 | "match": "\\b(enum)(\\s+([A-Za-z_]\\w*))?\\b", 465 | "captures": { 466 | "1": { 467 | "name": "storage.type.enum.solidity" 468 | }, 469 | "3": { 470 | "name": "entity.name.type.enum.solidity" 471 | } 472 | } 473 | }, 474 | "declaration-function": { 475 | "patterns": [ 476 | { 477 | "match": "\\b(function)\\s+([A-Za-z_]\\w*)\\b", 478 | "captures": { 479 | "1": { 480 | "name": "storage.type.function.solidity" 481 | }, 482 | "2": { 483 | "name": "entity.name.function.solidity" 484 | } 485 | } 486 | }, 487 | { 488 | "match": "\\b(private|public|internal|external|constant|immutable|pure|view|payable|nonpayable|inherited|indexed|storage|memory|virtual|calldata|override|abstract)\\b", 489 | "name": "storage.type.mofifier.solidity" 490 | } 491 | ] 492 | }, 493 | "declaration-modifier": { 494 | "match": "\\b(modifier)(\\s+([A-Za-z_]\\w*))?\\b", 495 | "captures": { 496 | "1": { 497 | "name": "storage.type.modifier.solidity" 498 | }, 499 | "3": { 500 | "name": "entity.name.function.solidity" 501 | } 502 | } 503 | }, 504 | "declaration-mapping": { 505 | "match": "\\b(mapping)\\b", 506 | "name": "storage.type.mapping.solidity" 507 | }, 508 | "function-call": { 509 | "match": "\\b([A-Za-z_]\\w*)\\s*\\(", 510 | "captures": { 511 | "1": { 512 | "name": "entity.name.function.solidity" 513 | } 514 | } 515 | }, 516 | "assembly": { 517 | "patterns": [ 518 | { 519 | "match": "\\b(assembly)\\b", 520 | "name": "keyword.control.assembly.solidity" 521 | }, 522 | { 523 | "match": "\\b(let)\\b", 524 | "name": "storage.type.assembly.solidity" 525 | } 526 | ] 527 | }, 528 | "punctuation": { 529 | "patterns": [ 530 | { 531 | "match": ";", 532 | "name": "punctuation.terminator.statement.solidity" 533 | }, 534 | { 535 | "match": "\\.", 536 | "name": "punctuation.accessor.solidity" 537 | }, 538 | { 539 | "match": ",", 540 | "name": "punctuation.separator.solidity" 541 | } 542 | ] 543 | } 544 | }, 545 | "scopeName": "source.solidity", 546 | "uuid": "ad87d2cd-8575-4afe-984e-9421a3788933" 547 | } 548 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es2019", 5 | "lib": ["ES2019"], 6 | "outDir": "out", 7 | "rootDir": "src", 8 | "sourceMap": true 9 | }, 10 | "include": [ 11 | "src" 12 | ], 13 | "exclude": [ 14 | "node_modules", 15 | ".vscode-test" 16 | ], 17 | "references": [ 18 | { "path": "./client" } 19 | ] 20 | } 21 | --------------------------------------------------------------------------------