From caea23fb65a1f1724ad8afec9269e3b4707b366c Mon Sep 17 00:00:00 2001 From: Seth Battis Date: Thu, 14 Mar 2024 11:37:23 -0400 Subject: [PATCH] prepare release --- .github/workflows/split.yml | 6 + packages/appengine-client/.gitignore | 3 + .../appengine-client/.php-cs-fixer.dist.php | 11 + .../appengine-client/.pre-commit-config.yaml | 22 + packages/appengine-client/composer.json | 21 + packages/appengine-client/composer.lock | 4289 +++++++++++++++++ packages/appengine-client/phive.xml | 7 + packages/appengine-client/psalm.xml | 9 + .../appengine-client/src/ClientFactory.php | 51 + .../appengine-client/src/TokenStorage.php | 41 + packages/oauth2-example/.gitignore | 2 + packages/oauth2-example/composer.json | 14 + packages/oauth2-example/composer.lock | 814 ++++ packages/oauth2-example/public/index.html | 37 + packages/oauth2-example/public/refresh.php | 56 + packages/oauth2-example/public/token.php | 92 + packages/oauth2/.gitattributes | 1 + packages/oauth2/.github/workflows/todo.yml | 12 + packages/oauth2/.gitignore | 6 + packages/oauth2/.nova/Artwork | Bin 0 -> 19248 bytes packages/oauth2/.nova/Configuration.json | 5 + packages/oauth2/.nova/Tasks/docs.json | 9 + packages/oauth2/LICENSE.md | 21 + packages/oauth2/README.md | 169 + packages/oauth2/composer.json | 26 + packages/oauth2/composer.lock | 817 ++++ packages/oauth2/phive.xml | 6 + packages/oauth2/phpdoc.dist.xml | 19 + packages/oauth2/psalm.xml | 7 + packages/oauth2/src/BlackbaudSKY.php | 129 + packages/oauth2/src/SkyAPIEndpoint.php | 89 + 31 files changed, 6791 insertions(+) create mode 100644 packages/appengine-client/.gitignore create mode 100644 packages/appengine-client/.php-cs-fixer.dist.php create mode 100644 packages/appengine-client/.pre-commit-config.yaml create mode 100644 packages/appengine-client/composer.json create mode 100644 packages/appengine-client/composer.lock create mode 100644 packages/appengine-client/phive.xml create mode 100644 packages/appengine-client/psalm.xml create mode 100644 packages/appengine-client/src/ClientFactory.php create mode 100644 packages/appengine-client/src/TokenStorage.php create mode 100755 packages/oauth2-example/.gitignore create mode 100755 packages/oauth2-example/composer.json create mode 100755 packages/oauth2-example/composer.lock create mode 100755 packages/oauth2-example/public/index.html create mode 100755 packages/oauth2-example/public/refresh.php create mode 100755 packages/oauth2-example/public/token.php create mode 100644 packages/oauth2/.gitattributes create mode 100644 packages/oauth2/.github/workflows/todo.yml create mode 100644 packages/oauth2/.gitignore create mode 100644 packages/oauth2/.nova/Artwork create mode 100644 packages/oauth2/.nova/Configuration.json create mode 100644 packages/oauth2/.nova/Tasks/docs.json create mode 100644 packages/oauth2/LICENSE.md create mode 100644 packages/oauth2/README.md create mode 100644 packages/oauth2/composer.json create mode 100644 packages/oauth2/composer.lock create mode 100644 packages/oauth2/phive.xml create mode 100644 packages/oauth2/phpdoc.dist.xml create mode 100644 packages/oauth2/psalm.xml create mode 100644 packages/oauth2/src/BlackbaudSKY.php create mode 100644 packages/oauth2/src/SkyAPIEndpoint.php diff --git a/.github/workflows/split.yml b/.github/workflows/split.yml index f3fef6d5..6f6605c2 100644 --- a/.github/workflows/split.yml +++ b/.github/workflows/split.yml @@ -15,6 +15,12 @@ jobs: fail-fast: false matrix: package: + - local_path: "appengine-client" + split_repository: "sky-api.appengine-client" + - local_path: "oauth2" + split_repository: "OAuth2-BlackbaudSKY" + - local_path: "oauth2-example" + split_repository: "OAuth2-BlackbaudSKY-example" - local_path: "oneroster" split_repository: "sky-api.oneroster" - local_path: "school" diff --git a/packages/appengine-client/.gitignore b/packages/appengine-client/.gitignore new file mode 100644 index 00000000..f708668c --- /dev/null +++ b/packages/appengine-client/.gitignore @@ -0,0 +1,3 @@ +*.cache +/tools/ +/vendor/ diff --git a/packages/appengine-client/.php-cs-fixer.dist.php b/packages/appengine-client/.php-cs-fixer.dist.php new file mode 100644 index 00000000..b27b9063 --- /dev/null +++ b/packages/appengine-client/.php-cs-fixer.dist.php @@ -0,0 +1,11 @@ +in(__DIR__); + +return (new PhpCsFixer\Config()) + ->setRules([ + "@PER-CS" => true, + "@PHP82Migration" => true, + "octal_notation" => false, + ]) + ->setFinder($finder); diff --git a/packages/appengine-client/.pre-commit-config.yaml b/packages/appengine-client/.pre-commit-config.yaml new file mode 100644 index 00000000..338ac470 --- /dev/null +++ b/packages/appengine-client/.pre-commit-config.yaml @@ -0,0 +1,22 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: check-yaml + - id: check-json + - id: check-xml + - id: check-executables-have-shebangs + - id: check-shebang-scripts-are-executable + - repo: https://github.com/markdownlint/markdownlint + rev: v0.12.0 + hooks: + - id: markdownlint + - repo: https://github.com/digitalpulp/pre-commit-php.git + rev: 1.4.0 + hooks: + - id: php-lint-all + - id: php-cs-fixer + - repo: https://github.com/matchory/pre-commit-psalm + rev: v1.0.0 + hooks: + - id: psalm diff --git a/packages/appengine-client/composer.json b/packages/appengine-client/composer.json new file mode 100644 index 00000000..4c9eddac --- /dev/null +++ b/packages/appengine-client/composer.json @@ -0,0 +1,21 @@ +{ + "name": "battis/sky-api-appengine", + "description": "Blackbaud SKY API PHP client native to Google App Engine", + "license": "GPL-3.0", + "minimum-stability": "dev", + "authors": [ + { + "name": "Seth Battis", + "email": "seth@battis.net" + } + ], + "require": { + "battis/lazy-secrets": "^1.1", + "groton-school/sky-api": "^0.1" + }, + "autoload": { + "psr-4": { + "GrotonSchool\\SKY\\AppEngine\\": "src" + } + } +} diff --git a/packages/appengine-client/composer.lock b/packages/appengine-client/composer.lock new file mode 100644 index 00000000..7651715c --- /dev/null +++ b/packages/appengine-client/composer.lock @@ -0,0 +1,4289 @@ +{ + "_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#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "8d0de2269aee460d17ee2c337cf66501", + "packages": [ + { + "name": "battis/data-utilities", + "version": "v1.2.6", + "source": { + "type": "git", + "url": "https://github.com/battis/data-utilities.git", + "reference": "9bf8dc8385a8563b2a7a6534eedd3c359acb90de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/battis/data-utilities/zipball/9bf8dc8385a8563b2a7a6534eedd3c359acb90de", + "reference": "9bf8dc8385a8563b2a7a6534eedd3c359acb90de", + "shasum": "" + }, + "require": { + "battis/hydratable": "^0.1" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Battis\\DataUtilities\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Seth Battis", + "email": "sethbattis@stmarksschool.org" + } + ], + "description": "A handful of useful helper functions to process data", + "support": { + "issues": "https://github.com/battis/data-utilities/issues", + "source": "https://github.com/battis/data-utilities/tree/v1.2.6" + }, + "time": "2024-02-18T20:14:24+00:00" + }, + { + "name": "battis/hydratable", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/battis/hydratable.git", + "reference": "a8ab2428b070dbe1f2143c7783898237727f3c79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/battis/hydratable/zipball/a8ab2428b070dbe1f2143c7783898237727f3c79", + "reference": "a8ab2428b070dbe1f2143c7783898237727f3c79", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Battis\\Hydratable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0" + ], + "authors": [ + { + "name": "Seth Battis", + "email": "seth@battis.net" + } + ], + "description": "Hydrate serialized objects with defaults and overrides", + "support": { + "issues": "https://github.com/battis/hydratable/issues", + "source": "https://github.com/battis/hydratable/tree/v0.1.1" + }, + "time": "2023-07-04T21:21:58+00:00" + }, + { + "name": "battis/lazy-secrets", + "version": "v1.1", + "source": { + "type": "git", + "url": "https://github.com/battis/lazy-secrets.git", + "reference": "74e00f5eeb27c4af94bb18733b779035c94c8244" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/battis/lazy-secrets/zipball/74e00f5eeb27c4af94bb18733b779035c94c8244", + "reference": "74e00f5eeb27c4af94bb18733b779035c94c8244", + "shasum": "" + }, + "require": { + "google/cloud-secret-manager": "^1.9", + "psr/simple-cache": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Battis\\LazySecrets\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Seth Battis", + "email": "seth@battis.net" + } + ], + "description": "A (thin) wrapper for google/cloud-secret-manager to reduce boilerplate", + "support": { + "issues": "https://github.com/battis/lazy-secrets/issues", + "source": "https://github.com/battis/lazy-secrets/tree/v1.1" + }, + "time": "2024-03-05T19:23:50+00:00" + }, + { + "name": "battis/openapi-client-generator", + "version": "dev-main", + "dist": { + "type": "path", + "url": "../openapi-client-generator", + "reference": "dc6166032177974d74ea693c8cfb92d854c024fc" + }, + "require": { + "battis/data-utilities": "^1.2", + "battis/php-generator": "^0.1", + "cebe/php-openapi": "^1.7", + "friendsofphp/php-cs-fixer": "^3.49", + "league/html-to-markdown": "^5.1", + "league/oauth2-client": "^2.7", + "monolog/monolog": "^3.5", + "pahanini/monolog-cli-formatter": "^2.0", + "psr/log": "^3.0", + "psr/simple-cache": "^3.0", + "splitbrain/php-cli": "^1.3", + "sspat/reserved-words": "^3.0", + "symfony/filesystem": "^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Battis\\OpenAPI\\": "src" + } + }, + "license": [ + "GPL-3.0" + ], + "authors": [ + { + "name": "Seth Battis", + "email": "seth@battis.net" + } + ], + "description": "Generate a PHP client for a RESTful API from its OpenAPI description file", + "transport-options": { + "relative": true + } + }, + { + "name": "battis/php-generator", + "version": "v0.1", + "source": { + "type": "git", + "url": "https://github.com/battis/php-generator.git", + "reference": "9cb423ba5d6015dcdf0d5478ebacf6232459110e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/battis/php-generator/zipball/9cb423ba5d6015dcdf0d5478ebacf6232459110e", + "reference": "9cb423ba5d6015dcdf0d5478ebacf6232459110e", + "shasum": "" + }, + "require": { + "battis/data-utilities": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Battis\\PHPGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0" + ], + "authors": [ + { + "name": "Seth Battis", + "email": "seth@battis.net" + } + ], + "description": "Generate PHP code dynamically", + "support": { + "issues": "https://github.com/battis/php-generator/issues", + "source": "https://github.com/battis/php-generator/tree/v0.1" + }, + "time": "2024-03-10T13:44:57+00:00" + }, + { + "name": "brick/math", + "version": "0.11.0", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "5.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.11.0" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-01-15T23:15:59+00:00" + }, + { + "name": "cebe/php-openapi", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/cebe/php-openapi.git", + "reference": "020d72b8e3a9a60bc229953e93eda25c49f46f45" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cebe/php-openapi/zipball/020d72b8e3a9a60bc229953e93eda25c49f46f45", + "reference": "020d72b8e3a9a60bc229953e93eda25c49f46f45", + "shasum": "" + }, + "require": { + "ext-json": "*", + "justinrainbow/json-schema": "^5.2", + "php": ">=7.1.0", + "symfony/yaml": "^3.4 || ^4 || ^5 || ^6" + }, + "conflict": { + "symfony/yaml": "3.4.0 - 3.4.4 || 4.0.0 - 4.4.17 || 5.0.0 - 5.1.9 || 5.2.0" + }, + "require-dev": { + "apis-guru/openapi-directory": "1.0.0", + "cebe/indent": "*", + "mermade/openapi3-examples": "1.0.0", + "nexmo/api-specification": "1.0.0", + "oai/openapi-specification": "3.0.3", + "phpstan/phpstan": "^0.12.0", + "phpunit/phpunit": "^6.5 || ^7.5 || ^8.5 || ^9.4" + }, + "bin": [ + "bin/php-openapi" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "cebe\\openapi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "https://cebe.cc/", + "role": "Creator" + } + ], + "description": "Read and write OpenAPI yaml/json files and make the content accessable in PHP objects.", + "homepage": "https://github.com/cebe/php-openapi#readme", + "keywords": [ + "openapi" + ], + "support": { + "issues": "https://github.com/cebe/php-openapi/issues", + "source": "https://github.com/cebe/php-openapi" + }, + "time": "2022-04-20T14:46:44+00:00" + }, + { + "name": "composer/pcre", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "4775f35b2d70865807c89d32c8e7385b86eb0ace" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/4775f35b2d70865807c89d32c8e7385b86eb0ace", + "reference": "4775f35b2d70865807c89d32c8e7385b86eb0ace", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.1.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": "2024-03-07T15:38:35+00:00" + }, + { + "name": "composer/semver", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "1d09200268e7d1052ded8e5da9c73c96a63d18f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/1d09200268e7d1052ded8e5da9c73c96a63d18f5", + "reference": "1d09200268e7d1052ded8e5da9c73c96a63d18f5", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "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": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/main" + }, + "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": "2023-08-31T12:20:31+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "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": "2022-02-25T21:32:43+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v6.10.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "a49db6f0a5033aef5143295342f1c95521b075ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff", + "reference": "a49db6f0a5033aef5143295342f1c95521b075ff", + "shasum": "" + }, + "require": { + "php": "^7.4||^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^6.5||^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^1.0||^2.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "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/v6.10.0" + }, + "time": "2023-12-01T16:26:39+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.51.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "127fa74f010da99053e3f5b62672615b72dd6efd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/127fa74f010da99053e3f5b62672615b72dd6efd", + "reference": "127fa74f010da99053e3f5b62672615b72dd6efd", + "shasum": "" + }, + "require": { + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3 || ^2.0", + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.11", + "php-coveralls/php-coveralls": "^2.7", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", + "phpunit/phpunit": "^9.6 || ^10.5.5 || ^11.0.2", + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.51.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2024-02-28T19:50:06+00:00" + }, + { + "name": "google/auth", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-auth-library-php.git", + "reference": "5f16f67375b6f202b857183d7ef4e076acd7d4aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/5f16f67375b6f202b857183d7ef4e076acd7d4aa", + "reference": "5f16f67375b6f202b857183d7ef4e076acd7d4aa", + "shasum": "" + }, + "require": { + "firebase/php-jwt": "^6.0", + "guzzlehttp/guzzle": "^6.5.8||^7.4.5", + "guzzlehttp/psr7": "^2.4.5", + "php": "^7.4||^8.0", + "psr/cache": "^1.0||^2.0||^3.0", + "psr/http-message": "^1.1||^2.0" + }, + "require-dev": { + "guzzlehttp/promises": "^2.0", + "kelvinmo/simplejwt": "0.7.1", + "phpseclib/phpseclib": "^3.0", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.0.0", + "sebastian/comparator": ">=1.2.3", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Auth\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google Auth Library for PHP", + "homepage": "http://github.com/google/google-auth-library-php", + "keywords": [ + "Authentication", + "google", + "oauth2" + ], + "support": { + "docs": "https://googleapis.github.io/google-auth-library-php/main/", + "issues": "https://github.com/googleapis/google-auth-library-php/issues", + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.37.0" + }, + "time": "2024-02-21T17:03:52+00:00" + }, + { + "name": "google/cloud-secret-manager", + "version": "v1.13.2", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-cloud-php-secret-manager.git", + "reference": "aa84959f29b22e4edb481502fb945cd56a66ef02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-secret-manager/zipball/aa84959f29b22e4edb481502fb945cd56a66ef02", + "reference": "aa84959f29b22e4edb481502fb945cd56a66ef02", + "shasum": "" + }, + "require": { + "google/gax": "^1.30", + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "suggest": { + "ext-grpc": "Enables use of gRPC, a universal high-performance RPC framework created by Google.", + "ext-protobuf": "Provides a significant increase in throughput over the pure PHP protobuf implementation. See https://cloud.google.com/php/grpc for installation instructions." + }, + "type": "library", + "extra": { + "component": { + "id": "cloud-secret-manager", + "path": "SecretManager", + "entry": null, + "target": "googleapis/google-cloud-php-secret-manager.git" + } + }, + "autoload": { + "psr-4": { + "Google\\Cloud\\SecretManager\\": "src", + "GPBMetadata\\Google\\Cloud\\Secrets\\": "metadata", + "GPBMetadata\\Google\\Cloud\\Secretmanager\\": "metadata" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Secret Manager Client for PHP", + "support": { + "source": "https://github.com/googleapis/google-cloud-php-secret-manager/tree/v1.13.2" + }, + "time": "2024-03-01T11:25:35+00:00" + }, + { + "name": "google/common-protos", + "version": "v4.5.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/common-protos-php.git", + "reference": "dfc232e90823cedca107b56e7371f2e2f35b9427" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/common-protos-php/zipball/dfc232e90823cedca107b56e7371f2e2f35b9427", + "reference": "dfc232e90823cedca107b56e7371f2e2f35b9427", + "shasum": "" + }, + "require": { + "google/protobuf": "^3.6.1", + "php": ">=7.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Api\\": "src/Api", + "Google\\Iam\\": "src/Iam", + "Google\\Rpc\\": "src/Rpc", + "Google\\Type\\": "src/Type", + "Google\\Cloud\\": "src/Cloud", + "GPBMetadata\\Google\\Api\\": "metadata/Api", + "GPBMetadata\\Google\\Iam\\": "metadata/Iam", + "GPBMetadata\\Google\\Rpc\\": "metadata/Rpc", + "GPBMetadata\\Google\\Type\\": "metadata/Type", + "GPBMetadata\\Google\\Cloud\\": "metadata/Cloud", + "GPBMetadata\\Google\\Logging\\": "metadata/Logging" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google API Common Protos for PHP", + "homepage": "https://github.com/googleapis/common-protos-php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/common-protos-php/issues", + "source": "https://github.com/googleapis/common-protos-php/tree/v4.5.0" + }, + "time": "2023-11-29T21:08:16+00:00" + }, + { + "name": "google/gax", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/gax-php.git", + "reference": "25fb6fe93f8a871d7c626dc4599a481d9ebb6b02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/gax-php/zipball/25fb6fe93f8a871d7c626dc4599a481d9ebb6b02", + "reference": "25fb6fe93f8a871d7c626dc4599a481d9ebb6b02", + "shasum": "" + }, + "require": { + "google/auth": "^1.34.0", + "google/common-protos": "^4.4", + "google/grpc-gcp": "^0.3", + "google/longrunning": "~0.2", + "google/protobuf": "^3.22", + "grpc/grpc": "^1.13", + "guzzlehttp/promises": "^2.0", + "guzzlehttp/psr7": "^2.0", + "php": "^8.0", + "ramsey/uuid": "^4.0" + }, + "conflict": { + "ext-protobuf": "<3.7.0" + }, + "require-dev": { + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\ApiCore\\": "src", + "GPBMetadata\\ApiCore\\": "metadata/ApiCore" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Google API Core for PHP", + "homepage": "https://github.com/googleapis/gax-php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/gax-php/issues", + "source": "https://github.com/googleapis/gax-php/tree/v1.30.0" + }, + "time": "2024-02-28T20:33:41+00:00" + }, + { + "name": "google/grpc-gcp", + "version": "v0.3.0", + "source": { + "type": "git", + "url": "https://github.com/GoogleCloudPlatform/grpc-gcp-php.git", + "reference": "4d8b455a45a89f57e1552cadc41a43bc34c40456" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GoogleCloudPlatform/grpc-gcp-php/zipball/4d8b455a45a89f57e1552cadc41a43bc34c40456", + "reference": "4d8b455a45a89f57e1552cadc41a43bc34c40456", + "shasum": "" + }, + "require": { + "google/auth": "^1.3", + "google/protobuf": "^v3.3.0", + "grpc/grpc": "^v1.13.0", + "php": "^7.4||^8.0", + "psr/cache": "^1.0.1||^2.0.0||^3.0.0" + }, + "require-dev": { + "google/cloud-spanner": "^1.7", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Grpc\\Gcp\\": "src/" + }, + "classmap": [ + "src/generated/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC GCP library for channel management", + "support": { + "issues": "https://github.com/GoogleCloudPlatform/grpc-gcp-php/issues", + "source": "https://github.com/GoogleCloudPlatform/grpc-gcp-php/tree/v0.3.0" + }, + "time": "2023-04-24T14:37:29+00:00" + }, + { + "name": "google/longrunning", + "version": "0.3.1", + "source": { + "type": "git", + "url": "https://github.com/googleapis/php-longrunning.git", + "reference": "a974fe870d5f57cc21da697923a1f4e8d08829c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/php-longrunning/zipball/a974fe870d5f57cc21da697923a1f4e8d08829c9", + "reference": "a974fe870d5f57cc21da697923a1f4e8d08829c9", + "shasum": "" + }, + "require-dev": { + "google/gax": "^1.30", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "component": { + "id": "longrunning", + "path": "LongRunning", + "entry": null, + "target": "googleapis/php-longrunning" + } + }, + "autoload": { + "psr-4": { + "Google\\LongRunning\\": "src/LongRunning", + "Google\\ApiCore\\LongRunning\\": "src/ApiCore/LongRunning", + "GPBMetadata\\Google\\Longrunning\\": "metadata/Longrunning" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google LongRunning Client for PHP", + "support": { + "source": "https://github.com/googleapis/php-longrunning/tree/v0.3.1" + }, + "time": "2024-03-01T11:25:35+00:00" + }, + { + "name": "google/protobuf", + "version": "v3.25.3", + "source": { + "type": "git", + "url": "https://github.com/protocolbuffers/protobuf-php.git", + "reference": "983a87f4f8798a90ca3a25b0f300b8fda38df643" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/983a87f4f8798a90ca3a25b0f300b8fda38df643", + "reference": "983a87f4f8798a90ca3a25b0f300b8fda38df643", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": ">=5.0.0" + }, + "suggest": { + "ext-bcmath": "Need to support JSON deserialization" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Protobuf\\": "src/Google/Protobuf", + "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "proto library for PHP", + "homepage": "https://developers.google.com/protocol-buffers/", + "keywords": [ + "proto" + ], + "support": { + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.25.3" + }, + "time": "2024-02-15T21:11:49+00:00" + }, + { + "name": "groton-school/oauth2-blackbaudsky", + "version": "v0.2.5", + "source": { + "type": "git", + "url": "https://github.com/groton-school/OAuth2-BlackbaudSKY.git", + "reference": "1955ea4c9125b15ac205235b65ae88f1b0e508b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/groton-school/OAuth2-BlackbaudSKY/zipball/1955ea4c9125b15ac205235b65ae88f1b0e508b8", + "reference": "1955ea4c9125b15ac205235b65ae88f1b0e508b8", + "shasum": "" + }, + "require": { + "battis/data-utilities": "^1.2", + "ext-curl": "*", + "guzzlehttp/guzzle": "^7.4", + "league/oauth2-client": "^2.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrotonSchool\\OAuth2\\Client\\Provider\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Seth Battis", + "email": "sbattis@groton.org" + } + ], + "description": "This package provides Blackbaud SKY OAuth 2.0 support for the PHP League's OAuth 2.0 Client", + "support": { + "issues": "https://github.com/groton-school/OAuth2-BlackbaudSKY/issues", + "source": "https://github.com/groton-school/OAuth2-BlackbaudSKY/tree/v0.2.5" + }, + "time": "2024-02-12T14:32:41+00:00" + }, + { + "name": "groton-school/sky-api", + "version": "dev-main", + "dist": { + "type": "path", + "url": "../sky-api", + "reference": "c55fcd6bc99f5024d60f0355e75afe403a30a554" + }, + "require": { + "battis/openapi-client-generator": "dev-main", + "groton-school/oauth2-blackbaudsky": "^0.2.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrotonSchool\\Blackbaud\\": "src" + } + }, + "scripts": { + "build": [ + "./scripts/map -d var src/SKY 'Blackbaud\\SKY'" + ] + }, + "license": [ + "GPL-3.0" + ], + "authors": [ + { + "name": "Seth Battis", + "email": "sbattis@groton.org" + } + ], + "description": "PHP client for Blackbaud's SKY API", + "transport-options": { + "relative": true + } + }, + { + "name": "grpc/grpc", + "version": "1.57.0", + "source": { + "type": "git", + "url": "https://github.com/grpc/grpc-php.git", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grpc/grpc-php/zipball/b610c42022ed3a22f831439cb93802f2a4502fdf", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "google/auth": "^v1.3.0" + }, + "suggest": { + "ext-protobuf": "For better performance, install the protobuf C extension.", + "google/protobuf": "To get started using grpc quickly, install the native protobuf library." + }, + "type": "library", + "autoload": { + "psr-4": { + "Grpc\\": "src/lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC library for PHP", + "homepage": "https://grpc.io", + "keywords": [ + "rpc" + ], + "support": { + "source": "https://github.com/grpc/grpc-php/tree/v1.57.0" + }, + "time": "2023-08-14T23:57:54+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.x-dev", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "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.2", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "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.8.1" + }, + "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-12-03T20:35:24+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "default-branch": true, + "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.2" + }, + "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-12-03T20:19:20+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.x-dev", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "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.2", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "default-branch": true, + "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.2" + }, + "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-12-03T20:05:35+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", + "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/v5.2.13" + }, + "time": "2023-09-26T02:20:38+00:00" + }, + { + "name": "league/html-to-markdown", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/html-to-markdown.git", + "reference": "0542c8fb844105612ac189ade1c242b92d0d50be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/0542c8fb844105612ac189ade1c242b92d0d50be", + "reference": "0542c8fb844105612ac189ade1c242b92d0d50be", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xml": "*", + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "mikehaertl/php-shellcommand": "^1.1.0", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^8.5 || ^9.2", + "scrutinizer/ocular": "^1.6", + "unleashedtech/php-coding-standard": "^2.7 || ^3.0", + "vimeo/psalm": "^4.22 || ^5.0" + }, + "default-branch": true, + "bin": [ + "bin/html-to-markdown" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\HTMLToMarkdown\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + }, + { + "name": "Nick Cernis", + "email": "nick@cern.is", + "homepage": "http://modernnerd.net", + "role": "Original Author" + } + ], + "description": "An HTML-to-markdown conversion helper for PHP", + "homepage": "https://github.com/thephpleague/html-to-markdown", + "keywords": [ + "html", + "markdown" + ], + "support": { + "issues": "https://github.com/thephpleague/html-to-markdown/issues", + "source": "https://github.com/thephpleague/html-to-markdown/tree/master" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/html-to-markdown", + "type": "tidelift" + } + ], + "time": "2023-09-11T03:25:04+00:00" + }, + { + "name": "league/oauth2-client", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-client.git", + "reference": "160d6274b03562ebeb55ed18399281d8118b76c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/160d6274b03562ebeb55ed18399281d8118b76c8", + "reference": "160d6274b03562ebeb55ed18399281d8118b76c8", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0 || ^7.0", + "paragonie/random_compat": "^1 || ^2 || ^9.99", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.5", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpunit/phpunit": "^5.7 || ^6.0 || ^9.5", + "squizlabs/php_codesniffer": "^2.3 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Woody Gilk", + "homepage": "https://github.com/shadowhand", + "role": "Contributor" + } + ], + "description": "OAuth 2.0 Client Library", + "keywords": [ + "Authentication", + "SSO", + "authorization", + "identity", + "idp", + "oauth", + "oauth2", + "single sign on" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-client/issues", + "source": "https://github.com/thephpleague/oauth2-client/tree/2.7.0" + }, + "time": "2023-04-16T18:19:15+00:00" + }, + { + "name": "monolog/monolog", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "479c936d2c230d8c467bdb3882afab45a6e6b8ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/479c936d2c230d8c467bdb3882afab45a6e6b8ad", + "reference": "479c936d2c230d8c467bdb3882afab45a6e6b8ad", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.1", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/main" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2023-12-18T10:39:48+00:00" + }, + { + "name": "pahanini/monolog-cli-formatter", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/pahanini/monolog-cli-formatter.git", + "reference": "7819f25a5d51a363c3ab3b9cfa957c56240bf563" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pahanini/monolog-cli-formatter/zipball/7819f25a5d51a363c3ab3b9cfa957c56240bf563", + "reference": "7819f25a5d51a363c3ab3b9cfa957c56240bf563", + "shasum": "" + }, + "require": { + "ext-json": "*", + "monolog/monolog": "^3.0", + "php": ">=7.2" + }, + "type": "formatter", + "autoload": { + "psr-4": { + "pahanini\\Monolog\\Formatter\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pavel Tetyaev", + "email": "pahanini@gmail.com" + } + ], + "description": "Formats log for console with colors and indents for context", + "homepage": "https://github.com/pahanini/monolog-cli-formatter", + "keywords": [ + "formatter", + "log", + "monolog" + ], + "support": { + "issues": "https://github.com/pahanini/monolog-cli-formatter/issues", + "source": "https://github.com/pahanini/monolog-cli-formatter/tree/2.0.0" + }, + "time": "2024-02-13T04:15:46+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": "psr/cache", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "0a7c67d0d1c8167b342eb74339d6f961663826ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/0a7c67d0d1c8167b342eb74339d6f961663826ce", + "reference": "0a7c67d0d1c8167b342eb74339d6f961663826ce", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "suggest": { + "fig/cache-util": "Provides some useful PSR-6 utilities" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2021-02-24T03:25:37+00:00" + }, + { + "name": "psr/container", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "707984727bd5b2b670e59559d3ed2500240cf875" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/707984727bd5b2b670e59559d3ed2500240cf875", + "reference": "707984727bd5b2b670e59559d3ed2500240cf875", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "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" + }, + "time": "2023-09-22T11:11:30+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "977ffcf551e3bfb73d90aac3e8e1583fd8d2f89a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/977ffcf551e3bfb73d90aac3e8e1583fd8d2f89a", + "reference": "977ffcf551e3bfb73d90aac3e8e1583fd8d2f89a", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "suggest": { + "fig/event-dispatcher-util": "Provides some useful PSR-14 utilities" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "source": "https://github.com/php-fig/event-dispatcher" + }, + "time": "2023-09-22T11:10:57+00:00" + }, + { + "name": "psr/http-client", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "default-branch": true, + "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" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "7037f4b0950474e9d1350e8df89b15f1842085f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/7037f4b0950474e9d1350e8df89b15f1842085f6", + "reference": "7037f4b0950474e9d1350e8df89b15f1842085f6", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "default-branch": true, + "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": "PSR-17: 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" + }, + "time": "2023-09-22T11:16:44+00:00" + }, + { + "name": "psr/http-message", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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 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/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "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/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "2d280c2aaa23a120f35d55cfde8581954a8e77fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/2d280c2aaa23a120f35d55cfde8581954a8e77fa", + "reference": "2d280c2aaa23a120f35d55cfde8581954a8e77fa", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2022-04-08T16:41:45+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": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "edaf8f7a01f8992e05b34599f4d7507f6396873c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/edaf8f7a01f8992e05b34599f4d7507f6396873c", + "reference": "edaf8f7a01f8992e05b34599f4d7507f6396873c", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "default-branch": true, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.x" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-03-04T21:05:57+00:00" + }, + { + "name": "sebastian/diff", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "8cf50ea368d83677398953fb3123c8aa44473e7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/8cf50ea368d83677398953fb3123c8aa44473e7e", + "reference": "8cf50ea368d83677398953fb3123c8aa44473e7e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/main" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-10T12:23:21+00:00" + }, + { + "name": "splitbrain/php-cli", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/splitbrain/php-cli.git", + "reference": "844609ef16b8486691b7fd892d54478918f27fe8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/splitbrain/php-cli/zipball/844609ef16b8486691b7fd892d54478918f27fe8", + "reference": "844609ef16b8486691b7fd892d54478918f27fe8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^8" + }, + "suggest": { + "psr/log": "Allows you to make the CLI available as PSR-3 logger" + }, + "type": "library", + "autoload": { + "psr-4": { + "splitbrain\\phpcli\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Gohr", + "email": "andi@splitbrain.org" + } + ], + "description": "Easy command line scripts for PHP with opt parsing and color output. No dependencies", + "keywords": [ + "argparse", + "cli", + "command line", + "console", + "getopt", + "optparse", + "terminal" + ], + "support": { + "issues": "https://github.com/splitbrain/php-cli/issues", + "source": "https://github.com/splitbrain/php-cli/tree/1.3.1" + }, + "time": "2024-01-17T12:03:34+00:00" + }, + { + "name": "sspat/reserved-words", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sspat/reserved-words.git", + "reference": "ae8f3158b092c8720de378a64c8662ca30899c5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sspat/reserved-words/zipball/ae8f3158b092c8720de378a64c8662ca30899c5b", + "reference": "ae8f3158b092c8720de378a64c8662ca30899c5b", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0", + "thecodingmachine/safe": "^1.3|^2" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "infection/infection": "^0.18|^0.26.6", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^9.5.5", + "squizlabs/php_codesniffer": "^3.6", + "thecodingmachine/phpstan-safe-rule": "^1.2", + "vimeo/psalm": "^4.20" + }, + "type": "library", + "autoload": { + "psr-4": { + "sspat\\ReservedWords\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrik Foldes", + "email": "studio22@mail.ru" + } + ], + "description": "Validates strings against reserved words of a specific php version", + "keywords": [ + "php", + "reserved", + "words" + ], + "support": { + "issues": "https://github.com/sspat/reserved-words/issues", + "source": "https://github.com/sspat/reserved-words/tree/3.0.1" + }, + "time": "2022-04-11T10:29:03+00:00" + }, + { + "name": "symfony/console", + "version": "7.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "31c74a59d8bffdcec73adb43b398f6942f7dc26b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/31c74a59d8bffdcec73adb43b398f6942f7dc26b", + "reference": "31c74a59d8bffdcec73adb43b398f6942f7dc26b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "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/7.1" + }, + "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": "2024-03-04T12:49:13+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "2c438b99bb2753c1628c1e6f523991edea5b03a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/2c438b99bb2753c1628c1e6f523991edea5b03a4", + "reference": "2c438b99bb2753c1628c1e6f523991edea5b03a4", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.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/main" + }, + "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": "2024-01-02T14:07:37+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "7.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "5bb99ba359e39909230a22e343271e9385bbee08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5bb99ba359e39909230a22e343271e9385bbee08", + "reference": "5bb99ba359e39909230a22e343271e9385bbee08", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "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 tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/7.1" + }, + "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": "2024-01-23T15:06:13+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "4d4ea14a8d31bc995e29bdbd566ac07c9fd004f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/4d4ea14a8d31bc995e29bdbd566ac07c9fd004f5", + "reference": "4d4ea14a8d31bc995e29bdbd566ac07c9fd004f5", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "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 dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/main" + }, + "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": "2024-01-23T15:06:13+00:00" + }, + { + "name": "symfony/filesystem", + "version": "7.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "60d42aa14bdecc7f488988430a144fed084c81e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/60d42aa14bdecc7f488988430a144fed084c81e2", + "reference": "60d42aa14bdecc7f488988430a144fed084c81e2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "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/7.1" + }, + "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": "2024-01-23T15:06:13+00:00" + }, + { + "name": "symfony/finder", + "version": "7.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "beeac2ba50a5dd729d8a23507ad09cdd0f82110c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/beeac2ba50a5dd729d8a23507ad09cdd0f82110c", + "reference": "beeac2ba50a5dd729d8a23507ad09cdd0f82110c", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "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/7.1" + }, + "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": "2024-01-16T21:21:05+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "7.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "fac02432c8616006aa9f1d6274440a58a0e90f4c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/fac02432c8616006aa9f1d6274440a58a0e90f4c", + "reference": "fac02432c8616006aa9f1d6274440a58a0e90f4c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "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 an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/7.1" + }, + "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": "2024-02-21T09:01:35+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "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 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/process", + "version": "7.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "ef909caff8547b26f72dff049ea24f9b07a3701a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/ef909caff8547b26f72dff049ea24f9b07a3701a", + "reference": "ef909caff8547b26f72dff049ea24f9b07a3701a", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "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/7.1" + }, + "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": "2024-02-22T20:28:06+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "cea2eccfcd27ac3deb252bd67f78b9b8ffc4da84" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/cea2eccfcd27ac3deb252bd67f78b9b8ffc4da84", + "reference": "cea2eccfcd27ac3deb252bd67f78b9b8ffc4da84", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "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/main" + }, + "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": "2024-01-02T14:07:37+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "7.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "b7fa24bb627fcb7e104669bca6861f18e8814a9b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b7fa24bb627fcb7e104669bca6861f18e8814a9b", + "reference": "b7fa24bb627fcb7e104669bca6861f18e8814a9b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "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 a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/7.1" + }, + "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": "2024-02-21T09:01:35+00:00" + }, + { + "name": "symfony/string", + "version": "7.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ef964850371aca5def9fc8a3059d9b1690bb3b6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ef964850371aca5def9fc8a3059d9b1690bb3b6c", + "reference": "ef964850371aca5def9fc8a3059d9b1690bb3b6c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.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/7.1" + }, + "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": "2024-03-08T12:55:53+00:00" + }, + { + "name": "symfony/yaml", + "version": "6.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d75715985f0f94f978e3a8fa42533e10db921b90", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "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/6.4" + }, + "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": "2024-01-23T14:51:35+00:00" + }, + { + "name": "thecodingmachine/safe", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.2", + "thecodingmachine/phpstan-strict-rules": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "files": [ + "deprecated/apc.php", + "deprecated/array.php", + "deprecated/datetime.php", + "deprecated/libevent.php", + "deprecated/misc.php", + "deprecated/password.php", + "deprecated/mssql.php", + "deprecated/stats.php", + "deprecated/strings.php", + "lib/special_cases.php", + "deprecated/mysqli.php", + "generated/apache.php", + "generated/apcu.php", + "generated/array.php", + "generated/bzip2.php", + "generated/calendar.php", + "generated/classobj.php", + "generated/com.php", + "generated/cubrid.php", + "generated/curl.php", + "generated/datetime.php", + "generated/dir.php", + "generated/eio.php", + "generated/errorfunc.php", + "generated/exec.php", + "generated/fileinfo.php", + "generated/filesystem.php", + "generated/filter.php", + "generated/fpm.php", + "generated/ftp.php", + "generated/funchand.php", + "generated/gettext.php", + "generated/gmp.php", + "generated/gnupg.php", + "generated/hash.php", + "generated/ibase.php", + "generated/ibmDb2.php", + "generated/iconv.php", + "generated/image.php", + "generated/imap.php", + "generated/info.php", + "generated/inotify.php", + "generated/json.php", + "generated/ldap.php", + "generated/libxml.php", + "generated/lzf.php", + "generated/mailparse.php", + "generated/mbstring.php", + "generated/misc.php", + "generated/mysql.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pgsql.php", + "generated/posix.php", + "generated/ps.php", + "generated/pspell.php", + "generated/readline.php", + "generated/rpminfo.php", + "generated/rrd.php", + "generated/sem.php", + "generated/session.php", + "generated/shmop.php", + "generated/sockets.php", + "generated/sodium.php", + "generated/solr.php", + "generated/spl.php", + "generated/sqlsrv.php", + "generated/ssdeep.php", + "generated/ssh2.php", + "generated/stream.php", + "generated/strings.php", + "generated/swoole.php", + "generated/uodbc.php", + "generated/uopz.php", + "generated/url.php", + "generated/var.php", + "generated/xdiff.php", + "generated/xml.php", + "generated/xmlrpc.php", + "generated/yaml.php", + "generated/yaz.php", + "generated/zip.php", + "generated/zlib.php" + ], + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "deprecated/Exceptions/", + "generated/Exceptions/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", + "support": { + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" + }, + "time": "2023-04-05T11:54:14+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "groton-school/sky-api": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/packages/appengine-client/phive.xml b/packages/appengine-client/phive.xml new file mode 100644 index 00000000..0b54b8ec --- /dev/null +++ b/packages/appengine-client/phive.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/appengine-client/psalm.xml b/packages/appengine-client/psalm.xml new file mode 100644 index 00000000..d56a5afe --- /dev/null +++ b/packages/appengine-client/psalm.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/appengine-client/src/ClientFactory.php b/packages/appengine-client/src/ClientFactory.php new file mode 100644 index 00000000..3ef25be4 --- /dev/null +++ b/packages/appengine-client/src/ClientFactory.php @@ -0,0 +1,51 @@ +secrets = new Cache($projectId ?? $_ENV["GOOGLE_CLOUD_PROJECT"]); + $this->storage = new TokenStorage($this->secrets); + } + + /** + * @param class-string $class + * + * @return BaseEndpoint + * + * @psalm-suppress UnsafeInstantiation + */ + public function get(string $class): BaseEndpoint + { + return new $class( + new Client( + new BlackbaudSKY([ + BlackbaudSKY::ACCESS_KEY => $this->secrets->get(self::ACCESS_KEY), + "clientId" => $this->secrets->get(self::CLIENT_ID), + "clientSecret" => $this->secrets->get(self::CLIENT_SECRET), + "redirectUri" => $this->secrets->get(self::REDIRECT_URL), + ]), + $this->storage + ) + ); + } +} diff --git a/packages/appengine-client/src/TokenStorage.php b/packages/appengine-client/src/TokenStorage.php new file mode 100644 index 00000000..67b49d42 --- /dev/null +++ b/packages/appengine-client/src/TokenStorage.php @@ -0,0 +1,41 @@ +secrets = + $projectId instanceof Cache + ? $projectId + : new Cache($projectId ?? $_ENV["GOOGLE_CLOUD_PROJECT"]); + } + + public function getToken(): ?AccessTokenInterface + { + $result = $this->secrets->get(self::ACCESS_TOKEN); + if ($result !== null) { + /** @psalm-suppress MixedArgument */ + return new AccessToken($result); + } + return null; + } + + public function setToken(AccessTokenInterface $token): bool + { + return $this->secrets->set(self::ACCESS_TOKEN, $token, 1); + } +} diff --git a/packages/oauth2-example/.gitignore b/packages/oauth2-example/.gitignore new file mode 100755 index 00000000..b89ae65b --- /dev/null +++ b/packages/oauth2-example/.gitignore @@ -0,0 +1,2 @@ +.env +/vendor/ diff --git a/packages/oauth2-example/composer.json b/packages/oauth2-example/composer.json new file mode 100755 index 00000000..61d80070 --- /dev/null +++ b/packages/oauth2-example/composer.json @@ -0,0 +1,14 @@ +{ + "name": "groton-school/oauth2-blackbaudsky-example", + "description": "Example use of groton-school/oauth2-blackbaudsky", + "require": { + "groton-school/oauth2-blackbaudsky": "^0.1.1" + }, + "license": "MIT", + "authors": [ + { + "name": "Seth Battis", + "email": "sbattis@groton.org" + } + ] +} diff --git a/packages/oauth2-example/composer.lock b/packages/oauth2-example/composer.lock new file mode 100755 index 00000000..58edcb13 --- /dev/null +++ b/packages/oauth2-example/composer.lock @@ -0,0 +1,814 @@ +{ + "_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#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "8f3b78ae0fb86d6c5ef0ea188b423918", + "packages": [ + { + "name": "battis/path", + "version": "v0.1", + "source": { + "type": "git", + "url": "https://github.com/battis/Path.git", + "reference": "2bc6eb940d4a3317450210999a635ff4dd1d4d7c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/battis/Path/zipball/2bc6eb940d4a3317450210999a635ff4dd1d4d7c", + "reference": "2bc6eb940d4a3317450210999a635ff4dd1d4d7c", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Battis\\Path\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0" + ], + "authors": [ + { + "name": "Seth Battis", + "email": "seth@battis.net" + } + ], + "description": "Path manipulation toolbox", + "support": { + "issues": "https://github.com/battis/Path/issues", + "source": "https://github.com/battis/Path/tree/v0.1" + }, + "time": "2021-12-18T23:47:33+00:00" + }, + { + "name": "groton-school/oauth2-blackbaudsky", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/groton-school/OAuth2-BlackbaudSKY.git", + "reference": "dfd7adf405e33818164a80e205ba61f80438a395" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/groton-school/OAuth2-BlackbaudSKY/zipball/dfd7adf405e33818164a80e205ba61f80438a395", + "reference": "dfd7adf405e33818164a80e205ba61f80438a395", + "shasum": "" + }, + "require": { + "battis/path": "^0.1.0", + "guzzlehttp/guzzle": "^7.4", + "league/oauth2-client": "^2.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrotonSchool\\OAuth2\\Client\\Provider\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Seth Battis", + "email": "sbattis@groton.org" + } + ], + "description": "This package provides Blackbaud SKY OAuth 2.0 support for the PHP League's OAuth 2.0 Client", + "support": { + "issues": "https://github.com/groton-school/OAuth2-BlackbaudSKY/issues", + "source": "https://github.com/groton-school/OAuth2-BlackbaudSKY/tree/v0.1.1" + }, + "time": "2021-12-19T16:45:46+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "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.8.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-08-27T10:20: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.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "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.1" + }, + "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-27T10:13:57+00:00" + }, + { + "name": "league/oauth2-client", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-client.git", + "reference": "160d6274b03562ebeb55ed18399281d8118b76c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/160d6274b03562ebeb55ed18399281d8118b76c8", + "reference": "160d6274b03562ebeb55ed18399281d8118b76c8", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0 || ^7.0", + "paragonie/random_compat": "^1 || ^2 || ^9.99", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.5", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpunit/phpunit": "^5.7 || ^6.0 || ^9.5", + "squizlabs/php_codesniffer": "^2.3 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Woody Gilk", + "homepage": "https://github.com/shadowhand", + "role": "Contributor" + } + ], + "description": "OAuth 2.0 Client Library", + "keywords": [ + "Authentication", + "SSO", + "authorization", + "identity", + "idp", + "oauth", + "oauth2", + "single sign on" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-client/issues", + "source": "https://github.com/thephpleague/oauth2-client/tree/2.7.0" + }, + "time": "2023-04-16T18:19:15+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": "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": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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 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/2.0" + }, + "time": "2023-04-04T09:54:51+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": "symfony/deprecation-contracts", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-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/v3.3.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": "2023-05-23T14:45:45+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/packages/oauth2-example/public/index.html b/packages/oauth2-example/public/index.html new file mode 100755 index 00000000..b15b99b7 --- /dev/null +++ b/packages/oauth2-example/public/index.html @@ -0,0 +1,37 @@ + + + + groton-school/oauth2-blackbaudsky Example + + + +
+

Example

+ Request an access token +
+ + \ No newline at end of file diff --git a/packages/oauth2-example/public/refresh.php b/packages/oauth2-example/public/refresh.php new file mode 100755 index 00000000..78cfa5a7 --- /dev/null +++ b/packages/oauth2-example/public/refresh.php @@ -0,0 +1,56 @@ + getenv('BLACKBAUD_ACCESS_KEY'), + + /** + * OAuth 2.0 App Credentials + * @link https://developer.blackbaud.com/apps/ + */ + // The client ID assigned to you by the provider + 'clientId' => getenv('OAUTH_CLIENT_ID'), + // The client password assigned to you by the provider + 'clientSecret' => getenv('OAUTH_CLIENT_SECRET') +]); + +$existingAccessToken = new AccessToken($_POST); // get access token from your data store + +// FIXME normally we'd test $existingAccessToken->hasExpired() before refreshing +$newAccessToken = $sky->getAccessToken('refresh_token', [ + 'refresh_token' => $existingAccessToken->getRefreshToken() +]); + +// Purge old access token and store new access token to your data store. + +?> + + + + Refresh Token + + +

Refresh Token

+

Requested an access token using refresh flow.

+

Access Token

+
+
+ jsonSerialize() as $param => $value) { + echo << +EOT; + } + ?> + + + + diff --git a/packages/oauth2-example/public/token.php b/packages/oauth2-example/public/token.php new file mode 100755 index 00000000..b846db22 --- /dev/null +++ b/packages/oauth2-example/public/token.php @@ -0,0 +1,92 @@ + getenv('BLACKBAUD_ACCESS_KEY'), + + /** + * OAuth 2.0 App Credentials + * @link https://developer.blackbaud.com/apps/ + */ + // The client ID assigned to you by the provider + 'clientId' => getenv('OAUTH_CLIENT_ID'), + // The client password assigned to you by the provider + 'clientSecret' => getenv('OAUTH_CLIENT_SECRET'), + // Redirect URI registered with the provider + 'redirectUri' => getenv('OAUTH_REDIRECT_URL') +]); + +// If we don't have an authorization code then get one +if (!isset($_GET['code'])) { + // Fetch the authorization URL from the provider; this returns the + // urlAuthorize option and generates and applies any necessary parameters + // (e.g. state). + $authorizationUrl = $sky->getAuthorizationUrl(); + + // Get the state generated for you and store it to the session. + $_SESSION['oauth2state'] = $sky->getState(); + + // Redirect the user to the authorization URL. + header('Location: ' . $authorizationUrl); + exit; + +// Check given state against previously stored one to mitigate CSRF attack +} elseif (empty($_GET['state']) || (isset($_SESSION['oauth2state']) && $_GET['state'] !== $_SESSION['oauth2state'])) { + if (isset($_SESSION['oauth2state'])) { + unset($_SESSION['oauth2state']); + } + + exit('Invalid state'); +} else { + try { + // Try to get an access token using the authorization code grant. + $accessToken = $sky->getAccessToken('authorization_code', [ + 'code' => $_GET['code'] + ]); + + $school = $sky->endpoint('school/v1'); + $levels = $school->get('levels'); + } catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) { + // Failed to get the access token or user details. + exit($e->getMessage()); + } +} + +?> + + + + Request Token + + + +

Request Token

+

Requested an access token using authorization_code flow.

+ +

Access Token

+
+
+ jsonSerialize() as $param => $value) { + echo << +EOT; + } + ?> + + + +

GET /school/v1/levels

+
+ + diff --git a/packages/oauth2/.gitattributes b/packages/oauth2/.gitattributes new file mode 100644 index 00000000..e250b932 --- /dev/null +++ b/packages/oauth2/.gitattributes @@ -0,0 +1 @@ +/phpcs.xml export-ignore \ No newline at end of file diff --git a/packages/oauth2/.github/workflows/todo.yml b/packages/oauth2/.github/workflows/todo.yml new file mode 100644 index 00000000..09bd5e51 --- /dev/null +++ b/packages/oauth2/.github/workflows/todo.yml @@ -0,0 +1,12 @@ +name: "Run TODO to Issue" +on: ["push"] +jobs: + build: + runs-on: "ubuntu-latest" + steps: + - uses: "actions/checkout@v3" + - name: "TODO to Issue" + uses: "alstr/todo-to-issue-action@v4" + with: + AUTO_ASSIGN: true + IDENTIFIERS: "[{\"name\": \"TODO\", \"labels\": []}, {\"name\": \"FIXME\", \"labels\": [\"bug\"]}]" diff --git a/packages/oauth2/.gitignore b/packages/oauth2/.gitignore new file mode 100644 index 00000000..af50cbc8 --- /dev/null +++ b/packages/oauth2/.gitignore @@ -0,0 +1,6 @@ +.DS_Store +/.cache/ +/coverage/ +/docs/ +/tools/ +/vendor/ diff --git a/packages/oauth2/.nova/Artwork b/packages/oauth2/.nova/Artwork new file mode 100644 index 0000000000000000000000000000000000000000..579530d579e90e4f02fcabed6d63a25d0529bfba GIT binary patch literal 19248 zcmV*2KzF~1P)BNa;Tk#@|Wy#tsS=362B1nom0TKj2>?l;BP zT5x|lR|OP-SFawb{`GD5`!FyV3`U7y0>fZ1N(K`c27^&D_;Q~B!yZ~&TcNG3js66Pz3tKe9Vp<@aU6P@aV2~34!S|)kKB%df?>VBN(7SrG7cn2qQ0;gbs zmpOq4gb)FQRm|x>H}4JwWlnUNkAaN$J^Ansz8X!sj>4xE)`)eE4qcW z=y6EA!x?vnf>B>{N7~_Q%?ZwW1@pnUJJ^^LTy+vBh7?W+5;+UP>q`$ zr>ZdmMCDaEf>k9cO6jmSJvS@L*$6M^qRw1$(w~|g4aFuV1tpsi6e;IP&t-W*${IHf>M10^75q zw;?MyTNF-gRWS~%LNH2+E(C~>45vtwoGM3L*~El96C3fS=dQNS-ngU*k~5o3dehOg zC}(p3K#Na4(YZx%#>dCW#KZ&>n+l-ZFSZTMV~;(SFTRn_t>H{TF~62MLA<)@&i3hG zXZM`HdG?nyhm_Ys6WWqLaHK!_|TxdB%;aVn4upQ(?HUG5$`H&Q=85eERtV&%vd zYbS4f=kdoMUlLGetPf0J))~zO(kvD#o|4byF@;3?TF?X~=BfA1`I;M2PG7@F^R7E% zo`yTp4(~RJcXRwYP)=Z98tZ?7TnWsyit0&Q2BMkRET{pddnW zoRS-JXW|#?W8?2`p1gF*mx@k=ViR+`DrGIAqvo-2bo%=G2osyqvteJTr6y0XmbO$l z%I(oz9|FiR+0fN88S2_U)VBAbl+(Xk;>AuC^9}6pR2ZbHNnVvE#9aDDb7bgen94u@NRPHc%k0Vhzxm!r~Ze-MwwNb=SjVP1`>u^Wr82b9HRnhW#Ky(wr)X1Bsc} zwhy0rVe`c0K36uGpoB)U#BMYQvuf;v2~3e_!eViQ^2Jmfn#GcI`Mp0o^2=X~c^khV z^WtW9{nrnqDlu0!`Sy_uFZ}Oa;}?ekAO`>$<5o7-l0rY0fhrF60$(E*SIBCyXt$y! zED|TWZ*=TEGT6TV{z#zZK1pzFCkQ*sef}E~Gb@!%p4&8W<@FuIr=G8i&x9$Vv1X%~ z>r^C6U{*;1i^UAu>ai69NSyOGHuP^g^y$IQ179{o#Zl%{XV5H&&2(dA^ts)GC%)G{ zb*�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 XC7$T3DQ|sJ00000NkvXXu0mjf)CKVk literal 0 HcmV?d00001 diff --git a/packages/oauth2/.nova/Configuration.json b/packages/oauth2/.nova/Configuration.json new file mode 100644 index 00000000..a445e5e9 --- /dev/null +++ b/packages/oauth2/.nova/Configuration.json @@ -0,0 +1,5 @@ +{ + "workspace.art_style" : 1, + "workspace.color" : 9, + "workspace.name" : "OAuth2-BlackbaudSKY" +} diff --git a/packages/oauth2/.nova/Tasks/docs.json b/packages/oauth2/.nova/Tasks/docs.json new file mode 100644 index 00000000..e21ca8f6 --- /dev/null +++ b/packages/oauth2/.nova/Tasks/docs.json @@ -0,0 +1,9 @@ +{ + "actions" : { + "run" : { + "enabled" : true, + "script" : "composer run-script docs" + } + }, + "openLogOnRun" : "start" +} diff --git a/packages/oauth2/LICENSE.md b/packages/oauth2/LICENSE.md new file mode 100644 index 00000000..58a52a7d --- /dev/null +++ b/packages/oauth2/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-2015 Alex Bilbie + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/packages/oauth2/README.md b/packages/oauth2/README.md new file mode 100644 index 00000000..a4870170 --- /dev/null +++ b/packages/oauth2/README.md @@ -0,0 +1,169 @@ +# Blackbaud SKY API OAuth 2.0 Client + +TThis package provides Blackbaud SKY OAuth 2.0 support for the [PHP League's OAuth 2.0 Client](https://oauth2-client.thephpleague.com/) + +[![Version](http://poser.pugx.org/groton-school/oauth2-blackbaudsky/version)](https://packagist.org/packages/groton-school/oauth2-blackbaudsky) +[![License](http://poser.pugx.org/groton-school/oauth2-blackbaudsky/license)](https://packagist.org/packages/groton-school/oauth2-blackbaudsky) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/groton-school/OAuth2-BlackbaudSKY/badges/quality-score.png?b=main)](https://scrutinizer-ci.com/g/groton-school/OAuth2-BlackbaudSKY/?branch=main) +[![Code Coverage](https://scrutinizer-ci.com/g/groton-school/OAuth2-BlackbaudSKY/badges/coverage.png?b=main)](https://scrutinizer-ci.com/g/groton-school/OAuth2-BlackbaudSKY/?branch=main) +--- + +This package is compliant with [PSR-1][], [PSR-2][], [PSR-4][], and [PSR-7][]. If you notice compliance oversights, please send a patch via pull request. If you're interesting in contributing to this library, please take a look at our [contributing guidelines](CONTRIBUTING.md). + +## Requirements + +The following versions of PHP are supported. + +* PHP 5.6 +* PHP 7.0 +* PHP 7.1 +* PHP 7.2 +* PHP 7.3 +* PHP 7.4 +* PHP 8.0 + +## Usage + +Refer to [example](https://github.com/groton-school/OAuth2-BlackbaudSKY-example) for example usage. + +### Authorization Code Grant + +The following example uses the out-of-the-box `GenericProvider` provided by this library. If you're looking for a specific provider (i.e. Facebook, Google, GitHub, etc.), take a look at our [list of provider client libraries](docs/providers/thirdparty.md). **HINT: You're probably looking for a specific provider.** + +The authorization code grant type is the most common grant type used when authenticating users with a third-party service. This grant type utilizes a client (this library), a server (the service provider), and a resource owner (the user with credentials to a protected—or owned—resource) to request access to resources owned by the user. This is often referred to as _3-legged OAuth_, since there are three parties involved. + +The following example illustrates this using [Brent Shaffer's](https://github.com/bshaffer) demo OAuth 2.0 application named **Lock'd In**. When running this code, you will be redirected to Lock'd In, where you'll be prompted to authorize the client to make requests to a resource on your behalf. + +Now, you don't really have an account on Lock'd In, but for the sake of this example, imagine that you are already logged in on Lock'd In when you are redirected there. + +```php +$sky = new \GrotonSchool\OAuth2\Client\Provider\BlackbaudSKY([ + BlackbaudSKY::ACCESS_KEY => 'key', // A Blackbaud SKY API subscription access key + 'clientId' => 'demoapp', // The client ID assigned to your app by Blackbaud + 'clientSecret' => 'demopass', // The client password assigned to your app by Blackbaud + 'redirectUri' => 'http://example.com/your-redirect-url/' +]); + +// If we don't have an authorization code then get one +if (!isset($_GET['code'])) { + + // Fetch the authorization URL from the provider; this returns the + // urlAuthorize option and generates and applies any necessary parameters + // (e.g. state). + $authorizationUrl = $sky->getAuthorizationUrl(); + + // Get the state generated for you and store it to the session. + $_SESSION['oauth2state'] = $sky->getState(); + + // Redirect the user to the authorization URL. + header('Location: ' . $authorizationUrl); + exit; + +// Check given state against previously stored one to mitigate CSRF attack +} elseif (empty($_GET['state']) || (isset($_SESSION['oauth2state']) && $_GET['state'] !== $_SESSION['oauth2state'])) { + + if (isset($_SESSION['oauth2state'])) { + unset($_SESSION['oauth2state']); + } + + exit('Invalid state'); + +} else { + + try { + + // Try to get an access token using the authorization code grant. + $accessToken = $sky->getAccessToken('authorization_code', [ + 'code' => $_GET['code'] + ]); + + // We have an access token, which we may use in authenticated + // requests against the service provider's API. + echo 'Access Token: ' . $accessToken->getToken() . "
"; + echo 'Refresh Token: ' . $accessToken->getRefreshToken() . "
"; + echo 'Expired in: ' . $accessToken->getExpires() . "
"; + echo 'Already expired? ' . ($accessToken->hasExpired() ? 'expired' : 'not expired') . "
"; + + // The provider provides a way to get an authenticated API request for + // the service, using the access token; it returns an object conforming + // to Psr\Http\Message\RequestInterface. + $request = $sky->getAuthenticatedRequest( + 'GET', + 'https://api.sky.blackbaud.com/school/v1/academics/departments', + $accessToken + ); + + // For convenience, the provider also wraps endpoints with a Guzzle client + $school = $sky->endpoint('school/v1'); + var_export($school->get('levels')); + + // ...and those endpoints can also nest further endpoints + $academics = $school->endpoint('academics'); + var_export($academics->get('departments')); + + } catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) { + + // Failed to get the access token or user details. + exit($e->getMessage()); + + } + +} +``` + +### Refreshing a Token + +Once your application is authorized, you can refresh an expired token using a refresh token rather than going through the entire process of obtaining a brand new token. To do so, simply reuse this refresh token from your data store to request a refresh. + +_This example uses [Brent Shaffer's](https://github.com/bshaffer) demo OAuth 2.0 application named **Lock'd In**. See authorization code example above, for more details._ + +```php +$sky = new \League\OAuth2\Client\Provider\GenericProvider([ + BlackbaudSKY::ACCESS_KEY => 'key', // A Blackbaud SKY API subscription access key + 'clientId' => 'demoapp', // The client ID assigned to your app by Blackbaud + 'clientSecret' => 'demopass' // The client password assigned to your app by Blackbaud +]); + +$existingAccessToken = getAccessTokenFromYourDataStore(); + +if ($existingAccessToken->hasExpired()) { + $newAccessToken = $sky->getAccessToken('refresh_token', [ + 'refresh_token' => $existingAccessToken->getRefreshToken() + ]); + + // Purge old access token and store new access token to your data store. +} +``` + +### Using a proxy + +It is possible to use a proxy to debug HTTP calls made to a provider. All you need to do is set the `proxy` and `verify` options when creating your Provider instance. Make sure you enable SSL proxying in your proxy. + +``` php +$sky = new \League\OAuth2\Client\Provider\GenericProvider([ + BlackbaudSKY::ACCESS_KEY => 'key', // A Blackbaud SKY API subscription access key + 'clientId' => 'demoapp', // The client ID assigned to your app by Blackbaud + 'clientSecret' => 'demopass', // The client password assigned to your app by Blackbaud + 'redirectUri' => 'http://example.com/your-redirect-url/' + 'proxy' => '192.168.0.1:8888', + 'verify' => false +]); +``` + +## Install + +Via Composer + +``` bash +$ composer require groton-school/oauth2-blackbaudsky +``` + +## License + +The MIT License (MIT). Please see [License File](https://github.com/thephpleague/oauth2-client/blob/master/LICENSE) for more information. + + +[PSR-1]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md +[PSR-2]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md +[PSR-4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md +[PSR-7]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-7-http-message.md diff --git a/packages/oauth2/composer.json b/packages/oauth2/composer.json new file mode 100644 index 00000000..7083a2ee --- /dev/null +++ b/packages/oauth2/composer.json @@ -0,0 +1,26 @@ +{ + "name": "groton-school/oauth2-blackbaudsky", + "description": "This package provides Blackbaud SKY OAuth 2.0 support for the PHP League's OAuth 2.0 Client", + "license": "MIT", + "authors": [ + { + "name": "Seth Battis", + "email": "sbattis@groton.org" + } + ], + "require": { + "ext-curl": "*", + "league/oauth2-client": "^2.6", + "guzzlehttp/guzzle": "^7.4", + "battis/data-utilities": "^1.2" + }, + "autoload": { + "psr-4": { + "GrotonSchool\\OAuth2\\Client\\Provider\\": "src/" + } + }, + "scripts": { + "docs": "./tools/phpdocumentor -d src -t docs" + } + +} diff --git a/packages/oauth2/composer.lock b/packages/oauth2/composer.lock new file mode 100644 index 00000000..39a59c86 --- /dev/null +++ b/packages/oauth2/composer.lock @@ -0,0 +1,817 @@ +{ + "_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#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "30d3e417431000f301ababbd3ff99a80", + "packages": [ + { + "name": "battis/data-utilities", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/battis/data-utilities.git", + "reference": "b821e6f271476733d66e2a127e9938c8b3a17cd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/battis/data-utilities/zipball/b821e6f271476733d66e2a127e9938c8b3a17cd5", + "reference": "b821e6f271476733d66e2a127e9938c8b3a17cd5", + "shasum": "" + }, + "require": { + "battis/hydratable": "^0.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Battis\\DataUtilities\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Seth Battis", + "email": "sethbattis@stmarksschool.org" + } + ], + "description": "A handful of useful helper functions to process data", + "support": { + "issues": "https://github.com/battis/data-utilities/issues", + "source": "https://github.com/battis/data-utilities/tree/v1.2.0" + }, + "time": "2024-02-12T14:28:34+00:00" + }, + { + "name": "battis/hydratable", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/battis/hydratable.git", + "reference": "a8ab2428b070dbe1f2143c7783898237727f3c79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/battis/hydratable/zipball/a8ab2428b070dbe1f2143c7783898237727f3c79", + "reference": "a8ab2428b070dbe1f2143c7783898237727f3c79", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Battis\\Hydratable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0" + ], + "authors": [ + { + "name": "Seth Battis", + "email": "seth@battis.net" + } + ], + "description": "Hydrate serialized objects with defaults and overrides", + "support": { + "issues": "https://github.com/battis/hydratable/issues", + "source": "https://github.com/battis/hydratable/tree/v0.1.1" + }, + "time": "2023-07-04T21:21:58+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "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.2", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "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.8.1" + }, + "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-12-03T20:35:24+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "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.2" + }, + "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-12-03T20:19:20+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "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.2", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "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.2" + }, + "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-12-03T20:05:35+00:00" + }, + { + "name": "league/oauth2-client", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-client.git", + "reference": "160d6274b03562ebeb55ed18399281d8118b76c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/160d6274b03562ebeb55ed18399281d8118b76c8", + "reference": "160d6274b03562ebeb55ed18399281d8118b76c8", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0 || ^7.0", + "paragonie/random_compat": "^1 || ^2 || ^9.99", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.5", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpunit/phpunit": "^5.7 || ^6.0 || ^9.5", + "squizlabs/php_codesniffer": "^2.3 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Woody Gilk", + "homepage": "https://github.com/shadowhand", + "role": "Contributor" + } + ], + "description": "OAuth 2.0 Client Library", + "keywords": [ + "Authentication", + "SSO", + "authorization", + "identity", + "idp", + "oauth", + "oauth2", + "single sign on" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-client/issues", + "source": "https://github.com/thephpleague/oauth2-client/tree/2.7.0" + }, + "time": "2023-04-16T18:19:15+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": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "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" + }, + "time": "2023-09-23T14:17:50+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": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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 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/2.0" + }, + "time": "2023-04-04T09:54:51+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": "symfony/deprecation-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-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/v3.4.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": "2023-05-23T14:45:45+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "ext-curl": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/packages/oauth2/phive.xml b/packages/oauth2/phive.xml new file mode 100644 index 00000000..98ee245b --- /dev/null +++ b/packages/oauth2/phive.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/oauth2/phpdoc.dist.xml b/packages/oauth2/phpdoc.dist.xml new file mode 100644 index 00000000..8c2136b9 --- /dev/null +++ b/packages/oauth2/phpdoc.dist.xml @@ -0,0 +1,19 @@ + + + + docs + .cache/phpdoc + + + + + src + + + + diff --git a/packages/oauth2/psalm.xml b/packages/oauth2/psalm.xml new file mode 100644 index 00000000..2ef1ac8e --- /dev/null +++ b/packages/oauth2/psalm.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/oauth2/src/BlackbaudSKY.php b/packages/oauth2/src/BlackbaudSKY.php new file mode 100644 index 00000000..707b8981 --- /dev/null +++ b/packages/oauth2/src/BlackbaudSKY.php @@ -0,0 +1,129 @@ +accessKey = $options[self::ACCESS_KEY]; + } + + if (!empty($options[self::ACCESS_TOKEN])) { + $this->accessToken = $options[self::ACCESS_TOKEN]; + } + } + + public function getBaseAuthorizationUrl() + { + return "https://oauth2.sky.blackbaud.com/authorization"; + } + + public function getBaseAccessTokenUrl(array $params) + { + return "https://oauth2.sky.blackbaud.com/token"; + } + + public function getBaseApiUrl() + { + return "https://api.sky.blackbaud.com"; + } + + public function getResourceOwnerDetailsUrl(AccessToken $token) + { + // TODO waiting on resolution of https://app.blackbaud.com/support/cases/018662802 + } + + protected function getDefaultScopes() + { + return []; + } + + protected function checkResponse(ResponseInterface $response, $data) + { + } + + protected function createResourceOwner(array $response, AccessToken $token) + { + } + + /** + * Returns authorization headers for the 'bearer' grant. + * + * @param AccessTokenInterface|string|null $token Either a string or an access token instance + * @return array + */ + protected function getAuthorizationHeaders($token = null) + { + return [ + self::ACCESS_KEY => $this->accessKey, + "Authorization" => "Bearer " . $token, + ]; + } + + public function getAccessToken($grant = "", array $options = []) + { + if (!empty($grant)) { + $this->accessToken = parent::getAccessToken($grant, $options); + return $this->accessToken; + } elseif (!empty($this->accessToken)) { + return $this->accessToken->getToken(); + } else { + throw new Exception("Stored access token or grant type required"); + } + } + + public function setAccessToken(AccessToken $accessToken) + { + $this->accessToken = $accessToken; + } + + /** @deprecated 0.2.3 externalized to {@link https://github.com/groton-school/appengine-sky-api groton-school/appengine-sky-api} */ + public function endpoint( + string $path, + ?AccessToken $token = null + ): SkyAPIEndpoint { + if (!$token) { + if ($this->accessToken) { + $token = $this->accessToken; + } else { + throw new Exception("No access token provided or cached"); + } + } + return new SkyAPIEndpoint($this, $path, $token); + } +} diff --git a/packages/oauth2/src/SkyAPIEndpoint.php b/packages/oauth2/src/SkyAPIEndpoint.php new file mode 100644 index 00000000..e311057c --- /dev/null +++ b/packages/oauth2/src/SkyAPIEndpoint.php @@ -0,0 +1,89 @@ +sky = $sky; + $this->path = $path; + $this->accessToken = $accessToken; + $this->client = new Client([ + "base_uri" => Path::join($this->sky->getBaseApiUrl(), $this->path) . "/", + ]); + } + + public function send(string $method, string $url, array $options = []): mixed + { + /* + * TODO deal with refreshing tokens (need callback to store new refresh token) + * https://developer.blackbaud.com/skyapi/docs/in-depth-topics/api-request-throttling + */ + usleep(100000); + $request = $this->sky->getAuthenticatedRequest( + $method, + $url, + $this->accessToken, + $options + ); + return json_decode( + $this->client + ->send($request) + ->getBody() + ->getContents(), + true + ); + } + + public function get(string $url, array $options = []): mixed + { + return $this->send("get", $url, $options); + } + + public function post(string $url, array $options = []): mixed + { + return $this->send("post", $url, $options); + } + + public function patch(string $url, array $options = []): mixed + { + return $this->send("patch", $url, $options); + } + + public function delete(string $url, array $options = []): mixed + { + return $this->send("delete", $url, $options); + } + + public function endpoint(string $path): SkyAPIEndpoint + { + return new SkyAPIEndpoint( + $this->sky, + Path::join($this->path, $path), + $this->accessToken + ); + } +}