├── .gitignore ├── .github ├── workflows │ ├── codeql-analysis.yml │ ├── linter.yml │ └── tests.yml └── ISSUE_TEMPLATE │ ├── documentation.yaml │ ├── feature.yaml │ └── bug.yaml ├── psalm.xml ├── phpunit.xml ├── pint.json ├── composer.json ├── src └── Runtimes │ ├── Version.php │ ├── Runtime.php │ └── Runtimes.php ├── LICENSE ├── README.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── tests └── Runtimes │ └── RuntimesTest.php └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | /.vscode/ 3 | .phpunit.result.cache 4 | **/.DS_Store 5 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | name: "CodeQL" 2 | 3 | on: [pull_request] 4 | jobs: 5 | lint: 6 | name: CodeQL 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - name: Checkout repository 11 | uses: actions/checkout@v3 12 | 13 | - name: Run CodeQL 14 | run: | 15 | docker run --rm -v $PWD:/app composer sh -c \ 16 | "composer install --profile --ignore-platform-reqs && composer check" -------------------------------------------------------------------------------- /.github/workflows/linter.yml: -------------------------------------------------------------------------------- 1 | name: "Linter" 2 | 3 | on: [pull_request] 4 | jobs: 5 | lint: 6 | name: Linter 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - name: Checkout repository 11 | uses: actions/checkout@v3 12 | with: 13 | fetch-depth: 2 14 | 15 | - run: git checkout HEAD^2 16 | 17 | - name: Run Linter 18 | run: | 19 | docker run --rm -v $PWD:/app composer sh -c \ 20 | "composer install --profile --ignore-platform-reqs && composer lint" -------------------------------------------------------------------------------- /psalm.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | ./tests/ 14 | 15 | 16 | -------------------------------------------------------------------------------- /pint.json: -------------------------------------------------------------------------------- 1 | { 2 | "preset": "psr12", 3 | "exclude": [ 4 | "./app/sdks", 5 | "./tests/resources/functions", 6 | "./app/console" 7 | ], 8 | "rules": { 9 | "array_indentation": true, 10 | "single_import_per_statement": true, 11 | "simplified_null_return": true, 12 | "ordered_imports": { 13 | "sort_algorithm": "alpha", 14 | "imports_order": [ 15 | "const", 16 | "class", 17 | "function" 18 | ] 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: "Tests" 2 | 3 | on: [pull_request] 4 | jobs: 5 | lint: 6 | name: Tests ${{ matrix.php-versions }} 7 | runs-on: ubuntu-latest 8 | strategy: 9 | matrix: 10 | php-versions: ['8.1', '8.2', '8.3', 'nightly'] 11 | 12 | steps: 13 | - name: Checkout repository 14 | uses: actions/checkout@v3 15 | 16 | - name: Setup PHP ${{ matrix.php-versions }} 17 | uses: shivammathur/setup-php@v2 18 | with: 19 | php-version: ${{ matrix.php-versions }} 20 | 21 | - name: Validate composer.json and composer.lock 22 | run: composer validate --strict 23 | 24 | - name: Compose install 25 | run: composer install --ignore-platform-reqs 26 | 27 | - name: Run tests 28 | run: composer test -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appwrite/php-runtimes", 3 | "description": "Appwrite repository for Cloud Function runtimes that contains the configurations and tests for all of the Appwrite runtime environments.", 4 | "type": "library", 5 | "keywords": ["php","appwrite","runtimes"], 6 | "license": "BSD-3-Clause", 7 | "authors": [ 8 | { 9 | "name": "Eldad Fux", 10 | "email": "eldad@appwrite.io" 11 | }, 12 | { 13 | "name": "Torsten Dittmann", 14 | "email": "torsten@appwrite.io" 15 | } 16 | ], 17 | "scripts": { 18 | "lint": "./vendor/bin/pint --test", 19 | "format": "./vendor/bin/pint", 20 | "test": "vendor/bin/phpunit --configuration phpunit.xml", 21 | "check": "./vendor/bin/phpstan analyse --level 8 src tests" 22 | }, 23 | "autoload": { 24 | "psr-4": {"Appwrite\\Runtimes\\":"src/Runtimes"} 25 | }, 26 | "require": { 27 | "php": ">=8.0", 28 | "utopia-php/system": "0.9.*" 29 | }, 30 | "require-dev": { 31 | "phpunit/phpunit": "^9.3", 32 | "laravel/pint": "^1.15", 33 | "phpstan/phpstan": "^1.10" 34 | }, 35 | "minimum-stability": "stable" 36 | } 37 | -------------------------------------------------------------------------------- /src/Runtimes/Version.php: -------------------------------------------------------------------------------- 1 | 18 | */ 19 | public array $supports; 20 | 21 | public bool $deprecated; 22 | 23 | /** 24 | * Version class that holds metadata about a Runtime Version. 25 | * 26 | * @param array $supports 27 | */ 28 | public function __construct(string $version, string $base, string $image, array $supports, bool $deprecated = false) 29 | { 30 | $this->version = $version; 31 | $this->base = $base; 32 | $this->image = $image; 33 | $this->supports = $supports; 34 | $this->deprecated = $deprecated; 35 | } 36 | 37 | /** 38 | * Get parsed Version. 39 | * 40 | * @return array 41 | */ 42 | public function get(): array 43 | { 44 | return 45 | [ 46 | 'version' => $this->version, 47 | 'base' => $this->base, 48 | 'image' => $this->image, 49 | 'supports' => $this->supports, 50 | 'deprecated' => $this->deprecated, 51 | ]; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/documentation.yaml: -------------------------------------------------------------------------------- 1 | name: "📚 Documentation" 2 | description: "Report an issue related to documentation" 3 | title: "📚 Documentation: " 4 | labels: [documentation] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thanks for taking the time to fill out our documentation update request form 🙏 10 | - type: textarea 11 | id: issue-description 12 | validations: 13 | required: true 14 | attributes: 15 | label: "💭 Description" 16 | description: "A clear and concise description of what the issue is." 17 | placeholder: "Documentation should not ..." 18 | - type: checkboxes 19 | id: no-duplicate-issues 20 | attributes: 21 | label: "👀 Have you spent some time to check if this issue has been raised before?" 22 | description: "Have you Googled for a similar issue or checked our older issues for a similar bug?" 23 | options: 24 | - label: "I checked and didn't find similar issue" 25 | required: true 26 | - type: checkboxes 27 | id: read-code-of-conduct 28 | attributes: 29 | description: "This is our [Code of Conduct](https://github.com/appwrite/appwrite/blob/master/CODE_OF_CONDUCT.md)." 30 | label: "🏢 Have you read the Code of Conduct?" 31 | options: 32 | - label: "I read the Code of Conduct" 33 | required: true -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature.yaml: -------------------------------------------------------------------------------- 1 | name: 🚀 Feature 2 | description: "Submit a proposal for a new feature" 3 | title: "🚀 Feature: " 4 | labels: [feature] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thanks for taking the time to fill out our feature request form 🙏 10 | - type: textarea 11 | id: feature-description 12 | validations: 13 | required: true 14 | attributes: 15 | label: "🔖 Feature description" 16 | description: "A clear and concise description of what the feature is." 17 | placeholder: "You should add ..." 18 | - type: textarea 19 | id: pitch 20 | validations: 21 | required: true 22 | attributes: 23 | label: "🎤 Pitch" 24 | description: "Please explain why this feature should be implemented and how it would be used. Add examples, if applicable." 25 | placeholder: "In my use-case, ..." 26 | - type: checkboxes 27 | id: no-duplicate-issues 28 | attributes: 29 | label: "👀 Have you spent some time to check if this issue has been raised before?" 30 | description: "Have you Googled for a similar issue or checked our older issues for a similar bug?" 31 | options: 32 | - label: "I checked and didn't find similar issue" 33 | required: true 34 | - type: checkboxes 35 | id: read-code-of-conduct 36 | attributes: 37 | label: "🏢 Have you read the Code of Conduct?" 38 | options: 39 | - label: "I have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/HEAD/CODE_OF_CONDUCT.md)" 40 | required: true -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2021, Appwrite 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /src/Runtimes/Runtime.php: -------------------------------------------------------------------------------- 1 | key = $key; 33 | $this->name = $name; 34 | $this->startCommand = $startCommand; 35 | } 36 | 37 | /** 38 | * Get key. 39 | */ 40 | public function getKey(): string 41 | { 42 | return $this->key; 43 | } 44 | 45 | /** 46 | * Adds new version to runtime. 47 | * 48 | * @param string[] $supports 49 | */ 50 | public function addVersion(string $version, string $base, string $image, array $supports, bool $deprecated = false): void 51 | { 52 | $this->versions[] = new Version($version, $base, $image, $supports, $deprecated); 53 | } 54 | 55 | /** 56 | * List runtime with all parsed Versions. 57 | * 58 | * @return array[] 59 | */ 60 | public function list(): array 61 | { 62 | $list = []; 63 | foreach ($this->versions as $version) { 64 | $key = "{$this->key}-{$version->version}"; 65 | $list[$key] = array_merge( 66 | [ 67 | 'key' => $this->key, 68 | 'name' => $this->name, 69 | 'logo' => "{$this->key}.png", 70 | 'startCommand' => $this->startCommand, 71 | ], 72 | $version->get() 73 | ); 74 | } 75 | 76 | return $list; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Appwrite Runtimes 2 | 3 | [![Discord](https://img.shields.io/discord/564160730845151244?label=discord&style=flat-square)](https://appwrite.io/discord?r=Github) 4 | ![Total Downloads](https://img.shields.io/packagist/dt/appwrite/php-runtimes.svg?style=flat-square) 5 | [![Build Status](https://img.shields.io/travis/com/appwrite/php-runtimes?style=flat-square)](https://travis-ci.com/appwrite/php-runtimes) 6 | [![Twitter Account](https://img.shields.io/twitter/follow/appwrite?color=00acee&label=twitter&style=flat-square)](https://twitter.com/appwrite) 7 | 8 | Appwrite repository for Cloud Function runtimes that contains the configurations and tests for all of the Appwrite runtime environments. This library is maintained by the [Appwrite team](https://appwrite.io). 9 | 10 | ## Getting Started 11 | 12 | Install using composer: 13 | ```bash 14 | composer require appwrite/php-runtimes 15 | ``` 16 | 17 | ```php 18 | addVersion('5.0', 'mcr.microsoft.com/dotnet/runtime:5.0-alpine', 'appwrite/env-dotnet-5.0:1.0.0', [System::X86, System::ARM]); 41 | $runtimes[] = $dotnet; 42 | ``` 43 | 44 | ## Contributing 45 | 46 | All code contributions - including those of people having commit access - must go through a pull request and approved by a core developer before being merged. This is to ensure proper review of all the code. 47 | 48 | We truly ❤️ pull requests! If you wish to help, you can learn more about how you can contribute to this project in the [contribution guide](CONTRIBUTING.md). 49 | 50 | ## Authors 51 | 52 | **Torsten Dittmann** 53 | 54 | + [https://twitter.com/dittmanntorsten](https://twitter.com/dittmanntorsten) 55 | + [https://github.com/torstendittmann](https://github.com/torstendittmann) 56 | 57 | ## Copyright and license 58 | 59 | BSD 3-Clause License [https://opensource.org/licenses/BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause) 60 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug.yaml: -------------------------------------------------------------------------------- 1 | name: "🐛 Bug Report" 2 | description: "Submit a bug report to help us improve" 3 | title: "🐛 Bug Report: " 4 | labels: [bug] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thanks for taking the time to fill out our bug report form 🙏 10 | - type: textarea 11 | id: steps-to-reproduce 12 | validations: 13 | required: true 14 | attributes: 15 | label: "👟 Reproduction steps" 16 | description: "How do you trigger this bug? Please walk us through it step by step." 17 | placeholder: "When I ..." 18 | - type: textarea 19 | id: expected-behavior 20 | validations: 21 | required: true 22 | attributes: 23 | label: "👍 Expected behavior" 24 | description: "What did you think would happen?" 25 | placeholder: "It should ..." 26 | - type: textarea 27 | id: actual-behavior 28 | validations: 29 | required: true 30 | attributes: 31 | label: "👎 Actual Behavior" 32 | description: "What did actually happen? Add screenshots, if applicable." 33 | placeholder: "It actually ..." 34 | - type: dropdown 35 | id: php-runtimes-version 36 | attributes: 37 | label: "🎲 PHP Runtimes version" 38 | description: "What version of PHP Runtimes are you running?" 39 | options: 40 | - Version 0.5.x 41 | - Version 0.4.x 42 | - Version 0.3.x 43 | - Version 0.2.x 44 | - Version 0.1.x 45 | - Different version (specify in environment) 46 | validations: 47 | required: true 48 | - type: dropdown 49 | id: operating-system 50 | attributes: 51 | label: "💻 Operating system" 52 | description: "What OS is your server / device running on?" 53 | options: 54 | - Linux 55 | - MacOS 56 | - Windows 57 | - Something else 58 | validations: 59 | required: true 60 | - type: textarea 61 | id: enviromnemt 62 | validations: 63 | required: false 64 | attributes: 65 | label: "🧱 Your Environment" 66 | description: "Is your environment customized in any way?" 67 | placeholder: "I use Cloudflare for ..." 68 | - type: checkboxes 69 | id: no-duplicate-issues 70 | attributes: 71 | label: "👀 Have you spent some time to check if this issue has been raised before?" 72 | description: "Have you Googled for a similar issue or checked our older issues for a similar bug?" 73 | options: 74 | - label: "I checked and didn't find similar issue" 75 | required: true 76 | - type: checkboxes 77 | id: read-code-of-conduct 78 | attributes: 79 | label: "🏢 Have you read the Code of Conduct?" 80 | options: 81 | - label: "I have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/HEAD/CODE_OF_CONDUCT.md)" 82 | required: true -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at team@appwrite.io. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | We would ❤️ for you to contribute to Appwrite and help make it better! As a contributor, here are the guidelines we would like you to follow: 4 | 5 | ## Code of Conduct 6 | 7 | Help us keep Appwrite open and inclusive. Please read and follow our [Code of Conduct](/CODE_OF_CONDUCT.md). 8 | 9 | ## Getting Started 10 | 11 | Install using composer: 12 | ```bash 13 | composer require appwrite/php-runtimes 14 | ``` 15 | 16 | ```php 17 | addVersion('5.0', 'mcr.microsoft.com/dotnet/runtime:5.0-alpine', 'appwrite/env-dotnet-5.0:1.0.0', [System::X86, System::ARM]); 40 | $runtimes[] = $dotnet; 41 | ``` 42 | 43 | ## Function Runtimes Checklist 44 | 45 | The following checklist aims to ensure that a function runtime gets added successfully 46 | 47 | - [ ] Implement the runtime in [open-runtimes/open-runtimes](https://github.com/open-runtimes/open-runtimes) (you can find the tutorial [here](https://github.com/open-runtimes/open-runtimes/blob/main/docs/add-runtime.md)) 48 | - [ ] Prepare the Readme for your new runtime. Make sure to mention the following details 49 | - [ ] Docker base image name + version 50 | - [ ] HTTP server library name 51 | - [ ] Any extra steps needed to get dependencies running (for e.g., `package.json`) 52 | - [ ] Copy the rest of the Readme from another existing runtime 53 | - [ ] Write the runtime 54 | - [ ] Initialize a web server 55 | - Use a library that supports `async/await`, also smaller/simpler libraries are preferred as this is a primitive HTTP server 56 | - [ ] Set Port 3000 57 | - [ ] Bind IP 0.0.0.0 58 | - On each POST Request 59 | - [ ] Check that the `x-internal-challenge header` matches the `INTERNAL_RUNTIME_KEY` environment variable 60 | - [ ] Decode the executor's JSON POST request 61 | - [ ] Make sure to have the right default values for Request body fields ([example](https://github.com/open-runtimes/open-runtimes/blob/main/runtimes/node-16.0/server.js#L14-L18)) 62 | - [ ] env: empty object 63 | - [ ] headers: empty object 64 | - [ ] payload: empty string 65 | - [ ] Create Request Class 66 | - [ ] Fields 67 | - [ ] env 68 | - [ ] payload 69 | - [ ] headers 70 | - [ ] Create Response Class 71 | - [ ] Functions 72 | - [ ] send(string data, int statusCode) 73 | - [ ] json(object data, int statusCode) 74 | - When returning a response, the `Content-Type` header for the `send()` function is `text/plain` and for the `json` function is `application/json` 75 | - [ ] Execute the function 76 | - [ ] Add `try catch` block for error handling 77 | - [ ] Check if the file is missing 78 | - [ ] Check if the method is missing 79 | - [ ] Any other language-specific errors that may occur 80 | - [ ] Write the `build.sh` script 81 | - [ ] Write the `start.sh` script 82 | - [ ] Write the Dockerfile 83 | - [ ] Add the Docker image you want to base your runtime off 84 | - [ ] Create the folders you'll use 85 | - [ ] Copy your source code and set working directory 86 | - [ ] Add execute permissions for any scripts 87 | - [ ] `build.sh` 88 | - [ ] `start.sh` 89 | - [ ] Use `RUN` commands for necessary dependencies (if needed) 90 | - [ ] Expose port 3000 91 | - [ ] Add a `CMD` command for `start.sh` 92 | - [ ] Update `./build.sh` by adding Docker build command for the new runtime 93 | - [ ] Add test 94 | - [ ] Create a PHP file named by the language 95 | - [ ] Create a new folder in `./tests` by the name of your runtime 96 | - [ ] Inside the folder, create a function ([example](https://github.com/open-runtimes/open-runtimes/blob/main/tests/node-16.0/tests.js)) 97 | - [ ] Decode the payload as JSON 98 | - [ ] Set a string variable called `id` to the value of the `id` key in the payload or to `1` if it doesn't exist 99 | - [ ] Fetch `https://jsonplaceholder.typicode.com/todos/$id` with an HTTP Client installed from your language's package manager using the `id` variable 100 | - [ ] return `res.json` 101 | - The test must use an external dependency (either for the HTTP Client or the JSON serializer) in order to prove that the runtime can fetch dependencies 102 | - [ ] Add runtime to Travis CI 103 | - [ ] Edit the `.travis.yml` file and add your runtime to the `env` section 104 | - [ ] Run the test locally 105 | - [ ] Raise a PR 106 | - [ ] Add the runtime to [appwrite/runtimes](https://github.com/appwrite/runtimes) 107 | - [ ] Add runtime support to the CLI in [appwrite/sdk-generator](https://github.com/appwrite/sdk-generator/blob/master/templates/cli/lib/questions.js.twig) 108 | - [ ] Ignored files 109 | - [ ] Entrypoint 110 | - [ ] Create a function starter in [appwrite/functions-starter](https://github.com/appwrite/functions-starter) (ensure that the file structure is same as the entrypoint in the CLI) 111 | -------------------------------------------------------------------------------- /tests/Runtimes/RuntimesTest.php: -------------------------------------------------------------------------------- 1 | */ 11 | public array $tests; 12 | 13 | /** @var Runtimes */ 14 | public $instance; 15 | 16 | /** @var string|false */ 17 | public $functionsDir; 18 | 19 | public function setUp(): void 20 | { 21 | $this->functionsDir = $functionsDir = realpath(__DIR__.'/../resources'); 22 | $this->tests = [ 23 | 'node-14.5' => [ 24 | 'code' => $functionsDir.'/node.tar.gz', 25 | 'command' => 'node index.js', 26 | 'timeout' => 15, 27 | 'runtime' => 'node-14.5', 28 | ], 29 | 'node-16.0' => [ 30 | 'code' => $functionsDir.'/node.tar.gz', 31 | 'command' => 'node index.js', 32 | 'timeout' => 15, 33 | 'runtime' => 'node-16.0', 34 | ], 35 | 'node-18.0' => [ 36 | 'code' => $functionsDir.'/node.tar.gz', 37 | 'command' => 'node index.js', 38 | 'timeout' => 15, 39 | 'runtime' => 'node-18.0', 40 | ], 41 | 'php-8.0' => [ 42 | 'code' => $functionsDir.'/php.tar.gz', 43 | 'command' => 'php index.php', 44 | 'timeout' => 15, 45 | 'runtime' => 'php-8.0', 46 | ], 47 | 'ruby-2.7' => [ 48 | 'code' => $functionsDir.'/ruby.tar.gz', 49 | 'command' => 'ruby app.rb', 50 | 'timeout' => 15, 51 | 'runtime' => 'ruby-2.7', 52 | ], 53 | 'ruby-3.0' => [ 54 | 'code' => $functionsDir.'/ruby.tar.gz', 55 | 'command' => 'ruby app.rb', 56 | 'timeout' => 15, 57 | 'runtime' => 'ruby-3.0', 58 | ], 59 | 'python-3.8' => [ 60 | 'code' => $functionsDir.'/python.tar.gz', 61 | 'command' => 'python main.py', 62 | 'timeout' => 15, 63 | 'runtime' => 'python-3.8', 64 | ], 65 | 'python-3.9' => [ 66 | 'code' => $functionsDir.'/python.tar.gz', 67 | 'command' => 'python main.py', 68 | 'timeout' => 15, 69 | 'runtime' => 'python-3.9', 70 | ], 71 | 'deno-1.21' => [ 72 | 'code' => $functionsDir.'/deno.tar.gz', 73 | 'command' => 'deno run --allow-env index.ts', 74 | 'timeout' => 15, 75 | 'runtime' => 'deno-1.21', 76 | ], 77 | 'deno-1.24' => [ 78 | 'code' => $functionsDir.'/deno.tar.gz', 79 | 'command' => 'deno run --allow-env index.ts', 80 | 'timeout' => 15, 81 | 'runtime' => 'deno-1.24', 82 | ], 83 | 'dart-2.15' => [ 84 | 'code' => $functionsDir.'/dart.tar.gz', 85 | 'command' => 'dart main.dart', 86 | 'timeout' => 15, 87 | 'runtime' => 'dart-2.15', 88 | ], 89 | 'dart-2.16' => [ 90 | 'code' => $functionsDir.'/dart.tar.gz', 91 | 'command' => 'dart main.dart', 92 | 'timeout' => 15, 93 | 'runtime' => 'dart-2.16', 94 | ], 95 | 'dart-2.17' => [ 96 | 'code' => $functionsDir.'/dart.tar.gz', 97 | 'command' => 'dart main.dart', 98 | 'timeout' => 15, 99 | 'runtime' => 'dart-2.17', 100 | ], 101 | 'dotnet-3.1' => [ 102 | 'code' => $functionsDir.'/dotnet-3.1.tar.gz', 103 | 'command' => 'dotnet dotnet.dll', 104 | 'timeout' => 15, 105 | 'runtime' => 'dotnet-3.1', 106 | ], 107 | 'dotnet-6.0' => [ 108 | 'code' => $functionsDir.'/dotnet-6.0.tar.gz', 109 | 'command' => 'dotnet dotnet.dll', 110 | 'timeout' => 15, 111 | 'runtime' => 'dotnet-6.0', 112 | ], 113 | 'java-8.0' => [ 114 | 'code' => $functionsDir.'/java-8.tar.gz', 115 | 'command' => 'java HelloWorld', 116 | 'timeout' => 15, 117 | 'runtime' => 'java-8.0', 118 | ], 119 | 'java-11.0' => [ 120 | 'code' => $functionsDir.'/java-11.tar.gz', 121 | 'command' => 'java HelloWorld', 122 | 'timeout' => 15, 123 | 'runtime' => 'java-11.0', 124 | ], 125 | 'java-17.0' => [ 126 | 'code' => $functionsDir.'/java-17.tar.gz', 127 | 'command' => 'java HelloWorld', 128 | 'timeout' => 15, 129 | 'runtime' => 'java-17.0', 130 | ], 131 | 'java-18.0' => [ 132 | 'code' => $functionsDir.'/java-17.tar.gz', 133 | 'command' => 'java HelloWorld', 134 | 'timeout' => 15, 135 | 'runtime' => 'java-18.0', 136 | ], 137 | 'kotlin-1.6' => [ 138 | 'code' => $functionsDir.'/kotlin.tar.gz', 139 | 'command' => 'kotlin HelloWorld', 140 | 'timeout' => 15, 141 | 'runtime' => 'kotlin-1.6', 142 | ], 143 | 'cpp-17.0' => [ 144 | 'code' => $functionsDir.'/cpp.tar.gz', 145 | 'command' => './HelloWorld', 146 | 'timeout' => 15, 147 | 'runtime' => 'cpp-17.0', 148 | ], 149 | ]; 150 | $this->instance = new Runtimes('v1'); 151 | $this->tests = array_filter($this->tests, function ($test) { 152 | return array_key_exists($test['runtime'], $this->instance->getAll()); 153 | }); 154 | } 155 | 156 | public function tearDown(): void 157 | { 158 | } 159 | 160 | public function testSupportedRuntimes(): void 161 | { 162 | $this->assertNotEmpty($this->instance->get('node')); 163 | $this->assertNotEmpty($this->instance->getAll()); 164 | $this->assertNotEmpty($this->instance->getAll(supported: false)); 165 | $this->assertCount(1, $this->instance->getAll(filter: ['node-14.5'])); 166 | $this->assertCount(1, $this->instance->getAll(filter: ['node-14.5', 'unknown'])); 167 | $this->assertCount(2, $this->instance->getAll(filter: ['node-14.5', 'node-16.0'])); 168 | } 169 | 170 | public function testDeprecatedRuntimes(): void 171 | { 172 | $versions = $this->instance->getAll(); 173 | $nodeDeprecated = $versions['node-14.5']; 174 | $this->assertArrayHasKey('deprecated', $nodeDeprecated); 175 | $this->assertTrue($nodeDeprecated['deprecated']); 176 | 177 | $nodeNonDeprecated = $versions['node-22']; 178 | $this->assertArrayHasKey('deprecated', $nodeNonDeprecated); 179 | $this->assertFalse($nodeNonDeprecated['deprecated']); 180 | 181 | $runtime = $this->instance->get('node'); 182 | $this->assertArrayHasKey('deprecated', $runtime->list()["node-14.5"]); 183 | $this->assertArrayHasKey('deprecated', $runtime->list()["node-22"]); 184 | 185 | $versions = $this->instance->getAll(deprecated: false); 186 | $this->assertArrayNotHasKey('node-14.5', $versions); 187 | } 188 | 189 | public function testGetRuntimes(): void 190 | { 191 | foreach ($this->instance->getAll() as $runtime) { 192 | $this->assertArrayHasKey('name', $runtime, $runtime['name']); 193 | $this->assertArrayHasKey('version', $runtime, $runtime['name']); 194 | $this->assertArrayHasKey('base', $runtime, $runtime['name']); 195 | $this->assertArrayHasKey('image', $runtime, $runtime['name']); 196 | $this->assertArrayHasKey('logo', $runtime, $runtime['name']); 197 | $this->assertArrayHasKey('supports', $runtime, $runtime['name']); 198 | $this->assertStringContainsString('v1-', $runtime['image']); 199 | 200 | $this->assertIsArray($runtime['supports']); 201 | $this->assertNotEmpty($runtime['supports']); 202 | } 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /src/Runtimes/Runtimes.php: -------------------------------------------------------------------------------- 1 | */ 32 | protected $runtimes = []; 33 | 34 | protected string $version; 35 | 36 | /** 37 | * Runtimes. 38 | */ 39 | public function __construct(string $version = '') 40 | { 41 | $this->version = $version; 42 | 43 | $node = new Runtime('node', 'Node.js', 'bash helpers/server.sh'); 44 | $node->addVersion('14.5', 'node:14.5.0-alpine3.12', 'openruntimes/node:'.$this->version.'-14.5', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); # Deprecated since April 30, 2023 45 | $node->addVersion('16.0', 'node:16.20.2-alpine3.18', 'openruntimes/node:'.$this->version.'-16.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); # Deprecated since September 11, 2023 46 | $node->addVersion('18.0', 'node:18.20.4-alpine3.20', 'openruntimes/node:'.$this->version.'-18.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 47 | $node->addVersion('19.0', 'node:19.9.0-alpine3.18', 'openruntimes/node:'.$this->version.'-19.0', [System::X86, System::ARM64]); 48 | $node->addVersion('20.0', 'node:20.17.0-alpine3.20', 'openruntimes/node:'.$this->version.'-20.0', [System::X86, System::ARM64]); 49 | $node->addVersion('21.0', 'node:21.7.3-alpine3.20', 'openruntimes/node:'.$this->version.'-21.0', [System::X86, System::ARM64]); 50 | $node->addVersion('22', 'node:22.9.0-alpine3.20', 'openruntimes/node:'.$this->version.'-22', [System::X86, System::ARM64]); 51 | $this->runtimes['node'] = $node; 52 | 53 | $php = new Runtime('php', 'PHP', 'bash helpers/server.sh'); 54 | $php->addVersion('8.0', 'php:8.0.30-cli-alpine3.16', 'openruntimes/php:'.$this->version.'-8.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); # Deprecated since November 26, 2023 55 | $php->addVersion('8.1', 'php:8.1.30-cli-alpine3.20', 'openruntimes/php:'.$this->version.'-8.1', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 56 | $php->addVersion('8.2', 'php:8.2.24-cli-alpine3.20', 'openruntimes/php:'.$this->version.'-8.2', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 57 | $php->addVersion('8.3', 'php:8.3.12-cli-alpine3.20', 'openruntimes/php:'.$this->version.'-8.3', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 58 | $this->runtimes['php'] = $php; 59 | 60 | $ruby = new Runtime('ruby', 'Ruby', 'bash helpers/server.sh'); 61 | $ruby->addVersion('3.0', 'ruby:3.0.7-alpine3.16', 'openruntimes/ruby:'.$this->version.'-3.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); # Deprecated since April 23, 2024 62 | $ruby->addVersion('3.1', 'ruby:3.1.6-alpine3.20', 'openruntimes/ruby:'.$this->version.'-3.1', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 63 | $ruby->addVersion('3.2', 'ruby:3.2.5-alpine3.20', 'openruntimes/ruby:'.$this->version.'-3.2', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 64 | $ruby->addVersion('3.3', 'ruby:3.3.5-alpine3.20', 'openruntimes/ruby:'.$this->version.'-3.3', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 65 | $this->runtimes['ruby'] = $ruby; 66 | 67 | $python = new Runtime('python', 'Python', 'bash helpers/server.sh'); 68 | $python->addVersion('3.8', 'python:3.8.20-alpine3.20', 'openruntimes/python:'.$this->version.'-3.8', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); // Deprecated since October 7, 2024 69 | $python->addVersion('3.9', 'python:3.9.20-alpine3.20', 'openruntimes/python:'.$this->version.'-3.9', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 70 | $python->addVersion('3.10', 'python:3.10.15-alpine3.20', 'openruntimes/python:'.$this->version.'-3.10', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 71 | $python->addVersion('3.11', 'python:3.11.10-alpine3.20', 'openruntimes/python:'.$this->version.'-3.11', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 72 | $python->addVersion('3.12', 'python:3.12.6-alpine3.20', 'openruntimes/python:'.$this->version.'-3.12', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 73 | $this->runtimes['python'] = $python; 74 | 75 | $pythonML = new Runtime('python-ml', 'Python (ML)', 'bash helpers/server.sh'); 76 | $pythonML->addVersion('3.11', 'python:3.11.10-bookworm', 'openruntimes/python-ml:'.$this->version.'-3.11', [System::X86, System::ARM64]); 77 | $pythonML->addVersion('3.12', 'python:3.12.6-bookworm', 'openruntimes/python-ml:'.$this->version.'-3.12', [System::X86, System::ARM64]); 78 | $this->runtimes['python-ml'] = $pythonML; 79 | 80 | $deno = new Runtime('deno', 'Deno', 'bash helpers/server.sh'); 81 | $deno->addVersion('1.21', 'denoland/deno:alpine-1.21.3', 'openruntimes/deno:'.$this->version.'-1.21', [System::X86], true); 82 | $deno->addVersion('1.24', 'denoland/deno:alpine-1.24.3', 'openruntimes/deno:'.$this->version.'-1.24', [System::X86], true); 83 | $deno->addVersion('1.35', 'denoland/deno:alpine-1.35.3', 'openruntimes/deno:'.$this->version.'-1.35', [System::X86], true); 84 | $deno->addVersion('1.40', 'denoland/deno:alpine-1.40.5', 'openruntimes/deno:'.$this->version.'-1.40', [System::X86, System::ARM64]); 85 | $deno->addVersion('1.46', 'denoland/deno:alpine-1.46.3', 'openruntimes/deno:'.$this->version.'-1.46', [System::X86, System::ARM64]); 86 | $deno->addVersion('2.0', 'denoland/deno:alpine-2.0.0-rc.5', 'openruntimes/deno:'.$this->version.'-2.0', [System::X86, System::ARM64]); 87 | $this->runtimes['deno'] = $deno; 88 | 89 | $dart = new Runtime('dart', 'Dart', 'bash helpers/server.sh'); 90 | $dart->addVersion('2.15', 'dart:2.15.1', 'openruntimes/dart:'.$this->version.'-2.15', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); 91 | $dart->addVersion('2.16', 'dart:2.16.2', 'openruntimes/dart:'.$this->version.'-2.16', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); 92 | $dart->addVersion('2.17', 'dart:2.17.7', 'openruntimes/dart:'.$this->version.'-2.17', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); 93 | $dart->addVersion('2.18', 'dart:2.18.7', 'openruntimes/dart:'.$this->version.'-2.18', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 94 | $dart->addVersion('2.19', 'dart:2.19.6', 'openruntimes/dart:'.$this->version.'-2.19', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 95 | $dart->addVersion('3.0', 'dart:3.0.7', 'openruntimes/dart:'.$this->version.'-3.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 96 | $dart->addVersion('3.1', 'dart:3.1.5', 'openruntimes/dart:'.$this->version.'-3.1', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 97 | $dart->addVersion('3.3', 'dart:3.3.4', 'openruntimes/dart:'.$this->version.'-3.3', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 98 | $dart->addVersion('3.5', 'dart:3.5.2', 'openruntimes/dart:'.$this->version.'-3.5', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 99 | $dart->addVersion('3.8', 'dart:3.8', 'openruntimes/dart:'.$this->version.'-3.8', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 100 | $dart->addVersion('3.9', 'dart:3.9.3', 'openruntimes/dart:'.$this->version.'-3.9', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 101 | $dart->addVersion('3.10', 'dart:3.10.0', 'openruntimes/dart:'.$this->version.'-3.10', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 102 | $this->runtimes['dart'] = $dart; 103 | 104 | $dotnet = new Runtime('dotnet', '.NET', 'bash helpers/server.sh'); 105 | $dotnet->addVersion('6.0', 'mcr.microsoft.com/dotnet/sdk:6.0.425-alpine3.19', 'openruntimes/dotnet:'.$this->version.'-6.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); // Deprecated since November 12, 2024 106 | $dotnet->addVersion('7.0', 'mcr.microsoft.com/dotnet/sdk:7.0.410-alpine3.19', 'openruntimes/dotnet:'.$this->version.'-7.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); // Deprecated since May 14, 2024 107 | $dotnet->addVersion('8.0', 'mcr.microsoft.com/dotnet/sdk:8.0.402-alpine3.19', 'openruntimes/dotnet:'.$this->version.'-8.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 108 | $this->runtimes['dotnet'] = $dotnet; 109 | 110 | $java = new Runtime('java', 'Java', 'bash helpers/server.sh'); 111 | $java->addVersion('8.0', 'eclipse-temurin:8-jdk-jammy', 'openruntimes/java:'.$this->version.'-8.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 112 | $java->addVersion('11.0', 'eclipse-temurin:11-jdk-jammy', 'openruntimes/java:'.$this->version.'-11.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 113 | $java->addVersion('17.0', 'eclipse-temurin:17-jdk-jammy', 'openruntimes/java:'.$this->version.'-17.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 114 | $java->addVersion('18.0', 'eclipse-temurin:18-jdk-jammy', 'openruntimes/java:'.$this->version.'-18.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); // Deprecated since September 20, 2022 115 | $java->addVersion('21.0', 'eclipse-temurin:21-jdk-jammy', 'openruntimes/java:'.$this->version.'-21.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 116 | $java->addVersion('22', 'eclipse-temurin:22-jdk-jammy', 'openruntimes/java:'.$this->version.'-22', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); // Technically deprecated, but latest. Keeping active 117 | $this->runtimes['java'] = $java; 118 | 119 | $swift = new Runtime('swift', 'Swift', 'bash helpers/server.sh'); 120 | $swift->addVersion('5.5', 'swiftarm/swift:5.5.3-ubuntu-jammy', 'openruntimes/swift:'.$this->version.'-5.5', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); 121 | $swift->addVersion('5.8', 'swiftarm/swift:5.8.1-ubuntu-22.04', 'openruntimes/swift:'.$this->version.'-5.8', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 122 | $swift->addVersion('5.9', 'swiftarm/swift:5.9.2-ubuntu-22.04', 'openruntimes/swift:'.$this->version.'-5.9', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 123 | $swift->addVersion('5.10', 'swiftarm/swift:5.10-ubuntu-22.04', 'openruntimes/swift:'.$this->version.'-5.10', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 124 | $this->runtimes['swift'] = $swift; 125 | 126 | $kotlin = new Runtime('kotlin', 'Kotlin', 'bash helpers/server.sh'); 127 | $kotlin->addVersion('1.6', 'eclipse-temurin:18-jdk-alpine', 'openruntimes/kotlin:'.$this->version.'-1.6', [System::X86, System::ARM64, System::ARMV7, System::ARMV8], true); 128 | $kotlin->addVersion('1.8', 'eclipse-temurin:19-jdk-alpine', 'openruntimes/kotlin:'.$this->version.'-1.8', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 129 | $kotlin->addVersion('1.9', 'eclipse-temurin:19-jdk-alpine', 'openruntimes/kotlin:'.$this->version.'-1.9', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 130 | $kotlin->addVersion('2.0', 'eclipse-temurin:22-jdk-alpine', 'openruntimes/kotlin:'.$this->version.'-2.0', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 131 | $this->runtimes['kotlin'] = $kotlin; 132 | 133 | $cpp = new Runtime('cpp', 'C++', 'bash helpers/server.sh'); 134 | $cpp->addVersion('17', 'alpine:3.20.2', 'openruntimes/cpp:'.$this->version.'-17', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 135 | $cpp->addVersion('20', 'alpine:3.20.2', 'openruntimes/cpp:'.$this->version.'-20', [System::X86, System::ARM64, System::ARMV7, System::ARMV8]); 136 | $this->runtimes['cpp'] = $cpp; 137 | 138 | $bun = new Runtime('bun', 'Bun', 'bash helpers/server.sh'); 139 | $bun->addVersion('1.0', 'oven/bun:1.0.36-alpine', 'openruntimes/bun:'.$this->version.'-1.0', [System::X86, System::ARM64]); 140 | $bun->addVersion('1.1', 'oven/bun:1.1.29-alpine', 'openruntimes/bun:'.$this->version.'-1.1', [System::X86, System::ARM64]); 141 | $this->runtimes['bun'] = $bun; 142 | 143 | $go = new Runtime('go', 'Go', 'bash helpers/server.sh'); 144 | $go->addVersion('1.23', 'golang:1.23.1-alpine3.20', 'openruntimes/go:'.$this->version.'-1.23', [System::X86, System::ARM64]); 145 | $this->runtimes['go'] = $go; 146 | 147 | $static = new Runtime('static', 'Static', 'bash helpers/server.sh'); 148 | $static->addVersion('1', 'joseluisq/static-web-server:2.33-alpine', 'openruntimes/static:'.$this->version.'-1', [System::X86, System::ARM64]); 149 | $this->runtimes['static'] = $static; 150 | 151 | $flutter = new Runtime('flutter', 'Flutter', 'bash helpers/server.sh'); 152 | $flutter->addVersion('3.24', 'ghcr.io/cirruslabs/flutter:3.24.5', 'openruntimes/flutter:'.$this->version.'-3.24', [System::X86, System::ARM64]); 153 | $flutter->addVersion('3.27', 'ghcr.io/cirruslabs/flutter:3.27.3', 'openruntimes/flutter:'.$this->version.'-3.27', [System::X86, System::ARM64]); 154 | $flutter->addVersion('3.29', 'ghcr.io/cirruslabs/flutter:3.29.1', 'openruntimes/flutter:'.$this->version.'-3.29', [System::X86, System::ARM64]); 155 | $flutter->addVersion('3.32', 'ghcr.io/cirruslabs/flutter:3.32.0', 'openruntimes/flutter:'.$this->version.'-3.32', [System::X86, System::ARM64]); 156 | $flutter->addVersion('3.35', 'ghcr.io/cirruslabs/flutter:3.35.7', 'openruntimes/flutter:'.$this->version.'-3.35', [System::X86, System::ARM64]); 157 | $flutter->addVersion('3.38', 'ghcr.io/cirruslabs/flutter:3.38.0', 'openruntimes/flutter:'.$this->version.'-3.38', [System::X86, System::ARM64]); 158 | $this->runtimes['flutter'] = $flutter; 159 | } 160 | 161 | /** 162 | * Adds runtime. 163 | */ 164 | public function add(Runtime $runtime): void 165 | { 166 | $this->runtimes[$runtime->getKey()] = $runtime; 167 | } 168 | 169 | /** 170 | * Get Runtime by key. 171 | */ 172 | public function get(string $key): Runtime 173 | { 174 | if (! array_key_exists($key, $this->runtimes)) { 175 | throw new Exception('Runtime not found!'); 176 | } 177 | 178 | return $this->runtimes[$key]; 179 | } 180 | 181 | /** 182 | * Returns all supported runtimes. 183 | * 184 | * @param bool $supported Pass `false` to also return unsupported CPU architecture. 185 | * @param bool $deprecated Pass `false` to filter out deprecated versions from runtimes 186 | * @param array $filter 187 | * @return array 188 | */ 189 | public function getAll(bool $supported = true, array $filter = [], $deprecated = true): array 190 | { 191 | $supportedRuntimes = []; 192 | 193 | foreach ($this->runtimes as $runtime) { 194 | $supportedRuntimes = array_merge(array_reverse(array_filter($runtime->list(), function (array $version, string $key) use ($supported, $filter, $deprecated) { 195 | $isSupported = in_array(System::getArchEnum(), $version['supports']); 196 | $isFiltered = in_array($key, $filter); 197 | $isDeprecated = $version['deprecated']; 198 | 199 | // Apply supported filter 200 | if ($supported && !$isSupported) { 201 | return false; 202 | } 203 | 204 | // Apply version filter 205 | if (\count($filter) > 0 && !$isFiltered) { 206 | return false; 207 | } 208 | 209 | // Apply deprecation filter 210 | if (!$deprecated && $isDeprecated) { 211 | return false; 212 | } 213 | 214 | return true; 215 | }, ARRAY_FILTER_USE_BOTH)), $supportedRuntimes); 216 | } 217 | 218 | return array_reverse($supportedRuntimes); 219 | } 220 | } 221 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "bc349a81b82b1f738aef574c1d5442ea", 8 | "packages": [ 9 | { 10 | "name": "utopia-php/system", 11 | "version": "0.9.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/utopia-php/system.git", 15 | "reference": "8e4a7edaf2dfeb4c9524e9f766d27754f2c4b64d" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/utopia-php/system/zipball/8e4a7edaf2dfeb4c9524e9f766d27754f2c4b64d", 20 | "reference": "8e4a7edaf2dfeb4c9524e9f766d27754f2c4b64d", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=8.0.0" 25 | }, 26 | "require-dev": { 27 | "laravel/pint": "1.13.*", 28 | "phpstan/phpstan": "1.10.*", 29 | "phpunit/phpunit": "9.6.*" 30 | }, 31 | "type": "library", 32 | "autoload": { 33 | "psr-4": { 34 | "Utopia\\System\\": "src/System" 35 | } 36 | }, 37 | "notification-url": "https://packagist.org/downloads/", 38 | "license": [ 39 | "MIT" 40 | ], 41 | "authors": [ 42 | { 43 | "name": "Eldad Fux", 44 | "email": "eldad@appwrite.io" 45 | }, 46 | { 47 | "name": "Torsten Dittmann", 48 | "email": "torsten@appwrite.io" 49 | } 50 | ], 51 | "description": "A simple library for obtaining information about the host's system.", 52 | "keywords": [ 53 | "framework", 54 | "php", 55 | "system", 56 | "upf", 57 | "utopia" 58 | ], 59 | "support": { 60 | "issues": "https://github.com/utopia-php/system/issues", 61 | "source": "https://github.com/utopia-php/system/tree/0.9.0" 62 | }, 63 | "time": "2024-10-09T14:44:01+00:00" 64 | } 65 | ], 66 | "packages-dev": [ 67 | { 68 | "name": "doctrine/instantiator", 69 | "version": "2.0.0", 70 | "source": { 71 | "type": "git", 72 | "url": "https://github.com/doctrine/instantiator.git", 73 | "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" 74 | }, 75 | "dist": { 76 | "type": "zip", 77 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", 78 | "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", 79 | "shasum": "" 80 | }, 81 | "require": { 82 | "php": "^8.1" 83 | }, 84 | "require-dev": { 85 | "doctrine/coding-standard": "^11", 86 | "ext-pdo": "*", 87 | "ext-phar": "*", 88 | "phpbench/phpbench": "^1.2", 89 | "phpstan/phpstan": "^1.9.4", 90 | "phpstan/phpstan-phpunit": "^1.3", 91 | "phpunit/phpunit": "^9.5.27", 92 | "vimeo/psalm": "^5.4" 93 | }, 94 | "type": "library", 95 | "autoload": { 96 | "psr-4": { 97 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 98 | } 99 | }, 100 | "notification-url": "https://packagist.org/downloads/", 101 | "license": [ 102 | "MIT" 103 | ], 104 | "authors": [ 105 | { 106 | "name": "Marco Pivetta", 107 | "email": "ocramius@gmail.com", 108 | "homepage": "https://ocramius.github.io/" 109 | } 110 | ], 111 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 112 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 113 | "keywords": [ 114 | "constructor", 115 | "instantiate" 116 | ], 117 | "support": { 118 | "issues": "https://github.com/doctrine/instantiator/issues", 119 | "source": "https://github.com/doctrine/instantiator/tree/2.0.0" 120 | }, 121 | "funding": [ 122 | { 123 | "url": "https://www.doctrine-project.org/sponsorship.html", 124 | "type": "custom" 125 | }, 126 | { 127 | "url": "https://www.patreon.com/phpdoctrine", 128 | "type": "patreon" 129 | }, 130 | { 131 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 132 | "type": "tidelift" 133 | } 134 | ], 135 | "time": "2022-12-30T00:23:10+00:00" 136 | }, 137 | { 138 | "name": "laravel/pint", 139 | "version": "v1.18.2", 140 | "source": { 141 | "type": "git", 142 | "url": "https://github.com/laravel/pint.git", 143 | "reference": "f55daaf7eb6c2f49ddf6702fb42e3091c64d8a64" 144 | }, 145 | "dist": { 146 | "type": "zip", 147 | "url": "https://api.github.com/repos/laravel/pint/zipball/f55daaf7eb6c2f49ddf6702fb42e3091c64d8a64", 148 | "reference": "f55daaf7eb6c2f49ddf6702fb42e3091c64d8a64", 149 | "shasum": "" 150 | }, 151 | "require": { 152 | "ext-json": "*", 153 | "ext-mbstring": "*", 154 | "ext-tokenizer": "*", 155 | "ext-xml": "*", 156 | "php": "^8.1.0" 157 | }, 158 | "require-dev": { 159 | "friendsofphp/php-cs-fixer": "^3.64.0", 160 | "illuminate/view": "^10.48.20", 161 | "larastan/larastan": "^2.9.8", 162 | "laravel-zero/framework": "^10.4.0", 163 | "mockery/mockery": "^1.6.12", 164 | "nunomaduro/termwind": "^1.15.1", 165 | "pestphp/pest": "^2.35.1" 166 | }, 167 | "bin": [ 168 | "builds/pint" 169 | ], 170 | "type": "project", 171 | "autoload": { 172 | "psr-4": { 173 | "App\\": "app/", 174 | "Database\\Seeders\\": "database/seeders/", 175 | "Database\\Factories\\": "database/factories/" 176 | } 177 | }, 178 | "notification-url": "https://packagist.org/downloads/", 179 | "license": [ 180 | "MIT" 181 | ], 182 | "authors": [ 183 | { 184 | "name": "Nuno Maduro", 185 | "email": "enunomaduro@gmail.com" 186 | } 187 | ], 188 | "description": "An opinionated code formatter for PHP.", 189 | "homepage": "https://laravel.com", 190 | "keywords": [ 191 | "format", 192 | "formatter", 193 | "lint", 194 | "linter", 195 | "php" 196 | ], 197 | "support": { 198 | "issues": "https://github.com/laravel/pint/issues", 199 | "source": "https://github.com/laravel/pint" 200 | }, 201 | "time": "2024-11-20T09:33:46+00:00" 202 | }, 203 | { 204 | "name": "myclabs/deep-copy", 205 | "version": "1.12.1", 206 | "source": { 207 | "type": "git", 208 | "url": "https://github.com/myclabs/DeepCopy.git", 209 | "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" 210 | }, 211 | "dist": { 212 | "type": "zip", 213 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", 214 | "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", 215 | "shasum": "" 216 | }, 217 | "require": { 218 | "php": "^7.1 || ^8.0" 219 | }, 220 | "conflict": { 221 | "doctrine/collections": "<1.6.8", 222 | "doctrine/common": "<2.13.3 || >=3 <3.2.2" 223 | }, 224 | "require-dev": { 225 | "doctrine/collections": "^1.6.8", 226 | "doctrine/common": "^2.13.3 || ^3.2.2", 227 | "phpspec/prophecy": "^1.10", 228 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 229 | }, 230 | "type": "library", 231 | "autoload": { 232 | "files": [ 233 | "src/DeepCopy/deep_copy.php" 234 | ], 235 | "psr-4": { 236 | "DeepCopy\\": "src/DeepCopy/" 237 | } 238 | }, 239 | "notification-url": "https://packagist.org/downloads/", 240 | "license": [ 241 | "MIT" 242 | ], 243 | "description": "Create deep copies (clones) of your objects", 244 | "keywords": [ 245 | "clone", 246 | "copy", 247 | "duplicate", 248 | "object", 249 | "object graph" 250 | ], 251 | "support": { 252 | "issues": "https://github.com/myclabs/DeepCopy/issues", 253 | "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" 254 | }, 255 | "funding": [ 256 | { 257 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 258 | "type": "tidelift" 259 | } 260 | ], 261 | "time": "2024-11-08T17:47:46+00:00" 262 | }, 263 | { 264 | "name": "nikic/php-parser", 265 | "version": "v5.3.1", 266 | "source": { 267 | "type": "git", 268 | "url": "https://github.com/nikic/PHP-Parser.git", 269 | "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" 270 | }, 271 | "dist": { 272 | "type": "zip", 273 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", 274 | "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", 275 | "shasum": "" 276 | }, 277 | "require": { 278 | "ext-ctype": "*", 279 | "ext-json": "*", 280 | "ext-tokenizer": "*", 281 | "php": ">=7.4" 282 | }, 283 | "require-dev": { 284 | "ircmaxell/php-yacc": "^0.0.7", 285 | "phpunit/phpunit": "^9.0" 286 | }, 287 | "bin": [ 288 | "bin/php-parse" 289 | ], 290 | "type": "library", 291 | "extra": { 292 | "branch-alias": { 293 | "dev-master": "5.0-dev" 294 | } 295 | }, 296 | "autoload": { 297 | "psr-4": { 298 | "PhpParser\\": "lib/PhpParser" 299 | } 300 | }, 301 | "notification-url": "https://packagist.org/downloads/", 302 | "license": [ 303 | "BSD-3-Clause" 304 | ], 305 | "authors": [ 306 | { 307 | "name": "Nikita Popov" 308 | } 309 | ], 310 | "description": "A PHP parser written in PHP", 311 | "keywords": [ 312 | "parser", 313 | "php" 314 | ], 315 | "support": { 316 | "issues": "https://github.com/nikic/PHP-Parser/issues", 317 | "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" 318 | }, 319 | "time": "2024-10-08T18:51:32+00:00" 320 | }, 321 | { 322 | "name": "phar-io/manifest", 323 | "version": "2.0.4", 324 | "source": { 325 | "type": "git", 326 | "url": "https://github.com/phar-io/manifest.git", 327 | "reference": "54750ef60c58e43759730615a392c31c80e23176" 328 | }, 329 | "dist": { 330 | "type": "zip", 331 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", 332 | "reference": "54750ef60c58e43759730615a392c31c80e23176", 333 | "shasum": "" 334 | }, 335 | "require": { 336 | "ext-dom": "*", 337 | "ext-libxml": "*", 338 | "ext-phar": "*", 339 | "ext-xmlwriter": "*", 340 | "phar-io/version": "^3.0.1", 341 | "php": "^7.2 || ^8.0" 342 | }, 343 | "type": "library", 344 | "extra": { 345 | "branch-alias": { 346 | "dev-master": "2.0.x-dev" 347 | } 348 | }, 349 | "autoload": { 350 | "classmap": [ 351 | "src/" 352 | ] 353 | }, 354 | "notification-url": "https://packagist.org/downloads/", 355 | "license": [ 356 | "BSD-3-Clause" 357 | ], 358 | "authors": [ 359 | { 360 | "name": "Arne Blankerts", 361 | "email": "arne@blankerts.de", 362 | "role": "Developer" 363 | }, 364 | { 365 | "name": "Sebastian Heuer", 366 | "email": "sebastian@phpeople.de", 367 | "role": "Developer" 368 | }, 369 | { 370 | "name": "Sebastian Bergmann", 371 | "email": "sebastian@phpunit.de", 372 | "role": "Developer" 373 | } 374 | ], 375 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 376 | "support": { 377 | "issues": "https://github.com/phar-io/manifest/issues", 378 | "source": "https://github.com/phar-io/manifest/tree/2.0.4" 379 | }, 380 | "funding": [ 381 | { 382 | "url": "https://github.com/theseer", 383 | "type": "github" 384 | } 385 | ], 386 | "time": "2024-03-03T12:33:53+00:00" 387 | }, 388 | { 389 | "name": "phar-io/version", 390 | "version": "3.2.1", 391 | "source": { 392 | "type": "git", 393 | "url": "https://github.com/phar-io/version.git", 394 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 395 | }, 396 | "dist": { 397 | "type": "zip", 398 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 399 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 400 | "shasum": "" 401 | }, 402 | "require": { 403 | "php": "^7.2 || ^8.0" 404 | }, 405 | "type": "library", 406 | "autoload": { 407 | "classmap": [ 408 | "src/" 409 | ] 410 | }, 411 | "notification-url": "https://packagist.org/downloads/", 412 | "license": [ 413 | "BSD-3-Clause" 414 | ], 415 | "authors": [ 416 | { 417 | "name": "Arne Blankerts", 418 | "email": "arne@blankerts.de", 419 | "role": "Developer" 420 | }, 421 | { 422 | "name": "Sebastian Heuer", 423 | "email": "sebastian@phpeople.de", 424 | "role": "Developer" 425 | }, 426 | { 427 | "name": "Sebastian Bergmann", 428 | "email": "sebastian@phpunit.de", 429 | "role": "Developer" 430 | } 431 | ], 432 | "description": "Library for handling version information and constraints", 433 | "support": { 434 | "issues": "https://github.com/phar-io/version/issues", 435 | "source": "https://github.com/phar-io/version/tree/3.2.1" 436 | }, 437 | "time": "2022-02-21T01:04:05+00:00" 438 | }, 439 | { 440 | "name": "phpstan/phpstan", 441 | "version": "1.12.11", 442 | "source": { 443 | "type": "git", 444 | "url": "https://github.com/phpstan/phpstan.git", 445 | "reference": "0d1fc20a962a91be578bcfe7cf939e6e1a2ff733" 446 | }, 447 | "dist": { 448 | "type": "zip", 449 | "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0d1fc20a962a91be578bcfe7cf939e6e1a2ff733", 450 | "reference": "0d1fc20a962a91be578bcfe7cf939e6e1a2ff733", 451 | "shasum": "" 452 | }, 453 | "require": { 454 | "php": "^7.2|^8.0" 455 | }, 456 | "conflict": { 457 | "phpstan/phpstan-shim": "*" 458 | }, 459 | "bin": [ 460 | "phpstan", 461 | "phpstan.phar" 462 | ], 463 | "type": "library", 464 | "autoload": { 465 | "files": [ 466 | "bootstrap.php" 467 | ] 468 | }, 469 | "notification-url": "https://packagist.org/downloads/", 470 | "license": [ 471 | "MIT" 472 | ], 473 | "description": "PHPStan - PHP Static Analysis Tool", 474 | "keywords": [ 475 | "dev", 476 | "static analysis" 477 | ], 478 | "support": { 479 | "docs": "https://phpstan.org/user-guide/getting-started", 480 | "forum": "https://github.com/phpstan/phpstan/discussions", 481 | "issues": "https://github.com/phpstan/phpstan/issues", 482 | "security": "https://github.com/phpstan/phpstan/security/policy", 483 | "source": "https://github.com/phpstan/phpstan-src" 484 | }, 485 | "funding": [ 486 | { 487 | "url": "https://github.com/ondrejmirtes", 488 | "type": "github" 489 | }, 490 | { 491 | "url": "https://github.com/phpstan", 492 | "type": "github" 493 | } 494 | ], 495 | "time": "2024-11-17T14:08:01+00:00" 496 | }, 497 | { 498 | "name": "phpunit/php-code-coverage", 499 | "version": "9.2.32", 500 | "source": { 501 | "type": "git", 502 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 503 | "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" 504 | }, 505 | "dist": { 506 | "type": "zip", 507 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", 508 | "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", 509 | "shasum": "" 510 | }, 511 | "require": { 512 | "ext-dom": "*", 513 | "ext-libxml": "*", 514 | "ext-xmlwriter": "*", 515 | "nikic/php-parser": "^4.19.1 || ^5.1.0", 516 | "php": ">=7.3", 517 | "phpunit/php-file-iterator": "^3.0.6", 518 | "phpunit/php-text-template": "^2.0.4", 519 | "sebastian/code-unit-reverse-lookup": "^2.0.3", 520 | "sebastian/complexity": "^2.0.3", 521 | "sebastian/environment": "^5.1.5", 522 | "sebastian/lines-of-code": "^1.0.4", 523 | "sebastian/version": "^3.0.2", 524 | "theseer/tokenizer": "^1.2.3" 525 | }, 526 | "require-dev": { 527 | "phpunit/phpunit": "^9.6" 528 | }, 529 | "suggest": { 530 | "ext-pcov": "PHP extension that provides line coverage", 531 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 532 | }, 533 | "type": "library", 534 | "extra": { 535 | "branch-alias": { 536 | "dev-main": "9.2.x-dev" 537 | } 538 | }, 539 | "autoload": { 540 | "classmap": [ 541 | "src/" 542 | ] 543 | }, 544 | "notification-url": "https://packagist.org/downloads/", 545 | "license": [ 546 | "BSD-3-Clause" 547 | ], 548 | "authors": [ 549 | { 550 | "name": "Sebastian Bergmann", 551 | "email": "sebastian@phpunit.de", 552 | "role": "lead" 553 | } 554 | ], 555 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 556 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 557 | "keywords": [ 558 | "coverage", 559 | "testing", 560 | "xunit" 561 | ], 562 | "support": { 563 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 564 | "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", 565 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" 566 | }, 567 | "funding": [ 568 | { 569 | "url": "https://github.com/sebastianbergmann", 570 | "type": "github" 571 | } 572 | ], 573 | "time": "2024-08-22T04:23:01+00:00" 574 | }, 575 | { 576 | "name": "phpunit/php-file-iterator", 577 | "version": "3.0.6", 578 | "source": { 579 | "type": "git", 580 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 581 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 582 | }, 583 | "dist": { 584 | "type": "zip", 585 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 586 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 587 | "shasum": "" 588 | }, 589 | "require": { 590 | "php": ">=7.3" 591 | }, 592 | "require-dev": { 593 | "phpunit/phpunit": "^9.3" 594 | }, 595 | "type": "library", 596 | "extra": { 597 | "branch-alias": { 598 | "dev-master": "3.0-dev" 599 | } 600 | }, 601 | "autoload": { 602 | "classmap": [ 603 | "src/" 604 | ] 605 | }, 606 | "notification-url": "https://packagist.org/downloads/", 607 | "license": [ 608 | "BSD-3-Clause" 609 | ], 610 | "authors": [ 611 | { 612 | "name": "Sebastian Bergmann", 613 | "email": "sebastian@phpunit.de", 614 | "role": "lead" 615 | } 616 | ], 617 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 618 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 619 | "keywords": [ 620 | "filesystem", 621 | "iterator" 622 | ], 623 | "support": { 624 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 625 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 626 | }, 627 | "funding": [ 628 | { 629 | "url": "https://github.com/sebastianbergmann", 630 | "type": "github" 631 | } 632 | ], 633 | "time": "2021-12-02T12:48:52+00:00" 634 | }, 635 | { 636 | "name": "phpunit/php-invoker", 637 | "version": "3.1.1", 638 | "source": { 639 | "type": "git", 640 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 641 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 642 | }, 643 | "dist": { 644 | "type": "zip", 645 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 646 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 647 | "shasum": "" 648 | }, 649 | "require": { 650 | "php": ">=7.3" 651 | }, 652 | "require-dev": { 653 | "ext-pcntl": "*", 654 | "phpunit/phpunit": "^9.3" 655 | }, 656 | "suggest": { 657 | "ext-pcntl": "*" 658 | }, 659 | "type": "library", 660 | "extra": { 661 | "branch-alias": { 662 | "dev-master": "3.1-dev" 663 | } 664 | }, 665 | "autoload": { 666 | "classmap": [ 667 | "src/" 668 | ] 669 | }, 670 | "notification-url": "https://packagist.org/downloads/", 671 | "license": [ 672 | "BSD-3-Clause" 673 | ], 674 | "authors": [ 675 | { 676 | "name": "Sebastian Bergmann", 677 | "email": "sebastian@phpunit.de", 678 | "role": "lead" 679 | } 680 | ], 681 | "description": "Invoke callables with a timeout", 682 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 683 | "keywords": [ 684 | "process" 685 | ], 686 | "support": { 687 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 688 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 689 | }, 690 | "funding": [ 691 | { 692 | "url": "https://github.com/sebastianbergmann", 693 | "type": "github" 694 | } 695 | ], 696 | "time": "2020-09-28T05:58:55+00:00" 697 | }, 698 | { 699 | "name": "phpunit/php-text-template", 700 | "version": "2.0.4", 701 | "source": { 702 | "type": "git", 703 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 704 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 705 | }, 706 | "dist": { 707 | "type": "zip", 708 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 709 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 710 | "shasum": "" 711 | }, 712 | "require": { 713 | "php": ">=7.3" 714 | }, 715 | "require-dev": { 716 | "phpunit/phpunit": "^9.3" 717 | }, 718 | "type": "library", 719 | "extra": { 720 | "branch-alias": { 721 | "dev-master": "2.0-dev" 722 | } 723 | }, 724 | "autoload": { 725 | "classmap": [ 726 | "src/" 727 | ] 728 | }, 729 | "notification-url": "https://packagist.org/downloads/", 730 | "license": [ 731 | "BSD-3-Clause" 732 | ], 733 | "authors": [ 734 | { 735 | "name": "Sebastian Bergmann", 736 | "email": "sebastian@phpunit.de", 737 | "role": "lead" 738 | } 739 | ], 740 | "description": "Simple template engine.", 741 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 742 | "keywords": [ 743 | "template" 744 | ], 745 | "support": { 746 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 747 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 748 | }, 749 | "funding": [ 750 | { 751 | "url": "https://github.com/sebastianbergmann", 752 | "type": "github" 753 | } 754 | ], 755 | "time": "2020-10-26T05:33:50+00:00" 756 | }, 757 | { 758 | "name": "phpunit/php-timer", 759 | "version": "5.0.3", 760 | "source": { 761 | "type": "git", 762 | "url": "https://github.com/sebastianbergmann/php-timer.git", 763 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 764 | }, 765 | "dist": { 766 | "type": "zip", 767 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 768 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 769 | "shasum": "" 770 | }, 771 | "require": { 772 | "php": ">=7.3" 773 | }, 774 | "require-dev": { 775 | "phpunit/phpunit": "^9.3" 776 | }, 777 | "type": "library", 778 | "extra": { 779 | "branch-alias": { 780 | "dev-master": "5.0-dev" 781 | } 782 | }, 783 | "autoload": { 784 | "classmap": [ 785 | "src/" 786 | ] 787 | }, 788 | "notification-url": "https://packagist.org/downloads/", 789 | "license": [ 790 | "BSD-3-Clause" 791 | ], 792 | "authors": [ 793 | { 794 | "name": "Sebastian Bergmann", 795 | "email": "sebastian@phpunit.de", 796 | "role": "lead" 797 | } 798 | ], 799 | "description": "Utility class for timing", 800 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 801 | "keywords": [ 802 | "timer" 803 | ], 804 | "support": { 805 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 806 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 807 | }, 808 | "funding": [ 809 | { 810 | "url": "https://github.com/sebastianbergmann", 811 | "type": "github" 812 | } 813 | ], 814 | "time": "2020-10-26T13:16:10+00:00" 815 | }, 816 | { 817 | "name": "phpunit/phpunit", 818 | "version": "9.6.21", 819 | "source": { 820 | "type": "git", 821 | "url": "https://github.com/sebastianbergmann/phpunit.git", 822 | "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa" 823 | }, 824 | "dist": { 825 | "type": "zip", 826 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", 827 | "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", 828 | "shasum": "" 829 | }, 830 | "require": { 831 | "doctrine/instantiator": "^1.5.0 || ^2", 832 | "ext-dom": "*", 833 | "ext-json": "*", 834 | "ext-libxml": "*", 835 | "ext-mbstring": "*", 836 | "ext-xml": "*", 837 | "ext-xmlwriter": "*", 838 | "myclabs/deep-copy": "^1.12.0", 839 | "phar-io/manifest": "^2.0.4", 840 | "phar-io/version": "^3.2.1", 841 | "php": ">=7.3", 842 | "phpunit/php-code-coverage": "^9.2.32", 843 | "phpunit/php-file-iterator": "^3.0.6", 844 | "phpunit/php-invoker": "^3.1.1", 845 | "phpunit/php-text-template": "^2.0.4", 846 | "phpunit/php-timer": "^5.0.3", 847 | "sebastian/cli-parser": "^1.0.2", 848 | "sebastian/code-unit": "^1.0.8", 849 | "sebastian/comparator": "^4.0.8", 850 | "sebastian/diff": "^4.0.6", 851 | "sebastian/environment": "^5.1.5", 852 | "sebastian/exporter": "^4.0.6", 853 | "sebastian/global-state": "^5.0.7", 854 | "sebastian/object-enumerator": "^4.0.4", 855 | "sebastian/resource-operations": "^3.0.4", 856 | "sebastian/type": "^3.2.1", 857 | "sebastian/version": "^3.0.2" 858 | }, 859 | "suggest": { 860 | "ext-soap": "To be able to generate mocks based on WSDL files", 861 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 862 | }, 863 | "bin": [ 864 | "phpunit" 865 | ], 866 | "type": "library", 867 | "extra": { 868 | "branch-alias": { 869 | "dev-master": "9.6-dev" 870 | } 871 | }, 872 | "autoload": { 873 | "files": [ 874 | "src/Framework/Assert/Functions.php" 875 | ], 876 | "classmap": [ 877 | "src/" 878 | ] 879 | }, 880 | "notification-url": "https://packagist.org/downloads/", 881 | "license": [ 882 | "BSD-3-Clause" 883 | ], 884 | "authors": [ 885 | { 886 | "name": "Sebastian Bergmann", 887 | "email": "sebastian@phpunit.de", 888 | "role": "lead" 889 | } 890 | ], 891 | "description": "The PHP Unit Testing framework.", 892 | "homepage": "https://phpunit.de/", 893 | "keywords": [ 894 | "phpunit", 895 | "testing", 896 | "xunit" 897 | ], 898 | "support": { 899 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 900 | "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 901 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21" 902 | }, 903 | "funding": [ 904 | { 905 | "url": "https://phpunit.de/sponsors.html", 906 | "type": "custom" 907 | }, 908 | { 909 | "url": "https://github.com/sebastianbergmann", 910 | "type": "github" 911 | }, 912 | { 913 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 914 | "type": "tidelift" 915 | } 916 | ], 917 | "time": "2024-09-19T10:50:18+00:00" 918 | }, 919 | { 920 | "name": "sebastian/cli-parser", 921 | "version": "1.0.2", 922 | "source": { 923 | "type": "git", 924 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 925 | "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" 926 | }, 927 | "dist": { 928 | "type": "zip", 929 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", 930 | "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", 931 | "shasum": "" 932 | }, 933 | "require": { 934 | "php": ">=7.3" 935 | }, 936 | "require-dev": { 937 | "phpunit/phpunit": "^9.3" 938 | }, 939 | "type": "library", 940 | "extra": { 941 | "branch-alias": { 942 | "dev-master": "1.0-dev" 943 | } 944 | }, 945 | "autoload": { 946 | "classmap": [ 947 | "src/" 948 | ] 949 | }, 950 | "notification-url": "https://packagist.org/downloads/", 951 | "license": [ 952 | "BSD-3-Clause" 953 | ], 954 | "authors": [ 955 | { 956 | "name": "Sebastian Bergmann", 957 | "email": "sebastian@phpunit.de", 958 | "role": "lead" 959 | } 960 | ], 961 | "description": "Library for parsing CLI options", 962 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 963 | "support": { 964 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 965 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" 966 | }, 967 | "funding": [ 968 | { 969 | "url": "https://github.com/sebastianbergmann", 970 | "type": "github" 971 | } 972 | ], 973 | "time": "2024-03-02T06:27:43+00:00" 974 | }, 975 | { 976 | "name": "sebastian/code-unit", 977 | "version": "1.0.8", 978 | "source": { 979 | "type": "git", 980 | "url": "https://github.com/sebastianbergmann/code-unit.git", 981 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 982 | }, 983 | "dist": { 984 | "type": "zip", 985 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 986 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 987 | "shasum": "" 988 | }, 989 | "require": { 990 | "php": ">=7.3" 991 | }, 992 | "require-dev": { 993 | "phpunit/phpunit": "^9.3" 994 | }, 995 | "type": "library", 996 | "extra": { 997 | "branch-alias": { 998 | "dev-master": "1.0-dev" 999 | } 1000 | }, 1001 | "autoload": { 1002 | "classmap": [ 1003 | "src/" 1004 | ] 1005 | }, 1006 | "notification-url": "https://packagist.org/downloads/", 1007 | "license": [ 1008 | "BSD-3-Clause" 1009 | ], 1010 | "authors": [ 1011 | { 1012 | "name": "Sebastian Bergmann", 1013 | "email": "sebastian@phpunit.de", 1014 | "role": "lead" 1015 | } 1016 | ], 1017 | "description": "Collection of value objects that represent the PHP code units", 1018 | "homepage": "https://github.com/sebastianbergmann/code-unit", 1019 | "support": { 1020 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 1021 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 1022 | }, 1023 | "funding": [ 1024 | { 1025 | "url": "https://github.com/sebastianbergmann", 1026 | "type": "github" 1027 | } 1028 | ], 1029 | "time": "2020-10-26T13:08:54+00:00" 1030 | }, 1031 | { 1032 | "name": "sebastian/code-unit-reverse-lookup", 1033 | "version": "2.0.3", 1034 | "source": { 1035 | "type": "git", 1036 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1037 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 1038 | }, 1039 | "dist": { 1040 | "type": "zip", 1041 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1042 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1043 | "shasum": "" 1044 | }, 1045 | "require": { 1046 | "php": ">=7.3" 1047 | }, 1048 | "require-dev": { 1049 | "phpunit/phpunit": "^9.3" 1050 | }, 1051 | "type": "library", 1052 | "extra": { 1053 | "branch-alias": { 1054 | "dev-master": "2.0-dev" 1055 | } 1056 | }, 1057 | "autoload": { 1058 | "classmap": [ 1059 | "src/" 1060 | ] 1061 | }, 1062 | "notification-url": "https://packagist.org/downloads/", 1063 | "license": [ 1064 | "BSD-3-Clause" 1065 | ], 1066 | "authors": [ 1067 | { 1068 | "name": "Sebastian Bergmann", 1069 | "email": "sebastian@phpunit.de" 1070 | } 1071 | ], 1072 | "description": "Looks up which function or method a line of code belongs to", 1073 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1074 | "support": { 1075 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 1076 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 1077 | }, 1078 | "funding": [ 1079 | { 1080 | "url": "https://github.com/sebastianbergmann", 1081 | "type": "github" 1082 | } 1083 | ], 1084 | "time": "2020-09-28T05:30:19+00:00" 1085 | }, 1086 | { 1087 | "name": "sebastian/comparator", 1088 | "version": "4.0.8", 1089 | "source": { 1090 | "type": "git", 1091 | "url": "https://github.com/sebastianbergmann/comparator.git", 1092 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a" 1093 | }, 1094 | "dist": { 1095 | "type": "zip", 1096 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", 1097 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a", 1098 | "shasum": "" 1099 | }, 1100 | "require": { 1101 | "php": ">=7.3", 1102 | "sebastian/diff": "^4.0", 1103 | "sebastian/exporter": "^4.0" 1104 | }, 1105 | "require-dev": { 1106 | "phpunit/phpunit": "^9.3" 1107 | }, 1108 | "type": "library", 1109 | "extra": { 1110 | "branch-alias": { 1111 | "dev-master": "4.0-dev" 1112 | } 1113 | }, 1114 | "autoload": { 1115 | "classmap": [ 1116 | "src/" 1117 | ] 1118 | }, 1119 | "notification-url": "https://packagist.org/downloads/", 1120 | "license": [ 1121 | "BSD-3-Clause" 1122 | ], 1123 | "authors": [ 1124 | { 1125 | "name": "Sebastian Bergmann", 1126 | "email": "sebastian@phpunit.de" 1127 | }, 1128 | { 1129 | "name": "Jeff Welch", 1130 | "email": "whatthejeff@gmail.com" 1131 | }, 1132 | { 1133 | "name": "Volker Dusch", 1134 | "email": "github@wallbash.com" 1135 | }, 1136 | { 1137 | "name": "Bernhard Schussek", 1138 | "email": "bschussek@2bepublished.at" 1139 | } 1140 | ], 1141 | "description": "Provides the functionality to compare PHP values for equality", 1142 | "homepage": "https://github.com/sebastianbergmann/comparator", 1143 | "keywords": [ 1144 | "comparator", 1145 | "compare", 1146 | "equality" 1147 | ], 1148 | "support": { 1149 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1150 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" 1151 | }, 1152 | "funding": [ 1153 | { 1154 | "url": "https://github.com/sebastianbergmann", 1155 | "type": "github" 1156 | } 1157 | ], 1158 | "time": "2022-09-14T12:41:17+00:00" 1159 | }, 1160 | { 1161 | "name": "sebastian/complexity", 1162 | "version": "2.0.3", 1163 | "source": { 1164 | "type": "git", 1165 | "url": "https://github.com/sebastianbergmann/complexity.git", 1166 | "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" 1167 | }, 1168 | "dist": { 1169 | "type": "zip", 1170 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", 1171 | "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", 1172 | "shasum": "" 1173 | }, 1174 | "require": { 1175 | "nikic/php-parser": "^4.18 || ^5.0", 1176 | "php": ">=7.3" 1177 | }, 1178 | "require-dev": { 1179 | "phpunit/phpunit": "^9.3" 1180 | }, 1181 | "type": "library", 1182 | "extra": { 1183 | "branch-alias": { 1184 | "dev-master": "2.0-dev" 1185 | } 1186 | }, 1187 | "autoload": { 1188 | "classmap": [ 1189 | "src/" 1190 | ] 1191 | }, 1192 | "notification-url": "https://packagist.org/downloads/", 1193 | "license": [ 1194 | "BSD-3-Clause" 1195 | ], 1196 | "authors": [ 1197 | { 1198 | "name": "Sebastian Bergmann", 1199 | "email": "sebastian@phpunit.de", 1200 | "role": "lead" 1201 | } 1202 | ], 1203 | "description": "Library for calculating the complexity of PHP code units", 1204 | "homepage": "https://github.com/sebastianbergmann/complexity", 1205 | "support": { 1206 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1207 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" 1208 | }, 1209 | "funding": [ 1210 | { 1211 | "url": "https://github.com/sebastianbergmann", 1212 | "type": "github" 1213 | } 1214 | ], 1215 | "time": "2023-12-22T06:19:30+00:00" 1216 | }, 1217 | { 1218 | "name": "sebastian/diff", 1219 | "version": "4.0.6", 1220 | "source": { 1221 | "type": "git", 1222 | "url": "https://github.com/sebastianbergmann/diff.git", 1223 | "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" 1224 | }, 1225 | "dist": { 1226 | "type": "zip", 1227 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", 1228 | "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", 1229 | "shasum": "" 1230 | }, 1231 | "require": { 1232 | "php": ">=7.3" 1233 | }, 1234 | "require-dev": { 1235 | "phpunit/phpunit": "^9.3", 1236 | "symfony/process": "^4.2 || ^5" 1237 | }, 1238 | "type": "library", 1239 | "extra": { 1240 | "branch-alias": { 1241 | "dev-master": "4.0-dev" 1242 | } 1243 | }, 1244 | "autoload": { 1245 | "classmap": [ 1246 | "src/" 1247 | ] 1248 | }, 1249 | "notification-url": "https://packagist.org/downloads/", 1250 | "license": [ 1251 | "BSD-3-Clause" 1252 | ], 1253 | "authors": [ 1254 | { 1255 | "name": "Sebastian Bergmann", 1256 | "email": "sebastian@phpunit.de" 1257 | }, 1258 | { 1259 | "name": "Kore Nordmann", 1260 | "email": "mail@kore-nordmann.de" 1261 | } 1262 | ], 1263 | "description": "Diff implementation", 1264 | "homepage": "https://github.com/sebastianbergmann/diff", 1265 | "keywords": [ 1266 | "diff", 1267 | "udiff", 1268 | "unidiff", 1269 | "unified diff" 1270 | ], 1271 | "support": { 1272 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1273 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" 1274 | }, 1275 | "funding": [ 1276 | { 1277 | "url": "https://github.com/sebastianbergmann", 1278 | "type": "github" 1279 | } 1280 | ], 1281 | "time": "2024-03-02T06:30:58+00:00" 1282 | }, 1283 | { 1284 | "name": "sebastian/environment", 1285 | "version": "5.1.5", 1286 | "source": { 1287 | "type": "git", 1288 | "url": "https://github.com/sebastianbergmann/environment.git", 1289 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" 1290 | }, 1291 | "dist": { 1292 | "type": "zip", 1293 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 1294 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 1295 | "shasum": "" 1296 | }, 1297 | "require": { 1298 | "php": ">=7.3" 1299 | }, 1300 | "require-dev": { 1301 | "phpunit/phpunit": "^9.3" 1302 | }, 1303 | "suggest": { 1304 | "ext-posix": "*" 1305 | }, 1306 | "type": "library", 1307 | "extra": { 1308 | "branch-alias": { 1309 | "dev-master": "5.1-dev" 1310 | } 1311 | }, 1312 | "autoload": { 1313 | "classmap": [ 1314 | "src/" 1315 | ] 1316 | }, 1317 | "notification-url": "https://packagist.org/downloads/", 1318 | "license": [ 1319 | "BSD-3-Clause" 1320 | ], 1321 | "authors": [ 1322 | { 1323 | "name": "Sebastian Bergmann", 1324 | "email": "sebastian@phpunit.de" 1325 | } 1326 | ], 1327 | "description": "Provides functionality to handle HHVM/PHP environments", 1328 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1329 | "keywords": [ 1330 | "Xdebug", 1331 | "environment", 1332 | "hhvm" 1333 | ], 1334 | "support": { 1335 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1336 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" 1337 | }, 1338 | "funding": [ 1339 | { 1340 | "url": "https://github.com/sebastianbergmann", 1341 | "type": "github" 1342 | } 1343 | ], 1344 | "time": "2023-02-03T06:03:51+00:00" 1345 | }, 1346 | { 1347 | "name": "sebastian/exporter", 1348 | "version": "4.0.6", 1349 | "source": { 1350 | "type": "git", 1351 | "url": "https://github.com/sebastianbergmann/exporter.git", 1352 | "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" 1353 | }, 1354 | "dist": { 1355 | "type": "zip", 1356 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", 1357 | "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", 1358 | "shasum": "" 1359 | }, 1360 | "require": { 1361 | "php": ">=7.3", 1362 | "sebastian/recursion-context": "^4.0" 1363 | }, 1364 | "require-dev": { 1365 | "ext-mbstring": "*", 1366 | "phpunit/phpunit": "^9.3" 1367 | }, 1368 | "type": "library", 1369 | "extra": { 1370 | "branch-alias": { 1371 | "dev-master": "4.0-dev" 1372 | } 1373 | }, 1374 | "autoload": { 1375 | "classmap": [ 1376 | "src/" 1377 | ] 1378 | }, 1379 | "notification-url": "https://packagist.org/downloads/", 1380 | "license": [ 1381 | "BSD-3-Clause" 1382 | ], 1383 | "authors": [ 1384 | { 1385 | "name": "Sebastian Bergmann", 1386 | "email": "sebastian@phpunit.de" 1387 | }, 1388 | { 1389 | "name": "Jeff Welch", 1390 | "email": "whatthejeff@gmail.com" 1391 | }, 1392 | { 1393 | "name": "Volker Dusch", 1394 | "email": "github@wallbash.com" 1395 | }, 1396 | { 1397 | "name": "Adam Harvey", 1398 | "email": "aharvey@php.net" 1399 | }, 1400 | { 1401 | "name": "Bernhard Schussek", 1402 | "email": "bschussek@gmail.com" 1403 | } 1404 | ], 1405 | "description": "Provides the functionality to export PHP variables for visualization", 1406 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1407 | "keywords": [ 1408 | "export", 1409 | "exporter" 1410 | ], 1411 | "support": { 1412 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1413 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" 1414 | }, 1415 | "funding": [ 1416 | { 1417 | "url": "https://github.com/sebastianbergmann", 1418 | "type": "github" 1419 | } 1420 | ], 1421 | "time": "2024-03-02T06:33:00+00:00" 1422 | }, 1423 | { 1424 | "name": "sebastian/global-state", 1425 | "version": "5.0.7", 1426 | "source": { 1427 | "type": "git", 1428 | "url": "https://github.com/sebastianbergmann/global-state.git", 1429 | "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" 1430 | }, 1431 | "dist": { 1432 | "type": "zip", 1433 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", 1434 | "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", 1435 | "shasum": "" 1436 | }, 1437 | "require": { 1438 | "php": ">=7.3", 1439 | "sebastian/object-reflector": "^2.0", 1440 | "sebastian/recursion-context": "^4.0" 1441 | }, 1442 | "require-dev": { 1443 | "ext-dom": "*", 1444 | "phpunit/phpunit": "^9.3" 1445 | }, 1446 | "suggest": { 1447 | "ext-uopz": "*" 1448 | }, 1449 | "type": "library", 1450 | "extra": { 1451 | "branch-alias": { 1452 | "dev-master": "5.0-dev" 1453 | } 1454 | }, 1455 | "autoload": { 1456 | "classmap": [ 1457 | "src/" 1458 | ] 1459 | }, 1460 | "notification-url": "https://packagist.org/downloads/", 1461 | "license": [ 1462 | "BSD-3-Clause" 1463 | ], 1464 | "authors": [ 1465 | { 1466 | "name": "Sebastian Bergmann", 1467 | "email": "sebastian@phpunit.de" 1468 | } 1469 | ], 1470 | "description": "Snapshotting of global state", 1471 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1472 | "keywords": [ 1473 | "global state" 1474 | ], 1475 | "support": { 1476 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1477 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" 1478 | }, 1479 | "funding": [ 1480 | { 1481 | "url": "https://github.com/sebastianbergmann", 1482 | "type": "github" 1483 | } 1484 | ], 1485 | "time": "2024-03-02T06:35:11+00:00" 1486 | }, 1487 | { 1488 | "name": "sebastian/lines-of-code", 1489 | "version": "1.0.4", 1490 | "source": { 1491 | "type": "git", 1492 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1493 | "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" 1494 | }, 1495 | "dist": { 1496 | "type": "zip", 1497 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", 1498 | "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", 1499 | "shasum": "" 1500 | }, 1501 | "require": { 1502 | "nikic/php-parser": "^4.18 || ^5.0", 1503 | "php": ">=7.3" 1504 | }, 1505 | "require-dev": { 1506 | "phpunit/phpunit": "^9.3" 1507 | }, 1508 | "type": "library", 1509 | "extra": { 1510 | "branch-alias": { 1511 | "dev-master": "1.0-dev" 1512 | } 1513 | }, 1514 | "autoload": { 1515 | "classmap": [ 1516 | "src/" 1517 | ] 1518 | }, 1519 | "notification-url": "https://packagist.org/downloads/", 1520 | "license": [ 1521 | "BSD-3-Clause" 1522 | ], 1523 | "authors": [ 1524 | { 1525 | "name": "Sebastian Bergmann", 1526 | "email": "sebastian@phpunit.de", 1527 | "role": "lead" 1528 | } 1529 | ], 1530 | "description": "Library for counting the lines of code in PHP source code", 1531 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1532 | "support": { 1533 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 1534 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" 1535 | }, 1536 | "funding": [ 1537 | { 1538 | "url": "https://github.com/sebastianbergmann", 1539 | "type": "github" 1540 | } 1541 | ], 1542 | "time": "2023-12-22T06:20:34+00:00" 1543 | }, 1544 | { 1545 | "name": "sebastian/object-enumerator", 1546 | "version": "4.0.4", 1547 | "source": { 1548 | "type": "git", 1549 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1550 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 1551 | }, 1552 | "dist": { 1553 | "type": "zip", 1554 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 1555 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 1556 | "shasum": "" 1557 | }, 1558 | "require": { 1559 | "php": ">=7.3", 1560 | "sebastian/object-reflector": "^2.0", 1561 | "sebastian/recursion-context": "^4.0" 1562 | }, 1563 | "require-dev": { 1564 | "phpunit/phpunit": "^9.3" 1565 | }, 1566 | "type": "library", 1567 | "extra": { 1568 | "branch-alias": { 1569 | "dev-master": "4.0-dev" 1570 | } 1571 | }, 1572 | "autoload": { 1573 | "classmap": [ 1574 | "src/" 1575 | ] 1576 | }, 1577 | "notification-url": "https://packagist.org/downloads/", 1578 | "license": [ 1579 | "BSD-3-Clause" 1580 | ], 1581 | "authors": [ 1582 | { 1583 | "name": "Sebastian Bergmann", 1584 | "email": "sebastian@phpunit.de" 1585 | } 1586 | ], 1587 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1588 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1589 | "support": { 1590 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1591 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 1592 | }, 1593 | "funding": [ 1594 | { 1595 | "url": "https://github.com/sebastianbergmann", 1596 | "type": "github" 1597 | } 1598 | ], 1599 | "time": "2020-10-26T13:12:34+00:00" 1600 | }, 1601 | { 1602 | "name": "sebastian/object-reflector", 1603 | "version": "2.0.4", 1604 | "source": { 1605 | "type": "git", 1606 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1607 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 1608 | }, 1609 | "dist": { 1610 | "type": "zip", 1611 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1612 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1613 | "shasum": "" 1614 | }, 1615 | "require": { 1616 | "php": ">=7.3" 1617 | }, 1618 | "require-dev": { 1619 | "phpunit/phpunit": "^9.3" 1620 | }, 1621 | "type": "library", 1622 | "extra": { 1623 | "branch-alias": { 1624 | "dev-master": "2.0-dev" 1625 | } 1626 | }, 1627 | "autoload": { 1628 | "classmap": [ 1629 | "src/" 1630 | ] 1631 | }, 1632 | "notification-url": "https://packagist.org/downloads/", 1633 | "license": [ 1634 | "BSD-3-Clause" 1635 | ], 1636 | "authors": [ 1637 | { 1638 | "name": "Sebastian Bergmann", 1639 | "email": "sebastian@phpunit.de" 1640 | } 1641 | ], 1642 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1643 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1644 | "support": { 1645 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 1646 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 1647 | }, 1648 | "funding": [ 1649 | { 1650 | "url": "https://github.com/sebastianbergmann", 1651 | "type": "github" 1652 | } 1653 | ], 1654 | "time": "2020-10-26T13:14:26+00:00" 1655 | }, 1656 | { 1657 | "name": "sebastian/recursion-context", 1658 | "version": "4.0.5", 1659 | "source": { 1660 | "type": "git", 1661 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1662 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" 1663 | }, 1664 | "dist": { 1665 | "type": "zip", 1666 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 1667 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 1668 | "shasum": "" 1669 | }, 1670 | "require": { 1671 | "php": ">=7.3" 1672 | }, 1673 | "require-dev": { 1674 | "phpunit/phpunit": "^9.3" 1675 | }, 1676 | "type": "library", 1677 | "extra": { 1678 | "branch-alias": { 1679 | "dev-master": "4.0-dev" 1680 | } 1681 | }, 1682 | "autoload": { 1683 | "classmap": [ 1684 | "src/" 1685 | ] 1686 | }, 1687 | "notification-url": "https://packagist.org/downloads/", 1688 | "license": [ 1689 | "BSD-3-Clause" 1690 | ], 1691 | "authors": [ 1692 | { 1693 | "name": "Sebastian Bergmann", 1694 | "email": "sebastian@phpunit.de" 1695 | }, 1696 | { 1697 | "name": "Jeff Welch", 1698 | "email": "whatthejeff@gmail.com" 1699 | }, 1700 | { 1701 | "name": "Adam Harvey", 1702 | "email": "aharvey@php.net" 1703 | } 1704 | ], 1705 | "description": "Provides functionality to recursively process PHP variables", 1706 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 1707 | "support": { 1708 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 1709 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" 1710 | }, 1711 | "funding": [ 1712 | { 1713 | "url": "https://github.com/sebastianbergmann", 1714 | "type": "github" 1715 | } 1716 | ], 1717 | "time": "2023-02-03T06:07:39+00:00" 1718 | }, 1719 | { 1720 | "name": "sebastian/resource-operations", 1721 | "version": "3.0.4", 1722 | "source": { 1723 | "type": "git", 1724 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1725 | "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" 1726 | }, 1727 | "dist": { 1728 | "type": "zip", 1729 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", 1730 | "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", 1731 | "shasum": "" 1732 | }, 1733 | "require": { 1734 | "php": ">=7.3" 1735 | }, 1736 | "require-dev": { 1737 | "phpunit/phpunit": "^9.0" 1738 | }, 1739 | "type": "library", 1740 | "extra": { 1741 | "branch-alias": { 1742 | "dev-main": "3.0-dev" 1743 | } 1744 | }, 1745 | "autoload": { 1746 | "classmap": [ 1747 | "src/" 1748 | ] 1749 | }, 1750 | "notification-url": "https://packagist.org/downloads/", 1751 | "license": [ 1752 | "BSD-3-Clause" 1753 | ], 1754 | "authors": [ 1755 | { 1756 | "name": "Sebastian Bergmann", 1757 | "email": "sebastian@phpunit.de" 1758 | } 1759 | ], 1760 | "description": "Provides a list of PHP built-in functions that operate on resources", 1761 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1762 | "support": { 1763 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" 1764 | }, 1765 | "funding": [ 1766 | { 1767 | "url": "https://github.com/sebastianbergmann", 1768 | "type": "github" 1769 | } 1770 | ], 1771 | "time": "2024-03-14T16:00:52+00:00" 1772 | }, 1773 | { 1774 | "name": "sebastian/type", 1775 | "version": "3.2.1", 1776 | "source": { 1777 | "type": "git", 1778 | "url": "https://github.com/sebastianbergmann/type.git", 1779 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" 1780 | }, 1781 | "dist": { 1782 | "type": "zip", 1783 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 1784 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 1785 | "shasum": "" 1786 | }, 1787 | "require": { 1788 | "php": ">=7.3" 1789 | }, 1790 | "require-dev": { 1791 | "phpunit/phpunit": "^9.5" 1792 | }, 1793 | "type": "library", 1794 | "extra": { 1795 | "branch-alias": { 1796 | "dev-master": "3.2-dev" 1797 | } 1798 | }, 1799 | "autoload": { 1800 | "classmap": [ 1801 | "src/" 1802 | ] 1803 | }, 1804 | "notification-url": "https://packagist.org/downloads/", 1805 | "license": [ 1806 | "BSD-3-Clause" 1807 | ], 1808 | "authors": [ 1809 | { 1810 | "name": "Sebastian Bergmann", 1811 | "email": "sebastian@phpunit.de", 1812 | "role": "lead" 1813 | } 1814 | ], 1815 | "description": "Collection of value objects that represent the types of the PHP type system", 1816 | "homepage": "https://github.com/sebastianbergmann/type", 1817 | "support": { 1818 | "issues": "https://github.com/sebastianbergmann/type/issues", 1819 | "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" 1820 | }, 1821 | "funding": [ 1822 | { 1823 | "url": "https://github.com/sebastianbergmann", 1824 | "type": "github" 1825 | } 1826 | ], 1827 | "time": "2023-02-03T06:13:03+00:00" 1828 | }, 1829 | { 1830 | "name": "sebastian/version", 1831 | "version": "3.0.2", 1832 | "source": { 1833 | "type": "git", 1834 | "url": "https://github.com/sebastianbergmann/version.git", 1835 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 1836 | }, 1837 | "dist": { 1838 | "type": "zip", 1839 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 1840 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 1841 | "shasum": "" 1842 | }, 1843 | "require": { 1844 | "php": ">=7.3" 1845 | }, 1846 | "type": "library", 1847 | "extra": { 1848 | "branch-alias": { 1849 | "dev-master": "3.0-dev" 1850 | } 1851 | }, 1852 | "autoload": { 1853 | "classmap": [ 1854 | "src/" 1855 | ] 1856 | }, 1857 | "notification-url": "https://packagist.org/downloads/", 1858 | "license": [ 1859 | "BSD-3-Clause" 1860 | ], 1861 | "authors": [ 1862 | { 1863 | "name": "Sebastian Bergmann", 1864 | "email": "sebastian@phpunit.de", 1865 | "role": "lead" 1866 | } 1867 | ], 1868 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1869 | "homepage": "https://github.com/sebastianbergmann/version", 1870 | "support": { 1871 | "issues": "https://github.com/sebastianbergmann/version/issues", 1872 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 1873 | }, 1874 | "funding": [ 1875 | { 1876 | "url": "https://github.com/sebastianbergmann", 1877 | "type": "github" 1878 | } 1879 | ], 1880 | "time": "2020-09-28T06:39:44+00:00" 1881 | }, 1882 | { 1883 | "name": "theseer/tokenizer", 1884 | "version": "1.2.3", 1885 | "source": { 1886 | "type": "git", 1887 | "url": "https://github.com/theseer/tokenizer.git", 1888 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" 1889 | }, 1890 | "dist": { 1891 | "type": "zip", 1892 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 1893 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 1894 | "shasum": "" 1895 | }, 1896 | "require": { 1897 | "ext-dom": "*", 1898 | "ext-tokenizer": "*", 1899 | "ext-xmlwriter": "*", 1900 | "php": "^7.2 || ^8.0" 1901 | }, 1902 | "type": "library", 1903 | "autoload": { 1904 | "classmap": [ 1905 | "src/" 1906 | ] 1907 | }, 1908 | "notification-url": "https://packagist.org/downloads/", 1909 | "license": [ 1910 | "BSD-3-Clause" 1911 | ], 1912 | "authors": [ 1913 | { 1914 | "name": "Arne Blankerts", 1915 | "email": "arne@blankerts.de", 1916 | "role": "Developer" 1917 | } 1918 | ], 1919 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1920 | "support": { 1921 | "issues": "https://github.com/theseer/tokenizer/issues", 1922 | "source": "https://github.com/theseer/tokenizer/tree/1.2.3" 1923 | }, 1924 | "funding": [ 1925 | { 1926 | "url": "https://github.com/theseer", 1927 | "type": "github" 1928 | } 1929 | ], 1930 | "time": "2024-03-03T12:36:25+00:00" 1931 | } 1932 | ], 1933 | "aliases": [], 1934 | "minimum-stability": "stable", 1935 | "stability-flags": {}, 1936 | "prefer-stable": false, 1937 | "prefer-lowest": false, 1938 | "platform": { 1939 | "php": ">=8.0" 1940 | }, 1941 | "platform-dev": {}, 1942 | "plugin-api-version": "2.6.0" 1943 | } 1944 | --------------------------------------------------------------------------------