├── .github └── workflows │ └── stale.yml ├── .gitignore ├── .prettierrc ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── README.md ├── images ├── icon.png └── screens │ ├── make-controller.gif │ └── route-list.gif ├── package-lock.json ├── package.json ├── src ├── Common.ts ├── TextDocumentProvider.ts ├── commands │ ├── base │ │ ├── ClearCompiled.ts │ │ ├── List.ts │ │ ├── Migrate.ts │ │ ├── Optimize.ts │ │ └── Serve.ts │ ├── cache │ │ ├── Clear.ts │ │ └── Table.ts │ ├── config │ │ ├── Cache.ts │ │ ├── Clear.ts │ │ └── Refresh.ts │ ├── event │ │ └── Generate.ts │ ├── key │ │ └── Generate.ts │ ├── make │ │ ├── Auth.ts │ │ ├── Cast.ts │ │ ├── Channel.ts │ │ ├── Command.ts │ │ ├── Component.ts │ │ ├── Controller.ts │ │ ├── Event.ts │ │ ├── Factory.ts │ │ ├── Job.ts │ │ ├── Listener.ts │ │ ├── Mail.ts │ │ ├── Middleware.ts │ │ ├── Migration.ts │ │ ├── Model.ts │ │ ├── Notification.ts │ │ ├── Observer.ts │ │ ├── Policy.ts │ │ ├── Provider.ts │ │ ├── Request.ts │ │ ├── Resource.ts │ │ ├── Rule.ts │ │ ├── Seeder.ts │ │ └── Test.ts │ ├── migrate │ │ ├── Fresh.ts │ │ ├── Install.ts │ │ ├── Refresh.ts │ │ ├── Reset.ts │ │ ├── Rollback.ts │ │ └── Status.ts │ ├── route │ │ ├── Cache.ts │ │ ├── Clear.ts │ │ ├── List.ts │ │ └── Refresh.ts │ ├── run │ │ └── Command.ts │ └── view │ │ └── Clear.ts ├── extension.ts └── utils │ └── Output.ts ├── tsconfig.json └── typings.json /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | # This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time. 2 | # 3 | # You can adjust the behavior by modifying this file. 4 | # For more information, see: 5 | # https://github.com/actions/stale 6 | name: Mark stale issues and pull requests 7 | 8 | on: 9 | schedule: 10 | - cron: '25 22 * * *' 11 | 12 | jobs: 13 | stale: 14 | 15 | runs-on: ubuntu-latest 16 | permissions: 17 | issues: write 18 | pull-requests: write 19 | 20 | steps: 21 | - uses: actions/stale@v5 22 | with: 23 | repo-token: ${{ secrets.GITHUB_TOKEN }} 24 | stale-issue-message: "Marking issue as stale since there has'nt been any activity recently." 25 | stale-pr-message: "Marking PR as stale since there has'nt been any activity recently." 26 | stale-issue-label: 'no-issue-activity' 27 | stale-pr-label: 'no-pr-activity' 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | *.vsix 4 | *.zip -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "avoid", 3 | "singleQuote": true, 4 | "printWidth": 140 5 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | { 3 | "version": "0.1.0", 4 | "configurations": [ 5 | { 6 | "name": "Launch Extension", 7 | "type": "extensionHost", 8 | "request": "launch", 9 | "runtimeExecutable": "${execPath}", 10 | "args": ["--extensionDevelopmentPath=${workspaceRoot}" ], 11 | "stopOnEntry": false, 12 | "sourceMaps": true, 13 | "outFiles": [ "${workspaceRoot}/out/src/**/*.js" ], 14 | "preLaunchTask": "npm" 15 | }, 16 | { 17 | "name": "Launch Tests", 18 | "type": "extensionHost", 19 | "request": "launch", 20 | "runtimeExecutable": "${execPath}", 21 | "args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test" ], 22 | "stopOnEntry": false, 23 | "sourceMaps": true, 24 | "outFiles": [ "${workspaceRoot}/out/test/**/*.js" ], 25 | "preLaunchTask": "npm" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "editor.detectIndentation": false, 4 | "editor.tabSize": 2, 5 | "files.exclude": { 6 | // "out": true // set this to true to hide the "out" folder with the compiled JS files 7 | }, 8 | "search.exclude": { 9 | "out": true // set this to false to include "out" folder in search results 10 | }, 11 | "typescript.tsdk": "./node_modules/typescript/lib", 12 | "cSpell.words": [ 13 | "micration", 14 | "nqry" 15 | ] // we want to use the TS server from our node_modules folder to control its version 16 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // Available variables which can be used inside of strings. 2 | // ${workspaceRoot}: the root folder of the team 3 | // ${file}: the current opened file 4 | // ${fileBasename}: the current opened file's basename 5 | // ${fileDirname}: the current opened file's dirname 6 | // ${fileExtname}: the current opened file's extension 7 | // ${cwd}: the current working directory of the spawned process 8 | 9 | // A task runner that calls a custom npm script that compiles the extension. 10 | { 11 | "version": "2.0.0", 12 | 13 | // we want to run npm 14 | "command": "npm", 15 | 16 | // we run the custom script "compile" as defined in package.json 17 | "args": ["run", "compile", "--loglevel", "silent"], 18 | 19 | // The tsc compiler is started in watching mode 20 | "isWatching": true, 21 | 22 | // use the standard tsc in watch mode problem matcher to find compile problems in the output. 23 | "problemMatcher": "$tsc-watch", 24 | "tasks": [ 25 | { 26 | "label": "npm", 27 | "type": "shell", 28 | "command": "npm", 29 | "args": [ 30 | "run", 31 | "compile", 32 | "--loglevel", 33 | "silent" 34 | ], 35 | "isBackground": true, 36 | "problemMatcher": "$tsc-watch", 37 | "group": { 38 | "_id": "build", 39 | "isDefault": false 40 | } 41 | } 42 | ] 43 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | test/** 5 | src/** 6 | **/*.map 7 | .gitignore 8 | tsconfig.json 9 | vsc-extension-quickstart.md 10 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 0.0.31 2 | 3 | - Added `make:cast` command 4 | - Added `make:channel` command 5 | - Added `make:rule` command 6 | - Added question to `make:mail` command to ask if the mail should be markdown or not 7 | - Added the ability to toggle Route List columns on/off 8 | - Show progress bar when running commands 9 | - Displayed in the status bar on the bottom left 10 | - Added context menus to the file explorer 11 | - Right click on one of the listed folders or a child of the listed folders to see the context menu: 12 | - app 13 | - database 14 | - resources 15 | - routes 16 | 17 | # 0.0.30 18 | 19 | - Updated `route:list` to use the json result instead of parsing a cli table. 20 | - Added `make:component` command. 21 | - Updated the way `wsl` executes commands (See [WSL](/README.md#wsl)). 22 | - `artisan.wsl.enabled` should be set to `true` if you are using `wsl`. 23 | - The command will use the default `php` command unless `artisan.php.location` is set. 24 | - This path is based on the root of the `wsl` filesystem, **NOT** the windows filesystem. 25 | 26 | # 0.0.27 27 | 28 | - Fixed incorrectly formatted start server command 29 | 30 | # 0.0.26 31 | 32 | - Added `make:auth` command 33 | - Fixed problem of opening action in the routes list 34 | 35 | # 0.0.25 36 | 37 | - Added a `maxBuffer` setting to allow for larger Artisan responses 38 | - Default value is 200kb 39 | - Added custom default host/port settings for when running an Artisan server 40 | - The config settings are as follows 41 | - `"artisan.serve.defaultHost": "localhost"` 42 | - `"artisan.serve.defaultPort": "8000"` 43 | - These settings will be used for the following commands 44 | - `Artisan: Start Server` 45 | - `Artisan: Start Server (Default Host and Port)` 46 | 47 | # 0.0.24 48 | 49 | - Added Docker support 50 | - Added setting `"artisan.docker.enabled": true` to enable/disable docker 51 | - Added setting `"artisan.docker.command": null` to execute the docker command, where `null` is replaced by the Docker command such as `"docker-compose exec app"` 52 | 53 | # 0.0.23 54 | 55 | - Replaced make controller resource question from `Yes/No` to option list: `Basic/Resource/API`. 56 | - If the controller is not a basic controller, the option to reference a model is asked. 57 | - If the use wants to reference a model a model name is asked for. 58 | - If the model doesn't exist, it is automatically created. 59 | 60 | # 0.0.22 61 | 62 | - Added support for a custom php location: `artisan.php.location`. 63 | - Updated `artisan.location` setting. 64 | - Now only takes a string or an array of strings, which consist of artisan paths. 65 | - These are additional paths that are not found within the artisan workspace. 66 | - Example path: `/path/to/my/artisan-project/artisan`. 67 | - `number` was **removed** which specified a workspace number. 68 | - Artisan files in all workspaces are now automatically detected. 69 | 70 | # 0.0.21 71 | 72 | - Added `factory` and `all` to `make:model`. 73 | - Added the ability to have multiple artisan projects. 74 | - Display a list of `artisan` files before running an `artisan` command if there is more than one `artisan` file in the workspace. 75 | 76 | # 0.0.20 77 | 78 | - Preserve the web views: `Route List`, `List Commands`, `Migrate Status` using the new WebView API. 79 | - This will allow for navigation away from, and then back to the tab without reloading the web view. 80 | - `Route List` will automatically update when routes are added/removed/updated. 81 | - When clicking on a `Route List` route, the document will open and the cursor will move to the line where the function is defined. 82 | 83 | # 0.0.19 84 | 85 | - Fixed issue where starting the server with values other than the default would still use the default values. 86 | 87 | # 0.0.18 88 | 89 | - Added command to run the artisan server with default values `Artisan: Start Server (Default Host and Port)` 90 | - Fixed Windows issue where `cd` doesn't change directories if the project is on another dive letter `D:, E:`, etc. 91 | 92 | # 0.0.17 93 | 94 | - Changed exec so it changes to project root directory before running the artisan command 95 | - This will allow artisan to be executed from it's root directory 96 | - Fix 'File Not Found' error when clicking a route action 97 | - This can be found under `Artisan: Route List` 98 | - Moved server from child process to integrated terminal 99 | - Removed duplicate `artisan.migrate.fresh` command 100 | 101 | # 0.0.16 102 | 103 | - Forgot to merge `0.0.14` into the push 104 | 105 | # 0.0.15 106 | 107 | - Added support for multi-root workspaces 108 | - To add a workspace add `artisan.location` to your settings file then use one of the following: 109 | - Use a `string` as a path to the workspace root (without `/artisan` filename) 110 | - Use a `number` pointing to the workspace array id (`0`, `1`, `2`, etc.) 111 | - Added better parameter support for optional `Artisan: Run Command` options 112 | - TODO: Get laravel to support what parameters are optional. This currently isn't possible with the json string that is returned. 113 | - Added `Artisan: Make Test` to create artisan tests 114 | - Added `Artisan: Make Factory` to create factories 115 | 116 | # 0.0.14 117 | 118 | - Added the `make:resource` command 119 | - Refresh the file explorer when a file is created 120 | 121 | # 0.0.12 and 0.0.13 122 | 123 | - vsce bug that doesn't rollback version on publishing error 124 | 125 | # 0.0.11 126 | 127 | - Added the ability to run custom commands 128 | - Added the ability to run any commands 129 | - Added `migrate:fresh` to create a fresh database 130 | - Updated all `node_modules` 131 | 132 | # 0.0.10 133 | 134 | - Fixed issue where `artisan` was not found if there was a space in the path 135 | 136 | # 0.0.9 137 | 138 | - vsce bug that doesn't rollback version on publishing error 139 | 140 | # 0.0.8 141 | 142 | - Added `event:generate` to generate events 143 | 144 | # 0.0.7 145 | 146 | - Fixed an issue where `-r` does not exist when creating a resource controller 147 | - Fixed strange headers on the `route:list` and `list` pages 148 | - Added a search box to the `route:list` command and the `list` command 149 | - Added the ability to open files from the `route:list` page 150 | 151 | # 0.0.6 152 | 153 | - Kill the php server when code is closed 154 | 155 | # 0.0.5 156 | 157 | - Fixed a typo in the `migrate` command from `micration` to `migration` 158 | - Added the ability to stop the php server 159 | 160 | # 0.0.4 161 | 162 | - Added output to show the command that was executed 163 | - Added output to show error messages 164 | 165 | # 0.0.3 166 | 167 | - Added routes display 168 | 169 | # 0.0.2 170 | 171 | - Made the input boxes more personable 172 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Laravel Artisan 2 | 3 | Run Laravel Artisan commands from within Visual Studio Code. 4 | 5 | ## Features 6 | 7 | - Supports multiple instances of **artisan** in the same workspace hierarchy 8 | - Make files (Controllers, Migrations, Models, etc) 9 | - Run Custom Commands 10 | - Manage the database 11 | - Clear Caches 12 | - Generate Keys 13 | - View all routes 14 | - Start/stop a local php server for test purposes 15 | - Docker support 16 | 17 | ### Get a list of routes 18 | 19 | ![Route List](./images/screens/route-list.gif) 20 | 21 | ### Make a controller 22 | 23 | ![Make Controller](./images/screens/make-controller.gif) 24 | 25 | ## Requirements 26 | 27 | **Note:** The `php` setting is optional if the setting `artisan.php.location` is set in your `settings.json` file and points to a valid php executable. If this setting is set, the extension will prefer the setting over the one within the path. 28 | 29 | - A useable version of `php` that can be ran on the command line such as `php-cli` (This should be in your path) 30 | - The following command should yield a php version: 31 | - `php -v` 32 | - If no php version is returned you don't have php setup correctly. 33 | - If you get a version back you are good to go! 34 | - A Laravel install that has `artisan` in the workspace root 35 | - cd into your root directory and run the following command: 36 | - `php artisan -v` 37 | - If an error is returned you don't have laravel setup correctly. 38 | - If you get a Laravel version and a list of commands you are good to go! 39 | 40 | ## Usage 41 | 42 | ### Command Pallet 43 | 44 | Once you have installed the extension, it will become active once you open a workspace that has at least one `artisan` file within the workspace. 45 | You can then open the command pallet, and start running the commands. 46 | Just type `Artisan:` to get a list of commands. If you have more than one `artisan` file within the workspace, then this will ask which `artisan` file you want to use to execute the selected command. 47 | 48 | Many commands have optional input questions, leave them blank to use the defaults, or enter your own value. 49 | 50 | All commands are accessible through `Artisan: Run Command`, here you can access your custom commands as well as built in commands. 51 | 52 | ### Context Menu 53 | 54 | You can also right click on some files and folders to run commands, the context menu will only show commands that are relevant to the file or folder you have right clicked on. The context menu will show on child folders and files as well as the main folder. 55 | 56 | - app – Run app related commands. 57 | - Make – To make app files. 58 | - Serve – To start/stop a local php server. 59 | - database – Run database related commands. 60 | - Make – To make database files. 61 | - Migrate – To run migrations. 62 | - resources – Run resource related commands. 63 | - routes – Run route related commands. 64 | - Misc – Run misc commands (displayed on all files & folders). 65 | 66 | ## Docker 67 | 68 | If you are running Laravel with Docker you can set config vars like this, considering your `docker-compose.yml` is placed on project's root. 69 | 70 | ```json 71 | { 72 | "artisan.docker.enabled": true, 73 | "artisan.docker.command": "docker-compose exec " 74 | } 75 | ``` 76 | 77 | Where `` is your container name. **Note** this is a base command that will prepend to artisan commands. 78 | 79 | Example: 80 | 81 | ```sh 82 | docker-compose exec app php artisan make:model Post 83 | ``` 84 | 85 | Before running any commands, make sure the containers are running (`docker-compose up`). 86 | 87 | ## WSL 88 | 89 | If php is installed with WSL (Windows Subsystems for Linux), add the path to the executable in `settings.json` like below 90 | 91 | ### Newer versions of WSL 92 | 93 | When using the newer versions of WSL, you can set the `artisan.wsl` setting to `true` and the `artisan.php.location` setting to `/usr/bin/php` to use the default php installation. 94 | 95 | ```json 96 | { 97 | // Opens wsl and runs the command in the wsl shell 98 | "artisan.wsl.enabled": true, 99 | // Optional if you have php installed in a different location that the one in the path: 100 | "artisan.php.location": "/path/to/php" 101 | } 102 | ``` 103 | 104 | ### Older versions of WSL 105 | 106 | - Replace `` with the correct user name 107 | - Replace `CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc` with the proper package name 108 | - Replace `usr\\bin\\php` if **php** is installed in different location 109 | 110 | ```json 111 | { 112 | "artisan.php.location": "C:\\Users\\\\AppData\\Local\\Packages\\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\\LocalState\\rootfs\\usr\\bin\\php" 113 | } 114 | ``` 115 | -------------------------------------------------------------------------------- /images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheColorRed/vscode-laravel-artisan/915ae18b347bc2fd236183d137144924225a8b7f/images/icon.png -------------------------------------------------------------------------------- /images/screens/make-controller.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheColorRed/vscode-laravel-artisan/915ae18b347bc2fd236183d137144924225a8b7f/images/screens/make-controller.gif -------------------------------------------------------------------------------- /images/screens/route-list.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheColorRed/vscode-laravel-artisan/915ae18b347bc2fd236183d137144924225a8b7f/images/screens/route-list.gif -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel-artisan", 3 | "version": "0.0.31", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "laravel-artisan", 9 | "version": "0.0.31", 10 | "hasInstallScript": true, 11 | "dependencies": { 12 | "rxjs": "7.8.0" 13 | }, 14 | "devDependencies": { 15 | "@types/mocha": "^2.2.44", 16 | "@types/node": "^9.6.49", 17 | "mocha": "^10.2.0", 18 | "typescript": "^5.0.4", 19 | "vscode": "^1.1.34" 20 | }, 21 | "engines": { 22 | "vscode": "^1.23.0" 23 | } 24 | }, 25 | "node_modules/@tootallnate/once": { 26 | "version": "1.1.2", 27 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 28 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 29 | "dev": true, 30 | "engines": { 31 | "node": ">= 6" 32 | } 33 | }, 34 | "node_modules/@types/mocha": { 35 | "version": "2.2.48", 36 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", 37 | "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", 38 | "dev": true 39 | }, 40 | "node_modules/@types/node": { 41 | "version": "9.6.61", 42 | "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.61.tgz", 43 | "integrity": "sha512-/aKAdg5c8n468cYLy2eQrcR5k6chlbNwZNGUj3TboyPa2hcO2QAJcfymlqPzMiRj8B6nYKXjzQz36minFE0RwQ==", 44 | "dev": true 45 | }, 46 | "node_modules/agent-base": { 47 | "version": "6.0.2", 48 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 49 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 50 | "dev": true, 51 | "dependencies": { 52 | "debug": "4" 53 | }, 54 | "engines": { 55 | "node": ">= 6.0.0" 56 | } 57 | }, 58 | "node_modules/ansi-colors": { 59 | "version": "4.1.1", 60 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 61 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 62 | "dev": true, 63 | "engines": { 64 | "node": ">=6" 65 | } 66 | }, 67 | "node_modules/ansi-regex": { 68 | "version": "5.0.1", 69 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 70 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 71 | "dev": true, 72 | "engines": { 73 | "node": ">=8" 74 | } 75 | }, 76 | "node_modules/ansi-styles": { 77 | "version": "4.3.0", 78 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 79 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 80 | "dev": true, 81 | "dependencies": { 82 | "color-convert": "^2.0.1" 83 | }, 84 | "engines": { 85 | "node": ">=8" 86 | }, 87 | "funding": { 88 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 89 | } 90 | }, 91 | "node_modules/anymatch": { 92 | "version": "3.1.3", 93 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 94 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 95 | "dev": true, 96 | "dependencies": { 97 | "normalize-path": "^3.0.0", 98 | "picomatch": "^2.0.4" 99 | }, 100 | "engines": { 101 | "node": ">= 8" 102 | } 103 | }, 104 | "node_modules/argparse": { 105 | "version": "2.0.1", 106 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 107 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 108 | "dev": true 109 | }, 110 | "node_modules/balanced-match": { 111 | "version": "1.0.2", 112 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 113 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 114 | "dev": true 115 | }, 116 | "node_modules/binary-extensions": { 117 | "version": "2.2.0", 118 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 119 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 120 | "dev": true, 121 | "engines": { 122 | "node": ">=8" 123 | } 124 | }, 125 | "node_modules/brace-expansion": { 126 | "version": "2.0.1", 127 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 128 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 129 | "dev": true, 130 | "dependencies": { 131 | "balanced-match": "^1.0.0" 132 | } 133 | }, 134 | "node_modules/braces": { 135 | "version": "3.0.2", 136 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 137 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 138 | "dev": true, 139 | "dependencies": { 140 | "fill-range": "^7.0.1" 141 | }, 142 | "engines": { 143 | "node": ">=8" 144 | } 145 | }, 146 | "node_modules/browser-stdout": { 147 | "version": "1.3.1", 148 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 149 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 150 | "dev": true 151 | }, 152 | "node_modules/buffer-from": { 153 | "version": "1.1.2", 154 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 155 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 156 | "dev": true 157 | }, 158 | "node_modules/camelcase": { 159 | "version": "6.3.0", 160 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 161 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 162 | "dev": true, 163 | "engines": { 164 | "node": ">=10" 165 | }, 166 | "funding": { 167 | "url": "https://github.com/sponsors/sindresorhus" 168 | } 169 | }, 170 | "node_modules/chalk": { 171 | "version": "4.1.2", 172 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 173 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 174 | "dev": true, 175 | "dependencies": { 176 | "ansi-styles": "^4.1.0", 177 | "supports-color": "^7.1.0" 178 | }, 179 | "engines": { 180 | "node": ">=10" 181 | }, 182 | "funding": { 183 | "url": "https://github.com/chalk/chalk?sponsor=1" 184 | } 185 | }, 186 | "node_modules/chalk/node_modules/supports-color": { 187 | "version": "7.2.0", 188 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 189 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 190 | "dev": true, 191 | "dependencies": { 192 | "has-flag": "^4.0.0" 193 | }, 194 | "engines": { 195 | "node": ">=8" 196 | } 197 | }, 198 | "node_modules/chokidar": { 199 | "version": "3.5.3", 200 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 201 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 202 | "dev": true, 203 | "funding": [ 204 | { 205 | "type": "individual", 206 | "url": "https://paulmillr.com/funding/" 207 | } 208 | ], 209 | "dependencies": { 210 | "anymatch": "~3.1.2", 211 | "braces": "~3.0.2", 212 | "glob-parent": "~5.1.2", 213 | "is-binary-path": "~2.1.0", 214 | "is-glob": "~4.0.1", 215 | "normalize-path": "~3.0.0", 216 | "readdirp": "~3.6.0" 217 | }, 218 | "engines": { 219 | "node": ">= 8.10.0" 220 | }, 221 | "optionalDependencies": { 222 | "fsevents": "~2.3.2" 223 | } 224 | }, 225 | "node_modules/cliui": { 226 | "version": "7.0.4", 227 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 228 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 229 | "dev": true, 230 | "dependencies": { 231 | "string-width": "^4.2.0", 232 | "strip-ansi": "^6.0.0", 233 | "wrap-ansi": "^7.0.0" 234 | } 235 | }, 236 | "node_modules/color-convert": { 237 | "version": "2.0.1", 238 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 239 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 240 | "dev": true, 241 | "dependencies": { 242 | "color-name": "~1.1.4" 243 | }, 244 | "engines": { 245 | "node": ">=7.0.0" 246 | } 247 | }, 248 | "node_modules/color-name": { 249 | "version": "1.1.4", 250 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 251 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 252 | "dev": true 253 | }, 254 | "node_modules/commander": { 255 | "version": "2.15.1", 256 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 257 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 258 | "dev": true 259 | }, 260 | "node_modules/concat-map": { 261 | "version": "0.0.1", 262 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 263 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 264 | "dev": true 265 | }, 266 | "node_modules/debug": { 267 | "version": "4.3.4", 268 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 269 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 270 | "dev": true, 271 | "dependencies": { 272 | "ms": "2.1.2" 273 | }, 274 | "engines": { 275 | "node": ">=6.0" 276 | }, 277 | "peerDependenciesMeta": { 278 | "supports-color": { 279 | "optional": true 280 | } 281 | } 282 | }, 283 | "node_modules/debug/node_modules/ms": { 284 | "version": "2.1.2", 285 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 286 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 287 | "dev": true 288 | }, 289 | "node_modules/decamelize": { 290 | "version": "4.0.0", 291 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 292 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 293 | "dev": true, 294 | "engines": { 295 | "node": ">=10" 296 | }, 297 | "funding": { 298 | "url": "https://github.com/sponsors/sindresorhus" 299 | } 300 | }, 301 | "node_modules/diff": { 302 | "version": "5.0.0", 303 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 304 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 305 | "dev": true, 306 | "engines": { 307 | "node": ">=0.3.1" 308 | } 309 | }, 310 | "node_modules/emoji-regex": { 311 | "version": "8.0.0", 312 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 313 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 314 | "dev": true 315 | }, 316 | "node_modules/es6-promise": { 317 | "version": "4.2.8", 318 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 319 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 320 | "dev": true 321 | }, 322 | "node_modules/es6-promisify": { 323 | "version": "5.0.0", 324 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 325 | "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", 326 | "dev": true, 327 | "dependencies": { 328 | "es6-promise": "^4.0.3" 329 | } 330 | }, 331 | "node_modules/escalade": { 332 | "version": "3.1.1", 333 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 334 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 335 | "dev": true, 336 | "engines": { 337 | "node": ">=6" 338 | } 339 | }, 340 | "node_modules/escape-string-regexp": { 341 | "version": "4.0.0", 342 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 343 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 344 | "dev": true, 345 | "engines": { 346 | "node": ">=10" 347 | }, 348 | "funding": { 349 | "url": "https://github.com/sponsors/sindresorhus" 350 | } 351 | }, 352 | "node_modules/fill-range": { 353 | "version": "7.0.1", 354 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 355 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 356 | "dev": true, 357 | "dependencies": { 358 | "to-regex-range": "^5.0.1" 359 | }, 360 | "engines": { 361 | "node": ">=8" 362 | } 363 | }, 364 | "node_modules/find-up": { 365 | "version": "5.0.0", 366 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 367 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 368 | "dev": true, 369 | "dependencies": { 370 | "locate-path": "^6.0.0", 371 | "path-exists": "^4.0.0" 372 | }, 373 | "engines": { 374 | "node": ">=10" 375 | }, 376 | "funding": { 377 | "url": "https://github.com/sponsors/sindresorhus" 378 | } 379 | }, 380 | "node_modules/flat": { 381 | "version": "5.0.2", 382 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 383 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 384 | "dev": true, 385 | "bin": { 386 | "flat": "cli.js" 387 | } 388 | }, 389 | "node_modules/fs.realpath": { 390 | "version": "1.0.0", 391 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 392 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 393 | "dev": true 394 | }, 395 | "node_modules/fsevents": { 396 | "version": "2.3.2", 397 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 398 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 399 | "dev": true, 400 | "hasInstallScript": true, 401 | "optional": true, 402 | "os": [ 403 | "darwin" 404 | ], 405 | "engines": { 406 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 407 | } 408 | }, 409 | "node_modules/get-caller-file": { 410 | "version": "2.0.5", 411 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 412 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 413 | "dev": true, 414 | "engines": { 415 | "node": "6.* || 8.* || >= 10.*" 416 | } 417 | }, 418 | "node_modules/glob": { 419 | "version": "7.2.0", 420 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 421 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 422 | "dev": true, 423 | "dependencies": { 424 | "fs.realpath": "^1.0.0", 425 | "inflight": "^1.0.4", 426 | "inherits": "2", 427 | "minimatch": "^3.0.4", 428 | "once": "^1.3.0", 429 | "path-is-absolute": "^1.0.0" 430 | }, 431 | "engines": { 432 | "node": "*" 433 | }, 434 | "funding": { 435 | "url": "https://github.com/sponsors/isaacs" 436 | } 437 | }, 438 | "node_modules/glob-parent": { 439 | "version": "5.1.2", 440 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 441 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 442 | "dev": true, 443 | "dependencies": { 444 | "is-glob": "^4.0.1" 445 | }, 446 | "engines": { 447 | "node": ">= 6" 448 | } 449 | }, 450 | "node_modules/glob/node_modules/brace-expansion": { 451 | "version": "1.1.11", 452 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 453 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 454 | "dev": true, 455 | "dependencies": { 456 | "balanced-match": "^1.0.0", 457 | "concat-map": "0.0.1" 458 | } 459 | }, 460 | "node_modules/glob/node_modules/minimatch": { 461 | "version": "3.1.2", 462 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 463 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 464 | "dev": true, 465 | "dependencies": { 466 | "brace-expansion": "^1.1.7" 467 | }, 468 | "engines": { 469 | "node": "*" 470 | } 471 | }, 472 | "node_modules/growl": { 473 | "version": "1.10.5", 474 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 475 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 476 | "dev": true, 477 | "engines": { 478 | "node": ">=4.x" 479 | } 480 | }, 481 | "node_modules/has-flag": { 482 | "version": "4.0.0", 483 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 484 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 485 | "dev": true, 486 | "engines": { 487 | "node": ">=8" 488 | } 489 | }, 490 | "node_modules/he": { 491 | "version": "1.2.0", 492 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 493 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 494 | "dev": true, 495 | "bin": { 496 | "he": "bin/he" 497 | } 498 | }, 499 | "node_modules/http-proxy-agent": { 500 | "version": "4.0.1", 501 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 502 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 503 | "dev": true, 504 | "dependencies": { 505 | "@tootallnate/once": "1", 506 | "agent-base": "6", 507 | "debug": "4" 508 | }, 509 | "engines": { 510 | "node": ">= 6" 511 | } 512 | }, 513 | "node_modules/https-proxy-agent": { 514 | "version": "5.0.1", 515 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 516 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 517 | "dev": true, 518 | "dependencies": { 519 | "agent-base": "6", 520 | "debug": "4" 521 | }, 522 | "engines": { 523 | "node": ">= 6" 524 | } 525 | }, 526 | "node_modules/inflight": { 527 | "version": "1.0.6", 528 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 529 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 530 | "dev": true, 531 | "dependencies": { 532 | "once": "^1.3.0", 533 | "wrappy": "1" 534 | } 535 | }, 536 | "node_modules/inherits": { 537 | "version": "2.0.4", 538 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 539 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 540 | "dev": true 541 | }, 542 | "node_modules/is-binary-path": { 543 | "version": "2.1.0", 544 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 545 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 546 | "dev": true, 547 | "dependencies": { 548 | "binary-extensions": "^2.0.0" 549 | }, 550 | "engines": { 551 | "node": ">=8" 552 | } 553 | }, 554 | "node_modules/is-extglob": { 555 | "version": "2.1.1", 556 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 557 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 558 | "dev": true, 559 | "engines": { 560 | "node": ">=0.10.0" 561 | } 562 | }, 563 | "node_modules/is-fullwidth-code-point": { 564 | "version": "3.0.0", 565 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 566 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 567 | "dev": true, 568 | "engines": { 569 | "node": ">=8" 570 | } 571 | }, 572 | "node_modules/is-glob": { 573 | "version": "4.0.3", 574 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 575 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 576 | "dev": true, 577 | "dependencies": { 578 | "is-extglob": "^2.1.1" 579 | }, 580 | "engines": { 581 | "node": ">=0.10.0" 582 | } 583 | }, 584 | "node_modules/is-number": { 585 | "version": "7.0.0", 586 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 587 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 588 | "dev": true, 589 | "engines": { 590 | "node": ">=0.12.0" 591 | } 592 | }, 593 | "node_modules/is-plain-obj": { 594 | "version": "2.1.0", 595 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 596 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 597 | "dev": true, 598 | "engines": { 599 | "node": ">=8" 600 | } 601 | }, 602 | "node_modules/is-unicode-supported": { 603 | "version": "0.1.0", 604 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 605 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 606 | "dev": true, 607 | "engines": { 608 | "node": ">=10" 609 | }, 610 | "funding": { 611 | "url": "https://github.com/sponsors/sindresorhus" 612 | } 613 | }, 614 | "node_modules/js-yaml": { 615 | "version": "4.1.0", 616 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 617 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 618 | "dev": true, 619 | "dependencies": { 620 | "argparse": "^2.0.1" 621 | }, 622 | "bin": { 623 | "js-yaml": "bin/js-yaml.js" 624 | } 625 | }, 626 | "node_modules/locate-path": { 627 | "version": "6.0.0", 628 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 629 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 630 | "dev": true, 631 | "dependencies": { 632 | "p-locate": "^5.0.0" 633 | }, 634 | "engines": { 635 | "node": ">=10" 636 | }, 637 | "funding": { 638 | "url": "https://github.com/sponsors/sindresorhus" 639 | } 640 | }, 641 | "node_modules/log-symbols": { 642 | "version": "4.1.0", 643 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 644 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 645 | "dev": true, 646 | "dependencies": { 647 | "chalk": "^4.1.0", 648 | "is-unicode-supported": "^0.1.0" 649 | }, 650 | "engines": { 651 | "node": ">=10" 652 | }, 653 | "funding": { 654 | "url": "https://github.com/sponsors/sindresorhus" 655 | } 656 | }, 657 | "node_modules/minimatch": { 658 | "version": "5.0.1", 659 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 660 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 661 | "dev": true, 662 | "dependencies": { 663 | "brace-expansion": "^2.0.1" 664 | }, 665 | "engines": { 666 | "node": ">=10" 667 | } 668 | }, 669 | "node_modules/minimist": { 670 | "version": "0.0.8", 671 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 672 | "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", 673 | "dev": true 674 | }, 675 | "node_modules/mkdirp": { 676 | "version": "0.5.1", 677 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 678 | "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", 679 | "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", 680 | "dev": true, 681 | "dependencies": { 682 | "minimist": "0.0.8" 683 | }, 684 | "bin": { 685 | "mkdirp": "bin/cmd.js" 686 | } 687 | }, 688 | "node_modules/mocha": { 689 | "version": "10.2.0", 690 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 691 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 692 | "dev": true, 693 | "dependencies": { 694 | "ansi-colors": "4.1.1", 695 | "browser-stdout": "1.3.1", 696 | "chokidar": "3.5.3", 697 | "debug": "4.3.4", 698 | "diff": "5.0.0", 699 | "escape-string-regexp": "4.0.0", 700 | "find-up": "5.0.0", 701 | "glob": "7.2.0", 702 | "he": "1.2.0", 703 | "js-yaml": "4.1.0", 704 | "log-symbols": "4.1.0", 705 | "minimatch": "5.0.1", 706 | "ms": "2.1.3", 707 | "nanoid": "3.3.3", 708 | "serialize-javascript": "6.0.0", 709 | "strip-json-comments": "3.1.1", 710 | "supports-color": "8.1.1", 711 | "workerpool": "6.2.1", 712 | "yargs": "16.2.0", 713 | "yargs-parser": "20.2.4", 714 | "yargs-unparser": "2.0.0" 715 | }, 716 | "bin": { 717 | "_mocha": "bin/_mocha", 718 | "mocha": "bin/mocha.js" 719 | }, 720 | "engines": { 721 | "node": ">= 14.0.0" 722 | }, 723 | "funding": { 724 | "type": "opencollective", 725 | "url": "https://opencollective.com/mochajs" 726 | } 727 | }, 728 | "node_modules/ms": { 729 | "version": "2.1.3", 730 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 731 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 732 | "dev": true 733 | }, 734 | "node_modules/nanoid": { 735 | "version": "3.3.3", 736 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 737 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 738 | "dev": true, 739 | "bin": { 740 | "nanoid": "bin/nanoid.cjs" 741 | }, 742 | "engines": { 743 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 744 | } 745 | }, 746 | "node_modules/normalize-path": { 747 | "version": "3.0.0", 748 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 749 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 750 | "dev": true, 751 | "engines": { 752 | "node": ">=0.10.0" 753 | } 754 | }, 755 | "node_modules/once": { 756 | "version": "1.4.0", 757 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 758 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 759 | "dev": true, 760 | "dependencies": { 761 | "wrappy": "1" 762 | } 763 | }, 764 | "node_modules/p-limit": { 765 | "version": "3.1.0", 766 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 767 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 768 | "dev": true, 769 | "dependencies": { 770 | "yocto-queue": "^0.1.0" 771 | }, 772 | "engines": { 773 | "node": ">=10" 774 | }, 775 | "funding": { 776 | "url": "https://github.com/sponsors/sindresorhus" 777 | } 778 | }, 779 | "node_modules/p-locate": { 780 | "version": "5.0.0", 781 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 782 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 783 | "dev": true, 784 | "dependencies": { 785 | "p-limit": "^3.0.2" 786 | }, 787 | "engines": { 788 | "node": ">=10" 789 | }, 790 | "funding": { 791 | "url": "https://github.com/sponsors/sindresorhus" 792 | } 793 | }, 794 | "node_modules/path-exists": { 795 | "version": "4.0.0", 796 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 797 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 798 | "dev": true, 799 | "engines": { 800 | "node": ">=8" 801 | } 802 | }, 803 | "node_modules/path-is-absolute": { 804 | "version": "1.0.1", 805 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 806 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 807 | "dev": true, 808 | "engines": { 809 | "node": ">=0.10.0" 810 | } 811 | }, 812 | "node_modules/picomatch": { 813 | "version": "2.3.1", 814 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 815 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 816 | "dev": true, 817 | "engines": { 818 | "node": ">=8.6" 819 | }, 820 | "funding": { 821 | "url": "https://github.com/sponsors/jonschlinkert" 822 | } 823 | }, 824 | "node_modules/randombytes": { 825 | "version": "2.1.0", 826 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 827 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 828 | "dev": true, 829 | "dependencies": { 830 | "safe-buffer": "^5.1.0" 831 | } 832 | }, 833 | "node_modules/readdirp": { 834 | "version": "3.6.0", 835 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 836 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 837 | "dev": true, 838 | "dependencies": { 839 | "picomatch": "^2.2.1" 840 | }, 841 | "engines": { 842 | "node": ">=8.10.0" 843 | } 844 | }, 845 | "node_modules/require-directory": { 846 | "version": "2.1.1", 847 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 848 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 849 | "dev": true, 850 | "engines": { 851 | "node": ">=0.10.0" 852 | } 853 | }, 854 | "node_modules/rxjs": { 855 | "version": "7.8.0", 856 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", 857 | "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", 858 | "dependencies": { 859 | "tslib": "^2.1.0" 860 | } 861 | }, 862 | "node_modules/safe-buffer": { 863 | "version": "5.2.1", 864 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 865 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 866 | "dev": true, 867 | "funding": [ 868 | { 869 | "type": "github", 870 | "url": "https://github.com/sponsors/feross" 871 | }, 872 | { 873 | "type": "patreon", 874 | "url": "https://www.patreon.com/feross" 875 | }, 876 | { 877 | "type": "consulting", 878 | "url": "https://feross.org/support" 879 | } 880 | ] 881 | }, 882 | "node_modules/semver": { 883 | "version": "5.7.1", 884 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 885 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 886 | "dev": true, 887 | "bin": { 888 | "semver": "bin/semver" 889 | } 890 | }, 891 | "node_modules/serialize-javascript": { 892 | "version": "6.0.0", 893 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 894 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 895 | "dev": true, 896 | "dependencies": { 897 | "randombytes": "^2.1.0" 898 | } 899 | }, 900 | "node_modules/source-map": { 901 | "version": "0.6.1", 902 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 903 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 904 | "dev": true, 905 | "engines": { 906 | "node": ">=0.10.0" 907 | } 908 | }, 909 | "node_modules/source-map-support": { 910 | "version": "0.5.21", 911 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 912 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 913 | "dev": true, 914 | "dependencies": { 915 | "buffer-from": "^1.0.0", 916 | "source-map": "^0.6.0" 917 | } 918 | }, 919 | "node_modules/string-width": { 920 | "version": "4.2.3", 921 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 922 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 923 | "dev": true, 924 | "dependencies": { 925 | "emoji-regex": "^8.0.0", 926 | "is-fullwidth-code-point": "^3.0.0", 927 | "strip-ansi": "^6.0.1" 928 | }, 929 | "engines": { 930 | "node": ">=8" 931 | } 932 | }, 933 | "node_modules/strip-ansi": { 934 | "version": "6.0.1", 935 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 936 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 937 | "dev": true, 938 | "dependencies": { 939 | "ansi-regex": "^5.0.1" 940 | }, 941 | "engines": { 942 | "node": ">=8" 943 | } 944 | }, 945 | "node_modules/strip-json-comments": { 946 | "version": "3.1.1", 947 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 948 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 949 | "dev": true, 950 | "engines": { 951 | "node": ">=8" 952 | }, 953 | "funding": { 954 | "url": "https://github.com/sponsors/sindresorhus" 955 | } 956 | }, 957 | "node_modules/supports-color": { 958 | "version": "8.1.1", 959 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 960 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 961 | "dev": true, 962 | "dependencies": { 963 | "has-flag": "^4.0.0" 964 | }, 965 | "engines": { 966 | "node": ">=10" 967 | }, 968 | "funding": { 969 | "url": "https://github.com/chalk/supports-color?sponsor=1" 970 | } 971 | }, 972 | "node_modules/to-regex-range": { 973 | "version": "5.0.1", 974 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 975 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 976 | "dev": true, 977 | "dependencies": { 978 | "is-number": "^7.0.0" 979 | }, 980 | "engines": { 981 | "node": ">=8.0" 982 | } 983 | }, 984 | "node_modules/tslib": { 985 | "version": "2.5.0", 986 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", 987 | "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" 988 | }, 989 | "node_modules/typescript": { 990 | "version": "5.0.4", 991 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", 992 | "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", 993 | "dev": true, 994 | "bin": { 995 | "tsc": "bin/tsc", 996 | "tsserver": "bin/tsserver" 997 | }, 998 | "engines": { 999 | "node": ">=12.20" 1000 | } 1001 | }, 1002 | "node_modules/vscode": { 1003 | "version": "1.1.37", 1004 | "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.37.tgz", 1005 | "integrity": "sha512-vJNj6IlN7IJPdMavlQa1KoFB3Ihn06q1AiN3ZFI/HfzPNzbKZWPPuiU+XkpNOfGU5k15m4r80nxNPlM7wcc0wg==", 1006 | "deprecated": "This package is deprecated in favor of @types/vscode and vscode-test. For more information please read: https://code.visualstudio.com/updates/v1_36#_splitting-vscode-package-into-typesvscode-and-vscodetest", 1007 | "dev": true, 1008 | "dependencies": { 1009 | "glob": "^7.1.2", 1010 | "http-proxy-agent": "^4.0.1", 1011 | "https-proxy-agent": "^5.0.0", 1012 | "mocha": "^5.2.0", 1013 | "semver": "^5.4.1", 1014 | "source-map-support": "^0.5.0", 1015 | "vscode-test": "^0.4.1" 1016 | }, 1017 | "bin": { 1018 | "vscode-install": "bin/install" 1019 | }, 1020 | "engines": { 1021 | "node": ">=8.9.3" 1022 | } 1023 | }, 1024 | "node_modules/vscode-test": { 1025 | "version": "0.4.3", 1026 | "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", 1027 | "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", 1028 | "deprecated": "This package has been renamed to @vscode/test-electron, please update to the new name", 1029 | "dev": true, 1030 | "dependencies": { 1031 | "http-proxy-agent": "^2.1.0", 1032 | "https-proxy-agent": "^2.2.1" 1033 | }, 1034 | "engines": { 1035 | "node": ">=8.9.3" 1036 | } 1037 | }, 1038 | "node_modules/vscode-test/node_modules/agent-base": { 1039 | "version": "4.3.0", 1040 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 1041 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 1042 | "dev": true, 1043 | "dependencies": { 1044 | "es6-promisify": "^5.0.0" 1045 | }, 1046 | "engines": { 1047 | "node": ">= 4.0.0" 1048 | } 1049 | }, 1050 | "node_modules/vscode-test/node_modules/debug": { 1051 | "version": "3.1.0", 1052 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1053 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1054 | "dev": true, 1055 | "dependencies": { 1056 | "ms": "2.0.0" 1057 | } 1058 | }, 1059 | "node_modules/vscode-test/node_modules/http-proxy-agent": { 1060 | "version": "2.1.0", 1061 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 1062 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 1063 | "dev": true, 1064 | "dependencies": { 1065 | "agent-base": "4", 1066 | "debug": "3.1.0" 1067 | }, 1068 | "engines": { 1069 | "node": ">= 4.5.0" 1070 | } 1071 | }, 1072 | "node_modules/vscode-test/node_modules/https-proxy-agent": { 1073 | "version": "2.2.4", 1074 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 1075 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 1076 | "dev": true, 1077 | "dependencies": { 1078 | "agent-base": "^4.3.0", 1079 | "debug": "^3.1.0" 1080 | }, 1081 | "engines": { 1082 | "node": ">= 4.5.0" 1083 | } 1084 | }, 1085 | "node_modules/vscode-test/node_modules/ms": { 1086 | "version": "2.0.0", 1087 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1088 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1089 | "dev": true 1090 | }, 1091 | "node_modules/vscode/node_modules/brace-expansion": { 1092 | "version": "1.1.11", 1093 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1094 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1095 | "dev": true, 1096 | "dependencies": { 1097 | "balanced-match": "^1.0.0", 1098 | "concat-map": "0.0.1" 1099 | } 1100 | }, 1101 | "node_modules/vscode/node_modules/debug": { 1102 | "version": "3.1.0", 1103 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1104 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1105 | "dev": true, 1106 | "dependencies": { 1107 | "ms": "2.0.0" 1108 | } 1109 | }, 1110 | "node_modules/vscode/node_modules/diff": { 1111 | "version": "3.5.0", 1112 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 1113 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 1114 | "dev": true, 1115 | "engines": { 1116 | "node": ">=0.3.1" 1117 | } 1118 | }, 1119 | "node_modules/vscode/node_modules/escape-string-regexp": { 1120 | "version": "1.0.5", 1121 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1122 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 1123 | "dev": true, 1124 | "engines": { 1125 | "node": ">=0.8.0" 1126 | } 1127 | }, 1128 | "node_modules/vscode/node_modules/glob": { 1129 | "version": "7.1.2", 1130 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1131 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1132 | "dev": true, 1133 | "dependencies": { 1134 | "fs.realpath": "^1.0.0", 1135 | "inflight": "^1.0.4", 1136 | "inherits": "2", 1137 | "minimatch": "^3.0.4", 1138 | "once": "^1.3.0", 1139 | "path-is-absolute": "^1.0.0" 1140 | }, 1141 | "engines": { 1142 | "node": "*" 1143 | } 1144 | }, 1145 | "node_modules/vscode/node_modules/has-flag": { 1146 | "version": "3.0.0", 1147 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1148 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1149 | "dev": true, 1150 | "engines": { 1151 | "node": ">=4" 1152 | } 1153 | }, 1154 | "node_modules/vscode/node_modules/he": { 1155 | "version": "1.1.1", 1156 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 1157 | "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", 1158 | "dev": true, 1159 | "bin": { 1160 | "he": "bin/he" 1161 | } 1162 | }, 1163 | "node_modules/vscode/node_modules/minimatch": { 1164 | "version": "3.0.4", 1165 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1166 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1167 | "dev": true, 1168 | "dependencies": { 1169 | "brace-expansion": "^1.1.7" 1170 | }, 1171 | "engines": { 1172 | "node": "*" 1173 | } 1174 | }, 1175 | "node_modules/vscode/node_modules/mocha": { 1176 | "version": "5.2.0", 1177 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 1178 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 1179 | "dev": true, 1180 | "dependencies": { 1181 | "browser-stdout": "1.3.1", 1182 | "commander": "2.15.1", 1183 | "debug": "3.1.0", 1184 | "diff": "3.5.0", 1185 | "escape-string-regexp": "1.0.5", 1186 | "glob": "7.1.2", 1187 | "growl": "1.10.5", 1188 | "he": "1.1.1", 1189 | "minimatch": "3.0.4", 1190 | "mkdirp": "0.5.1", 1191 | "supports-color": "5.4.0" 1192 | }, 1193 | "bin": { 1194 | "_mocha": "bin/_mocha", 1195 | "mocha": "bin/mocha" 1196 | }, 1197 | "engines": { 1198 | "node": ">= 4.0.0" 1199 | } 1200 | }, 1201 | "node_modules/vscode/node_modules/ms": { 1202 | "version": "2.0.0", 1203 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1204 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1205 | "dev": true 1206 | }, 1207 | "node_modules/vscode/node_modules/supports-color": { 1208 | "version": "5.4.0", 1209 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 1210 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 1211 | "dev": true, 1212 | "dependencies": { 1213 | "has-flag": "^3.0.0" 1214 | }, 1215 | "engines": { 1216 | "node": ">=4" 1217 | } 1218 | }, 1219 | "node_modules/workerpool": { 1220 | "version": "6.2.1", 1221 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 1222 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 1223 | "dev": true 1224 | }, 1225 | "node_modules/wrap-ansi": { 1226 | "version": "7.0.0", 1227 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1228 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1229 | "dev": true, 1230 | "dependencies": { 1231 | "ansi-styles": "^4.0.0", 1232 | "string-width": "^4.1.0", 1233 | "strip-ansi": "^6.0.0" 1234 | }, 1235 | "engines": { 1236 | "node": ">=10" 1237 | }, 1238 | "funding": { 1239 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1240 | } 1241 | }, 1242 | "node_modules/wrappy": { 1243 | "version": "1.0.2", 1244 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1245 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1246 | "dev": true 1247 | }, 1248 | "node_modules/y18n": { 1249 | "version": "5.0.8", 1250 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1251 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1252 | "dev": true, 1253 | "engines": { 1254 | "node": ">=10" 1255 | } 1256 | }, 1257 | "node_modules/yargs": { 1258 | "version": "16.2.0", 1259 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1260 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1261 | "dev": true, 1262 | "dependencies": { 1263 | "cliui": "^7.0.2", 1264 | "escalade": "^3.1.1", 1265 | "get-caller-file": "^2.0.5", 1266 | "require-directory": "^2.1.1", 1267 | "string-width": "^4.2.0", 1268 | "y18n": "^5.0.5", 1269 | "yargs-parser": "^20.2.2" 1270 | }, 1271 | "engines": { 1272 | "node": ">=10" 1273 | } 1274 | }, 1275 | "node_modules/yargs-parser": { 1276 | "version": "20.2.4", 1277 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1278 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1279 | "dev": true, 1280 | "engines": { 1281 | "node": ">=10" 1282 | } 1283 | }, 1284 | "node_modules/yargs-unparser": { 1285 | "version": "2.0.0", 1286 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1287 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1288 | "dev": true, 1289 | "dependencies": { 1290 | "camelcase": "^6.0.0", 1291 | "decamelize": "^4.0.0", 1292 | "flat": "^5.0.2", 1293 | "is-plain-obj": "^2.1.0" 1294 | }, 1295 | "engines": { 1296 | "node": ">=10" 1297 | } 1298 | }, 1299 | "node_modules/yocto-queue": { 1300 | "version": "0.1.0", 1301 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1302 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1303 | "dev": true, 1304 | "engines": { 1305 | "node": ">=10" 1306 | }, 1307 | "funding": { 1308 | "url": "https://github.com/sponsors/sindresorhus" 1309 | } 1310 | } 1311 | }, 1312 | "dependencies": { 1313 | "@tootallnate/once": { 1314 | "version": "1.1.2", 1315 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 1316 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 1317 | "dev": true 1318 | }, 1319 | "@types/mocha": { 1320 | "version": "2.2.48", 1321 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", 1322 | "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", 1323 | "dev": true 1324 | }, 1325 | "@types/node": { 1326 | "version": "9.6.61", 1327 | "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.61.tgz", 1328 | "integrity": "sha512-/aKAdg5c8n468cYLy2eQrcR5k6chlbNwZNGUj3TboyPa2hcO2QAJcfymlqPzMiRj8B6nYKXjzQz36minFE0RwQ==", 1329 | "dev": true 1330 | }, 1331 | "agent-base": { 1332 | "version": "6.0.2", 1333 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 1334 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 1335 | "dev": true, 1336 | "requires": { 1337 | "debug": "4" 1338 | } 1339 | }, 1340 | "ansi-colors": { 1341 | "version": "4.1.1", 1342 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 1343 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 1344 | "dev": true 1345 | }, 1346 | "ansi-regex": { 1347 | "version": "5.0.1", 1348 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1349 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1350 | "dev": true 1351 | }, 1352 | "ansi-styles": { 1353 | "version": "4.3.0", 1354 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1355 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1356 | "dev": true, 1357 | "requires": { 1358 | "color-convert": "^2.0.1" 1359 | } 1360 | }, 1361 | "anymatch": { 1362 | "version": "3.1.3", 1363 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1364 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1365 | "dev": true, 1366 | "requires": { 1367 | "normalize-path": "^3.0.0", 1368 | "picomatch": "^2.0.4" 1369 | } 1370 | }, 1371 | "argparse": { 1372 | "version": "2.0.1", 1373 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1374 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1375 | "dev": true 1376 | }, 1377 | "balanced-match": { 1378 | "version": "1.0.2", 1379 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1380 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1381 | "dev": true 1382 | }, 1383 | "binary-extensions": { 1384 | "version": "2.2.0", 1385 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1386 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1387 | "dev": true 1388 | }, 1389 | "brace-expansion": { 1390 | "version": "2.0.1", 1391 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1392 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1393 | "dev": true, 1394 | "requires": { 1395 | "balanced-match": "^1.0.0" 1396 | } 1397 | }, 1398 | "braces": { 1399 | "version": "3.0.2", 1400 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1401 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1402 | "dev": true, 1403 | "requires": { 1404 | "fill-range": "^7.0.1" 1405 | } 1406 | }, 1407 | "browser-stdout": { 1408 | "version": "1.3.1", 1409 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 1410 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 1411 | "dev": true 1412 | }, 1413 | "buffer-from": { 1414 | "version": "1.1.2", 1415 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1416 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 1417 | "dev": true 1418 | }, 1419 | "camelcase": { 1420 | "version": "6.3.0", 1421 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 1422 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 1423 | "dev": true 1424 | }, 1425 | "chalk": { 1426 | "version": "4.1.2", 1427 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1428 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1429 | "dev": true, 1430 | "requires": { 1431 | "ansi-styles": "^4.1.0", 1432 | "supports-color": "^7.1.0" 1433 | }, 1434 | "dependencies": { 1435 | "supports-color": { 1436 | "version": "7.2.0", 1437 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1438 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1439 | "dev": true, 1440 | "requires": { 1441 | "has-flag": "^4.0.0" 1442 | } 1443 | } 1444 | } 1445 | }, 1446 | "chokidar": { 1447 | "version": "3.5.3", 1448 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1449 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1450 | "dev": true, 1451 | "requires": { 1452 | "anymatch": "~3.1.2", 1453 | "braces": "~3.0.2", 1454 | "fsevents": "~2.3.2", 1455 | "glob-parent": "~5.1.2", 1456 | "is-binary-path": "~2.1.0", 1457 | "is-glob": "~4.0.1", 1458 | "normalize-path": "~3.0.0", 1459 | "readdirp": "~3.6.0" 1460 | } 1461 | }, 1462 | "cliui": { 1463 | "version": "7.0.4", 1464 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1465 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1466 | "dev": true, 1467 | "requires": { 1468 | "string-width": "^4.2.0", 1469 | "strip-ansi": "^6.0.0", 1470 | "wrap-ansi": "^7.0.0" 1471 | } 1472 | }, 1473 | "color-convert": { 1474 | "version": "2.0.1", 1475 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1476 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1477 | "dev": true, 1478 | "requires": { 1479 | "color-name": "~1.1.4" 1480 | } 1481 | }, 1482 | "color-name": { 1483 | "version": "1.1.4", 1484 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1485 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1486 | "dev": true 1487 | }, 1488 | "commander": { 1489 | "version": "2.15.1", 1490 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 1491 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 1492 | "dev": true 1493 | }, 1494 | "concat-map": { 1495 | "version": "0.0.1", 1496 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1497 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1498 | "dev": true 1499 | }, 1500 | "debug": { 1501 | "version": "4.3.4", 1502 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1503 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1504 | "dev": true, 1505 | "requires": { 1506 | "ms": "2.1.2" 1507 | }, 1508 | "dependencies": { 1509 | "ms": { 1510 | "version": "2.1.2", 1511 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1512 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1513 | "dev": true 1514 | } 1515 | } 1516 | }, 1517 | "decamelize": { 1518 | "version": "4.0.0", 1519 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 1520 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 1521 | "dev": true 1522 | }, 1523 | "diff": { 1524 | "version": "5.0.0", 1525 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 1526 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 1527 | "dev": true 1528 | }, 1529 | "emoji-regex": { 1530 | "version": "8.0.0", 1531 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1532 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1533 | "dev": true 1534 | }, 1535 | "es6-promise": { 1536 | "version": "4.2.8", 1537 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 1538 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 1539 | "dev": true 1540 | }, 1541 | "es6-promisify": { 1542 | "version": "5.0.0", 1543 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 1544 | "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", 1545 | "dev": true, 1546 | "requires": { 1547 | "es6-promise": "^4.0.3" 1548 | } 1549 | }, 1550 | "escalade": { 1551 | "version": "3.1.1", 1552 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1553 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1554 | "dev": true 1555 | }, 1556 | "escape-string-regexp": { 1557 | "version": "4.0.0", 1558 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1559 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1560 | "dev": true 1561 | }, 1562 | "fill-range": { 1563 | "version": "7.0.1", 1564 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1565 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1566 | "dev": true, 1567 | "requires": { 1568 | "to-regex-range": "^5.0.1" 1569 | } 1570 | }, 1571 | "find-up": { 1572 | "version": "5.0.0", 1573 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1574 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1575 | "dev": true, 1576 | "requires": { 1577 | "locate-path": "^6.0.0", 1578 | "path-exists": "^4.0.0" 1579 | } 1580 | }, 1581 | "flat": { 1582 | "version": "5.0.2", 1583 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 1584 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 1585 | "dev": true 1586 | }, 1587 | "fs.realpath": { 1588 | "version": "1.0.0", 1589 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1590 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1591 | "dev": true 1592 | }, 1593 | "fsevents": { 1594 | "version": "2.3.2", 1595 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1596 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1597 | "dev": true, 1598 | "optional": true 1599 | }, 1600 | "get-caller-file": { 1601 | "version": "2.0.5", 1602 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1603 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1604 | "dev": true 1605 | }, 1606 | "glob": { 1607 | "version": "7.2.0", 1608 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 1609 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 1610 | "dev": true, 1611 | "requires": { 1612 | "fs.realpath": "^1.0.0", 1613 | "inflight": "^1.0.4", 1614 | "inherits": "2", 1615 | "minimatch": "^3.0.4", 1616 | "once": "^1.3.0", 1617 | "path-is-absolute": "^1.0.0" 1618 | }, 1619 | "dependencies": { 1620 | "brace-expansion": { 1621 | "version": "1.1.11", 1622 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1623 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1624 | "dev": true, 1625 | "requires": { 1626 | "balanced-match": "^1.0.0", 1627 | "concat-map": "0.0.1" 1628 | } 1629 | }, 1630 | "minimatch": { 1631 | "version": "3.1.2", 1632 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1633 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1634 | "dev": true, 1635 | "requires": { 1636 | "brace-expansion": "^1.1.7" 1637 | } 1638 | } 1639 | } 1640 | }, 1641 | "glob-parent": { 1642 | "version": "5.1.2", 1643 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1644 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1645 | "dev": true, 1646 | "requires": { 1647 | "is-glob": "^4.0.1" 1648 | } 1649 | }, 1650 | "growl": { 1651 | "version": "1.10.5", 1652 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 1653 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 1654 | "dev": true 1655 | }, 1656 | "has-flag": { 1657 | "version": "4.0.0", 1658 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1659 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1660 | "dev": true 1661 | }, 1662 | "he": { 1663 | "version": "1.2.0", 1664 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1665 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1666 | "dev": true 1667 | }, 1668 | "http-proxy-agent": { 1669 | "version": "4.0.1", 1670 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 1671 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 1672 | "dev": true, 1673 | "requires": { 1674 | "@tootallnate/once": "1", 1675 | "agent-base": "6", 1676 | "debug": "4" 1677 | } 1678 | }, 1679 | "https-proxy-agent": { 1680 | "version": "5.0.1", 1681 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 1682 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 1683 | "dev": true, 1684 | "requires": { 1685 | "agent-base": "6", 1686 | "debug": "4" 1687 | } 1688 | }, 1689 | "inflight": { 1690 | "version": "1.0.6", 1691 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1692 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1693 | "dev": true, 1694 | "requires": { 1695 | "once": "^1.3.0", 1696 | "wrappy": "1" 1697 | } 1698 | }, 1699 | "inherits": { 1700 | "version": "2.0.4", 1701 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1702 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1703 | "dev": true 1704 | }, 1705 | "is-binary-path": { 1706 | "version": "2.1.0", 1707 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1708 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1709 | "dev": true, 1710 | "requires": { 1711 | "binary-extensions": "^2.0.0" 1712 | } 1713 | }, 1714 | "is-extglob": { 1715 | "version": "2.1.1", 1716 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1717 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1718 | "dev": true 1719 | }, 1720 | "is-fullwidth-code-point": { 1721 | "version": "3.0.0", 1722 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1723 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1724 | "dev": true 1725 | }, 1726 | "is-glob": { 1727 | "version": "4.0.3", 1728 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1729 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1730 | "dev": true, 1731 | "requires": { 1732 | "is-extglob": "^2.1.1" 1733 | } 1734 | }, 1735 | "is-number": { 1736 | "version": "7.0.0", 1737 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1738 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1739 | "dev": true 1740 | }, 1741 | "is-plain-obj": { 1742 | "version": "2.1.0", 1743 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1744 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1745 | "dev": true 1746 | }, 1747 | "is-unicode-supported": { 1748 | "version": "0.1.0", 1749 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1750 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1751 | "dev": true 1752 | }, 1753 | "js-yaml": { 1754 | "version": "4.1.0", 1755 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1756 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1757 | "dev": true, 1758 | "requires": { 1759 | "argparse": "^2.0.1" 1760 | } 1761 | }, 1762 | "locate-path": { 1763 | "version": "6.0.0", 1764 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1765 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1766 | "dev": true, 1767 | "requires": { 1768 | "p-locate": "^5.0.0" 1769 | } 1770 | }, 1771 | "log-symbols": { 1772 | "version": "4.1.0", 1773 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1774 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1775 | "dev": true, 1776 | "requires": { 1777 | "chalk": "^4.1.0", 1778 | "is-unicode-supported": "^0.1.0" 1779 | } 1780 | }, 1781 | "minimatch": { 1782 | "version": "5.0.1", 1783 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", 1784 | "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", 1785 | "dev": true, 1786 | "requires": { 1787 | "brace-expansion": "^2.0.1" 1788 | } 1789 | }, 1790 | "minimist": { 1791 | "version": "0.0.8", 1792 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1793 | "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", 1794 | "dev": true 1795 | }, 1796 | "mkdirp": { 1797 | "version": "0.5.1", 1798 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1799 | "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", 1800 | "dev": true, 1801 | "requires": { 1802 | "minimist": "0.0.8" 1803 | } 1804 | }, 1805 | "mocha": { 1806 | "version": "10.2.0", 1807 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", 1808 | "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", 1809 | "dev": true, 1810 | "requires": { 1811 | "ansi-colors": "4.1.1", 1812 | "browser-stdout": "1.3.1", 1813 | "chokidar": "3.5.3", 1814 | "debug": "4.3.4", 1815 | "diff": "5.0.0", 1816 | "escape-string-regexp": "4.0.0", 1817 | "find-up": "5.0.0", 1818 | "glob": "7.2.0", 1819 | "he": "1.2.0", 1820 | "js-yaml": "4.1.0", 1821 | "log-symbols": "4.1.0", 1822 | "minimatch": "5.0.1", 1823 | "ms": "2.1.3", 1824 | "nanoid": "3.3.3", 1825 | "serialize-javascript": "6.0.0", 1826 | "strip-json-comments": "3.1.1", 1827 | "supports-color": "8.1.1", 1828 | "workerpool": "6.2.1", 1829 | "yargs": "16.2.0", 1830 | "yargs-parser": "20.2.4", 1831 | "yargs-unparser": "2.0.0" 1832 | } 1833 | }, 1834 | "ms": { 1835 | "version": "2.1.3", 1836 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1837 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1838 | "dev": true 1839 | }, 1840 | "nanoid": { 1841 | "version": "3.3.3", 1842 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", 1843 | "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", 1844 | "dev": true 1845 | }, 1846 | "normalize-path": { 1847 | "version": "3.0.0", 1848 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1849 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1850 | "dev": true 1851 | }, 1852 | "once": { 1853 | "version": "1.4.0", 1854 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1855 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1856 | "dev": true, 1857 | "requires": { 1858 | "wrappy": "1" 1859 | } 1860 | }, 1861 | "p-limit": { 1862 | "version": "3.1.0", 1863 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1864 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1865 | "dev": true, 1866 | "requires": { 1867 | "yocto-queue": "^0.1.0" 1868 | } 1869 | }, 1870 | "p-locate": { 1871 | "version": "5.0.0", 1872 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1873 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1874 | "dev": true, 1875 | "requires": { 1876 | "p-limit": "^3.0.2" 1877 | } 1878 | }, 1879 | "path-exists": { 1880 | "version": "4.0.0", 1881 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1882 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1883 | "dev": true 1884 | }, 1885 | "path-is-absolute": { 1886 | "version": "1.0.1", 1887 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1888 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1889 | "dev": true 1890 | }, 1891 | "picomatch": { 1892 | "version": "2.3.1", 1893 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1894 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1895 | "dev": true 1896 | }, 1897 | "randombytes": { 1898 | "version": "2.1.0", 1899 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1900 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1901 | "dev": true, 1902 | "requires": { 1903 | "safe-buffer": "^5.1.0" 1904 | } 1905 | }, 1906 | "readdirp": { 1907 | "version": "3.6.0", 1908 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1909 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1910 | "dev": true, 1911 | "requires": { 1912 | "picomatch": "^2.2.1" 1913 | } 1914 | }, 1915 | "require-directory": { 1916 | "version": "2.1.1", 1917 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1918 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1919 | "dev": true 1920 | }, 1921 | "rxjs": { 1922 | "version": "7.8.0", 1923 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", 1924 | "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", 1925 | "requires": { 1926 | "tslib": "^2.1.0" 1927 | } 1928 | }, 1929 | "safe-buffer": { 1930 | "version": "5.2.1", 1931 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1932 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1933 | "dev": true 1934 | }, 1935 | "semver": { 1936 | "version": "5.7.1", 1937 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1938 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1939 | "dev": true 1940 | }, 1941 | "serialize-javascript": { 1942 | "version": "6.0.0", 1943 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 1944 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 1945 | "dev": true, 1946 | "requires": { 1947 | "randombytes": "^2.1.0" 1948 | } 1949 | }, 1950 | "source-map": { 1951 | "version": "0.6.1", 1952 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1953 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1954 | "dev": true 1955 | }, 1956 | "source-map-support": { 1957 | "version": "0.5.21", 1958 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 1959 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 1960 | "dev": true, 1961 | "requires": { 1962 | "buffer-from": "^1.0.0", 1963 | "source-map": "^0.6.0" 1964 | } 1965 | }, 1966 | "string-width": { 1967 | "version": "4.2.3", 1968 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1969 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1970 | "dev": true, 1971 | "requires": { 1972 | "emoji-regex": "^8.0.0", 1973 | "is-fullwidth-code-point": "^3.0.0", 1974 | "strip-ansi": "^6.0.1" 1975 | } 1976 | }, 1977 | "strip-ansi": { 1978 | "version": "6.0.1", 1979 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1980 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1981 | "dev": true, 1982 | "requires": { 1983 | "ansi-regex": "^5.0.1" 1984 | } 1985 | }, 1986 | "strip-json-comments": { 1987 | "version": "3.1.1", 1988 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1989 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1990 | "dev": true 1991 | }, 1992 | "supports-color": { 1993 | "version": "8.1.1", 1994 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1995 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1996 | "dev": true, 1997 | "requires": { 1998 | "has-flag": "^4.0.0" 1999 | } 2000 | }, 2001 | "to-regex-range": { 2002 | "version": "5.0.1", 2003 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2004 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2005 | "dev": true, 2006 | "requires": { 2007 | "is-number": "^7.0.0" 2008 | } 2009 | }, 2010 | "tslib": { 2011 | "version": "2.5.0", 2012 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", 2013 | "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" 2014 | }, 2015 | "typescript": { 2016 | "version": "5.0.4", 2017 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", 2018 | "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", 2019 | "dev": true 2020 | }, 2021 | "vscode": { 2022 | "version": "1.1.37", 2023 | "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.37.tgz", 2024 | "integrity": "sha512-vJNj6IlN7IJPdMavlQa1KoFB3Ihn06q1AiN3ZFI/HfzPNzbKZWPPuiU+XkpNOfGU5k15m4r80nxNPlM7wcc0wg==", 2025 | "dev": true, 2026 | "requires": { 2027 | "glob": "^7.1.2", 2028 | "http-proxy-agent": "^4.0.1", 2029 | "https-proxy-agent": "^5.0.0", 2030 | "mocha": "^5.2.0", 2031 | "semver": "^5.4.1", 2032 | "source-map-support": "^0.5.0", 2033 | "vscode-test": "^0.4.1" 2034 | }, 2035 | "dependencies": { 2036 | "brace-expansion": { 2037 | "version": "1.1.11", 2038 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2039 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2040 | "dev": true, 2041 | "requires": { 2042 | "balanced-match": "^1.0.0", 2043 | "concat-map": "0.0.1" 2044 | } 2045 | }, 2046 | "debug": { 2047 | "version": "3.1.0", 2048 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 2049 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 2050 | "dev": true, 2051 | "requires": { 2052 | "ms": "2.0.0" 2053 | } 2054 | }, 2055 | "diff": { 2056 | "version": "3.5.0", 2057 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 2058 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 2059 | "dev": true 2060 | }, 2061 | "escape-string-regexp": { 2062 | "version": "1.0.5", 2063 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2064 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 2065 | "dev": true 2066 | }, 2067 | "glob": { 2068 | "version": "7.1.2", 2069 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 2070 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 2071 | "dev": true, 2072 | "requires": { 2073 | "fs.realpath": "^1.0.0", 2074 | "inflight": "^1.0.4", 2075 | "inherits": "2", 2076 | "minimatch": "^3.0.4", 2077 | "once": "^1.3.0", 2078 | "path-is-absolute": "^1.0.0" 2079 | } 2080 | }, 2081 | "has-flag": { 2082 | "version": "3.0.0", 2083 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2084 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 2085 | "dev": true 2086 | }, 2087 | "he": { 2088 | "version": "1.1.1", 2089 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 2090 | "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", 2091 | "dev": true 2092 | }, 2093 | "minimatch": { 2094 | "version": "3.0.4", 2095 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2096 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2097 | "dev": true, 2098 | "requires": { 2099 | "brace-expansion": "^1.1.7" 2100 | } 2101 | }, 2102 | "mocha": { 2103 | "version": "5.2.0", 2104 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 2105 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 2106 | "dev": true, 2107 | "requires": { 2108 | "browser-stdout": "1.3.1", 2109 | "commander": "2.15.1", 2110 | "debug": "3.1.0", 2111 | "diff": "3.5.0", 2112 | "escape-string-regexp": "1.0.5", 2113 | "glob": "7.1.2", 2114 | "growl": "1.10.5", 2115 | "he": "1.1.1", 2116 | "minimatch": "3.0.4", 2117 | "mkdirp": "0.5.1", 2118 | "supports-color": "5.4.0" 2119 | } 2120 | }, 2121 | "ms": { 2122 | "version": "2.0.0", 2123 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2124 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 2125 | "dev": true 2126 | }, 2127 | "supports-color": { 2128 | "version": "5.4.0", 2129 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 2130 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 2131 | "dev": true, 2132 | "requires": { 2133 | "has-flag": "^3.0.0" 2134 | } 2135 | } 2136 | } 2137 | }, 2138 | "vscode-test": { 2139 | "version": "0.4.3", 2140 | "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", 2141 | "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", 2142 | "dev": true, 2143 | "requires": { 2144 | "http-proxy-agent": "^2.1.0", 2145 | "https-proxy-agent": "^2.2.1" 2146 | }, 2147 | "dependencies": { 2148 | "agent-base": { 2149 | "version": "4.3.0", 2150 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 2151 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 2152 | "dev": true, 2153 | "requires": { 2154 | "es6-promisify": "^5.0.0" 2155 | } 2156 | }, 2157 | "debug": { 2158 | "version": "3.1.0", 2159 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 2160 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 2161 | "dev": true, 2162 | "requires": { 2163 | "ms": "2.0.0" 2164 | } 2165 | }, 2166 | "http-proxy-agent": { 2167 | "version": "2.1.0", 2168 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 2169 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 2170 | "dev": true, 2171 | "requires": { 2172 | "agent-base": "4", 2173 | "debug": "3.1.0" 2174 | } 2175 | }, 2176 | "https-proxy-agent": { 2177 | "version": "2.2.4", 2178 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 2179 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 2180 | "dev": true, 2181 | "requires": { 2182 | "agent-base": "^4.3.0", 2183 | "debug": "^3.1.0" 2184 | } 2185 | }, 2186 | "ms": { 2187 | "version": "2.0.0", 2188 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2189 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 2190 | "dev": true 2191 | } 2192 | } 2193 | }, 2194 | "workerpool": { 2195 | "version": "6.2.1", 2196 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", 2197 | "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", 2198 | "dev": true 2199 | }, 2200 | "wrap-ansi": { 2201 | "version": "7.0.0", 2202 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2203 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2204 | "dev": true, 2205 | "requires": { 2206 | "ansi-styles": "^4.0.0", 2207 | "string-width": "^4.1.0", 2208 | "strip-ansi": "^6.0.0" 2209 | } 2210 | }, 2211 | "wrappy": { 2212 | "version": "1.0.2", 2213 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2214 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2215 | "dev": true 2216 | }, 2217 | "y18n": { 2218 | "version": "5.0.8", 2219 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2220 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2221 | "dev": true 2222 | }, 2223 | "yargs": { 2224 | "version": "16.2.0", 2225 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 2226 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 2227 | "dev": true, 2228 | "requires": { 2229 | "cliui": "^7.0.2", 2230 | "escalade": "^3.1.1", 2231 | "get-caller-file": "^2.0.5", 2232 | "require-directory": "^2.1.1", 2233 | "string-width": "^4.2.0", 2234 | "y18n": "^5.0.5", 2235 | "yargs-parser": "^20.2.2" 2236 | } 2237 | }, 2238 | "yargs-parser": { 2239 | "version": "20.2.4", 2240 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 2241 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 2242 | "dev": true 2243 | }, 2244 | "yargs-unparser": { 2245 | "version": "2.0.0", 2246 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 2247 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 2248 | "dev": true, 2249 | "requires": { 2250 | "camelcase": "^6.0.0", 2251 | "decamelize": "^4.0.0", 2252 | "flat": "^5.0.2", 2253 | "is-plain-obj": "^2.1.0" 2254 | } 2255 | }, 2256 | "yocto-queue": { 2257 | "version": "0.1.0", 2258 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2259 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2260 | "dev": true 2261 | } 2262 | } 2263 | } 2264 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel-artisan", 3 | "displayName": "Laravel Artisan", 4 | "description": "Run Laravel Artisan commands within Visual Studio Code", 5 | "icon": "images/icon.png", 6 | "version": "0.0.31", 7 | "publisher": "ryannaddy", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/TheColorRed/vscode-laravel-artisan" 11 | }, 12 | "bugs": { 13 | "url": "https://github.com/TheColorRed/vscode-laravel-artisan/issues" 14 | }, 15 | "engines": { 16 | "vscode": "^1.23.0" 17 | }, 18 | "categories": [ 19 | "Other" 20 | ], 21 | "keywords": [ 22 | "Laravel", 23 | "Artisan", 24 | "Docker", 25 | "php", 26 | "wsl" 27 | ], 28 | "main": "./out/src/extension", 29 | "activationEvents": [ 30 | "workspaceContains:**/artisan" 31 | ], 32 | "contributes": { 33 | "menus": { 34 | "artisan.make.app": [ 35 | { 36 | "command": "artisan.make.auth" 37 | }, 38 | { 39 | "command": "artisan.make.command" 40 | }, 41 | { 42 | "command": "artisan.make.cast" 43 | }, 44 | { 45 | "command": "artisan.make.component" 46 | }, 47 | { 48 | "command": "artisan.make.controller" 49 | }, 50 | { 51 | "command": "artisan.make.event" 52 | }, 53 | { 54 | "command": "artisan.make.job" 55 | }, 56 | { 57 | "command": "artisan.make.listener" 58 | }, 59 | { 60 | "command": "artisan.make.mail" 61 | }, 62 | { 63 | "command": "artisan.make.middleware" 64 | }, 65 | { 66 | "command": "artisan.make.migration" 67 | }, 68 | { 69 | "command": "artisan.make.model" 70 | }, 71 | { 72 | "command": "artisan.make.notification" 73 | }, 74 | { 75 | "command": "artisan.make.observer" 76 | }, 77 | { 78 | "command": "artisan.make.policy" 79 | }, 80 | { 81 | "command": "artisan.make.provider" 82 | }, 83 | { 84 | "command": "artisan.make.request" 85 | }, 86 | { 87 | "command": "artisan.make.rule" 88 | }, 89 | { 90 | "command": "artisan.make.channel" 91 | } 92 | ], 93 | "artisan.server.app": [ 94 | { 95 | "command": "artisan.startServerUseDefaults" 96 | }, 97 | { 98 | "command": "artisan.startServer" 99 | }, 100 | { 101 | "command": "artisan.stopServer" 102 | }, 103 | { 104 | "command": "artisan.restartServer" 105 | } 106 | ], 107 | "artisan.make.database": [ 108 | { 109 | "command": "artisan.make.factory" 110 | }, 111 | { 112 | "command": "artisan.make.resource" 113 | }, 114 | { 115 | "command": "artisan.make.seeder" 116 | } 117 | ], 118 | "artisan.migrate.database": [ 119 | { 120 | "command": "artisan.migrate" 121 | }, 122 | { 123 | "command": "artisan.migrate.fresh" 124 | }, 125 | { 126 | "command": "artisan.migrate.install" 127 | }, 128 | { 129 | "command": "artisan.migrate.refresh" 130 | }, 131 | { 132 | "command": "artisan.migrate.reset" 133 | }, 134 | { 135 | "command": "artisan.migrate.rollback" 136 | }, 137 | { 138 | "command": "artisan.migrate.status" 139 | } 140 | ], 141 | "artisan.routes": [ 142 | { 143 | "command": "artisan.route.cache" 144 | }, 145 | { 146 | "command": "artisan.route.clear" 147 | }, 148 | { 149 | "command": "artisan.route.list" 150 | } 151 | ], 152 | "artisan.misc": [ 153 | { 154 | "command": "artisan.config.cache" 155 | }, 156 | { 157 | "command": "artisan.config.clear" 158 | }, 159 | { 160 | "command": "artisan.optimize" 161 | }, 162 | { 163 | "command": "artisan.clearCompiled" 164 | }, 165 | { 166 | "command": "artisan.cache.clear" 167 | }, 168 | { 169 | "command": "artisan.cache.table" 170 | } 171 | ], 172 | "explorer/context": [ 173 | { 174 | "when": "resource =~ /.+?\\/app/iu", 175 | "submenu": "artisan.make.app", 176 | "group": "0_artisan" 177 | }, 178 | { 179 | "when": "resource =~ /.+?/iu", 180 | "submenu": "artisan.misc", 181 | "group": "0_artisan" 182 | }, 183 | { 184 | "when": "resource =~ /.+?\\/app/iu", 185 | "submenu": "artisan.server.app", 186 | "group": "0_artisan" 187 | }, 188 | { 189 | "when": "resource =~ /.+?\\/database/iu", 190 | "submenu": "artisan.make.database", 191 | "group": "0_artisan" 192 | }, 193 | { 194 | "when": "resource =~ /.+?\\/database/iu", 195 | "submenu": "artisan.migrate.database", 196 | "group": "0_artisan" 197 | }, 198 | { 199 | "when": "resource =~ /.+?\\/tests/iu", 200 | "command": "artisan.make.test", 201 | "group": "0_artisan" 202 | }, 203 | { 204 | "when": "resource =~ /.+?\\/resource/iu", 205 | "command": "artisan.make.resource", 206 | "group": "0_artisan" 207 | }, 208 | { 209 | "when": "resource =~ /.+?\\/routes/iu", 210 | "submenu": "artisan.routes", 211 | "group": "0_artisan" 212 | } 213 | ] 214 | }, 215 | "submenus": [ 216 | { 217 | "id": "artisan.make.app", 218 | "label": "Artisan Make" 219 | }, 220 | { 221 | "id": "artisan.misc", 222 | "label": "Artisan Misc" 223 | }, 224 | { 225 | "id": "artisan.server.app", 226 | "label": "Artisan Server" 227 | }, 228 | { 229 | "id": "artisan.make.database", 230 | "label": "Artisan Make" 231 | }, 232 | { 233 | "id": "artisan.migrate.database", 234 | "label": "Artisan Migrate" 235 | }, 236 | { 237 | "id": "artisan.routes", 238 | "label": "Artisan Routes" 239 | } 240 | ], 241 | "configuration": { 242 | "title": "Laravel Artisan", 243 | "properties": { 244 | "artisan.location": { 245 | "type": [ 246 | "string", 247 | "array" 248 | ], 249 | "default": [], 250 | "description": "Additional Artisan locations" 251 | }, 252 | "artisan.wsl.enabled": { 253 | "type": "boolean", 254 | "default": false, 255 | "description": "Whether or not to use WSL" 256 | }, 257 | "artisan.maxBuffer": { 258 | "type": "number", 259 | "default": 204800, 260 | "description": "Largest amount of data in bytes allowed on stdout or stderr" 261 | }, 262 | "artisan.php.location": { 263 | "type": "string", 264 | "default": "php", 265 | "description": "Sets a custom location to the php executable" 266 | }, 267 | "artisan.serve.defaultHost": { 268 | "type": "string", 269 | "default": "localhost", 270 | "description": "Sets the default server address for artisan serve" 271 | }, 272 | "artisan.serve.defaultPort": { 273 | "type": "string", 274 | "default": "8000", 275 | "description": "Sets the default port address for artisan serve" 276 | }, 277 | "artisan.docker.enabled": { 278 | "type": "boolean", 279 | "default": false, 280 | "description": "Should commands get executed using docker?" 281 | }, 282 | "artisan.docker.command": { 283 | "type": "string", 284 | "default": null, 285 | "description": "Docker command to get container running" 286 | } 287 | } 288 | }, 289 | "keybindings": [ 290 | { 291 | "command": "artisan.make.command", 292 | "key": "ctrl+numpad1 ctrl+numpad1" 293 | }, 294 | { 295 | "command": "artisan.make.controller", 296 | "key": "ctrl+numpad1 ctrl+numpad2" 297 | }, 298 | { 299 | "command": "artisan.make.event", 300 | "key": "ctrl+numpad1 ctrl+numpad3" 301 | }, 302 | { 303 | "command": "artisan.make.job", 304 | "key": "ctrl+numpad1 ctrl+numpad4" 305 | }, 306 | { 307 | "command": "artisan.make.listener", 308 | "key": "ctrl+numpad1 ctrl+numpad5" 309 | }, 310 | { 311 | "command": "artisan.make.mail", 312 | "key": "ctrl+numpad1 ctrl+numpad6" 313 | }, 314 | { 315 | "command": "artisan.make.middleware", 316 | "key": "ctrl+numpad1 ctrl+numpad7" 317 | }, 318 | { 319 | "command": "artisan.make.migration", 320 | "key": "ctrl+numpad1 ctrl+numpad8" 321 | }, 322 | { 323 | "command": "artisan.make.model", 324 | "key": "ctrl+numpad1 ctrl+numpad9" 325 | }, 326 | { 327 | "command": "artisan.make.notification", 328 | "key": "ctrl+numpad1 ctrl+numpad0" 329 | }, 330 | { 331 | "command": "artisan.make.policy", 332 | "key": "ctrl+numpad1 ctrl+numpad_divide" 333 | }, 334 | { 335 | "command": "artisan.make.provider", 336 | "key": "ctrl+numpad1 ctrl+numpad_multiply" 337 | }, 338 | { 339 | "command": "artisan.make.request", 340 | "key": "ctrl+numpad1 ctrl+numpad_subtract" 341 | }, 342 | { 343 | "command": "artisan.make.seeder", 344 | "key": "ctrl+numpad1 ctrl+numpad_add" 345 | }, 346 | { 347 | "command": "artisan.migrate", 348 | "key": "ctrl+numpad2 ctrl+numpad1" 349 | }, 350 | { 351 | "command": "artisan.migrate.install", 352 | "key": "ctrl+numpad2 ctrl+numpad2" 353 | }, 354 | { 355 | "command": "artisan.migrate.refresh", 356 | "key": "ctrl+numpad2 ctrl+numpad3" 357 | }, 358 | { 359 | "command": "artisan.migrate.reset", 360 | "key": "ctrl+numpad2 ctrl+numpad4" 361 | }, 362 | { 363 | "command": "artisan.migrate.rollback", 364 | "key": "ctrl+numpad2 ctrl+numpad5" 365 | }, 366 | { 367 | "command": "artisan.migrate.status", 368 | "key": "ctrl+numpad2 ctrl+numpad6" 369 | }, 370 | { 371 | "command": "artisan.migrate.fresh", 372 | "key": "ctrl+numpad2 ctrl+numpad7" 373 | }, 374 | { 375 | "command": "artisan.cache.clear", 376 | "key": "ctrl+numpad3 ctrl+numpad1" 377 | }, 378 | { 379 | "command": "artisan.cache.table", 380 | "key": "ctrl+numpad3 ctrl+numpad2" 381 | }, 382 | { 383 | "command": "artisan.route.cache", 384 | "key": "ctrl+numpad4 ctrl+numpad1" 385 | }, 386 | { 387 | "command": "artisan.route.clear", 388 | "key": "ctrl+numpad4 ctrl+numpad2" 389 | }, 390 | { 391 | "command": "artisan.route.refresh", 392 | "key": "ctrl+numpad4 ctrl+numpad3" 393 | }, 394 | { 395 | "command": "artisan.config.cache", 396 | "key": "ctrl+numpad5 ctrl+numpad1" 397 | }, 398 | { 399 | "command": "artisan.config.clear", 400 | "key": "ctrl+numpad5 ctrl+numpad2" 401 | }, 402 | { 403 | "command": "artisan.config.refresh", 404 | "key": "ctrl+numpad5 ctrl+numpad3" 405 | } 406 | ], 407 | "commands": [ 408 | { 409 | "command": "artisan.run.command", 410 | "title": "Artisan: Run Command", 411 | "shortTitle": "Run Command" 412 | }, 413 | { 414 | "command": "artisan.make.channel", 415 | "title": "Artisan: Make Channel", 416 | "shortTitle": "Make Channel" 417 | }, 418 | { 419 | "command": "artisan.make.auth", 420 | "title": "Artisan: Make Auth", 421 | "shortTitle": "Make Auth" 422 | }, 423 | { 424 | "command": "artisan.make.command", 425 | "title": "Artisan: Make Command", 426 | "shortTitle": "Make Command" 427 | }, 428 | { 429 | "command": "artisan.make.cast", 430 | "title": "Artisan: Make Cast", 431 | "shortTitle": "Make Cast" 432 | }, 433 | { 434 | "command": "artisan.make.rule", 435 | "title": "Artisan: Make Rule", 436 | "shortTitle": "Make Rule" 437 | }, 438 | { 439 | "command": "artisan.make.component", 440 | "title": "Artisan: Make Component", 441 | "shortTitle": "Make Component" 442 | }, 443 | { 444 | "command": "artisan.make.controller", 445 | "title": "Artisan: Make Controller", 446 | "shortTitle": "Make Controller" 447 | }, 448 | { 449 | "command": "artisan.make.event", 450 | "title": "Artisan: Make Event", 451 | "shortTitle": "Make Event" 452 | }, 453 | { 454 | "command": "artisan.make.factory", 455 | "title": "Artisan: Make Factory", 456 | "shortTitle": "Make Factory" 457 | }, 458 | { 459 | "command": "artisan.make.job", 460 | "title": "Artisan: Make Job", 461 | "shortTitle": "Make Job" 462 | }, 463 | { 464 | "command": "artisan.make.listener", 465 | "title": "Artisan: Make Listener", 466 | "shortTitle": "Make Listener" 467 | }, 468 | { 469 | "command": "artisan.make.mail", 470 | "title": "Artisan: Make Mail", 471 | "shortTitle": "Make Mail" 472 | }, 473 | { 474 | "command": "artisan.make.middleware", 475 | "title": "Artisan: Make Middleware", 476 | "shortTitle": "Make Middleware" 477 | }, 478 | { 479 | "command": "artisan.make.migration", 480 | "title": "Artisan: Make Migration", 481 | "shortTitle": "Make Migration" 482 | }, 483 | { 484 | "command": "artisan.make.model", 485 | "title": "Artisan: Make Model", 486 | "shortTitle": "Make Model" 487 | }, 488 | { 489 | "command": "artisan.make.notification", 490 | "title": "Artisan: Make Notification", 491 | "shortTitle": "Make Notification" 492 | }, 493 | { 494 | "command": "artisan.make.observer", 495 | "title": "Artisan: Make Observer", 496 | "shortTitle": "Make Observer" 497 | }, 498 | { 499 | "command": "artisan.make.policy", 500 | "title": "Artisan: Make Policy", 501 | "shortTitle": "Make Policy" 502 | }, 503 | { 504 | "command": "artisan.make.provider", 505 | "title": "Artisan: Make Provider", 506 | "shortTitle": "Make Provider" 507 | }, 508 | { 509 | "command": "artisan.make.request", 510 | "title": "Artisan: Make Request", 511 | "shortTitle": "Make Request" 512 | }, 513 | { 514 | "command": "artisan.make.resource", 515 | "title": "Artisan: Make Resource", 516 | "shortTitle": "Make Resource" 517 | }, 518 | { 519 | "command": "artisan.make.seeder", 520 | "title": "Artisan: Make Seeder", 521 | "shortTitle": "Make Seeder" 522 | }, 523 | { 524 | "command": "artisan.make.test", 525 | "title": "Artisan: Make Test", 526 | "shortTitle": "Make Test" 527 | }, 528 | { 529 | "command": "artisan.migrate", 530 | "title": "Artisan: Migrate", 531 | "shortTitle": "Migrate" 532 | }, 533 | { 534 | "command": "artisan.migrate.install", 535 | "title": "Artisan: Migrate Install", 536 | "shortTitle": "Migrate Install" 537 | }, 538 | { 539 | "command": "artisan.migrate.fresh", 540 | "title": "Artisan: Migrate Fresh", 541 | "shortTitle": "Migrate Fresh" 542 | }, 543 | { 544 | "command": "artisan.migrate.refresh", 545 | "title": "Artisan: Migrate Refresh", 546 | "shortTitle": "Migrate Refresh" 547 | }, 548 | { 549 | "command": "artisan.migrate.reset", 550 | "title": "Artisan: Migrate Reset", 551 | "shortTitle": "Migrate Reset" 552 | }, 553 | { 554 | "command": "artisan.migrate.rollback", 555 | "title": "Artisan: Migrate Rollback", 556 | "shortTitle": "Migrate Rollback" 557 | }, 558 | { 559 | "command": "artisan.migrate.status", 560 | "title": "Artisan: Migrate Status", 561 | "shortTitle": "Migrate Status" 562 | }, 563 | { 564 | "command": "artisan.clearCompiled", 565 | "title": "Artisan: Clear Compiled", 566 | "shortTitle": "Clear Compiled" 567 | }, 568 | { 569 | "command": "artisan.optimize", 570 | "title": "Artisan: Optimize", 571 | "shortTitle": "Optimize" 572 | }, 573 | { 574 | "command": "artisan.startServer", 575 | "title": "Artisan: Start Server", 576 | "shortTitle": "Start Server" 577 | }, 578 | { 579 | "command": "artisan.startServerUseDefaults", 580 | "title": "Artisan: Start Server (Default Host and Port)", 581 | "shortTitle": "Start Server (Default Host and Port)" 582 | }, 583 | { 584 | "command": "artisan.stopServer", 585 | "title": "Artisan: Stop Server", 586 | "shortTitle": "Stop Server" 587 | }, 588 | { 589 | "command": "artisan.restartServer", 590 | "title": "Artisan: Restart Server", 591 | "shortTitle": "Restart Server" 592 | }, 593 | { 594 | "command": "artisan.list", 595 | "title": "Artisan: List Commands", 596 | "shortTitle": "List Commands" 597 | }, 598 | { 599 | "command": "artisan.cache.clear", 600 | "title": "Artisan: Cache Clear", 601 | "shortTitle": "Cache Clear" 602 | }, 603 | { 604 | "command": "artisan.cache.table", 605 | "title": "Artisan: Cache Table", 606 | "shortTitle": "Cache Table" 607 | }, 608 | { 609 | "command": "artisan.route.cache", 610 | "title": "Artisan: Route Cache", 611 | "shortTitle": "Route Cache" 612 | }, 613 | { 614 | "command": "artisan.route.clear", 615 | "title": "Artisan: Route Cache Clear", 616 | "shortTitle": "Route Cache Clear" 617 | }, 618 | { 619 | "command": "artisan.route.refresh", 620 | "title": "Artisan: Route Cache Refresh", 621 | "shortTitle": "Route Cache Refresh" 622 | }, 623 | { 624 | "command": "artisan.route.list", 625 | "title": "Artisan: Route List", 626 | "shortTitle": "Route List" 627 | }, 628 | { 629 | "command": "artisan.config.cache", 630 | "title": "Artisan: Config Cache", 631 | "shortTitle": "Config Cache" 632 | }, 633 | { 634 | "command": "artisan.config.clear", 635 | "title": "Artisan: Config Cache Clear", 636 | "shortTitle": "Config Cache Clear" 637 | }, 638 | { 639 | "command": "artisan.config.refresh", 640 | "title": "Artisan: Config Cache Refresh", 641 | "shortTitle": "Config Cache Refresh" 642 | }, 643 | { 644 | "command": "artisan.key.generate", 645 | "title": "Artisan: Key generation", 646 | "shortTitle": "Key generation" 647 | }, 648 | { 649 | "command": "artisan.view.clear", 650 | "title": "Artisan: Views Clear", 651 | "shortTitle": "Views Clear" 652 | }, 653 | { 654 | "command": "artisan.event.generate", 655 | "title": "Artisan: Generate Events", 656 | "shortTitle": "Generate Events" 657 | } 658 | ] 659 | }, 660 | "scripts": { 661 | "vscode:prepublish": "tsc -p ./", 662 | "compile": "tsc -watch -p ./", 663 | "postinstall": "node ./node_modules/vscode/bin/install", 664 | "test": "node ./node_modules/vscode/bin/test" 665 | }, 666 | "dependencies": { 667 | "rxjs": "7.8.0" 668 | }, 669 | "devDependencies": { 670 | "@types/mocha": "^2.2.44", 671 | "@types/node": "^9.6.49", 672 | "mocha": "^10.2.0", 673 | "typescript": "^5.0.4", 674 | "vscode": "^1.1.37" 675 | } 676 | } 677 | -------------------------------------------------------------------------------- /src/Common.ts: -------------------------------------------------------------------------------- 1 | import * as cp from 'child_process'; 2 | import { join } from 'path'; 3 | import { ProgressLocation, Selection, Uri, ViewColumn, commands, window, workspace } from 'vscode'; 4 | import Output from './utils/Output'; 5 | 6 | export interface Command { 7 | name: string; 8 | description: string; 9 | arguments: any[]; 10 | options: { 11 | name: string; 12 | shortcut: string; 13 | accept_value: boolean; 14 | is_value_required: boolean; 15 | is_multiple: boolean; 16 | description: string; 17 | default: any; 18 | }[]; 19 | } 20 | 21 | export interface CommandInfo { 22 | err?: Error; 23 | stdout?: string; 24 | stderr?: string; 25 | artisan: { 26 | dir: string; 27 | path: string; 28 | }; 29 | } 30 | 31 | export default interface Common { 32 | run(): void; 33 | dispose?(): void; 34 | } 35 | 36 | export default class Common { 37 | public static readonly artisanFileList: Uri[] = []; 38 | /** 39 | * Get a list of all artisan files in the workspace. 40 | */ 41 | protected static async listArtisanPaths() { 42 | let config = workspace.getConfiguration('artisan'); 43 | let additionalLocations = config.get('location'); 44 | additionalLocations = typeof additionalLocations === 'string' ? new Array(1).concat(additionalLocations) : additionalLocations; 45 | let list = this.artisanFileList.concat(additionalLocations.map(i => Uri.parse(i))); 46 | if (list.length === 1 && list[0].fsPath.length) return list[0].fsPath; 47 | else if (list.length === 0) return 'artisan'; 48 | let artisanToUse = await Common.getListInput( 49 | 'Which artisan should execute this command?', 50 | list 51 | // Get the fs path from the URI 52 | .map(i => i.fsPath) 53 | // Remove Non-String values 54 | .filter(String) 55 | // Remove Duplicates 56 | .filter((v, i, a) => a.indexOf(v) === i) 57 | ); 58 | return artisanToUse; 59 | } 60 | /** 61 | * Gets an artisan file from the workspace. 62 | * @param artisan The artisan path to use. If not specified then the user will be prompted to select one. 63 | */ 64 | protected static async getArtisanRoot(artisan?: string) { 65 | const artisanToUse = artisan ? artisan : await this.listArtisanPaths(); 66 | return artisanToUse.replace(/artisan$/, '').replace(/\\$/g, ''); 67 | } 68 | /** 69 | * Executes an artisan command. 70 | * @param command The command to execute. 71 | * @param callback The callback to execute when the command is finished. 72 | * @param artisan The artisan path to use. If not specified then the user will be prompted to select one. 73 | */ 74 | protected static async execCmd(command: string, callback: (info: CommandInfo) => void, artisan?: string) { 75 | const artisanToUse = artisan ? artisan : await this.listArtisanPaths(); 76 | const artisanRoot = await this.getArtisanRoot(artisan); 77 | 78 | // Try an get a custom php location 79 | const config = workspace.getConfiguration('artisan'); 80 | const phpLocation = config.get('php.location', 'php'); 81 | const dockerEnabled = config.get('docker.enabled', false); 82 | const dockerCommand = config.get('docker.command', null); 83 | const maxBuffer = config.get('maxBuffer', 1024 * 200); 84 | const wsl = config.get('wsl.enabled', false); 85 | 86 | let cmd = ''; 87 | if (dockerEnabled) { 88 | command = `php artisan ${command}`; 89 | cmd = `${dockerCommand} ${command}`; 90 | } else { 91 | if (phpLocation === 'php') { 92 | command = `php artisan ${command}`; 93 | } else { 94 | // Location is in quotes so that it can support spaces in the path 95 | command = `"${phpLocation}" artisan ${command}`; 96 | } 97 | cmd = command; 98 | } 99 | 100 | Output.command(command.trim()); 101 | window.withProgress( 102 | { 103 | location: ProgressLocation.Window, 104 | cancellable: false, 105 | title: 'Executing Artisan Command', 106 | }, 107 | async progress => { 108 | progress.report({ increment: 0 }); 109 | const result = wsl 110 | ? await this.wslCommand(artisanRoot, artisanToUse, cmd) 111 | : await this.nonWslCommand(artisanRoot, artisanToUse, cmd, maxBuffer); 112 | callback(result); 113 | progress.report({ increment: 100 }); 114 | } 115 | ); 116 | } 117 | /** 118 | * Executes an artisan command when not using WSL. 119 | * @param callback The callback to execute when the command is finished. 120 | * @param artisanRoot The root directory of the artisan file. 121 | * @param artisanToUse The artisan file to use. 122 | * @param cmd The command to execute. 123 | * @param maxBuffer The max buffer size to use. 124 | */ 125 | protected static async nonWslCommand(artisanRoot: string, artisanToUse: string, cmd: string, maxBuffer: number) { 126 | return new Promise(resolve => { 127 | cp.exec(cmd, { cwd: artisanRoot, maxBuffer: maxBuffer }, (err, stdout, stderr) => { 128 | Output.command(stdout.trim()); 129 | if (err) { 130 | Output.command('-----------------------------------'); 131 | Output.error(err.message.trim()); 132 | Output.showConsole(); 133 | } 134 | resolve({ 135 | err, 136 | stdout, 137 | stderr, 138 | artisan: { 139 | dir: artisanRoot, 140 | path: artisanToUse, 141 | }, 142 | }); 143 | }); 144 | }); 145 | } 146 | /** 147 | * Executes an artisan command when using WSL. 148 | * @param callback The callback to execute when the command is finished. 149 | * @param artisanRoot The root directory of the artisan file. 150 | * @param artisanToUse The artisan file to use. 151 | * @param cmd The command to execute. 152 | */ 153 | protected static async wslCommand(artisanRoot: string, artisanToUse: string, cmd: string) { 154 | return new Promise((resolve, reject) => { 155 | const child = cp.spawn('wsl', [cmd], { cwd: artisanRoot, shell: true }); 156 | const childData: string[] = []; 157 | child.stdout.on('data', data => childData.push(data.toString())); 158 | child.stdout.on('end', () => { 159 | resolve({ 160 | err: undefined, 161 | stdout: childData.join(''), 162 | stderr: undefined, 163 | artisan: { 164 | dir: artisanRoot, 165 | path: artisanToUse, 166 | }, 167 | }); 168 | }); 169 | child.stderr.on('error', err => { 170 | Output.command('-----------------------------------'); 171 | Output.error(err.message.trim()); 172 | Output.showConsole(); 173 | reject({ 174 | err, 175 | stdout: undefined, 176 | stderr: undefined, 177 | artisan: { 178 | dir: artisanRoot, 179 | path: artisanToUse, 180 | }, 181 | }); 182 | }); 183 | }); 184 | } 185 | /** 186 | * Opens a file in the editor. 187 | * @param root The root directory. 188 | * @param filename The filename to open. 189 | */ 190 | protected static async openFile(root: string, filename: string) { 191 | try { 192 | // let doc = await workspace.openTextDocument(this.artisanRoot + '/' + filename) 193 | let doc = await workspace.openTextDocument(join(root, filename)); 194 | window.showTextDocument(doc); 195 | this.refreshFilesExplorer(); 196 | } catch (e) { 197 | console.log(e.message); 198 | } 199 | } 200 | /** 201 | * Parses a cli table generated by artisan. 202 | * @param cliTable The cli table to parse. 203 | */ 204 | protected static parseCliTable(cliTable: string) { 205 | let cliRows = cliTable.split(/\r\n|\n/g); 206 | let headers: string[] = []; 207 | let rows: string[][] = []; 208 | // Parse the cli table 209 | for (let i = 0, len = cliRows.length; i < len; i++) { 210 | if (i === 0 || i === 2) { 211 | continue; 212 | } else if (i === 1) { 213 | (headers = cliRows[i].split('|')).forEach((v, k) => { 214 | headers[k] = v.replace(/[\u001b\u009b][[()#?]*(?:[0-9]{1,4}(?:[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '').trim(); 215 | if (headers[k] === '') { 216 | delete headers[k]; 217 | } 218 | }); 219 | } else { 220 | if (cliRows[i].indexOf('|') > -1) { 221 | let row: string[] = []; 222 | cliRows[i].split(/ \| /g).forEach(v => { 223 | row.push(v.replace(/^\||\|$/g, '').trim()); 224 | }); 225 | rows.push(row); 226 | } 227 | } 228 | } 229 | return { headers: headers, rows: rows }; 230 | } 231 | 232 | private static get tableStyle(): string { 233 | return ``; 251 | } 252 | /** 253 | * Opens a virtual Laravel routes list. 254 | * @param openPath The path to open. 255 | * @param title The title of the file. 256 | * @param headers The headers of the table. 257 | * @param rows The rows of the table. 258 | * @param artisanRoot The root directory of the artisan file. 259 | */ 260 | protected static async openVirtualHtmlFile(openPath: string, title: string, headers: string[], rows: string[][], artisanRoot: string) { 261 | let html: string = ` 262 | `; 277 | html += '

Loading Route Information...

'; 278 | html += `${this.tableStyle}`; 279 | html += ''; 280 | headers.forEach(header => { 281 | html += ``; 282 | }); 283 | html += ''; 284 | rows.forEach((row, rowIdx) => { 285 | html += ''; 286 | row.forEach((item, colIdx) => { 287 | if ((item ?? '').match(/app\\/i)) { 288 | html += 289 | `'; 296 | } else { 297 | html += ''; 298 | } 299 | }); 300 | html += ''; 301 | }); 302 | html += ''; 303 | html += ``; 411 | const panel = window.createWebviewPanel(openPath, title, ViewColumn.Active, { 412 | enableScripts: true, 413 | retainContextWhenHidden: true, 414 | }); 415 | panel.webview.html = html; 416 | panel.webview.onDidReceiveMessage(async msg => { 417 | if (msg.file) { 418 | let uri = Uri.parse(msg.file); 419 | let method = msg.method || ''; 420 | let doc = await workspace.openTextDocument(uri); 421 | let activeDoc = await window.showTextDocument(doc); 422 | if (method.length > 0) { 423 | let idx = doc.getText().indexOf(`function ${method}`); 424 | if (idx > -1) { 425 | let pos = doc.positionAt(idx + 9); 426 | activeDoc.selection = new Selection(pos, pos); 427 | } 428 | } 429 | } 430 | }); 431 | return panel; 432 | } 433 | /** 434 | * Shows an input box and returns the value. 435 | * @param placeHolder The placeholder text. 436 | */ 437 | protected static async getInput(placeHolder: string) { 438 | let name = await window.showInputBox({ 439 | placeHolder: placeHolder.replace(/\s\s+/g, ' ').trim(), 440 | }); 441 | name = typeof name === 'undefined' ? '' : name; 442 | // if (name.length === 0) { 443 | // window.showErrorMessage('Invalid ' + placeHolder) 444 | // return '' 445 | // } 446 | return name; 447 | } 448 | /** 449 | * Shows a list of items and returns the selected item. 450 | * @param placeHolder The placeholder text. 451 | * @param list The list of items to choose from. 452 | */ 453 | protected static async getListInput(placeHolder: string, list: string[]) { 454 | let name = await window.showQuickPick(list, { placeHolder: placeHolder }); 455 | name = typeof name === 'undefined' ? '' : name; 456 | return name; 457 | } 458 | /** 459 | * Shows a Yes/No dialog (where `yes` is first in the list) and returns the result. 460 | * @param placeHolder The placeholder text. 461 | */ 462 | protected static async getYesNo(placeHolder: string): Promise { 463 | let value = await window.showQuickPick(['Yes', 'No'], { placeHolder }); 464 | return value.toLowerCase() === 'yes' ? true : false; 465 | } 466 | /** 467 | * Shows a No/Yes dialog (where `no` is first in the list) and returns the result. 468 | * @param placeHolder The placeholder text. 469 | */ 470 | protected static async getNoYes(placeHolder: string): Promise { 471 | let value = await window.showQuickPick(['No', 'Yes'], { placeHolder }); 472 | return value.toLowerCase() === 'yes' ? true : false; 473 | } 474 | /** 475 | * Shows snackbar message to the user. 476 | * @param message The message to show. 477 | */ 478 | protected static async showMessage(message: string) { 479 | window.showInformationMessage(message); 480 | return true; 481 | } 482 | /** 483 | * Shows snackbar error message to the user. 484 | * @param message The message to show. 485 | * @param consoleErr The message to show in console. 486 | */ 487 | protected static async showError(message: string, consoleErr = null) { 488 | if (consoleErr !== null) { 489 | message += ' (See output console for more details)'; 490 | console.error(consoleErr + ' (See output console for more details)'); 491 | } 492 | window.showErrorMessage(message); 493 | return false; 494 | } 495 | /** 496 | * Refreshes the files explorer. 497 | */ 498 | protected static refreshFilesExplorer() { 499 | commands.executeCommand('workbench.files.action.refreshFilesExplorer'); 500 | } 501 | /** 502 | * Get a list of all artisan commands. 503 | */ 504 | protected static getCommandList(): Promise { 505 | return new Promise(resolve => { 506 | this.execCmd(`list --format=json`, info => { 507 | let commands: any[] = JSON.parse(info.stdout).commands; 508 | let commandList: Command[] = []; 509 | commands.forEach(command => { 510 | let commandItem = { 511 | name: command.name, 512 | description: command.description, 513 | options: [], 514 | arguments: [], 515 | }; 516 | for (let i in command.definition.options) { 517 | if (['help', 'quiet', 'verbose', 'version', 'ansi', 'no-ansi', 'no-interaction', 'env'].indexOf(i) > -1) continue; 518 | commandItem.options.push(command.definition.options[i]); 519 | } 520 | for (let i in command.definition.arguments) { 521 | commandItem.arguments.push(command.definition.arguments[i]); 522 | } 523 | commandList.push(commandItem); 524 | }); 525 | resolve(commandList); 526 | }); 527 | }); 528 | } 529 | } 530 | -------------------------------------------------------------------------------- /src/TextDocumentProvider.ts: -------------------------------------------------------------------------------- 1 | import { TextDocumentContentProvider, Uri, CancellationToken } from 'vscode' 2 | 3 | export default class Test implements TextDocumentContentProvider { 4 | 5 | public async provideTextDocumentContent(uri: Uri, token: CancellationToken): Promise { 6 | return '' 7 | } 8 | 9 | } -------------------------------------------------------------------------------- /src/commands/base/ClearCompiled.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class ClearCompiled extends Common { 4 | 5 | public static async run() { 6 | let command = `clear-compiled` 7 | // Generate the controller 8 | this.execCmd(command, async (info) => { 9 | if (info.err) { 10 | this.showError('Compilation was not cleared', info.err) 11 | } else { 12 | this.showMessage('Compilation cleared') 13 | } 14 | }) 15 | } 16 | } -------------------------------------------------------------------------------- /src/commands/base/List.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class List extends Common { 4 | 5 | public static async run() { 6 | let command = `list --format=json` 7 | // Generate the controller 8 | this.execCmd(command, async (info) => { 9 | if (info.err) { 10 | this.showError('Could not get the list', info.err) 11 | } else { 12 | let list: { 13 | commands: { 14 | definition: { 15 | arguments: { name: { name: string, description: string, is_required: boolean } }, 16 | options: {} 17 | }, description: string, help: string, name: string, usage: string[] 18 | }[] 19 | } = JSON.parse(info.stdout) 20 | let headers: string[] = [] 21 | let rows: string[][] = [] 22 | 23 | headers.push('Name', 'Description', 'Arguments', 'Options') 24 | 25 | let i = 0 26 | list.commands.forEach(command => { 27 | let row = rows[i] = [] 28 | row.push(command.name) 29 | row.push(command.description) 30 | if (command.definition.arguments.name) { 31 | let name = command.definition.arguments.name 32 | row.push(name.name + (name.is_required ? '' : ' (Optional) ') + ' – ' + name.description) 33 | } else { 34 | row.push('') 35 | } 36 | let opts: string[] = [] 37 | for (let i in command.definition.options) { 38 | if (['help', 'quiet', 'version', 'ansi', 'no-ansi', 'no-interaction', 'env', 'verbose'].indexOf(i) > -1) continue 39 | let name: string = command.definition.options[i].name 40 | let descr: string = command.definition.options[i].description 41 | opts.push(name + ' – ' + descr) 42 | } 43 | row.push(opts.join('
')) 44 | i++ 45 | }) 46 | this.openVirtualHtmlFile('artisan-list', 'Artisan Commands', headers, rows, info.artisan.dir) 47 | } 48 | }) 49 | } 50 | } -------------------------------------------------------------------------------- /src/commands/base/Migrate.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class Migrate extends Common { 4 | 5 | public static async run() { 6 | 7 | let database = await this.getInput('What database should I use?') 8 | let seed = await this.getYesNo('Should I seed the database for you?') 9 | 10 | let command = `migrate ${seed ? '--seed' : ''} ${database.length > 0 ? '--database=' + database : ''}` 11 | 12 | this.execCmd(command, async (info) => { 13 | if (info.err) { 14 | this.showError('The migration failed', info.err) 15 | } else { 16 | this.showMessage('The migration has completed') 17 | } 18 | }) 19 | } 20 | } -------------------------------------------------------------------------------- /src/commands/base/Optimize.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class Optimize extends Common { 4 | 5 | public static async run() { 6 | 7 | let optComposer = await this.getYesNo('Should I optimize Composer\'s dump-autoload?') 8 | 9 | let command = `optimize ${!optComposer ? '--psr' : ''}` 10 | 11 | this.execCmd(command, async (info) => { 12 | if (info.err) { 13 | this.showError('Optimization failed', info.err) 14 | } else { 15 | this.showMessage('The framework was optimized') 16 | } 17 | }) 18 | } 19 | } -------------------------------------------------------------------------------- /src/commands/base/Serve.ts: -------------------------------------------------------------------------------- 1 | import { Terminal, window, workspace } from 'vscode'; 2 | import Common from '../../Common'; 3 | 4 | export default class Server extends Common { 5 | private static terminal: Terminal; 6 | private static host: string; 7 | private static port: string; 8 | 9 | public static async run(useDefaults = false) { 10 | const config = workspace.getConfiguration('artisan'); 11 | const wsl = config.get('wsl.enabled', false); 12 | const defaultHost = config.get('serve.defaultHost', 'localhost'); 13 | const defaultPort = config.get('serve.defaultPort', '8000'); 14 | const phpLocation = config.get('php.location', 'php'); 15 | 16 | const host = useDefaults ? defaultHost : await this.getInput(`Should I use a specific host (Default: ${defaultHost})?`); 17 | const port = useDefaults ? defaultPort : await this.getInput(`Should I use a specific port (Default: ${defaultPort})?`); 18 | 19 | Server.host = host.length > 0 ? host : defaultHost; 20 | Server.port = port.length > 0 ? port : defaultPort; 21 | 22 | let artisanToUse = await this.listArtisanPaths(); 23 | 24 | Server.terminal = window.createTerminal('Laravel Artisan Server'); 25 | Server.terminal.show(); 26 | 27 | if (wsl) { 28 | Server.terminal.sendText('wsl'); 29 | artisanToUse = artisanToUse.replace(/^(\w):/, '/mnt/$1').replace(/\\/g, '/'); 30 | } 31 | setTimeout(() => { 32 | Server.terminal.sendText(`${phpLocation} "${artisanToUse}" serve --host=${Server.host} --port=${Server.port}`); 33 | this.showMessage(`The server is now running on "http://${Server.host}:${Server.port}"`); 34 | }, 1000); 35 | } 36 | 37 | public static async stop() { 38 | if (Server.terminal) { 39 | Server.terminal.dispose(); 40 | this.showMessage(`The server has been stopped on "http://${Server.host}:${Server.port}"`); 41 | } else { 42 | this.showError('There is no server currently running'); 43 | } 44 | } 45 | 46 | public static async restart() { 47 | Server.stop(); 48 | Server.run(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/commands/cache/Clear.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class CacheClear extends Common { 4 | 5 | public static async run() { 6 | 7 | let store = await this.getInput('Store name (Leave blank to clear everything)') 8 | let tags = await this.getInput('Should I clear specific tags?') 9 | let command = `cache:clear ${store} ${tags.length > 0 ? '--tags=' + tags : ''}` 10 | 11 | this.execCmd(command, async (info) => { 12 | if (info.err) { 13 | this.showError('The cache could not be cleared', info.err) 14 | } else { 15 | this.showMessage('The cache was cleared') 16 | } 17 | }) 18 | } 19 | } -------------------------------------------------------------------------------- /src/commands/cache/Table.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class CacheTable extends Common { 4 | 5 | public static async run() { 6 | let command = `cache:table` 7 | this.execCmd(command, async (info) => { 8 | if (info.err) { 9 | this.showError('A migration table could not be created for the cache database table', info.err) 10 | } else { 11 | this.showMessage('A migration table was created for the cache database table') 12 | } 13 | }) 14 | } 15 | } -------------------------------------------------------------------------------- /src/commands/config/Cache.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class ConfigCache extends Common { 4 | 5 | public static async run() { 6 | let command = `config:cache` 7 | this.execCmd(command, async (info) => { 8 | if (info.err) { 9 | return this.showError('The config cache could not be created', info.err) 10 | } else { 11 | return this.showMessage('The config was cached') 12 | } 13 | }) 14 | } 15 | } -------------------------------------------------------------------------------- /src/commands/config/Clear.ts: -------------------------------------------------------------------------------- 1 | import { window, workspace } from 'vscode' 2 | import cp = require('child_process') 3 | import Common from '../../Common' 4 | import Output from '../../utils/Output' 5 | 6 | export default class ConfigCacheClear extends Common { 7 | 8 | public static async run() { 9 | let command = `config:clear` 10 | this.execCmd(command, async (info) => { 11 | if (info.err) { 12 | return this.showError('The config cache could not be cleared', info.err) 13 | } else { 14 | return this.showMessage('The config cache was cleared') 15 | } 16 | }) 17 | } 18 | } -------------------------------------------------------------------------------- /src/commands/config/Refresh.ts: -------------------------------------------------------------------------------- 1 | import { window, workspace } from 'vscode' 2 | import cp = require('child_process') 3 | import Common from '../../Common' 4 | import Output from '../../utils/Output' 5 | 6 | import ConfigCache from './Cache' 7 | import ConfigClear from './Clear' 8 | 9 | export default class ConfigCacheRefresh extends Common { 10 | 11 | public static async run() { 12 | await ConfigClear.run() 13 | await ConfigCache.run() 14 | } 15 | } -------------------------------------------------------------------------------- /src/commands/event/Generate.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class EventGenerate extends Common { 4 | 5 | public static async run() { 6 | 7 | let command = `event:generate` 8 | 9 | this.execCmd(command, async (info) => { 10 | if (info.err) { 11 | this.showError('Events could not be generated', info.err) 12 | } else { 13 | this.showMessage('Events generated') 14 | } 15 | }) 16 | } 17 | } -------------------------------------------------------------------------------- /src/commands/key/Generate.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class KeyGenerate extends Common { 4 | 5 | public static async run() { 6 | let update = await this.getYesNo('Should I update the env file?') 7 | let command = `key:generate ${!update ? '--show' : ''}` 8 | 9 | this.execCmd(command, async (info) => { 10 | if (info.err) { 11 | this.showError('The key could not be generated', info.err) 12 | } else { 13 | let key = info.stdout.match(/base64:([^\] \b]*)/ig)[0] || '' 14 | if (update && key.length > 0) { 15 | this.showMessage('The key was generated (' + key + ')') 16 | } else if (!update && key.length > 0) { 17 | this.showMessage('Here is a key: (' + key + ')') 18 | } else { 19 | this.showError('A key was not generated') 20 | } 21 | } 22 | }) 23 | } 24 | } -------------------------------------------------------------------------------- /src/commands/make/Auth.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class MakeAuth extends Common { 4 | 5 | public static async run() { 6 | 7 | let onlyViews = await this.getYesNo('Should only the views be created?') 8 | let overWrite = await this.getYesNo('Should the views be overwritten?') 9 | 10 | let command = `make:auth ${onlyViews ? '--views' : ''} ${overWrite ? '--force' : ''}` 11 | 12 | // Generate the controller 13 | this.execCmd(command, async (info) => { 14 | if (info.err) { 15 | this.showError('Could not create the auth', info.err) 16 | } else { 17 | this.showMessage('Auth has successfully be created.') 18 | } 19 | }) 20 | } 21 | } -------------------------------------------------------------------------------- /src/commands/make/Cast.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeCast extends Common { 4 | public static async run() { 5 | let cmdName = await this.getInput('Cast Name'); 6 | if (cmdName.length === 0) { 7 | this.showError('A cast name is required'); 8 | return; 9 | } 10 | 11 | const isInbound = await this.getNoYes('Should I create an inbound cast?'); 12 | const cmd = `make:cast ${cmdName} ${isInbound ? '--inbound' : ''}`; 13 | 14 | this.execCmd(cmd, async info => { 15 | if (info.err) { 16 | this.showError('Could not create the cast', info.err); 17 | } else { 18 | await this.openFile(info.artisan.dir, '/app/Casts/' + cmdName + '.php'); 19 | } 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/commands/make/Channel.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeChannel extends Common { 4 | public static async run() { 5 | let cmdName = await this.getInput('Channel Name'); 6 | if (cmdName.length === 0) { 7 | this.showError('A channel name is required'); 8 | return; 9 | } 10 | 11 | this.execCmd('make:channel', async info => { 12 | if (info.err) { 13 | this.showError('Could not create the channel', info.err); 14 | } else { 15 | await this.openFile(info.artisan.dir, '/app/Broadcasting/' + cmdName + '.php'); 16 | } 17 | }); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/commands/make/Command.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeCommand extends Common { 4 | public static async run() { 5 | let cmdName = await this.getInput('Command Class Name'); 6 | if (cmdName.length === 0) { 7 | this.showError('A command name is required'); 8 | return; 9 | } 10 | 11 | let consoleName = await this.getInput('What is the terminal command name? (Default is "command:name")'); 12 | let command = `make:command ${cmdName} ${consoleName.length > 0 ? '--command=' + consoleName : ''}`; 13 | 14 | this.execCmd(command, async info => { 15 | if (info.err) { 16 | this.showError('Could not create the command', info.err); 17 | } else { 18 | await this.openFile(info.artisan.dir, '/app/Console/Commands/' + cmdName + '.php'); 19 | } 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/commands/make/Component.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeComponent extends Common { 4 | public static async run() { 5 | // Get the name of the component to create 6 | let componentName = await this.getInput('Component Name'); 7 | if (componentName.length === 0) { 8 | this.showError('A component name is required'); 9 | return; 10 | } 11 | 12 | let inlineView = false; 13 | // Determine the type of view (basic, inline) 14 | inlineView = await this.getNoYes('Should this render an inline view?'); 15 | 16 | console.log('inlineView: ' + inlineView); 17 | 18 | let inlineOption = inlineView ? '--inline' : ''; 19 | let command = `make:component ${inlineOption} ${componentName}`; 20 | 21 | // Generate the component 22 | this.execCmd(command, async info => { 23 | if (info.err) { 24 | this.showError('Could not create component', info.err); 25 | } else { 26 | if (inlineView === false) { 27 | await this.openFile(info.artisan.dir, '/app/View/Components/' + componentName + '.php'); 28 | } else { 29 | await this.openFile(info.artisan.dir, '/resources/views/components/' + componentName + '.blade.php'); 30 | } 31 | } 32 | }); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/commands/make/Controller.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | declare type ControllerType = 'basic' | 'resource' | 'api'; 4 | 5 | export default class MakeController extends Common { 6 | public static async run() { 7 | // Get the name of the controller to create 8 | let ctrlName = await this.getInput('Controller Name'); 9 | if (ctrlName.length === 0) { 10 | this.showError('A controller name is required'); 11 | return; 12 | } 13 | 14 | // Determine the type of controller (basic, resource, api) 15 | let type = (await this.getListInput('What type of controller is this?', ['Basic', 'Resource', 'API'])).toLowerCase() as ControllerType; 16 | 17 | let refModel = false; 18 | let modelToUse = ''; 19 | if (type != 'basic') { 20 | // Determine the model reference 21 | refModel = await this.getYesNo('Should this reference a model?'); 22 | if (refModel) { 23 | modelToUse = await this.getInput('What is the name of the model?'); 24 | } 25 | } 26 | 27 | let modelToUseCommand = refModel ? `--model=${modelToUse} --no-interaction` : ''; 28 | let typeCommand = type === 'resource' ? '--resource' : type === 'api' ? '--api' : ''; 29 | let command = `make:controller ${ctrlName} ${typeCommand} ${modelToUseCommand}`; 30 | // let command = `make:controller ${ctrlName} ${isResource ? '--resource' : ''} ${isAPI ? '--api' : ''}`.trim() 31 | 32 | // Generate the controller 33 | this.execCmd(command, async info => { 34 | console.log('info', info); 35 | if (info.err) { 36 | this.showError('Could not create the controller', info.err); 37 | } else { 38 | await this.openFile(info.artisan.dir, '/app/Http/Controllers/' + ctrlName + '.php'); 39 | } 40 | }); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/commands/make/Event.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeEvent extends Common { 4 | public static async run() { 5 | let evtName = await this.getInput('Event Name'); 6 | if (evtName.length === 0) { 7 | this.showError('An event name is required'); 8 | return; 9 | } 10 | let command = `make:event ${evtName}`; 11 | 12 | this.execCmd(command, async info => { 13 | if (info.err) { 14 | this.showError('Could not create the event', info.err); 15 | } else { 16 | await this.openFile(info.artisan.dir, '/app/Events/' + evtName + '.php'); 17 | } 18 | }); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/commands/make/Factory.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeFactory extends Common { 4 | public static async run() { 5 | // Get the name of the controller to create 6 | let name = await this.getInput('Factory Name'); 7 | if (name.length === 0) { 8 | this.showError('A factory name is required'); 9 | return; 10 | } 11 | 12 | // Determine if this is a resource controller or not 13 | let hasModel = await this.getYesNo('Is there a model related to this factory?'); 14 | let modelName = ''; 15 | if (hasModel) { 16 | modelName = await this.getInput('Does the model have a name? Leave blank to use (Model::class)'); 17 | } 18 | let command = `make:factory ${name} ${hasModel ? `--model${modelName.length > 0 ? `=${modelName}` : ''}` : ''}`; 19 | 20 | // Generate the factory 21 | this.execCmd(command, async info => { 22 | if (info.err) { 23 | this.showError('Could not create the factory', info.err); 24 | } else { 25 | await this.openFile(info.artisan.dir, '/database/factories/' + name + '.php'); 26 | } 27 | }); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/commands/make/Job.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeJob extends Common { 4 | public static async run() { 5 | let jobName = await this.getInput('Job Name'); 6 | if (jobName.length === 0) { 7 | this.showError('A job name is required'); 8 | return; 9 | } 10 | 11 | let sync = await this.getYesNo('Should I make this job synchronous?'); 12 | let command = `make:job ${jobName} ${sync ? '--sync' : ''}`; 13 | 14 | this.execCmd(command, async info => { 15 | if (info.err) { 16 | this.showError('Could not create the job', info.err); 17 | } else { 18 | await this.openFile(info.artisan.dir, '/app/Jobs/' + jobName + '.php'); 19 | } 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/commands/make/Listener.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeListener extends Common { 4 | public static async run() { 5 | let listenerName = await this.getInput('Listener Name'); 6 | if (listenerName.length === 0) { 7 | this.showError('A listener name is required'); 8 | return; 9 | } 10 | 11 | let event = await this.getInput('What event class should I listen for?'); 12 | let queued = await this.getYesNo('Should I make the listener queued?'); 13 | let command = `make:listener ${listenerName} ${event.length > 0 ? '--event=' + event : ''} ${queued ? '--queued' : ''}`; 14 | 15 | this.execCmd(command, async info => { 16 | if (info.err) { 17 | this.showError('Could not create the listener', info.err); 18 | } else { 19 | await this.openFile(info.artisan.dir, '/app/Listeners/' + listenerName + '.php'); 20 | } 21 | }); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/commands/make/Mail.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeMail extends Common { 4 | public static async run() { 5 | let mailName = await this.getInput('Mail Name'); 6 | if (mailName.length === 0) { 7 | this.showError('A mail name is required'); 8 | return; 9 | } 10 | 11 | const markdown = await this.getNoYes('Should this use markdown?'); 12 | let command = `make:mail ${mailName} ${markdown ? '--markdown' : ''}`; 13 | 14 | this.execCmd(command, async info => { 15 | if (info.err) { 16 | this.showError('Could not create the mailer', info.err); 17 | } else { 18 | await this.openFile(info.artisan.dir, '/app/Mail/' + mailName + '.php'); 19 | } 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/commands/make/Middleware.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeMiddleware extends Common { 4 | public static async run() { 5 | // Get the name of the controller to create 6 | let middleName = await this.getInput('Middleware Name'); 7 | if (middleName.length === 0) { 8 | this.showError('A middleware name is required'); 9 | return; 10 | } 11 | 12 | let command = `make:middleware ${middleName}`; 13 | 14 | // Generate the controller 15 | this.execCmd(command, async info => { 16 | if (info.err) { 17 | this.showError('Could not create the middleware', info.err); 18 | } else { 19 | await this.openFile(info.artisan.dir, '/app/Http/Middleware/' + middleName + '.php'); 20 | } 21 | }); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/commands/make/Migration.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeMigration extends Common { 4 | public static async run() { 5 | // Get the name of the controller to create 6 | let migrationName = await this.getInput('Migration Name'); 7 | if (migrationName.length === 0) { 8 | this.showError('A migration name is required'); 9 | return; 10 | } 11 | 12 | let createTable = false; 13 | let modifyTable = false; 14 | let tableName = ''; 15 | 16 | // Determine if this is a resource controller or not 17 | createTable = await this.getYesNo('Will this migration create a table?'); 18 | if (!createTable) { 19 | modifyTable = await this.getYesNo('Will this migration modify an existing table?'); 20 | } 21 | 22 | if (createTable || modifyTable) { 23 | tableName = await this.getInput('What is the name of the table?'); 24 | } 25 | 26 | let command = `make:migration "${migrationName}" ${createTable ? '--create=' + tableName : ''} ${ 27 | modifyTable ? '--table=' + tableName : '' 28 | }`; 29 | 30 | // Generate the controller 31 | this.execCmd(command, async info => { 32 | if (info.err) { 33 | this.showError('Could not create the migration', info.err); 34 | } else { 35 | let file = info.stdout.replace(/^.+:/gi, '').trim(); 36 | await this.openFile(info.artisan.dir, '/database/migrations/' + file + '.php'); 37 | } 38 | }); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/commands/make/Model.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import Common from '../../Common'; 3 | 4 | export default class MakeModel extends Common { 5 | public static async run() { 6 | // Get the name of the controller to create 7 | let modelName = await this.getInput('Model Name'); 8 | if (modelName.length === 0) { 9 | this.showError('A model name is required'); 10 | return; 11 | } 12 | let isController = false; 13 | let isMigration = false; 14 | let isResource = false; 15 | let isFactory = false; 16 | let isAll = false; 17 | 18 | // Determine if should we create migration,factory and resource controller 19 | isAll = await this.getYesNo('Should I create a migration, factory and resource controller for the model?'); 20 | 21 | if (!isAll) { 22 | // Determine if we should create a migration or not 23 | isMigration = await this.getYesNo('Should I create a migration for the model?'); 24 | 25 | // Determine if it should create a factory for this model or not 26 | isFactory = await this.getYesNo('Should I create a factory for the model?'); 27 | 28 | // Should a controller be generated? 29 | isController = await this.getYesNo('Should I create a controller for the model?'); 30 | 31 | // Ask if the controller is a resource if the previous answer was 'yes' 32 | if (isController) { 33 | // Determine if this is a resource controller or not 34 | isResource = await this.getYesNo('Should I create the controller as a resource?'); 35 | } 36 | } 37 | 38 | let command = `make:model ${modelName} ${isMigration ? '-m' : ''} ${isFactory ? '-f' : ''} ${isController ? '-c' : ''} ${ 39 | isResource ? '-r' : '' 40 | } ${isAll ? '-a' : ''}`; 41 | 42 | // Generate the model 43 | this.execCmd(command, async info => { 44 | if (info.err) { 45 | this.showError('Could not create the model', info.err); 46 | } else { 47 | if (fs.existsSync(info.artisan.dir + '/app/Models/' + modelName + '.php')) { 48 | await this.openFile(info.artisan.dir, '/app/Models/' + modelName + '.php'); 49 | } else { 50 | await this.openFile(info.artisan.dir, '/app/' + modelName + '.php'); 51 | } 52 | if (isController || isAll) { 53 | await this.openFile(info.artisan.dir, '/app/Http/Controllers/' + modelName + 'Controller.php'); 54 | } 55 | if (isFactory || isAll) { 56 | await this.openFile(info.artisan.dir, '/database/factories/' + modelName + 'Factory.php'); 57 | } 58 | if (isMigration || isAll) { 59 | let migration = info.stdout.match(/Created Migration:(.+)/im)[1].trim(); 60 | await this.openFile(info.artisan.dir, '/database/migrations/' + migration + '.php'); 61 | } 62 | } 63 | }); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/commands/make/Notification.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeNotification extends Common { 4 | public static async run() { 5 | let noteName = await this.getInput('Notification Name'); 6 | if (noteName.length === 0) { 7 | this.showError('A notification name is required'); 8 | return; 9 | } 10 | 11 | let command = `make:notification ${noteName}`; 12 | 13 | this.execCmd(command, async info => { 14 | if (info.err) { 15 | this.showError('Could not create the notification', info.err); 16 | } else { 17 | await this.openFile(info.artisan.dir, '/app/Notifications/' + noteName + '.php'); 18 | } 19 | }); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/commands/make/Observer.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeObserver extends Common { 4 | public static async run() { 5 | // Get the name of the observer to create 6 | let observerName = await this.getInput('Observer Name'); 7 | if (observerName.length === 0) { 8 | this.showError('An observer name is required'); 9 | return; 10 | } 11 | 12 | let modelName = ''; 13 | // Get the name of the model for observer 14 | modelName = await this.getInput('Model Name'); 15 | 16 | let command = `make:observer ${observerName} --model=${modelName}`; 17 | 18 | // Generate the observer 19 | this.execCmd(command, async info => { 20 | if (info.err) { 21 | this.showError('Could not create the observer', info.err); 22 | } else { 23 | await this.openFile(info.artisan.dir, '/app/Observers/' + observerName + '.php'); 24 | } 25 | }); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/commands/make/Policy.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakePolicy extends Common { 4 | public static async run() { 5 | let policyName = await this.getInput('Policy Name'); 6 | if (policyName.length === 0) { 7 | this.showError('A policy name is required'); 8 | return; 9 | } 10 | 11 | let model = await this.getInput('What model should I apply this policy to?'); 12 | let command = `make:policy ${policyName} ${model.length > 0 ? '--model=' + model : ''}`; 13 | 14 | this.execCmd(command, async info => { 15 | if (info.err) { 16 | this.showError('Could not create the policy', info.err); 17 | } else { 18 | await this.openFile(info.artisan.dir, '/app/Policies/' + policyName + '.php'); 19 | } 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/commands/make/Provider.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeProvider extends Common { 4 | public static async run() { 5 | let providerName = await this.getInput('Provider Name'); 6 | if (providerName.length === 0) { 7 | this.showError('A provider name is required'); 8 | return; 9 | } 10 | 11 | let command = `make:provider ${providerName}`; 12 | 13 | this.execCmd(command, async info => { 14 | if (info.err) { 15 | this.showError('Could not create the provider', info.err); 16 | } else { 17 | await this.openFile(info.artisan.dir, '/app/Providers/' + providerName + '.php'); 18 | } 19 | }); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/commands/make/Request.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeRequest extends Common { 4 | public static async run() { 5 | let requestName = await this.getInput('Request Name'); 6 | if (requestName.length === 0) { 7 | this.showError('A request name is required'); 8 | return; 9 | } 10 | 11 | let command = `make:request ${requestName}`; 12 | 13 | this.execCmd(command, async info => { 14 | if (info.err) { 15 | this.showError('Could not create the request', info.err); 16 | } else { 17 | await this.openFile(info.artisan.dir, '/app/Http/Requests/' + requestName + '.php'); 18 | } 19 | }); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/commands/make/Resource.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeResource extends Common { 4 | public static async run() { 5 | // Get the name of the resource to create 6 | let ctrlName = await this.getInput('Resource Name'); 7 | if (ctrlName.length === 0) { 8 | this.showError('A resource name is required'); 9 | return; 10 | } 11 | 12 | // Determine if this is a resource collection or not 13 | let isCollection = await this.getYesNo('Should I make this a resource collection?'); 14 | let command = `make:resource ${ctrlName} ${isCollection ? '--collection' : ''}`; 15 | 16 | // Generate the resource 17 | this.execCmd(command, async info => { 18 | if (info.err) { 19 | this.showError('Could not create the resource', info.err); 20 | } else { 21 | await this.openFile(info.artisan.dir, '/app/Http/Resources/' + ctrlName + '.php'); 22 | } 23 | }); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/commands/make/Rule.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeRule extends Common { 4 | public static async run() { 5 | let cmdName = await this.getInput('Rule Name'); 6 | if (cmdName.length === 0) { 7 | this.showError('A rule name is required'); 8 | return; 9 | } 10 | 11 | const isImplicit = await this.getNoYes('Should this rule be implicit?'); 12 | const cmd = `make:rule ${cmdName} ${isImplicit ? '--implicit' : ''}`; 13 | 14 | this.execCmd(cmd, async info => { 15 | if (info.err) { 16 | this.showError('Could not create the rule', info.err); 17 | } else { 18 | await this.openFile(info.artisan.dir, '/app/Rules/' + cmdName + '.php'); 19 | } 20 | }); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/commands/make/Seeder.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import Common from '../../Common'; 3 | 4 | export default class MakeSeeder extends Common { 5 | public static async run() { 6 | let seedName = await this.getInput('Seeder Name'); 7 | if (seedName.length === 0) { 8 | this.showError('A seeder name is required'); 9 | return; 10 | } 11 | 12 | let command = `make:seeder ${seedName}`; 13 | 14 | this.execCmd(command, async info => { 15 | if (info.err) { 16 | this.showError('Could not create the seeder', info.err); 17 | } else { 18 | if (fs.existsSync(info.artisan.dir + '/database/seeders/' + seedName + '.php')) { 19 | await this.openFile(info.artisan.dir, '/database/seeders/' + seedName + '.php'); 20 | } else { 21 | await this.openFile(info.artisan.dir, '/database/seeds/' + seedName + '.php'); 22 | } 23 | } 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/commands/make/Test.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common'; 2 | 3 | export default class MakeTest extends Common { 4 | public static async run() { 5 | // Get the name of the controller to create 6 | let testName = await this.getInput('Test Name'); 7 | if (testName.length === 0) { 8 | this.showError('A test name is required'); 9 | return; 10 | } 11 | 12 | // Determine if this is a resource controller or not 13 | let isUnitTest = await this.getYesNo('Should I make this a unit test?'); 14 | let command = `make:test ${testName} ${isUnitTest ? '--unit' : ''}`; 15 | 16 | // Generate the controller 17 | this.execCmd(command, async info => { 18 | if (info.err) { 19 | this.showError('Could not create the test', info.err); 20 | } else { 21 | await this.openFile(info.artisan.dir, `/tests/${isUnitTest ? 'Unit' : 'Feature'}/${testName}.php`); 22 | } 23 | }); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/commands/migrate/Fresh.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class MigrateFresh extends Common { 4 | 5 | public static async run() { 6 | 7 | let database = await this.getInput('What database should I use?') 8 | let seed = await this.getYesNo('Should I seed the database for you?') 9 | 10 | let command = `migrate:fresh ${database.length > 0 ? '--database=' + database : ''} ${seed ? '--seed' : ''}` 11 | 12 | this.execCmd(command, async (info) => { 13 | if (info.err) { 14 | this.showError('The database could not be freshed', info.err) 15 | } else { 16 | this.showMessage('The database has been freshed') 17 | } 18 | }) 19 | } 20 | } -------------------------------------------------------------------------------- /src/commands/migrate/Install.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class MigrateInstall extends Common { 4 | 5 | public static async run() { 6 | 7 | let database = await this.getInput('What database should I use?') 8 | let command = `migrate:install ${database.length > 0 ? '--database=' + database : ''}` 9 | 10 | this.execCmd(command, async (info) => { 11 | if (info.err) { 12 | this.showError('The migration repository was not installed', info.err) 13 | } else { 14 | this.showMessage('The migration repository was installed') 15 | } 16 | }) 17 | } 18 | } -------------------------------------------------------------------------------- /src/commands/migrate/Refresh.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class MigrateRefresh extends Common { 4 | 5 | public static async run() { 6 | 7 | let database = await this.getInput('What database should I use?') 8 | let seed = await this.getYesNo('Should I seed the database for you?') 9 | let command = `migrate:refresh ${database.length > 0 ? '--database=' + database : ''} ${seed ? '--seed' : ''}` 10 | 11 | this.execCmd(command, async (info) => { 12 | if (info.err) { 13 | this.showError('The database could not be refreshed', info.err) 14 | } else { 15 | this.showMessage('The database has been refreshed') 16 | } 17 | }) 18 | } 19 | } -------------------------------------------------------------------------------- /src/commands/migrate/Reset.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class MigrateReset extends Common { 4 | 5 | public static async run() { 6 | 7 | let database = await this.getInput('What database should I use?') 8 | let command = `migrate:reset ${database.length > 0 ? '--database=' + database : ''}` 9 | 10 | this.execCmd(command, async (info) => { 11 | if (info.err) { 12 | this.showError('The database could not be reset', info.err) 13 | } else { 14 | this.showMessage('The database has been reset') 15 | } 16 | }) 17 | } 18 | } -------------------------------------------------------------------------------- /src/commands/migrate/Rollback.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class MigrateRollback extends Common { 4 | 5 | public static async run() { 6 | 7 | let database = await this.getInput('What database should I use?') 8 | let command = `migrate:rollback ${database.length > 0 ? '--database=' + database : ''}` 9 | 10 | this.execCmd(command, async (info) => { 11 | if (info.err) { 12 | this.showError('The database could not be rolled back', info.err) 13 | } else { 14 | this.showMessage('The database has been rolled back') 15 | } 16 | }) 17 | } 18 | } -------------------------------------------------------------------------------- /src/commands/migrate/Status.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class MigrateStatus extends Common { 4 | 5 | public static async run() { 6 | 7 | let database = await this.getInput('What database should I use?') 8 | let command = `migrate:status ${database.length > 0 ? '--database=' + database : ''}` 9 | 10 | this.execCmd(command, async (info) => { 11 | if (info.err) { 12 | this.showError('Could not get the status of the migrations', info.err) 13 | } else { 14 | let data = this.parseCliTable(info.stdout) 15 | this.openVirtualHtmlFile('migrate-status', 'Migrate Status', data.headers, data.rows, info.artisan.dir) 16 | } 17 | }) 18 | } 19 | } -------------------------------------------------------------------------------- /src/commands/route/Cache.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class RouteCache extends Common { 4 | 5 | public static async run() { 6 | let command = `route:cache` 7 | this.execCmd(command, async (info) => { 8 | if (info.err) { 9 | return this.showError('The route cache could not be created', info.err) 10 | } else { 11 | return this.showMessage('The route was cached') 12 | } 13 | }) 14 | } 15 | } -------------------------------------------------------------------------------- /src/commands/route/Clear.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class RouteCacheClear extends Common { 4 | 5 | public static async run() { 6 | let command = `route:clear` 7 | this.execCmd(command, async (info) => { 8 | if (info.err) { 9 | return this.showError('The route cache could not be cleared', info.err) 10 | } else { 11 | return this.showMessage('The route cache was cleared') 12 | } 13 | }) 14 | } 15 | } -------------------------------------------------------------------------------- /src/commands/route/List.ts: -------------------------------------------------------------------------------- 1 | import { Observable, Subscription, exhaustMap, of, timer } from 'rxjs'; 2 | import { filter, map, switchMap, tap } from 'rxjs/operators'; 3 | import { WebviewPanel } from 'vscode'; 4 | 5 | import Common, { CommandInfo } from '../../Common'; 6 | 7 | interface RouteRow { 8 | domain: string; 9 | method: string; 10 | uri: string; 11 | name: string; 12 | action: string; 13 | middleware: string[]; 14 | } 15 | 16 | export default class RouteList extends Common { 17 | private static panel: WebviewPanel; 18 | private static headers: string[] = ['Domain', 'Method', 'URI', 'Name', 'Action', 'Middleware']; 19 | 20 | private static observable = timer(0, 5000).pipe( 21 | map(() => 'route:list --json'), 22 | tap(async () => { 23 | if (typeof RouteList.panel === 'undefined') { 24 | const artisan = await Common.getArtisanRoot(); 25 | RouteList.panel = await Common.openVirtualHtmlFile('route-list', 'Route List', RouteList.headers, [], artisan); 26 | RouteList.panel.onDidDispose(() => { 27 | RouteList.subscription.unsubscribe(); 28 | RouteList.panel = undefined; 29 | }); 30 | } 31 | }), 32 | filter(() => typeof RouteList.panel !== 'undefined'), 33 | exhaustMap(cmd => RouteList.runCommand(cmd)), 34 | filter(info => { 35 | if (info.err) { 36 | Common.showError('The route list could not be generated.', info.err); 37 | return false; 38 | } 39 | return true; 40 | }), 41 | switchMap(c => 42 | of(c).pipe( 43 | map(info => RouteList.parseRouteList(info.stdout)), 44 | tap(info => RouteList.panel.webview.postMessage({ rows: info.rows })) 45 | ) 46 | ) 47 | ); 48 | private static subscription?: Subscription; 49 | 50 | public static async run() { 51 | this.subscription = this.observable.subscribe(); 52 | } 53 | 54 | private static runCommand(cmd) { 55 | return new Observable(sub => { 56 | this.execCmd(cmd, async info => { 57 | sub.next(info); 58 | sub.complete(); 59 | }); 60 | }); 61 | } 62 | 63 | private static parseRouteList(stdout: string): { headers: string[]; rows: string[][] } { 64 | const data = JSON.parse(stdout); 65 | // {domain: null, method: 'GET|HEAD', uri: '/', name: null, action: 'Closure', middleware: []} 66 | let rows = data.map((row: RouteRow) => [row.domain ?? '', row.method, row.uri, row.name, row.action, row.middleware]); 67 | const resultRows = []; 68 | rows.forEach(row => { 69 | if (row[5].length > 1) { 70 | resultRows.push([row[0], row[1], row[2], row[3], row[4], row[5][0]]); 71 | row[5].forEach((middleware, idx) => idx > 0 && resultRows.push(['', '', '', '', '', middleware])); 72 | } else { 73 | resultRows.push([row[0], row[1], row[2], row[3], row[4], row[5][0]]); 74 | } 75 | }); 76 | return { headers: ['Domain', 'Method', 'URI', 'Name', 'Action', 'Middleware'], rows: resultRows }; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/commands/route/Refresh.ts: -------------------------------------------------------------------------------- 1 | import { window, workspace } from 'vscode' 2 | import cp = require('child_process') 3 | import Common from '../../Common' 4 | 5 | import RouteCache from './Cache' 6 | import RouteClear from './Clear' 7 | 8 | export default class RouteCacheRefresh extends Common { 9 | 10 | public static async run() { 11 | await RouteClear.run() 12 | await RouteCache.run() 13 | } 14 | } -------------------------------------------------------------------------------- /src/commands/run/Command.ts: -------------------------------------------------------------------------------- 1 | import { BehaviorSubject, Subscription, from, iif, map, of, switchMap, tap } from 'rxjs'; 2 | import Common, { Command } from '../../Common'; 3 | import Output from '../../utils/Output'; 4 | 5 | // export interface Argument { 6 | // command_name: { 7 | // default: string | null; 8 | // description: string; 9 | // is_array: boolean; 10 | // is_required: boolean; 11 | // name: string; 12 | // }; 13 | // } 14 | // export interface Option { 15 | // name: string; 16 | // description: string; 17 | // accept_value: boolean; 18 | // is_value_required: boolean; 19 | // default: string | null; 20 | // is_multiple: boolean; 21 | // shortcut: string; 22 | // } 23 | 24 | // export interface Command { 25 | // name: string; 26 | // description: string; 27 | // definition: { 28 | // arguments: Argument; 29 | // options: { [key: string]: Option }; 30 | // }; 31 | // } 32 | 33 | export default class RunCommand extends Common { 34 | private static lastUpdateTime = -1; 35 | private static readonly UPDATE_INTERVAL = 5 * 60 * 1000; 36 | private static commands = new BehaviorSubject([]); 37 | static commands$ = this.commands.pipe( 38 | map(commands => { 39 | if (this.lastUpdateTime === -1 || Math.abs(Date.now() - this.lastUpdateTime) > this.UPDATE_INTERVAL) { 40 | return []; 41 | } 42 | return commands; 43 | }), 44 | switchMap(i => 45 | iif( 46 | () => i.length > 0, 47 | of(i), 48 | from(this.getCommandList()).pipe( 49 | tap(() => (this.lastUpdateTime = Date.now())), 50 | tap(i => this.commands.next(i)) 51 | ) 52 | ) 53 | ) 54 | ); 55 | 56 | static sub?: Subscription; 57 | 58 | public static async run() { 59 | this.sub?.unsubscribe(); 60 | this.sub = this.commands$.subscribe(async commands => { 61 | // get a list of strings for selectable options 62 | let items = commands.reduce((a, v) => a.concat(v.name + ' -- ' + v.description), []); 63 | let cmd = await this.getListInput('Command to run', items); 64 | if (!cmd) return; 65 | 66 | // Find the command settings from the selected option 67 | let commandSettings = commands.find(c => c.name === cmd.split('--')[0].trim()); 68 | 69 | // Initialize an array of options and arguments 70 | let opts: string[] = []; 71 | let args: string[] = []; 72 | 73 | // Ask for information about the arguments 74 | for (let arg of commandSettings.arguments) { 75 | let input = await this.getInput(`${arg.name} ${this.getDefaultText(arg)} ${this.getDescription(arg)}`); 76 | if (this.isValidInput(input)) { 77 | args.push(`${input.toString().length > 0 ? input : this.toValidInput(arg.default)}`); 78 | } 79 | } 80 | 81 | // Ask for information about the options 82 | for (let opt of commandSettings.options) { 83 | if (opt.accept_value) { 84 | let input = await this.getInput(`${opt.name} ${this.getDefaultText(opt)} ${this.getDescription(opt)}`); 85 | if (this.isValidInput(input)) { 86 | let val = ''; 87 | opts.push(`${opt.name}${opt.is_value_required ? `=${input.length > 0 ? input : this.toValidInput(opt.default)}` : ''}`); 88 | } 89 | // opts.push(`${opt.name}${opt.accept_value ? `=${input.length > 0 ? input : this.toValidInput(opt.default)}` : ''}`) 90 | } else { 91 | opts.push(`${opt.name}`); 92 | } 93 | } 94 | 95 | // Remove empty items 96 | args = args.filter(a => a != ''); 97 | opts = opts.filter(a => a != ''); 98 | 99 | let command = `${commandSettings.name} ${args.join(' ')} ${opts.join(' ')}`; 100 | 101 | this.execCmd(command, info => { 102 | if (info.err) { 103 | this.showError('Could not run the command'); 104 | } else { 105 | let msg = ''; 106 | if (info.stdout.length > 0) { 107 | Output.info(info.stdout); 108 | msg = '(See output console for more information)'; 109 | } 110 | this.showMessage(`Command "${commandSettings.name}" has finished ${msg}`.trim()); 111 | } 112 | }); 113 | }); 114 | } 115 | 116 | public static dispose() { 117 | console.debug('Disposing of RunCommand'); 118 | // this.sub.unsubscribe(); 119 | } 120 | 121 | private static getDefaultText(obj) { 122 | return this.isValidInput(obj.default) && obj.default.toString().length > 0 ? `[${obj.default}]` : ''; 123 | } 124 | 125 | private static getDescription(obj) { 126 | return obj.description.toString().length > 0 ? `(${obj.description})` : ''; 127 | } 128 | 129 | private static isValidInput(input) { 130 | return ['string', 'number'].indexOf(typeof input) > -1; 131 | } 132 | 133 | private static toValidInput(input: any) { 134 | return ['string', 'number'].indexOf(typeof input) > -1 ? input.toString() : ''; 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /src/commands/view/Clear.ts: -------------------------------------------------------------------------------- 1 | import Common from '../../Common' 2 | 3 | export default class ViewClear extends Common { 4 | 5 | public static async run() { 6 | let command = `view:clear` 7 | this.execCmd(command, async (info) => { 8 | if (info.err) { 9 | this.showError('The views could not be cleared', info.err) 10 | } else { 11 | this.showMessage('The views were cleared') 12 | } 13 | }) 14 | } 15 | } -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | // The module 'vscode' contains the VS Code extensibility API 3 | // Import the module and reference it with the alias vscode in your code below 4 | import { ExtensionContext, commands, workspace } from 'vscode'; 5 | import Common from './Common'; 6 | import TextDocumentProvider from './TextDocumentProvider'; 7 | import ClearCompiled from './commands/base/ClearCompiled'; 8 | import List from './commands/base/List'; 9 | import Migrate from './commands/base/Migrate'; 10 | import Optimize from './commands/base/Optimize'; 11 | import Server from './commands/base/Serve'; 12 | import CacheClear from './commands/cache/Clear'; 13 | import CacheTable from './commands/cache/Table'; 14 | import ConfigCache from './commands/config/Cache'; 15 | import ConfigCacheClear from './commands/config/Clear'; 16 | import ConfigCacheRefresh from './commands/config/Refresh'; 17 | import EventGenerate from './commands/event/Generate'; 18 | import KeyGenerate from './commands/key/Generate'; 19 | import MakeAuth from './commands/make/Auth'; 20 | import MakeCast from './commands/make/Cast'; 21 | import MakeChannel from './commands/make/Channel'; 22 | import MakeCommand from './commands/make/Command'; 23 | import MakeComponent from './commands/make/Component'; 24 | import MakeController from './commands/make/Controller'; 25 | import MakeEvent from './commands/make/Event'; 26 | import MakeFactory from './commands/make/Factory'; 27 | import MakeJob from './commands/make/Job'; 28 | import MakeListener from './commands/make/Listener'; 29 | import MakeMail from './commands/make/Mail'; 30 | import MakeMiddleware from './commands/make/Middleware'; 31 | import MakeMigration from './commands/make/Migration'; 32 | import MakeModel from './commands/make/Model'; 33 | import MakeNotification from './commands/make/Notification'; 34 | import MakeObserver from './commands/make/Observer'; 35 | import MakePolicy from './commands/make/Policy'; 36 | import MakeProvider from './commands/make/Provider'; 37 | import MakeRequest from './commands/make/Request'; 38 | import MakeResource from './commands/make/Resource'; 39 | import MakeRule from './commands/make/Rule'; 40 | import MakeSeeder from './commands/make/Seeder'; 41 | import MakeTest from './commands/make/Test'; 42 | import MigrateFresh from './commands/migrate/Fresh'; 43 | import MigrateInstall from './commands/migrate/Install'; 44 | import MigrateRefresh from './commands/migrate/Refresh'; 45 | import MigrateReset from './commands/migrate/Reset'; 46 | import MigrateRollback from './commands/migrate/Rollback'; 47 | import MigrateStatus from './commands/migrate/Status'; 48 | import RouteCache from './commands/route/Cache'; 49 | import RouteCacheClear from './commands/route/Clear'; 50 | import RouteList from './commands/route/List'; 51 | import RouteCacheRefresh from './commands/route/Refresh'; 52 | import RunCommand from './commands/run/Command'; 53 | import ViewClear from './commands/view/Clear'; 54 | 55 | interface RegisterCommand { 56 | name: string; 57 | action: Common; 58 | method?: string; 59 | args?: any[]; 60 | } 61 | 62 | export async function activate(context: ExtensionContext) { 63 | let files = await workspace.findFiles('**/artisan', undefined); 64 | files.forEach(file => Common.artisanFileList.push(file)); 65 | 66 | const registeredCommands: RegisterCommand[] = [ 67 | { name: 'artisan.clearCompiled', action: ClearCompiled }, 68 | { name: 'artisan.migrate', action: Migrate }, 69 | { name: 'artisan.optimize', action: Optimize }, 70 | { name: 'artisan.startServer', action: Server }, 71 | { name: 'artisan.startServerUseDefaults', action: Server, method: 'run', args: [true] }, 72 | { name: 'artisan.stopServer', action: Server, method: 'stop' }, 73 | { name: 'artisan.restartServer', action: Server, method: 'restart' }, 74 | { name: 'artisan.list', action: List }, 75 | { name: 'artisan.make.auth', action: MakeAuth }, 76 | { name: 'artisan.make.cast', action: MakeCast }, 77 | { name: 'artisan.make.channel', action: MakeChannel }, 78 | { name: 'artisan.make.command', action: MakeCommand }, 79 | { name: 'artisan.make.controller', action: MakeController }, 80 | { name: 'artisan.make.component', action: MakeComponent }, 81 | { name: 'artisan.make.factory', action: MakeFactory }, 82 | { name: 'artisan.make.event', action: MakeEvent }, 83 | { name: 'artisan.make.listener', action: MakeListener }, 84 | { name: 'artisan.make.mail', action: MakeMail }, 85 | { name: 'artisan.make.job', action: MakeJob }, 86 | { name: 'artisan.make.middleware', action: MakeMiddleware }, 87 | { name: 'artisan.make.model', action: MakeModel }, 88 | { name: 'artisan.make.migration', action: MakeMigration }, 89 | { name: 'artisan.make.notification', action: MakeNotification }, 90 | { name: 'artisan.make.observer', action: MakeObserver }, 91 | { name: 'artisan.make.policy', action: MakePolicy }, 92 | { name: 'artisan.make.provider', action: MakeProvider }, 93 | { name: 'artisan.make.request', action: MakeRequest }, 94 | { name: 'artisan.make.resource', action: MakeResource }, 95 | { name: 'artisan.make.rule', action: MakeRule }, 96 | { name: 'artisan.make.seeder', action: MakeSeeder }, 97 | { name: 'artisan.make.test', action: MakeTest }, 98 | { name: 'artisan.migrate.install', action: MigrateInstall }, 99 | { name: 'artisan.migrate.refresh', action: MigrateRefresh }, 100 | { name: 'artisan.migrate.reset', action: MigrateReset }, 101 | { name: 'artisan.migrate.rollback', action: MigrateRollback }, 102 | { name: 'artisan.migrate.status', action: MigrateStatus }, 103 | { name: 'artisan.migrate.fresh', action: MigrateFresh }, 104 | { name: 'artisan.cache.clear', action: CacheClear }, 105 | { name: 'artisan.cache.table', action: CacheTable }, 106 | { name: 'artisan.route.cache', action: RouteCache }, 107 | { name: 'artisan.route.clear', action: RouteCacheClear }, 108 | { name: 'artisan.route.refresh', action: RouteCacheRefresh }, 109 | { name: 'artisan.route.list', action: RouteList }, 110 | { name: 'artisan.config.cache', action: ConfigCache }, 111 | { name: 'artisan.config.clear', action: ConfigCacheClear }, 112 | { name: 'artisan.config.refresh', action: ConfigCacheRefresh }, 113 | { name: 'artisan.key.generate', action: KeyGenerate }, 114 | { name: 'artisan.event.generate', action: EventGenerate }, 115 | { name: 'artisan.view.clear', action: ViewClear }, 116 | { name: 'artisan.run.command', action: RunCommand }, 117 | ]; 118 | 119 | registeredCommands.forEach((command: RegisterCommand) => { 120 | const cmd = commands.registerCommand(command.name, async () => { 121 | // Setup the call 122 | const method = command.method ?? 'run'; 123 | const args = command.args ?? []; 124 | 125 | // Run the command 126 | await command.action[method](...args); 127 | 128 | // Cleanup 129 | // command.action.dispose?.(); 130 | }); 131 | 132 | // Register the command 133 | context.subscriptions.push(cmd); 134 | }); 135 | 136 | // Base commands 137 | // context.subscriptions.push(commands.registerCommand('artisan.clearCompiled', () => { })) 138 | // context.subscriptions.push(commands.registerCommand('artisan.migrate', () => { })) 139 | // context.subscriptions.push(commands.registerCommand('artisan.optimize', () => { })) 140 | // context.subscriptions.push(commands.registerCommand('artisan.startServer', () => { })) 141 | // context.subscriptions.push(commands.registerCommand('artisan.startServerUseDefaults', () => { Server.run(true) })) 142 | // context.subscriptions.push(commands.registerCommand('artisan.stopServer', () => { Server.stop() })) 143 | // context.subscriptions.push(commands.registerCommand('artisan.restartServer', () => { Server.restart() })) 144 | // context.subscriptions.push(commands.registerCommand('artisan.list', () => { })) 145 | 146 | // // Make commands 147 | // context.subscriptions.push(commands.registerCommand('artisan.make.auth', () => { })) 148 | // context.subscriptions.push(commands.registerCommand('artisan.make.cast', () => { })) 149 | // context.subscriptions.push(commands.registerCommand('artisan.make.channel', () => { })) 150 | // context.subscriptions.push(commands.registerCommand('artisan.make.command', () => { })) 151 | // context.subscriptions.push(commands.registerCommand('artisan.make.controller', () => { })) 152 | // context.subscriptions.push(commands.registerCommand('artisan.make.component', () => { })) 153 | // context.subscriptions.push(commands.registerCommand('artisan.make.factory', () => { })) 154 | // context.subscriptions.push(commands.registerCommand('artisan.make.event', () => { })) 155 | // context.subscriptions.push(commands.registerCommand('artisan.make.listener', () => { })) 156 | // context.subscriptions.push(commands.registerCommand('artisan.make.mail', () => { })) 157 | // context.subscriptions.push(commands.registerCommand('artisan.make.job', () => { })) 158 | // context.subscriptions.push(commands.registerCommand('artisan.make.middleware', () => { })) 159 | // context.subscriptions.push(commands.registerCommand('artisan.make.model', () => { })) 160 | // context.subscriptions.push(commands.registerCommand('artisan.make.migration', () => { })) 161 | // context.subscriptions.push(commands.registerCommand('artisan.make.notification', () => { })) 162 | // context.subscriptions.push(commands.registerCommand('artisan.make.observer', () => { })) 163 | // context.subscriptions.push(commands.registerCommand('artisan.make.policy', () => { })) 164 | // context.subscriptions.push(commands.registerCommand('artisan.make.provider', () => { })) 165 | // context.subscriptions.push(commands.registerCommand('artisan.make.request', () => { })) 166 | // context.subscriptions.push(commands.registerCommand('artisan.make.resource', () => { })) 167 | // context.subscriptions.push(commands.registerCommand('artisan.make.rule', () => { })) 168 | // context.subscriptions.push(commands.registerCommand('artisan.make.seeder', () => { })) 169 | // context.subscriptions.push(commands.registerCommand('artisan.make.test', () => { })) 170 | 171 | // // Migrate commands 172 | // context.subscriptions.push(commands.registerCommand('artisan.migrate.install', () => { })) 173 | // context.subscriptions.push(commands.registerCommand('artisan.migrate.refresh', () => { })) 174 | // context.subscriptions.push(commands.registerCommand('artisan.migrate.reset', () => { })) 175 | // context.subscriptions.push(commands.registerCommand('artisan.migrate.rollback', () => { })) 176 | // context.subscriptions.push(commands.registerCommand('artisan.migrate.status', () => { })) 177 | // context.subscriptions.push(commands.registerCommand('artisan.migrate.fresh', () => { })) 178 | 179 | // // Cache commands 180 | // context.subscriptions.push(commands.registerCommand('artisan.cache.clear', () => { })) 181 | // context.subscriptions.push(commands.registerCommand('artisan.cache.table', () => { })) 182 | 183 | // // Route commands 184 | // context.subscriptions.push(commands.registerCommand('artisan.route.cache', () => { })) 185 | // context.subscriptions.push(commands.registerCommand('artisan.route.clear', () => { })) 186 | // context.subscriptions.push(commands.registerCommand('artisan.route.refresh', () => { })) 187 | // context.subscriptions.push(commands.registerCommand('artisan.route.list', () => { })) 188 | 189 | // // Config commands 190 | // context.subscriptions.push(commands.registerCommand('artisan.config.cache', () => { })) 191 | // context.subscriptions.push(commands.registerCommand('artisan.config.clear', () => { })) 192 | // context.subscriptions.push(commands.registerCommand('artisan.config.refresh', () => { })) 193 | 194 | // // Key commands 195 | // context.subscriptions.push(commands.registerCommand('artisan.key.generate', () => { })) 196 | 197 | // // Event commands 198 | // context.subscriptions.push(commands.registerCommand('artisan.event.generate', () => { })) 199 | 200 | // // View commands 201 | // context.subscriptions.push(commands.registerCommand('artisan.view.clear', () => { })) 202 | 203 | // // All commands 204 | // context.subscriptions.push(commands.registerCommand('artisan.run.command', () => { })) 205 | 206 | // Register document provider for virtual files 207 | context.subscriptions.push(workspace.registerTextDocumentContentProvider('laravel-artisan', new TextDocumentProvider())); 208 | 209 | console.log('Laravel Artisan: activated'); 210 | } 211 | 212 | export function deactivate() { 213 | console.log('Laravel Artisan: deactivated'); 214 | Server.stop(); 215 | } 216 | -------------------------------------------------------------------------------- /src/utils/Output.ts: -------------------------------------------------------------------------------- 1 | import { window } from 'vscode' 2 | 3 | const outputConsole = window.createOutputChannel('Laravel Artisan') 4 | 5 | export default class Output { 6 | 7 | public static info(message: string) { 8 | outputConsole.appendLine(`[INFO] ${message}`) 9 | } 10 | 11 | public static command(message: string) { 12 | outputConsole.appendLine(`[CMD] ${message}`) 13 | } 14 | 15 | public static error(message: string) { 16 | outputConsole.appendLine(`[ERR] ${message}`) 17 | } 18 | 19 | public static warning(message: string) { 20 | outputConsole.appendLine(`[WARN] ${message}`) 21 | } 22 | 23 | public static showConsole() { 24 | outputConsole.show() 25 | } 26 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "lib": [ 7 | "es6" 8 | ], 9 | "sourceMap": true, 10 | "rootDir": ".", 11 | "skipLibCheck": true, 12 | }, 13 | "exclude": [ 14 | "node_modules", 15 | ".vscode-test" 16 | ] 17 | } -------------------------------------------------------------------------------- /typings.json: -------------------------------------------------------------------------------- 1 | { 2 | "globalDependencies": { 3 | "node": "registry:dt/node#6.0.0+20161212163245" 4 | } 5 | } 6 | --------------------------------------------------------------------------------