├── .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 | [](https://appwrite.io/discord?r=Github)
4 | 
5 | [](https://travis-ci.com/appwrite/php-runtimes)
6 | [](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 |
--------------------------------------------------------------------------------