diff --git a/.gitignore b/.gitignore index 474f5433..a525aeab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ vendor .DS_Store .idea +.envrc +.tool-versions \ No newline at end of file diff --git a/.phplint-cache b/.phplint-cache new file mode 100644 index 00000000..a075afbe --- /dev/null +++ b/.phplint-cache @@ -0,0 +1 @@ +{"Directives\/Date.php":"baeb2a9b2cfd54bac865275a21ffb2a4","migrations\/Install.php":"bdac5ceaf75628d94501436a7a9d99e1","migrations\/m170804_170613_add_scopes.php":"e0a91f086742015e4be16ce9dcd3d0cc","Types\/GlobalsSet.php":"be4aa61174b94342963334ae6dcd3a0f","Types\/TagEdge.php":"3dd152aceb896a9a1364edc39dd6010d","Types\/PageInfo.php":"cd3c234439e7b6227bd9a23da4197b20","Types\/Category.php":"261a780b751773a610f2d45fe1b7eb38","Types\/Mutation.php":"807c0e78a3b3b633e154307e18e77e7f","Types\/Timestamp.php":"7b992fb55cd6254eda53af019e050fd0","Types\/Volume.php":"768da11619e56ee5ce73ddb68ffc1f35","Types\/OptionFieldDataOptions.php":"81791e88bc1e322dc63714b11129e54d","Types\/VolumeInterface.php":"60ca277fa635d1318af32a76163ebf7b","Types\/EntryInterface.php":"f7310b403be156bfad63cfa5c226fad9","Types\/Authorize.php":"65c6030498077e2057e7576f056da77f","Types\/TagInterface.php":"a62d6fb8956143ef74c9c73fc2f05754","Types\/CategoryInterface.php":"e3fb0f08b2957c077b0454c6f1bcb1e0","Types\/EntryDraftConnection.php":"17511256eed20693ca8748d5f6628754","Types\/Tag.php":"832d7d88d29ee1dcc730b0a6f530b0f2","Types\/CategoryGroup.php":"60a4bc0603220428d1fdc246d51388bf","Types\/User.php":"9185044a1e80cda3a968819609b997c1","Types\/OptionFieldData.php":"e70fbf0132072e6e81961425b42ae893","Types\/Field.php":"121ef00f689e78e677686f38a3f26f59","Types\/CategoryEdge.php":"e3f789e5035e9b25893a442f2ab1e662","Types\/Section.php":"7766719b9e4436766e9cf013dd239ef9","Types\/Entry.php":"221ed92de5fd2afce1018b266fec0aa4","Types\/MultiOptionFieldData.php":"05501b0b9b01367150b2d8e15ceaf408","Types\/TagGroup.php":"3a6158e2f9465644f6deacee9bb47b57","Types\/EntryDraftInfo.php":"4e7cfa4a7493aedbc27a263998062056","Types\/SectionSiteSettings.php":"015d796a7d587dd71fa6623eb3598472","Types\/Globals.php":"ea1b57496e3e792b9b0fbed78c98f375","Types\/EntryDraftEdge.php":"1b1b9dd062848e1069b068de95f7ea53","Types\/EntryEdge.php":"6a793e416b033131d7aa46cee5af1154","Types\/CategoryConnection.php":"0b6f59bff6afcd66f077f3e8f1813667","Types\/Query.php":"faac3808e5328f7e4c49ee60d262fa2e","Types\/ElementInterface.php":"0af961a0995acfc44bbadce33272b24d","Types\/VolumeFolder.php":"b788b6f40e44159215ec33de813d495d","Types\/EntryType.php":"95da0ddae6c0f3998597a4369e16e4fa","Types\/TagConnection.php":"ade5318cbd441ba3445c206934d734a4","Types\/EntryConnection.php":"bb8ffb6e3691ba777c71f93420adb5ea","Types\/Site.php":"21728601850dbc401d8542a9edfad99e","GraphiQLAssetBundle.php":"1ee7ac5d3412ede48f2f762cc1b60090","Builders\/HasResolveAttribute.php":"0c9edfeacdbebe939f66cd4972227edf","Builders\/EnumObject.php":"c7ae8a37a38c5d51b6d071714f6bad1f","Builders\/ContentField.php":"a2f7b6c203cc5494a2e433ffd54f70fc","Builders\/Argument.php":"bc58e7f1c40aea08a1ed83b8993c230b","Builders\/HasDescriptionAttribute.php":"9b89956b611645be16f4ae227947ea2e","Builders\/InterfaceBuilder.php":"582550f35748c01ae65fb83e1051ac71","Builders\/InputSchema.php":"9bd36aaef58410736bb8277945d44eb5","Builders\/HasIsListAttribute.php":"008233ae4cac7de01e09c6db88f179c9","Builders\/HasOnSaveAttribute.php":"912eecf6ae28be322f7c8a0049173075","Builders\/Field.php":"e3d8e16ba397f070efeb9e9f86c9c567","Builders\/HasDeprecationReasonAttribute.php":"c9259e7346df24aa34489fb453e4ae5a","Builders\/HasArgumentsAttribute.php":"1e30f5e96031d2275ad2906b60d8cf7c","Builders\/Date.php":"f2e6df9547a2ebe437b88c20b716fc67","Builders\/HasNonNullAttribute.php":"6fb719c199c061c9da19880d0e5b6462","Builders\/Schema.php":"db7862c996dd5c3e8cb16592ac49de07","Builders\/HasTypeAttribute.php":"2dc892a2fa13d2d6f45125be8a52f32c","Builders\/BaseBuilder.php":"b9833341e12d172ccfbbfa0bd7377ec1","Builders\/Union.php":"0bc1757f662471b987a2667a3fe96737","Builders\/EnumField.php":"1f578407e4a5a8c9017e2f3086d8cde0","TypeModels\/PageInfo.php":"357cf86c4725878e75e75bf4f0533f7f","events.php":"7a1ee57998d4ad2803cfa4bcb523e2ef","Repositories\/Volumes.php":"962b3279ec5c231d1c1f5c09c0c20ab6","Repositories\/CategoryGroup.php":"ce6e1bd189557a4b6eccf29ec175e8b6","Repositories\/Section.php":"233795aeb2c448a64f2932a2f905095c","Repositories\/TagGroup.php":"90abbe425aaa627edea7599b958c583b","Repositories\/Globals.php":"f33089c03a539d2388302cc12edb1f60","Repositories\/EntryType.php":"d361108742c657dbc6a3070cbb1a12ad","Models\/Settings.php":"8f90a36e3a144c3952fd65d9d2682852","Models\/Token.php":"51093c1690d879a1962756da3cf6b874","CraftQL.php":"d51ea33f98050d33db8d1625519dd0d2","Request.php":"e3d6c81e2543c9a6799a381167226b7c","Behaviors\/FieldBehavior.php":"5ae6bff9597550fb5e8ee1c8abfb2aed","Behaviors\/SchemaBehavior.php":"5b46ff848f03b0c60413dcd4057583c1","Factories\/Volume.php":"4818db3c3f7d4e5227a34aaea66a5eff","Factories\/CategoryGroup.php":"e52b302a120c7fde80af3ce76ba13ece","Factories\/Section.php":"1a4675b195302743c7472c02ee9142c9","Factories\/BaseFactory.php":"7f23db8c96c5f369a70259f095e8e485","Factories\/TagGroup.php":"b7cb9980d92a83a710d7fb62f91968e7","Factories\/Globals.php":"b1d0c6c6be79df67981e4004548747af","Factories\/EntryType.php":"8978798c65bcb45a5f4c9a5e1066202c","Factories\/DraftEntryType.php":"a7d18b520c59d47277ee1bfd1c2e49ea","Events\/AlterQuerySchema.php":"ec3ff837e159e7bc60aeaf5cd7cfae7b","Events\/GetFieldSchema.php":"1fea4e43df488f7531b596bbdb188041","Events\/AlterSchemaFields.php":"9eef06015d13cc67a98233c762892f42","Controllers\/ApiController.php":"61ed653a5c44b902218aaf608aafeaee","Controllers\/CpController.php":"a754745cbda87e4dfed9a4e299e3a49e","Listeners\/GetSuperTableFieldSchema.php":"5cf90f651dcd75d2b80f2ca2d732510f","Listeners\/GetSelectMultipleFieldSchema.php":"4994a19db85021117db39d7e6e037f91","Listeners\/GetMatrixFieldSchema.php":"1599b300042097bd6d1f611707c60c5f","Listeners\/GetColorFieldSchema.php":"32b71a617926a0b8c01e02e94ee5b4b9","Listeners\/GetVideosFieldSchema.php":"13c49543a684598b3e34856ae24fa596","Listeners\/GetUsersFieldSchema.php":"df83e779effeca8c7896f253620eb3ab","Listeners\/GetUserPermissions.php":"a24d43cd3f763d5952d7dad77493ea2a","Listeners\/GetTableFieldSchema.php":"c411a6935bb97e480c0e1ce4319fd116","Listeners\/GetSelectOneFieldSchema.php":"f5b9f540afa8d8d0e4e3ec7251fc1680","Listeners\/GetDateFieldSchema.php":"0432c0c39654792471adc649b04750a2","Listeners\/GetNumberFieldSchema.php":"42c123b3a57387fbb87cbc0b29a07a11","Listeners\/GetDefaultFieldSchema.php":"793d5046942da5489ace073e670acad2","Listeners\/GetEntriesFieldSchema.php":"e352c02ad6c20070912c3fd52c1a8f6a","Listeners\/GetPositionSelectFieldSchema.php":"0298329ecf341b0842aef6f8d3bcab36","Listeners\/GetCategoriesFieldSchema.php":"629016929f40892d3ab7c74920a3ab56","Listeners\/GetLightswitchFieldSchema.php":"f03a65ccf6b133aa4041d74e2eb9761c","Listeners\/GetTagsFieldSchema.php":"1074ce6430434c1838631abb16d0a37d","Listeners\/GetAssetsFieldSchema.php":"27d706390b93d1477aa696f7f9e59400","Listeners\/GetRedactorFieldSchema.php":"33749d16f29388490cd4e4bf900f16fc","Helpers\/StringHelper.php":"dc934b6491437c8aa184ba8c00aab3d9","Services\/GraphQLService.php":"9f9125083f8422188efec74e4c6a9d07","Services\/FieldService.php":"c1a98d2549367c1cba4a705681a8e0db","FieldBehaviors\/EntryMutationArguments.php":"12438eca9b47c463b9d32941f349ab87","FieldBehaviors\/AssetQueryArguments.php":"3f9a989390e8cb3197ba89676f67f80b","FieldBehaviors\/AssetTransformArguments.php":"4066e61688429007eaab847cf6ce822a","FieldBehaviors\/EntryQueryArguments.php":"3c29942eca383d86fc7392e7bc7844b0","FieldBehaviors\/TagQueryArguments.php":"de68bc8cbffe598488d8648155f43764","FieldBehaviors\/UserQueryArguments.php":"bf4b14b49c56679f6b52a7a52686a21a","FieldBehaviors\/RelatedEntriesField.php":"2f1b158a2ca5d1dd3fc2f26b4856ef0a","FieldBehaviors\/RelatedCategoriesField.php":"e89b1620e5d52963bb46a93f293cf504","FieldBehaviors\/CategoryQueryArguments.php":"d0ebed0a52831e2c265f767777943d2d","Console\/ToolsController.php":"3eb5de3165031f6ce817b21f4f387ba6","Services\/JWTService.php":"f16d99895e5e1e7967c7721acc68de47"} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..4da2ad32 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +FROM php:7.4-cli + +# Update Apt +RUN apt update && apt -y upgrade + +# Install Tools +RUN apt install wget + +# Install PHP Extensions +RUN apt-get install -y \ + libzip-dev \ + zip \ + && docker-php-ext-install zip + +# Install Composer +RUN EXPECTED_SIGNATURE=$(wget -q -O - https://composer.github.io/installer.sig) \ + && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ + && php -r "if (hash_file('SHA384', 'composer-setup.php') === '$EXPECTED_SIGNATURE') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \ + && php composer-setup.php --install-dir=/usr/bin --filename=composer \ + && php -r "unlink('composer-setup.php');" + + +COPY / / + +CMD ["composer"] \ No newline at end of file diff --git a/composer.json b/composer.json index 02e08680..3100d17d 100644 --- a/composer.json +++ b/composer.json @@ -9,9 +9,10 @@ "craft-plugin" ], "require": { - "craftcms/cms": "^3.2.0", - "webonyx/graphql-php": "^0.12.0", - "react/http": "^0.7" + "craftcms/cms": "^3.6.0", + "webonyx/graphql-php": "^14.4.1", + "react/http": "^0.7", + "firebase/php-jwt": "^5.0.0" }, "authors": [ { @@ -29,6 +30,19 @@ "handle": "craftql", "developer": "Mark Huot", "developerUrl": "https://www.github.com/markhuot", - "class": "markhuot\\CraftQL\\CraftQL" + "class": "markhuot\\CraftQL\\CraftQL", + "components": { + "graphQl": "markhuot\\CraftQL\\Services\\GraphQLService", + "jwt": "markhuot\\CraftQL\\Services\\JWTService" + } + }, + "require-dev": { + "overtrue/phplint": "^2.0" + }, + "config": { + "allow-plugins": { + "yiisoft/yii2-composer": true, + "craftcms/plugin-installer": true + } } } diff --git a/composer.lock b/composer.lock index ac9445e2..0d97f834 100644 --- a/composer.lock +++ b/composer.lock @@ -1,35 +1,46 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6a9e3b0d600bab0b1db74df0f506b263", + "content-hash": "1b5335358056d6ad23c842fcff2d1262", "packages": [ { - "name": "evenement/evenement", - "version": "v3.0.1", + "name": "cebe/markdown", + "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + "url": "https://github.com/cebe/markdown.git", + "reference": "9bac5e971dd391e2802dca5400bbeacbaea9eb86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "url": "https://api.github.com/repos/cebe/markdown/zipball/9bac5e971dd391e2802dca5400bbeacbaea9eb86", + "reference": "9bac5e971dd391e2802dca5400bbeacbaea9eb86", "shasum": "" }, "require": { - "php": ">=7.0" + "lib-pcre": "*", + "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "cebe/indent": "*", + "facebook/xhprof": "*@dev", + "phpunit/phpunit": "4.1.*" }, + "bin": [ + "bin/markdown" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, "autoload": { - "psr-0": { - "Evenement": "src" + "psr-4": { + "cebe\\markdown\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -38,43 +49,61 @@ ], "authors": [ { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Creator" } ], - "description": "Événement is a very simple event dispatching library for PHP", + "description": "A super fast, highly extensible markdown parser for PHP", + "homepage": "https://github.com/cebe/markdown#readme", "keywords": [ - "event-dispatcher", - "event-emitter" + "extensible", + "fast", + "gfm", + "markdown", + "markdown-extra" ], - "time": "2017-07-23T21:35:13+00:00" + "support": { + "issues": "https://github.com/cebe/markdown/issues", + "source": "https://github.com/cebe/markdown" + }, + "time": "2018-03-26T11:24:36+00:00" }, { - "name": "psr/http-message", - "version": "1.0.1", + "name": "composer/ca-bundle", + "version": "1.3.6", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "url": "https://github.com/composer/ca-bundle.git", + "reference": "90d087e988ff194065333d16bc5cf649872d9cdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/90d087e988ff194065333d16bc5cf649872d9cdb", + "reference": "90d087e988ff194065333d16bc5cf649872d9cdb", "shasum": "" }, "require": { - "php": ">=5.3.0" + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.55", + "psr/log": "^1.0", + "symfony/phpunit-bridge": "^4.2 || ^5", + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" + "Composer\\CaBundle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -83,221 +112,391 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.3.6" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } ], - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-06-06T12:02:59+00:00" }, { - "name": "react/cache", - "version": "v0.4.1", + "name": "composer/composer", + "version": "2.2.19", "source": { "type": "git", - "url": "https://github.com/reactphp/cache.git", - "reference": "558f614891341b1d817a8cdf9a358948ec49638f" + "url": "https://github.com/composer/composer.git", + "reference": "30ff21a9af9a10845436abaeeb0bb7276e996d24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/cache/zipball/558f614891341b1d817a8cdf9a358948ec49638f", - "reference": "558f614891341b1d817a8cdf9a358948ec49638f", + "url": "https://api.github.com/repos/composer/composer/zipball/30ff21a9af9a10845436abaeeb0bb7276e996d24", + "reference": "30ff21a9af9a10845436abaeeb0bb7276e996d24", "shasum": "" }, "require": { - "php": ">=5.3.0", - "react/promise": "~2.0|~1.1" + "composer/ca-bundle": "^1.0", + "composer/metadata-minifier": "^1.0", + "composer/pcre": "^1.0", + "composer/semver": "^3.0", + "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^2.0 || ^3.0", + "justinrainbow/json-schema": "^5.2.11", + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0 || ^2.0", + "react/promise": "^1.2 || ^2.7", + "seld/jsonlint": "^1.4", + "seld/phar-utils": "^1.0", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", + "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" }, + "require-dev": { + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives", + "ext-zlib": "Allow gzip compression of HTTP requests" + }, + "bin": [ + "bin/composer" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.2-dev" + } + }, "autoload": { "psr-4": { - "React\\Cache\\": "src\\" + "Composer\\": "src/Composer" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Async caching.", + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "https://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", + "homepage": "https://getcomposer.org/", "keywords": [ - "cache" + "autoload", + "dependency", + "package" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/composer/issues", + "source": "https://github.com/composer/composer/tree/2.2.19" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } ], - "time": "2016-02-25T18:17:16+00:00" + "time": "2023-02-04T13:54:48+00:00" }, { - "name": "react/dns", - "version": "v0.4.11", + "name": "composer/metadata-minifier", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/reactphp/dns.git", - "reference": "8558bba4f2784aa997670d15fc6f7461a8eb4e53" + "url": "https://github.com/composer/metadata-minifier.git", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/8558bba4f2784aa997670d15fc6f7461a8eb4e53", - "reference": "8558bba4f2784aa997670d15fc6f7461a8eb4e53", + "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207", "shasum": "" }, "require": { - "php": ">=5.3.0", - "react/cache": "~0.4.0|~0.3.0", - "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", - "react/promise": "^2.1 || ^1.2.1", - "react/promise-timer": "^1.2", - "react/socket": "^1.0 || ^0.8 || ^0.7 || ^0.6 || ^0.5 || ^0.4.4", - "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.5" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "clue/block-react": "^1.2", - "phpunit/phpunit": "^5.0 || ^4.8.10" + "composer/composer": "^2", + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, "autoload": { "psr-4": { - "React\\Dns\\": "src" + "Composer\\MetadataMinifier\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Async DNS resolver for ReactPHP", + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Small utility library that handles metadata minification and expansion.", "keywords": [ - "async", - "dns", - "dns-resolver", - "reactphp" + "composer", + "compression" + ], + "support": { + "issues": "https://github.com/composer/metadata-minifier/issues", + "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } ], - "time": "2017-08-25T08:22:48+00:00" + "time": "2021-04-07T13:37:33+00:00" }, { - "name": "react/event-loop", - "version": "v0.4.3", + "name": "composer/pcre", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/reactphp/event-loop.git", - "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f" + "url": "https://github.com/composer/pcre.git", + "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/8bde03488ee897dc6bb3d91e4e17c353f9c5252f", - "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f", + "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560", + "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "~4.8" - }, - "suggest": { - "ext-event": "~1.0", - "ext-libev": "*", - "ext-libevent": ">=0.1.0" + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, "autoload": { "psr-4": { - "React\\EventLoop\\": "src" + "Composer\\Pcre\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Event loop abstraction layer that libraries can use for evented I/O.", + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", "keywords": [ - "asynchronous", - "event-loop" + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/1.0.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } ], - "time": "2017-04-27T10:56:23+00:00" + "time": "2022-01-21T20:24:37+00:00" }, { - "name": "react/http", - "version": "v0.7.4", + "name": "composer/semver", + "version": "3.3.2", "source": { "type": "git", - "url": "https://github.com/reactphp/http.git", - "reference": "6646135c01097b5316d2cb47bc12e541bf26efae" + "url": "https://github.com/composer/semver.git", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/http/zipball/6646135c01097b5316d2cb47bc12e541bf26efae", - "reference": "6646135c01097b5316d2cb47bc12e541bf26efae", + "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", + "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/promise": "^2.3 || ^1.2.1", - "react/socket": "^1.0 || ^0.8 || ^0.7 || ^0.6 || ^0.5", - "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.6", - "ringcentral/psr7": "^1.2" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "clue/block-react": "^1.1", - "phpunit/phpunit": "^4.8.10||^5.0", - "react/promise-stream": "^0.1.1", - "react/socket": "^1.0 || ^0.8 || ^0.7" + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, "autoload": { "psr-4": { - "React\\Http\\": "src" + "Composer\\Semver\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Event-driven, streaming plaintext HTTP and secure HTTPS server for ReactPHP", + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": [ - "event-driven", - "http", - "https", - "reactphp", - "server", - "streaming" + "semantic", + "semver", + "validation", + "versioning" ], - "time": "2017-08-16T15:24:39+00:00" + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-04-01T19:23:25+00:00" }, { - "name": "react/promise", - "version": "v2.5.1", + "name": "composer/spdx-licenses", + "version": "1.5.7", "source": { "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "62785ae604c8d69725d693eb370e1d67e94c4053" + "url": "https://github.com/composer/spdx-licenses.git", + "reference": "c848241796da2abf65837d51dce1fae55a960149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/62785ae604c8d69725d693eb370e1d67e94c4053", - "reference": "62785ae604c8d69725d693eb370e1d67e94c4053", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", + "reference": "c848241796da2abf65837d51dce1fae55a960149", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "~4.8" + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, "autoload": { "psr-4": { - "React\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + "Composer\\Spdx\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -305,47 +504,77 @@ ], "authors": [ { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com" + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" } ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "description": "SPDX licenses list and validation library.", "keywords": [ - "promise", - "promises" + "license", + "spdx", + "validator" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/spdx-licenses/issues", + "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } ], - "time": "2017-03-25T12:08:31+00:00" + "time": "2022-05-23T07:37:50+00:00" }, { - "name": "react/promise-timer", - "version": "v1.2.0", + "name": "composer/xdebug-handler", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/reactphp/promise-timer.git", - "reference": "3bc527fbd1201a193ab41c19b9a770d71a3514af" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/3bc527fbd1201a193ab41c19b9a770d71a3514af", - "reference": "3bc527fbd1201a193ab41c19b9a770d71a3514af", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", "shasum": "" }, "require": { - "php": ">=5.3", - "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", - "react/promise": "~2.1|~1.2" + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" }, "require-dev": { - "phpunit/phpunit": "^5.0 || ^4.8" + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" }, "type": "library", "autoload": { "psr-4": { - "React\\Promise\\Timer\\": "src/" - }, - "files": [ - "src/functions.php" - ] + "Composer\\XdebugHandler\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -353,231 +582,5893 @@ ], "authors": [ { - "name": "Christian Lück", - "email": "christian@lueck.tv" + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" } ], - "description": "Trivial timeout implementation for Promises", - "homepage": "https://github.com/react/promise-timer", + "description": "Restarts a process without Xdebug.", "keywords": [ - "async", - "event-loop", - "promise", - "reactphp", - "timeout", - "timer" + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } ], - "time": "2017-08-08T16:30:19+00:00" + "time": "2022-02-25T21:32:43+00:00" }, { - "name": "react/socket", - "version": "v0.8.2", + "name": "craftcms/cms", + "version": "3.8.17", "source": { "type": "git", - "url": "https://github.com/reactphp/socket.git", - "reference": "ee817e348abcf35c55b448a5cd3ef4eec88379e9" + "url": "https://github.com/craftcms/cms.git", + "reference": "bfecb73a647e6b5267080e5b1de23554e06959ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/ee817e348abcf35c55b448a5cd3ef4eec88379e9", - "reference": "ee817e348abcf35c55b448a5cd3ef4eec88379e9", + "url": "https://api.github.com/repos/craftcms/cms/zipball/bfecb73a647e6b5267080e5b1de23554e06959ab", + "reference": "bfecb73a647e6b5267080e5b1de23554e06959ab", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/dns": "^0.4.11", - "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", - "react/promise": "^2.1 || ^1.2", - "react/promise-timer": "~1.0", - "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.5" + "composer/composer": "2.2.19", + "craftcms/plugin-installer": "~1.6.0", + "craftcms/server-check": "~1.2.0", + "creocoder/yii2-nested-sets": "~0.9.0", + "elvanto/litemoji": "^3.0.1", + "enshrined/svg-sanitize": "~0.16.0", + "ext-curl": "*", + "ext-dom": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-pcre": "*", + "ext-pdo": "*", + "ext-zip": "*", + "guzzlehttp/guzzle": "^6.5.5|^7.2.0", + "laminas/laminas-feed": "~2.12.3|^2.13.1", + "league/flysystem": "^1.1.4", + "mikehaertl/php-shellcommand": "^1.6.3", + "php": ">=7.2.5", + "pixelandtonic/imagine": "~1.3.3.1", + "seld/cli-prompt": "^1.0.4", + "symfony/yaml": "^5.2.1", + "twig/twig": "~2.15.3", + "voku/stringy": "^6.4.0", + "webonyx/graphql-php": "~14.11.5", + "yiisoft/yii2": "~2.0.45.0", + "yiisoft/yii2-debug": "^2.1.16", + "yiisoft/yii2-queue": "~2.3.2", + "yiisoft/yii2-swiftmailer": "^2.1.2" + }, + "conflict": { + "webonyx/graphql-php": "14.11.7" + }, + "provide": { + "bower-asset/inputmask": "~3.2.2 | ~3.3.5", + "bower-asset/jquery": "3.5.*@stable | 3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", + "bower-asset/punycode": "1.3.*", + "bower-asset/yii2-pjax": "~2.0.1", + "yii2tech/ar-softdelete": "1.0.4" }, "require-dev": { - "clue/block-react": "^1.1", - "phpunit/phpunit": "~4.8", - "react/stream": "^1.0 || ^0.7 || ^0.6" + "codeception/codeception": "^4.0.0", + "codeception/module-asserts": "^1.0.0", + "codeception/module-datafactory": "^1.0.0", + "codeception/module-phpbrowser": "^1.0.0", + "codeception/module-rest": "^1.0.0", + "codeception/module-yii2": "^1.0.0", + "craftcms/ecs": "dev-main", + "fzaninotto/faker": "^1.8", + "league/factory-muffin": "^3.0", + "vlucas/phpdotenv": "^3.0" + }, + "suggest": { + "ext-iconv": "Adds support for more character encodings than PHP’s built-in mb_convert_encoding() function, which Craft will take advantage of when converting strings to UTF-8.", + "ext-imagick": "Adds support for more image processing formats and options.", + "ext-intl": "Adds rich internationalization support." }, "type": "library", "autoload": { "psr-4": { - "React\\Socket\\": "src" + "craft\\": "src/", + "yii2tech\\ar\\softdelete\\": "lib/ar-softdelete/src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "proprietary" ], - "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "authors": [ + { + "name": "Pixel & Tonic", + "homepage": "https://pixelandtonic.com/" + } + ], + "description": "Craft CMS", + "homepage": "https://craftcms.com", "keywords": [ - "Connection", - "Socket", - "async", - "reactphp", - "stream" + "cms", + "craftcms", + "yii2" ], - "time": "2017-08-25T09:08:33+00:00" + "support": { + "docs": "https://craftcms.com/docs/3.x/", + "email": "support@craftcms.com", + "forum": "https://craftcms.stackexchange.com/", + "issues": "https://github.com/craftcms/cms/issues?state=open", + "rss": "https://github.com/craftcms/cms/releases.atom", + "source": "https://github.com/craftcms/cms" + }, + "time": "2023-08-08T15:46:57+00:00" }, { - "name": "react/stream", - "version": "v0.7.3", + "name": "craftcms/plugin-installer", + "version": "1.6.0", "source": { "type": "git", - "url": "https://github.com/reactphp/stream.git", - "reference": "5cc7bec91dc3f6ad123a81602489b82fdb180090" + "url": "https://github.com/craftcms/plugin-installer.git", + "reference": "bd1650e8da6d5ca7a8527068d3e51c34bc7b6b4f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/5cc7bec91dc3f6ad123a81602489b82fdb180090", - "reference": "5cc7bec91dc3f6ad123a81602489b82fdb180090", + "url": "https://api.github.com/repos/craftcms/plugin-installer/zipball/bd1650e8da6d5ca7a8527068d3e51c34bc7b6b4f", + "reference": "bd1650e8da6d5ca7a8527068d3e51c34bc7b6b4f", "shasum": "" }, "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.8", - "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3" + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.4" }, "require-dev": { - "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^5.0 || ^4.8.10" + "composer/composer": "^1.0 || ^2.0" }, - "suggest": { - "react/event-loop": "^0.4" + "type": "composer-plugin", + "extra": { + "class": "craft\\composer\\Plugin" }, - "type": "library", "autoload": { "psr-4": { - "React\\Stream\\": "src" + "craft\\composer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "description": "Craft CMS Plugin Installer", + "homepage": "https://craftcms.com/", "keywords": [ - "event-driven", - "io", - "non-blocking", - "pipe", - "reactphp", - "readable", - "stream", - "writable" + "cms", + "composer", + "craftcms", + "installer", + "plugin" ], - "time": "2017-08-05T09:16:09+00:00" + "support": { + "docs": "https://craftcms.com/docs", + "email": "support@craftcms.com", + "forum": "https://craftcms.stackexchange.com/", + "issues": "https://github.com/craftcms/cms/issues?state=open", + "rss": "https://craftcms.com/changelog.rss", + "source": "https://github.com/craftcms/cms" + }, + "time": "2023-02-22T13:17:00+00:00" }, { - "name": "ringcentral/psr7", - "version": "1.2.1", + "name": "craftcms/server-check", + "version": "1.2.4", "source": { "type": "git", - "url": "https://github.com/ringcentral/psr7.git", - "reference": "2594fb47cdc659f3fcf0aa1559b7355460555303" + "url": "https://github.com/craftcms/server-check.git", + "reference": "04518e63ae94effd4e352838278662c928c84e8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ringcentral/psr7/zipball/2594fb47cdc659f3fcf0aa1559b7355460555303", - "reference": "2594fb47cdc659f3fcf0aa1559b7355460555303", + "url": "https://api.github.com/repos/craftcms/server-check/zipball/04518e63ae94effd4e352838278662c928c84e8c", + "reference": "04518e63ae94effd4e352838278662c928c84e8c", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "server/requirements" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Craft CMS Server Check", + "homepage": "https://craftcms.com/", + "keywords": [ + "cms", + "craftcms", + "requirements", + "yii2" + ], + "support": { + "docs": "https://github.com/craftcms/docs", + "email": "support@craftcms.com", + "forum": "https://craftcms.stackexchange.com/", + "issues": "https://github.com/craftcms/server-check/issues?state=open", + "rss": "https://github.com/craftcms/server-check/releases.atom", + "source": "https://github.com/craftcms/server-check" + }, + "time": "2022-04-17T02:10:54+00:00" + }, + { + "name": "creocoder/yii2-nested-sets", + "version": "0.9.0", + "source": { + "type": "git", + "url": "https://github.com/creocoder/yii2-nested-sets.git", + "reference": "cb8635a459b6246e5a144f096b992dcc30cf9954" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/creocoder/yii2-nested-sets/zipball/cb8635a459b6246e5a144f096b992dcc30cf9954", + "reference": "cb8635a459b6246e5a144f096b992dcc30cf9954", + "shasum": "" + }, + "require": { + "yiisoft/yii2": "*" + }, + "type": "yii2-extension", + "autoload": { + "psr-4": { + "creocoder\\nestedsets\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Alexander Kochetov", + "email": "creocoder@gmail.com" + } + ], + "description": "The nested sets behavior for the Yii framework", + "keywords": [ + "nested sets", + "yii2" + ], + "support": { + "issues": "https://github.com/creocoder/yii2-nested-sets/issues", + "source": "https://github.com/creocoder/yii2-nested-sets/tree/master" + }, + "time": "2015-01-27T10:53:51+00:00" + }, + { + "name": "defuse/php-encryption", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/defuse/php-encryption.git", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "paragonie/random_compat": ">= 2", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^5|^6|^7|^8|^9|^10", + "yoast/phpunit-polyfills": "^2.0.0" + }, + "bin": [ + "bin/generate-defuse-key" + ], + "type": "library", + "autoload": { + "psr-4": { + "Defuse\\Crypto\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Hornby", + "email": "taylor@defuse.ca", + "homepage": "https://defuse.ca/" + }, + { + "name": "Scott Arciszewski", + "email": "info@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "Secure PHP Encryption Library", + "keywords": [ + "aes", + "authenticated encryption", + "cipher", + "crypto", + "cryptography", + "encrypt", + "encryption", + "openssl", + "security", + "symmetric key cryptography" + ], + "support": { + "issues": "https://github.com/defuse/php-encryption/issues", + "source": "https://github.com/defuse/php-encryption/tree/v2.4.0" + }, + "time": "2023-06-19T06:10:36+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" + }, + "time": "2023-06-03T09:27:29+00:00" + }, + { + "name": "doctrine/lexer", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^4.11 || ^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-12-14T08:49:07+00:00" + }, + { + "name": "egulias/email-validator", + "version": "3.2.6", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.2|^2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/3.2.6" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-06-01T07:04:22+00:00" + }, + { + "name": "elvanto/litemoji", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/elvanto/litemoji.git", + "reference": "acd6fd944814683983dcdfcf4d33f24430631b77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/elvanto/litemoji/zipball/acd6fd944814683983dcdfcf4d33f24430631b77", + "reference": "acd6fd944814683983dcdfcf4d33f24430631b77", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "milesj/emojibase": "6.0.*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "LitEmoji\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library simplifying the conversion of unicode, HTML and shortcode emoji.", + "keywords": [ + "emoji", + "php-emoji" + ], + "support": { + "issues": "https://github.com/elvanto/litemoji/issues", + "source": "https://github.com/elvanto/litemoji/tree/3.0.1" + }, + "time": "2020-11-27T05:08:33+00:00" + }, + { + "name": "enshrined/svg-sanitize", + "version": "0.16.0", + "source": { + "type": "git", + "url": "https://github.com/darylldoyle/svg-sanitizer.git", + "reference": "239e257605e2141265b429e40987b2ee51bba4b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/239e257605e2141265b429e40987b2ee51bba4b4", + "reference": "239e257605e2141265b429e40987b2ee51bba4b4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ezyang/htmlpurifier": "^4.16", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5 || ^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "enshrined\\svgSanitize\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Daryll Doyle", + "email": "daryll@enshrined.co.uk" + } + ], + "description": "An SVG sanitizer for PHP", + "support": { + "issues": "https://github.com/darylldoyle/svg-sanitizer/issues", + "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.16.0" + }, + "time": "2023-03-20T10:51:12+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.16.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8", + "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0" + }, + "time": "2022-09-18T07:06:19+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v5.5.1", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "83b609028194aa042ea33b5af2d41a7427de80e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/83b609028194aa042ea33b5af2d41a7427de80e6", + "reference": "83b609028194aa042ea33b5af2d41a7427de80e6", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": ">=4.8 <=9" + }, + "suggest": { + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v5.5.1" + }, + "time": "2021-11-08T20:18:51+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2023-05-21T14:04:53+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-08-03T15:11:55+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/8bd7c33a0734ae1c5d074360512beb716bef3f77", + "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.6.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-08-03T15:06:02+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.2.12", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" + }, + "time": "2022-04-13T08:02:27+00:00" + }, + { + "name": "laminas/laminas-escaper", + "version": "2.12.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-escaper.git", + "reference": "ee7a4c37bf3d0e8c03635d5bddb5bb3184ead490" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/ee7a4c37bf3d0e8c03635d5bddb5bb3184ead490", + "reference": "ee7a4c37bf3d0e8c03635d5bddb5bb3184ead490", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-mbstring": "*", + "php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0" + }, + "conflict": { + "zendframework/zend-escaper": "*" + }, + "require-dev": { + "infection/infection": "^0.26.6", + "laminas/laminas-coding-standard": "~2.4.0", + "maglnet/composer-require-checker": "^3.8.0", + "phpunit/phpunit": "^9.5.18", + "psalm/plugin-phpunit": "^0.17.0", + "vimeo/psalm": "^4.22.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Escaper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", + "homepage": "https://laminas.dev", + "keywords": [ + "escaper", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-escaper/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-escaper/issues", + "rss": "https://github.com/laminas/laminas-escaper/releases.atom", + "source": "https://github.com/laminas/laminas-escaper" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2022-10-10T10:11:09+00:00" + }, + { + "name": "laminas/laminas-feed", + "version": "2.18.2", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-feed.git", + "reference": "a57fdb9df42950d5b7f052509fbdab0d081c6b6d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-feed/zipball/a57fdb9df42950d5b7f052509fbdab0d081c6b6d", + "reference": "a57fdb9df42950d5b7f052509fbdab0d081c6b6d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "laminas/laminas-escaper": "^2.9", + "laminas/laminas-servicemanager": "^3.14.0", + "laminas/laminas-stdlib": "^3.6", + "php": "^7.4 || ~8.0.0 || ~8.1.0" + }, + "conflict": { + "laminas/laminas-servicemanager": "<3.3", + "zendframework/zend-feed": "*" + }, + "require-dev": { + "laminas/laminas-cache": "^2.13.2 || ^3.1.3", + "laminas/laminas-cache-storage-adapter-memory": "^1.1.0 || ^2.0.0", + "laminas/laminas-coding-standard": "~2.3.0", + "laminas/laminas-db": "^2.13.3", + "laminas/laminas-http": "^2.15", + "laminas/laminas-validator": "^2.15", + "phpunit/phpunit": "^9.5.5", + "psalm/plugin-phpunit": "^0.17.0", + "psr/http-message": "^1.0.1", + "vimeo/psalm": "^4.24.0" + }, + "suggest": { + "laminas/laminas-cache": "Laminas\\Cache component, for optionally caching feeds between requests", + "laminas/laminas-db": "Laminas\\Db component, for use with PubSubHubbub", + "laminas/laminas-http": "Laminas\\Http for PubSubHubbub, and optionally for use with Laminas\\Feed\\Reader", + "laminas/laminas-servicemanager": "Laminas\\ServiceManager component, for easily extending ExtensionManager implementations", + "laminas/laminas-validator": "Laminas\\Validator component, for validating email addresses used in Atom feeds and entries when using the Writer subcomponent", + "psr/http-message": "PSR-7 ^1.0.1, if you wish to use Laminas\\Feed\\Reader\\Http\\Psr7ResponseDecorator" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Feed\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides functionality for creating and consuming RSS and Atom feeds", + "homepage": "https://laminas.dev", + "keywords": [ + "atom", + "feed", + "laminas", + "rss" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-feed/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-feed/issues", + "rss": "https://github.com/laminas/laminas-feed/releases.atom", + "source": "https://github.com/laminas/laminas-feed" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2022-08-08T17:02:35+00:00" + }, + { + "name": "laminas/laminas-servicemanager", + "version": "3.17.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-servicemanager.git", + "reference": "360be5f16955dd1edbcce1cfaa98ed82a17f02ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/360be5f16955dd1edbcce1cfaa98ed82a17f02ec", + "reference": "360be5f16955dd1edbcce1cfaa98ed82a17f02ec", + "shasum": "" + }, + "require": { + "laminas/laminas-stdlib": "^3.2.1", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0", + "psr/container": "^1.0" + }, + "conflict": { + "ext-psr": "*", + "laminas/laminas-code": "<3.3.1", + "zendframework/zend-code": "<3.3.1", + "zendframework/zend-servicemanager": "*" + }, + "provide": { + "psr/container-implementation": "^1.0" + }, + "replace": { + "container-interop/container-interop": "^1.2.0" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.0", + "laminas/laminas-coding-standard": "~2.4.0", + "laminas/laminas-container-config-test": "^0.7", + "laminas/laminas-dependency-plugin": "^2.1.2", + "mikey179/vfsstream": "^1.6.10@alpha", + "ocramius/proxy-manager": "^2.11", + "phpbench/phpbench": "^1.1", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5.5", + "psalm/plugin-phpunit": "^0.17.0", + "vimeo/psalm": "^4.8" + }, + "suggest": { + "ocramius/proxy-manager": "ProxyManager ^2.1.1 to handle lazy initialization of services" + }, + "bin": [ + "bin/generate-deps-for-config-factory", + "bin/generate-factory-for-class" + ], + "type": "library", + "autoload": { + "files": [ + "src/autoload.php" + ], + "psr-4": { + "Laminas\\ServiceManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Factory-Driven Dependency Injection Container", + "homepage": "https://laminas.dev", + "keywords": [ + "PSR-11", + "dependency-injection", + "di", + "dic", + "laminas", + "service-manager", + "servicemanager" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-servicemanager/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-servicemanager/issues", + "rss": "https://github.com/laminas/laminas-servicemanager/releases.atom", + "source": "https://github.com/laminas/laminas-servicemanager" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2022-09-22T11:33:46+00:00" + }, + { + "name": "laminas/laminas-stdlib", + "version": "3.13.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-stdlib.git", + "reference": "66a6d03c381f6c9f1dd988bf8244f9afb9380d76" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/66a6d03c381f6c9f1dd988bf8244f9afb9380d76", + "reference": "66a6d03c381f6c9f1dd988bf8244f9afb9380d76", + "shasum": "" + }, + "require": { + "php": "^7.4 || ~8.0.0 || ~8.1.0" + }, + "conflict": { + "zendframework/zend-stdlib": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.3.0", + "phpbench/phpbench": "^1.2.6", + "phpstan/phpdoc-parser": "^0.5.4", + "phpunit/phpunit": "^9.5.23", + "psalm/plugin-phpunit": "^0.17.0", + "vimeo/psalm": "^4.26" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "SPL extensions, array utilities, error handlers, and more", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "stdlib" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-stdlib/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-stdlib/issues", + "rss": "https://github.com/laminas/laminas-stdlib/releases.atom", + "source": "https://github.com/laminas/laminas-stdlib" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2022-08-24T13:56:50+00:00" + }, + { + "name": "league/flysystem", + "version": "1.1.10", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/mime-type-detection": "^1.3", + "php": "^7.2.5 || ^8.0" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/prophecy": "^1.11.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" + }, + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2022-10-04T09:16:37+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.13.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/a6dfb1194a2946fcdc1f38219445234f65b35c96", + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.13.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2023-08-05T12:09:49+00:00" + }, + { + "name": "mikehaertl/php-shellcommand", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/mikehaertl/php-shellcommand.git", + "reference": "e79ea528be155ffdec6f3bf1a4a46307bb49e545" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mikehaertl/php-shellcommand/zipball/e79ea528be155ffdec6f3bf1a4a46307bb49e545", + "reference": "e79ea528be155ffdec6f3bf1a4a46307bb49e545", + "shasum": "" + }, + "require": { + "php": ">= 5.3.0" + }, + "require-dev": { + "phpunit/phpunit": ">4.0 <=9.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "mikehaertl\\shellcommand\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Härtl", + "email": "haertl.mike@gmail.com" + } + ], + "description": "An object oriented interface to shell commands", + "keywords": [ + "shell" + ], + "support": { + "issues": "https://github.com/mikehaertl/php-shellcommand/issues", + "source": "https://github.com/mikehaertl/php-shellcommand/tree/1.7.0" + }, + "time": "2023-04-19T08:25:22+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.7.3", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.3" + }, + "time": "2023-08-12T11:01:26+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.23.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/846ae76eef31c6d7790fac9bc399ecee45160b26", + "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.23.1" + }, + "time": "2023-08-03T16:32:59+00:00" + }, + { + "name": "pixelandtonic/imagine", + "version": "1.3.3.1", + "source": { + "type": "git", + "url": "https://github.com/pixelandtonic/Imagine.git", + "reference": "4d9bb596ff60504e37ccf9103c0bb705dba7fec6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pixelandtonic/Imagine/zipball/4d9bb596ff60504e37ccf9103c0bb705dba7fec6", + "reference": "4d9bb596ff60504e37ccf9103c0bb705dba7fec6", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4 || ^9.3" + }, + "suggest": { + "ext-exif": "to read EXIF metadata", + "ext-gd": "to use the GD implementation", + "ext-gmagick": "to use the Gmagick implementation", + "ext-imagick": "to use the Imagick implementation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Imagine\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bulat Shakirzyanov", + "email": "mallluhuct@gmail.com", + "homepage": "http://avalanche123.com" + } + ], + "description": "Image processing for PHP 5.3", + "homepage": "http://imagine.readthedocs.org/", + "keywords": [ + "drawing", + "graphics", + "image manipulation", + "image processing" + ], + "support": { + "source": "https://github.com/pixelandtonic/Imagine/tree/1.3.3.1" + }, + "time": "2023-01-03T19:18:06+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/1.0.2" + }, + "time": "2023-04-10T20:12:12+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/1.1" + }, + "time": "2023-04-04T09:50:52+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "react/cache", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" + }, + { + "name": "react/dns", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", + "reference": "3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.0 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^4.8.35", + "react/async": "^4 || ^3 || ^2", + "react/promise-timer": "^1.9" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.11.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-06-02T12:45:26+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6e7e587714fff7a83dcc7025aee42ab3b265ae05", + "reference": "6e7e587714fff7a83dcc7025aee42ab3b265ae05", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-05-05T10:11:24+00:00" + }, + { + "name": "react/http", + "version": "v0.7.4", + "source": { + "type": "git", + "url": "https://github.com/reactphp/http.git", + "reference": "6646135c01097b5316d2cb47bc12e541bf26efae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/http/zipball/6646135c01097b5316d2cb47bc12e541bf26efae", + "reference": "6646135c01097b5316d2cb47bc12e541bf26efae", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/promise": "^2.3 || ^1.2.1", + "react/socket": "^1.0 || ^0.8 || ^0.7 || ^0.6 || ^0.5", + "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.6", + "ringcentral/psr7": "^1.2" + }, + "require-dev": { + "clue/block-react": "^1.1", + "phpunit/phpunit": "^4.8.10||^5.0", + "react/promise-stream": "^0.1.1", + "react/socket": "^1.0 || ^0.8 || ^0.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Http\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Event-driven, streaming plaintext HTTP and secure HTTPS server for ReactPHP", + "keywords": [ + "event-driven", + "http", + "https", + "reactphp", + "server", + "streaming" + ], + "support": { + "issues": "https://github.com/reactphp/http/issues", + "source": "https://github.com/reactphp/http/tree/master" + }, + "time": "2017-08-16T15:24:39+00:00" + }, + { + "name": "react/promise", + "version": "v2.10.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v2.10.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-05-02T15:15:43+00:00" + }, + { + "name": "react/socket", + "version": "v1.13.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/cff482bbad5848ecbe8b57da57e4e213b03619aa", + "reference": "cff482bbad5848ecbe8b57da57e4e213b03619aa", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.11", + "react/event-loop": "^1.2", + "react/promise": "^3 || ^2.6 || ^1.2.1", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/async": "^4 || ^3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.9" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.13.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-06-07T10:28:34+00:00" + }, + { + "name": "react/stream", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-06-16T10:52:11+00:00" + }, + { + "name": "ringcentral/psr7", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/ringcentral/psr7.git", + "reference": "360faaec4b563958b673fb52bbe94e37f14bc686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ringcentral/psr7/zipball/360faaec4b563958b673fb52bbe94e37f14bc686", + "reference": "360faaec4b563958b673fb52bbe94e37f14bc686", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "RingCentral\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "PSR-7 message implementation", + "keywords": [ + "http", + "message", + "stream", + "uri" + ], + "support": { + "source": "https://github.com/ringcentral/psr7/tree/master" + }, + "time": "2018-05-29T20:21:04+00:00" + }, + { + "name": "seld/cli-prompt", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/cli-prompt.git", + "reference": "b8dfcf02094b8c03b40322c229493bb2884423c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/cli-prompt/zipball/b8dfcf02094b8c03b40322c229493bb2884423c5", + "reference": "b8dfcf02094b8c03b40322c229493bb2884423c5", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.63" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\CliPrompt\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Allows you to prompt for user input on the command line, and optionally hide the characters they type", + "keywords": [ + "cli", + "console", + "hidden", + "input", + "prompt" + ], + "support": { + "issues": "https://github.com/Seldaek/cli-prompt/issues", + "source": "https://github.com/Seldaek/cli-prompt/tree/1.0.4" + }, + "time": "2020-12-15T21:32:01+00:00" + }, + { + "name": "seld/jsonlint", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "support": { + "issues": "https://github.com/Seldaek/jsonlint/issues", + "source": "https://github.com/Seldaek/jsonlint/tree/1.10.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" + } + ], + "time": "2023-05-11T13:16:46+00:00" + }, + { + "name": "seld/phar-utils", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\PharUtils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "PHAR file format utilities, for when PHP phars you up", + "keywords": [ + "phar" + ], + "support": { + "issues": "https://github.com/Seldaek/phar-utils/issues", + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" + }, + "time": "2022-08-31T10:31:18+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.0|^3.1", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.4" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "support": { + "issues": "https://github.com/swiftmailer/swiftmailer/issues", + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", + "type": "tidelift" + } + ], + "abandoned": "symfony/mailer", + "time": "2021-10-18T15:26:12+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273", + "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-19T20:11:33+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.4.25", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", + "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.4.25" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-05-31T13:04:02+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.27", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.27" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-31T08:02:31+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "927013f3aac555983a5059aada98e1907d842695" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/927013f3aac555983a5059aada98e1907d842695", + "reference": "927013f3aac555983a5059aada98e1907d842695", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-iconv": "*" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/process", + "version": "v5.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "1a44dc377ec86a50fab40d066cd061e28a6b482f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/1a44dc377ec86a50fab40d066cd061e28a6b482f", + "reference": "1a44dc377ec86a50fab40d066cd061e28a6b482f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-12T15:44:31+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "1181fe9270e373537475e826873b5867b863883c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/1181fe9270e373537475e826873b5867b863883c", + "reference": "1181fe9270e373537475e826873b5867b863883c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-06-28T12:46:07+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.23", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.23" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-04-23T19:33:36+00:00" + }, + { + "name": "twig/twig", + "version": "v2.15.5", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/fc02a6af3eeb97c4bf5650debc76c2eda85ac22e", + "reference": "fc02a6af3eeb97c4bf5650debc76c2eda85ac22e", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.8" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.15-dev" + } + }, + "autoload": { + "psr-0": { + "Twig_": "lib/" + }, + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v2.15.5" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2023-05-03T17:49:41+00:00" + }, + { + "name": "voku/anti-xss", + "version": "4.1.42", + "source": { + "type": "git", + "url": "https://github.com/voku/anti-xss.git", + "reference": "bca1f8607e55a3c5077483615cd93bd8f11bd675" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/anti-xss/zipball/bca1f8607e55a3c5077483615cd93bd8f11bd675", + "reference": "bca1f8607e55a3c5077483615cd93bd8f11bd675", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "voku/portable-utf8": "~6.0.2" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "voku\\helper\\": "src/voku/helper/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "EllisLab Dev Team", + "homepage": "http://ellislab.com/" + }, + { + "name": "Lars Moelleken", + "email": "lars@moelleken.org", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "anti xss-library", + "homepage": "https://github.com/voku/anti-xss", + "keywords": [ + "anti-xss", + "clean", + "security", + "xss" + ], + "support": { + "issues": "https://github.com/voku/anti-xss/issues", + "source": "https://github.com/voku/anti-xss/tree/4.1.42" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/anti-xss", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/anti-xss", + "type": "tidelift" + } + ], + "time": "2023-07-03T14:40:46+00:00" + }, + { + "name": "voku/arrayy", + "version": "7.9.6", + "source": { + "type": "git", + "url": "https://github.com/voku/Arrayy.git", + "reference": "0e20b8c6eef7fc46694a2906e0eae2f9fc11cade" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/Arrayy/zipball/0e20b8c6eef7fc46694a2906e0eae2f9fc11cade", + "reference": "0e20b8c6eef7fc46694a2906e0eae2f9fc11cade", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.0.0", + "phpdocumentor/reflection-docblock": "~4.3 || ~5.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Create.php" + ], + "psr-4": { + "Arrayy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "email": "lars@moelleken.org", + "homepage": "https://www.moelleken.org/", + "role": "Maintainer" + } + ], + "description": "Array manipulation library for PHP, called Arrayy!", + "keywords": [ + "Arrayy", + "array", + "helpers", + "manipulation", + "methods", + "utility", + "utils" + ], + "support": { + "docs": "https://voku.github.io/Arrayy/", + "issues": "https://github.com/voku/Arrayy/issues", + "source": "https://github.com/voku/Arrayy" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/arrayy", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/arrayy", + "type": "tidelift" + } + ], + "time": "2022-12-27T12:58:32+00:00" + }, + { + "name": "voku/email-check", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/voku/email-check.git", + "reference": "6ea842920bbef6758b8c1e619fd1710e7a1a2cac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/email-check/zipball/6ea842920bbef6758b8c1e619fd1710e7a1a2cac", + "reference": "6ea842920bbef6758b8c1e619fd1710e7a1a2cac", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "symfony/polyfill-intl-idn": "~1.10" + }, + "require-dev": { + "fzaninotto/faker": "~1.7", + "phpunit/phpunit": "~6.0 || ~7.0" + }, + "suggest": { + "ext-intl": "Use Intl for best performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\helper\\": "src/voku/helper/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "email-check (syntax, dns, trash, ...) library", + "homepage": "https://github.com/voku/email-check", + "keywords": [ + "check-email", + "email", + "mail", + "mail-check", + "validate-email", + "validate-email-address", + "validate-mail" + ], + "support": { + "issues": "https://github.com/voku/email-check/issues", + "source": "https://github.com/voku/email-check/tree/3.1.0" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/email-check", + "type": "tidelift" + } + ], + "time": "2021-01-27T14:14:33+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "voku/portable-utf8", + "version": "6.0.13", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-utf8.git", + "reference": "b8ce36bf26593e5c2e81b1850ef0ffb299d2043f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-utf8/zipball/b8ce36bf26593e5c2e81b1850ef0ffb299d2043f", + "reference": "b8ce36bf26593e5c2e81b1850ef0ffb299d2043f", "shasum": "" }, "require": { - "php": ">=5.3", - "psr/http-message": "~1.0" + "php": ">=7.0.0", + "symfony/polyfill-iconv": "~1.0", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.0", + "voku/portable-ascii": "~2.0.0" + }, + "require-dev": { + "phpstan/phpstan": "1.9.*@dev", + "phpstan/phpstan-strict-rules": "1.4.*@dev", + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0", + "thecodingmachine/phpstan-strict-rules": "1.0.*@dev", + "voku/phpstan-rules": "3.1.*@dev" + }, + "suggest": { + "ext-ctype": "Use Ctype for e.g. hexadecimal digit detection", + "ext-fileinfo": "Use Fileinfo for better binary file detection", + "ext-iconv": "Use iconv for best performance", + "ext-intl": "Use Intl for best performance", + "ext-json": "Use JSON for string detection", + "ext-mbstring": "Use Mbstring for best performance" + }, + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "(Apache-2.0 or GPL-2.0)" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Hamid Sarfraz", + "homepage": "http://pageconfig.com/" + }, + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable UTF-8 library - performance optimized (unicode) string functions for php.", + "homepage": "https://github.com/voku/portable-utf8", + "keywords": [ + "UTF", + "clean", + "php", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "issues": "https://github.com/voku/portable-utf8/issues", + "source": "https://github.com/voku/portable-utf8/tree/6.0.13" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-utf8", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-utf8", + "type": "tidelift" + } + ], + "time": "2023-03-08T08:35:38+00:00" + }, + { + "name": "voku/stop-words", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/stop-words.git", + "reference": "8e63c0af20f800b1600783764e0ce19e53969f71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/stop-words/zipball/8e63c0af20f800b1600783764e0ce19e53969f71", + "reference": "8e63c0af20f800b1600783764e0ce19e53969f71", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Stop-Words via PHP", + "keywords": [ + "stop words", + "stop-words" + ], + "support": { + "issues": "https://github.com/voku/stop-words/issues", + "source": "https://github.com/voku/stop-words/tree/master" + }, + "time": "2018-11-23T01:37:27+00:00" + }, + { + "name": "voku/stringy", + "version": "6.5.3", + "source": { + "type": "git", + "url": "https://github.com/voku/Stringy.git", + "reference": "c453c88fbff298f042c836ef44306f8703b2d537" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/Stringy/zipball/c453c88fbff298f042c836ef44306f8703b2d537", + "reference": "c453c88fbff298f042c836ef44306f8703b2d537", + "shasum": "" + }, + "require": { + "defuse/php-encryption": "~2.0", + "ext-json": "*", + "php": ">=7.0.0", + "voku/anti-xss": "~4.1", + "voku/arrayy": "~7.8", + "voku/email-check": "~3.1", + "voku/portable-ascii": "~2.0", + "voku/portable-utf8": "~6.0", + "voku/urlify": "~5.0" + }, + "replace": { + "danielstjules/stringy": "~3.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Create.php" + ], + "psr-4": { + "Stringy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel St. Jules", + "email": "danielst.jules@gmail.com", + "homepage": "http://www.danielstjules.com", + "role": "Maintainer" + }, + { + "name": "Lars Moelleken", + "email": "lars@moelleken.org", + "homepage": "https://www.moelleken.org/", + "role": "Fork-Maintainer" + } + ], + "description": "A string manipulation library with multibyte support", + "homepage": "https://github.com/danielstjules/Stringy", + "keywords": [ + "UTF", + "helpers", + "manipulation", + "methods", + "multibyte", + "string", + "utf-8", + "utility", + "utils" + ], + "support": { + "issues": "https://github.com/voku/Stringy/issues", + "source": "https://github.com/voku/Stringy" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/stringy", + "type": "tidelift" + } + ], + "time": "2022-03-28T14:52:20+00:00" + }, + { + "name": "voku/urlify", + "version": "5.0.7", + "source": { + "type": "git", + "url": "https://github.com/voku/urlify.git", + "reference": "014b2074407b5db5968f836c27d8731934b330e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/urlify/zipball/014b2074407b5db5968f836c27d8731934b330e4", + "reference": "014b2074407b5db5968f836c27d8731934b330e4", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "voku/portable-ascii": "~2.0", + "voku/portable-utf8": "~6.0", + "voku/stop-words": "~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\helper\\": "src/voku/helper/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Johnny Broadway", + "email": "johnny@johnnybroadway.com", + "homepage": "http://www.johnnybroadway.com/" + }, + { + "name": "Lars Moelleken", + "email": "lars@moelleken.org", + "homepage": "https://moelleken.org/" + } + ], + "description": "PHP port of URLify.js from the Django project. Transliterates non-ascii characters for use in URLs.", + "homepage": "https://github.com/voku/urlify", + "keywords": [ + "encode", + "iconv", + "link", + "slug", + "translit", + "transliterate", + "transliteration", + "url", + "urlify" + ], + "support": { + "issues": "https://github.com/voku/urlify/issues", + "source": "https://github.com/voku/urlify/tree/5.0.7" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/urlify", + "type": "tidelift" + } + ], + "time": "2022-01-24T19:08:46+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "webonyx/graphql-php", + "version": "v14.11.10", + "source": { + "type": "git", + "url": "https://github.com/webonyx/graphql-php.git", + "reference": "d9c2fdebc6aa01d831bc2969da00e8588cffef19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/d9c2fdebc6aa01d831bc2969da00e8588cffef19", + "reference": "d9c2fdebc6aa01d831bc2969da00e8588cffef19", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^7.1 || ^8" + }, + "require-dev": { + "amphp/amp": "^2.3", + "doctrine/coding-standard": "^6.0", + "nyholm/psr7": "^1.2", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "0.12.82", + "phpstan/phpstan-phpunit": "0.12.18", + "phpstan/phpstan-strict-rules": "0.12.9", + "phpunit/phpunit": "^7.2 || ^8.5", + "psr/http-message": "^1.0", + "react/promise": "2.*", + "simpod/php-coveralls-mirror": "^3.0" + }, + "suggest": { + "psr/http-message": "To use standard GraphQL server", + "react/promise": "To leverage async resolving on React PHP platform" + }, + "type": "library", + "autoload": { + "psr-4": { + "GraphQL\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP port of GraphQL reference implementation", + "homepage": "https://github.com/webonyx/graphql-php", + "keywords": [ + "api", + "graphql" + ], + "support": { + "issues": "https://github.com/webonyx/graphql-php/issues", + "source": "https://github.com/webonyx/graphql-php/tree/v14.11.10" + }, + "funding": [ + { + "url": "https://opencollective.com/webonyx-graphql-php", + "type": "open_collective" + } + ], + "time": "2023-07-05T14:23:37+00:00" + }, + { + "name": "yiisoft/yii2", + "version": "2.0.45", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-framework.git", + "reference": "e2223d4085e5612aa616635f8fcaf478607f62e8" }, - "provide": { - "psr/http-message-implementation": "1.0" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/e2223d4085e5612aa616635f8fcaf478607f62e8", + "reference": "e2223d4085e5612aa616635f8fcaf478607f62e8", + "shasum": "" }, - "require-dev": { - "phpunit/phpunit": "~4.0" + "require": { + "bower-asset/inputmask": "~3.2.2 | ~3.3.5", + "bower-asset/jquery": "3.6.*@stable | 3.5.*@stable | 3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", + "bower-asset/punycode": "1.3.*", + "bower-asset/yii2-pjax": "~2.0.1", + "cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0", + "ext-ctype": "*", + "ext-mbstring": "*", + "ezyang/htmlpurifier": "~4.6", + "lib-pcre": "*", + "paragonie/random_compat": ">=1", + "php": ">=5.4.0", + "yiisoft/yii2-composer": "~2.0.4" }, + "bin": [ + "yii" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "RingCentral\\Psr7\\": "src/" + "yii\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com", + "homepage": "https://www.yiiframework.com/", + "role": "Founder and project lead" }, - "files": [ - "src/functions_include.php" - ] + { + "name": "Alexander Makarov", + "email": "sam@rmcreative.ru", + "homepage": "https://rmcreative.ru/", + "role": "Core framework development" + }, + { + "name": "Maurizio Domba", + "homepage": "http://mdomba.info/", + "role": "Core framework development" + }, + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "https://www.cebe.cc/", + "role": "Core framework development" + }, + { + "name": "Timur Ruziev", + "email": "resurtm@gmail.com", + "homepage": "http://resurtm.com/", + "role": "Core framework development" + }, + { + "name": "Paul Klimov", + "email": "klimov.paul@gmail.com", + "role": "Core framework development" + }, + { + "name": "Dmitry Naumenko", + "email": "d.naumenko.a@gmail.com", + "role": "Core framework development" + }, + { + "name": "Boudewijn Vahrmeijer", + "email": "info@dynasource.eu", + "homepage": "http://dynasource.eu", + "role": "Core framework development" + } + ], + "description": "Yii PHP Framework Version 2", + "homepage": "https://www.yiiframework.com/", + "keywords": [ + "framework", + "yii2" + ], + "support": { + "forum": "https://forum.yiiframework.com/", + "irc": "ircs://irc.libera.chat:6697/yii", + "issues": "https://github.com/yiisoft/yii2/issues?state=open", + "source": "https://github.com/yiisoft/yii2", + "wiki": "https://www.yiiframework.com/wiki" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2", + "type": "tidelift" + } + ], + "time": "2022-02-11T13:12:40+00:00" + }, + { + "name": "yiisoft/yii2-composer", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-composer.git", + "reference": "94bb3f66e779e2774f8776d6e1bdeab402940510" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/94bb3f66e779e2774f8776d6e1bdeab402940510", + "reference": "94bb3f66e779e2774f8776d6e1bdeab402940510", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 | ^2.0" + }, + "require-dev": { + "composer/composer": "^1.0 | ^2.0@dev", + "phpunit/phpunit": "<7" + }, + "type": "composer-plugin", + "extra": { + "class": "yii\\composer\\Plugin", + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\composer\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + }, + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc" } ], - "description": "PSR-7 message implementation", + "description": "The composer plugin for Yii extension installer", "keywords": [ - "http", - "message", - "stream", - "uri" + "composer", + "extension installer", + "yii2" + ], + "support": { + "forum": "http://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii2-composer/issues", + "source": "https://github.com/yiisoft/yii2-composer", + "wiki": "http://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-composer", + "type": "tidelift" + } ], - "time": "2016-03-25T17:36:49+00:00" + "time": "2020-06-24T00:04:01+00:00" }, { - "name": "webonyx/graphql-php", - "version": "v0.10.2", + "name": "yiisoft/yii2-debug", + "version": "2.1.24", "source": { "type": "git", - "url": "https://github.com/webonyx/graphql-php.git", - "reference": "7cc863df37b2270ec2b57cb9d322da064d832a59" + "url": "https://github.com/yiisoft/yii2-debug.git", + "reference": "e15e954d0beb82b0b532f998f55e7275083de592" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/7cc863df37b2270ec2b57cb9d322da064d832a59", - "reference": "7cc863df37b2270ec2b57cb9d322da064d832a59", + "url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/e15e954d0beb82b0b532f998f55e7275083de592", + "reference": "e15e954d0beb82b0b532f998f55e7275083de592", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=5.5,<8.0-DEV" + "php": ">=5.4", + "yiisoft/yii2": "~2.0.13" + }, + "require-dev": { + "cweagans/composer-patches": "^1.7", + "phpunit/phpunit": "4.8.34", + "yiisoft/yii2-coding-standards": "~2.0", + "yiisoft/yii2-swiftmailer": "*" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + }, + "composer-exit-on-patch-failure": true, + "patches": { + "phpunit/phpunit-mock-objects": { + "Fix PHP 7 and 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_mock_objects.patch" + }, + "phpunit/phpunit": { + "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch", + "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch", + "Fix PHP 8.1 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php81.patch" + } + } + }, + "autoload": { + "psr-4": { + "yii\\debug\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + }, + { + "name": "Simon Karlen", + "email": "simi.albi@outlook.com" + } + ], + "description": "The debugger extension for the Yii framework", + "keywords": [ + "debug", + "debugger", + "yii2" + ], + "support": { + "forum": "http://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii2-debug/issues", + "source": "https://github.com/yiisoft/yii2-debug", + "wiki": "http://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-debug", + "type": "tidelift" + } + ], + "time": "2023-07-10T06:07:43+00:00" + }, + { + "name": "yiisoft/yii2-queue", + "version": "2.3.5", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-queue.git", + "reference": "c1bf0ef5dbe107dc1cf692c1349b9ddd2485a399" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-queue/zipball/c1bf0ef5dbe107dc1cf692c1349b9ddd2485a399", + "reference": "c1bf0ef5dbe107dc1cf692c1349b9ddd2485a399", + "shasum": "" + }, + "require": { + "php": ">=5.5.0", + "symfony/process": "^3.3||^4.0||^5.0||^6.0", + "yiisoft/yii2": "~2.0.14" }, "require-dev": { - "phpunit/phpunit": "^4.8", - "psr/http-message": "^1.0" + "aws/aws-sdk-php": ">=2.4", + "enqueue/amqp-lib": "^0.8||^0.9.10", + "enqueue/stomp": "^0.8.39", + "opis/closure": "*", + "pda/pheanstalk": "v3.*", + "php-amqplib/php-amqplib": "*", + "phpunit/phpunit": "~4.4", + "yiisoft/yii2-debug": "*", + "yiisoft/yii2-gii": "*", + "yiisoft/yii2-redis": "*" }, "suggest": { - "psr/http-message": "To use standard GraphQL server", - "react/promise": "To leverage async resolving on React PHP platform" + "aws/aws-sdk-php": "Need for aws SQS.", + "enqueue/amqp-lib": "Need for AMQP interop queue.", + "enqueue/stomp": "Need for Stomp queue.", + "ext-gearman": "Need for Gearman queue.", + "ext-pcntl": "Need for process signals.", + "pda/pheanstalk": "Need for Beanstalk queue.", + "php-amqplib/php-amqplib": "Need for AMQP queue.", + "yiisoft/yii2-redis": "Need for Redis queue." + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\queue\\": "src", + "yii\\queue\\db\\": "src/drivers/db", + "yii\\queue\\sqs\\": "src/drivers/sqs", + "yii\\queue\\amqp\\": "src/drivers/amqp", + "yii\\queue\\file\\": "src/drivers/file", + "yii\\queue\\sync\\": "src/drivers/sync", + "yii\\queue\\redis\\": "src/drivers/redis", + "yii\\queue\\stomp\\": "src/drivers/stomp", + "yii\\queue\\gearman\\": "src/drivers/gearman", + "yii\\queue\\beanstalk\\": "src/drivers/beanstalk", + "yii\\queue\\amqp_interop\\": "src/drivers/amqp_interop" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Roman Zhuravlev", + "email": "zhuravljov@gmail.com" + } + ], + "description": "Yii2 Queue Extension which supported DB, Redis, RabbitMQ, Beanstalk, SQS and Gearman", + "keywords": [ + "async", + "beanstalk", + "db", + "gearman", + "gii", + "queue", + "rabbitmq", + "redis", + "sqs", + "yii" + ], + "support": { + "docs": "https://github.com/yiisoft/yii2-queue/blob/master/docs/guide", + "issues": "https://github.com/yiisoft/yii2-queue/issues", + "source": "https://github.com/yiisoft/yii2-queue" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-queue", + "type": "tidelift" + } + ], + "time": "2022-11-18T17:16:47+00:00" + }, + { + "name": "yiisoft/yii2-swiftmailer", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-swiftmailer.git", + "reference": "7b7ec871b4a63c0abbcd10e1ee3fb5be22f8b340" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-swiftmailer/zipball/7b7ec871b4a63c0abbcd10e1ee3fb5be22f8b340", + "reference": "7b7ec871b4a63c0abbcd10e1ee3fb5be22f8b340", + "shasum": "" + }, + "require": { + "swiftmailer/swiftmailer": "~6.0", + "yiisoft/yii2": ">=2.0.4" + }, + "require-dev": { + "cweagans/composer-patches": "^1.7", + "phpunit/phpunit": "4.8.34" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + }, + "composer-exit-on-patch-failure": true, + "patches": { + "phpunit/phpunit-mock-objects": { + "Fix PHP 7 and 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_mock_objects.patch" + }, + "phpunit/phpunit": { + "Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch", + "Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch" + } + } + }, + "autoload": { + "psr-4": { + "yii\\swiftmailer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Paul Klimov", + "email": "klimov.paul@gmail.com" + } + ], + "description": "The SwiftMailer integration for the Yii framework", + "keywords": [ + "email", + "mail", + "mailer", + "swift", + "swiftmailer", + "yii2" + ], + "support": { + "forum": "http://www.yiiframework.com/forum/", + "irc": "irc://irc.freenode.net/yii", + "issues": "https://github.com/yiisoft/yii2-swiftmailer/issues", + "source": "https://github.com/yiisoft/yii2-swiftmailer", + "wiki": "http://www.yiiframework.com/wiki/" + }, + "funding": [ + { + "url": "https://github.com/yiisoft", + "type": "github" + }, + { + "url": "https://opencollective.com/yiisoft", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/yiisoft/yii2-swiftmailer", + "type": "tidelift" + } + ], + "time": "2021-12-30T08:48:48+00:00" + } + ], + "packages-dev": [ + { + "name": "n98/junit-xml", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/cmuench/junit-xml.git", + "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cmuench/junit-xml/zipball/0017dd92ac8cb619f02e32f4cffd768cfe327c73", + "reference": "0017dd92ac8cb619f02e32f4cffd768cfe327c73", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.0" }, "type": "library", "autoload": { - "files": [ - "src/deprecated.php" - ], "psr-4": { - "GraphQL\\": "src/" + "N98\\JUnitXml\\": "src/N98/JUnitXml" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD" + "MIT" ], - "description": "A PHP port of GraphQL reference implementation", - "homepage": "https://github.com/webonyx/graphql-php", + "authors": [ + { + "name": "Christian Münch", + "email": "c.muench@netz98.de" + } + ], + "description": "JUnit XML Document generation library", + "support": { + "issues": "https://github.com/cmuench/junit-xml/issues", + "source": "https://github.com/cmuench/junit-xml/tree/1.1.0" + }, + "time": "2020-12-25T09:08:58+00:00" + }, + { + "name": "overtrue/phplint", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/overtrue/phplint.git", + "reference": "59affacd0b09a1460e39acf2c64c963ddbf734cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/overtrue/phplint/zipball/59affacd0b09a1460e39acf2c64c963ddbf734cf", + "reference": "59affacd0b09a1460e39acf2c64c963ddbf734cf", + "shasum": "" + }, + "require": { + "ext-json": "*", + "n98/junit-xml": "1.1.0", + "php": ">=5.5.9", + "symfony/console": "^3.2|^4.0|^5.0", + "symfony/finder": "^3.0|^4.0|^5.0", + "symfony/process": "^3.3|^4.0|^5.0", + "symfony/yaml": "^3.0|^4.0|^5.0" + }, + "require-dev": { + "brainmaestro/composer-git-hooks": "^2.7", + "friendsofphp/php-cs-fixer": "^2.16", + "jakub-onderka/php-console-highlighter": "^0.3.2 || ^0.4" + }, + "bin": [ + "bin/phplint" + ], + "type": "library", + "extra": { + "hooks": { + "pre-commit": [ + "composer fix-style" + ], + "pre-push": [ + "composer check-style" + ] + } + }, + "autoload": { + "psr-4": { + "Overtrue\\PHPLint\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "`phplint` is a tool that can speed up linting of php files by running several lint processes at once.", "keywords": [ - "api", - "graphql" + "check", + "lint", + "phplint", + "syntax" ], - "time": "2017-08-30T16:33:58+00:00" + "support": { + "issues": "https://github.com/overtrue/phplint/issues", + "source": "https://github.com/overtrue/phplint/tree/2.4.1" + }, + "time": "2021-06-02T16:18:33+00:00" } ], - "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": [], - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "2.3.0" } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..e99b281d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +version: '2' + +services: + + app: + build: . + container_name: craftql-composer + volumes: + - ./composer.json:/composer.json + - ./composer.lock:/composer.lock + + environment: + # Set locale to UTF-8 (https://oncletom.io/2015/docker-encoding/) + LANG: C.UTF-8 \ No newline at end of file diff --git a/src/Console/ToolsController.php b/src/Console/ToolsController.php index 56fab533..15845689 100644 --- a/src/Console/ToolsController.php +++ b/src/Console/ToolsController.php @@ -65,15 +65,18 @@ public function actionServe() $query = false; $variables = []; + $headers = [ + 'Content-Type' => 'application/json; charset=UTF-8', + ]; + $authorization = @$request->getHeaders()['authorization'][0]; preg_match('/^(?:b|B)earer\s+(?.+)/', $authorization, $matches); - $token = Token::findId(@$matches['tokenId']); + $token = Token::findOrAnonymous(@$matches['tokenId']); - // @todo, check user permissions when PRO license + if ($user = $token->getUser()) { + $headers['Authorization'] = 'Bearer ' . CraftQL::getInstance()->jwt->tokenForUser($user); + } - $headers = [ - 'Content-Type' => 'application/json; charset=UTF-8', - ]; if ($allowedOrigins = CraftQL::getInstance()->getSettings()->allowedOrigins) { if (is_string($allowedOrigins)) { $allowedOrigins = [$allowedOrigins]; @@ -92,17 +95,6 @@ public function actionServe() return $resolve(new Response(200, $headers, '')); } - if (!$token) { - $response = new Response(403, $headers, - json_encode([ - 'errors' => [ - ['message' => 'Not authorized'] - ] - ]) - ); - return $resolve($response); - } - if ($postBody) { $body = json_decode($postBody, true); $query = @$body['query']; diff --git a/src/Controllers/ApiController.php b/src/Controllers/ApiController.php index d7f27b68..ed7f1585 100644 --- a/src/Controllers/ApiController.php +++ b/src/Controllers/ApiController.php @@ -12,17 +12,6 @@ class ApiController extends Controller protected $allowAnonymous = ['index']; private $graphQl; - private $request; - - function __construct( - $id, - $module, - \markhuot\CraftQL\Services\GraphQLService $graphQl, - $config = [] - ) { - parent::__construct($id, $module, $config); - $this->graphQl = $graphQl; - } /** * @inheritdoc @@ -49,16 +38,27 @@ function actionDebug() { function actionIndex() { - $token = false; + $response = \Craft::$app->getResponse(); $result = false; $authorization = Craft::$app->request->headers->get('authorization'); preg_match('/^(?:b|B)earer\s+(?.+)/', $authorization, $matches); - $token = Token::findId(@$matches['tokenId']); + try { + $token = Token::findOrAnonymous(@$matches['tokenId']); + } catch ( \UnexpectedValueException + | \Firebase\JWT\SignatureInvalidException + | \Firebase\JWT\BeforeValidException + | \Firebase\JWT\ExpiredException $e) { + $response->setStatusCode(401); + $response->headers->add('Content-Type', 'application/json; charset=UTF-8'); + return $this->asErrorJson($e->getMessage()); + } - // @todo, check user permissions when PRO license - $response = \Craft::$app->getResponse(); + if ($user = $token->getUser()) { + $response->headers->add('Authorization', 'Bearer ' . CraftQL::getInstance()->jwt->tokenForUser($user)); + } + if ($allowedOrigins = CraftQL::getInstance()->getSettings()->allowedOrigins) { if (is_string($allowedOrigins)) { $allowedOrigins = [$allowedOrigins]; @@ -67,24 +67,19 @@ function actionIndex() if (in_array($origin, $allowedOrigins) || in_array('*', $allowedOrigins)) { $response->headers->set('Access-Control-Allow-Origin', $origin); } - $response->headers->set('Access-Control-Allow-Credentials', 'true'); + + $response->headers->add('Access-Control-Allow-Credentials', 'true'); + $response->headers->add('Access-Control-Allow-Headers', 'Authorization, Content-Type'); + $response->headers->add('Access-Control-Expose-Headers', 'Authorization'); $response->headers->set('Access-Control-Allow-Headers', implode(', ', CraftQL::getInstance()->getSettings()->allowedHeaders)); } + $response->headers->set('Allow', implode(', ', CraftQL::getInstance()->getSettings()->verbs)); if (\Craft::$app->getRequest()->isOptions) { return ''; } - if (!$token) { - http_response_code(403); - return $this->asJson([ - 'errors' => [ - ['message' => 'Not authorized'] - ] - ]); - } - Craft::debug('CraftQL: Parsing request'); if (Craft::$app->request->isPost && $query=Craft::$app->request->post('query')) { $input = $query; @@ -114,7 +109,7 @@ function actionIndex() $useCache = key_exists('useCache', $config) && $config['useCache'] === true; if ($useCache) { - Craft::trace('CraftQL: Checking cache'); + Craft::debug('CraftQL: Checking cache'); $cache = Craft::$app->getCache(); $cacheKey = $cache->buildKey([$input, $variables]); @@ -124,29 +119,27 @@ function actionIndex() } if(!$result) { - Craft::trace('CraftQL: Parsing request complete'); - - Craft::trace('CraftQL: Bootstrapping'); - $this->graphQl->bootstrap(); - Craft::trace('CraftQL: Bootstrapping complete'); + Craft::debug('CraftQL: Parsing request complete'); - Craft::trace('CraftQL: Fetching schema'); - $schema = $this->graphQl->getSchema($token); - Craft::trace('CraftQL: Schema built'); + Craft::debug('CraftQL: Bootstrapping'); + CraftQL::getInstance()->graphQl->bootstrap(); + Craft::debug('CraftQL: Bootstrapping complete'); - Craft::trace('CraftQL: Executing query'); + Craft::debug('CraftQL: Fetching schema'); + $schema = CraftQL::getInstance()->graphQl->getSchema($token); + Craft::debug('CraftQL: Schema built'); - $config = Craft::$app->getConfig()->getConfigFromFile('craftql'); + Craft::debug('CraftQL: Executing query'); - $result = $this->graphQl->execute($schema, $input, $variables); + $result = CraftQL::getInstance()->graphQl->execute($schema, $input, $variables); if($useCache) { - Craft::trace('CraftQL: Updating cache'); + Craft::debug('CraftQL: Updating cache'); $cache->set($cacheKey, $result); } } - Craft::trace('CraftQL: Execution complete'); + Craft::debug('CraftQL: Execution complete'); $customHeaders = CraftQL::getInstance()->getSettings()->headers ?: []; foreach ($customHeaders as $key => $value) { diff --git a/src/CraftQL.php b/src/CraftQL.php index 5fd16fdf..1b632ea6 100644 --- a/src/CraftQL.php +++ b/src/CraftQL.php @@ -9,11 +9,19 @@ use craft\web\UrlManager; use craft\events\RegisterUrlRulesEvent; +use markhuot\CraftQL\Services\GraphQLService; +use markhuot\CraftQL\Services\JWTService; use markhuot\CraftQL\Models\Settings; use yii\base\Event; use markhuot\CraftQL\Models\Token; +/** + * Class CraftQL + * @package markhuot\CraftQL + * @property JWTService jwt + * @property GraphQLService graphQl + */ class CraftQL extends Plugin { // const EVENT_GET_FIELD_SCHEMA = 'getFieldSchema'; @@ -82,6 +90,9 @@ function (RegisterUrlRulesEvent $event) use ($uri, $verbs) { } } + /** + * @inheritdoc + */ public static function getInstance(): self { return parent::getInstance(); } diff --git a/src/Factories/BaseFactory.php b/src/Factories/BaseFactory.php index 365cbdd3..881ffc45 100644 --- a/src/Factories/BaseFactory.php +++ b/src/Factories/BaseFactory.php @@ -49,7 +49,7 @@ function all($mode='query') { } function count() { - return count($this->repository->all()); + return count($this->all()); } function getEnumKey($object) { diff --git a/src/Factories/DraftEntryType.php b/src/Factories/DraftEntryType.php index 7d43007f..efa9815b 100644 --- a/src/Factories/DraftEntryType.php +++ b/src/Factories/DraftEntryType.php @@ -11,7 +11,7 @@ function make($raw, $request) { } function can($id, $mode='query') { - return $this->request->token()->can("{$mode}:entryType:{$id}"); + return $this->request->token()->can("{$mode}:entrytype:{$id}" || $this->request->token()->can("{$mode}:entrytype:{$id}:all")); } function getEnumName($object) { diff --git a/src/Factories/EntryType.php b/src/Factories/EntryType.php index 9a9dc4ea..56905884 100644 --- a/src/Factories/EntryType.php +++ b/src/Factories/EntryType.php @@ -12,7 +12,7 @@ function make($raw, $request) { } function can($id, $mode='query') { - return $this->request->token()->can("{$mode}:entryType:{$id}"); + return $this->request->token()->can("{$mode}:entrytype:{$id}") || $this->request->token()->can("{$mode}:entrytype:{$id}:all"); } function getEnumKey($object) { diff --git a/src/Factories/Section.php b/src/Factories/Section.php index 9551b6c8..56ec7ef4 100644 --- a/src/Factories/Section.php +++ b/src/Factories/Section.php @@ -13,7 +13,7 @@ function make($raw, $request) { function can($id, $mode='query') { $section = $this->repository->get($id); foreach ($section->entryTypes as $type) { - if ($this->request->token()->can("{$mode}:entryType:{$type->id}")) { + if ($this->request->token()->can("{$mode}:entrytype:{$type->id}") || $this->request->token()->can("{$mode}:entrytype:{$type->id}:all")) { return true; } } diff --git a/src/FieldBehaviors/RelatedEntriesField.php b/src/FieldBehaviors/RelatedEntriesField.php index 9fb64359..a8022f0a 100644 --- a/src/FieldBehaviors/RelatedEntriesField.php +++ b/src/FieldBehaviors/RelatedEntriesField.php @@ -9,6 +9,10 @@ class RelatedEntriesField extends SchemaBehavior { function initRelatedEntriesField() { + if ($this->owner->request->entryTypes()->count() == 0) { + return; + } + $this->owner->addField('relatedEntries') ->type(EntryConnection::class) ->use(new EntryQueryArguments) diff --git a/src/Listeners/GetAssetsFieldSchema.php b/src/Listeners/GetAssetsFieldSchema.php index a563fdd0..08ae41cf 100644 --- a/src/Listeners/GetAssetsFieldSchema.php +++ b/src/Listeners/GetAssetsFieldSchema.php @@ -34,7 +34,6 @@ function handle(GetFieldSchema $event) { $inputObject->addIntArgument('id'); $inputObject->addStringArgument('url'); $inputObject->addStringArgument('title'); - // $inputObject->addFieldsByLayoutId(); $event->mutation->addArgument($field) ->lists() diff --git a/src/Listeners/GetCategoriesFieldSchema.php b/src/Listeners/GetCategoriesFieldSchema.php index e2bc8239..9812c3de 100644 --- a/src/Listeners/GetCategoriesFieldSchema.php +++ b/src/Listeners/GetCategoriesFieldSchema.php @@ -65,7 +65,11 @@ function handle(GetFieldSchema $event) { ->type($inputObject) ->lists() ->onSave(function ($values) use ($groupId) { - $group = Craft::$app->getCategories()->getGroupById($groupId); + if (!is_numeric($groupId)) { + $group = Craft::$app->getCategories()->getGroupByUid($groupId); + } else { + $group = Craft::$app->getCategories()->getGroupById($groupId); + } foreach ($values as &$value) { if (!empty($value['id']) && is_numeric($value['id'])) { diff --git a/src/Listeners/GetUserPermissions.php b/src/Listeners/GetUserPermissions.php new file mode 100644 index 00000000..8a8340c2 --- /dev/null +++ b/src/Listeners/GetUserPermissions.php @@ -0,0 +1,49 @@ +sections->getAllSections(); + foreach ($sections as $section) { + $entryTypes = $section->getEntryTypes(); + foreach ($entryTypes as $entryType) { + $id = $entryType->id; + $queryTypes["craftql:query:entrytype:{$id}"] = ['label' => \Craft::t('craftql', 'Query their own entries of the '.$entryType->name.' entry type')]; + $queryTypes["craftql:query:entrytype:{$id}:all"] = ['label' => \Craft::t('craftql', 'Query all entries of the '.$entryType->name.' entry type')]; + $mutationTypes["craftql:mutate:entrytype:{$id}"] = ['label' => \Craft::t('craftql', 'Mutate their own entries of the '.$entryType->name.' entry type')]; + } + } + $queryTypes['craftql:query:otheruserentries'] = ['label' => \Craft::t('craftql', 'Query other authors’ entries')]; + + $event->permissions[\Craft::t('craftql', 'CraftQL Queries')] = [ + 'craftql:query:entries' => ['label' => \Craft::t('craftql', 'Query Entries'), 'nested' => $queryTypes], + 'craftql:query:entry.author' => ['label' => \Craft::t('craftql', 'Query Entry Authors')], + 'craftql:query:globals' => ['label' => \Craft::t('craftql', 'Query Globals')], + 'craftql:query:categories' => ['label' => \Craft::t('craftql', 'Query Categories')], + 'craftql:query:tags' => ['label' => \Craft::t('craftql', 'Query Tags')], + 'craftql:query:users' => ['label' => \Craft::t('craftql', 'Query Users')], + 'craftql:query:sections' => ['label' => \Craft::t('craftql', 'Query Sections')], + 'craftql:query:fields' => ['label' => \Craft::t('craftql', 'Query Fields')], + 'craftql:mutate:entries' => ['label' => \Craft::t('craftql', 'Mutate Entries'), 'nested' => $mutationTypes], + 'craftql:mutate:globals' => ['label' => \Craft::t('craftql', 'Mutate Globals')], + 'craftql:mutate:users' => [ + 'label' => \Craft::t('craftql', 'Mutate Users'), + 'nested' => [ + 'craftql:mutate:users:all' => ['label' => \Craft::t('craftql', 'Mutate all users.')], + 'craftql:mutate:users:permissions' => ['label' => \Craft::t('craftql', 'Mutate users permissions.')], + 'craftql:mutate:users:self' => ['label' => \Craft::t('craftql', 'Mutate thier own user.')] + ] + ] + ]; + } +} diff --git a/src/Models/Settings.php b/src/Models/Settings.php index 50cd9312..0264a184 100644 --- a/src/Models/Settings.php +++ b/src/Models/Settings.php @@ -12,6 +12,8 @@ class Settings extends Model public $allowedOrigins = []; public $allowedHeaders = ['Authorization, Content-Type']; public $headers = []; + public $securityKey = false; + public $userTokenDuration = 60 * 60 * 4 /* 4 hours */; public $maxQueryDepth = false; public $maxQueryComplexity = false; public $throwSchemaBuildErrors = false; diff --git a/src/Models/Token.php b/src/Models/Token.php index 0f7d87dc..6d59fbbb 100644 --- a/src/Models/Token.php +++ b/src/Models/Token.php @@ -4,49 +4,177 @@ use Craft; use craft\db\ActiveRecord; -use craft\records\User; +use Firebase\JWT\ExpiredException; +use GraphQL\Error\UserError; +use markhuot\CraftQL\CraftQL; class Token extends ActiveRecord { + /** + * Whether the token represents an admin role + * + * @var bool + */ private $admin = false; - public function getUser() { - return $this->hasOne(User::class, ['id' => 'userId']); + /** + * Whether the token is for an anonymous user (pre-auth/token) + * + * @var bool + */ + private $anonymous = false; + + /** + * @var \craft\elements\User + */ + private $user = false; + + /** + * @return \craft\elements\User + */ + function getUser() { + return $this->user; } - public static function findId($tokenId=false) + /** + * Sets the user + * + * @param \craft\elements\User $user + */ + function setUser (\craft\elements\User $user) { + $this->user = $user; + } + + /** + * Gets a token by the token id + * + * @param bool $token + * @return Token|null + * + * @throws \Firebase\JWT\UnexpectedValueException Provided JWT was invalid + * @throws \Firebase\JWT\SignatureInvalidException Provided JWT was invalid because the signature verification failed + * @throws \Firebase\JWT\BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf' + * @throws \Firebase\JWT\BeforeValidException Provided JWT is trying to be used before it's been created as defined by 'iat' + * @throws \Firebase\JWT\ExpiredException Provided JWT has since expired, as defined by the 'exp' claim + */ + public static function findOrAnonymous($token=false) { - if ($tokenId) { - return Token::find()->where(['token' => $tokenId])->one(); + if (empty($token)) { + $token = static::tokenForSession(); } + else { - $user = Craft::$app->getUser()->getIdentity(); - if ($user) { - return Token::forUser($user); - } + $token = static::tokenForString($token); + } + + if (!$token) { + $token = static::anonymous(); + } + + return $token; + } + + public static function tokenForSession() { + if ($user = Craft::$app->getUser()->getIdentity()) { + return Token::forUser($user); } return false; } - public static function admin(): Token - { - $token = new static; - $token->scopes = json_encode([]); - $token->makeAdmin(); - return $token; + /** + * @param $token + * @return false|Token + * + * @throws \UnexpectedValueException Provided JWT was invalid + * @throws \Firebase\JWT\SignatureInvalidException Provided JWT was invalid because the signature verification failed + * @throws \Firebase\JWT\BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf' + * @throws \Firebase\JWT\BeforeValidException Provided JWT is trying to be used before it's been created as defined by 'iat' + * @throws \Firebase\JWT\ExpiredException Provided JWT has since expired, as defined by the 'exp' claim + */ + public static function tokenForString($token) { + // If the token matches a JWT format + if (preg_match('/[^.]+\.[^.]+\.[^.]+/', $token)) { + $tokenData = CraftQL::getInstance()->jwt->refreshDecode($token); + $user = \craft\elements\User::find()->id($tokenData->id)->one(); + $token = Token::forUser($user); + return $token; + } + + // If the token is in the database + /** @var Token $token */ + if ($token = Token::find()->where(['token' => $token])->one()) { + return $token; + } + + return false; } - public static function forUser(): Token + /** + * A generic admin token + * + * @return Token + */ + public static function admin(): Token { - $token = new static; - $token->scopes = json_encode([]); - $token->makeAdmin(); - return $token; + return (new static)->makeAdmin(); } + /** + * Turn the token in to an admin token + * + * @return $this + */ public function makeAdmin() { $this->admin = true; + return $this; + } + + /** + * A generic anonymous token + * + * @return Token + */ + public static function anonymous(): Token { + return (new static)->makeAnonymous(); + } + + /** + * Turn the token in to an anonymous token + * + * @return $this + */ + public function makeAnonymous() { + $this->anonymous = true; + $this->scopes = json_encode(['mutate:users:new' => 1]); + return $this; + } + + /** + * Returns a token with the user permissions translated over in to token permissions + * + * @param \craft\elements\User $user + * @return Token + */ + public static function forUser(\craft\elements\User $user): Token + { + $token = new static; + $token->setUser($user); + + $scopes = []; + $permissions = Craft::$app->getUserPermissions()->getPermissionsByUserId($user->id); + foreach ($permissions as $permission) { + if (substr($permission, 0, 8) == 'craftql:') { + $scopes[substr($permission, 8)] = 1; + } + } + $token->scopes = json_encode($scopes); + + if ($user->admin) { + $token->makeAdmin(); + } + + return $token; } /** @@ -59,78 +187,32 @@ public static function tableName(): string function getScopeArray(): array { - return json_decode($this->scopes ?: '[]', true); + $scopes = []; + + $rawScopes = json_decode($this->scopes ?: '[]', true); + foreach ($rawScopes as $key => $value) { + $scopes[strtolower($key)] = $value; + } + + return $scopes; } function can($do): bool { - return $this->admin || @$this->scopeArray[$do] ?: false; + return $this->admin || @$this->getScopeArray()[$do] ?: false; } function canNot($do): bool { return !$this->can($do); } - // function mutableEntryTypeIds(): array { - // $ids = []; - - // foreach ($this->scopeArray as $scope => $enabled) { - // if ($enabled && preg_match('/mutation:entryType:(\d+)/', $scope, $matches)) { - // $ids[] = $matches[1]; - // } - // } - - // return $ids; - // } - - // function queryableEntryTypeIds(): array { - // $ids = []; - - // foreach ($this->scopeArray as $scope => $enabled) { - // if ($enabled && preg_match('/query:entryType:(\d+)/', $scope, $matches)) { - // $ids[] = $matches[1]; - // } - // } - - // return $ids; - // } - - // private $entryTypeEnum; - - // function entryTypeEnum() { - // if ($this->entryTypeEnum) { - // return $this->entryTypeEnum; - // } - - // $entryTypeEnumValues = []; - // // $sectionEnumValues = []; - - // foreach (\markhuot\CraftQL\Repositories\EntryType::all() as $entryType) { - // if (in_array($entryType->id, $this->queryableEntryTypeIds())) { - // $name = \markhuot\CraftQL\Types\EntryType::getName($entryType); - // $entryTypeEnumValues[$name] = $entryType->id; - // // $sectionEnumValues[$entryType->section->handle] = $entryType->section->id; - // } - // } - - // return $this->entryTypeEnum = new EnumType([ - // 'name' => 'EntryTypeEnum', - // 'values' => $entryTypeEnumValues, - // ]); - - // // $this->sectionArgEnum = new EnumType([ - // // 'name' => 'SectionEnum', - // // 'values' => $sectionEnumValues, - // // ]); - // } - - function allowsMatch($regex): bool { + function canMatch($regex): bool { if ($this->admin) { return true; } $scopes = []; - foreach ($this->scopeArray as $key => $value) { + foreach ($this->getScopeArray() as $key => $value) { if ($value > 0 && preg_match($regex, $key)) { $scopes[] = $key; } diff --git a/src/Request.php b/src/Request.php index 5936306f..b9f1c2bc 100644 --- a/src/Request.php +++ b/src/Request.php @@ -2,9 +2,15 @@ namespace markhuot\CraftQL; +use markhuot\CraftQL\Models\Token; + class Request { + /** + * @var Token + */ private $token; + private $entryTypes; private $volumes; private $categoryGroups; @@ -104,13 +110,26 @@ function entries($criteria, $root, $args, $context, $info) { unset($args['section']); } + /* Only allow users to view their own entires if explicitly defined in $args['type'] */ if (empty($args['type'])) { - $args['typeId'] = array_map(function ($value) { - return $value->value; - }, $this->entryTypes()->enum()->getValues()); + $args['typeId'] = []; + foreach ($this->entryTypes()->enum()->getValues() as $value) { + $typeId = $value->value; + if ($this->token->can('query:otheruserentries') || $this->token->can("query:entrytype:{$typeId}:all")) { + $args['typeId'][] = $typeId; + } + } } else { - $args['typeId'] = $args['type']; + $args['typeId'] = []; + foreach ($args['type'] as $typeId) { + if ($this->token->can('query:otheruserentries') || $this->token->can("query:entrytype:{$typeId}:all")) { + $args['typeId'][] = $typeId; + } elseif ($this->token->can("query:entrytype:{$typeId}")) { + $args['authorId'] = $this->token->user->id; + $args['typeId'][] = $typeId; + } + } unset($args['type']); } @@ -130,9 +149,6 @@ function entries($criteria, $root, $args, $context, $info) { unset($args['idNot']); } - // var_dump($args); - // die; - foreach ($args as $key => $value) { $criteria = $criteria->{$key}($value); } diff --git a/src/Services/GraphQLService.php b/src/Services/GraphQLService.php index 17b98d99..6a742693 100644 --- a/src/Services/GraphQLService.php +++ b/src/Services/GraphQLService.php @@ -4,7 +4,8 @@ use Craft; use GraphQL\GraphQL; -use GraphQL\Error\Debug; +use GraphQL\Error\DebugFlag; +use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Schema; use GraphQL\Validator\DocumentValidator; use GraphQL\Validator\Rules\QueryComplexity; @@ -115,8 +116,11 @@ function getSchema($token) { \markhuot\CraftQL\Directives\Date::directive(), ]); + /** @var ObjectType $mutation */ $mutation = (new \markhuot\CraftQL\Types\Mutation($request))->getRawGraphQLObject(); - $schemaConfig['mutation'] = $mutation; + if (!empty($mutation->getFields())) { + $schemaConfig['mutation'] = $mutation; + } $schema = new Schema($schemaConfig); @@ -128,7 +132,7 @@ function getSchema($token) { } function execute($schema, $input, $variables = []) { - $debug = Craft::$app->config->getGeneral()->devMode ? Debug::INCLUDE_DEBUG_MESSAGE | Debug::RETHROW_INTERNAL_EXCEPTIONS : null; + $debug = Craft::$app->config->getGeneral()->devMode ? DebugFlag::INCLUDE_DEBUG_MESSAGE | DebugFlag::RETHROW_INTERNAL_EXCEPTIONS : 0; return GraphQL::executeQuery($schema, $input, null, null, $variables)->toArray($debug); } diff --git a/src/Services/JWTService.php b/src/Services/JWTService.php new file mode 100644 index 00000000..6c5ae57f --- /dev/null +++ b/src/Services/JWTService.php @@ -0,0 +1,98 @@ +getSettings()->securityKey) { + $this->key = CraftQL::getInstance()->getSettings()->securityKey; + } + else { + $this->key = Craft::$app->config->general->securityKey; + } + } + + function encode($string) { + return JWT::encode($string, $this->key); + } + + /** + * @param $string + * @return object + * + * @throws \UnexpectedValueException Provided JWT was invalid + * @throws \Firebase\JWT\SignatureInvalidException Provided JWT was invalid because the signature verification failed + * @throws \Firebase\JWT\BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf' + * @throws \Firebase\JWT\BeforeValidException Provided JWT is trying to be used before it's been created as defined by 'iat' + * @throws \Firebase\JWT\ExpiredException Provided JWT has since expired, as defined by the 'exp' claim + */ + function decode($string) { + return JWT::decode($string, $this->key, ['HS256']); + } + + /** + * @param $token + * @return object + * + * @throws \UnexpectedValueException Provided JWT was invalid + * @throws \Firebase\JWT\SignatureInvalidException Provided JWT was invalid because the signature verification failed + * @throws \Firebase\JWT\BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf' + * @throws \Firebase\JWT\BeforeValidException Provided JWT is trying to be used before it's been created as defined by 'iat' + * @throws \Firebase\JWT\ExpiredException Provided JWT has since expired, as defined by the 'exp' claim + */ + function refreshDecode($token) { + try { + $tokenData = $this->decode($token); + } catch(\Firebase\JWT\ExpiredException $e) { + + list($header, $payload, $signature) = explode(".", $token); + $tokenData = JWT::jsonDecode(JWT::urlsafeB64Decode($payload)); + + if (!isset($tokenData->refresh_token)) { + throw $e; + } + + $refreshToken = $tokenData->refresh_token; + $user = \craft\elements\User::find()->id($tokenData->id)->one(); + if ($refreshToken != $this->refreshToken($user)) { + throw $e; + } + } + + return $tokenData; + } + + function tokenForUser(User $user) { + $defaultTokenDuration = CraftQL::getInstance()->getSettings()->userTokenDuration; + + $tokenData = [ + 'id' => $user->id, + 'refresh_token' => $this->refreshToken($user) + ]; + + if ($defaultTokenDuration > 0) { + $tokenData['exp'] = time() + $defaultTokenDuration; + } + + return $this->encode($tokenData); + } + + function refreshToken(User $user) { + $lastLogin = ($lastLogin = $user->lastLoginDate) ? $lastLogin->format(DATE_ATOM) : ''; + $passwordChanged = ($passwordChanged = $user->lastPasswordChangeDate) ? $passwordChanged->format(DATE_ATOM) : ''; + return hash('sha256', "$lastLogin:$passwordChanged"); + } + +} diff --git a/src/Types/Authorize.php b/src/Types/Authorize.php new file mode 100644 index 00000000..4c943154 --- /dev/null +++ b/src/Types/Authorize.php @@ -0,0 +1,16 @@ +addField('user')->type(User::class); + $this->addStringField('token'); + } + +} \ No newline at end of file diff --git a/src/Types/Mutation.php b/src/Types/Mutation.php index 2de4571b..e33f2eda 100644 --- a/src/Types/Mutation.php +++ b/src/Types/Mutation.php @@ -3,6 +3,7 @@ namespace markhuot\CraftQL\Types; use craft\base\Element; +use craft\elements\Asset; use GraphQL\Error\UserError; use Craft; use markhuot\CraftQL\Builders\Schema; @@ -12,9 +13,12 @@ class Mutation extends Schema { function boot() { - $this->addField('helloWorld') - ->description('A sample mutation. Doesn\'t actually save anything.') - ->resolve('If this were a real mutation it would have saved to the database.'); + if ($this->request->entryTypes()->all('mutate') || + ($this->getRequest()->token()->can('mutate:globals') && $this->request->globals()->count())) { + $this->addField('helloWorld') + ->description('A sample mutation. Doesn\'t actually save anything.') + ->resolve('If this were a real mutation it would have saved to the database.'); + } foreach ($this->request->entryTypes()->all('mutate') as $entryType) { $this->addField('upsert'.$entryType->getName()) @@ -47,106 +51,177 @@ function boot() { } } - if ($this->request->token()->can('mutate:users')) { + if ($this->request->token()->canMatch('/^mutate:users/')) { $updateUser = $this->addField('upsertUser') - ->type(User::class) - ->resolve(function ($root, $args, $context, $info) { - $values = $args; + ->type(User::class); - if (!empty($args['id'])) { - $userId = @$args['id']; - unset($values['id']); + $updateUser->addIntArgument('id'); + $updateUser->addStringArgument('firstName'); + $updateUser->addStringArgument('lastName'); + $updateUser->addStringArgument('username'); + $updateUser->addStringArgument('email'); + $updateUser->addStringArgument('password'); + $updateUser->addStringArgument('photo'); - $user = \craft\elements\User::find()->id($userId)->anyStatus()->one(); - if (!$user) { - throw new UserError('Could not find user '.$userId); - } + if ($this->request->token()->can('mutate:users:permissions')) { + $updateUser->addStringArgument('permissions')->lists(); + } + + $fieldLayout = Craft::$app->getFields()->getLayoutByType(\craft\elements\User::class); + $updateUser->addArgumentsByLayoutId($fieldLayout->id); + + $updateUser->resolve(function ($root, $args, $context, $info) use ($updateUser) { + + $values = $args; + $token = $this->request->token(); + $new = empty($args['id']); + + if (!$new) { + $userId = @$args['id']; + unset($values['id']); + + if($token->canNot('mutate:users:all') && $token->canNot('mutate:users:self')) { + throw new UserError('unauthorized'); } - else { - $user = new \craft\elements\User; + + $user = \craft\elements\User::find()->id($userId)->anyStatus()->one(); + if (!$user) { + throw new UserError('Could not find user '.$userId); } - foreach (['firstName', 'lastName', 'username', 'email'] as $fieldName) { - if (isset($values[$fieldName])) { - $user->{$fieldName} = $values[$fieldName]; - unset($values[$fieldName]); - } + if($token->canNot('mutate:users:all') && $user->id != $token->getUser()->id) { + throw new UserError('unauthorized'); + } + } + else { + $user = new \craft\elements\User; + } + + foreach (['firstName', 'lastName', 'username', 'email'] as $fieldName) { + if (isset($values[$fieldName])) { + $user->{$fieldName} = $values[$fieldName]; + unset($values[$fieldName]); + } + } + + if(isset($values['password'])) { + $user->newPassword = $values['password']; + unset($values['password']); + } + + $permissions = []; + if (!empty($values['permissions'])) { + $permissions = $values['permissions']; + unset($values['permissions']); + } + + if(array_key_exists('photo', $values) && $values['photo'] === null) { + if(isset($user->photoId)) { + Craft::$app->users->deleteUserPhoto($user); } + unset($values['photo']); + } - $permissions = []; - if (!empty($values['permissions'])) { - $permissions = $values['permissions']; - unset($values['permissions']); + if(!empty($values['photo'])) { + $data = $values['photo']; + + if (preg_match('/^data:image\/(\w+);base64,/', $data, $type)) { + $data = substr($data, strpos($data, ',') + 1); + $type = strtolower($type[1]); // jpg, png, gif + + if (!in_array($type, [ 'jpg', 'jpeg', 'gif', 'png' ])) { + throw new \Exception('invalid image type'); + } + + $photo = base64_decode($data); + + if ($photo === false) { + throw new \Exception('base64_decode failed'); + } + } else { + throw new \Exception('did not match data URI with image data'); } - if (!empty($values)) { - $user->setFieldValues($values); + $uploadPath = \craft\helpers\Assets::tempFilePath($type); + file_put_contents($uploadPath, $photo); + + $uuid = craft\helpers\StringHelper::UUID(); + + $filename = "user_{$uuid}_photo.{$type}"; + + Craft::$app->users->saveUserPhoto($uploadPath, $user, $filename); + + unset($values['photo']); + } + + foreach ($values as $handle => &$value) { + $callback = $updateUser->getArgument($handle)->getOnSave(); + if ($callback) { + $value = $callback($value); } + } + + if (!empty($values)) { + $user->setFieldValues($values); + } - $user->setScenario(Element::SCENARIO_LIVE); + $user->setScenario(Element::SCENARIO_LIVE); - if (!Craft::$app->elements->saveElement($user)) { - if (!empty($user->getErrors())) { - foreach ($user->getErrors() as $key => $errors) { - foreach ($errors as $error) { - throw new UserError($error); - } + if (!Craft::$app->elements->saveElement($user)) { + if (!empty($user->getErrors())) { + foreach ($user->getErrors() as $key => $errors) { + foreach ($errors as $error) { + throw new UserError($error); } } } + } - if (!empty($permissions)) { - Craft::$app->getUserPermissions()->saveUserPermissions($user->id, $permissions); - } + if($new) { + Craft::$app->users->assignUserToDefaultGroup($user); + } - return $user; - }); + if (!empty($permissions)) { + Craft::$app->getUserPermissions()->saveUserPermissions($user->id, $permissions); + } - $updateUser->addIntArgument('id'); - $updateUser->addStringArgument('firstName'); - $updateUser->addStringArgument('lastName'); - $updateUser->addStringArgument('username'); - $updateUser->addStringArgument('email'); + return $user; + }); + } - if ($this->request->token()->can('mutate:userPermissions')) { - $updateUser->addStringArgument('permissions')->lists(); - } + if ($this->request->token()->canMatch('/^mutate:users/')) { + $deleteUser = $this->addField('deleteUser') + ->type(User::class); - $fieldLayout = Craft::$app->getFields()->getLayoutByType(\craft\elements\User::class); - $updateUser->addArgumentsByLayoutId($fieldLayout->id); - } + $deleteUser->addIntArgument('id')->nonNull(); + + $deleteUser->resolve(function ($root, $args, $context, $info) use ($deleteUser) { + + $token = $this->request->token(); + $userId = $args['id']; - // $fields['upsertField'] = [ - // 'type' => \markhuot\CraftQL\Types\Entry::interface($request), - // 'args' => [ - // 'id' => Type::nonNull(Type::int()), - // 'json' => Type::nonNull(Type::string()), - // ], - // 'resolve' => function ($root, $args) { - // $entry = \craft\elements\Entry::find(); - // $entry->id($args['id']); - // $entry = $entry->one(); - - // $json = json_decode($args['json'], true); - // $fieldData = []; - // foreach ($json as $fieldName => $value) { - // if (in_array($fieldName, ['title'])) { - // $entry->{$fieldName} = $value; - // } - // else { - // $fieldData[$fieldName] = $value; - // } - // } - - // if (!empty($fieldData)) { - // $entry->setFieldValues($fieldData); - // } - - // Craft::$app->elements->saveElement($entry); - - // return $entry; - // }, - // ]; + if($token->canNot('mutate:users:all') && $token->canNot('mutate:users:self')) { + throw new UserError('unauthorized'); + } + + $user = \craft\elements\User::find()->id($userId)->anyStatus()->one(); + if (!$user) { + throw new UserError('Could not find user '.$userId); + } + + if($token->canNot('mutate:users:all') && $user->id != $token->getUser()->id) { + throw new UserError('unauthorized'); + } + + $user->setScenario(Element::SCENARIO_LIVE); + + if (!Craft::$app->elements->deleteElement($user)) { + throw new UserError('delete.failed'); + } + + return $user; + }); + } } } diff --git a/src/Types/PasswordReset.php b/src/Types/PasswordReset.php new file mode 100644 index 00000000..23ca7d50 --- /dev/null +++ b/src/Types/PasswordReset.php @@ -0,0 +1,13 @@ +addBooleanField('success')->nonNull(); + } + +} diff --git a/src/Types/Query.php b/src/Types/Query.php index bdb41b3c..fd9064d2 100644 --- a/src/Types/Query.php +++ b/src/Types/Query.php @@ -2,8 +2,10 @@ namespace markhuot\CraftQL\Types; -use markhuot\CraftQL\FieldBehaviors\AssetQueryArguments; use Craft; +use GraphQL\Error\UserError; +use markhuot\CraftQL\CraftQL; +use markhuot\CraftQL\FieldBehaviors\AssetQueryArguments; use markhuot\CraftQL\Builders\Schema; use markhuot\CraftQL\FieldBehaviors\EntryQueryArguments; use markhuot\CraftQL\FieldBehaviors\UserQueryArguments; @@ -22,11 +24,15 @@ function boot() { $this->addStringField('ping') ->resolve('pong'); + // @TODO add plugin setting to control authorize visibility + $this->addAuthSchema(); + $this->addPasswordResetSchema(); + if ($token->can('query:sites')) { $this->addSitesSchema(); } - if ($token->can('query:entries') && $token->allowsMatch('/^query:entryType/')) { + if ($token->canMatch('/^query:entrytype/')) { $this->addEntriesSchema(); } @@ -327,6 +333,70 @@ function addCategoriesSchema() { }); } + function addAuthSchema() { + $defaultTokenDuration = CraftQL::getInstance()->getSettings()->userTokenDuration; + + $field = $this->addField('authorize'); + $field->type(Authorize::class); + $field->addStringArgument('username')->nonNull(); + $field->addStringArgument('password')->nonNull(); + $field->resolve(function ($root, $args) use ($defaultTokenDuration) { + $loginName = $args['username']; + $password = $args['password']; + + // Does a user exist with that username/email? + $user = Craft::$app->getUsers()->getUserByUsernameOrEmail($loginName); + + if (!$user || $user->password === null) { + // Delay to match $user->authenticate()'s delay + Craft::$app->getSecurity()->validatePassword('p@ss1w0rd', '$2y$13$nj9aiBeb7RfEfYP3Cum6Revyu14QelGGxwcnFUKXIrQUitSodEPRi'); + throw new UserError('invalid_credentials'); + } + + // Did they submit a valid password, and is the user capable of being logged-in? + if (!$user->authenticate($password)) { + throw new UserError($user->authError); + } + + if (!Craft::$app->getUser()->login($user, 0)) { + throw new UserError('An unknown error occurred'); + } + + $tokenString = CraftQL::getInstance()->jwt->tokenForUser($user); + + return [ + 'user' => $user, + 'token' => $tokenString, + ]; + }); + } + + function addPasswordResetSchema() { + + $resetPassword = $this->addField('resetPassword') + ->type(PasswordReset::class); + + $resetPassword->addStringArgument('email'); + + $resetPassword->resolve(function ($root, $args) { + $email = $args['email']; + + $user = Craft::$app->getUsers()->getUserByUsernameOrEmail($email); + + if (!$user) { + throw new UserError('user_not_found'); + } + + if(!Craft::$app->getUsers()->sendPasswordResetEmail($user)) { + throw new UserError('An unknown error occurred'); + } + + return [ + 'success' => true + ]; + }); + } + function addUsersSchema() { $userResolver = function ($root, $args) { $criteria = \craft\elements\User::find(); diff --git a/src/Types/User.php b/src/Types/User.php index d77ad8ab..bb5a588b 100644 --- a/src/Types/User.php +++ b/src/Types/User.php @@ -20,6 +20,11 @@ function boot() { $this->addBooleanField('admin')->nonNull(); $this->addBooleanField('isCurrent')->nonNull(); $this->addStringField('preferredLocale'); + $this->addStringField('token') + ->description('The active JWT token for the user. Only avalible for new users.') + ->resolve(function($root, $args, $context, $info) { + return $root->token ?? null; + }); // $this->addField('status')->type(UsersField::statusEnum())->nonNull(); $volumeId = Craft::$app->getSystemSettings()->getSetting('users', 'photoVolumeId'); diff --git a/src/events.php b/src/events.php index a571c010..b7deb28d 100644 --- a/src/events.php +++ b/src/events.php @@ -96,4 +96,9 @@ new \markhuot\CraftQL\Listeners\GetDefaultFieldSchema, ], ], + \craft\services\UserPermissions::class => [ + \craft\services\UserPermissions::EVENT_REGISTER_PERMISSIONS => [ + new \markhuot\CraftQL\Listeners\GetUserPermissions, + ] + ] ]; \ No newline at end of file diff --git a/src/templates/scopes.html b/src/templates/scopes.html index 38ac38db..e8b8ca32 100644 --- a/src/templates/scopes.html +++ b/src/templates/scopes.html @@ -122,7 +122,8 @@

Queries

Type Section Entry Type - + Self + All @@ -132,7 +133,8 @@

Queries

{{ section.type|ucfirst }} {{ section.name }} {{ entryType.name }} - {{ forms.lightswitch({"name": "scope[query:entryType:" ~ entryType.id ~ "]", "value": 1, "on": token.can("query:entryType:" ~ entryType.id), "small": true}) }} + {{ forms.lightswitch({"name": "scope[query:entrytype:" ~ entryType.id ~ "]", "value": 1, "on": token.can("query:entrytype:" ~ entryType.id), "small": true}) }} + {{ forms.lightswitch({"name": "scope[query:entrytype:" ~ entryType.id ~ ":all]", "value": 1, "on": token.can("query:entrytype:" ~ entryType.id ~":all"), "small": true}) }} {% endfor %} {% endfor %} @@ -158,12 +160,12 @@

Mutation Fields

users Add and update users - {{ forms.lightswitch({"name": "scope[mutate:users]", "value": 1, "on": token.can("mutate:users"), "small": true}) }} + {{ forms.lightswitch({"name": "scope[mutate:users:all]", "value": 1, "on": token.can("mutate:users:all"), "small": true}) }} user.permissions Set user permissions - {{ forms.lightswitch({"name": "scope[mutate:userPermissions]", "value": 1, "on": token.can("mutate:users"), "small": true}) }} + {{ forms.lightswitch({"name": "scope[mutate:users:permissions]", "value": 1, "on": token.can("mutate:users:permissions"), "small": true}) }} globals @@ -196,7 +198,7 @@

Mutations

{{ section.type|ucfirst }} {{ section.name }} {{ entryType.name }} - {{ forms.lightswitch({"name": "scope[mutate:entryType:" ~ entryType.id ~ "]", "value": 1, "on": token.can("mutate:entryType:" ~ entryType.id), "small": true}) }} + {{ forms.lightswitch({"name": "scope[mutate:entrytype:" ~ entryType.id ~ "]", "value": 1, "on": token.can("mutate:entrytype:" ~ entryType.id), "small": true}) }} {% endfor %} {% endfor %} diff --git a/src/templates/settings.html b/src/templates/settings.html index b05f9062..ec1a5e35 100644 --- a/src/templates/settings.html +++ b/src/templates/settings.html @@ -96,7 +96,7 @@

Tokens

{{ token.token }} - Settings… + Scopes… {% endfor %}