├── .distignore ├── .editorconfig ├── .gitignore ├── .phpcs.xml.dist ├── Gruntfile.js ├── composer.json ├── composer.lock ├── package-lock.json ├── package.json ├── phpstan.neon ├── readme.txt ├── src ├── class-mastodon-rss-api.php ├── class-sync-mastodon-admin.php ├── class-sync-mastodon-core.php ├── class-sync-mastodon-cron.php ├── class-sync-mastodon-meta-boxes.php ├── class-sync-mastodon-options.php ├── class-sync-mastodon-wp-cli.php ├── data │ ├── class-mastodon-media.php │ └── class-mastodon-post.php ├── post-types │ ├── class-mastodon-post.php │ └── mastodon-post.php └── taxonomies │ └── mastodon-tag.php ├── sync-mastodon.php └── vendor ├── autoload.php └── composer ├── ClassLoader.php ├── InstalledVersions.php ├── LICENSE ├── autoload_classmap.php ├── autoload_namespaces.php ├── autoload_psr4.php ├── autoload_real.php ├── autoload_static.php ├── installed.json └── installed.php /.distignore: -------------------------------------------------------------------------------- 1 | # A set of files you probably don't want in your WordPress.org distribution 2 | .distignore 3 | .editorconfig 4 | .git 5 | .gitignore 6 | .gitlab-ci.yml 7 | .travis.yml 8 | .DS_Store 9 | Thumbs.db 10 | behat.yml 11 | bitbucket-pipelines.yml 12 | bin 13 | .circleci/config.yml 14 | composer.json 15 | composer.lock 16 | Gruntfile.js 17 | package.json 18 | package-lock.json 19 | phpunit.xml 20 | phpunit.xml.dist 21 | multisite.xml 22 | multisite.xml.dist 23 | .phpcs.xml 24 | phpcs.xml 25 | .phpcs.xml.dist 26 | phpcs.xml.dist 27 | README.md 28 | wp-cli.local.yml 29 | yarn.lock 30 | tests 31 | node_modules 32 | *.sql 33 | *.tar.gz 34 | *.zip 35 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | # WordPress Coding Standards 5 | # https://make.wordpress.org/core/handbook/coding-standards/ 6 | 7 | root = true 8 | 9 | [*] 10 | charset = utf-8 11 | end_of_line = lf 12 | insert_final_newline = true 13 | trim_trailing_whitespace = true 14 | indent_style = tab 15 | indent_size = 4 16 | 17 | [{.jshintrc,*.json,*.yml}] 18 | indent_style = tab 19 | indent_size = 4 20 | 21 | [{*.js}] 22 | indent_style = tab 23 | indent_size = 4 24 | 25 | [{*.txt,wp-config-sample.php}] 26 | end_of_line = crlf 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | phpcs.xml 3 | phpunit.xml 4 | Thumbs.db 5 | wp-cli.local.yml 6 | node_modules/ 7 | *.sql 8 | *.tar.gz 9 | *.zip 10 | 11 | # Exclude dev dependencies 12 | /vendor/automattic 13 | /vendor/bin 14 | /vendor/dealerdirect 15 | /vendor/fig-r 16 | /vendor/humanmade 17 | /vendor/php-stubs 18 | /vendor/phpcompatibility 19 | /vendor/phpstan 20 | /vendor/squizlabs 21 | /vendor/szepeviktor 22 | /vendor/wp-coding-standards 23 | -------------------------------------------------------------------------------- /.phpcs.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ./sync-mastodon.php 5 | ./src 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function( grunt ) { 2 | 3 | 'use strict'; 4 | 5 | // Project configuration 6 | grunt.initConfig( { 7 | 8 | pkg: grunt.file.readJSON( 'package.json' ), 9 | 10 | addtextdomain: { 11 | options: { 12 | textdomain: 'sync-msatodon', 13 | }, 14 | update_all_domains: { 15 | options: { 16 | updateDomains: true 17 | }, 18 | src: [ '*.php', '**/*.php', '!\.git/**/*', '!bin/**/*', '!node_modules/**/*', '!tests/**/*' ] 19 | } 20 | }, 21 | 22 | wp_readme_to_markdown: { 23 | your_target: { 24 | files: { 25 | 'README.md': 'readme.txt' 26 | } 27 | }, 28 | }, 29 | 30 | makepot: { 31 | target: { 32 | options: { 33 | domainPath: '/languages', 34 | exclude: [ '\.git/*', 'bin/*', 'node_modules/*', 'tests/*' ], 35 | mainFile: 'sync-mastodon.php', 36 | potFilename: 'sync-mastodon.pot', 37 | potHeaders: { 38 | poedit: true, 39 | 'x-poedit-keywordslist': true 40 | }, 41 | type: 'wp-plugin', 42 | updateTimestamp: true 43 | } 44 | } 45 | }, 46 | } ); 47 | 48 | grunt.loadNpmTasks( 'grunt-wp-i18n' ); 49 | grunt.loadNpmTasks( 'grunt-wp-readme-to-markdown' ); 50 | grunt.registerTask( 'default', [ 'i18n','readme' ] ); 51 | grunt.registerTask( 'i18n', ['addtextdomain', 'makepot'] ); 52 | grunt.registerTask( 'readme', ['wp_readme_to_markdown'] ); 53 | 54 | grunt.util.linefeed = '\n'; 55 | 56 | }; 57 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rosswintle/sync-mastodon", 3 | "description": "WordPress plugin to sync posts from a Mastodon RSS feed", 4 | "type": "project", 5 | "license": "GPL2+", 6 | "authors": [ 7 | { 8 | "name": "Ross Wintle", 9 | "email": "ross@oikos.org.uk" 10 | } 11 | ], 12 | "require-dev": { 13 | "phpstan/phpstan": "^1.9", 14 | "szepeviktor/phpstan-wordpress": "^1.1", 15 | "humanmade/coding-standards": "^1.2", 16 | "php-stubs/wp-cli-stubs": "^2.7" 17 | }, 18 | "config": { 19 | "allow-plugins": { 20 | "dealerdirect/phpcodesniffer-composer-installer": true 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /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": "b9a30c50121e68dc9abfffbaa8f2ce2b", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "automattic/vipwpcs", 12 | "version": "2.0.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/Automattic/VIP-Coding-Standards.git", 16 | "reference": "fc02f491dc9f51da7c32941ac579f70b9ed300c5" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/Automattic/VIP-Coding-Standards/zipball/fc02f491dc9f51da7c32941ac579f70b9ed300c5", 21 | "reference": "fc02f491dc9f51da7c32941ac579f70b9ed300c5", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": ">=5.6", 26 | "squizlabs/php_codesniffer": "^3.3.1", 27 | "wp-coding-standards/wpcs": "^2.1" 28 | }, 29 | "require-dev": { 30 | "dealerdirect/phpcodesniffer-composer-installer": "^0.5", 31 | "phpcompatibility/php-compatibility": "^9", 32 | "phpunit/phpunit": "^5 || ^6 || ^7" 33 | }, 34 | "suggest": { 35 | "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically." 36 | }, 37 | "type": "phpcodesniffer-standard", 38 | "notification-url": "https://packagist.org/downloads/", 39 | "license": [ 40 | "MIT" 41 | ], 42 | "authors": [ 43 | { 44 | "name": "Contributors", 45 | "homepage": "https://github.com/Automattic/VIP-Coding-Standards/graphs/contributors" 46 | } 47 | ], 48 | "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress VIP minimum coding conventions", 49 | "keywords": [ 50 | "phpcs", 51 | "standards", 52 | "wordpress" 53 | ], 54 | "support": { 55 | "issues": "https://github.com/Automattic/VIP-Coding-Standards/issues", 56 | "source": "https://github.com/Automattic/VIP-Coding-Standards", 57 | "wiki": "https://github.com/Automattic/VIP-Coding-Standards/wiki" 58 | }, 59 | "time": "2019-07-12T08:47:36+00:00" 60 | }, 61 | { 62 | "name": "dealerdirect/phpcodesniffer-composer-installer", 63 | "version": "v0.7.2", 64 | "source": { 65 | "type": "git", 66 | "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", 67 | "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db" 68 | }, 69 | "dist": { 70 | "type": "zip", 71 | "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", 72 | "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", 73 | "shasum": "" 74 | }, 75 | "require": { 76 | "composer-plugin-api": "^1.0 || ^2.0", 77 | "php": ">=5.3", 78 | "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" 79 | }, 80 | "require-dev": { 81 | "composer/composer": "*", 82 | "php-parallel-lint/php-parallel-lint": "^1.3.1", 83 | "phpcompatibility/php-compatibility": "^9.0" 84 | }, 85 | "type": "composer-plugin", 86 | "extra": { 87 | "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" 88 | }, 89 | "autoload": { 90 | "psr-4": { 91 | "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" 92 | } 93 | }, 94 | "notification-url": "https://packagist.org/downloads/", 95 | "license": [ 96 | "MIT" 97 | ], 98 | "authors": [ 99 | { 100 | "name": "Franck Nijhof", 101 | "email": "franck.nijhof@dealerdirect.com", 102 | "homepage": "http://www.frenck.nl", 103 | "role": "Developer / IT Manager" 104 | }, 105 | { 106 | "name": "Contributors", 107 | "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors" 108 | } 109 | ], 110 | "description": "PHP_CodeSniffer Standards Composer Installer Plugin", 111 | "homepage": "http://www.dealerdirect.com", 112 | "keywords": [ 113 | "PHPCodeSniffer", 114 | "PHP_CodeSniffer", 115 | "code quality", 116 | "codesniffer", 117 | "composer", 118 | "installer", 119 | "phpcbf", 120 | "phpcs", 121 | "plugin", 122 | "qa", 123 | "quality", 124 | "standard", 125 | "standards", 126 | "style guide", 127 | "stylecheck", 128 | "tests" 129 | ], 130 | "support": { 131 | "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", 132 | "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" 133 | }, 134 | "time": "2022-02-04T12:51:07+00:00" 135 | }, 136 | { 137 | "name": "fig-r/psr2r-sniffer", 138 | "version": "0.5.2", 139 | "source": { 140 | "type": "git", 141 | "url": "https://github.com/php-fig-rectified/psr2r-sniffer.git", 142 | "reference": "7eb462bcf19abcae122855a6d79cc8f768c77880" 143 | }, 144 | "dist": { 145 | "type": "zip", 146 | "url": "https://api.github.com/repos/php-fig-rectified/psr2r-sniffer/zipball/7eb462bcf19abcae122855a6d79cc8f768c77880", 147 | "reference": "7eb462bcf19abcae122855a6d79cc8f768c77880", 148 | "shasum": "" 149 | }, 150 | "require": { 151 | "php": ">=5.4.16", 152 | "squizlabs/php_codesniffer": "^3.0" 153 | }, 154 | "bin": [ 155 | "bin/tokenize", 156 | "bin/sniff" 157 | ], 158 | "type": "phpcodesniffer-standard", 159 | "autoload": { 160 | "psr-4": { 161 | "PSR2R\\": "PSR2R" 162 | } 163 | }, 164 | "notification-url": "https://packagist.org/downloads/", 165 | "license": [ 166 | "MIT" 167 | ], 168 | "authors": [ 169 | { 170 | "name": "Mark Scherer", 171 | "homepage": "http://www.dereuromark.de", 172 | "role": "Contributor" 173 | } 174 | ], 175 | "description": "Code-Sniffer, Auto-Fixer and Tokenizer for PSR2-R", 176 | "keywords": [ 177 | "codesniffer", 178 | "cs" 179 | ], 180 | "support": { 181 | "issues": "https://github.com/php-fig-rectified/psr2r-sniffer/issues", 182 | "source": "https://github.com/php-fig-rectified/psr2r-sniffer/tree/0.5.2" 183 | }, 184 | "time": "2019-07-30T11:13:07+00:00" 185 | }, 186 | { 187 | "name": "humanmade/coding-standards", 188 | "version": "v1.2.1", 189 | "source": { 190 | "type": "git", 191 | "url": "https://github.com/humanmade/coding-standards.git", 192 | "reference": "4b5aca25cb350f248f1797beed100edda9f32a0d" 193 | }, 194 | "dist": { 195 | "type": "zip", 196 | "url": "https://api.github.com/repos/humanmade/coding-standards/zipball/4b5aca25cb350f248f1797beed100edda9f32a0d", 197 | "reference": "4b5aca25cb350f248f1797beed100edda9f32a0d", 198 | "shasum": "" 199 | }, 200 | "require": { 201 | "automattic/vipwpcs": "2.0.0", 202 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", 203 | "fig-r/psr2r-sniffer": "^0.5.0", 204 | "php": ">=7.1", 205 | "phpcompatibility/phpcompatibility-wp": "^2.0.0", 206 | "squizlabs/php_codesniffer": "~3.5", 207 | "wp-coding-standards/wpcs": "2.3.0" 208 | }, 209 | "require-dev": { 210 | "phpunit/phpunit": "^7" 211 | }, 212 | "type": "phpcodesniffer-standard", 213 | "notification-url": "https://packagist.org/downloads/", 214 | "license": [ 215 | "GPL-2.0-or-later" 216 | ], 217 | "description": "Human Made Coding Standards", 218 | "support": { 219 | "issues": "https://github.com/humanmade/coding-standards/issues", 220 | "source": "https://github.com/humanmade/coding-standards/tree/v1.2.1" 221 | }, 222 | "time": "2022-09-14T09:35:02+00:00" 223 | }, 224 | { 225 | "name": "php-stubs/wordpress-stubs", 226 | "version": "v6.1.0", 227 | "source": { 228 | "type": "git", 229 | "url": "https://github.com/php-stubs/wordpress-stubs.git", 230 | "reference": "19e7966c8e70a99a4824b3e5d1526680a151f13b" 231 | }, 232 | "dist": { 233 | "type": "zip", 234 | "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/19e7966c8e70a99a4824b3e5d1526680a151f13b", 235 | "reference": "19e7966c8e70a99a4824b3e5d1526680a151f13b", 236 | "shasum": "" 237 | }, 238 | "replace": { 239 | "giacocorsiglia/wordpress-stubs": "*" 240 | }, 241 | "require-dev": { 242 | "nikic/php-parser": "< 4.12.0", 243 | "php": "~7.3 || ~8.0", 244 | "php-stubs/generator": "^0.8.1", 245 | "phpdocumentor/reflection-docblock": "^5.3", 246 | "phpstan/phpstan": "^1.2" 247 | }, 248 | "suggest": { 249 | "paragonie/sodium_compat": "Pure PHP implementation of libsodium", 250 | "symfony/polyfill-php73": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 251 | "szepeviktor/phpstan-wordpress": "WordPress extensions for PHPStan" 252 | }, 253 | "type": "library", 254 | "notification-url": "https://packagist.org/downloads/", 255 | "license": [ 256 | "MIT" 257 | ], 258 | "description": "WordPress function and class declaration stubs for static analysis.", 259 | "homepage": "https://github.com/php-stubs/wordpress-stubs", 260 | "keywords": [ 261 | "PHPStan", 262 | "static analysis", 263 | "wordpress" 264 | ], 265 | "support": { 266 | "issues": "https://github.com/php-stubs/wordpress-stubs/issues", 267 | "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.1.0" 268 | }, 269 | "time": "2022-11-09T05:33:25+00:00" 270 | }, 271 | { 272 | "name": "php-stubs/wp-cli-stubs", 273 | "version": "v2.7.0", 274 | "source": { 275 | "type": "git", 276 | "url": "https://github.com/php-stubs/wp-cli-stubs.git", 277 | "reference": "428544fc3696273bfbb4cffe4ac88f5fed428fc8" 278 | }, 279 | "dist": { 280 | "type": "zip", 281 | "url": "https://api.github.com/repos/php-stubs/wp-cli-stubs/zipball/428544fc3696273bfbb4cffe4ac88f5fed428fc8", 282 | "reference": "428544fc3696273bfbb4cffe4ac88f5fed428fc8", 283 | "shasum": "" 284 | }, 285 | "require": { 286 | "php-stubs/wordpress-stubs": "^4.7 || ^5.0 || ^6.0" 287 | }, 288 | "require-dev": { 289 | "php": "~7.3 || ~8.0", 290 | "php-stubs/generator": "^0.8.0" 291 | }, 292 | "suggest": { 293 | "symfony/polyfill-php73": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 294 | "szepeviktor/phpstan-wordpress": "WordPress extensions for PHPStan" 295 | }, 296 | "type": "library", 297 | "notification-url": "https://packagist.org/downloads/", 298 | "license": [ 299 | "MIT" 300 | ], 301 | "description": "WP-CLI function and class declaration stubs for static analysis.", 302 | "homepage": "https://github.com/php-stubs/wp-cli-stubs", 303 | "keywords": [ 304 | "PHPStan", 305 | "static analysis", 306 | "wordpress", 307 | "wp-cli" 308 | ], 309 | "support": { 310 | "issues": "https://github.com/php-stubs/wp-cli-stubs/issues", 311 | "source": "https://github.com/php-stubs/wp-cli-stubs/tree/v2.7.0" 312 | }, 313 | "time": "2022-11-10T19:19:05+00:00" 314 | }, 315 | { 316 | "name": "phpcompatibility/php-compatibility", 317 | "version": "9.3.5", 318 | "source": { 319 | "type": "git", 320 | "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", 321 | "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" 322 | }, 323 | "dist": { 324 | "type": "zip", 325 | "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", 326 | "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", 327 | "shasum": "" 328 | }, 329 | "require": { 330 | "php": ">=5.3", 331 | "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" 332 | }, 333 | "conflict": { 334 | "squizlabs/php_codesniffer": "2.6.2" 335 | }, 336 | "require-dev": { 337 | "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" 338 | }, 339 | "suggest": { 340 | "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", 341 | "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." 342 | }, 343 | "type": "phpcodesniffer-standard", 344 | "notification-url": "https://packagist.org/downloads/", 345 | "license": [ 346 | "LGPL-3.0-or-later" 347 | ], 348 | "authors": [ 349 | { 350 | "name": "Wim Godden", 351 | "homepage": "https://github.com/wimg", 352 | "role": "lead" 353 | }, 354 | { 355 | "name": "Juliette Reinders Folmer", 356 | "homepage": "https://github.com/jrfnl", 357 | "role": "lead" 358 | }, 359 | { 360 | "name": "Contributors", 361 | "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" 362 | } 363 | ], 364 | "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", 365 | "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", 366 | "keywords": [ 367 | "compatibility", 368 | "phpcs", 369 | "standards" 370 | ], 371 | "support": { 372 | "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", 373 | "source": "https://github.com/PHPCompatibility/PHPCompatibility" 374 | }, 375 | "time": "2019-12-27T09:44:58+00:00" 376 | }, 377 | { 378 | "name": "phpcompatibility/phpcompatibility-paragonie", 379 | "version": "1.3.2", 380 | "source": { 381 | "type": "git", 382 | "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", 383 | "reference": "bba5a9dfec7fcfbd679cfaf611d86b4d3759da26" 384 | }, 385 | "dist": { 386 | "type": "zip", 387 | "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/bba5a9dfec7fcfbd679cfaf611d86b4d3759da26", 388 | "reference": "bba5a9dfec7fcfbd679cfaf611d86b4d3759da26", 389 | "shasum": "" 390 | }, 391 | "require": { 392 | "phpcompatibility/php-compatibility": "^9.0" 393 | }, 394 | "require-dev": { 395 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7", 396 | "paragonie/random_compat": "dev-master", 397 | "paragonie/sodium_compat": "dev-master" 398 | }, 399 | "suggest": { 400 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", 401 | "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." 402 | }, 403 | "type": "phpcodesniffer-standard", 404 | "notification-url": "https://packagist.org/downloads/", 405 | "license": [ 406 | "LGPL-3.0-or-later" 407 | ], 408 | "authors": [ 409 | { 410 | "name": "Wim Godden", 411 | "role": "lead" 412 | }, 413 | { 414 | "name": "Juliette Reinders Folmer", 415 | "role": "lead" 416 | } 417 | ], 418 | "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.", 419 | "homepage": "http://phpcompatibility.com/", 420 | "keywords": [ 421 | "compatibility", 422 | "paragonie", 423 | "phpcs", 424 | "polyfill", 425 | "standards", 426 | "static analysis" 427 | ], 428 | "support": { 429 | "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", 430 | "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" 431 | }, 432 | "time": "2022-10-25T01:46:02+00:00" 433 | }, 434 | { 435 | "name": "phpcompatibility/phpcompatibility-wp", 436 | "version": "2.1.4", 437 | "source": { 438 | "type": "git", 439 | "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", 440 | "reference": "b6c1e3ee1c35de6c41a511d5eb9bd03e447480a5" 441 | }, 442 | "dist": { 443 | "type": "zip", 444 | "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/b6c1e3ee1c35de6c41a511d5eb9bd03e447480a5", 445 | "reference": "b6c1e3ee1c35de6c41a511d5eb9bd03e447480a5", 446 | "shasum": "" 447 | }, 448 | "require": { 449 | "phpcompatibility/php-compatibility": "^9.0", 450 | "phpcompatibility/phpcompatibility-paragonie": "^1.0" 451 | }, 452 | "require-dev": { 453 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7" 454 | }, 455 | "suggest": { 456 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", 457 | "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." 458 | }, 459 | "type": "phpcodesniffer-standard", 460 | "notification-url": "https://packagist.org/downloads/", 461 | "license": [ 462 | "LGPL-3.0-or-later" 463 | ], 464 | "authors": [ 465 | { 466 | "name": "Wim Godden", 467 | "role": "lead" 468 | }, 469 | { 470 | "name": "Juliette Reinders Folmer", 471 | "role": "lead" 472 | } 473 | ], 474 | "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.", 475 | "homepage": "http://phpcompatibility.com/", 476 | "keywords": [ 477 | "compatibility", 478 | "phpcs", 479 | "standards", 480 | "static analysis", 481 | "wordpress" 482 | ], 483 | "support": { 484 | "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", 485 | "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" 486 | }, 487 | "time": "2022-10-24T09:00:36+00:00" 488 | }, 489 | { 490 | "name": "phpstan/phpstan", 491 | "version": "1.9.11", 492 | "source": { 493 | "type": "git", 494 | "url": "https://github.com/phpstan/phpstan.git", 495 | "reference": "60f3d68481eef216199eae7a2603cd5fe124d464" 496 | }, 497 | "dist": { 498 | "type": "zip", 499 | "url": "https://api.github.com/repos/phpstan/phpstan/zipball/60f3d68481eef216199eae7a2603cd5fe124d464", 500 | "reference": "60f3d68481eef216199eae7a2603cd5fe124d464", 501 | "shasum": "" 502 | }, 503 | "require": { 504 | "php": "^7.2|^8.0" 505 | }, 506 | "conflict": { 507 | "phpstan/phpstan-shim": "*" 508 | }, 509 | "bin": [ 510 | "phpstan", 511 | "phpstan.phar" 512 | ], 513 | "type": "library", 514 | "autoload": { 515 | "files": [ 516 | "bootstrap.php" 517 | ] 518 | }, 519 | "notification-url": "https://packagist.org/downloads/", 520 | "license": [ 521 | "MIT" 522 | ], 523 | "description": "PHPStan - PHP Static Analysis Tool", 524 | "keywords": [ 525 | "dev", 526 | "static analysis" 527 | ], 528 | "support": { 529 | "issues": "https://github.com/phpstan/phpstan/issues", 530 | "source": "https://github.com/phpstan/phpstan/tree/1.9.11" 531 | }, 532 | "funding": [ 533 | { 534 | "url": "https://github.com/ondrejmirtes", 535 | "type": "github" 536 | }, 537 | { 538 | "url": "https://github.com/phpstan", 539 | "type": "github" 540 | }, 541 | { 542 | "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", 543 | "type": "tidelift" 544 | } 545 | ], 546 | "time": "2023-01-12T14:04:13+00:00" 547 | }, 548 | { 549 | "name": "squizlabs/php_codesniffer", 550 | "version": "3.7.1", 551 | "source": { 552 | "type": "git", 553 | "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", 554 | "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" 555 | }, 556 | "dist": { 557 | "type": "zip", 558 | "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", 559 | "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", 560 | "shasum": "" 561 | }, 562 | "require": { 563 | "ext-simplexml": "*", 564 | "ext-tokenizer": "*", 565 | "ext-xmlwriter": "*", 566 | "php": ">=5.4.0" 567 | }, 568 | "require-dev": { 569 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 570 | }, 571 | "bin": [ 572 | "bin/phpcs", 573 | "bin/phpcbf" 574 | ], 575 | "type": "library", 576 | "extra": { 577 | "branch-alias": { 578 | "dev-master": "3.x-dev" 579 | } 580 | }, 581 | "notification-url": "https://packagist.org/downloads/", 582 | "license": [ 583 | "BSD-3-Clause" 584 | ], 585 | "authors": [ 586 | { 587 | "name": "Greg Sherwood", 588 | "role": "lead" 589 | } 590 | ], 591 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 592 | "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", 593 | "keywords": [ 594 | "phpcs", 595 | "standards" 596 | ], 597 | "support": { 598 | "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", 599 | "source": "https://github.com/squizlabs/PHP_CodeSniffer", 600 | "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" 601 | }, 602 | "time": "2022-06-18T07:21:10+00:00" 603 | }, 604 | { 605 | "name": "symfony/polyfill-php73", 606 | "version": "v1.27.0", 607 | "source": { 608 | "type": "git", 609 | "url": "https://github.com/symfony/polyfill-php73.git", 610 | "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" 611 | }, 612 | "dist": { 613 | "type": "zip", 614 | "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", 615 | "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", 616 | "shasum": "" 617 | }, 618 | "require": { 619 | "php": ">=7.1" 620 | }, 621 | "type": "library", 622 | "extra": { 623 | "branch-alias": { 624 | "dev-main": "1.27-dev" 625 | }, 626 | "thanks": { 627 | "name": "symfony/polyfill", 628 | "url": "https://github.com/symfony/polyfill" 629 | } 630 | }, 631 | "autoload": { 632 | "files": [ 633 | "bootstrap.php" 634 | ], 635 | "psr-4": { 636 | "Symfony\\Polyfill\\Php73\\": "" 637 | }, 638 | "classmap": [ 639 | "Resources/stubs" 640 | ] 641 | }, 642 | "notification-url": "https://packagist.org/downloads/", 643 | "license": [ 644 | "MIT" 645 | ], 646 | "authors": [ 647 | { 648 | "name": "Nicolas Grekas", 649 | "email": "p@tchwork.com" 650 | }, 651 | { 652 | "name": "Symfony Community", 653 | "homepage": "https://symfony.com/contributors" 654 | } 655 | ], 656 | "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 657 | "homepage": "https://symfony.com", 658 | "keywords": [ 659 | "compatibility", 660 | "polyfill", 661 | "portable", 662 | "shim" 663 | ], 664 | "support": { 665 | "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" 666 | }, 667 | "funding": [ 668 | { 669 | "url": "https://symfony.com/sponsor", 670 | "type": "custom" 671 | }, 672 | { 673 | "url": "https://github.com/fabpot", 674 | "type": "github" 675 | }, 676 | { 677 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 678 | "type": "tidelift" 679 | } 680 | ], 681 | "time": "2022-11-03T14:55:06+00:00" 682 | }, 683 | { 684 | "name": "szepeviktor/phpstan-wordpress", 685 | "version": "v1.1.6", 686 | "source": { 687 | "type": "git", 688 | "url": "https://github.com/szepeviktor/phpstan-wordpress.git", 689 | "reference": "27784541f184a1ea3b6656fc8a882bb9adf45fc2" 690 | }, 691 | "dist": { 692 | "type": "zip", 693 | "url": "https://api.github.com/repos/szepeviktor/phpstan-wordpress/zipball/27784541f184a1ea3b6656fc8a882bb9adf45fc2", 694 | "reference": "27784541f184a1ea3b6656fc8a882bb9adf45fc2", 695 | "shasum": "" 696 | }, 697 | "require": { 698 | "php": "^7.2 || ^8.0", 699 | "php-stubs/wordpress-stubs": "^4.7 || ^5.0 || ^6.0", 700 | "phpstan/phpstan": "^1.8.7", 701 | "symfony/polyfill-php73": "^1.12.0" 702 | }, 703 | "require-dev": { 704 | "composer/composer": "^2.1.14", 705 | "dealerdirect/phpcodesniffer-composer-installer": "^0.7", 706 | "php-parallel-lint/php-parallel-lint": "^1.1", 707 | "phpstan/phpstan-strict-rules": "^1.2", 708 | "phpunit/phpunit": "^8.0 || ^9.0", 709 | "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^0.6.1" 710 | }, 711 | "type": "phpstan-extension", 712 | "extra": { 713 | "phpstan": { 714 | "includes": [ 715 | "extension.neon" 716 | ] 717 | } 718 | }, 719 | "autoload": { 720 | "psr-4": { 721 | "SzepeViktor\\PHPStan\\WordPress\\": "src/" 722 | } 723 | }, 724 | "notification-url": "https://packagist.org/downloads/", 725 | "license": [ 726 | "MIT" 727 | ], 728 | "description": "WordPress extensions for PHPStan", 729 | "keywords": [ 730 | "PHPStan", 731 | "code analyse", 732 | "code analysis", 733 | "static analysis", 734 | "wordpress" 735 | ], 736 | "support": { 737 | "issues": "https://github.com/szepeviktor/phpstan-wordpress/issues", 738 | "source": "https://github.com/szepeviktor/phpstan-wordpress/tree/v1.1.6" 739 | }, 740 | "funding": [ 741 | { 742 | "url": "https://www.paypal.me/szepeviktor", 743 | "type": "custom" 744 | }, 745 | { 746 | "url": "https://github.com/szepeviktor", 747 | "type": "github" 748 | } 749 | ], 750 | "time": "2022-12-01T14:56:51+00:00" 751 | }, 752 | { 753 | "name": "wp-coding-standards/wpcs", 754 | "version": "2.3.0", 755 | "source": { 756 | "type": "git", 757 | "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", 758 | "reference": "7da1894633f168fe244afc6de00d141f27517b62" 759 | }, 760 | "dist": { 761 | "type": "zip", 762 | "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/7da1894633f168fe244afc6de00d141f27517b62", 763 | "reference": "7da1894633f168fe244afc6de00d141f27517b62", 764 | "shasum": "" 765 | }, 766 | "require": { 767 | "php": ">=5.4", 768 | "squizlabs/php_codesniffer": "^3.3.1" 769 | }, 770 | "require-dev": { 771 | "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || ^0.6", 772 | "phpcompatibility/php-compatibility": "^9.0", 773 | "phpcsstandards/phpcsdevtools": "^1.0", 774 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 775 | }, 776 | "suggest": { 777 | "dealerdirect/phpcodesniffer-composer-installer": "^0.6 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically." 778 | }, 779 | "type": "phpcodesniffer-standard", 780 | "notification-url": "https://packagist.org/downloads/", 781 | "license": [ 782 | "MIT" 783 | ], 784 | "authors": [ 785 | { 786 | "name": "Contributors", 787 | "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" 788 | } 789 | ], 790 | "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", 791 | "keywords": [ 792 | "phpcs", 793 | "standards", 794 | "wordpress" 795 | ], 796 | "support": { 797 | "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", 798 | "source": "https://github.com/WordPress/WordPress-Coding-Standards", 799 | "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" 800 | }, 801 | "time": "2020-05-13T23:57:56+00:00" 802 | } 803 | ], 804 | "aliases": [], 805 | "minimum-stability": "stable", 806 | "stability-flags": [], 807 | "prefer-stable": false, 808 | "prefer-lowest": false, 809 | "platform": [], 810 | "platform-dev": [], 811 | "plugin-api-version": "2.3.0" 812 | } 813 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sync-mastodon", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.16.7", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", 10 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.16.7" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.16.7", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", 19 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.17.9", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", 25 | "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.16.7", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | } 32 | }, 33 | "abbrev": { 34 | "version": "1.1.1", 35 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 36 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 37 | "dev": true 38 | }, 39 | "acorn": { 40 | "version": "7.4.1", 41 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 42 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 43 | "dev": true 44 | }, 45 | "acorn-jsx": { 46 | "version": "5.3.2", 47 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 48 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 49 | "dev": true 50 | }, 51 | "ajv": { 52 | "version": "6.12.6", 53 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 54 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 55 | "dev": true, 56 | "requires": { 57 | "fast-deep-equal": "^3.1.1", 58 | "fast-json-stable-stringify": "^2.0.0", 59 | "json-schema-traverse": "^0.4.1", 60 | "uri-js": "^4.2.2" 61 | } 62 | }, 63 | "ansi-escapes": { 64 | "version": "4.3.2", 65 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 66 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 67 | "dev": true, 68 | "requires": { 69 | "type-fest": "^0.21.3" 70 | }, 71 | "dependencies": { 72 | "type-fest": { 73 | "version": "0.21.3", 74 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 75 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 76 | "dev": true 77 | } 78 | } 79 | }, 80 | "ansi-regex": { 81 | "version": "4.1.1", 82 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 83 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 84 | "dev": true 85 | }, 86 | "ansi-styles": { 87 | "version": "3.2.1", 88 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 89 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 90 | "dev": true, 91 | "requires": { 92 | "color-convert": "^1.9.0" 93 | } 94 | }, 95 | "argparse": { 96 | "version": "1.0.10", 97 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 98 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 99 | "dev": true, 100 | "requires": { 101 | "sprintf-js": "~1.0.2" 102 | } 103 | }, 104 | "array-each": { 105 | "version": "1.0.1", 106 | "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", 107 | "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", 108 | "dev": true 109 | }, 110 | "array-includes": { 111 | "version": "3.1.5", 112 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", 113 | "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", 114 | "dev": true, 115 | "requires": { 116 | "call-bind": "^1.0.2", 117 | "define-properties": "^1.1.4", 118 | "es-abstract": "^1.19.5", 119 | "get-intrinsic": "^1.1.1", 120 | "is-string": "^1.0.7" 121 | } 122 | }, 123 | "array-slice": { 124 | "version": "1.1.0", 125 | "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", 126 | "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", 127 | "dev": true 128 | }, 129 | "array.prototype.flatmap": { 130 | "version": "1.3.0", 131 | "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", 132 | "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", 133 | "dev": true, 134 | "requires": { 135 | "call-bind": "^1.0.2", 136 | "define-properties": "^1.1.3", 137 | "es-abstract": "^1.19.2", 138 | "es-shim-unscopables": "^1.0.0" 139 | } 140 | }, 141 | "astral-regex": { 142 | "version": "1.0.0", 143 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 144 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 145 | "dev": true 146 | }, 147 | "async": { 148 | "version": "3.2.4", 149 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", 150 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", 151 | "dev": true 152 | }, 153 | "balanced-match": { 154 | "version": "1.0.2", 155 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 156 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 157 | "dev": true 158 | }, 159 | "bluebird": { 160 | "version": "3.7.2", 161 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 162 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", 163 | "dev": true 164 | }, 165 | "brace-expansion": { 166 | "version": "1.1.11", 167 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 168 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 169 | "dev": true, 170 | "requires": { 171 | "balanced-match": "^1.0.0", 172 | "concat-map": "0.0.1" 173 | } 174 | }, 175 | "braces": { 176 | "version": "3.0.2", 177 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 178 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 179 | "dev": true, 180 | "requires": { 181 | "fill-range": "^7.0.1" 182 | } 183 | }, 184 | "call-bind": { 185 | "version": "1.0.2", 186 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 187 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 188 | "dev": true, 189 | "requires": { 190 | "function-bind": "^1.1.1", 191 | "get-intrinsic": "^1.0.2" 192 | } 193 | }, 194 | "callsites": { 195 | "version": "3.1.0", 196 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 197 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 198 | "dev": true 199 | }, 200 | "chalk": { 201 | "version": "2.4.2", 202 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 203 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 204 | "dev": true, 205 | "requires": { 206 | "ansi-styles": "^3.2.1", 207 | "escape-string-regexp": "^1.0.5", 208 | "supports-color": "^5.3.0" 209 | } 210 | }, 211 | "chardet": { 212 | "version": "0.7.0", 213 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 214 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 215 | "dev": true 216 | }, 217 | "cli-cursor": { 218 | "version": "3.1.0", 219 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 220 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 221 | "dev": true, 222 | "requires": { 223 | "restore-cursor": "^3.1.0" 224 | } 225 | }, 226 | "cli-width": { 227 | "version": "3.0.0", 228 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", 229 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", 230 | "dev": true 231 | }, 232 | "color-convert": { 233 | "version": "1.9.3", 234 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 235 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 236 | "dev": true, 237 | "requires": { 238 | "color-name": "1.1.3" 239 | } 240 | }, 241 | "color-name": { 242 | "version": "1.1.3", 243 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 244 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 245 | "dev": true 246 | }, 247 | "colors": { 248 | "version": "1.1.2", 249 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", 250 | "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", 251 | "dev": true 252 | }, 253 | "concat-map": { 254 | "version": "0.0.1", 255 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 256 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 257 | "dev": true 258 | }, 259 | "cross-spawn": { 260 | "version": "6.0.5", 261 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 262 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 263 | "dev": true, 264 | "requires": { 265 | "nice-try": "^1.0.4", 266 | "path-key": "^2.0.1", 267 | "semver": "^5.5.0", 268 | "shebang-command": "^1.2.0", 269 | "which": "^1.2.9" 270 | }, 271 | "dependencies": { 272 | "semver": { 273 | "version": "5.7.1", 274 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 275 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 276 | "dev": true 277 | } 278 | } 279 | }, 280 | "dateformat": { 281 | "version": "3.0.3", 282 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 283 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", 284 | "dev": true 285 | }, 286 | "debug": { 287 | "version": "4.3.4", 288 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 289 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 290 | "dev": true, 291 | "requires": { 292 | "ms": "2.1.2" 293 | } 294 | }, 295 | "deep-is": { 296 | "version": "0.1.4", 297 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 298 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 299 | "dev": true 300 | }, 301 | "define-properties": { 302 | "version": "1.1.4", 303 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", 304 | "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", 305 | "dev": true, 306 | "requires": { 307 | "has-property-descriptors": "^1.0.0", 308 | "object-keys": "^1.1.1" 309 | } 310 | }, 311 | "detect-file": { 312 | "version": "1.0.0", 313 | "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", 314 | "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", 315 | "dev": true 316 | }, 317 | "doctrine": { 318 | "version": "3.0.0", 319 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 320 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 321 | "dev": true, 322 | "requires": { 323 | "esutils": "^2.0.2" 324 | } 325 | }, 326 | "emoji-regex": { 327 | "version": "8.0.0", 328 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 329 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 330 | "dev": true 331 | }, 332 | "encoding": { 333 | "version": "0.1.13", 334 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 335 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 336 | "dev": true, 337 | "requires": { 338 | "iconv-lite": "^0.6.2" 339 | }, 340 | "dependencies": { 341 | "iconv-lite": { 342 | "version": "0.6.3", 343 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 344 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 345 | "dev": true, 346 | "requires": { 347 | "safer-buffer": ">= 2.1.2 < 3.0.0" 348 | } 349 | } 350 | } 351 | }, 352 | "es-abstract": { 353 | "version": "1.20.1", 354 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", 355 | "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", 356 | "dev": true, 357 | "requires": { 358 | "call-bind": "^1.0.2", 359 | "es-to-primitive": "^1.2.1", 360 | "function-bind": "^1.1.1", 361 | "function.prototype.name": "^1.1.5", 362 | "get-intrinsic": "^1.1.1", 363 | "get-symbol-description": "^1.0.0", 364 | "has": "^1.0.3", 365 | "has-property-descriptors": "^1.0.0", 366 | "has-symbols": "^1.0.3", 367 | "internal-slot": "^1.0.3", 368 | "is-callable": "^1.2.4", 369 | "is-negative-zero": "^2.0.2", 370 | "is-regex": "^1.1.4", 371 | "is-shared-array-buffer": "^1.0.2", 372 | "is-string": "^1.0.7", 373 | "is-weakref": "^1.0.2", 374 | "object-inspect": "^1.12.0", 375 | "object-keys": "^1.1.1", 376 | "object.assign": "^4.1.2", 377 | "regexp.prototype.flags": "^1.4.3", 378 | "string.prototype.trimend": "^1.0.5", 379 | "string.prototype.trimstart": "^1.0.5", 380 | "unbox-primitive": "^1.0.2" 381 | } 382 | }, 383 | "es-shim-unscopables": { 384 | "version": "1.0.0", 385 | "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", 386 | "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", 387 | "dev": true, 388 | "requires": { 389 | "has": "^1.0.3" 390 | } 391 | }, 392 | "es-to-primitive": { 393 | "version": "1.2.1", 394 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 395 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 396 | "dev": true, 397 | "requires": { 398 | "is-callable": "^1.1.4", 399 | "is-date-object": "^1.0.1", 400 | "is-symbol": "^1.0.2" 401 | } 402 | }, 403 | "escape-string-regexp": { 404 | "version": "1.0.5", 405 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 406 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 407 | "dev": true 408 | }, 409 | "eslint": { 410 | "version": "6.8.0", 411 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", 412 | "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", 413 | "dev": true, 414 | "requires": { 415 | "@babel/code-frame": "^7.0.0", 416 | "ajv": "^6.10.0", 417 | "chalk": "^2.1.0", 418 | "cross-spawn": "^6.0.5", 419 | "debug": "^4.0.1", 420 | "doctrine": "^3.0.0", 421 | "eslint-scope": "^5.0.0", 422 | "eslint-utils": "^1.4.3", 423 | "eslint-visitor-keys": "^1.1.0", 424 | "espree": "^6.1.2", 425 | "esquery": "^1.0.1", 426 | "esutils": "^2.0.2", 427 | "file-entry-cache": "^5.0.1", 428 | "functional-red-black-tree": "^1.0.1", 429 | "glob-parent": "^5.0.0", 430 | "globals": "^12.1.0", 431 | "ignore": "^4.0.6", 432 | "import-fresh": "^3.0.0", 433 | "imurmurhash": "^0.1.4", 434 | "inquirer": "^7.0.0", 435 | "is-glob": "^4.0.0", 436 | "js-yaml": "^3.13.1", 437 | "json-stable-stringify-without-jsonify": "^1.0.1", 438 | "levn": "^0.3.0", 439 | "lodash": "^4.17.14", 440 | "minimatch": "^3.0.4", 441 | "mkdirp": "^0.5.1", 442 | "natural-compare": "^1.4.0", 443 | "optionator": "^0.8.3", 444 | "progress": "^2.0.0", 445 | "regexpp": "^2.0.1", 446 | "semver": "^6.1.2", 447 | "strip-ansi": "^5.2.0", 448 | "strip-json-comments": "^3.0.1", 449 | "table": "^5.2.3", 450 | "text-table": "^0.2.0", 451 | "v8-compile-cache": "^2.0.3" 452 | } 453 | }, 454 | "eslint-plugin-react": { 455 | "version": "7.30.1", 456 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz", 457 | "integrity": "sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==", 458 | "dev": true, 459 | "requires": { 460 | "array-includes": "^3.1.5", 461 | "array.prototype.flatmap": "^1.3.0", 462 | "doctrine": "^2.1.0", 463 | "estraverse": "^5.3.0", 464 | "jsx-ast-utils": "^2.4.1 || ^3.0.0", 465 | "minimatch": "^3.1.2", 466 | "object.entries": "^1.1.5", 467 | "object.fromentries": "^2.0.5", 468 | "object.hasown": "^1.1.1", 469 | "object.values": "^1.1.5", 470 | "prop-types": "^15.8.1", 471 | "resolve": "^2.0.0-next.3", 472 | "semver": "^6.3.0", 473 | "string.prototype.matchall": "^4.0.7" 474 | }, 475 | "dependencies": { 476 | "doctrine": { 477 | "version": "2.1.0", 478 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 479 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 480 | "dev": true, 481 | "requires": { 482 | "esutils": "^2.0.2" 483 | } 484 | } 485 | } 486 | }, 487 | "eslint-scope": { 488 | "version": "5.1.1", 489 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 490 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 491 | "dev": true, 492 | "requires": { 493 | "esrecurse": "^4.3.0", 494 | "estraverse": "^4.1.1" 495 | }, 496 | "dependencies": { 497 | "estraverse": { 498 | "version": "4.3.0", 499 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 500 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 501 | "dev": true 502 | } 503 | } 504 | }, 505 | "eslint-utils": { 506 | "version": "1.4.3", 507 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 508 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 509 | "dev": true, 510 | "requires": { 511 | "eslint-visitor-keys": "^1.1.0" 512 | } 513 | }, 514 | "eslint-visitor-keys": { 515 | "version": "1.3.0", 516 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 517 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 518 | "dev": true 519 | }, 520 | "espree": { 521 | "version": "6.2.1", 522 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", 523 | "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", 524 | "dev": true, 525 | "requires": { 526 | "acorn": "^7.1.1", 527 | "acorn-jsx": "^5.2.0", 528 | "eslint-visitor-keys": "^1.1.0" 529 | } 530 | }, 531 | "esprima": { 532 | "version": "4.0.1", 533 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 534 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 535 | "dev": true 536 | }, 537 | "esquery": { 538 | "version": "1.4.0", 539 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 540 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 541 | "dev": true, 542 | "requires": { 543 | "estraverse": "^5.1.0" 544 | } 545 | }, 546 | "esrecurse": { 547 | "version": "4.3.0", 548 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 549 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 550 | "dev": true, 551 | "requires": { 552 | "estraverse": "^5.2.0" 553 | } 554 | }, 555 | "estraverse": { 556 | "version": "5.3.0", 557 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 558 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 559 | "dev": true 560 | }, 561 | "esutils": { 562 | "version": "2.0.3", 563 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 564 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 565 | "dev": true 566 | }, 567 | "eventemitter2": { 568 | "version": "0.4.14", 569 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", 570 | "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", 571 | "dev": true 572 | }, 573 | "exit": { 574 | "version": "0.1.2", 575 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 576 | "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", 577 | "dev": true 578 | }, 579 | "expand-tilde": { 580 | "version": "2.0.2", 581 | "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", 582 | "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", 583 | "dev": true, 584 | "requires": { 585 | "homedir-polyfill": "^1.0.1" 586 | } 587 | }, 588 | "extend": { 589 | "version": "3.0.2", 590 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 591 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 592 | "dev": true 593 | }, 594 | "external-editor": { 595 | "version": "3.1.0", 596 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 597 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 598 | "dev": true, 599 | "requires": { 600 | "chardet": "^0.7.0", 601 | "iconv-lite": "^0.4.24", 602 | "tmp": "^0.0.33" 603 | } 604 | }, 605 | "fast-deep-equal": { 606 | "version": "3.1.3", 607 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 608 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 609 | "dev": true 610 | }, 611 | "fast-json-stable-stringify": { 612 | "version": "2.1.0", 613 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 614 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 615 | "dev": true 616 | }, 617 | "fast-levenshtein": { 618 | "version": "2.0.6", 619 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 620 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 621 | "dev": true 622 | }, 623 | "figures": { 624 | "version": "3.2.0", 625 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 626 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 627 | "dev": true, 628 | "requires": { 629 | "escape-string-regexp": "^1.0.5" 630 | } 631 | }, 632 | "file-entry-cache": { 633 | "version": "5.0.1", 634 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 635 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 636 | "dev": true, 637 | "requires": { 638 | "flat-cache": "^2.0.1" 639 | } 640 | }, 641 | "fill-range": { 642 | "version": "7.0.1", 643 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 644 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 645 | "dev": true, 646 | "requires": { 647 | "to-regex-range": "^5.0.1" 648 | } 649 | }, 650 | "findup-sync": { 651 | "version": "0.3.0", 652 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", 653 | "integrity": "sha512-z8Nrwhi6wzxNMIbxlrTzuUW6KWuKkogZ/7OdDVq+0+kxn77KUH1nipx8iU6suqkHqc4y6n7a9A8IpmxY/pTjWg==", 654 | "dev": true, 655 | "requires": { 656 | "glob": "~5.0.0" 657 | }, 658 | "dependencies": { 659 | "glob": { 660 | "version": "5.0.15", 661 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 662 | "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", 663 | "dev": true, 664 | "requires": { 665 | "inflight": "^1.0.4", 666 | "inherits": "2", 667 | "minimatch": "2 || 3", 668 | "once": "^1.3.0", 669 | "path-is-absolute": "^1.0.0" 670 | } 671 | } 672 | } 673 | }, 674 | "fined": { 675 | "version": "1.2.0", 676 | "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", 677 | "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", 678 | "dev": true, 679 | "requires": { 680 | "expand-tilde": "^2.0.2", 681 | "is-plain-object": "^2.0.3", 682 | "object.defaults": "^1.1.0", 683 | "object.pick": "^1.2.0", 684 | "parse-filepath": "^1.0.1" 685 | } 686 | }, 687 | "flagged-respawn": { 688 | "version": "1.0.1", 689 | "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", 690 | "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", 691 | "dev": true 692 | }, 693 | "flat-cache": { 694 | "version": "2.0.1", 695 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 696 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 697 | "dev": true, 698 | "requires": { 699 | "flatted": "^2.0.0", 700 | "rimraf": "2.6.3", 701 | "write": "1.0.3" 702 | } 703 | }, 704 | "flatted": { 705 | "version": "2.0.2", 706 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 707 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 708 | "dev": true 709 | }, 710 | "for-in": { 711 | "version": "1.0.2", 712 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 713 | "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", 714 | "dev": true 715 | }, 716 | "for-own": { 717 | "version": "1.0.0", 718 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", 719 | "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", 720 | "dev": true, 721 | "requires": { 722 | "for-in": "^1.0.1" 723 | } 724 | }, 725 | "fs.realpath": { 726 | "version": "1.0.0", 727 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 728 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 729 | "dev": true 730 | }, 731 | "function-bind": { 732 | "version": "1.1.1", 733 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 734 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 735 | "dev": true 736 | }, 737 | "function.prototype.name": { 738 | "version": "1.1.5", 739 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", 740 | "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", 741 | "dev": true, 742 | "requires": { 743 | "call-bind": "^1.0.2", 744 | "define-properties": "^1.1.3", 745 | "es-abstract": "^1.19.0", 746 | "functions-have-names": "^1.2.2" 747 | } 748 | }, 749 | "functional-red-black-tree": { 750 | "version": "1.0.1", 751 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 752 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 753 | "dev": true 754 | }, 755 | "functions-have-names": { 756 | "version": "1.2.3", 757 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 758 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 759 | "dev": true 760 | }, 761 | "get-intrinsic": { 762 | "version": "1.1.2", 763 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 764 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 765 | "dev": true, 766 | "requires": { 767 | "function-bind": "^1.1.1", 768 | "has": "^1.0.3", 769 | "has-symbols": "^1.0.3" 770 | } 771 | }, 772 | "get-symbol-description": { 773 | "version": "1.0.0", 774 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 775 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 776 | "dev": true, 777 | "requires": { 778 | "call-bind": "^1.0.2", 779 | "get-intrinsic": "^1.1.1" 780 | } 781 | }, 782 | "getobject": { 783 | "version": "1.0.2", 784 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", 785 | "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", 786 | "dev": true 787 | }, 788 | "gettext-parser": { 789 | "version": "3.1.1", 790 | "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.1.tgz", 791 | "integrity": "sha512-vNhWcqXEtZPs5Ft1ReA34g7ByWotpcOIeJvXVy2jF3/G2U9v6W0wG4Z4hXzcU8R//jArqkgHcVCGgGqa4vxVlQ==", 792 | "dev": true, 793 | "requires": { 794 | "encoding": "^0.1.12", 795 | "readable-stream": "^3.2.0", 796 | "safe-buffer": "^5.1.2" 797 | } 798 | }, 799 | "glob": { 800 | "version": "7.1.7", 801 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 802 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 803 | "dev": true, 804 | "requires": { 805 | "fs.realpath": "^1.0.0", 806 | "inflight": "^1.0.4", 807 | "inherits": "2", 808 | "minimatch": "^3.0.4", 809 | "once": "^1.3.0", 810 | "path-is-absolute": "^1.0.0" 811 | } 812 | }, 813 | "glob-parent": { 814 | "version": "5.1.2", 815 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 816 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 817 | "dev": true, 818 | "requires": { 819 | "is-glob": "^4.0.1" 820 | } 821 | }, 822 | "global-modules": { 823 | "version": "1.0.0", 824 | "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", 825 | "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", 826 | "dev": true, 827 | "requires": { 828 | "global-prefix": "^1.0.1", 829 | "is-windows": "^1.0.1", 830 | "resolve-dir": "^1.0.0" 831 | } 832 | }, 833 | "global-prefix": { 834 | "version": "1.0.2", 835 | "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", 836 | "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", 837 | "dev": true, 838 | "requires": { 839 | "expand-tilde": "^2.0.2", 840 | "homedir-polyfill": "^1.0.1", 841 | "ini": "^1.3.4", 842 | "is-windows": "^1.0.1", 843 | "which": "^1.2.14" 844 | } 845 | }, 846 | "globals": { 847 | "version": "12.4.0", 848 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 849 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 850 | "dev": true, 851 | "requires": { 852 | "type-fest": "^0.8.1" 853 | } 854 | }, 855 | "grunt": { 856 | "version": "1.5.3", 857 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz", 858 | "integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==", 859 | "dev": true, 860 | "requires": { 861 | "dateformat": "~3.0.3", 862 | "eventemitter2": "~0.4.13", 863 | "exit": "~0.1.2", 864 | "findup-sync": "~0.3.0", 865 | "glob": "~7.1.6", 866 | "grunt-cli": "~1.4.3", 867 | "grunt-known-options": "~2.0.0", 868 | "grunt-legacy-log": "~3.0.0", 869 | "grunt-legacy-util": "~2.0.1", 870 | "iconv-lite": "~0.4.13", 871 | "js-yaml": "~3.14.0", 872 | "minimatch": "~3.0.4", 873 | "mkdirp": "~1.0.4", 874 | "nopt": "~3.0.6", 875 | "rimraf": "~3.0.2" 876 | }, 877 | "dependencies": { 878 | "grunt-cli": { 879 | "version": "1.4.3", 880 | "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", 881 | "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", 882 | "dev": true, 883 | "requires": { 884 | "grunt-known-options": "~2.0.0", 885 | "interpret": "~1.1.0", 886 | "liftup": "~3.0.1", 887 | "nopt": "~4.0.1", 888 | "v8flags": "~3.2.0" 889 | }, 890 | "dependencies": { 891 | "nopt": { 892 | "version": "4.0.3", 893 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", 894 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", 895 | "dev": true, 896 | "requires": { 897 | "abbrev": "1", 898 | "osenv": "^0.1.4" 899 | } 900 | } 901 | } 902 | }, 903 | "minimatch": { 904 | "version": "3.0.8", 905 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", 906 | "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", 907 | "dev": true, 908 | "requires": { 909 | "brace-expansion": "^1.1.7" 910 | } 911 | }, 912 | "mkdirp": { 913 | "version": "1.0.4", 914 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 915 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 916 | "dev": true 917 | }, 918 | "rimraf": { 919 | "version": "3.0.2", 920 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 921 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 922 | "dev": true, 923 | "requires": { 924 | "glob": "^7.1.3" 925 | } 926 | } 927 | } 928 | }, 929 | "grunt-known-options": { 930 | "version": "2.0.0", 931 | "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", 932 | "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", 933 | "dev": true 934 | }, 935 | "grunt-legacy-log": { 936 | "version": "3.0.0", 937 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", 938 | "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", 939 | "dev": true, 940 | "requires": { 941 | "colors": "~1.1.2", 942 | "grunt-legacy-log-utils": "~2.1.0", 943 | "hooker": "~0.2.3", 944 | "lodash": "~4.17.19" 945 | } 946 | }, 947 | "grunt-legacy-log-utils": { 948 | "version": "2.1.0", 949 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", 950 | "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", 951 | "dev": true, 952 | "requires": { 953 | "chalk": "~4.1.0", 954 | "lodash": "~4.17.19" 955 | }, 956 | "dependencies": { 957 | "ansi-styles": { 958 | "version": "4.3.0", 959 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 960 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 961 | "dev": true, 962 | "requires": { 963 | "color-convert": "^2.0.1" 964 | } 965 | }, 966 | "chalk": { 967 | "version": "4.1.2", 968 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 969 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 970 | "dev": true, 971 | "requires": { 972 | "ansi-styles": "^4.1.0", 973 | "supports-color": "^7.1.0" 974 | } 975 | }, 976 | "color-convert": { 977 | "version": "2.0.1", 978 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 979 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 980 | "dev": true, 981 | "requires": { 982 | "color-name": "~1.1.4" 983 | } 984 | }, 985 | "color-name": { 986 | "version": "1.1.4", 987 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 988 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 989 | "dev": true 990 | }, 991 | "has-flag": { 992 | "version": "4.0.0", 993 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 994 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 995 | "dev": true 996 | }, 997 | "supports-color": { 998 | "version": "7.2.0", 999 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1000 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1001 | "dev": true, 1002 | "requires": { 1003 | "has-flag": "^4.0.0" 1004 | } 1005 | } 1006 | } 1007 | }, 1008 | "grunt-legacy-util": { 1009 | "version": "2.0.1", 1010 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", 1011 | "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", 1012 | "dev": true, 1013 | "requires": { 1014 | "async": "~3.2.0", 1015 | "exit": "~0.1.2", 1016 | "getobject": "~1.0.0", 1017 | "hooker": "~0.2.3", 1018 | "lodash": "~4.17.21", 1019 | "underscore.string": "~3.3.5", 1020 | "which": "~2.0.2" 1021 | }, 1022 | "dependencies": { 1023 | "which": { 1024 | "version": "2.0.2", 1025 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1026 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1027 | "dev": true, 1028 | "requires": { 1029 | "isexe": "^2.0.0" 1030 | } 1031 | } 1032 | } 1033 | }, 1034 | "grunt-wp-i18n": { 1035 | "version": "1.0.3", 1036 | "resolved": "https://registry.npmjs.org/grunt-wp-i18n/-/grunt-wp-i18n-1.0.3.tgz", 1037 | "integrity": "sha512-CJNbEKeBeOSAPeaJ9B8iCgSwtaG63UR9/uT46a4OsIqnFhOJpeAi138JTlvjfIbnDVoBrzvdrKJe1svveLjUtA==", 1038 | "dev": true, 1039 | "requires": { 1040 | "grunt": "^1.0.3", 1041 | "node-wp-i18n": "^1.2.2" 1042 | } 1043 | }, 1044 | "grunt-wp-readme-to-markdown": { 1045 | "version": "2.0.1", 1046 | "resolved": "https://registry.npmjs.org/grunt-wp-readme-to-markdown/-/grunt-wp-readme-to-markdown-2.0.1.tgz", 1047 | "integrity": "sha1-QGzV6YmIWA3B0W6AXE4uYJJWhVI=", 1048 | "dev": true 1049 | }, 1050 | "has": { 1051 | "version": "1.0.3", 1052 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1053 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1054 | "dev": true, 1055 | "requires": { 1056 | "function-bind": "^1.1.1" 1057 | } 1058 | }, 1059 | "has-bigints": { 1060 | "version": "1.0.2", 1061 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 1062 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 1063 | "dev": true 1064 | }, 1065 | "has-flag": { 1066 | "version": "3.0.0", 1067 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1068 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1069 | "dev": true 1070 | }, 1071 | "has-property-descriptors": { 1072 | "version": "1.0.0", 1073 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 1074 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 1075 | "dev": true, 1076 | "requires": { 1077 | "get-intrinsic": "^1.1.1" 1078 | } 1079 | }, 1080 | "has-symbols": { 1081 | "version": "1.0.3", 1082 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1083 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1084 | "dev": true 1085 | }, 1086 | "has-tostringtag": { 1087 | "version": "1.0.0", 1088 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 1089 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 1090 | "dev": true, 1091 | "requires": { 1092 | "has-symbols": "^1.0.2" 1093 | } 1094 | }, 1095 | "homedir-polyfill": { 1096 | "version": "1.0.3", 1097 | "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", 1098 | "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", 1099 | "dev": true, 1100 | "requires": { 1101 | "parse-passwd": "^1.0.0" 1102 | } 1103 | }, 1104 | "hooker": { 1105 | "version": "0.2.3", 1106 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", 1107 | "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", 1108 | "dev": true 1109 | }, 1110 | "iconv-lite": { 1111 | "version": "0.4.24", 1112 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1113 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1114 | "dev": true, 1115 | "requires": { 1116 | "safer-buffer": ">= 2.1.2 < 3" 1117 | } 1118 | }, 1119 | "ignore": { 1120 | "version": "4.0.6", 1121 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1122 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1123 | "dev": true 1124 | }, 1125 | "import-fresh": { 1126 | "version": "3.3.0", 1127 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1128 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1129 | "dev": true, 1130 | "requires": { 1131 | "parent-module": "^1.0.0", 1132 | "resolve-from": "^4.0.0" 1133 | } 1134 | }, 1135 | "imurmurhash": { 1136 | "version": "0.1.4", 1137 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1138 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1139 | "dev": true 1140 | }, 1141 | "inflight": { 1142 | "version": "1.0.6", 1143 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1144 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1145 | "dev": true, 1146 | "requires": { 1147 | "once": "^1.3.0", 1148 | "wrappy": "1" 1149 | } 1150 | }, 1151 | "inherits": { 1152 | "version": "2.0.4", 1153 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1154 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1155 | "dev": true 1156 | }, 1157 | "ini": { 1158 | "version": "1.3.8", 1159 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1160 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 1161 | "dev": true 1162 | }, 1163 | "inquirer": { 1164 | "version": "7.3.3", 1165 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", 1166 | "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", 1167 | "dev": true, 1168 | "requires": { 1169 | "ansi-escapes": "^4.2.1", 1170 | "chalk": "^4.1.0", 1171 | "cli-cursor": "^3.1.0", 1172 | "cli-width": "^3.0.0", 1173 | "external-editor": "^3.0.3", 1174 | "figures": "^3.0.0", 1175 | "lodash": "^4.17.19", 1176 | "mute-stream": "0.0.8", 1177 | "run-async": "^2.4.0", 1178 | "rxjs": "^6.6.0", 1179 | "string-width": "^4.1.0", 1180 | "strip-ansi": "^6.0.0", 1181 | "through": "^2.3.6" 1182 | }, 1183 | "dependencies": { 1184 | "ansi-regex": { 1185 | "version": "5.0.1", 1186 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1187 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1188 | "dev": true 1189 | }, 1190 | "ansi-styles": { 1191 | "version": "4.3.0", 1192 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1193 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1194 | "dev": true, 1195 | "requires": { 1196 | "color-convert": "^2.0.1" 1197 | } 1198 | }, 1199 | "chalk": { 1200 | "version": "4.1.2", 1201 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1202 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1203 | "dev": true, 1204 | "requires": { 1205 | "ansi-styles": "^4.1.0", 1206 | "supports-color": "^7.1.0" 1207 | } 1208 | }, 1209 | "color-convert": { 1210 | "version": "2.0.1", 1211 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1212 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1213 | "dev": true, 1214 | "requires": { 1215 | "color-name": "~1.1.4" 1216 | } 1217 | }, 1218 | "color-name": { 1219 | "version": "1.1.4", 1220 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1221 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1222 | "dev": true 1223 | }, 1224 | "has-flag": { 1225 | "version": "4.0.0", 1226 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1227 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1228 | "dev": true 1229 | }, 1230 | "strip-ansi": { 1231 | "version": "6.0.1", 1232 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1233 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1234 | "dev": true, 1235 | "requires": { 1236 | "ansi-regex": "^5.0.1" 1237 | } 1238 | }, 1239 | "supports-color": { 1240 | "version": "7.2.0", 1241 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1242 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1243 | "dev": true, 1244 | "requires": { 1245 | "has-flag": "^4.0.0" 1246 | } 1247 | } 1248 | } 1249 | }, 1250 | "internal-slot": { 1251 | "version": "1.0.3", 1252 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", 1253 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", 1254 | "dev": true, 1255 | "requires": { 1256 | "get-intrinsic": "^1.1.0", 1257 | "has": "^1.0.3", 1258 | "side-channel": "^1.0.4" 1259 | } 1260 | }, 1261 | "interpret": { 1262 | "version": "1.1.0", 1263 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", 1264 | "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", 1265 | "dev": true 1266 | }, 1267 | "is-absolute": { 1268 | "version": "1.0.0", 1269 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 1270 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 1271 | "dev": true, 1272 | "requires": { 1273 | "is-relative": "^1.0.0", 1274 | "is-windows": "^1.0.1" 1275 | } 1276 | }, 1277 | "is-bigint": { 1278 | "version": "1.0.4", 1279 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 1280 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 1281 | "dev": true, 1282 | "requires": { 1283 | "has-bigints": "^1.0.1" 1284 | } 1285 | }, 1286 | "is-boolean-object": { 1287 | "version": "1.1.2", 1288 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 1289 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 1290 | "dev": true, 1291 | "requires": { 1292 | "call-bind": "^1.0.2", 1293 | "has-tostringtag": "^1.0.0" 1294 | } 1295 | }, 1296 | "is-callable": { 1297 | "version": "1.2.4", 1298 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", 1299 | "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", 1300 | "dev": true 1301 | }, 1302 | "is-core-module": { 1303 | "version": "2.9.0", 1304 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", 1305 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", 1306 | "dev": true, 1307 | "requires": { 1308 | "has": "^1.0.3" 1309 | } 1310 | }, 1311 | "is-date-object": { 1312 | "version": "1.0.5", 1313 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1314 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1315 | "dev": true, 1316 | "requires": { 1317 | "has-tostringtag": "^1.0.0" 1318 | } 1319 | }, 1320 | "is-extglob": { 1321 | "version": "2.1.1", 1322 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1323 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1324 | "dev": true 1325 | }, 1326 | "is-fullwidth-code-point": { 1327 | "version": "3.0.0", 1328 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1329 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1330 | "dev": true 1331 | }, 1332 | "is-glob": { 1333 | "version": "4.0.3", 1334 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1335 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1336 | "dev": true, 1337 | "requires": { 1338 | "is-extglob": "^2.1.1" 1339 | } 1340 | }, 1341 | "is-negative-zero": { 1342 | "version": "2.0.2", 1343 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 1344 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 1345 | "dev": true 1346 | }, 1347 | "is-number": { 1348 | "version": "7.0.0", 1349 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1350 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1351 | "dev": true 1352 | }, 1353 | "is-number-object": { 1354 | "version": "1.0.7", 1355 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 1356 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 1357 | "dev": true, 1358 | "requires": { 1359 | "has-tostringtag": "^1.0.0" 1360 | } 1361 | }, 1362 | "is-plain-object": { 1363 | "version": "2.0.4", 1364 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1365 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1366 | "dev": true, 1367 | "requires": { 1368 | "isobject": "^3.0.1" 1369 | } 1370 | }, 1371 | "is-regex": { 1372 | "version": "1.1.4", 1373 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1374 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1375 | "dev": true, 1376 | "requires": { 1377 | "call-bind": "^1.0.2", 1378 | "has-tostringtag": "^1.0.0" 1379 | } 1380 | }, 1381 | "is-relative": { 1382 | "version": "1.0.0", 1383 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 1384 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 1385 | "dev": true, 1386 | "requires": { 1387 | "is-unc-path": "^1.0.0" 1388 | } 1389 | }, 1390 | "is-shared-array-buffer": { 1391 | "version": "1.0.2", 1392 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 1393 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 1394 | "dev": true, 1395 | "requires": { 1396 | "call-bind": "^1.0.2" 1397 | } 1398 | }, 1399 | "is-string": { 1400 | "version": "1.0.7", 1401 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 1402 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 1403 | "dev": true, 1404 | "requires": { 1405 | "has-tostringtag": "^1.0.0" 1406 | } 1407 | }, 1408 | "is-symbol": { 1409 | "version": "1.0.4", 1410 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1411 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1412 | "dev": true, 1413 | "requires": { 1414 | "has-symbols": "^1.0.2" 1415 | } 1416 | }, 1417 | "is-unc-path": { 1418 | "version": "1.0.0", 1419 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 1420 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 1421 | "dev": true, 1422 | "requires": { 1423 | "unc-path-regex": "^0.1.2" 1424 | } 1425 | }, 1426 | "is-weakref": { 1427 | "version": "1.0.2", 1428 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 1429 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 1430 | "dev": true, 1431 | "requires": { 1432 | "call-bind": "^1.0.2" 1433 | } 1434 | }, 1435 | "is-windows": { 1436 | "version": "1.0.2", 1437 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1438 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 1439 | "dev": true 1440 | }, 1441 | "isexe": { 1442 | "version": "2.0.0", 1443 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1444 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1445 | "dev": true 1446 | }, 1447 | "isobject": { 1448 | "version": "3.0.1", 1449 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1450 | "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", 1451 | "dev": true 1452 | }, 1453 | "js-tokens": { 1454 | "version": "4.0.0", 1455 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1456 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1457 | "dev": true 1458 | }, 1459 | "js-yaml": { 1460 | "version": "3.14.1", 1461 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 1462 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 1463 | "dev": true, 1464 | "requires": { 1465 | "argparse": "^1.0.7", 1466 | "esprima": "^4.0.0" 1467 | } 1468 | }, 1469 | "json-schema-traverse": { 1470 | "version": "0.4.1", 1471 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1472 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1473 | "dev": true 1474 | }, 1475 | "json-stable-stringify-without-jsonify": { 1476 | "version": "1.0.1", 1477 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1478 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1479 | "dev": true 1480 | }, 1481 | "jsx-ast-utils": { 1482 | "version": "3.3.2", 1483 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz", 1484 | "integrity": "sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==", 1485 | "dev": true, 1486 | "requires": { 1487 | "array-includes": "^3.1.5", 1488 | "object.assign": "^4.1.2" 1489 | } 1490 | }, 1491 | "kind-of": { 1492 | "version": "6.0.3", 1493 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 1494 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 1495 | "dev": true 1496 | }, 1497 | "levn": { 1498 | "version": "0.3.0", 1499 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1500 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1501 | "dev": true, 1502 | "requires": { 1503 | "prelude-ls": "~1.1.2", 1504 | "type-check": "~0.3.2" 1505 | } 1506 | }, 1507 | "liftup": { 1508 | "version": "3.0.1", 1509 | "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", 1510 | "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", 1511 | "dev": true, 1512 | "requires": { 1513 | "extend": "^3.0.2", 1514 | "findup-sync": "^4.0.0", 1515 | "fined": "^1.2.0", 1516 | "flagged-respawn": "^1.0.1", 1517 | "is-plain-object": "^2.0.4", 1518 | "object.map": "^1.0.1", 1519 | "rechoir": "^0.7.0", 1520 | "resolve": "^1.19.0" 1521 | }, 1522 | "dependencies": { 1523 | "findup-sync": { 1524 | "version": "4.0.0", 1525 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", 1526 | "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", 1527 | "dev": true, 1528 | "requires": { 1529 | "detect-file": "^1.0.0", 1530 | "is-glob": "^4.0.0", 1531 | "micromatch": "^4.0.2", 1532 | "resolve-dir": "^1.0.1" 1533 | } 1534 | }, 1535 | "resolve": { 1536 | "version": "1.22.1", 1537 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1538 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1539 | "dev": true, 1540 | "requires": { 1541 | "is-core-module": "^2.9.0", 1542 | "path-parse": "^1.0.7", 1543 | "supports-preserve-symlinks-flag": "^1.0.0" 1544 | } 1545 | } 1546 | } 1547 | }, 1548 | "lodash": { 1549 | "version": "4.17.21", 1550 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1551 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1552 | "dev": true 1553 | }, 1554 | "loose-envify": { 1555 | "version": "1.4.0", 1556 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1557 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1558 | "dev": true, 1559 | "requires": { 1560 | "js-tokens": "^3.0.0 || ^4.0.0" 1561 | } 1562 | }, 1563 | "make-iterator": { 1564 | "version": "1.0.1", 1565 | "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", 1566 | "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", 1567 | "dev": true, 1568 | "requires": { 1569 | "kind-of": "^6.0.2" 1570 | } 1571 | }, 1572 | "map-cache": { 1573 | "version": "0.2.2", 1574 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 1575 | "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", 1576 | "dev": true 1577 | }, 1578 | "micromatch": { 1579 | "version": "4.0.5", 1580 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1581 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1582 | "dev": true, 1583 | "requires": { 1584 | "braces": "^3.0.2", 1585 | "picomatch": "^2.3.1" 1586 | } 1587 | }, 1588 | "mimic-fn": { 1589 | "version": "2.1.0", 1590 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1591 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1592 | "dev": true 1593 | }, 1594 | "minimatch": { 1595 | "version": "3.1.2", 1596 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1597 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1598 | "dev": true, 1599 | "requires": { 1600 | "brace-expansion": "^1.1.7" 1601 | } 1602 | }, 1603 | "minimist": { 1604 | "version": "1.2.6", 1605 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1606 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 1607 | "dev": true 1608 | }, 1609 | "mkdirp": { 1610 | "version": "0.5.6", 1611 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1612 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1613 | "dev": true, 1614 | "requires": { 1615 | "minimist": "^1.2.6" 1616 | } 1617 | }, 1618 | "ms": { 1619 | "version": "2.1.2", 1620 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1621 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1622 | "dev": true 1623 | }, 1624 | "mute-stream": { 1625 | "version": "0.0.8", 1626 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1627 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 1628 | "dev": true 1629 | }, 1630 | "natural-compare": { 1631 | "version": "1.4.0", 1632 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1633 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1634 | "dev": true 1635 | }, 1636 | "nice-try": { 1637 | "version": "1.0.5", 1638 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1639 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1640 | "dev": true 1641 | }, 1642 | "node-wp-i18n": { 1643 | "version": "1.2.6", 1644 | "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.6.tgz", 1645 | "integrity": "sha512-aLutjDB1rMJ3FNlNcs/XjmaejED1/y30uLYQrmkXpeUj1NH/SA6pI94CUz3iI7fbQd63lTGg0YNvOQAT8cWdIw==", 1646 | "dev": true, 1647 | "requires": { 1648 | "bluebird": "^3.4.1", 1649 | "gettext-parser": "^3.1.0", 1650 | "glob": "^7.0.5", 1651 | "lodash": "^4.14.2", 1652 | "minimist": "^1.2.5", 1653 | "mkdirp": "^1.0.4", 1654 | "tmp": "^0.2.1" 1655 | }, 1656 | "dependencies": { 1657 | "mkdirp": { 1658 | "version": "1.0.4", 1659 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1660 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1661 | "dev": true 1662 | }, 1663 | "rimraf": { 1664 | "version": "3.0.2", 1665 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1666 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1667 | "dev": true, 1668 | "requires": { 1669 | "glob": "^7.1.3" 1670 | } 1671 | }, 1672 | "tmp": { 1673 | "version": "0.2.1", 1674 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", 1675 | "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", 1676 | "dev": true, 1677 | "requires": { 1678 | "rimraf": "^3.0.0" 1679 | } 1680 | } 1681 | } 1682 | }, 1683 | "nopt": { 1684 | "version": "3.0.6", 1685 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1686 | "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", 1687 | "dev": true, 1688 | "requires": { 1689 | "abbrev": "1" 1690 | } 1691 | }, 1692 | "object-assign": { 1693 | "version": "4.1.1", 1694 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1695 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1696 | "dev": true 1697 | }, 1698 | "object-inspect": { 1699 | "version": "1.12.2", 1700 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 1701 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 1702 | "dev": true 1703 | }, 1704 | "object-keys": { 1705 | "version": "1.1.1", 1706 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1707 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1708 | "dev": true 1709 | }, 1710 | "object.assign": { 1711 | "version": "4.1.2", 1712 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 1713 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 1714 | "dev": true, 1715 | "requires": { 1716 | "call-bind": "^1.0.0", 1717 | "define-properties": "^1.1.3", 1718 | "has-symbols": "^1.0.1", 1719 | "object-keys": "^1.1.1" 1720 | } 1721 | }, 1722 | "object.defaults": { 1723 | "version": "1.1.0", 1724 | "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", 1725 | "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", 1726 | "dev": true, 1727 | "requires": { 1728 | "array-each": "^1.0.1", 1729 | "array-slice": "^1.0.0", 1730 | "for-own": "^1.0.0", 1731 | "isobject": "^3.0.0" 1732 | } 1733 | }, 1734 | "object.entries": { 1735 | "version": "1.1.5", 1736 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", 1737 | "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", 1738 | "dev": true, 1739 | "requires": { 1740 | "call-bind": "^1.0.2", 1741 | "define-properties": "^1.1.3", 1742 | "es-abstract": "^1.19.1" 1743 | } 1744 | }, 1745 | "object.fromentries": { 1746 | "version": "2.0.5", 1747 | "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", 1748 | "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", 1749 | "dev": true, 1750 | "requires": { 1751 | "call-bind": "^1.0.2", 1752 | "define-properties": "^1.1.3", 1753 | "es-abstract": "^1.19.1" 1754 | } 1755 | }, 1756 | "object.hasown": { 1757 | "version": "1.1.1", 1758 | "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", 1759 | "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", 1760 | "dev": true, 1761 | "requires": { 1762 | "define-properties": "^1.1.4", 1763 | "es-abstract": "^1.19.5" 1764 | } 1765 | }, 1766 | "object.map": { 1767 | "version": "1.0.1", 1768 | "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", 1769 | "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", 1770 | "dev": true, 1771 | "requires": { 1772 | "for-own": "^1.0.0", 1773 | "make-iterator": "^1.0.0" 1774 | } 1775 | }, 1776 | "object.pick": { 1777 | "version": "1.3.0", 1778 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 1779 | "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", 1780 | "dev": true, 1781 | "requires": { 1782 | "isobject": "^3.0.1" 1783 | } 1784 | }, 1785 | "object.values": { 1786 | "version": "1.1.5", 1787 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", 1788 | "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", 1789 | "dev": true, 1790 | "requires": { 1791 | "call-bind": "^1.0.2", 1792 | "define-properties": "^1.1.3", 1793 | "es-abstract": "^1.19.1" 1794 | } 1795 | }, 1796 | "once": { 1797 | "version": "1.4.0", 1798 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1799 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1800 | "dev": true, 1801 | "requires": { 1802 | "wrappy": "1" 1803 | } 1804 | }, 1805 | "onetime": { 1806 | "version": "5.1.2", 1807 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1808 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1809 | "dev": true, 1810 | "requires": { 1811 | "mimic-fn": "^2.1.0" 1812 | } 1813 | }, 1814 | "optionator": { 1815 | "version": "0.8.3", 1816 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1817 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1818 | "dev": true, 1819 | "requires": { 1820 | "deep-is": "~0.1.3", 1821 | "fast-levenshtein": "~2.0.6", 1822 | "levn": "~0.3.0", 1823 | "prelude-ls": "~1.1.2", 1824 | "type-check": "~0.3.2", 1825 | "word-wrap": "~1.2.3" 1826 | } 1827 | }, 1828 | "os-homedir": { 1829 | "version": "1.0.2", 1830 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1831 | "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", 1832 | "dev": true 1833 | }, 1834 | "os-tmpdir": { 1835 | "version": "1.0.2", 1836 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1837 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1838 | "dev": true 1839 | }, 1840 | "osenv": { 1841 | "version": "0.1.5", 1842 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 1843 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 1844 | "dev": true, 1845 | "requires": { 1846 | "os-homedir": "^1.0.0", 1847 | "os-tmpdir": "^1.0.0" 1848 | } 1849 | }, 1850 | "parent-module": { 1851 | "version": "1.0.1", 1852 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1853 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1854 | "dev": true, 1855 | "requires": { 1856 | "callsites": "^3.0.0" 1857 | } 1858 | }, 1859 | "parse-filepath": { 1860 | "version": "1.0.2", 1861 | "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", 1862 | "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", 1863 | "dev": true, 1864 | "requires": { 1865 | "is-absolute": "^1.0.0", 1866 | "map-cache": "^0.2.0", 1867 | "path-root": "^0.1.1" 1868 | } 1869 | }, 1870 | "parse-passwd": { 1871 | "version": "1.0.0", 1872 | "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", 1873 | "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", 1874 | "dev": true 1875 | }, 1876 | "path-is-absolute": { 1877 | "version": "1.0.1", 1878 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1879 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1880 | "dev": true 1881 | }, 1882 | "path-key": { 1883 | "version": "2.0.1", 1884 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1885 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1886 | "dev": true 1887 | }, 1888 | "path-parse": { 1889 | "version": "1.0.7", 1890 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1891 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1892 | "dev": true 1893 | }, 1894 | "path-root": { 1895 | "version": "0.1.1", 1896 | "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", 1897 | "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", 1898 | "dev": true, 1899 | "requires": { 1900 | "path-root-regex": "^0.1.0" 1901 | } 1902 | }, 1903 | "path-root-regex": { 1904 | "version": "0.1.2", 1905 | "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", 1906 | "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", 1907 | "dev": true 1908 | }, 1909 | "picomatch": { 1910 | "version": "2.3.1", 1911 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1912 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1913 | "dev": true 1914 | }, 1915 | "prelude-ls": { 1916 | "version": "1.1.2", 1917 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1918 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1919 | "dev": true 1920 | }, 1921 | "progress": { 1922 | "version": "2.0.3", 1923 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1924 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1925 | "dev": true 1926 | }, 1927 | "prop-types": { 1928 | "version": "15.8.1", 1929 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 1930 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 1931 | "dev": true, 1932 | "requires": { 1933 | "loose-envify": "^1.4.0", 1934 | "object-assign": "^4.1.1", 1935 | "react-is": "^16.13.1" 1936 | } 1937 | }, 1938 | "punycode": { 1939 | "version": "2.1.1", 1940 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1941 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1942 | "dev": true 1943 | }, 1944 | "react-is": { 1945 | "version": "16.13.1", 1946 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1947 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 1948 | "dev": true 1949 | }, 1950 | "readable-stream": { 1951 | "version": "3.6.0", 1952 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1953 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1954 | "dev": true, 1955 | "requires": { 1956 | "inherits": "^2.0.3", 1957 | "string_decoder": "^1.1.1", 1958 | "util-deprecate": "^1.0.1" 1959 | } 1960 | }, 1961 | "rechoir": { 1962 | "version": "0.7.1", 1963 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", 1964 | "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", 1965 | "dev": true, 1966 | "requires": { 1967 | "resolve": "^1.9.0" 1968 | }, 1969 | "dependencies": { 1970 | "resolve": { 1971 | "version": "1.22.1", 1972 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1973 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1974 | "dev": true, 1975 | "requires": { 1976 | "is-core-module": "^2.9.0", 1977 | "path-parse": "^1.0.7", 1978 | "supports-preserve-symlinks-flag": "^1.0.0" 1979 | } 1980 | } 1981 | } 1982 | }, 1983 | "regexp.prototype.flags": { 1984 | "version": "1.4.3", 1985 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", 1986 | "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", 1987 | "dev": true, 1988 | "requires": { 1989 | "call-bind": "^1.0.2", 1990 | "define-properties": "^1.1.3", 1991 | "functions-have-names": "^1.2.2" 1992 | } 1993 | }, 1994 | "regexpp": { 1995 | "version": "2.0.1", 1996 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1997 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1998 | "dev": true 1999 | }, 2000 | "resolve": { 2001 | "version": "2.0.0-next.4", 2002 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", 2003 | "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", 2004 | "dev": true, 2005 | "requires": { 2006 | "is-core-module": "^2.9.0", 2007 | "path-parse": "^1.0.7", 2008 | "supports-preserve-symlinks-flag": "^1.0.0" 2009 | } 2010 | }, 2011 | "resolve-dir": { 2012 | "version": "1.0.1", 2013 | "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", 2014 | "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", 2015 | "dev": true, 2016 | "requires": { 2017 | "expand-tilde": "^2.0.0", 2018 | "global-modules": "^1.0.0" 2019 | } 2020 | }, 2021 | "resolve-from": { 2022 | "version": "4.0.0", 2023 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2024 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2025 | "dev": true 2026 | }, 2027 | "restore-cursor": { 2028 | "version": "3.1.0", 2029 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 2030 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 2031 | "dev": true, 2032 | "requires": { 2033 | "onetime": "^5.1.0", 2034 | "signal-exit": "^3.0.2" 2035 | } 2036 | }, 2037 | "rimraf": { 2038 | "version": "2.6.3", 2039 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2040 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2041 | "dev": true, 2042 | "requires": { 2043 | "glob": "^7.1.3" 2044 | } 2045 | }, 2046 | "run-async": { 2047 | "version": "2.4.1", 2048 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 2049 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 2050 | "dev": true 2051 | }, 2052 | "rxjs": { 2053 | "version": "6.6.7", 2054 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 2055 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 2056 | "dev": true, 2057 | "requires": { 2058 | "tslib": "^1.9.0" 2059 | } 2060 | }, 2061 | "safe-buffer": { 2062 | "version": "5.2.1", 2063 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2064 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2065 | "dev": true 2066 | }, 2067 | "safer-buffer": { 2068 | "version": "2.1.2", 2069 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2070 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2071 | "dev": true 2072 | }, 2073 | "semver": { 2074 | "version": "6.3.0", 2075 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2076 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 2077 | "dev": true 2078 | }, 2079 | "shebang-command": { 2080 | "version": "1.2.0", 2081 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2082 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2083 | "dev": true, 2084 | "requires": { 2085 | "shebang-regex": "^1.0.0" 2086 | } 2087 | }, 2088 | "shebang-regex": { 2089 | "version": "1.0.0", 2090 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2091 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 2092 | "dev": true 2093 | }, 2094 | "side-channel": { 2095 | "version": "1.0.4", 2096 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2097 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2098 | "dev": true, 2099 | "requires": { 2100 | "call-bind": "^1.0.0", 2101 | "get-intrinsic": "^1.0.2", 2102 | "object-inspect": "^1.9.0" 2103 | } 2104 | }, 2105 | "signal-exit": { 2106 | "version": "3.0.7", 2107 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2108 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 2109 | "dev": true 2110 | }, 2111 | "slice-ansi": { 2112 | "version": "2.1.0", 2113 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 2114 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 2115 | "dev": true, 2116 | "requires": { 2117 | "ansi-styles": "^3.2.0", 2118 | "astral-regex": "^1.0.0", 2119 | "is-fullwidth-code-point": "^2.0.0" 2120 | }, 2121 | "dependencies": { 2122 | "is-fullwidth-code-point": { 2123 | "version": "2.0.0", 2124 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2125 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2126 | "dev": true 2127 | } 2128 | } 2129 | }, 2130 | "sprintf-js": { 2131 | "version": "1.0.3", 2132 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2133 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2134 | "dev": true 2135 | }, 2136 | "string-width": { 2137 | "version": "4.2.3", 2138 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2139 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2140 | "dev": true, 2141 | "requires": { 2142 | "emoji-regex": "^8.0.0", 2143 | "is-fullwidth-code-point": "^3.0.0", 2144 | "strip-ansi": "^6.0.1" 2145 | }, 2146 | "dependencies": { 2147 | "ansi-regex": { 2148 | "version": "5.0.1", 2149 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2150 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2151 | "dev": true 2152 | }, 2153 | "strip-ansi": { 2154 | "version": "6.0.1", 2155 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2156 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2157 | "dev": true, 2158 | "requires": { 2159 | "ansi-regex": "^5.0.1" 2160 | } 2161 | } 2162 | } 2163 | }, 2164 | "string.prototype.matchall": { 2165 | "version": "4.0.7", 2166 | "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", 2167 | "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", 2168 | "dev": true, 2169 | "requires": { 2170 | "call-bind": "^1.0.2", 2171 | "define-properties": "^1.1.3", 2172 | "es-abstract": "^1.19.1", 2173 | "get-intrinsic": "^1.1.1", 2174 | "has-symbols": "^1.0.3", 2175 | "internal-slot": "^1.0.3", 2176 | "regexp.prototype.flags": "^1.4.1", 2177 | "side-channel": "^1.0.4" 2178 | } 2179 | }, 2180 | "string.prototype.trimend": { 2181 | "version": "1.0.5", 2182 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", 2183 | "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", 2184 | "dev": true, 2185 | "requires": { 2186 | "call-bind": "^1.0.2", 2187 | "define-properties": "^1.1.4", 2188 | "es-abstract": "^1.19.5" 2189 | } 2190 | }, 2191 | "string.prototype.trimstart": { 2192 | "version": "1.0.5", 2193 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", 2194 | "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", 2195 | "dev": true, 2196 | "requires": { 2197 | "call-bind": "^1.0.2", 2198 | "define-properties": "^1.1.4", 2199 | "es-abstract": "^1.19.5" 2200 | } 2201 | }, 2202 | "string_decoder": { 2203 | "version": "1.3.0", 2204 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2205 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2206 | "dev": true, 2207 | "requires": { 2208 | "safe-buffer": "~5.2.0" 2209 | } 2210 | }, 2211 | "strip-ansi": { 2212 | "version": "5.2.0", 2213 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2214 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2215 | "dev": true, 2216 | "requires": { 2217 | "ansi-regex": "^4.1.0" 2218 | } 2219 | }, 2220 | "strip-json-comments": { 2221 | "version": "3.1.1", 2222 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2223 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2224 | "dev": true 2225 | }, 2226 | "supports-color": { 2227 | "version": "5.5.0", 2228 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2229 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2230 | "dev": true, 2231 | "requires": { 2232 | "has-flag": "^3.0.0" 2233 | } 2234 | }, 2235 | "supports-preserve-symlinks-flag": { 2236 | "version": "1.0.0", 2237 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2238 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2239 | "dev": true 2240 | }, 2241 | "table": { 2242 | "version": "5.4.6", 2243 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 2244 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 2245 | "dev": true, 2246 | "requires": { 2247 | "ajv": "^6.10.2", 2248 | "lodash": "^4.17.14", 2249 | "slice-ansi": "^2.1.0", 2250 | "string-width": "^3.0.0" 2251 | }, 2252 | "dependencies": { 2253 | "emoji-regex": { 2254 | "version": "7.0.3", 2255 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 2256 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 2257 | "dev": true 2258 | }, 2259 | "is-fullwidth-code-point": { 2260 | "version": "2.0.0", 2261 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2262 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2263 | "dev": true 2264 | }, 2265 | "string-width": { 2266 | "version": "3.1.0", 2267 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2268 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2269 | "dev": true, 2270 | "requires": { 2271 | "emoji-regex": "^7.0.1", 2272 | "is-fullwidth-code-point": "^2.0.0", 2273 | "strip-ansi": "^5.1.0" 2274 | } 2275 | } 2276 | } 2277 | }, 2278 | "text-table": { 2279 | "version": "0.2.0", 2280 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2281 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2282 | "dev": true 2283 | }, 2284 | "through": { 2285 | "version": "2.3.8", 2286 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2287 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2288 | "dev": true 2289 | }, 2290 | "tmp": { 2291 | "version": "0.0.33", 2292 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2293 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2294 | "dev": true, 2295 | "requires": { 2296 | "os-tmpdir": "~1.0.2" 2297 | } 2298 | }, 2299 | "to-regex-range": { 2300 | "version": "5.0.1", 2301 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2302 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2303 | "dev": true, 2304 | "requires": { 2305 | "is-number": "^7.0.0" 2306 | } 2307 | }, 2308 | "tslib": { 2309 | "version": "1.14.1", 2310 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 2311 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 2312 | "dev": true 2313 | }, 2314 | "type-check": { 2315 | "version": "0.3.2", 2316 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2317 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2318 | "dev": true, 2319 | "requires": { 2320 | "prelude-ls": "~1.1.2" 2321 | } 2322 | }, 2323 | "type-fest": { 2324 | "version": "0.8.1", 2325 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 2326 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 2327 | "dev": true 2328 | }, 2329 | "unbox-primitive": { 2330 | "version": "1.0.2", 2331 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 2332 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 2333 | "dev": true, 2334 | "requires": { 2335 | "call-bind": "^1.0.2", 2336 | "has-bigints": "^1.0.2", 2337 | "has-symbols": "^1.0.3", 2338 | "which-boxed-primitive": "^1.0.2" 2339 | } 2340 | }, 2341 | "unc-path-regex": { 2342 | "version": "0.1.2", 2343 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 2344 | "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", 2345 | "dev": true 2346 | }, 2347 | "underscore.string": { 2348 | "version": "3.3.6", 2349 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", 2350 | "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", 2351 | "dev": true, 2352 | "requires": { 2353 | "sprintf-js": "^1.1.1", 2354 | "util-deprecate": "^1.0.2" 2355 | }, 2356 | "dependencies": { 2357 | "sprintf-js": { 2358 | "version": "1.1.2", 2359 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 2360 | "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", 2361 | "dev": true 2362 | } 2363 | } 2364 | }, 2365 | "uri-js": { 2366 | "version": "4.4.1", 2367 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2368 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2369 | "dev": true, 2370 | "requires": { 2371 | "punycode": "^2.1.0" 2372 | } 2373 | }, 2374 | "util-deprecate": { 2375 | "version": "1.0.2", 2376 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2377 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2378 | "dev": true 2379 | }, 2380 | "v8-compile-cache": { 2381 | "version": "2.3.0", 2382 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 2383 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 2384 | "dev": true 2385 | }, 2386 | "v8flags": { 2387 | "version": "3.2.0", 2388 | "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", 2389 | "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", 2390 | "dev": true, 2391 | "requires": { 2392 | "homedir-polyfill": "^1.0.1" 2393 | } 2394 | }, 2395 | "which": { 2396 | "version": "1.3.1", 2397 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2398 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2399 | "dev": true, 2400 | "requires": { 2401 | "isexe": "^2.0.0" 2402 | } 2403 | }, 2404 | "which-boxed-primitive": { 2405 | "version": "1.0.2", 2406 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 2407 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 2408 | "dev": true, 2409 | "requires": { 2410 | "is-bigint": "^1.0.1", 2411 | "is-boolean-object": "^1.1.0", 2412 | "is-number-object": "^1.0.4", 2413 | "is-string": "^1.0.5", 2414 | "is-symbol": "^1.0.3" 2415 | } 2416 | }, 2417 | "word-wrap": { 2418 | "version": "1.2.3", 2419 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2420 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2421 | "dev": true 2422 | }, 2423 | "wrappy": { 2424 | "version": "1.0.2", 2425 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2426 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2427 | "dev": true 2428 | }, 2429 | "write": { 2430 | "version": "1.0.3", 2431 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 2432 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 2433 | "dev": true, 2434 | "requires": { 2435 | "mkdirp": "^0.5.1" 2436 | } 2437 | } 2438 | } 2439 | } 2440 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sync-mastodon", 3 | "version": "1.3.1", 4 | "main": "Gruntfile.js", 5 | "author": "Ross Wintle", 6 | "devDependencies": { 7 | "eslint": "^6.8", 8 | "eslint-plugin-react": "^7.30.1", 9 | "grunt": "^1.5.3", 10 | "grunt-wp-i18n": "^1.0.3", 11 | "grunt-wp-readme-to-markdown": "~2.0.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /phpstan.neon: -------------------------------------------------------------------------------- 1 | includes: 2 | - vendor/szepeviktor/phpstan-wordpress/extension.neon 3 | 4 | parameters: 5 | level: 5 6 | paths: 7 | - sync-mastodon.php 8 | - src/ 9 | scanFiles: 10 | - %rootDir%/../../php-stubs/wordpress-stubs/wordpress-stubs.php 11 | - %rootDir%/../../php-stubs/wp-cli-stubs/wp-cli-stubs.php 12 | - %rootDir%/../../php-stubs/wp-cli-stubs/wp-cli-commands-stubs.php 13 | - %rootDir%/../../php-stubs/wp-cli-stubs/wp-cli-i18n-stubs.php 14 | -------------------------------------------------------------------------------- /readme.txt: -------------------------------------------------------------------------------- 1 | === Sync Mastodon === 2 | Contributors: magicroundabout 3 | Tags: mastodon, sync, fediverse 4 | Requires at least: 5.1 5 | Tested up to: 6.1 6 | Stable tag: 1.3.1 7 | License: GPLv2 or later 8 | License URI: https://www.gnu.org/licenses/gpl-2.0.html 9 | 10 | Fetch posts from a Mastodon RSS feed and add them to a custom post type 11 | 12 | == Description == 13 | 14 | This plugin syncs Mastodon posts from a Mastodon RSS feed into a custom post type. 15 | 16 | This plugin: 17 | 18 | * runs automatically using either wp-cron or manually using [wp-cli](https://wp-cli.org/) 19 | * uses Mastodon RSS feeds and needs no authentication 20 | * rates-limits fetches 21 | * allows you to choose an author for synced posts 22 | * sideloads images from your Mastodon posts 23 | 24 | Note that this plugin does a one-way sync from Mastodon to your WordPress install. You can add your own posts in WordPress but they will not be cross-posted to Mastodon. 25 | 26 | = Instructions = 27 | 28 | Once you have installed the plugin you will need to go to Settings -> Mastodon Sync and enter your RSS feed URL 29 | 30 | If you want to do automatic sync then you can then also turn on the Auto-sync option. 31 | 32 | = WP-CLI command = 33 | 34 | If you can use [WP-CLI](https://wp-cli.org/) then you can make use of the `wp-cli sync-mastodon` command to 35 | do an import from Mastodon. This works particularly well for large first-time imports before you enable the automatic sync. But you could also use the system cron to run this command instead of WP cron. 36 | 37 | = Wish list / Roadmap = 38 | 39 | Things I have in mind for future development: 40 | 41 | * Better front-end validation in admin screens and meta boxes 42 | * Better error logging, and logging in general, including WP-CLI-specific output 43 | 44 | == Installation == 45 | 46 | Once you have installed and activated the plugin, follow the instructions in the description. 47 | 48 | == Screenshots == 49 | 50 | 1. Options screen 51 | 52 | == Changelog == 53 | 54 | = 1.3.1 = 55 | * Fix fatals 56 | 57 | = 1.3.0 = 58 | * Syncs images 59 | 60 | = 1.2.2 = 61 | * Removed Guzzle dependency - it's not used 62 | 63 | = 1.2.1 = 64 | * Fix RSS feed caching 65 | 66 | = 1.2.0 = 67 | * Changes sync interval to five minutes 68 | 69 | = 1.1.0 = 70 | * Adds ability to select a post type to sync to 71 | 72 | = 1.0.0 = 73 | * Initial version based on [Sync Pinboard](https://wordpress.org/plugins/sync-pinboard/) 74 | 75 | == Upgrade Notice == 76 | -------------------------------------------------------------------------------- /src/class-mastodon-rss-api.php: -------------------------------------------------------------------------------- 1 | get_items(); 45 | 46 | return $this->make_posts_array( $rss_items ); 47 | } 48 | 49 | /** 50 | * Filter the feed cache time 51 | * 52 | * @param int $seconds The number of seconds the feed should be cached for. 53 | * @param string $url The feed URL. 54 | * @return int 55 | */ 56 | public static function filter_feed_lifetime( $seconds, $url ) { 57 | return 60 * 5; // 5 minutes 58 | } 59 | 60 | /** 61 | * Convert an array of items returned by the RSS API into an array of 62 | * Mastodon_Post objects 63 | * 64 | * @param array $items Items to be converted 65 | * @return Mastodon_Post[] 66 | */ 67 | public function make_posts_array( $items = [] ) { 68 | $posts = []; 69 | 70 | foreach ( $items as $item ) { 71 | $post = Mastodon_Post::from_rss_object( $item ); 72 | $posts[] = $post; 73 | } 74 | 75 | return $posts; 76 | } 77 | 78 | /** 79 | * Gets the latest posts from the RSS feed 80 | * 81 | * @param array $options Array of options to pass to the API. Currently unused. 82 | * @return Mastodon_Post[] 83 | */ 84 | public function posts_latest( $options = [] ) { 85 | // We use a timestamp in a transient to suspend calls for a 1 seconds 86 | // to avoid completely spamming the API. 87 | $suspended = get_transient( 'mastodon-posts-all-suspended' ); 88 | if ( false !== $suspended ) { 89 | Sync_Mastodon::log( 'Waiting for API...' ); 90 | // Wait for a second to ensure we are past the transient delay 91 | sleep( 1 ); 92 | } 93 | 94 | set_transient( 'mastodon-posts-all-suspended', time(), 1 ); 95 | 96 | return $this->call(); 97 | } 98 | 99 | } 100 | -------------------------------------------------------------------------------- /src/class-sync-mastodon-admin.php: -------------------------------------------------------------------------------- 1 | handle_submission(); 31 | 32 | $rss_url = Sync_Mastodon_Options::get_rss_url(); 33 | $post_author = Sync_Mastodon_Options::get_post_author(); 34 | $post_type = Sync_Mastodon_Options::get_post_type(); 35 | $post_sync_status = Sync_Mastodon_Options::get_post_sync_status(); 36 | 37 | ?> 38 |

Sync Mastodon Settings

39 | 40 |
41 | 42 |

Please note: This is not an official Mastodon plugin. If you have any problems please direct them to the WordPress support forums for this plugin.

43 | 44 |
45 | 46 |
47 | 48 | 49 | 50 | 51 | 54 | 58 | 59 | 60 | 63 | 73 | 74 | 75 | 78 | 88 | 89 | 90 | 93 | 111 | 112 | 113 |
52 | 53 | 55 | 56 |

You can get this from your Mastodon user URL by adding ".rss"

57 |
61 | 62 | 64 | 71 |

All new posts synced will be assigned to this author.

72 |
76 | 77 | 79 | 86 |

All new posts synced will be assigned to this post type.

87 |
91 | Auto-sync 92 | 94 | 95 | > 96 | 97 | 98 | 99 | > 100 | 101 | 102 |

103 | Turn this on to allow automatic syncing using WordPress's built-in scheduler (WP-Cron). 104 |

105 | 106 |

107 | Next sync: next_sync_time(); ?> 108 |

109 | 110 |
114 |

115 | 116 |

117 |
118 | last_sync = ( false !== $stored_last_sync ) ? $stored_last_sync : 0; 28 | } 29 | 30 | public function sync() { 31 | $api = new Mastodon_API(); 32 | 33 | Sync_Mastodon::log( 'Getting last post from WordPress' ); 34 | 35 | $latest_posts = get_posts( 36 | [ 37 | 'post_type' => Sync_Mastodon_Options::get_post_type(), 38 | 'posts_per_page' => 1, 39 | 'orderby' => 'date', 40 | 'order' => 'DESC', 41 | ] 42 | ); 43 | 44 | if ( empty( $latest_posts ) ) { 45 | Sync_Mastodon::log( 'No last post found. This will sync all!' ); 46 | $latest_post_date = 0; 47 | } else { 48 | Sync_Mastodon::log( 'Last post found: ' . $latest_posts[0]->post_date_gmt ); 49 | $latest_post_date = strtotime( $latest_posts[0]->post_date_gmt ); 50 | } 51 | 52 | /** 53 | * @var Mastodon_Post[] 54 | */ 55 | $new_posts = []; 56 | 57 | Sync_Mastodon::log( 'Fetching Mastodon posts' ); 58 | 59 | $fetched_posts = $api->posts_latest(); 60 | 61 | Sync_Mastodon::log( 'Fetched ' . count( $fetched_posts ) . ' posts' ); 62 | 63 | foreach ( $fetched_posts as $post ) { 64 | if ( $post->date > $latest_post_date ) { 65 | // Sync_Mastodon::log( 'Post created at ' . $post->created . ' is newer than latest boopostkmark date ' . $latest_post_date ); 66 | $new_posts[] = $post; 67 | } else { 68 | break; 69 | } 70 | } 71 | 72 | if ( ! is_array( $new_posts ) ) { 73 | Sync_Mastodon::error( 'Tried sync, but no new posts were retrieved' ); 74 | return; 75 | } 76 | 77 | Sync_Mastodon::log( 'Retrieved ' . count( $new_posts ) . ' from Mastodon' ); 78 | 79 | // Get the author ID to use. 80 | $author_id = Sync_Mastodon_Options::get_post_author(); 81 | 82 | // Added post count 83 | $added_post_count = 0; 84 | 85 | // Loop through posts creating posts for them. 86 | foreach ( $new_posts as $post ) { 87 | 88 | Sync_Mastodon::log( 'Syncing post: ' . $post->title ); 89 | 90 | $existing_post = \SyncMastodon\Mastodon_Post::with_id( $post->id ); 91 | if ( $existing_post ) { 92 | Sync_Mastodon::log( 'Existing post with ID ' . $existing_post->ID . ' found. Skipping.' ); 93 | continue; 94 | } 95 | 96 | $post_data = [ 97 | 'post_type' => Sync_Mastodon_Options::get_post_type(), 98 | 'post_date' => date( 'Y-m-d H:i:s', Sync_Mastodon::make_time_local( $post->date ) ), 99 | 'post_title' => empty( $post->title ) ? date( 'Y-m-d H:i:s', Sync_Mastodon::make_time_local( $post->date ) ) : $post->title, 100 | 'post_content' => $post->content, 101 | // 'post_status' => 'yes' === $post->shared ? 'publish' : 'private', 102 | 'post_status' => 'publish', 103 | 'meta_input' => [ 104 | 'mastodon_permalink' => $post->permalink, 105 | 'mastodon_id' => $post->id, 106 | 'mastodon_excerpt' => $post->excerpt, 107 | ], 108 | 'post_author' => $author_id, 109 | ]; 110 | 111 | $result = wp_insert_post( $post_data ); 112 | 113 | if ( $result === 0 ) { 114 | Sync_Mastodon::error( 'Error inserting post' ); 115 | continue; 116 | } 117 | 118 | $added_post_count++; 119 | 120 | $post->sideload_media( $result ); 121 | 122 | // TAXONOMIES? 123 | // if ( $result > 0 ) { 124 | // wp_set_post_terms( $result, $post->tags, 'mastodon-tag' ); 125 | // } 126 | 127 | } 128 | 129 | Sync_Mastodon::log( 'Added ' . $added_post_count . ' new posts' ); 130 | 131 | // Update last sync time 132 | $this->last_sync = time(); 133 | update_option( 'sync-mastodon-last-sync', $this->last_sync ); 134 | 135 | } 136 | 137 | } 138 | -------------------------------------------------------------------------------- /src/class-sync-mastodon-cron.php: -------------------------------------------------------------------------------- 1 | hook_name, [ $this, 'sync' ] ); 15 | 16 | if ( ! wp_next_scheduled( $this->hook_name ) ) { 17 | wp_schedule_event( time(), 'five_minutes', $this->hook_name ); 18 | } 19 | 20 | add_action( 'sync_mastodon_deactivate', [ $this, 'remove_cron' ] ); 21 | } 22 | 23 | public function sync_mastodon_cron_interval( $schedules ) { 24 | $schedules['five_minutes'] = [ 25 | 'interval' => 5 * 60, 26 | 'display' => esc_html__( 'Every Five Minutes' ), 27 | ]; 28 | 29 | return $schedules; 30 | } 31 | 32 | public function remove_cron() { 33 | echo 'Removing cron'; 34 | $timestamp = wp_next_scheduled( $this->hook_name ); 35 | wp_unschedule_event( $timestamp, $this->hook_name ); 36 | } 37 | 38 | public function sync() { 39 | if ( 0 == Sync_Mastodon_Options::get_post_sync_status() ) { 40 | return; 41 | } 42 | 43 | $core = new Sync_Mastodon_Core(); 44 | $core->sync(); 45 | } 46 | 47 | public function next_sync_time() { 48 | $timestamp = wp_next_scheduled( $this->hook_name ); 49 | // There MUST be a WP function to format a time and take into account the offset, but I can't find it. 50 | return date_i18n( 'H:i:s', $timestamp + ( get_option( 'gmt_offset' ) * 60 * 60 ) ); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /src/class-sync-mastodon-meta-boxes.php: -------------------------------------------------------------------------------- 1 | Sync_Mastodon_Options::get_post_type(), 17 | 'type' => 'string', 18 | 'description' => 'The URL of the bookmark', 19 | 'single' => true, 20 | 'show_in_rest' => true, 21 | ] 22 | ); 23 | 24 | // TODO: Need to properly register Mastodon meta fields 25 | // register_rest_field(Sync_Mastodon_Options::get_post_type(), 'content_raw', [ 26 | // 'get_callback' => function ($post_array) { 27 | // return $post_array['content']['raw']; 28 | // }, 29 | // 'schema' => [ 30 | // 'description' => 'The raw content', 31 | // 'type' => 'string', 32 | // ], 33 | // ]); 34 | } 35 | 36 | public function add_meta_boxes() { 37 | add_meta_box( 'sync-mastodon-details', 'Mastodon details', [ $this, 'meta_box' ], Sync_Mastodon_Options::get_post_type(), 'normal', 'default' ); 38 | } 39 | 40 | // TODO: Use the right meta boxes/fields 41 | public function meta_box( $post ) { 42 | wp_nonce_field( basename( __FILE__ ), 'sync-mastodon-meta-nonce' ); 43 | ?> 44 | 45 |

46 | 47 |
48 | 49 |

50 | post_type ); 61 | 62 | // If this isn't a 'mastodon-post' post (or whatever is set), don't update it. 63 | if ( Sync_Mastodon_Options::get_post_type() != $post_type->name ) { 64 | return; 65 | } 66 | 67 | /* Check if the current user has permission to edit the post. */ 68 | if ( ! current_user_can( $post_type->cap->edit_post, $post_id ) ) { 69 | return $post_id; 70 | } 71 | 72 | /* Get the posted data and sanitize it for use as an HTML class. */ 73 | $new_meta_value = ( isset( $_POST['sync-mastodon-url'] ) ? esc_url_raw( $_POST['sync-mastodon-url'] ) : '' ); 74 | 75 | if ( empty( $new_meta_value ) ) { 76 | delete_post_meta( $post_id, 'url' ); 77 | } else { 78 | update_post_meta( $post_id, 'url', $new_meta_value ); 79 | } 80 | 81 | } 82 | 83 | } 84 | -------------------------------------------------------------------------------- /src/class-sync-mastodon-options.php: -------------------------------------------------------------------------------- 1 | sync(); 44 | 45 | \WP_CLI::log( 'Sync finished' ); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/data/class-mastodon-media.php: -------------------------------------------------------------------------------- 1 | url = $data['url']; 52 | $media->title = $data['title']; 53 | $media->description = $data['description']; 54 | 55 | return $media; 56 | } 57 | 58 | /** 59 | * Undocumented function 60 | * 61 | * @param int $wp_post_id The WordPress post ID to attach to. 62 | * @return int The WordPress media ID 63 | */ 64 | public function sideload( $wp_post_id ) { 65 | Sync_Mastodon::log( 'Sideloading media item ' . $this->url . ' to post ID ' . $wp_post_id . '...' ); 66 | 67 | $this->wordpress_id = media_sideload_image( $this->url, $wp_post_id, $this->title, 'id' ); 68 | 69 | if ( is_wp_error( $this->wordpress_id ) ) { 70 | Sync_Mastodon::log( 'Error sideloading media item ' . $this->url . ' to post ID ' . $wp_post_id . ': ' . $this->wordpress_id->get_error_message() ); 71 | return 0; 72 | } 73 | 74 | // Set the alt text 75 | update_post_meta( $this->wordpress_id, '_wp_attachment_image_alt', $this->description ); 76 | 77 | return $this->wordpress_id; 78 | } 79 | 80 | } 81 | -------------------------------------------------------------------------------- /src/data/class-mastodon-post.php: -------------------------------------------------------------------------------- 1 | id = $data->get_id(); 83 | $post->permalink = $data->get_permalink(); 84 | $post->title = $data->get_title(); 85 | $post->excerpt = $data->get_description(); 86 | $post->content = $data->get_content(); 87 | $post->date = $data->get_gmdate( 'U' ); 88 | 89 | $media = $data->get_enclosures(); 90 | 91 | if ( ! is_array( $media ) || empty( $media ) ) { 92 | return $post; 93 | } 94 | 95 | foreach ( $media as $media_item ) { 96 | if ( $media_item->get_type() !== null ) { 97 | $post->media[] = Mastodon_Media::from_array( 98 | [ 99 | 'url' => $media_item->get_link(), 100 | 'title' => $media_item->get_title(), 101 | 'description' => $media_item->get_description(), 102 | ] 103 | ); 104 | } 105 | } 106 | 107 | return $post; 108 | } 109 | 110 | /** 111 | * This will sideload the media files and attach them to the specifed WordPress post. 112 | * 113 | * You'll need to do this once a WP post has been created. 114 | * 115 | * @param int $wp_post_id The WordPress post ID to attach items to. 116 | * @return void 117 | */ 118 | public function sideload_media( $wp_post_id ) { 119 | Sync_Mastodon::log( 'Loading media for post ID ' . $wp_post_id . '...' ); 120 | 121 | if ( empty( $this->media ) ) { 122 | Sync_Mastodon::log( 'No media to load.' ); 123 | return; 124 | } 125 | 126 | $this->media_ids = []; 127 | 128 | foreach ( $this->media as $media_item ) { 129 | $this->media_ids[] = $media_item->sideload( $wp_post_id ); 130 | } 131 | 132 | if ( ! empty( $this->media_ids ) ) { 133 | Sync_Mastodon::log( 'Setting post thumbnail for post ID ' . $wp_post_id . ' to media ID ' . $this->media_ids[0] . '...' ); 134 | set_post_thumbnail( $wp_post_id, $this->media_ids[0] ); 135 | } 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /src/post-types/class-mastodon-post.php: -------------------------------------------------------------------------------- 1 | Sync_Mastodon_Options::get_post_type(), 23 | 'meta_query' => [ 24 | [ 25 | 'key' => 'mastodon_id', 26 | 'value' => $id, 27 | ], 28 | ], 29 | ] 30 | ); 31 | if ( ! empty( $posts ) ) { 32 | return current( $posts ); 33 | } else { 34 | return null; 35 | } 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/post-types/mastodon-post.php: -------------------------------------------------------------------------------- 1 | [ 14 | 'name' => __( 'Mastodon Posts', 'sync-mastodon' ), 15 | 'singular_name' => __( 'Mastodon Post', 'sync-mastodon' ), 16 | 'all_items' => __( 'All Mastodon Posts', 'sync-mastodon' ), 17 | 'archives' => __( 'Mastodon Post Archives', 'sync-mastodon' ), 18 | 'attributes' => __( 'Mastodon Post Attributes', 'sync-mastodon' ), 19 | 'insert_into_item' => __( 'Insert into Mastodon Post', 'sync-mastodon' ), 20 | 'uploaded_to_this_item' => __( 'Uploaded to this Mastodon Post', 'sync-mastodon' ), 21 | 'featured_image' => _x( 'Featured Image', Sync_Mastodon_Options::get_post_type(), 'sync-mastodon' ), 22 | 'set_featured_image' => _x( 'Set featured image', Sync_Mastodon_Options::get_post_type(), 'sync-mastodon' ), 23 | 'remove_featured_image' => _x( 'Remove featured image', Sync_Mastodon_Options::get_post_type(), 'sync-mastodon' ), 24 | 'use_featured_image' => _x( 'Use as featured image', Sync_Mastodon_Options::get_post_type(), 'sync-mastodon' ), 25 | 'filter_items_list' => __( 'Filter Mastodon Posts list', 'sync-mastodon' ), 26 | 'items_list_navigation' => __( 'Mastodon Posts list navigation', 'sync-mastodon' ), 27 | 'items_list' => __( 'Mastodon Posts list', 'sync-mastodon' ), 28 | 'new_item' => __( 'New Mastodon Post', 'sync-mastodon' ), 29 | 'add_new' => __( 'Add New', 'sync-mastodon' ), 30 | 'add_new_item' => __( 'Add New Mastodon Post', 'sync-mastodon' ), 31 | 'edit_item' => __( 'Edit Mastodon Post', 'sync-mastodon' ), 32 | 'view_item' => __( 'View Mastodon Post', 'sync-mastodon' ), 33 | 'view_items' => __( 'View Mastodon Posts', 'sync-mastodon' ), 34 | 'search_items' => __( 'Search Mastodon Posts', 'sync-mastodon' ), 35 | 'not_found' => __( 'No Mastodon Posts found', 'sync-mastodon' ), 36 | 'not_found_in_trash' => __( 'No Mastodon Posts found in trash', 'sync-mastodon' ), 37 | 'parent_item_colon' => __( 'Parent Mastodon Post:', 'sync-mastodon' ), 38 | 'menu_name' => __( 'Mastodon Posts', 'sync-mastodon' ), 39 | ], 40 | 'public' => true, 41 | 'hierarchical' => false, 42 | 'show_ui' => true, 43 | 'show_in_nav_menus' => true, 44 | 'supports' => [ 'title', 'editor', 'author', 'custom-fields', 'excerpt' ], 45 | 'has_archive' => true, 46 | 'rewrite' => true, 47 | 'exclude_from_search' => true, 48 | 'query_var' => true, 49 | 'menu_position' => null, 50 | 'menu_icon' => 'dashicons-pressthis', 51 | 'show_in_rest' => true, 52 | 'rest_base' => 'mastodon-post', 53 | 'rest_controller_class' => 'WP_REST_Posts_Controller', 54 | ]; 55 | 56 | $mastodon_post_post_type_options = apply_filters( 'sync-mastodon-post-post-type-options', $mastodon_post_post_type_options ); 57 | 58 | register_post_type( 'mastodon-post', $mastodon_post_post_type_options ); 59 | 60 | } 61 | add_action( 'init', 'mastodon_post_init' ); 62 | 63 | /** 64 | * Sets the post updated messages for the `mastodon_post` post type. 65 | * 66 | * @param array $messages Post updated messages. 67 | * @return array Messages for the `mastodon_post` post type. 68 | */ 69 | function mastodon_post_updated_messages( $messages ) { 70 | global $post; 71 | 72 | $permalink = get_permalink( $post ); 73 | 74 | $messages[ Sync_Mastodon_Options::get_post_type() ] = [ 75 | 0 => '', // Unused. Messages start at index 1. 76 | /* translators: %s: post permalink */ 77 | 1 => sprintf( __( 'Mastodon Post updated. View Mastodon Post', 'sync-mastodon' ), esc_url( $permalink ) ), 78 | 2 => __( 'Custom field updated.', 'sync-mastodon' ), 79 | 3 => __( 'Custom field deleted.', 'sync-mastodon' ), 80 | 4 => __( 'Mastodon Post updated.', 'sync-mastodon' ), 81 | /* translators: %s: date and time of the revision */ 82 | 5 => isset( $_GET['revision'] ) ? sprintf( __( 'Mastodon Post restored to revision from %s', 'sync-mastodon' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 83 | /* translators: %s: post permalink */ 84 | 6 => sprintf( __( 'Mastodon Post published. View Mastodon Post', 'sync-mastodon' ), esc_url( $permalink ) ), 85 | 7 => __( 'Mastodon Post saved.', 'sync-mastodon' ), 86 | /* translators: %s: post permalink */ 87 | 8 => sprintf( __( 'Mastodon Post submitted. Preview Mastodon Post', 'sync-mastodon' ), esc_url( add_query_arg( 'preview', 'true', $permalink ) ) ), 88 | /* translators: 1: Publish box date format, see https://secure.php.net/date 2: Post permalink */ 89 | 9 => sprintf( 90 | __( 'Mastodon Post scheduled for: %1$s. Preview Mastodon Post', 'sync-mastodon' ), 91 | date_i18n( __( 'M j, Y @ G:i', 'sync-mastodon' ), strtotime( $post->post_date ) ), esc_url( $permalink ) 92 | ), 93 | /* translators: %s: post permalink */ 94 | 10 => sprintf( __( 'Mastodon Post draft updated. Preview Mastodon Post', 'sync-mastodon' ), esc_url( add_query_arg( 'preview', 'true', $permalink ) ) ), 95 | ]; 96 | 97 | return $messages; 98 | } 99 | add_filter( 'post_updated_messages', 'mastodon_post_updated_messages' ); 100 | -------------------------------------------------------------------------------- /src/taxonomies/mastodon-tag.php: -------------------------------------------------------------------------------- 1 | false, 11 | 'public' => true, 12 | 'show_in_nav_menus' => true, 13 | 'show_ui' => true, 14 | 'show_admin_column' => false, 15 | 'query_var' => true, 16 | 'rewrite' => true, 17 | 'capabilities' => [ 18 | 'manage_terms' => 'edit_posts', 19 | 'edit_terms' => 'edit_posts', 20 | 'delete_terms' => 'edit_posts', 21 | 'assign_terms' => 'edit_posts', 22 | ], 23 | 'labels' => [ 24 | 'name' => __( 'Mastodon Tags', 'sync-mastodon' ), 25 | 'singular_name' => _x( 'Mastodon Tag', 'taxonomy general name', 'sync-mastodon' ), 26 | 'search_items' => __( 'Search Mastodon Tags', 'sync-mastodon' ), 27 | 'popular_items' => __( 'Popular Mastodon Tags', 'sync-mastodon' ), 28 | 'all_items' => __( 'All Mastodon Tags', 'sync-mastodon' ), 29 | 'parent_item' => __( 'Parent Mastodon Tag', 'sync-mastodon' ), 30 | 'parent_item_colon' => __( 'Parent Mastodon Tag:', 'sync-mastodon' ), 31 | 'edit_item' => __( 'Edit Mastodon Tag', 'sync-mastodon' ), 32 | 'update_item' => __( 'Update Mastodon Tag', 'sync-mastodon' ), 33 | 'view_item' => __( 'View Mastodon Tag', 'sync-mastodon' ), 34 | 'add_new_item' => __( 'Add New Mastodon Tag', 'sync-mastodon' ), 35 | 'new_item_name' => __( 'New Mastodon Tag', 'sync-mastodon' ), 36 | 'separate_items_with_commas' => __( 'Separate Mastodon Tags with commas', 'sync-mastodon' ), 37 | 'add_or_remove_items' => __( 'Add or remove Mastodon Tags', 'sync-mastodon' ), 38 | 'choose_from_most_used' => __( 'Choose from the most used Mastodon Tags', 'sync-mastodon' ), 39 | 'not_found' => __( 'No Mastodon Tags found.', 'sync-mastodon' ), 40 | 'no_terms' => __( 'No Mastodon Tags', 'sync-mastodon' ), 41 | 'menu_name' => __( 'Mastodon Tags', 'sync-mastodon' ), 42 | 'items_list_navigation' => __( 'Mastodon Tags list navigation', 'sync-mastodon' ), 43 | 'items_list' => __( 'Mastodon Tags list', 'sync-mastodon' ), 44 | 'most_used' => _x( 'Most Used', 'mastodon-tag', 'sync-mastodon' ), 45 | 'back_to_items' => __( '← Back to Mastodon Tags', 'sync-mastodon' ), 46 | ], 47 | 'show_in_rest' => true, 48 | 'rest_base' => 'mastodon-tag', 49 | 'rest_controller_class' => 'WP_REST_Terms_Controller', 50 | ] 51 | ); 52 | 53 | } 54 | add_action( 'init', 'mastodon_tag_init' ); 55 | 56 | /** 57 | * Sets the post updated messages for the `mastodon_tag` taxonomy. 58 | * 59 | * @param array $messages Post updated messages. 60 | * @return array Messages for the `mastodon_tag` taxonomy. 61 | */ 62 | function mastodon_tag_updated_messages( $messages ) { 63 | $messages['mastodon-tag'] = [ 64 | 0 => '', // Unused. Messages start at index 1. 65 | 1 => __( 'Mastodon Tag added.', 'sync-mastodon' ), 66 | 2 => __( 'Mastodon Tag deleted.', 'sync-mastodon' ), 67 | 3 => __( 'Mastodon Tag updated.', 'sync-mastodon' ), 68 | 4 => __( 'Mastodon Tag not added.', 'sync-mastodon' ), 69 | 5 => __( 'Mastodon Tag not updated.', 'sync-mastodon' ), 70 | 6 => __( 'Mastodon Tags deleted.', 'sync-mastodon' ), 71 | ]; 72 | 73 | return $messages; 74 | } 75 | add_filter( 'term_updated_messages', 'mastodon_tag_updated_messages' ); 76 | -------------------------------------------------------------------------------- /sync-mastodon.php: -------------------------------------------------------------------------------- 1 | register_deactivation_hook(); 45 | } 46 | 47 | /** 48 | * Run any init hook actions 49 | * 50 | * @return void 51 | */ 52 | public function init_hooks() { 53 | new Sync_Mastodon_Cron(); 54 | new Sync_Mastodon_Meta_Boxes(); 55 | new Sync_Mastodon_WPCLI(); 56 | } 57 | 58 | /** 59 | * Run any admin menu hook actions 60 | * 61 | * @return void 62 | */ 63 | public function admin_menu_hooks() { 64 | new Sync_Mastodon_Admin(); 65 | } 66 | 67 | /** 68 | * Register a deactivation hook - this will trigger the sync_mastodon_deactivate action 69 | * so anything that needs to be done on deactivation should be done using that hook. 70 | * 71 | * @return void 72 | */ 73 | public function register_deactivation_hook() { 74 | register_deactivation_hook( __FILE__, [ $this, 'run_deactivation_hook' ] ); 75 | } 76 | 77 | /** 78 | * This actually does the sync_mastodon_deactivate hook 79 | */ 80 | public function run_deactivation_hook() { 81 | do_action( 'sync_mastodon_deactivate' ); 82 | } 83 | 84 | /** 85 | * This takes a timestamp and turns it into local time using the gmt_offset options 86 | */ 87 | public static function make_time_local( $timestamp ) { 88 | $offset_secs = ( (int) get_option( 'gmt_offset' ) ) * 60 * 60; 89 | return $timestamp + $offset_secs; 90 | } 91 | 92 | /** 93 | * This does information logging based on how the sync has been called 94 | */ 95 | public static function log( $message ) { 96 | if ( class_exists( 'WP_CLI' ) ) { 97 | \WP_CLI::log( $message ); 98 | } 99 | return; 100 | } 101 | 102 | /** 103 | * This does error logging based on how the sync has been called 104 | */ 105 | public static function error( $message ) { 106 | if ( class_exists( 'WP_CLI' ) ) { 107 | \WP_CLI::error( $message ); 108 | } 109 | } 110 | 111 | } 112 | 113 | $syncmastodon_instance = new Sync_Mastodon(); 114 | -------------------------------------------------------------------------------- /vendor/autoload.php: -------------------------------------------------------------------------------- 1 | 7 | * Jordi Boggiano 8 | * 9 | * For the full copyright and license information, please view the LICENSE 10 | * file that was distributed with this source code. 11 | */ 12 | 13 | namespace Composer\Autoload; 14 | 15 | /** 16 | * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. 17 | * 18 | * $loader = new \Composer\Autoload\ClassLoader(); 19 | * 20 | * // register classes with namespaces 21 | * $loader->add('Symfony\Component', __DIR__.'/component'); 22 | * $loader->add('Symfony', __DIR__.'/framework'); 23 | * 24 | * // activate the autoloader 25 | * $loader->register(); 26 | * 27 | * // to enable searching the include path (eg. for PEAR packages) 28 | * $loader->setUseIncludePath(true); 29 | * 30 | * In this example, if you try to use a class in the Symfony\Component 31 | * namespace or one of its children (Symfony\Component\Console for instance), 32 | * the autoloader will first look for the class under the component/ 33 | * directory, and it will then fallback to the framework/ directory if not 34 | * found before giving up. 35 | * 36 | * This class is loosely based on the Symfony UniversalClassLoader. 37 | * 38 | * @author Fabien Potencier 39 | * @author Jordi Boggiano 40 | * @see https://www.php-fig.org/psr/psr-0/ 41 | * @see https://www.php-fig.org/psr/psr-4/ 42 | */ 43 | class ClassLoader 44 | { 45 | /** @var \Closure(string):void */ 46 | private $includeFile; 47 | 48 | /** @var ?string */ 49 | private $vendorDir; 50 | 51 | // PSR-4 52 | /** 53 | * @var array[] 54 | * @psalm-var array> 55 | */ 56 | private $prefixLengthsPsr4 = array(); 57 | /** 58 | * @var array[] 59 | * @psalm-var array> 60 | */ 61 | private $prefixDirsPsr4 = array(); 62 | /** 63 | * @var array[] 64 | * @psalm-var array 65 | */ 66 | private $fallbackDirsPsr4 = array(); 67 | 68 | // PSR-0 69 | /** 70 | * @var array[] 71 | * @psalm-var array> 72 | */ 73 | private $prefixesPsr0 = array(); 74 | /** 75 | * @var array[] 76 | * @psalm-var array 77 | */ 78 | private $fallbackDirsPsr0 = array(); 79 | 80 | /** @var bool */ 81 | private $useIncludePath = false; 82 | 83 | /** 84 | * @var string[] 85 | * @psalm-var array 86 | */ 87 | private $classMap = array(); 88 | 89 | /** @var bool */ 90 | private $classMapAuthoritative = false; 91 | 92 | /** 93 | * @var bool[] 94 | * @psalm-var array 95 | */ 96 | private $missingClasses = array(); 97 | 98 | /** @var ?string */ 99 | private $apcuPrefix; 100 | 101 | /** 102 | * @var self[] 103 | */ 104 | private static $registeredLoaders = array(); 105 | 106 | /** 107 | * @param ?string $vendorDir 108 | */ 109 | public function __construct($vendorDir = null) 110 | { 111 | $this->vendorDir = $vendorDir; 112 | 113 | /** 114 | * Scope isolated include. 115 | * 116 | * Prevents access to $this/self from included files. 117 | * 118 | * @param string $file 119 | * @return void 120 | */ 121 | $this->includeFile = static function($file) { 122 | include $file; 123 | }; 124 | } 125 | 126 | /** 127 | * @return string[] 128 | */ 129 | public function getPrefixes() 130 | { 131 | if (!empty($this->prefixesPsr0)) { 132 | return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); 133 | } 134 | 135 | return array(); 136 | } 137 | 138 | /** 139 | * @return array[] 140 | * @psalm-return array> 141 | */ 142 | public function getPrefixesPsr4() 143 | { 144 | return $this->prefixDirsPsr4; 145 | } 146 | 147 | /** 148 | * @return array[] 149 | * @psalm-return array 150 | */ 151 | public function getFallbackDirs() 152 | { 153 | return $this->fallbackDirsPsr0; 154 | } 155 | 156 | /** 157 | * @return array[] 158 | * @psalm-return array 159 | */ 160 | public function getFallbackDirsPsr4() 161 | { 162 | return $this->fallbackDirsPsr4; 163 | } 164 | 165 | /** 166 | * @return string[] Array of classname => path 167 | * @psalm-return array 168 | */ 169 | public function getClassMap() 170 | { 171 | return $this->classMap; 172 | } 173 | 174 | /** 175 | * @param string[] $classMap Class to filename map 176 | * @psalm-param array $classMap 177 | * 178 | * @return void 179 | */ 180 | public function addClassMap(array $classMap) 181 | { 182 | if ($this->classMap) { 183 | $this->classMap = array_merge($this->classMap, $classMap); 184 | } else { 185 | $this->classMap = $classMap; 186 | } 187 | } 188 | 189 | /** 190 | * Registers a set of PSR-0 directories for a given prefix, either 191 | * appending or prepending to the ones previously set for this prefix. 192 | * 193 | * @param string $prefix The prefix 194 | * @param string[]|string $paths The PSR-0 root directories 195 | * @param bool $prepend Whether to prepend the directories 196 | * 197 | * @return void 198 | */ 199 | public function add($prefix, $paths, $prepend = false) 200 | { 201 | if (!$prefix) { 202 | if ($prepend) { 203 | $this->fallbackDirsPsr0 = array_merge( 204 | (array) $paths, 205 | $this->fallbackDirsPsr0 206 | ); 207 | } else { 208 | $this->fallbackDirsPsr0 = array_merge( 209 | $this->fallbackDirsPsr0, 210 | (array) $paths 211 | ); 212 | } 213 | 214 | return; 215 | } 216 | 217 | $first = $prefix[0]; 218 | if (!isset($this->prefixesPsr0[$first][$prefix])) { 219 | $this->prefixesPsr0[$first][$prefix] = (array) $paths; 220 | 221 | return; 222 | } 223 | if ($prepend) { 224 | $this->prefixesPsr0[$first][$prefix] = array_merge( 225 | (array) $paths, 226 | $this->prefixesPsr0[$first][$prefix] 227 | ); 228 | } else { 229 | $this->prefixesPsr0[$first][$prefix] = array_merge( 230 | $this->prefixesPsr0[$first][$prefix], 231 | (array) $paths 232 | ); 233 | } 234 | } 235 | 236 | /** 237 | * Registers a set of PSR-4 directories for a given namespace, either 238 | * appending or prepending to the ones previously set for this namespace. 239 | * 240 | * @param string $prefix The prefix/namespace, with trailing '\\' 241 | * @param string[]|string $paths The PSR-4 base directories 242 | * @param bool $prepend Whether to prepend the directories 243 | * 244 | * @throws \InvalidArgumentException 245 | * 246 | * @return void 247 | */ 248 | public function addPsr4($prefix, $paths, $prepend = false) 249 | { 250 | if (!$prefix) { 251 | // Register directories for the root namespace. 252 | if ($prepend) { 253 | $this->fallbackDirsPsr4 = array_merge( 254 | (array) $paths, 255 | $this->fallbackDirsPsr4 256 | ); 257 | } else { 258 | $this->fallbackDirsPsr4 = array_merge( 259 | $this->fallbackDirsPsr4, 260 | (array) $paths 261 | ); 262 | } 263 | } elseif (!isset($this->prefixDirsPsr4[$prefix])) { 264 | // Register directories for a new namespace. 265 | $length = strlen($prefix); 266 | if ('\\' !== $prefix[$length - 1]) { 267 | throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); 268 | } 269 | $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; 270 | $this->prefixDirsPsr4[$prefix] = (array) $paths; 271 | } elseif ($prepend) { 272 | // Prepend directories for an already registered namespace. 273 | $this->prefixDirsPsr4[$prefix] = array_merge( 274 | (array) $paths, 275 | $this->prefixDirsPsr4[$prefix] 276 | ); 277 | } else { 278 | // Append directories for an already registered namespace. 279 | $this->prefixDirsPsr4[$prefix] = array_merge( 280 | $this->prefixDirsPsr4[$prefix], 281 | (array) $paths 282 | ); 283 | } 284 | } 285 | 286 | /** 287 | * Registers a set of PSR-0 directories for a given prefix, 288 | * replacing any others previously set for this prefix. 289 | * 290 | * @param string $prefix The prefix 291 | * @param string[]|string $paths The PSR-0 base directories 292 | * 293 | * @return void 294 | */ 295 | public function set($prefix, $paths) 296 | { 297 | if (!$prefix) { 298 | $this->fallbackDirsPsr0 = (array) $paths; 299 | } else { 300 | $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; 301 | } 302 | } 303 | 304 | /** 305 | * Registers a set of PSR-4 directories for a given namespace, 306 | * replacing any others previously set for this namespace. 307 | * 308 | * @param string $prefix The prefix/namespace, with trailing '\\' 309 | * @param string[]|string $paths The PSR-4 base directories 310 | * 311 | * @throws \InvalidArgumentException 312 | * 313 | * @return void 314 | */ 315 | public function setPsr4($prefix, $paths) 316 | { 317 | if (!$prefix) { 318 | $this->fallbackDirsPsr4 = (array) $paths; 319 | } else { 320 | $length = strlen($prefix); 321 | if ('\\' !== $prefix[$length - 1]) { 322 | throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); 323 | } 324 | $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; 325 | $this->prefixDirsPsr4[$prefix] = (array) $paths; 326 | } 327 | } 328 | 329 | /** 330 | * Turns on searching the include path for class files. 331 | * 332 | * @param bool $useIncludePath 333 | * 334 | * @return void 335 | */ 336 | public function setUseIncludePath($useIncludePath) 337 | { 338 | $this->useIncludePath = $useIncludePath; 339 | } 340 | 341 | /** 342 | * Can be used to check if the autoloader uses the include path to check 343 | * for classes. 344 | * 345 | * @return bool 346 | */ 347 | public function getUseIncludePath() 348 | { 349 | return $this->useIncludePath; 350 | } 351 | 352 | /** 353 | * Turns off searching the prefix and fallback directories for classes 354 | * that have not been registered with the class map. 355 | * 356 | * @param bool $classMapAuthoritative 357 | * 358 | * @return void 359 | */ 360 | public function setClassMapAuthoritative($classMapAuthoritative) 361 | { 362 | $this->classMapAuthoritative = $classMapAuthoritative; 363 | } 364 | 365 | /** 366 | * Should class lookup fail if not found in the current class map? 367 | * 368 | * @return bool 369 | */ 370 | public function isClassMapAuthoritative() 371 | { 372 | return $this->classMapAuthoritative; 373 | } 374 | 375 | /** 376 | * APCu prefix to use to cache found/not-found classes, if the extension is enabled. 377 | * 378 | * @param string|null $apcuPrefix 379 | * 380 | * @return void 381 | */ 382 | public function setApcuPrefix($apcuPrefix) 383 | { 384 | $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; 385 | } 386 | 387 | /** 388 | * The APCu prefix in use, or null if APCu caching is not enabled. 389 | * 390 | * @return string|null 391 | */ 392 | public function getApcuPrefix() 393 | { 394 | return $this->apcuPrefix; 395 | } 396 | 397 | /** 398 | * Registers this instance as an autoloader. 399 | * 400 | * @param bool $prepend Whether to prepend the autoloader or not 401 | * 402 | * @return void 403 | */ 404 | public function register($prepend = false) 405 | { 406 | spl_autoload_register(array($this, 'loadClass'), true, $prepend); 407 | 408 | if (null === $this->vendorDir) { 409 | return; 410 | } 411 | 412 | if ($prepend) { 413 | self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; 414 | } else { 415 | unset(self::$registeredLoaders[$this->vendorDir]); 416 | self::$registeredLoaders[$this->vendorDir] = $this; 417 | } 418 | } 419 | 420 | /** 421 | * Unregisters this instance as an autoloader. 422 | * 423 | * @return void 424 | */ 425 | public function unregister() 426 | { 427 | spl_autoload_unregister(array($this, 'loadClass')); 428 | 429 | if (null !== $this->vendorDir) { 430 | unset(self::$registeredLoaders[$this->vendorDir]); 431 | } 432 | } 433 | 434 | /** 435 | * Loads the given class or interface. 436 | * 437 | * @param string $class The name of the class 438 | * @return true|null True if loaded, null otherwise 439 | */ 440 | public function loadClass($class) 441 | { 442 | if ($file = $this->findFile($class)) { 443 | ($this->includeFile)($file); 444 | 445 | return true; 446 | } 447 | 448 | return null; 449 | } 450 | 451 | /** 452 | * Finds the path to the file where the class is defined. 453 | * 454 | * @param string $class The name of the class 455 | * 456 | * @return string|false The path if found, false otherwise 457 | */ 458 | public function findFile($class) 459 | { 460 | // class map lookup 461 | if (isset($this->classMap[$class])) { 462 | return $this->classMap[$class]; 463 | } 464 | if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { 465 | return false; 466 | } 467 | if (null !== $this->apcuPrefix) { 468 | $file = apcu_fetch($this->apcuPrefix.$class, $hit); 469 | if ($hit) { 470 | return $file; 471 | } 472 | } 473 | 474 | $file = $this->findFileWithExtension($class, '.php'); 475 | 476 | // Search for Hack files if we are running on HHVM 477 | if (false === $file && defined('HHVM_VERSION')) { 478 | $file = $this->findFileWithExtension($class, '.hh'); 479 | } 480 | 481 | if (null !== $this->apcuPrefix) { 482 | apcu_add($this->apcuPrefix.$class, $file); 483 | } 484 | 485 | if (false === $file) { 486 | // Remember that this class does not exist. 487 | $this->missingClasses[$class] = true; 488 | } 489 | 490 | return $file; 491 | } 492 | 493 | /** 494 | * Returns the currently registered loaders indexed by their corresponding vendor directories. 495 | * 496 | * @return self[] 497 | */ 498 | public static function getRegisteredLoaders() 499 | { 500 | return self::$registeredLoaders; 501 | } 502 | 503 | /** 504 | * @param string $class 505 | * @param string $ext 506 | * @return string|false 507 | */ 508 | private function findFileWithExtension($class, $ext) 509 | { 510 | // PSR-4 lookup 511 | $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; 512 | 513 | $first = $class[0]; 514 | if (isset($this->prefixLengthsPsr4[$first])) { 515 | $subPath = $class; 516 | while (false !== $lastPos = strrpos($subPath, '\\')) { 517 | $subPath = substr($subPath, 0, $lastPos); 518 | $search = $subPath . '\\'; 519 | if (isset($this->prefixDirsPsr4[$search])) { 520 | $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); 521 | foreach ($this->prefixDirsPsr4[$search] as $dir) { 522 | if (file_exists($file = $dir . $pathEnd)) { 523 | return $file; 524 | } 525 | } 526 | } 527 | } 528 | } 529 | 530 | // PSR-4 fallback dirs 531 | foreach ($this->fallbackDirsPsr4 as $dir) { 532 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { 533 | return $file; 534 | } 535 | } 536 | 537 | // PSR-0 lookup 538 | if (false !== $pos = strrpos($class, '\\')) { 539 | // namespaced class name 540 | $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) 541 | . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); 542 | } else { 543 | // PEAR-like class name 544 | $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; 545 | } 546 | 547 | if (isset($this->prefixesPsr0[$first])) { 548 | foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { 549 | if (0 === strpos($class, $prefix)) { 550 | foreach ($dirs as $dir) { 551 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { 552 | return $file; 553 | } 554 | } 555 | } 556 | } 557 | } 558 | 559 | // PSR-0 fallback dirs 560 | foreach ($this->fallbackDirsPsr0 as $dir) { 561 | if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { 562 | return $file; 563 | } 564 | } 565 | 566 | // PSR-0 include paths. 567 | if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { 568 | return $file; 569 | } 570 | 571 | return false; 572 | } 573 | } 574 | -------------------------------------------------------------------------------- /vendor/composer/InstalledVersions.php: -------------------------------------------------------------------------------- 1 | 7 | * Jordi Boggiano 8 | * 9 | * For the full copyright and license information, please view the LICENSE 10 | * file that was distributed with this source code. 11 | */ 12 | 13 | namespace Composer; 14 | 15 | use Composer\Autoload\ClassLoader; 16 | use Composer\Semver\VersionParser; 17 | 18 | /** 19 | * This class is copied in every Composer installed project and available to all 20 | * 21 | * See also https://getcomposer.org/doc/07-runtime.md#installed-versions 22 | * 23 | * To require its presence, you can require `composer-runtime-api ^2.0` 24 | * 25 | * @final 26 | */ 27 | class InstalledVersions 28 | { 29 | /** 30 | * @var mixed[]|null 31 | * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null 32 | */ 33 | private static $installed; 34 | 35 | /** 36 | * @var bool|null 37 | */ 38 | private static $canGetVendors; 39 | 40 | /** 41 | * @var array[] 42 | * @psalm-var array}> 43 | */ 44 | private static $installedByVendor = array(); 45 | 46 | /** 47 | * Returns a list of all package names which are present, either by being installed, replaced or provided 48 | * 49 | * @return string[] 50 | * @psalm-return list 51 | */ 52 | public static function getInstalledPackages() 53 | { 54 | $packages = array(); 55 | foreach (self::getInstalled() as $installed) { 56 | $packages[] = array_keys($installed['versions']); 57 | } 58 | 59 | if (1 === \count($packages)) { 60 | return $packages[0]; 61 | } 62 | 63 | return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); 64 | } 65 | 66 | /** 67 | * Returns a list of all package names with a specific type e.g. 'library' 68 | * 69 | * @param string $type 70 | * @return string[] 71 | * @psalm-return list 72 | */ 73 | public static function getInstalledPackagesByType($type) 74 | { 75 | $packagesByType = array(); 76 | 77 | foreach (self::getInstalled() as $installed) { 78 | foreach ($installed['versions'] as $name => $package) { 79 | if (isset($package['type']) && $package['type'] === $type) { 80 | $packagesByType[] = $name; 81 | } 82 | } 83 | } 84 | 85 | return $packagesByType; 86 | } 87 | 88 | /** 89 | * Checks whether the given package is installed 90 | * 91 | * This also returns true if the package name is provided or replaced by another package 92 | * 93 | * @param string $packageName 94 | * @param bool $includeDevRequirements 95 | * @return bool 96 | */ 97 | public static function isInstalled($packageName, $includeDevRequirements = true) 98 | { 99 | foreach (self::getInstalled() as $installed) { 100 | if (isset($installed['versions'][$packageName])) { 101 | return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); 102 | } 103 | } 104 | 105 | return false; 106 | } 107 | 108 | /** 109 | * Checks whether the given package satisfies a version constraint 110 | * 111 | * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: 112 | * 113 | * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') 114 | * 115 | * @param VersionParser $parser Install composer/semver to have access to this class and functionality 116 | * @param string $packageName 117 | * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package 118 | * @return bool 119 | */ 120 | public static function satisfies(VersionParser $parser, $packageName, $constraint) 121 | { 122 | $constraint = $parser->parseConstraints($constraint); 123 | $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); 124 | 125 | return $provided->matches($constraint); 126 | } 127 | 128 | /** 129 | * Returns a version constraint representing all the range(s) which are installed for a given package 130 | * 131 | * It is easier to use this via isInstalled() with the $constraint argument if you need to check 132 | * whether a given version of a package is installed, and not just whether it exists 133 | * 134 | * @param string $packageName 135 | * @return string Version constraint usable with composer/semver 136 | */ 137 | public static function getVersionRanges($packageName) 138 | { 139 | foreach (self::getInstalled() as $installed) { 140 | if (!isset($installed['versions'][$packageName])) { 141 | continue; 142 | } 143 | 144 | $ranges = array(); 145 | if (isset($installed['versions'][$packageName]['pretty_version'])) { 146 | $ranges[] = $installed['versions'][$packageName]['pretty_version']; 147 | } 148 | if (array_key_exists('aliases', $installed['versions'][$packageName])) { 149 | $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); 150 | } 151 | if (array_key_exists('replaced', $installed['versions'][$packageName])) { 152 | $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); 153 | } 154 | if (array_key_exists('provided', $installed['versions'][$packageName])) { 155 | $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); 156 | } 157 | 158 | return implode(' || ', $ranges); 159 | } 160 | 161 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 162 | } 163 | 164 | /** 165 | * @param string $packageName 166 | * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present 167 | */ 168 | public static function getVersion($packageName) 169 | { 170 | foreach (self::getInstalled() as $installed) { 171 | if (!isset($installed['versions'][$packageName])) { 172 | continue; 173 | } 174 | 175 | if (!isset($installed['versions'][$packageName]['version'])) { 176 | return null; 177 | } 178 | 179 | return $installed['versions'][$packageName]['version']; 180 | } 181 | 182 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 183 | } 184 | 185 | /** 186 | * @param string $packageName 187 | * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present 188 | */ 189 | public static function getPrettyVersion($packageName) 190 | { 191 | foreach (self::getInstalled() as $installed) { 192 | if (!isset($installed['versions'][$packageName])) { 193 | continue; 194 | } 195 | 196 | if (!isset($installed['versions'][$packageName]['pretty_version'])) { 197 | return null; 198 | } 199 | 200 | return $installed['versions'][$packageName]['pretty_version']; 201 | } 202 | 203 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 204 | } 205 | 206 | /** 207 | * @param string $packageName 208 | * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference 209 | */ 210 | public static function getReference($packageName) 211 | { 212 | foreach (self::getInstalled() as $installed) { 213 | if (!isset($installed['versions'][$packageName])) { 214 | continue; 215 | } 216 | 217 | if (!isset($installed['versions'][$packageName]['reference'])) { 218 | return null; 219 | } 220 | 221 | return $installed['versions'][$packageName]['reference']; 222 | } 223 | 224 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 225 | } 226 | 227 | /** 228 | * @param string $packageName 229 | * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. 230 | */ 231 | public static function getInstallPath($packageName) 232 | { 233 | foreach (self::getInstalled() as $installed) { 234 | if (!isset($installed['versions'][$packageName])) { 235 | continue; 236 | } 237 | 238 | return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; 239 | } 240 | 241 | throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 242 | } 243 | 244 | /** 245 | * @return array 246 | * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} 247 | */ 248 | public static function getRootPackage() 249 | { 250 | $installed = self::getInstalled(); 251 | 252 | return $installed[0]['root']; 253 | } 254 | 255 | /** 256 | * Returns the raw installed.php data for custom implementations 257 | * 258 | * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. 259 | * @return array[] 260 | * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} 261 | */ 262 | public static function getRawData() 263 | { 264 | @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); 265 | 266 | if (null === self::$installed) { 267 | // only require the installed.php file if this file is loaded from its dumped location, 268 | // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 269 | if (substr(__DIR__, -8, 1) !== 'C') { 270 | self::$installed = include __DIR__ . '/installed.php'; 271 | } else { 272 | self::$installed = array(); 273 | } 274 | } 275 | 276 | return self::$installed; 277 | } 278 | 279 | /** 280 | * Returns the raw data of all installed.php which are currently loaded for custom implementations 281 | * 282 | * @return array[] 283 | * @psalm-return list}> 284 | */ 285 | public static function getAllRawData() 286 | { 287 | return self::getInstalled(); 288 | } 289 | 290 | /** 291 | * Lets you reload the static array from another file 292 | * 293 | * This is only useful for complex integrations in which a project needs to use 294 | * this class but then also needs to execute another project's autoloader in process, 295 | * and wants to ensure both projects have access to their version of installed.php. 296 | * 297 | * A typical case would be PHPUnit, where it would need to make sure it reads all 298 | * the data it needs from this class, then call reload() with 299 | * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure 300 | * the project in which it runs can then also use this class safely, without 301 | * interference between PHPUnit's dependencies and the project's dependencies. 302 | * 303 | * @param array[] $data A vendor/composer/installed.php data set 304 | * @return void 305 | * 306 | * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data 307 | */ 308 | public static function reload($data) 309 | { 310 | self::$installed = $data; 311 | self::$installedByVendor = array(); 312 | } 313 | 314 | /** 315 | * @return array[] 316 | * @psalm-return list}> 317 | */ 318 | private static function getInstalled() 319 | { 320 | if (null === self::$canGetVendors) { 321 | self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); 322 | } 323 | 324 | $installed = array(); 325 | 326 | if (self::$canGetVendors) { 327 | foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { 328 | if (isset(self::$installedByVendor[$vendorDir])) { 329 | $installed[] = self::$installedByVendor[$vendorDir]; 330 | } elseif (is_file($vendorDir.'/composer/installed.php')) { 331 | $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; 332 | if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { 333 | self::$installed = $installed[count($installed) - 1]; 334 | } 335 | } 336 | } 337 | } 338 | 339 | if (null === self::$installed) { 340 | // only require the installed.php file if this file is loaded from its dumped location, 341 | // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 342 | if (substr(__DIR__, -8, 1) !== 'C') { 343 | self::$installed = require __DIR__ . '/installed.php'; 344 | } else { 345 | self::$installed = array(); 346 | } 347 | } 348 | $installed[] = self::$installed; 349 | 350 | return $installed; 351 | } 352 | } 353 | -------------------------------------------------------------------------------- /vendor/composer/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Copyright (c) Nils Adermann, Jordi Boggiano 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is furnished 9 | to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | THE SOFTWARE. 21 | 22 | -------------------------------------------------------------------------------- /vendor/composer/autoload_classmap.php: -------------------------------------------------------------------------------- 1 | $vendorDir . '/composer/InstalledVersions.php', 10 | ); 11 | -------------------------------------------------------------------------------- /vendor/composer/autoload_namespaces.php: -------------------------------------------------------------------------------- 1 | register(true); 33 | 34 | return $loader; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /vendor/composer/autoload_static.php: -------------------------------------------------------------------------------- 1 | __DIR__ . '/..' . '/composer/InstalledVersions.php', 11 | ); 12 | 13 | public static function getInitializer(ClassLoader $loader) 14 | { 15 | return \Closure::bind(function () use ($loader) { 16 | $loader->classMap = ComposerStaticInite52e8e90c47157470d368af20f00b4db::$classMap; 17 | 18 | }, null, ClassLoader::class); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /vendor/composer/installed.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages": [], 3 | "dev": false, 4 | "dev-package-names": [] 5 | } 6 | -------------------------------------------------------------------------------- /vendor/composer/installed.php: -------------------------------------------------------------------------------- 1 | array( 3 | 'name' => 'rosswintle/sync-mastodon', 4 | 'pretty_version' => 'dev-main', 5 | 'version' => 'dev-main', 6 | 'reference' => '59b48e4b79adc39de9682824bf8bdcf2118c9dce', 7 | 'type' => 'project', 8 | 'install_path' => __DIR__ . '/../../', 9 | 'aliases' => array(), 10 | 'dev' => false, 11 | ), 12 | 'versions' => array( 13 | 'rosswintle/sync-mastodon' => array( 14 | 'pretty_version' => 'dev-main', 15 | 'version' => 'dev-main', 16 | 'reference' => '59b48e4b79adc39de9682824bf8bdcf2118c9dce', 17 | 'type' => 'project', 18 | 'install_path' => __DIR__ . '/../../', 19 | 'aliases' => array(), 20 | 'dev_requirement' => false, 21 | ), 22 | ), 23 | ); 24 | --------------------------------------------------------------------------------