├── .gitignore ├── generate-hook ├── composer.json ├── hooks ├── zsh-completion └── bash-completion ├── README.md ├── src ├── BashCompletionPlugin.php └── ComposerCompletionCommand.php └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | -------------------------------------------------------------------------------- /generate-hook: -------------------------------------------------------------------------------- 1 | # Generate registration code to go in a shell profile 2 | 3 | _composercomplete_hook_dir="$(composer config home --global)/vendor/stecman/composer-bash-completion-plugin/hooks" 4 | 5 | echo "# Add tab auto-completion for composer" 6 | 7 | if [ ! -z $BASH_VERSION ]; then 8 | echo "source $_composercomplete_hook_dir/bash-completion" 9 | fi 10 | 11 | if [ ! -z $ZSH_VERSION ]; then 12 | echo "source $_composercomplete_hook_dir/zsh-completion" 13 | fi 14 | 15 | unset _composercomplete_hook_dir 16 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stecman/composer-bash-completion-plugin", 3 | "type": "composer-plugin", 4 | "description": "BASH/ZSH auto-complete plugin for Composer", 5 | "license": "MIT", 6 | "extra": { 7 | "class": "\\Stecman\\Component\\Symfony\\Console\\BashCompletion\\BashCompletionPlugin" 8 | }, 9 | "require": { 10 | "composer-plugin-api": "^1.0|^2.0", 11 | "stecman/symfony-console-completion": ">=0.7.0 <0.12.0" 12 | }, 13 | "require-dev": { 14 | "composer/composer": "^1.8|^2.0" 15 | }, 16 | "autoload": { 17 | "psr-4": { 18 | "Stecman\\Component\\Symfony\\Console\\BashCompletion\\": "src" 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /hooks/zsh-completion: -------------------------------------------------------------------------------- 1 | # Modified version of what `composer _completion -g -p composer` generates 2 | # Composer will only load plugins when a valid composer.json is in its working directory, 3 | # so for this hack to work, we are always running the completion command in ~/.composer 4 | function _composer { 5 | local -x CMDLINE_CONTENTS="$words"; 6 | local -x CMDLINE_CURSOR_INDEX; 7 | (( CMDLINE_CURSOR_INDEX = ${#${(j. .)words[1,CURRENT]}} )); 8 | 9 | # Run using the program being completed 10 | local -x COMPOSER_CWD="$PWD"; 11 | local COMPOSER="$words[1]" 12 | 13 | # Query and cache where the global composer.json lives 14 | if [ -z "$_composer_config_dir" ]; then 15 | _composer_config_dir="$($COMPOSER config home --global)" 16 | fi 17 | 18 | local RESULT STATUS; 19 | RESULT=("${(@f)$( cd $_composer_config_dir && COMPLETION_OPTIONS='--shell-type zsh' $COMPOSER depends _completion )}"); 20 | STATUS=$?; 21 | 22 | if [ $STATUS -eq 200 ]; then 23 | _path_files; 24 | return 0; 25 | 26 | elif [ $STATUS -ne 0 ]; then 27 | echo -e "$RESULT"; 28 | return $?; 29 | fi; 30 | 31 | compadd -- $RESULT; 32 | }; 33 | 34 | compdef _composer composer; 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BASH/ZSH auto-complete plugin for Composer 2 | 3 | This is an experimental hack to add [Symfony BASH auto complete](https://github.com/stecman/symfony-console-completion) to Composer via a plugin. It's a pretty slimy hack, but it works without editing Composer's code. 4 | 5 | ![Composer BASH completion](https://i.imgur.com/MoDWkby.gif) 6 | 7 | ## Installation 8 | 9 | 1. Install the plugin: 10 | 11 | ``` 12 | composer global require stecman/composer-bash-completion-plugin dev-master 13 | ``` 14 | 15 | 2. Generate code to register a completion hook for your shell and Composer configuration: 16 | 17 | ``` 18 | source $(composer config home --global)/vendor/stecman/composer-bash-completion-plugin/generate-hook 19 | ``` 20 | 21 | 3. Add the registration code to your shell profile: 22 | 23 | - If you're using BASH, copy the output to your `~/.bash_profile` 24 | - If you're using ZSH, copy the output to your `~/.zshrc` 25 | 26 | 4. Reload your modified shell config (or open a new shell), and enjoy tab completion on Composer 27 | 28 | ## Explanation 29 | 30 | This hacky plugin injects an additional command into the Composer application at runtime. When the plugin in this package is activated and the command line starts with `composer depends _completion`, the plugin effectively reboots the application with the completion command added, and drops `depends` from the command line so that `_completion` becomes the command argument. This used to work without piggy-backing on a command, but an update to composer stopped the original method working (#8). 31 | -------------------------------------------------------------------------------- /hooks/bash-completion: -------------------------------------------------------------------------------- 1 | # Modified version of what `composer _completion -g -p composer` generates 2 | # Composer will only load plugins when a valid composer.json is in its working directory, 3 | # so for this hack to work, we are always running the completion command in ~/.composer 4 | function _composercomplete { 5 | local CMDLINE_CONTENTS="$COMP_LINE"; 6 | local CMDLINE_CURSOR_INDEX="$COMP_POINT"; 7 | local CMDLINE_WORDBREAKS="$COMP_WORDBREAKS"; 8 | 9 | export CMDLINE_CONTENTS CMDLINE_CURSOR_INDEX CMDLINE_WORDBREAKS; 10 | 11 | # Run using the program being completed 12 | local COMPOSER_CWD="$PWD"; 13 | local composer="$1" 14 | 15 | # Query and cache where the global composer.json lives 16 | if [ -z "$_composer_config_dir" ]; then 17 | _composer_config_dir="$($composer config home --global)" 18 | fi 19 | 20 | local RESULT STATUS; 21 | 22 | local IFS=$'\n'; 23 | 24 | RESULT="$(cd "$_composer_config_dir" && COMPLETION_OPTIONS='--shell-type bash' $composer depends _completion &2 echo "Completion was not registered for composer:"; 54 | >&2 echo "The 'bash-completion' package is required but doesn't appear to be installed."; 55 | fi; 56 | -------------------------------------------------------------------------------- /src/BashCompletionPlugin.php: -------------------------------------------------------------------------------- 1 | setCommandLine('discarded_arg ' . getenv('COMPLETION_OPTIONS')); 40 | $extraArgs = $parser->getWords(); 41 | array_shift($extraArgs); 42 | array_push($argv, ...$extraArgs); 43 | 44 | $input = new ArgvInput($argv); 45 | 46 | $application->add(new ComposerCompletionCommand()); 47 | $application->run($input); 48 | die(); 49 | } 50 | } 51 | 52 | public function deactivate(Composer $composer, IOInterface $io) 53 | { 54 | // Required method in Composer 2.x 55 | } 56 | 57 | public function uninstall(Composer $composer, IOInterface $io) 58 | { 59 | // Required method in Composer 2.x 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/ComposerCompletionCommand.php: -------------------------------------------------------------------------------- 1 | handler->getContext(); 19 | $words = $context->getWords(); 20 | 21 | // Allow completions for composer global/g 22 | if (isset($words[1]) && ($words[1] === 'global' || $words[1] === 'g')) { 23 | 24 | // Adjust for the removal of the word 'global'/'g' 25 | $replace = function($matches) use ($context) { 26 | $context->setCharIndex($context->getCharIndex() - strlen($matches[0])); 27 | return ''; 28 | }; 29 | 30 | $context->setCommandLine( 31 | preg_replace_callback('/ (global|g)/', $replace, $context->getCommandLine(), 1) 32 | ); 33 | 34 | $this->isGlobal = true; 35 | } 36 | 37 | // Complete for composer.json in current directory 38 | if ($this->isGlobal) { 39 | $composerFile = getcwd() . '/composer.json'; 40 | } else { 41 | $workingDir = getenv('COMPOSER_CWD'); 42 | $composerFile = $workingDir . '/composer.json'; 43 | } 44 | 45 | if (file_exists($composerFile)) { 46 | $this->addProjectLocalCompletions( 47 | json_decode(file_get_contents($composerFile), true) 48 | ); 49 | } 50 | 51 | // Complete for `help` command's `command` argument 52 | $application = $this->getApplication(); 53 | $this->handler->addHandler( 54 | new Completion( 55 | 'help', 56 | 'command_name', 57 | Completion::TYPE_ARGUMENT, 58 | function() use ($application) { 59 | $names = array_keys($application->all()); 60 | 61 | if ($key = array_search('_completion', $names)) { 62 | unset($names[$key]); 63 | } 64 | 65 | return $names; 66 | } 67 | ) 68 | ); 69 | 70 | return $this->handler->runCompletion(); 71 | } 72 | 73 | /** 74 | * Setup completions that require a composer.json file to work 75 | * @param array $config - parsed composer.json 76 | */ 77 | protected function addProjectLocalCompletions($config) 78 | { 79 | $packages = $this->getRequiredPackages($config); 80 | 81 | $completeRequiredPackages = function() use ($packages) { 82 | return $packages; 83 | }; 84 | 85 | // Complete for `remove` and `update` commands `packages` argument 86 | $this->handler->addHandler(new Completion('remove', 'packages', Completion::TYPE_ARGUMENT, $completeRequiredPackages)); 87 | $this->handler->addHandler(new Completion('update', 'packages', Completion::TYPE_ARGUMENT, $completeRequiredPackages)); 88 | } 89 | 90 | /** 91 | * Get a list of package names that are required in a composer.json config 92 | * @param array $config 93 | * @return array 94 | */ 95 | protected function getRequiredPackages($config) 96 | { 97 | $packages = array(); 98 | 99 | if (isset($config['require'])) { 100 | $packages = array_merge($packages, array_keys($config['require'])); 101 | } 102 | 103 | if (isset($config['require-dev'])) { 104 | $packages = array_merge($packages, array_keys($config['require-dev'])); 105 | } 106 | 107 | return $packages; 108 | } 109 | } -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "6bb70ce836af4dc9fb846c873ffe1876", 8 | "packages": [ 9 | { 10 | "name": "psr/container", 11 | "version": "1.0.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/php-fig/container.git", 15 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 20 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.3.0" 25 | }, 26 | "type": "library", 27 | "extra": { 28 | "branch-alias": { 29 | "dev-master": "1.0.x-dev" 30 | } 31 | }, 32 | "autoload": { 33 | "psr-4": { 34 | "Psr\\Container\\": "src/" 35 | } 36 | }, 37 | "notification-url": "https://packagist.org/downloads/", 38 | "license": [ 39 | "MIT" 40 | ], 41 | "authors": [ 42 | { 43 | "name": "PHP-FIG", 44 | "homepage": "http://www.php-fig.org/" 45 | } 46 | ], 47 | "description": "Common Container Interface (PHP FIG PSR-11)", 48 | "homepage": "https://github.com/php-fig/container", 49 | "keywords": [ 50 | "PSR-11", 51 | "container", 52 | "container-interface", 53 | "container-interop", 54 | "psr" 55 | ], 56 | "time": "2017-02-14T16:28:37+00:00" 57 | }, 58 | { 59 | "name": "stecman/symfony-console-completion", 60 | "version": "0.11.0", 61 | "source": { 62 | "type": "git", 63 | "url": "https://github.com/stecman/symfony-console-completion.git", 64 | "reference": "a9502dab59405e275a9f264536c4e1cb61fc3518" 65 | }, 66 | "dist": { 67 | "type": "zip", 68 | "url": "https://api.github.com/repos/stecman/symfony-console-completion/zipball/a9502dab59405e275a9f264536c4e1cb61fc3518", 69 | "reference": "a9502dab59405e275a9f264536c4e1cb61fc3518", 70 | "shasum": "" 71 | }, 72 | "require": { 73 | "php": ">=5.3.2", 74 | "symfony/console": "~2.3 || ~3.0 || ~4.0 || ~5.0" 75 | }, 76 | "require-dev": { 77 | "phpunit/phpunit": "~4.8.36 || ~5.7 || ~6.4" 78 | }, 79 | "type": "library", 80 | "extra": { 81 | "branch-alias": { 82 | "dev-master": "0.10.x-dev" 83 | } 84 | }, 85 | "autoload": { 86 | "psr-4": { 87 | "Stecman\\Component\\Symfony\\Console\\BashCompletion\\": "src/" 88 | } 89 | }, 90 | "notification-url": "https://packagist.org/downloads/", 91 | "license": [ 92 | "MIT" 93 | ], 94 | "authors": [ 95 | { 96 | "name": "Stephen Holdaway", 97 | "email": "stephen@stecman.co.nz" 98 | } 99 | ], 100 | "description": "Automatic BASH completion for Symfony Console Component based applications.", 101 | "time": "2019-11-24T17:03:06+00:00" 102 | }, 103 | { 104 | "name": "symfony/console", 105 | "version": "v5.0.6", 106 | "source": { 107 | "type": "git", 108 | "url": "https://github.com/symfony/console.git", 109 | "reference": "0085aec018950e1161bdf6bcb19fcb0828308cfc" 110 | }, 111 | "dist": { 112 | "type": "zip", 113 | "url": "https://api.github.com/repos/symfony/console/zipball/0085aec018950e1161bdf6bcb19fcb0828308cfc", 114 | "reference": "0085aec018950e1161bdf6bcb19fcb0828308cfc", 115 | "shasum": "" 116 | }, 117 | "require": { 118 | "php": "^7.2.5", 119 | "symfony/polyfill-mbstring": "~1.0", 120 | "symfony/polyfill-php73": "^1.8", 121 | "symfony/service-contracts": "^1.1|^2" 122 | }, 123 | "conflict": { 124 | "symfony/dependency-injection": "<4.4", 125 | "symfony/event-dispatcher": "<4.4", 126 | "symfony/lock": "<4.4", 127 | "symfony/process": "<4.4" 128 | }, 129 | "provide": { 130 | "psr/log-implementation": "1.0" 131 | }, 132 | "require-dev": { 133 | "psr/log": "~1.0", 134 | "symfony/config": "^4.4|^5.0", 135 | "symfony/dependency-injection": "^4.4|^5.0", 136 | "symfony/event-dispatcher": "^4.4|^5.0", 137 | "symfony/lock": "^4.4|^5.0", 138 | "symfony/process": "^4.4|^5.0", 139 | "symfony/var-dumper": "^4.4|^5.0" 140 | }, 141 | "suggest": { 142 | "psr/log": "For using the console logger", 143 | "symfony/event-dispatcher": "", 144 | "symfony/lock": "", 145 | "symfony/process": "" 146 | }, 147 | "type": "library", 148 | "extra": { 149 | "branch-alias": { 150 | "dev-master": "5.0-dev" 151 | } 152 | }, 153 | "autoload": { 154 | "psr-4": { 155 | "Symfony\\Component\\Console\\": "" 156 | }, 157 | "exclude-from-classmap": [ 158 | "/Tests/" 159 | ] 160 | }, 161 | "notification-url": "https://packagist.org/downloads/", 162 | "license": [ 163 | "MIT" 164 | ], 165 | "authors": [ 166 | { 167 | "name": "Fabien Potencier", 168 | "email": "fabien@symfony.com" 169 | }, 170 | { 171 | "name": "Symfony Community", 172 | "homepage": "https://symfony.com/contributors" 173 | } 174 | ], 175 | "description": "Symfony Console Component", 176 | "homepage": "https://symfony.com", 177 | "funding": [ 178 | { 179 | "url": "https://symfony.com/sponsor", 180 | "type": "custom" 181 | }, 182 | { 183 | "url": "https://github.com/fabpot", 184 | "type": "github" 185 | }, 186 | { 187 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 188 | "type": "tidelift" 189 | } 190 | ], 191 | "time": "2020-03-16T13:02:39+00:00" 192 | }, 193 | { 194 | "name": "symfony/polyfill-mbstring", 195 | "version": "v1.15.0", 196 | "source": { 197 | "type": "git", 198 | "url": "https://github.com/symfony/polyfill-mbstring.git", 199 | "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac" 200 | }, 201 | "dist": { 202 | "type": "zip", 203 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac", 204 | "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac", 205 | "shasum": "" 206 | }, 207 | "require": { 208 | "php": ">=5.3.3" 209 | }, 210 | "suggest": { 211 | "ext-mbstring": "For best performance" 212 | }, 213 | "type": "library", 214 | "extra": { 215 | "branch-alias": { 216 | "dev-master": "1.15-dev" 217 | } 218 | }, 219 | "autoload": { 220 | "psr-4": { 221 | "Symfony\\Polyfill\\Mbstring\\": "" 222 | }, 223 | "files": [ 224 | "bootstrap.php" 225 | ] 226 | }, 227 | "notification-url": "https://packagist.org/downloads/", 228 | "license": [ 229 | "MIT" 230 | ], 231 | "authors": [ 232 | { 233 | "name": "Nicolas Grekas", 234 | "email": "p@tchwork.com" 235 | }, 236 | { 237 | "name": "Symfony Community", 238 | "homepage": "https://symfony.com/contributors" 239 | } 240 | ], 241 | "description": "Symfony polyfill for the Mbstring extension", 242 | "homepage": "https://symfony.com", 243 | "keywords": [ 244 | "compatibility", 245 | "mbstring", 246 | "polyfill", 247 | "portable", 248 | "shim" 249 | ], 250 | "funding": [ 251 | { 252 | "url": "https://symfony.com/sponsor", 253 | "type": "custom" 254 | }, 255 | { 256 | "url": "https://github.com/fabpot", 257 | "type": "github" 258 | }, 259 | { 260 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 261 | "type": "tidelift" 262 | } 263 | ], 264 | "time": "2020-03-09T19:04:49+00:00" 265 | }, 266 | { 267 | "name": "symfony/polyfill-php73", 268 | "version": "v1.15.0", 269 | "source": { 270 | "type": "git", 271 | "url": "https://github.com/symfony/polyfill-php73.git", 272 | "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7" 273 | }, 274 | "dist": { 275 | "type": "zip", 276 | "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7", 277 | "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7", 278 | "shasum": "" 279 | }, 280 | "require": { 281 | "php": ">=5.3.3" 282 | }, 283 | "type": "library", 284 | "extra": { 285 | "branch-alias": { 286 | "dev-master": "1.15-dev" 287 | } 288 | }, 289 | "autoload": { 290 | "psr-4": { 291 | "Symfony\\Polyfill\\Php73\\": "" 292 | }, 293 | "files": [ 294 | "bootstrap.php" 295 | ], 296 | "classmap": [ 297 | "Resources/stubs" 298 | ] 299 | }, 300 | "notification-url": "https://packagist.org/downloads/", 301 | "license": [ 302 | "MIT" 303 | ], 304 | "authors": [ 305 | { 306 | "name": "Nicolas Grekas", 307 | "email": "p@tchwork.com" 308 | }, 309 | { 310 | "name": "Symfony Community", 311 | "homepage": "https://symfony.com/contributors" 312 | } 313 | ], 314 | "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 315 | "homepage": "https://symfony.com", 316 | "keywords": [ 317 | "compatibility", 318 | "polyfill", 319 | "portable", 320 | "shim" 321 | ], 322 | "funding": [ 323 | { 324 | "url": "https://symfony.com/sponsor", 325 | "type": "custom" 326 | }, 327 | { 328 | "url": "https://github.com/fabpot", 329 | "type": "github" 330 | }, 331 | { 332 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 333 | "type": "tidelift" 334 | } 335 | ], 336 | "time": "2020-02-27T09:26:54+00:00" 337 | }, 338 | { 339 | "name": "symfony/service-contracts", 340 | "version": "v2.0.1", 341 | "source": { 342 | "type": "git", 343 | "url": "https://github.com/symfony/service-contracts.git", 344 | "reference": "144c5e51266b281231e947b51223ba14acf1a749" 345 | }, 346 | "dist": { 347 | "type": "zip", 348 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/144c5e51266b281231e947b51223ba14acf1a749", 349 | "reference": "144c5e51266b281231e947b51223ba14acf1a749", 350 | "shasum": "" 351 | }, 352 | "require": { 353 | "php": "^7.2.5", 354 | "psr/container": "^1.0" 355 | }, 356 | "suggest": { 357 | "symfony/service-implementation": "" 358 | }, 359 | "type": "library", 360 | "extra": { 361 | "branch-alias": { 362 | "dev-master": "2.0-dev" 363 | } 364 | }, 365 | "autoload": { 366 | "psr-4": { 367 | "Symfony\\Contracts\\Service\\": "" 368 | } 369 | }, 370 | "notification-url": "https://packagist.org/downloads/", 371 | "license": [ 372 | "MIT" 373 | ], 374 | "authors": [ 375 | { 376 | "name": "Nicolas Grekas", 377 | "email": "p@tchwork.com" 378 | }, 379 | { 380 | "name": "Symfony Community", 381 | "homepage": "https://symfony.com/contributors" 382 | } 383 | ], 384 | "description": "Generic abstractions related to writing services", 385 | "homepage": "https://symfony.com", 386 | "keywords": [ 387 | "abstractions", 388 | "contracts", 389 | "decoupling", 390 | "interfaces", 391 | "interoperability", 392 | "standards" 393 | ], 394 | "time": "2019-11-18T17:27:11+00:00" 395 | } 396 | ], 397 | "packages-dev": [ 398 | { 399 | "name": "composer/ca-bundle", 400 | "version": "1.2.6", 401 | "source": { 402 | "type": "git", 403 | "url": "https://github.com/composer/ca-bundle.git", 404 | "reference": "47fe531de31fca4a1b997f87308e7d7804348f7e" 405 | }, 406 | "dist": { 407 | "type": "zip", 408 | "url": "https://api.github.com/repos/composer/ca-bundle/zipball/47fe531de31fca4a1b997f87308e7d7804348f7e", 409 | "reference": "47fe531de31fca4a1b997f87308e7d7804348f7e", 410 | "shasum": "" 411 | }, 412 | "require": { 413 | "ext-openssl": "*", 414 | "ext-pcre": "*", 415 | "php": "^5.3.2 || ^7.0 || ^8.0" 416 | }, 417 | "require-dev": { 418 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", 419 | "psr/log": "^1.0", 420 | "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" 421 | }, 422 | "type": "library", 423 | "extra": { 424 | "branch-alias": { 425 | "dev-master": "1.x-dev" 426 | } 427 | }, 428 | "autoload": { 429 | "psr-4": { 430 | "Composer\\CaBundle\\": "src" 431 | } 432 | }, 433 | "notification-url": "https://packagist.org/downloads/", 434 | "license": [ 435 | "MIT" 436 | ], 437 | "authors": [ 438 | { 439 | "name": "Jordi Boggiano", 440 | "email": "j.boggiano@seld.be", 441 | "homepage": "http://seld.be" 442 | } 443 | ], 444 | "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", 445 | "keywords": [ 446 | "cabundle", 447 | "cacert", 448 | "certificate", 449 | "ssl", 450 | "tls" 451 | ], 452 | "time": "2020-01-13T10:02:55+00:00" 453 | }, 454 | { 455 | "name": "composer/composer", 456 | "version": "1.10.1", 457 | "source": { 458 | "type": "git", 459 | "url": "https://github.com/composer/composer.git", 460 | "reference": "b912a45da3e2b22f5cb5a23e441b697a295ba011" 461 | }, 462 | "dist": { 463 | "type": "zip", 464 | "url": "https://api.github.com/repos/composer/composer/zipball/b912a45da3e2b22f5cb5a23e441b697a295ba011", 465 | "reference": "b912a45da3e2b22f5cb5a23e441b697a295ba011", 466 | "shasum": "" 467 | }, 468 | "require": { 469 | "composer/ca-bundle": "^1.0", 470 | "composer/semver": "^1.0", 471 | "composer/spdx-licenses": "^1.2", 472 | "composer/xdebug-handler": "^1.1", 473 | "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0", 474 | "php": "^5.3.2 || ^7.0", 475 | "psr/log": "^1.0", 476 | "seld/jsonlint": "^1.4", 477 | "seld/phar-utils": "^1.0", 478 | "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", 479 | "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0", 480 | "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0", 481 | "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" 482 | }, 483 | "conflict": { 484 | "symfony/console": "2.8.38" 485 | }, 486 | "require-dev": { 487 | "phpspec/prophecy": "^1.10", 488 | "symfony/phpunit-bridge": "^3.4" 489 | }, 490 | "suggest": { 491 | "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", 492 | "ext-zip": "Enabling the zip extension allows you to unzip archives", 493 | "ext-zlib": "Allow gzip compression of HTTP requests" 494 | }, 495 | "bin": [ 496 | "bin/composer" 497 | ], 498 | "type": "library", 499 | "extra": { 500 | "branch-alias": { 501 | "dev-master": "1.10-dev" 502 | } 503 | }, 504 | "autoload": { 505 | "psr-4": { 506 | "Composer\\": "src/Composer" 507 | } 508 | }, 509 | "notification-url": "https://packagist.org/downloads/", 510 | "license": [ 511 | "MIT" 512 | ], 513 | "authors": [ 514 | { 515 | "name": "Nils Adermann", 516 | "email": "naderman@naderman.de", 517 | "homepage": "http://www.naderman.de" 518 | }, 519 | { 520 | "name": "Jordi Boggiano", 521 | "email": "j.boggiano@seld.be", 522 | "homepage": "http://seld.be" 523 | } 524 | ], 525 | "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", 526 | "homepage": "https://getcomposer.org/", 527 | "keywords": [ 528 | "autoload", 529 | "dependency", 530 | "package" 531 | ], 532 | "funding": [ 533 | { 534 | "url": "https://packagist.com", 535 | "type": "custom" 536 | }, 537 | { 538 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 539 | "type": "tidelift" 540 | } 541 | ], 542 | "time": "2020-03-13T19:34:27+00:00" 543 | }, 544 | { 545 | "name": "composer/semver", 546 | "version": "1.5.1", 547 | "source": { 548 | "type": "git", 549 | "url": "https://github.com/composer/semver.git", 550 | "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de" 551 | }, 552 | "dist": { 553 | "type": "zip", 554 | "url": "https://api.github.com/repos/composer/semver/zipball/c6bea70230ef4dd483e6bbcab6005f682ed3a8de", 555 | "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de", 556 | "shasum": "" 557 | }, 558 | "require": { 559 | "php": "^5.3.2 || ^7.0" 560 | }, 561 | "require-dev": { 562 | "phpunit/phpunit": "^4.5 || ^5.0.5" 563 | }, 564 | "type": "library", 565 | "extra": { 566 | "branch-alias": { 567 | "dev-master": "1.x-dev" 568 | } 569 | }, 570 | "autoload": { 571 | "psr-4": { 572 | "Composer\\Semver\\": "src" 573 | } 574 | }, 575 | "notification-url": "https://packagist.org/downloads/", 576 | "license": [ 577 | "MIT" 578 | ], 579 | "authors": [ 580 | { 581 | "name": "Nils Adermann", 582 | "email": "naderman@naderman.de", 583 | "homepage": "http://www.naderman.de" 584 | }, 585 | { 586 | "name": "Jordi Boggiano", 587 | "email": "j.boggiano@seld.be", 588 | "homepage": "http://seld.be" 589 | }, 590 | { 591 | "name": "Rob Bast", 592 | "email": "rob.bast@gmail.com", 593 | "homepage": "http://robbast.nl" 594 | } 595 | ], 596 | "description": "Semver library that offers utilities, version constraint parsing and validation.", 597 | "keywords": [ 598 | "semantic", 599 | "semver", 600 | "validation", 601 | "versioning" 602 | ], 603 | "time": "2020-01-13T12:06:48+00:00" 604 | }, 605 | { 606 | "name": "composer/spdx-licenses", 607 | "version": "1.5.3", 608 | "source": { 609 | "type": "git", 610 | "url": "https://github.com/composer/spdx-licenses.git", 611 | "reference": "0c3e51e1880ca149682332770e25977c70cf9dae" 612 | }, 613 | "dist": { 614 | "type": "zip", 615 | "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/0c3e51e1880ca149682332770e25977c70cf9dae", 616 | "reference": "0c3e51e1880ca149682332770e25977c70cf9dae", 617 | "shasum": "" 618 | }, 619 | "require": { 620 | "php": "^5.3.2 || ^7.0 || ^8.0" 621 | }, 622 | "require-dev": { 623 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" 624 | }, 625 | "type": "library", 626 | "extra": { 627 | "branch-alias": { 628 | "dev-master": "1.x-dev" 629 | } 630 | }, 631 | "autoload": { 632 | "psr-4": { 633 | "Composer\\Spdx\\": "src" 634 | } 635 | }, 636 | "notification-url": "https://packagist.org/downloads/", 637 | "license": [ 638 | "MIT" 639 | ], 640 | "authors": [ 641 | { 642 | "name": "Nils Adermann", 643 | "email": "naderman@naderman.de", 644 | "homepage": "http://www.naderman.de" 645 | }, 646 | { 647 | "name": "Jordi Boggiano", 648 | "email": "j.boggiano@seld.be", 649 | "homepage": "http://seld.be" 650 | }, 651 | { 652 | "name": "Rob Bast", 653 | "email": "rob.bast@gmail.com", 654 | "homepage": "http://robbast.nl" 655 | } 656 | ], 657 | "description": "SPDX licenses list and validation library.", 658 | "keywords": [ 659 | "license", 660 | "spdx", 661 | "validator" 662 | ], 663 | "time": "2020-02-14T07:44:31+00:00" 664 | }, 665 | { 666 | "name": "composer/xdebug-handler", 667 | "version": "1.4.1", 668 | "source": { 669 | "type": "git", 670 | "url": "https://github.com/composer/xdebug-handler.git", 671 | "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7" 672 | }, 673 | "dist": { 674 | "type": "zip", 675 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7", 676 | "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7", 677 | "shasum": "" 678 | }, 679 | "require": { 680 | "php": "^5.3.2 || ^7.0 || ^8.0", 681 | "psr/log": "^1.0" 682 | }, 683 | "require-dev": { 684 | "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" 685 | }, 686 | "type": "library", 687 | "autoload": { 688 | "psr-4": { 689 | "Composer\\XdebugHandler\\": "src" 690 | } 691 | }, 692 | "notification-url": "https://packagist.org/downloads/", 693 | "license": [ 694 | "MIT" 695 | ], 696 | "authors": [ 697 | { 698 | "name": "John Stevenson", 699 | "email": "john-stevenson@blueyonder.co.uk" 700 | } 701 | ], 702 | "description": "Restarts a process without Xdebug.", 703 | "keywords": [ 704 | "Xdebug", 705 | "performance" 706 | ], 707 | "funding": [ 708 | { 709 | "url": "https://packagist.com", 710 | "type": "custom" 711 | } 712 | ], 713 | "time": "2020-03-01T12:26:26+00:00" 714 | }, 715 | { 716 | "name": "justinrainbow/json-schema", 717 | "version": "5.2.9", 718 | "source": { 719 | "type": "git", 720 | "url": "https://github.com/justinrainbow/json-schema.git", 721 | "reference": "44c6787311242a979fa15c704327c20e7221a0e4" 722 | }, 723 | "dist": { 724 | "type": "zip", 725 | "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/44c6787311242a979fa15c704327c20e7221a0e4", 726 | "reference": "44c6787311242a979fa15c704327c20e7221a0e4", 727 | "shasum": "" 728 | }, 729 | "require": { 730 | "php": ">=5.3.3" 731 | }, 732 | "require-dev": { 733 | "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", 734 | "json-schema/json-schema-test-suite": "1.2.0", 735 | "phpunit/phpunit": "^4.8.35" 736 | }, 737 | "bin": [ 738 | "bin/validate-json" 739 | ], 740 | "type": "library", 741 | "extra": { 742 | "branch-alias": { 743 | "dev-master": "5.0.x-dev" 744 | } 745 | }, 746 | "autoload": { 747 | "psr-4": { 748 | "JsonSchema\\": "src/JsonSchema/" 749 | } 750 | }, 751 | "notification-url": "https://packagist.org/downloads/", 752 | "license": [ 753 | "MIT" 754 | ], 755 | "authors": [ 756 | { 757 | "name": "Bruno Prieto Reis", 758 | "email": "bruno.p.reis@gmail.com" 759 | }, 760 | { 761 | "name": "Justin Rainbow", 762 | "email": "justin.rainbow@gmail.com" 763 | }, 764 | { 765 | "name": "Igor Wiedler", 766 | "email": "igor@wiedler.ch" 767 | }, 768 | { 769 | "name": "Robert Schönthal", 770 | "email": "seroscho@googlemail.com" 771 | } 772 | ], 773 | "description": "A library to validate a json schema.", 774 | "homepage": "https://github.com/justinrainbow/json-schema", 775 | "keywords": [ 776 | "json", 777 | "schema" 778 | ], 779 | "time": "2019-09-25T14:49:45+00:00" 780 | }, 781 | { 782 | "name": "psr/log", 783 | "version": "1.1.3", 784 | "source": { 785 | "type": "git", 786 | "url": "https://github.com/php-fig/log.git", 787 | "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" 788 | }, 789 | "dist": { 790 | "type": "zip", 791 | "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", 792 | "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", 793 | "shasum": "" 794 | }, 795 | "require": { 796 | "php": ">=5.3.0" 797 | }, 798 | "type": "library", 799 | "extra": { 800 | "branch-alias": { 801 | "dev-master": "1.1.x-dev" 802 | } 803 | }, 804 | "autoload": { 805 | "psr-4": { 806 | "Psr\\Log\\": "Psr/Log/" 807 | } 808 | }, 809 | "notification-url": "https://packagist.org/downloads/", 810 | "license": [ 811 | "MIT" 812 | ], 813 | "authors": [ 814 | { 815 | "name": "PHP-FIG", 816 | "homepage": "http://www.php-fig.org/" 817 | } 818 | ], 819 | "description": "Common interface for logging libraries", 820 | "homepage": "https://github.com/php-fig/log", 821 | "keywords": [ 822 | "log", 823 | "psr", 824 | "psr-3" 825 | ], 826 | "time": "2020-03-23T09:12:05+00:00" 827 | }, 828 | { 829 | "name": "seld/jsonlint", 830 | "version": "1.7.2", 831 | "source": { 832 | "type": "git", 833 | "url": "https://github.com/Seldaek/jsonlint.git", 834 | "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19" 835 | }, 836 | "dist": { 837 | "type": "zip", 838 | "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/e2e5d290e4d2a4f0eb449f510071392e00e10d19", 839 | "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19", 840 | "shasum": "" 841 | }, 842 | "require": { 843 | "php": "^5.3 || ^7.0" 844 | }, 845 | "require-dev": { 846 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 847 | }, 848 | "bin": [ 849 | "bin/jsonlint" 850 | ], 851 | "type": "library", 852 | "autoload": { 853 | "psr-4": { 854 | "Seld\\JsonLint\\": "src/Seld/JsonLint/" 855 | } 856 | }, 857 | "notification-url": "https://packagist.org/downloads/", 858 | "license": [ 859 | "MIT" 860 | ], 861 | "authors": [ 862 | { 863 | "name": "Jordi Boggiano", 864 | "email": "j.boggiano@seld.be", 865 | "homepage": "http://seld.be" 866 | } 867 | ], 868 | "description": "JSON Linter", 869 | "keywords": [ 870 | "json", 871 | "linter", 872 | "parser", 873 | "validator" 874 | ], 875 | "time": "2019-10-24T14:27:39+00:00" 876 | }, 877 | { 878 | "name": "seld/phar-utils", 879 | "version": "1.1.0", 880 | "source": { 881 | "type": "git", 882 | "url": "https://github.com/Seldaek/phar-utils.git", 883 | "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0" 884 | }, 885 | "dist": { 886 | "type": "zip", 887 | "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0", 888 | "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0", 889 | "shasum": "" 890 | }, 891 | "require": { 892 | "php": ">=5.3" 893 | }, 894 | "type": "library", 895 | "extra": { 896 | "branch-alias": { 897 | "dev-master": "1.x-dev" 898 | } 899 | }, 900 | "autoload": { 901 | "psr-4": { 902 | "Seld\\PharUtils\\": "src/" 903 | } 904 | }, 905 | "notification-url": "https://packagist.org/downloads/", 906 | "license": [ 907 | "MIT" 908 | ], 909 | "authors": [ 910 | { 911 | "name": "Jordi Boggiano", 912 | "email": "j.boggiano@seld.be" 913 | } 914 | ], 915 | "description": "PHAR file format utilities, for when PHP phars you up", 916 | "keywords": [ 917 | "phar" 918 | ], 919 | "time": "2020-02-14T15:25:33+00:00" 920 | }, 921 | { 922 | "name": "symfony/filesystem", 923 | "version": "v5.0.6", 924 | "source": { 925 | "type": "git", 926 | "url": "https://github.com/symfony/filesystem.git", 927 | "reference": "81daae1bc46cb8eef557f5faa36e9c785f983db1" 928 | }, 929 | "dist": { 930 | "type": "zip", 931 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/81daae1bc46cb8eef557f5faa36e9c785f983db1", 932 | "reference": "81daae1bc46cb8eef557f5faa36e9c785f983db1", 933 | "shasum": "" 934 | }, 935 | "require": { 936 | "php": "^7.2.5", 937 | "symfony/polyfill-ctype": "~1.8" 938 | }, 939 | "type": "library", 940 | "extra": { 941 | "branch-alias": { 942 | "dev-master": "5.0-dev" 943 | } 944 | }, 945 | "autoload": { 946 | "psr-4": { 947 | "Symfony\\Component\\Filesystem\\": "" 948 | }, 949 | "exclude-from-classmap": [ 950 | "/Tests/" 951 | ] 952 | }, 953 | "notification-url": "https://packagist.org/downloads/", 954 | "license": [ 955 | "MIT" 956 | ], 957 | "authors": [ 958 | { 959 | "name": "Fabien Potencier", 960 | "email": "fabien@symfony.com" 961 | }, 962 | { 963 | "name": "Symfony Community", 964 | "homepage": "https://symfony.com/contributors" 965 | } 966 | ], 967 | "description": "Symfony Filesystem Component", 968 | "homepage": "https://symfony.com", 969 | "funding": [ 970 | { 971 | "url": "https://symfony.com/sponsor", 972 | "type": "custom" 973 | }, 974 | { 975 | "url": "https://github.com/fabpot", 976 | "type": "github" 977 | }, 978 | { 979 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 980 | "type": "tidelift" 981 | } 982 | ], 983 | "time": "2020-03-16T13:02:39+00:00" 984 | }, 985 | { 986 | "name": "symfony/finder", 987 | "version": "v5.0.6", 988 | "source": { 989 | "type": "git", 990 | "url": "https://github.com/symfony/finder.git", 991 | "reference": "6251f201187ca9d66f6b099d3de65d279e971138" 992 | }, 993 | "dist": { 994 | "type": "zip", 995 | "url": "https://api.github.com/repos/symfony/finder/zipball/6251f201187ca9d66f6b099d3de65d279e971138", 996 | "reference": "6251f201187ca9d66f6b099d3de65d279e971138", 997 | "shasum": "" 998 | }, 999 | "require": { 1000 | "php": "^7.2.5" 1001 | }, 1002 | "type": "library", 1003 | "extra": { 1004 | "branch-alias": { 1005 | "dev-master": "5.0-dev" 1006 | } 1007 | }, 1008 | "autoload": { 1009 | "psr-4": { 1010 | "Symfony\\Component\\Finder\\": "" 1011 | }, 1012 | "exclude-from-classmap": [ 1013 | "/Tests/" 1014 | ] 1015 | }, 1016 | "notification-url": "https://packagist.org/downloads/", 1017 | "license": [ 1018 | "MIT" 1019 | ], 1020 | "authors": [ 1021 | { 1022 | "name": "Fabien Potencier", 1023 | "email": "fabien@symfony.com" 1024 | }, 1025 | { 1026 | "name": "Symfony Community", 1027 | "homepage": "https://symfony.com/contributors" 1028 | } 1029 | ], 1030 | "description": "Symfony Finder Component", 1031 | "homepage": "https://symfony.com", 1032 | "time": "2020-02-14T07:43:07+00:00" 1033 | }, 1034 | { 1035 | "name": "symfony/polyfill-ctype", 1036 | "version": "v1.15.0", 1037 | "source": { 1038 | "type": "git", 1039 | "url": "https://github.com/symfony/polyfill-ctype.git", 1040 | "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14" 1041 | }, 1042 | "dist": { 1043 | "type": "zip", 1044 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/4719fa9c18b0464d399f1a63bf624b42b6fa8d14", 1045 | "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14", 1046 | "shasum": "" 1047 | }, 1048 | "require": { 1049 | "php": ">=5.3.3" 1050 | }, 1051 | "suggest": { 1052 | "ext-ctype": "For best performance" 1053 | }, 1054 | "type": "library", 1055 | "extra": { 1056 | "branch-alias": { 1057 | "dev-master": "1.15-dev" 1058 | } 1059 | }, 1060 | "autoload": { 1061 | "psr-4": { 1062 | "Symfony\\Polyfill\\Ctype\\": "" 1063 | }, 1064 | "files": [ 1065 | "bootstrap.php" 1066 | ] 1067 | }, 1068 | "notification-url": "https://packagist.org/downloads/", 1069 | "license": [ 1070 | "MIT" 1071 | ], 1072 | "authors": [ 1073 | { 1074 | "name": "Gert de Pagter", 1075 | "email": "BackEndTea@gmail.com" 1076 | }, 1077 | { 1078 | "name": "Symfony Community", 1079 | "homepage": "https://symfony.com/contributors" 1080 | } 1081 | ], 1082 | "description": "Symfony polyfill for ctype functions", 1083 | "homepage": "https://symfony.com", 1084 | "keywords": [ 1085 | "compatibility", 1086 | "ctype", 1087 | "polyfill", 1088 | "portable" 1089 | ], 1090 | "funding": [ 1091 | { 1092 | "url": "https://symfony.com/sponsor", 1093 | "type": "custom" 1094 | }, 1095 | { 1096 | "url": "https://github.com/fabpot", 1097 | "type": "github" 1098 | }, 1099 | { 1100 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1101 | "type": "tidelift" 1102 | } 1103 | ], 1104 | "time": "2020-02-27T09:26:54+00:00" 1105 | }, 1106 | { 1107 | "name": "symfony/process", 1108 | "version": "v5.0.6", 1109 | "source": { 1110 | "type": "git", 1111 | "url": "https://github.com/symfony/process.git", 1112 | "reference": "67abad0d1f1340424418f94cedadc367599ecb61" 1113 | }, 1114 | "dist": { 1115 | "type": "zip", 1116 | "url": "https://api.github.com/repos/symfony/process/zipball/67abad0d1f1340424418f94cedadc367599ecb61", 1117 | "reference": "67abad0d1f1340424418f94cedadc367599ecb61", 1118 | "shasum": "" 1119 | }, 1120 | "require": { 1121 | "php": "^7.2.5" 1122 | }, 1123 | "type": "library", 1124 | "extra": { 1125 | "branch-alias": { 1126 | "dev-master": "5.0-dev" 1127 | } 1128 | }, 1129 | "autoload": { 1130 | "psr-4": { 1131 | "Symfony\\Component\\Process\\": "" 1132 | }, 1133 | "exclude-from-classmap": [ 1134 | "/Tests/" 1135 | ] 1136 | }, 1137 | "notification-url": "https://packagist.org/downloads/", 1138 | "license": [ 1139 | "MIT" 1140 | ], 1141 | "authors": [ 1142 | { 1143 | "name": "Fabien Potencier", 1144 | "email": "fabien@symfony.com" 1145 | }, 1146 | { 1147 | "name": "Symfony Community", 1148 | "homepage": "https://symfony.com/contributors" 1149 | } 1150 | ], 1151 | "description": "Symfony Process Component", 1152 | "homepage": "https://symfony.com", 1153 | "funding": [ 1154 | { 1155 | "url": "https://symfony.com/sponsor", 1156 | "type": "custom" 1157 | }, 1158 | { 1159 | "url": "https://github.com/fabpot", 1160 | "type": "github" 1161 | }, 1162 | { 1163 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1164 | "type": "tidelift" 1165 | } 1166 | ], 1167 | "time": "2020-03-23T12:42:46+00:00" 1168 | } 1169 | ], 1170 | "aliases": [], 1171 | "minimum-stability": "stable", 1172 | "stability-flags": [], 1173 | "prefer-stable": false, 1174 | "prefer-lowest": false, 1175 | "platform": { 1176 | "composer-plugin-api": "^1.0" 1177 | }, 1178 | "platform-dev": [], 1179 | "plugin-api-version": "1.1.0" 1180 | } 1181 | --------------------------------------------------------------------------------