diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
new file mode 100644
index 00000000..935c9fa3
--- /dev/null
+++ b/.devcontainer/Dockerfile
@@ -0,0 +1,14 @@
+FROM mcr.microsoft.com/devcontainers/php:8.2
+
+# Create Laravel test project directory in vscode user home
+USER vscode
+RUN mkdir -p /home/vscode/laravel-test
+
+# Expose port 8000 for Laravel
+EXPOSE 8000
+
+# Create setup script for Laravel test environment
+COPY ./setup-laravel-test.sh /usr/local/bin/setup-laravel-test.sh
+USER root
+RUN chmod +x /usr/local/bin/setup-laravel-test.sh
+USER vscode
\ No newline at end of file
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 00000000..901d9dcb
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,37 @@
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the
+// README at: https://github.com/devcontainers/templates/tree/main/src/php
+{
+ "name": "Laravel SCIM Server Dev",
+ // Use the Dockerfile in the .devcontainer folder
+ "build": {
+ "dockerfile": "Dockerfile",
+ "context": "."
+ },
+
+ // Configure tool-specific properties
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ "bmewburn.vscode-intelephense-client",
+ "xdebug.php-debug",
+ "mikestead.dotenv",
+ "mehedidracula.php-namespace-resolver",
+ "recca0120.vscode-phpunit",
+ "formulahendry.terminal",
+ "junstyle.php-cs-fixer"
+ ],
+ "settings": {
+ "php.validate.executablePath": "/usr/local/bin/php"
+ }
+ }
+ },
+
+ // Use 'forwardPorts' to make a list of ports inside the container available locally
+ "forwardPorts": [8000],
+
+ // Use 'postCreateCommand' to run commands after the container is created
+ "postCreateCommand": "composer install",
+
+ // Add a non-root user to run the server
+ "remoteUser": "vscode"
+}
diff --git a/.devcontainer/setup-laravel-test.sh b/.devcontainer/setup-laravel-test.sh
new file mode 100644
index 00000000..91c1f09b
--- /dev/null
+++ b/.devcontainer/setup-laravel-test.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+set -e
+
+# Create Laravel project if it doesn't exist
+if [ ! -d "/home/vscode/laravel-test/vendor" ]; then
+ echo "Creating new Laravel project..."
+ cd /home/vscode
+ composer create-project --prefer-dist laravel/laravel laravel-test
+
+ cd laravel-test
+
+ # Add the local package as a repository
+ jq '.repositories=[{"type": "path","url": "/workspaces/laravel-scim-server"}]' ./composer.json > composer.json.tmp && mv composer.json.tmp composer.json
+
+ # Require the package and laravel/tinker
+ composer require arietimmerman/laravel-scim-server @dev
+ composer require laravel/tinker
+
+ # Set up SQLite database
+ touch ./.database.sqlite
+ echo "DB_CONNECTION=sqlite" >> ./.env
+ echo "DB_DATABASE=/home/vscode/laravel-test/.database.sqlite" >> ./.env
+
+ # Run migrations
+ php artisan migrate
+
+ # Create test users
+ echo "User::factory()->count(100)->create();" | php artisan tinker
+
+ echo "Laravel test environment setup complete!"
+else
+ echo "Laravel test environment already exists!"
+fi
\ No newline at end of file
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d83f01af..2c24de2d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,16 +1,72 @@
name: CI
-on: [push]
+on: ['push', 'pull_request']
+
+permissions:
+ contents: read
+ packages: write
jobs:
- build-test:
+ tests:
runs-on: ubuntu-latest
+ continue-on-error: true
+ strategy:
+ matrix:
+ php: [8.0, 8.1, 8.2]
+ laravel: [10.*, 11.*, 12.*]
+ exclude:
+ - laravel: 10.*
+ php: 8.0
+ - laravel: 11.*
+ php: 7.3
+ - laravel: 11.*
+ php: 7.4
+ - laravel: 11.*
+ php: 8.0
+ - laravel: 11.*
+ php: 8.1
+ - laravel: 12.*
+ php: 7.3
+ - laravel: 12.*
+ php: 7.4
+ - laravel: 12.*
+ php: 8.0
+ - laravel: 12.*
+ php: 8.1
+
+ name: PHP ${{ matrix.php }} on Laravel ${{ matrix.laravel }}
steps:
- - uses: actions/checkout@v2
- - uses: php-actions/composer@v6
- with:
- php_version: 8
- - uses: php-actions/phpunit@v3
+ - name: Checkout code
+ uses: actions/checkout@v2
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
with:
- php_version: 8
+ php-version: ${{ matrix.php }}
+ - name: Install dependencies
+ run: |
+ composer require "illuminate/console:${{ matrix.laravel }}" "illuminate/database:${{ matrix.laravel }}" "illuminate/support:${{ matrix.laravel }}" --no-interaction --no-update
+ composer update
+ - name: Run tests
+ run: vendor/bin/phpunit
+
+ docker:
+ # Only push Docker image for direct pushes to master branch
+ if: github.event_name == 'push' && github.ref == 'refs/heads/master'
+ runs-on: ubuntu-latest
+ needs: tests
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Log in to the Container registry
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ push: true
+ tags: ghcr.io/${{ github.repository }}:latest
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 22d0d82f..58be7c72 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
vendor
+.phpunit.result.cache
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 00000000..c40bd55d
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,49 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+
+ {
+ "name": "Listen for Xdebug",
+ "type": "php",
+ "request": "launch",
+ "port": 9000
+ },
+ {
+ "name": "Launch currently open script",
+ "type": "php",
+ "request": "launch",
+ "program": "${file}",
+ "cwd": "${fileDirname}",
+ "port": 0,
+ "runtimeArgs": [
+ "-dxdebug.start_with_request=yes"
+ ],
+ "env": {
+ "XDEBUG_MODE": "debug,develop",
+ "XDEBUG_CONFIG": "client_port=${port}"
+ }
+ },
+ {
+ "name": "Launch Built-in web server",
+ "type": "php",
+ "request": "launch",
+ "runtimeArgs": [
+ "-dxdebug.mode=debug",
+ "-dxdebug.start_with_request=yes",
+ "-S",
+ "localhost:0"
+ ],
+ "program": "",
+ "cwd": "${workspaceRoot}",
+ "port": 9003,
+ "serverReadyAction": {
+ "pattern": "Development Server \\(http://localhost:([0-9]+)\\) started",
+ "uriFormat": "http://localhost:%s",
+ "action": "openExternally"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 00000000..70491936
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,12 @@
+{
+ "php.validate.enable": true,
+ "php.validate.run": "onType",
+ "php.validate.executablePath": "/usr/local/bin/php",
+ "php-cs-fixer.executablePath": "/workspaces/laravel-scim-server/vendor/bin/php-cs-fixer",
+ "files.associations": {
+ "*.php": "php"
+ },
+ "[php]": {
+ "editor.formatOnSave": true
+ }
+}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 00000000..b774c71f
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,35 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "Setup Laravel SCIM Test Server",
+ "type": "shell",
+ "command": "setup-laravel-test.sh",
+ "problemMatcher": [],
+ "presentation": {
+ "reveal": "always",
+ "panel": "new"
+ },
+ "group": "test"
+ },
+ {
+ "label": "Start Laravel SCIM Test Server",
+ "type": "shell",
+ "command": "export XDEBUG_MODE=debug,develop && cd /home/vscode/laravel-test && COMPOSER_AUTOLOAD_DEV=1 composer dump-autoload && php artisan serve --host=0.0.0.0 --port=8000",
+ "dependsOn": "Setup Laravel SCIM Test Server",
+ "problemMatcher": [],
+ "presentation": {
+ "reveal": "always",
+ "panel": "dedicated"
+ },
+ "group": "test"
+ },
+ {
+ "label": "Open SCIM Server in Browser",
+ "type": "shell",
+ "command": "$BROWSER http://localhost:8000/scim/v2/Users",
+ "problemMatcher": [],
+ "group": "test"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index ecd97bf8..2d507dfe 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,24 +1,242 @@
-FROM php:8.0-alpine
+FROM php:8.1-alpine
-RUN apk add --no-cache git jq moreutils
+# Base tools and PHP extensions
+RUN apk add --no-cache git jq moreutils \
+ && apk add --no-cache $PHPIZE_DEPS postgresql-dev sqlite-dev \
+ && docker-php-ext-install pdo_pgsql pdo_sqlite \
+ && pecl install xdebug-3.1.5 \
+ && docker-php-ext-enable xdebug \
+ && echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
+ && echo "xdebug.client_host = 172.19.0.1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
+
+# Composer + fresh Laravel app
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
-RUN composer create-project --prefer-dist laravel/laravel example && \
- cd example
+RUN composer create-project --prefer-dist laravel/laravel example && cd example
WORKDIR /example
+# Link local package
COPY . /laravel-scim-server
RUN jq '.repositories=[{"type": "path","url": "/laravel-scim-server"}]' ./composer.json | sponge ./composer.json
+# Install package and dev helpers
RUN composer require arietimmerman/laravel-scim-server @dev && \
composer require laravel/tinker
-RUN touch ./.database.sqlite && \
- echo "DB_CONNECTION=sqlite" >> ./.env && \
- echo "DB_DATABASE=/example/.database.sqlite" >> ./.env && \
- echo "APP_URL=http://localhost:18123" >> ./.env
+# SQLite config
+RUN touch /example/database.sqlite && \
+ echo "DB_CONNECTION=sqlite" >> /example/.env && \
+ echo "DB_DATABASE=/example/database.sqlite" >> /example/.env && \
+ echo "APP_URL=http://localhost:18123" >> /example/.env
+
+# Make users.password nullable to allow SCIM-created users without passwords
+RUN sed -i -E "s/\\$table->string\('password'\);/\\$table->string('password')->nullable();/g" \
+ database/migrations/*create_users_table.php || true
+
+# Groups table migration
+RUN cat > /example/database/migrations/2021_01_01_000001_create_groups_table.php <<'EOM'
+id();
+ $table->string('displayName')->unique();
+ $table->timestamps();
+ });
+ }
+
+ public function down(): void
+ {
+ Schema::dropIfExists('groups');
+ }
+};
+EOM
+
+# Group model with members() relation
+RUN cat > app/Models/Group.php <<'EOM'
+belongsToMany(User::class, 'group_user', 'group_id', 'user_id')->withTimestamps();
+ }
+}
+EOM
+
+# Override SCIM config to use app's Group model
+RUN mkdir -p app/SCIM && cat > app/SCIM/CustomSCIMConfig.php <<'EOM'
+ app/Providers/AppServiceProvider.php <<'EOM'
+app->singleton(BaseSCIMConfig::class, CustomSCIMConfig::class);
+ }
+
+ public function boot(): void
+ {
+ //
+ }
+}
+EOM
+
+# Group factory
+RUN cat > database/factories/GroupFactory.php <<'EOM'
+ $this->faker->unique()->company(),
+ ];
+ }
+}
+EOM
+
+# Pivot table for memberships
+RUN cat > /example/database/migrations/2021_01_01_000002_create_group_user_table.php <<'EOM'
+id();
+ $table->foreignId('group_id')->constrained('groups')->cascadeOnDelete();
+ $table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
+ $table->timestamps();
+ $table->unique(['group_id', 'user_id']);
+ });
+ }
+
+ public function down(): void
+ {
+ Schema::dropIfExists('group_user');
+ }
+};
+EOM
+
+# Ensure User model has groups() relation (overwrite default)
+RUN cat > app/Models/User.php <<'EOM'
+ 'datetime',
+ ];
+
+ public function groups(): BelongsToMany
+ {
+ return $this->belongsToMany(Group::class, 'group_user', 'user_id', 'group_id')->withTimestamps();
+ }
+}
+EOM
+
+# Seeder for demo data
+RUN cat > /example/database/seeders/DemoSeeder.php <<'EOM'
+count(50)->create();
+ $groups = Group::factory()->count(10)->create();
+
+ foreach ($groups as $g) {
+ $g->members()->sync($users->random(rand(3, 10))->pluck('id')->toArray());
+ }
+ }
+}
+EOM
+
+# Run migrations and seed demo data
+RUN php artisan migrate && php artisan db:seed --class=Database\\Seeders\\DemoSeeder
-RUN php artisan migrate && \
- echo "User::factory()->count(100)->create();" | php artisan tinker
+CMD ["php","artisan","serve","--host=0.0.0.0","--port=8000"]
-CMD php artisan serve --host=0.0.0.0 --port=8000
diff --git a/README.md b/README.md
index 44744248..24e43170 100644
--- a/README.md
+++ b/README.md
@@ -3,9 +3,26 @@
[](https://packagist.org/packages/arietimmerman/laravel-scim-server)
[](https://packagist.org/packages/arietimmerman/laravel-scim-server)
+
+
# SCIM 2.0 Server implementation for Laravel
-Add SCIM 2.0 Server capabilities with ease. Usually, no configuration is needed in order to benefit from the basic functionalities.
+Add SCIM 2.0 Server capabilities to your Laravel application with ease. This package requires minimal configuration to get started with basic functionalities.
+
+This implementation is used by [The SCIM Playground](https://scim.dev) and is therefore one of the most widely tested SCIM servers available.
+## Docker
+
+To quickly spin up a SCIM test server using Docker, run:
+
+~~~
+docker run -d -p 8000:8000 --name laravel-scim-server ghcr.io/limosa-io/laravel-scim-server:latest
+~~~
+
+This command will start the server and bind it to port 8000 on your local machine. You can then access the SCIM endpoints at `http://localhost:8000/scim/v2/Users`. Other SCIM endpoints like `/Groups`, `/Schemas`, and `/ResourceTypes` will also be available.
+
+## Installation
+
+Simply run:
~~~
composer require arietimmerman/laravel-scim-server
@@ -17,37 +34,29 @@ And optionally
php artisan vendor:publish --tag=laravel-scim
~~~
-The module is used by [idaas.nl](https://www.idaas.nl/).
-
# Routes
-~~~
-+----------+-----------------------------------------+
-| GET|HEAD | scim/v1 |
-| GET|HEAD | scim/v1/{fallbackPlaceholder} |
-| POST | scim/v2/.search |
-| | |
-| GET|HEAD | scim/v2/ResourceTypes |
-| GET|HEAD | scim/v2/ResourceTypes/{id} |
-| GET|HEAD | scim/v2/Schemas |
-| GET|HEAD | scim/v2/Schemas/{id} |
-| GET|HEAD | scim/v2/ServiceProviderConfig |
-| GET|HEAD | scim/v2/{fallbackPlaceholder} |
-| | |
-| GET|HEAD | scim/v2/{resourceType} |
-| | |
-| POST | scim/v2/{resourceType} |
-| | |
-| GET|HEAD | scim/v2/{resourceType}/{resourceObject} |
-| | |
-| PUT | scim/v2/{resourceType}/{resourceObject} |
-| | |
-| PATCH | scim/v2/{resourceType}/{resourceObject} |
-| | |
-| DELETE | scim/v2/{resourceType}/{resourceObject} |
-| | |
-+----------+-----------------------------------------+
-~~~
+| Method | Path |
+|--------|------|
+| GET\|HEAD | / |
+| GET\|HEAD | scim/v1 |
+| GET\|HEAD | scim/v1/{fallbackPlaceholder} |
+| POST | scim/v2/.search |
+| POST | scim/v2/Bulk |
+| GET\|HEAD | scim/v2/ResourceTypes |
+| GET\|HEAD | scim/v2/ResourceTypes/{id} |
+| GET\|HEAD | scim/v2/Schemas |
+| GET\|HEAD | scim/v2/Schemas/{id} |
+| GET\|HEAD | scim/v2/ServiceProviderConfig |
+| GET\|HEAD | scim/v2/{fallbackPlaceholder} |
+| GET\|HEAD | scim/v2/{resourceType} |
+| POST | scim/v2/{resourceType} |
+| POST | scim/v2/{resourceType}/.search |
+| GET\|HEAD | scim/v2/{resourceType}/{resourceObject} |
+| PUT | scim/v2/{resourceType}/{resourceObject} |
+| PATCH | scim/v2/{resourceType}/{resourceObject} |
+| DELETE | scim/v2/{resourceType}/{resourceObject} |
+
# Configuration
diff --git a/composer.json b/composer.json
index 8bb31957..c738ea72 100644
--- a/composer.json
+++ b/composer.json
@@ -10,10 +10,10 @@
}
],
"require": {
- "php": "^7.0|^8.0",
- "illuminate/database": "^6.0|^7.0|^8.0|^9.0",
- "illuminate/support": "^6.0|^7.0|^8.0|^9.0",
- "illuminate/console": "^6.0|^7.0|^8.0|^9.0",
+ "php": "^8.0",
+ "illuminate/database": "^10.0|^11.0|^12.0",
+ "illuminate/support": "^10.0|^11.0|^12.0",
+ "illuminate/console": "^10.0|^11.0|^12.0",
"tmilos/scim-schema": "^0.1.0",
"tmilos/scim-filter-parser": "^1.3"
},
@@ -29,10 +29,11 @@
}
},
"require-dev": {
- "orchestra/testbench": "^5.0|^6.0",
- "laravel/legacy-factories": "*"
+ "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0|^10.0",
+ "laravel/legacy-factories": "*",
+ "friendsofphp/php-cs-fixer": "^3.66"
},
-
+
"extra": {
"laravel": {
"providers": [
@@ -43,5 +44,5 @@
}
}
}
-
+
}
diff --git a/composer.lock b/composer.lock
index 2a572cd7..21e125a0 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,30 +4,29 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "1f53fbc4eae4d64b08077692ce5a2aa4",
+ "content-hash": "f14e11f45ad5b8e86f365d789b1c7621",
"packages": [
{
"name": "brick/math",
- "version": "0.9.3",
+ "version": "0.12.1",
"source": {
"type": "git",
"url": "https://github.com/brick/math.git",
- "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae"
+ "reference": "f510c0a40911935b77b86859eb5223d58d660df1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae",
- "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae",
+ "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1",
+ "reference": "f510c0a40911935b77b86859eb5223d58d660df1",
"shasum": ""
},
"require": {
- "ext-json": "*",
- "php": "^7.1 || ^8.0"
+ "php": "^8.1"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.2",
- "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0",
- "vimeo/psalm": "4.9.2"
+ "phpunit/phpunit": "^10.1",
+ "vimeo/psalm": "5.16.0"
},
"type": "library",
"autoload": {
@@ -47,37 +46,107 @@
"arithmetic",
"bigdecimal",
"bignum",
+ "bignumber",
"brick",
- "math"
+ "decimal",
+ "integer",
+ "math",
+ "mathematics",
+ "rational"
],
"support": {
"issues": "https://github.com/brick/math/issues",
- "source": "https://github.com/brick/math/tree/0.9.3"
+ "source": "https://github.com/brick/math/tree/0.12.1"
},
"funding": [
{
"url": "https://github.com/BenMorel",
"type": "github"
+ }
+ ],
+ "time": "2023-11-29T23:19:16+00:00"
+ },
+ {
+ "name": "carbonphp/carbon-doctrine-types",
+ "version": "2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
+ "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb",
+ "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/dbal": "<3.7.0 || >=4.0.0"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^3.7.0",
+ "nesbot/carbon": "^2.71.0 || ^3.0.0",
+ "phpunit/phpunit": "^10.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Carbon\\Doctrine\\": "src/Carbon/Doctrine/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "KyleKatarn",
+ "email": "kylekatarnls@gmail.com"
+ }
+ ],
+ "description": "Types to use Carbon in Doctrine",
+ "keywords": [
+ "carbon",
+ "date",
+ "datetime",
+ "doctrine",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
+ "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/kylekatarnls",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/Carbon",
+ "type": "open_collective"
},
{
- "url": "https://tidelift.com/funding/github/packagist/brick/math",
+ "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
"type": "tidelift"
}
],
- "time": "2021-08-15T20:50:18+00:00"
+ "time": "2023-12-11T17:09:12+00:00"
},
{
"name": "dflydev/dot-access-data",
- "version": "v3.0.1",
+ "version": "v3.0.3",
"source": {
"type": "git",
"url": "https://github.com/dflydev/dflydev-dot-access-data.git",
- "reference": "0992cc19268b259a39e86f296da5f0677841f42c"
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/0992cc19268b259a39e86f296da5f0677841f42c",
- "reference": "0992cc19268b259a39e86f296da5f0677841f42c",
+ "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f",
"shasum": ""
},
"require": {
@@ -88,7 +157,7 @@
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
"scrutinizer/ocular": "1.6.0",
"squizlabs/php_codesniffer": "^3.5",
- "vimeo/psalm": "^3.14"
+ "vimeo/psalm": "^4.0.0"
},
"type": "library",
"extra": {
@@ -137,34 +206,34 @@
],
"support": {
"issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
- "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.1"
+ "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3"
},
- "time": "2021-08-13T13:06:58+00:00"
+ "time": "2024-07-08T12:26:09+00:00"
},
{
"name": "doctrine/inflector",
- "version": "2.0.4",
+ "version": "2.0.10",
"source": {
"type": "git",
"url": "https://github.com/doctrine/inflector.git",
- "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89"
+ "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
- "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+ "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"require-dev": {
- "doctrine/coding-standard": "^8.2",
- "phpstan/phpstan": "^0.12",
- "phpstan/phpstan-phpunit": "^0.12",
- "phpstan/phpstan-strict-rules": "^0.12",
- "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
- "vimeo/psalm": "^4.10"
+ "doctrine/coding-standard": "^11.0",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.3",
+ "phpunit/phpunit": "^8.5 || ^9.5",
+ "vimeo/psalm": "^4.25 || ^5.4"
},
"type": "library",
"autoload": {
@@ -214,7 +283,7 @@
],
"support": {
"issues": "https://github.com/doctrine/inflector/issues",
- "source": "https://github.com/doctrine/inflector/tree/2.0.4"
+ "source": "https://github.com/doctrine/inflector/tree/2.0.10"
},
"funding": [
{
@@ -230,35 +299,36 @@
"type": "tidelift"
}
],
- "time": "2021-10-22T20:16:43+00:00"
+ "time": "2024-02-18T20:23:39+00:00"
},
{
"name": "doctrine/lexer",
- "version": "1.2.3",
+ "version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/lexer.git",
- "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229"
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229",
- "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
+ "php": "^8.1"
},
"require-dev": {
- "doctrine/coding-standard": "^9.0",
- "phpstan/phpstan": "^1.3",
- "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
- "vimeo/psalm": "^4.11"
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5",
+ "psalm/plugin-phpunit": "^0.18.3",
+ "vimeo/psalm": "^5.21"
},
"type": "library",
"autoload": {
"psr-4": {
- "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
+ "Doctrine\\Common\\Lexer\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -290,7 +360,7 @@
],
"support": {
"issues": "https://github.com/doctrine/lexer/issues",
- "source": "https://github.com/doctrine/lexer/tree/1.2.3"
+ "source": "https://github.com/doctrine/lexer/tree/3.0.1"
},
"funding": [
{
@@ -306,20 +376,20 @@
"type": "tidelift"
}
],
- "time": "2022-02-28T11:07:21+00:00"
+ "time": "2024-02-05T11:56:58+00:00"
},
{
"name": "dragonmantank/cron-expression",
- "version": "v3.3.1",
+ "version": "v3.3.3",
"source": {
"type": "git",
"url": "https://github.com/dragonmantank/cron-expression.git",
- "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa"
+ "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/be85b3f05b46c39bbc0d95f6c071ddff669510fa",
- "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a",
+ "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a",
"shasum": ""
},
"require": {
@@ -359,7 +429,7 @@
],
"support": {
"issues": "https://github.com/dragonmantank/cron-expression/issues",
- "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.1"
+ "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3"
},
"funding": [
{
@@ -367,31 +437,30 @@
"type": "github"
}
],
- "time": "2022-01-18T15:43:28+00:00"
+ "time": "2023-08-10T19:36:49+00:00"
},
{
"name": "egulias/email-validator",
- "version": "2.1.25",
+ "version": "4.0.2",
"source": {
"type": "git",
"url": "https://github.com/egulias/EmailValidator.git",
- "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4"
+ "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4",
- "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e",
+ "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e",
"shasum": ""
},
"require": {
- "doctrine/lexer": "^1.0.1",
- "php": ">=5.5",
- "symfony/polyfill-intl-idn": "^1.10"
+ "doctrine/lexer": "^2.0 || ^3.0",
+ "php": ">=8.1",
+ "symfony/polyfill-intl-idn": "^1.26"
},
"require-dev": {
- "dominicsayers/isemail": "^3.0.7",
- "phpunit/phpunit": "^4.8.36|^7.5.15",
- "satooshi/php-coveralls": "^1.0.1"
+ "phpunit/phpunit": "^10.2",
+ "vimeo/psalm": "^5.12"
},
"suggest": {
"ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
@@ -399,7 +468,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.1.x-dev"
+ "dev-master": "4.0.x-dev"
}
},
"autoload": {
@@ -427,7 +496,7 @@
],
"support": {
"issues": "https://github.com/egulias/EmailValidator/issues",
- "source": "https://github.com/egulias/EmailValidator/tree/2.1.25"
+ "source": "https://github.com/egulias/EmailValidator/tree/4.0.2"
},
"funding": [
{
@@ -435,28 +504,99 @@
"type": "github"
}
],
- "time": "2020-12-29T14:50:06+00:00"
+ "time": "2023-10-06T06:47:41+00:00"
+ },
+ {
+ "name": "fruitcake/php-cors",
+ "version": "v1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruitcake/php-cors.git",
+ "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b",
+ "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4|^8.0",
+ "symfony/http-foundation": "^4.4|^5.4|^6|^7"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.4",
+ "phpunit/phpunit": "^9",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Fruitcake\\Cors\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fruitcake",
+ "homepage": "https://fruitcake.nl"
+ },
+ {
+ "name": "Barryvdh",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "Cross-origin resource sharing library for the Symfony HttpFoundation",
+ "homepage": "https://github.com/fruitcake/php-cors",
+ "keywords": [
+ "cors",
+ "laravel",
+ "symfony"
+ ],
+ "support": {
+ "issues": "https://github.com/fruitcake/php-cors/issues",
+ "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://fruitcake.nl",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
+ }
+ ],
+ "time": "2023-10-12T05:21:21+00:00"
},
{
"name": "graham-campbell/result-type",
- "version": "v1.0.4",
+ "version": "v1.1.3",
"source": {
"type": "git",
"url": "https://github.com/GrahamCampbell/Result-Type.git",
- "reference": "0690bde05318336c7221785f2a932467f98b64ca"
+ "reference": "3ba905c11371512af9d9bdd27d99b782216b6945"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/0690bde05318336c7221785f2a932467f98b64ca",
- "reference": "0690bde05318336c7221785f2a932467f98b64ca",
+ "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945",
+ "reference": "3ba905c11371512af9d9bdd27d99b782216b6945",
"shasum": ""
},
"require": {
- "php": "^7.0 || ^8.0",
- "phpoption/phpoption": "^1.8"
+ "php": "^7.2.5 || ^8.0",
+ "phpoption/phpoption": "^1.9.3"
},
"require-dev": {
- "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8"
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28"
},
"type": "library",
"autoload": {
@@ -485,7 +625,7 @@
],
"support": {
"issues": "https://github.com/GrahamCampbell/Result-Type/issues",
- "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4"
+ "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3"
},
"funding": [
{
@@ -497,60 +637,160 @@
"type": "tidelift"
}
],
- "time": "2021-11-21T21:41:47+00:00"
+ "time": "2024-07-20T21:45:45+00:00"
+ },
+ {
+ "name": "guzzlehttp/uri-template",
+ "version": "v1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/uri-template.git",
+ "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c",
+ "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "symfony/polyfill-php80": "^1.24"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "phpunit/phpunit": "^8.5.36 || ^9.6.15",
+ "uri-template/tests": "1.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\UriTemplate\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ }
+ ],
+ "description": "A polyfill class for uri_template of PHP",
+ "keywords": [
+ "guzzlehttp",
+ "uri-template"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/uri-template/issues",
+ "source": "https://github.com/guzzle/uri-template/tree/v1.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-12-03T19:50:20+00:00"
},
{
"name": "laravel/framework",
- "version": "v8.83.8",
+ "version": "v10.48.17",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "cf430301ad17656b3d918995bcdd0454c3c119b9"
+ "reference": "60f3c8f667b24a09e0392e26b1f40fb9067cdc3c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/cf430301ad17656b3d918995bcdd0454c3c119b9",
- "reference": "cf430301ad17656b3d918995bcdd0454c3c119b9",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/60f3c8f667b24a09e0392e26b1f40fb9067cdc3c",
+ "reference": "60f3c8f667b24a09e0392e26b1f40fb9067cdc3c",
"shasum": ""
},
"require": {
- "doctrine/inflector": "^1.4|^2.0",
- "dragonmantank/cron-expression": "^3.0.2",
- "egulias/email-validator": "^2.1.10",
- "ext-json": "*",
+ "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12",
+ "composer-runtime-api": "^2.2",
+ "doctrine/inflector": "^2.0.5",
+ "dragonmantank/cron-expression": "^3.3.2",
+ "egulias/email-validator": "^3.2.1|^4.0",
+ "ext-ctype": "*",
+ "ext-filter": "*",
+ "ext-hash": "*",
"ext-mbstring": "*",
"ext-openssl": "*",
- "laravel/serializable-closure": "^1.0",
- "league/commonmark": "^1.3|^2.0.2",
- "league/flysystem": "^1.1",
- "monolog/monolog": "^2.0",
- "nesbot/carbon": "^2.53.1",
- "opis/closure": "^3.6",
- "php": "^7.3|^8.0",
- "psr/container": "^1.0",
- "psr/log": "^1.0|^2.0",
- "psr/simple-cache": "^1.0",
- "ramsey/uuid": "^4.2.2",
- "swiftmailer/swiftmailer": "^6.3",
- "symfony/console": "^5.4",
- "symfony/error-handler": "^5.4",
- "symfony/finder": "^5.4",
- "symfony/http-foundation": "^5.4",
- "symfony/http-kernel": "^5.4",
- "symfony/mime": "^5.4",
- "symfony/process": "^5.4",
- "symfony/routing": "^5.4",
- "symfony/var-dumper": "^5.4",
- "tijsverkoyen/css-to-inline-styles": "^2.2.2",
+ "ext-session": "*",
+ "ext-tokenizer": "*",
+ "fruitcake/php-cors": "^1.2",
+ "guzzlehttp/uri-template": "^1.0",
+ "laravel/prompts": "^0.1.9",
+ "laravel/serializable-closure": "^1.3",
+ "league/commonmark": "^2.2.1",
+ "league/flysystem": "^3.8.0",
+ "monolog/monolog": "^3.0",
+ "nesbot/carbon": "^2.67",
+ "nunomaduro/termwind": "^1.13",
+ "php": "^8.1",
+ "psr/container": "^1.1.1|^2.0.1",
+ "psr/log": "^1.0|^2.0|^3.0",
+ "psr/simple-cache": "^1.0|^2.0|^3.0",
+ "ramsey/uuid": "^4.7",
+ "symfony/console": "^6.2",
+ "symfony/error-handler": "^6.2",
+ "symfony/finder": "^6.2",
+ "symfony/http-foundation": "^6.4",
+ "symfony/http-kernel": "^6.2",
+ "symfony/mailer": "^6.2",
+ "symfony/mime": "^6.2",
+ "symfony/process": "^6.2",
+ "symfony/routing": "^6.2",
+ "symfony/uid": "^6.2",
+ "symfony/var-dumper": "^6.2",
+ "tijsverkoyen/css-to-inline-styles": "^2.2.5",
"vlucas/phpdotenv": "^5.4.1",
- "voku/portable-ascii": "^1.6.1"
+ "voku/portable-ascii": "^2.0"
},
"conflict": {
+ "carbonphp/carbon-doctrine-types": ">=3.0",
+ "doctrine/dbal": ">=4.0",
+ "mockery/mockery": "1.6.8",
+ "phpunit/phpunit": ">=11.0.0",
"tightenco/collect": "<5.5.33"
},
"provide": {
- "psr/container-implementation": "1.0",
- "psr/simple-cache-implementation": "1.0"
+ "psr/container-implementation": "1.1|2.0",
+ "psr/simple-cache-implementation": "1.0|2.0|3.0"
},
"replace": {
"illuminate/auth": "self.version",
@@ -558,6 +798,7 @@
"illuminate/bus": "self.version",
"illuminate/cache": "self.version",
"illuminate/collections": "self.version",
+ "illuminate/conditionable": "self.version",
"illuminate/config": "self.version",
"illuminate/console": "self.version",
"illuminate/container": "self.version",
@@ -575,6 +816,7 @@
"illuminate/notifications": "self.version",
"illuminate/pagination": "self.version",
"illuminate/pipeline": "self.version",
+ "illuminate/process": "self.version",
"illuminate/queue": "self.version",
"illuminate/redis": "self.version",
"illuminate/routing": "self.version",
@@ -586,59 +828,76 @@
"illuminate/view": "self.version"
},
"require-dev": {
- "aws/aws-sdk-php": "^3.198.1",
- "doctrine/dbal": "^2.13.3|^3.1.4",
- "filp/whoops": "^2.14.3",
- "guzzlehttp/guzzle": "^6.5.5|^7.0.1",
- "league/flysystem-cached-adapter": "^1.0",
- "mockery/mockery": "^1.4.4",
- "orchestra/testbench-core": "^6.27",
+ "ably/ably-php": "^1.0",
+ "aws/aws-sdk-php": "^3.235.5",
+ "doctrine/dbal": "^3.5.1",
+ "ext-gmp": "*",
+ "fakerphp/faker": "^1.21",
+ "guzzlehttp/guzzle": "^7.5",
+ "league/flysystem-aws-s3-v3": "^3.0",
+ "league/flysystem-ftp": "^3.0",
+ "league/flysystem-path-prefixing": "^3.3",
+ "league/flysystem-read-only": "^3.3",
+ "league/flysystem-sftp-v3": "^3.0",
+ "mockery/mockery": "^1.5.1",
+ "nyholm/psr7": "^1.2",
+ "orchestra/testbench-core": "^8.23.4",
"pda/pheanstalk": "^4.0",
- "phpunit/phpunit": "^8.5.19|^9.5.8",
- "predis/predis": "^1.1.9",
- "symfony/cache": "^5.4"
+ "phpstan/phpstan": "^1.4.7",
+ "phpunit/phpunit": "^10.0.7",
+ "predis/predis": "^2.0.2",
+ "symfony/cache": "^6.2",
+ "symfony/http-client": "^6.2.4",
+ "symfony/psr-http-message-bridge": "^2.0"
},
"suggest": {
"ably/ably-php": "Required to use the Ably broadcast driver (^1.0).",
- "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.198.1).",
+ "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).",
"brianium/paratest": "Required to run tests in parallel (^6.0).",
- "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).",
- "ext-bcmath": "Required to use the multiple_of validation rule.",
+ "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).",
+ "ext-apcu": "Required to use the APC cache driver.",
+ "ext-fileinfo": "Required to use the Filesystem class.",
"ext-ftp": "Required to use the Flysystem FTP driver.",
"ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().",
"ext-memcached": "Required to use the memcache cache driver.",
- "ext-pcntl": "Required to use all features of the queue worker.",
+ "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.",
+ "ext-pdo": "Required to use all database features.",
"ext-posix": "Required to use all features of the queue worker.",
"ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).",
"fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
"filp/whoops": "Required for friendly error pages in development (^2.14.3).",
- "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).",
+ "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).",
"laravel/tinker": "Required to use the tinker console command (^2.0).",
- "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).",
- "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).",
- "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).",
- "mockery/mockery": "Required to use mocking (^1.4.4).",
+ "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).",
+ "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).",
+ "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).",
+ "league/flysystem-read-only": "Required to use read-only disks (^3.3)",
+ "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).",
+ "mockery/mockery": "Required to use mocking (^1.5.1).",
"nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).",
"pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).",
- "phpunit/phpunit": "Required to use assertions and run tests (^8.5.19|^9.5.8).",
- "predis/predis": "Required to use the predis connector (^1.1.9).",
+ "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).",
+ "predis/predis": "Required to use the predis connector (^2.0.2).",
"psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
- "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0|^6.0|^7.0).",
- "symfony/cache": "Required to PSR-6 cache bridge (^5.4).",
- "symfony/filesystem": "Required to enable support for relative symbolic links (^5.4).",
- "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).",
- "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)."
+ "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).",
+ "symfony/cache": "Required to PSR-6 cache bridge (^6.2).",
+ "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).",
+ "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).",
+ "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).",
+ "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).",
+ "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)."
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "8.x-dev"
+ "dev-master": "10.x-dev"
}
},
"autoload": {
"files": [
"src/Illuminate/Collections/helpers.php",
"src/Illuminate/Events/functions.php",
+ "src/Illuminate/Filesystem/functions.php",
"src/Illuminate/Foundation/helpers.php",
"src/Illuminate/Support/helpers.php"
],
@@ -646,7 +905,8 @@
"Illuminate\\": "src/Illuminate/",
"Illuminate\\Support\\": [
"src/Illuminate/Macroable/",
- "src/Illuminate/Collections/"
+ "src/Illuminate/Collections/",
+ "src/Illuminate/Conditionable/"
]
}
},
@@ -670,29 +930,88 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2022-04-12T13:49:56+00:00"
+ "time": "2024-07-23T16:06:06+00:00"
+ },
+ {
+ "name": "laravel/prompts",
+ "version": "v0.1.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/prompts.git",
+ "reference": "409b0b4305273472f3754826e68f4edbd0150149"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/prompts/zipball/409b0b4305273472f3754826e68f4edbd0150149",
+ "reference": "409b0b4305273472f3754826e68f4edbd0150149",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "illuminate/collections": "^10.0|^11.0",
+ "php": "^8.1",
+ "symfony/console": "^6.2|^7.0"
+ },
+ "conflict": {
+ "illuminate/console": ">=10.17.0 <10.25.0",
+ "laravel/framework": ">=10.17.0 <10.25.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.5",
+ "pestphp/pest": "^2.3",
+ "phpstan/phpstan": "^1.11",
+ "phpstan/phpstan-mockery": "^1.1"
+ },
+ "suggest": {
+ "ext-pcntl": "Required for the spinner to be animated."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "0.1.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
+ "psr-4": {
+ "Laravel\\Prompts\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Add beautiful and user-friendly forms to your command-line applications.",
+ "support": {
+ "issues": "https://github.com/laravel/prompts/issues",
+ "source": "https://github.com/laravel/prompts/tree/v0.1.24"
+ },
+ "time": "2024-06-17T13:58:22+00:00"
},
{
"name": "laravel/serializable-closure",
- "version": "v1.1.1",
+ "version": "v1.3.3",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
- "reference": "9e4b005daa20b0c161f3845040046dc9ddc1d74e"
+ "reference": "3dbf8a8e914634c48d389c1234552666b3d43754"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/9e4b005daa20b0c161f3845040046dc9ddc1d74e",
- "reference": "9e4b005daa20b0c161f3845040046dc9ddc1d74e",
+ "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754",
+ "reference": "3dbf8a8e914634c48d389c1234552666b3d43754",
"shasum": ""
},
"require": {
"php": "^7.3|^8.0"
},
"require-dev": {
- "pestphp/pest": "^1.18",
- "phpstan/phpstan": "^0.12.98",
- "symfony/var-dumper": "^5.3"
+ "nesbot/carbon": "^2.61",
+ "pestphp/pest": "^1.21.3",
+ "phpstan/phpstan": "^1.8.2",
+ "symfony/var-dumper": "^5.4.11"
},
"type": "library",
"extra": {
@@ -729,20 +1048,20 @@
"issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure"
},
- "time": "2022-02-11T19:23:53+00:00"
+ "time": "2023-11-08T14:08:06+00:00"
},
{
"name": "league/commonmark",
- "version": "2.3.0",
+ "version": "2.5.1",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/commonmark.git",
- "reference": "32a49eb2b38fe5e5c417ab748a45d0beaab97955"
+ "reference": "ac815920de0eff6de947eac0a6a94e5ed0fb147c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/32a49eb2b38fe5e5c417ab748a45d0beaab97955",
- "reference": "32a49eb2b38fe5e5c417ab748a45d0beaab97955",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/ac815920de0eff6de947eac0a6a94e5ed0fb147c",
+ "reference": "ac815920de0eff6de947eac0a6a94e5ed0fb147c",
"shasum": ""
},
"require": {
@@ -755,22 +1074,22 @@
},
"require-dev": {
"cebe/markdown": "^1.0",
- "commonmark/cmark": "0.30.0",
- "commonmark/commonmark.js": "0.30.0",
+ "commonmark/cmark": "0.31.0",
+ "commonmark/commonmark.js": "0.31.0",
"composer/package-versions-deprecated": "^1.8",
"embed/embed": "^4.4",
"erusev/parsedown": "^1.0",
"ext-json": "*",
"github/gfm": "0.29.0",
- "michelf/php-markdown": "^1.4",
+ "michelf/php-markdown": "^1.4 || ^2.0",
"nyholm/psr7": "^1.5",
- "phpstan/phpstan": "^0.12.88 || ^1.0.0",
- "phpunit/phpunit": "^9.5.5",
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
"scrutinizer/ocular": "^1.8.1",
- "symfony/finder": "^5.3",
- "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0",
- "unleashedtech/php-coding-standard": "^3.1",
- "vimeo/psalm": "^4.7.3"
+ "symfony/finder": "^5.3 | ^6.0 || ^7.0",
+ "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0",
+ "unleashedtech/php-coding-standard": "^3.1.1",
+ "vimeo/psalm": "^4.24.0 || ^5.0.0"
},
"suggest": {
"symfony/yaml": "v2.3+ required if using the Front Matter extension"
@@ -778,7 +1097,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.4-dev"
+ "dev-main": "2.6-dev"
}
},
"autoload": {
@@ -835,20 +1154,20 @@
"type": "tidelift"
}
],
- "time": "2022-04-07T22:37:05+00:00"
+ "time": "2024-07-24T12:52:09+00:00"
},
{
"name": "league/config",
- "version": "v1.1.1",
+ "version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/config.git",
- "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e"
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e",
- "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e",
+ "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
"shasum": ""
},
"require": {
@@ -857,7 +1176,7 @@
"php": "^7.4 || ^8.0"
},
"require-dev": {
- "phpstan/phpstan": "^0.12.90",
+ "phpstan/phpstan": "^1.8.2",
"phpunit/phpunit": "^9.5.5",
"scrutinizer/ocular": "^1.8.1",
"unleashedtech/php-coding-standard": "^3.1",
@@ -917,58 +1236,59 @@
"type": "github"
}
],
- "time": "2021-08-14T12:15:32+00:00"
+ "time": "2022-12-11T20:36:23+00:00"
},
{
"name": "league/flysystem",
- "version": "1.1.9",
+ "version": "3.28.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
- "reference": "094defdb4a7001845300334e7c1ee2335925ef99"
+ "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/094defdb4a7001845300334e7c1ee2335925ef99",
- "reference": "094defdb4a7001845300334e7c1ee2335925ef99",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c",
+ "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c",
"shasum": ""
},
"require": {
- "ext-fileinfo": "*",
- "league/mime-type-detection": "^1.3",
- "php": "^7.2.5 || ^8.0"
+ "league/flysystem-local": "^3.0.0",
+ "league/mime-type-detection": "^1.0.0",
+ "php": "^8.0.2"
},
"conflict": {
- "league/flysystem-sftp": "<1.0.6"
+ "async-aws/core": "<1.19.0",
+ "async-aws/s3": "<1.14.0",
+ "aws/aws-sdk-php": "3.209.31 || 3.210.0",
+ "guzzlehttp/guzzle": "<7.0",
+ "guzzlehttp/ringphp": "<1.1.1",
+ "phpseclib/phpseclib": "3.0.15",
+ "symfony/http-client": "<5.2"
},
"require-dev": {
- "phpspec/prophecy": "^1.11.1",
- "phpunit/phpunit": "^8.5.8"
- },
- "suggest": {
- "ext-ftp": "Allows you to use FTP server storage",
- "ext-openssl": "Allows you to use FTPS server storage",
- "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
- "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
- "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
- "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
- "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
- "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
- "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
- "league/flysystem-webdav": "Allows you to use WebDAV storage",
- "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
- "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
- "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
+ "async-aws/s3": "^1.5 || ^2.0",
+ "async-aws/simple-s3": "^1.1 || ^2.0",
+ "aws/aws-sdk-php": "^3.295.10",
+ "composer/semver": "^3.0",
+ "ext-fileinfo": "*",
+ "ext-ftp": "*",
+ "ext-mongodb": "^1.3",
+ "ext-zip": "*",
+ "friendsofphp/php-cs-fixer": "^3.5",
+ "google/cloud-storage": "^1.23",
+ "guzzlehttp/psr7": "^2.6",
+ "microsoft/azure-storage-blob": "^1.1",
+ "mongodb/mongodb": "^1.2",
+ "phpseclib/phpseclib": "^3.0.36",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^9.5.11|^10.0",
+ "sabre/dav": "^4.6.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1-dev"
- }
- },
"autoload": {
"psr-4": {
- "League\\Flysystem\\": "src/"
+ "League\\Flysystem\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -978,63 +1298,100 @@
"authors": [
{
"name": "Frank de Jonge",
- "email": "info@frenky.net"
+ "email": "info@frankdejonge.nl"
}
],
- "description": "Filesystem abstraction: Many filesystems, one API.",
+ "description": "File storage abstraction for PHP",
"keywords": [
- "Cloud Files",
"WebDAV",
- "abstraction",
"aws",
"cloud",
- "copy.com",
- "dropbox",
- "file systems",
+ "file",
"files",
"filesystem",
"filesystems",
"ftp",
- "rackspace",
- "remote",
"s3",
"sftp",
"storage"
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
- "source": "https://github.com/thephpleague/flysystem/tree/1.1.9"
+ "source": "https://github.com/thephpleague/flysystem/tree/3.28.0"
},
- "funding": [
+ "time": "2024-05-22T10:09:12+00:00"
+ },
+ {
+ "name": "league/flysystem-local",
+ "version": "3.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem-local.git",
+ "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40",
+ "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40",
+ "shasum": ""
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "league/flysystem": "^3.0.0",
+ "league/mime-type-detection": "^1.0.0",
+ "php": "^8.0.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\Flysystem\\Local\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
{
- "url": "https://offset.earth/frankdejonge",
- "type": "other"
+ "name": "Frank de Jonge",
+ "email": "info@frankdejonge.nl"
}
],
- "time": "2021-12-09T09:40:50+00:00"
+ "description": "Local filesystem adapter for Flysystem.",
+ "keywords": [
+ "Flysystem",
+ "file",
+ "files",
+ "filesystem",
+ "local"
+ ],
+ "support": {
+ "source": "https://github.com/thephpleague/flysystem-local/tree/3.28.0"
+ },
+ "time": "2024-05-06T20:05:52+00:00"
},
{
"name": "league/mime-type-detection",
- "version": "1.10.0",
+ "version": "1.15.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/mime-type-detection.git",
- "reference": "3e4a35d756eedc67096f30240a68a3149120dae7"
+ "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/3e4a35d756eedc67096f30240a68a3149120dae7",
- "reference": "3e4a35d756eedc67096f30240a68a3149120dae7",
+ "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301",
+ "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301",
"shasum": ""
},
"require": {
"ext-fileinfo": "*",
- "php": "^7.2 || ^8.0"
+ "php": "^7.4 || ^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.2",
"phpstan/phpstan": "^0.12.68",
- "phpunit/phpunit": "^8.5.8 || ^9.3"
+ "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0"
},
"type": "library",
"autoload": {
@@ -1055,7 +1412,7 @@
"description": "Mime-type detection for Flysystem",
"support": {
"issues": "https://github.com/thephpleague/mime-type-detection/issues",
- "source": "https://github.com/thephpleague/mime-type-detection/tree/1.10.0"
+ "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0"
},
"funding": [
{
@@ -1067,44 +1424,47 @@
"type": "tidelift"
}
],
- "time": "2022-04-11T12:49:04+00:00"
+ "time": "2024-01-28T23:22:08+00:00"
},
{
"name": "monolog/monolog",
- "version": "2.5.0",
+ "version": "3.7.0",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "4192345e260f1d51b365536199744b987e160edc"
+ "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/4192345e260f1d51b365536199744b987e160edc",
- "reference": "4192345e260f1d51b365536199744b987e160edc",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8",
+ "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8",
"shasum": ""
},
"require": {
- "php": ">=7.2",
- "psr/log": "^1.0.1 || ^2.0 || ^3.0"
+ "php": ">=8.1",
+ "psr/log": "^2.0 || ^3.0"
},
"provide": {
- "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"
+ "psr/log-implementation": "3.0.0"
},
"require-dev": {
- "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+ "aws/aws-sdk-php": "^3.0",
"doctrine/couchdb": "~1.0@dev",
- "elasticsearch/elasticsearch": "^7",
- "graylog2/gelf-php": "^1.4.2",
+ "elasticsearch/elasticsearch": "^7 || ^8",
+ "ext-json": "*",
+ "graylog2/gelf-php": "^1.4.2 || ^2.0",
+ "guzzlehttp/guzzle": "^7.4.5",
+ "guzzlehttp/psr7": "^2.2",
"mongodb/mongodb": "^1.8",
"php-amqplib/php-amqplib": "~2.4 || ^3",
- "php-console/php-console": "^3.1.3",
- "phpspec/prophecy": "^1.6.1",
- "phpstan/phpstan": "^0.12.91",
- "phpunit/phpunit": "^8.5",
- "predis/predis": "^1.1",
- "rollbar/rollbar": "^1.3 || ^2 || ^3",
- "ruflin/elastica": ">=0.90@dev",
- "swiftmailer/swiftmailer": "^5.3|^6.0"
+ "phpstan/phpstan": "^1.9",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.4",
+ "phpunit/phpunit": "^10.5.17",
+ "predis/predis": "^1.1 || ^2",
+ "ruflin/elastica": "^7",
+ "symfony/mailer": "^5.4 || ^6",
+ "symfony/mime": "^5.4 || ^6"
},
"suggest": {
"aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
@@ -1119,14 +1479,13 @@
"graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
"mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
"php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
- "php-console/php-console": "Allow sending log messages to Google Chrome",
"rollbar/rollbar": "Allow sending log messages to Rollbar",
"ruflin/elastica": "Allow sending log messages to an Elastic Search server"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.x-dev"
+ "dev-main": "3.x-dev"
}
},
"autoload": {
@@ -1154,7 +1513,7 @@
],
"support": {
"issues": "https://github.com/Seldaek/monolog/issues",
- "source": "https://github.com/Seldaek/monolog/tree/2.5.0"
+ "source": "https://github.com/Seldaek/monolog/tree/3.7.0"
},
"funding": [
{
@@ -1166,38 +1525,45 @@
"type": "tidelift"
}
],
- "time": "2022-04-08T15:43:54+00:00"
+ "time": "2024-06-28T09:40:51+00:00"
},
{
"name": "nesbot/carbon",
- "version": "2.57.0",
+ "version": "2.72.5",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
- "reference": "4a54375c21eea4811dbd1149fe6b246517554e78"
+ "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4a54375c21eea4811dbd1149fe6b246517554e78",
- "reference": "4a54375c21eea4811dbd1149fe6b246517554e78",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/afd46589c216118ecd48ff2b95d77596af1e57ed",
+ "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed",
"shasum": ""
},
"require": {
+ "carbonphp/carbon-doctrine-types": "*",
"ext-json": "*",
"php": "^7.1.8 || ^8.0",
+ "psr/clock": "^1.0",
"symfony/polyfill-mbstring": "^1.0",
"symfony/polyfill-php80": "^1.16",
"symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0"
},
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
"require-dev": {
- "doctrine/dbal": "^2.0 || ^3.0",
- "doctrine/orm": "^2.7",
+ "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0",
+ "doctrine/orm": "^2.7 || ^3.0",
"friendsofphp/php-cs-fixer": "^3.0",
"kylekatarnls/multi-tester": "^2.0",
+ "ondrejmirtes/better-reflection": "*",
"phpmd/phpmd": "^2.9",
"phpstan/extension-installer": "^1.0",
- "phpstan/phpstan": "^0.12.54 || ^1.0",
- "phpunit/phpunit": "^7.5.20 || ^8.5.14",
+ "phpstan/phpstan": "^0.12.99 || ^1.7.14",
+ "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20",
"squizlabs/php_codesniffer": "^3.4"
},
"bin": [
@@ -1206,8 +1572,8 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-3.x": "3.x-dev",
- "dev-master": "2.x-dev"
+ "dev-master": "3.x-dev",
+ "dev-2.x": "2.x-dev"
},
"laravel": {
"providers": [
@@ -1254,43 +1620,47 @@
},
"funding": [
{
- "url": "https://opencollective.com/Carbon",
- "type": "open_collective"
+ "url": "https://github.com/sponsors/kylekatarnls",
+ "type": "github"
},
{
- "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "url": "https://opencollective.com/Carbon#sponsor",
+ "type": "opencollective"
+ },
+ {
+ "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme",
"type": "tidelift"
}
],
- "time": "2022-02-13T18:13:33+00:00"
+ "time": "2024-06-03T19:18:41+00:00"
},
{
"name": "nette/schema",
- "version": "v1.2.2",
+ "version": "v1.3.0",
"source": {
"type": "git",
"url": "https://github.com/nette/schema.git",
- "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df"
+ "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df",
- "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df",
+ "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188",
+ "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188",
"shasum": ""
},
"require": {
- "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0",
- "php": ">=7.1 <8.2"
+ "nette/utils": "^4.0",
+ "php": "8.1 - 8.3"
},
"require-dev": {
- "nette/tester": "^2.3 || ^2.4",
- "phpstan/phpstan-nette": "^0.12",
- "tracy/tracy": "^2.7"
+ "nette/tester": "^2.4",
+ "phpstan/phpstan-nette": "^1.0",
+ "tracy/tracy": "^2.8"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2-dev"
+ "dev-master": "1.3-dev"
}
},
"autoload": {
@@ -1322,34 +1692,36 @@
],
"support": {
"issues": "https://github.com/nette/schema/issues",
- "source": "https://github.com/nette/schema/tree/v1.2.2"
+ "source": "https://github.com/nette/schema/tree/v1.3.0"
},
- "time": "2021-10-15T11:40:02+00:00"
+ "time": "2023-12-11T11:54:22+00:00"
},
{
"name": "nette/utils",
- "version": "v3.2.7",
+ "version": "v4.0.4",
"source": {
"type": "git",
"url": "https://github.com/nette/utils.git",
- "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99"
+ "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/utils/zipball/0af4e3de4df9f1543534beab255ccf459e7a2c99",
- "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99",
+ "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218",
+ "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218",
"shasum": ""
},
"require": {
- "php": ">=7.2 <8.2"
+ "php": ">=8.0 <8.4"
},
"conflict": {
- "nette/di": "<3.0.6"
+ "nette/finder": "<3",
+ "nette/schema": "<1.2.2"
},
"require-dev": {
- "nette/tester": "~2.0",
+ "jetbrains/phpstorm-attributes": "dev-master",
+ "nette/tester": "^2.5",
"phpstan/phpstan": "^1.0",
- "tracy/tracy": "^2.3"
+ "tracy/tracy": "^2.9"
},
"suggest": {
"ext-gd": "to use Image",
@@ -1357,13 +1729,12 @@
"ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
"ext-json": "to use Nette\\Utils\\Json",
"ext-mbstring": "to use Strings::lower() etc...",
- "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()",
- "ext-xml": "to use Strings::length() etc. when mbstring is not available"
+ "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "4.0-dev"
}
},
"autoload": {
@@ -1407,43 +1778,55 @@
],
"support": {
"issues": "https://github.com/nette/utils/issues",
- "source": "https://github.com/nette/utils/tree/v3.2.7"
+ "source": "https://github.com/nette/utils/tree/v4.0.4"
},
- "time": "2022-01-24T11:29:14+00:00"
+ "time": "2024-01-17T16:50:36+00:00"
},
{
- "name": "opis/closure",
- "version": "3.6.3",
+ "name": "nunomaduro/termwind",
+ "version": "v1.15.1",
"source": {
"type": "git",
- "url": "https://github.com/opis/closure.git",
- "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad"
+ "url": "https://github.com/nunomaduro/termwind.git",
+ "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/opis/closure/zipball/3d81e4309d2a927abbe66df935f4bb60082805ad",
- "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad",
+ "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc",
+ "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc",
"shasum": ""
},
"require": {
- "php": "^5.4 || ^7.0 || ^8.0"
+ "ext-mbstring": "*",
+ "php": "^8.0",
+ "symfony/console": "^5.3.0|^6.0.0"
},
"require-dev": {
- "jeremeamia/superclosure": "^2.0",
- "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
+ "ergebnis/phpstan-rules": "^1.0.",
+ "illuminate/console": "^8.0|^9.0",
+ "illuminate/support": "^8.0|^9.0",
+ "laravel/pint": "^1.0.0",
+ "pestphp/pest": "^1.21.0",
+ "pestphp/pest-plugin-mock": "^1.0",
+ "phpstan/phpstan": "^1.4.6",
+ "phpstan/phpstan-strict-rules": "^1.1.0",
+ "symfony/var-dumper": "^5.2.7|^6.0.0",
+ "thecodingmachine/phpstan-strict-rules": "^1.0.0"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "3.6.x-dev"
+ "laravel": {
+ "providers": [
+ "Termwind\\Laravel\\TermwindServiceProvider"
+ ]
}
},
"autoload": {
"files": [
- "functions.php"
+ "src/Functions.php"
],
"psr-4": {
- "Opis\\Closure\\": "src/"
+ "Termwind\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1452,55 +1835,68 @@
],
"authors": [
{
- "name": "Marius Sarca",
- "email": "marius.sarca@gmail.com"
- },
- {
- "name": "Sorin Sarca",
- "email": "sarca_sorin@hotmail.com"
+ "name": "Nuno Maduro",
+ "email": "enunomaduro@gmail.com"
}
],
- "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.",
- "homepage": "https://opis.io/closure",
+ "description": "Its like Tailwind CSS, but for the console.",
"keywords": [
- "anonymous functions",
- "closure",
- "function",
- "serializable",
- "serialization",
- "serialize"
+ "cli",
+ "console",
+ "css",
+ "package",
+ "php",
+ "style"
],
"support": {
- "issues": "https://github.com/opis/closure/issues",
- "source": "https://github.com/opis/closure/tree/3.6.3"
+ "issues": "https://github.com/nunomaduro/termwind/issues",
+ "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1"
},
- "time": "2022-01-27T09:35:39+00:00"
+ "funding": [
+ {
+ "url": "https://www.paypal.com/paypalme/enunomaduro",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/nunomaduro",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/xiCO2k",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-08T01:06:31+00:00"
},
{
"name": "phpoption/phpoption",
- "version": "1.8.1",
+ "version": "1.9.3",
"source": {
"type": "git",
"url": "https://github.com/schmittjoh/php-option.git",
- "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15"
+ "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15",
- "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15",
+ "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54",
+ "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54",
"shasum": ""
},
"require": {
- "php": "^7.0 || ^8.0"
+ "php": "^7.2.5 || ^8.0"
},
"require-dev": {
- "bamarni/composer-bin-plugin": "^1.4.1",
- "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8"
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28"
},
"type": "library",
"extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ },
"branch-alias": {
- "dev-master": "1.8-dev"
+ "dev-master": "1.9-dev"
}
},
"autoload": {
@@ -1533,7 +1929,7 @@
],
"support": {
"issues": "https://github.com/schmittjoh/php-option/issues",
- "source": "https://github.com/schmittjoh/php-option/tree/1.8.1"
+ "source": "https://github.com/schmittjoh/php-option/tree/1.9.3"
},
"funding": [
{
@@ -1545,26 +1941,79 @@
"type": "tidelift"
}
],
- "time": "2021-12-04T23:24:31+00:00"
+ "time": "2024-07-20T21:41:07+00:00"
+ },
+ {
+ "name": "psr/clock",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/clock.git",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Clock\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for reading the clock.",
+ "homepage": "https://github.com/php-fig/clock",
+ "keywords": [
+ "clock",
+ "now",
+ "psr",
+ "psr-20",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/clock/issues",
+ "source": "https://github.com/php-fig/clock/tree/1.0.0"
+ },
+ "time": "2022-11-25T14:36:26+00:00"
},
{
"name": "psr/container",
- "version": "1.1.2",
+ "version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
- "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
- "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
"shasum": ""
},
"require": {
"php": ">=7.4.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
"Psr\\Container\\": "src/"
@@ -1591,9 +2040,9 @@
],
"support": {
"issues": "https://github.com/php-fig/container/issues",
- "source": "https://github.com/php-fig/container/tree/1.1.2"
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
},
- "time": "2021-11-05T16:50:12+00:00"
+ "time": "2021-11-05T16:47:00+00:00"
},
{
"name": "psr/event-dispatcher",
@@ -1647,16 +2096,16 @@
},
{
"name": "psr/log",
- "version": "2.0.0",
+ "version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376"
+ "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376",
- "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
+ "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
"shasum": ""
},
"require": {
@@ -1665,7 +2114,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "3.x-dev"
}
},
"autoload": {
@@ -1691,31 +2140,31 @@
"psr-3"
],
"support": {
- "source": "https://github.com/php-fig/log/tree/2.0.0"
+ "source": "https://github.com/php-fig/log/tree/3.0.0"
},
- "time": "2021-07-14T16:41:46+00:00"
+ "time": "2021-07-14T16:46:02+00:00"
},
{
"name": "psr/simple-cache",
- "version": "1.0.1",
+ "version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/simple-cache.git",
- "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+ "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
- "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865",
+ "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "php": ">=8.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "3.0.x-dev"
}
},
"autoload": {
@@ -1730,7 +2179,7 @@
"authors": [
{
"name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "homepage": "https://www.php-fig.org/"
}
],
"description": "Common interfaces for simple caching",
@@ -1742,48 +2191,58 @@
"simple-cache"
],
"support": {
- "source": "https://github.com/php-fig/simple-cache/tree/master"
+ "source": "https://github.com/php-fig/simple-cache/tree/3.0.0"
},
- "time": "2017-10-23T01:57:42+00:00"
+ "time": "2021-10-29T13:26:27+00:00"
},
{
"name": "ramsey/collection",
- "version": "1.2.2",
+ "version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/ramsey/collection.git",
- "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a"
+ "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a",
- "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a",
+ "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5",
+ "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5",
"shasum": ""
},
"require": {
- "php": "^7.3 || ^8",
- "symfony/polyfill-php81": "^1.23"
+ "php": "^8.1"
},
"require-dev": {
- "captainhook/captainhook": "^5.3",
- "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
- "ergebnis/composer-normalize": "^2.6",
- "fakerphp/faker": "^1.5",
- "hamcrest/hamcrest-php": "^2",
- "jangregor/phpstan-prophecy": "^0.8",
- "mockery/mockery": "^1.3",
+ "captainhook/plugin-composer": "^5.3",
+ "ergebnis/composer-normalize": "^2.28.3",
+ "fakerphp/faker": "^1.21",
+ "hamcrest/hamcrest-php": "^2.0",
+ "jangregor/phpstan-prophecy": "^1.0",
+ "mockery/mockery": "^1.5",
+ "php-parallel-lint/php-console-highlighter": "^1.0",
+ "php-parallel-lint/php-parallel-lint": "^1.3",
+ "phpcsstandards/phpcsutils": "^1.0.0-rc1",
"phpspec/prophecy-phpunit": "^2.0",
- "phpstan/extension-installer": "^1",
- "phpstan/phpstan": "^0.12.32",
- "phpstan/phpstan-mockery": "^0.12.5",
- "phpstan/phpstan-phpunit": "^0.12.11",
- "phpunit/phpunit": "^8.5 || ^9",
- "psy/psysh": "^0.10.4",
- "slevomat/coding-standard": "^6.3",
- "squizlabs/php_codesniffer": "^3.5",
- "vimeo/psalm": "^4.4"
+ "phpstan/extension-installer": "^1.2",
+ "phpstan/phpstan": "^1.9",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5",
+ "psalm/plugin-mockery": "^1.1",
+ "psalm/plugin-phpunit": "^0.18.4",
+ "ramsey/coding-standard": "^2.0.3",
+ "ramsey/conventional-commits": "^1.3",
+ "vimeo/psalm": "^5.4"
},
"type": "library",
+ "extra": {
+ "captainhook": {
+ "force-install": true
+ },
+ "ramsey/conventional-commits": {
+ "configFile": "conventional-commits.json"
+ }
+ },
"autoload": {
"psr-4": {
"Ramsey\\Collection\\": "src/"
@@ -1811,7 +2270,7 @@
],
"support": {
"issues": "https://github.com/ramsey/collection/issues",
- "source": "https://github.com/ramsey/collection/tree/1.2.2"
+ "source": "https://github.com/ramsey/collection/tree/2.0.0"
},
"funding": [
{
@@ -1823,28 +2282,27 @@
"type": "tidelift"
}
],
- "time": "2021-10-10T03:01:02+00:00"
+ "time": "2022-12-31T21:50:55+00:00"
},
{
"name": "ramsey/uuid",
- "version": "4.3.1",
+ "version": "4.7.6",
"source": {
"type": "git",
"url": "https://github.com/ramsey/uuid.git",
- "reference": "8505afd4fea63b81a85d3b7b53ac3cb8dc347c28"
+ "reference": "91039bc1faa45ba123c4328958e620d382ec7088"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ramsey/uuid/zipball/8505afd4fea63b81a85d3b7b53ac3cb8dc347c28",
- "reference": "8505afd4fea63b81a85d3b7b53ac3cb8dc347c28",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088",
+ "reference": "91039bc1faa45ba123c4328958e620d382ec7088",
"shasum": ""
},
"require": {
- "brick/math": "^0.8 || ^0.9",
- "ext-ctype": "*",
+ "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12",
"ext-json": "*",
"php": "^8.0",
- "ramsey/collection": "^1.0"
+ "ramsey/collection": "^1.2 || ^2.0"
},
"replace": {
"rhumsaa/uuid": "self.version"
@@ -1856,24 +2314,23 @@
"doctrine/annotations": "^1.8",
"ergebnis/composer-normalize": "^2.15",
"mockery/mockery": "^1.3",
- "moontoast/math": "^1.1",
"paragonie/random-lib": "^2",
"php-mock/php-mock": "^2.2",
"php-mock/php-mock-mockery": "^1.3",
"php-parallel-lint/php-parallel-lint": "^1.1",
"phpbench/phpbench": "^1.0",
- "phpstan/extension-installer": "^1.0",
- "phpstan/phpstan": "^0.12",
- "phpstan/phpstan-mockery": "^0.12",
- "phpstan/phpstan-phpunit": "^0.12",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.1",
"phpunit/phpunit": "^8.5 || ^9",
- "slevomat/coding-standard": "^7.0",
+ "ramsey/composer-repl": "^1.4",
+ "slevomat/coding-standard": "^8.4",
"squizlabs/php_codesniffer": "^3.5",
"vimeo/psalm": "^4.9"
},
"suggest": {
"ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
- "ext-ctype": "Enables faster processing of character classification using ctype functions.",
"ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
"ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
"paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
@@ -1905,7 +2362,7 @@
],
"support": {
"issues": "https://github.com/ramsey/uuid/issues",
- "source": "https://github.com/ramsey/uuid/tree/4.3.1"
+ "source": "https://github.com/ramsey/uuid/tree/4.7.6"
},
"funding": [
{
@@ -1917,132 +2374,51 @@
"type": "tidelift"
}
],
- "time": "2022-03-27T21:42:02+00:00"
- },
- {
- "name": "swiftmailer/swiftmailer",
- "version": "v6.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/swiftmailer/swiftmailer.git",
- "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c",
- "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c",
- "shasum": ""
- },
- "require": {
- "egulias/email-validator": "^2.0|^3.1",
- "php": ">=7.0.0",
- "symfony/polyfill-iconv": "^1.0",
- "symfony/polyfill-intl-idn": "^1.10",
- "symfony/polyfill-mbstring": "^1.0"
- },
- "require-dev": {
- "mockery/mockery": "^1.0",
- "symfony/phpunit-bridge": "^4.4|^5.4"
- },
- "suggest": {
- "ext-intl": "Needed to support internationalized email addresses"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "6.2-dev"
- }
- },
- "autoload": {
- "files": [
- "lib/swift_required.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Chris Corbyn"
- },
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- }
- ],
- "description": "Swiftmailer, free feature-rich PHP mailer",
- "homepage": "https://swiftmailer.symfony.com",
- "keywords": [
- "email",
- "mail",
- "mailer"
- ],
- "support": {
- "issues": "https://github.com/swiftmailer/swiftmailer/issues",
- "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0"
- },
- "funding": [
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer",
- "type": "tidelift"
- }
- ],
- "abandoned": "symfony/mailer",
- "time": "2021-10-18T15:26:12+00:00"
+ "time": "2024-04-27T21:32:50+00:00"
},
{
"name": "symfony/console",
- "version": "v5.4.7",
+ "version": "v6.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "900275254f0a1a2afff1ab0e11abd5587a10e1d6"
+ "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/900275254f0a1a2afff1ab0e11abd5587a10e1d6",
- "reference": "900275254f0a1a2afff1ab0e11abd5587a10e1d6",
+ "url": "https://api.github.com/repos/symfony/console/zipball/6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9",
+ "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.1|^3",
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0",
- "symfony/polyfill-php73": "^1.9",
- "symfony/polyfill-php80": "^1.16",
- "symfony/service-contracts": "^1.1|^2|^3",
- "symfony/string": "^5.1|^6.0"
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^5.4|^6.0|^7.0"
},
"conflict": {
- "psr/log": ">=3",
- "symfony/dependency-injection": "<4.4",
- "symfony/dotenv": "<5.1",
- "symfony/event-dispatcher": "<4.4",
- "symfony/lock": "<4.4",
- "symfony/process": "<4.4"
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
},
"provide": {
- "psr/log-implementation": "1.0|2.0"
+ "psr/log-implementation": "1.0|2.0|3.0"
},
"require-dev": {
- "psr/log": "^1|^2",
- "symfony/config": "^4.4|^5.0|^6.0",
- "symfony/dependency-injection": "^4.4|^5.0|^6.0",
- "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
- "symfony/lock": "^4.4|^5.0|^6.0",
- "symfony/process": "^4.4|^5.0|^6.0",
- "symfony/var-dumper": "^4.4|^5.0|^6.0"
- },
- "suggest": {
- "psr/log": "For using the console logger",
- "symfony/event-dispatcher": "",
- "symfony/lock": "",
- "symfony/process": ""
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@@ -2071,12 +2447,12 @@
"homepage": "https://symfony.com",
"keywords": [
"cli",
- "command line",
+ "command-line",
"console",
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v5.4.7"
+ "source": "https://github.com/symfony/console/tree/v6.4.9"
},
"funding": [
{
@@ -2092,24 +2468,24 @@
"type": "tidelift"
}
],
- "time": "2022-03-31T17:09:19+00:00"
+ "time": "2024-06-28T09:49:33+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v6.0.3",
+ "version": "v6.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "1955d595c12c111629cc814d3f2a2ff13580508a"
+ "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/1955d595c12c111629cc814d3f2a2ff13580508a",
- "reference": "1955d595c12c111629cc814d3f2a2ff13580508a",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/4b61b02fe15db48e3687ce1c45ea385d1780fe08",
+ "reference": "4b61b02fe15db48e3687ce1c45ea385d1780fe08",
"shasum": ""
},
"require": {
- "php": ">=8.0.2"
+ "php": ">=8.1"
},
"type": "library",
"autoload": {
@@ -2141,7 +2517,7 @@
"description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/css-selector/tree/v6.0.3"
+ "source": "https://github.com/symfony/css-selector/tree/v6.4.8"
},
"funding": [
{
@@ -2157,29 +2533,29 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:55:41+00:00"
+ "time": "2024-05-31T14:49:08+00:00"
},
{
"name": "symfony/deprecation-contracts",
- "version": "v3.0.1",
+ "version": "v3.5.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
+ "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
- "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
+ "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"shasum": ""
},
"require": {
- "php": ">=8.0.2"
+ "php": ">=8.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-main": "3.5-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -2208,7 +2584,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.1"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
},
"funding": [
{
@@ -2224,31 +2600,35 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:55:41+00:00"
+ "time": "2024-04-18T09:32:20+00:00"
},
{
"name": "symfony/error-handler",
- "version": "v5.4.7",
+ "version": "v6.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "060bc01856a1846e3e4385261bc9ed11a1dd7b6a"
+ "reference": "c9b7cc075b3ab484239855622ca05cb0b99c13ec"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/060bc01856a1846e3e4385261bc9ed11a1dd7b6a",
- "reference": "060bc01856a1846e3e4385261bc9ed11a1dd7b6a",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/c9b7cc075b3ab484239855622ca05cb0b99c13ec",
+ "reference": "c9b7cc075b3ab484239855622ca05cb0b99c13ec",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
+ "php": ">=8.1",
"psr/log": "^1|^2|^3",
- "symfony/var-dumper": "^4.4|^5.0|^6.0"
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "conflict": {
+ "symfony/deprecation-contracts": "<2.5",
+ "symfony/http-kernel": "<6.4"
},
"require-dev": {
- "symfony/deprecation-contracts": "^2.1|^3",
- "symfony/http-kernel": "^4.4|^5.0|^6.0",
- "symfony/serializer": "^4.4|^5.0|^6.0"
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/serializer": "^5.4|^6.0|^7.0"
},
"bin": [
"Resources/bin/patch-type-declarations"
@@ -2279,7 +2659,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v5.4.7"
+ "source": "https://github.com/symfony/error-handler/tree/v6.4.9"
},
"funding": [
{
@@ -2295,28 +2675,29 @@
"type": "tidelift"
}
],
- "time": "2022-03-18T16:21:29+00:00"
+ "time": "2024-06-21T16:04:15+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v6.0.3",
+ "version": "v6.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "6472ea2dd415e925b90ca82be64b8bc6157f3934"
+ "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/6472ea2dd415e925b90ca82be64b8bc6157f3934",
- "reference": "6472ea2dd415e925b90ca82be64b8bc6157f3934",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b",
+ "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
- "symfony/event-dispatcher-contracts": "^2|^3"
+ "php": ">=8.1",
+ "symfony/event-dispatcher-contracts": "^2.5|^3"
},
"conflict": {
- "symfony/dependency-injection": "<5.4"
+ "symfony/dependency-injection": "<5.4",
+ "symfony/service-contracts": "<2.5"
},
"provide": {
"psr/event-dispatcher-implementation": "1.0",
@@ -2324,17 +2705,13 @@
},
"require-dev": {
"psr/log": "^1|^2|^3",
- "symfony/config": "^5.4|^6.0",
- "symfony/dependency-injection": "^5.4|^6.0",
- "symfony/error-handler": "^5.4|^6.0",
- "symfony/expression-language": "^5.4|^6.0",
- "symfony/http-foundation": "^5.4|^6.0",
- "symfony/service-contracts": "^1.1|^2|^3",
- "symfony/stopwatch": "^5.4|^6.0"
- },
- "suggest": {
- "symfony/dependency-injection": "",
- "symfony/http-kernel": ""
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/error-handler": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@@ -2362,7 +2739,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.3"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.8"
},
"funding": [
{
@@ -2378,33 +2755,30 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:55:41+00:00"
+ "time": "2024-05-31T14:49:08+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
- "version": "v3.0.1",
+ "version": "v3.5.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
- "reference": "7bc61cc2db649b4637d331240c5346dcc7708051"
+ "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7bc61cc2db649b4637d331240c5346dcc7708051",
- "reference": "7bc61cc2db649b4637d331240c5346dcc7708051",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50",
+ "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
+ "php": ">=8.1",
"psr/event-dispatcher": "^1"
},
- "suggest": {
- "symfony/event-dispatcher-implementation": ""
- },
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-main": "3.5-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -2441,7 +2815,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.1"
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0"
},
"funding": [
{
@@ -2457,26 +2831,27 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:55:41+00:00"
+ "time": "2024-04-18T09:32:20+00:00"
},
{
"name": "symfony/finder",
- "version": "v5.4.3",
+ "version": "v6.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d"
+ "reference": "3ef977a43883215d560a2cecb82ec8e62131471c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/231313534dded84c7ecaa79d14bc5da4ccb69b7d",
- "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/3ef977a43883215d560a2cecb82ec8e62131471c",
+ "reference": "3ef977a43883215d560a2cecb82ec8e62131471c",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.1|^3",
- "symfony/polyfill-php80": "^1.16"
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.0|^7.0"
},
"type": "library",
"autoload": {
@@ -2504,7 +2879,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v5.4.3"
+ "source": "https://github.com/symfony/finder/tree/v6.4.8"
},
"funding": [
{
@@ -2520,36 +2895,40 @@
"type": "tidelift"
}
],
- "time": "2022-01-26T16:34:36+00:00"
+ "time": "2024-05-31T14:49:08+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v5.4.6",
+ "version": "v6.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "34e89bc147633c0f9dd6caaaf56da3b806a21465"
+ "reference": "27de8cc95e11db7a50b027e71caaab9024545947"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/34e89bc147633c0f9dd6caaaf56da3b806a21465",
- "reference": "34e89bc147633c0f9dd6caaaf56da3b806a21465",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/27de8cc95e11db7a50b027e71caaab9024545947",
+ "reference": "27de8cc95e11db7a50b027e71caaab9024545947",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.1|^3",
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.1",
- "symfony/polyfill-php80": "^1.16"
+ "symfony/polyfill-php83": "^1.27"
},
- "require-dev": {
- "predis/predis": "~1.0",
- "symfony/cache": "^4.4|^5.0|^6.0",
- "symfony/expression-language": "^4.4|^5.0|^6.0",
- "symfony/mime": "^4.4|^5.0|^6.0"
+ "conflict": {
+ "symfony/cache": "<6.3"
},
- "suggest": {
- "symfony/mime": "To use the file extension guesser"
+ "require-dev": {
+ "doctrine/dbal": "^2.13.1|^3|^4",
+ "predis/predis": "^1.1|^2.0",
+ "symfony/cache": "^6.3|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0",
+ "symfony/mime": "^5.4|^6.0|^7.0",
+ "symfony/rate-limiter": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@@ -2577,7 +2956,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v5.4.6"
+ "source": "https://github.com/symfony/http-foundation/tree/v6.4.8"
},
"funding": [
{
@@ -2593,76 +2972,78 @@
"type": "tidelift"
}
],
- "time": "2022-03-05T21:03:43+00:00"
+ "time": "2024-05-31T14:49:08+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v5.4.7",
+ "version": "v6.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "509243b9b3656db966284c45dffce9316c1ecc5c"
+ "reference": "cc4a9bec6e1bdd2405f40277a68a6ed1bb393005"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/509243b9b3656db966284c45dffce9316c1ecc5c",
- "reference": "509243b9b3656db966284c45dffce9316c1ecc5c",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cc4a9bec6e1bdd2405f40277a68a6ed1bb393005",
+ "reference": "cc4a9bec6e1bdd2405f40277a68a6ed1bb393005",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "psr/log": "^1|^2",
- "symfony/deprecation-contracts": "^2.1|^3",
- "symfony/error-handler": "^4.4|^5.0|^6.0",
- "symfony/event-dispatcher": "^5.0|^6.0",
- "symfony/http-foundation": "^5.3.7|^6.0",
- "symfony/polyfill-ctype": "^1.8",
- "symfony/polyfill-php73": "^1.9",
- "symfony/polyfill-php80": "^1.16"
+ "php": ">=8.1",
+ "psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/polyfill-ctype": "^1.8"
},
"conflict": {
"symfony/browser-kit": "<5.4",
- "symfony/cache": "<5.0",
- "symfony/config": "<5.0",
- "symfony/console": "<4.4",
- "symfony/dependency-injection": "<5.3",
- "symfony/doctrine-bridge": "<5.0",
- "symfony/form": "<5.0",
- "symfony/http-client": "<5.0",
- "symfony/mailer": "<5.0",
- "symfony/messenger": "<5.0",
- "symfony/translation": "<5.0",
- "symfony/twig-bridge": "<5.0",
- "symfony/validator": "<5.0",
+ "symfony/cache": "<5.4",
+ "symfony/config": "<6.1",
+ "symfony/console": "<5.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/doctrine-bridge": "<5.4",
+ "symfony/form": "<5.4",
+ "symfony/http-client": "<5.4",
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/mailer": "<5.4",
+ "symfony/messenger": "<5.4",
+ "symfony/translation": "<5.4",
+ "symfony/translation-contracts": "<2.5",
+ "symfony/twig-bridge": "<5.4",
+ "symfony/validator": "<6.4",
+ "symfony/var-dumper": "<6.3",
"twig/twig": "<2.13"
},
"provide": {
- "psr/log-implementation": "1.0|2.0"
+ "psr/log-implementation": "1.0|2.0|3.0"
},
"require-dev": {
"psr/cache": "^1.0|^2.0|^3.0",
- "symfony/browser-kit": "^5.4|^6.0",
- "symfony/config": "^5.0|^6.0",
- "symfony/console": "^4.4|^5.0|^6.0",
- "symfony/css-selector": "^4.4|^5.0|^6.0",
- "symfony/dependency-injection": "^5.3|^6.0",
- "symfony/dom-crawler": "^4.4|^5.0|^6.0",
- "symfony/expression-language": "^4.4|^5.0|^6.0",
- "symfony/finder": "^4.4|^5.0|^6.0",
- "symfony/http-client-contracts": "^1.1|^2|^3",
- "symfony/process": "^4.4|^5.0|^6.0",
- "symfony/routing": "^4.4|^5.0|^6.0",
- "symfony/stopwatch": "^4.4|^5.0|^6.0",
- "symfony/translation": "^4.4|^5.0|^6.0",
- "symfony/translation-contracts": "^1.1|^2|^3",
+ "symfony/browser-kit": "^5.4|^6.0|^7.0",
+ "symfony/clock": "^6.2|^7.0",
+ "symfony/config": "^6.1|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/css-selector": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/dom-crawler": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/http-client-contracts": "^2.5|^3",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/property-access": "^5.4.5|^6.0.5|^7.0",
+ "symfony/routing": "^5.4|^6.0|^7.0",
+ "symfony/serializer": "^6.4.4|^7.0.4",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^5.4|^6.0|^7.0",
+ "symfony/translation-contracts": "^2.5|^3",
+ "symfony/uid": "^5.4|^6.0|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/var-dumper": "^5.4|^6.4|^7.0",
+ "symfony/var-exporter": "^6.2|^7.0",
"twig/twig": "^2.13|^3.0.4"
},
- "suggest": {
- "symfony/browser-kit": "",
- "symfony/config": "",
- "symfony/console": "",
- "symfony/dependency-injection": ""
- },
"type": "library",
"autoload": {
"psr-4": {
@@ -2689,7 +3070,87 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v5.4.7"
+ "source": "https://github.com/symfony/http-kernel/tree/v6.4.9"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-06-28T11:48:06+00:00"
+ },
+ {
+ "name": "symfony/mailer",
+ "version": "v6.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mailer.git",
+ "reference": "e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45",
+ "reference": "e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45",
+ "shasum": ""
+ },
+ "require": {
+ "egulias/email-validator": "^2.1.10|^3|^4",
+ "php": ">=8.1",
+ "psr/event-dispatcher": "^1",
+ "psr/log": "^1|^2|^3",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/mime": "^6.2|^7.0",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/http-kernel": "<5.4",
+ "symfony/messenger": "<6.2",
+ "symfony/mime": "<6.2",
+ "symfony/twig-bridge": "<6.2.1"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/http-client": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^6.2|^7.0",
+ "symfony/twig-bridge": "^6.2|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Helps sending emails",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/mailer/tree/v6.4.9"
},
"funding": [
{
@@ -2705,42 +3166,44 @@
"type": "tidelift"
}
],
- "time": "2022-04-02T06:04:20+00:00"
+ "time": "2024-06-28T07:59:05+00:00"
},
{
"name": "symfony/mime",
- "version": "v5.4.7",
+ "version": "v6.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
- "reference": "92d27a34dea2e199fa9b687e3fff3a7d169b7b1c"
+ "reference": "7d048964877324debdcb4e0549becfa064a20d43"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/92d27a34dea2e199fa9b687e3fff3a7d169b7b1c",
- "reference": "92d27a34dea2e199fa9b687e3fff3a7d169b7b1c",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/7d048964877324debdcb4e0549becfa064a20d43",
+ "reference": "7d048964877324debdcb4e0549becfa064a20d43",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.1|^3",
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-intl-idn": "^1.10",
- "symfony/polyfill-mbstring": "^1.0",
- "symfony/polyfill-php80": "^1.16"
+ "symfony/polyfill-mbstring": "^1.0"
},
"conflict": {
"egulias/email-validator": "~3.0.0",
"phpdocumentor/reflection-docblock": "<3.2.2",
"phpdocumentor/type-resolver": "<1.4.0",
- "symfony/mailer": "<4.4"
+ "symfony/mailer": "<5.4",
+ "symfony/serializer": "<6.4.3|>7.0,<7.0.3"
},
"require-dev": {
- "egulias/email-validator": "^2.1.10|^3.1",
+ "egulias/email-validator": "^2.1.10|^3.1|^4",
+ "league/html-to-markdown": "^5.0",
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
- "symfony/dependency-injection": "^4.4|^5.0|^6.0",
- "symfony/property-access": "^4.4|^5.1|^6.0",
- "symfony/property-info": "^4.4|^5.1|^6.0",
- "symfony/serializer": "^5.2|^6.0"
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.4|^7.0",
+ "symfony/property-access": "^5.4|^6.0|^7.0",
+ "symfony/property-info": "^5.4|^6.0|^7.0",
+ "symfony/serializer": "^6.4.3|^7.0.3"
},
"type": "library",
"autoload": {
@@ -2772,7 +3235,7 @@
"mime-type"
],
"support": {
- "source": "https://github.com/symfony/mime/tree/v5.4.7"
+ "source": "https://github.com/symfony/mime/tree/v6.4.9"
},
"funding": [
{
@@ -2788,20 +3251,20 @@
"type": "tidelift"
}
],
- "time": "2022-03-11T16:08:05+00:00"
+ "time": "2024-06-28T09:49:33+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.25.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "30885182c981ab175d4d034db0f6f469898070ab"
+ "reference": "0424dff1c58f028c451efff2045f5d92410bd540"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab",
- "reference": "30885182c981ab175d4d034db0f6f469898070ab",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540",
+ "reference": "0424dff1c58f028c451efff2045f5d92410bd540",
"shasum": ""
},
"require": {
@@ -2815,9 +3278,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -2854,7 +3314,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0"
},
"funding": [
{
@@ -2870,103 +3330,20 @@
"type": "tidelift"
}
],
- "time": "2021-10-20T20:35:02+00:00"
+ "time": "2024-05-31T15:07:36+00:00"
},
{
- "name": "symfony/polyfill-iconv",
- "version": "v1.25.0",
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.30.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-iconv.git",
- "reference": "f1aed619e28cb077fc83fac8c4c0383578356e40"
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/f1aed619e28cb077fc83fac8c4c0383578356e40",
- "reference": "f1aed619e28cb077fc83fac8c4c0383578356e40",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "provide": {
- "ext-iconv": "*"
- },
- "suggest": {
- "ext-iconv": "For best performance"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "autoload": {
- "files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Iconv\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for the Iconv extension",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "iconv",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-iconv/tree/v1.25.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2022-01-04T09:04:05+00:00"
- },
- {
- "name": "symfony/polyfill-intl-grapheme",
- "version": "v1.25.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "81b86b50cf841a64252b439e738e97f4a34e2783"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783",
- "reference": "81b86b50cf841a64252b439e738e97f4a34e2783",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a",
+ "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a",
"shasum": ""
},
"require": {
@@ -2977,9 +3354,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3018,7 +3392,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0"
},
"funding": [
{
@@ -3034,20 +3408,20 @@
"type": "tidelift"
}
],
- "time": "2021-11-23T21:10:46+00:00"
+ "time": "2024-05-31T15:07:36+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
- "version": "v1.25.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
- "reference": "749045c69efb97c70d25d7463abba812e91f3a44"
+ "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/749045c69efb97c70d25d7463abba812e91f3a44",
- "reference": "749045c69efb97c70d25d7463abba812e91f3a44",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c",
+ "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c",
"shasum": ""
},
"require": {
@@ -3060,9 +3434,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3105,7 +3476,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0"
},
"funding": [
{
@@ -3121,20 +3492,20 @@
"type": "tidelift"
}
],
- "time": "2021-09-14T14:02:44+00:00"
+ "time": "2024-05-31T15:07:36+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
- "version": "v1.25.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
+ "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8",
- "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb",
+ "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb",
"shasum": ""
},
"require": {
@@ -3145,9 +3516,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3189,7 +3557,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0"
},
"funding": [
{
@@ -3205,20 +3573,20 @@
"type": "tidelift"
}
],
- "time": "2021-02-19T12:13:01+00:00"
+ "time": "2024-05-31T15:07:36+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.25.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825"
+ "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825",
- "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c",
+ "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c",
"shasum": ""
},
"require": {
@@ -3232,9 +3600,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3272,7 +3637,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0"
},
"funding": [
{
@@ -3288,20 +3653,20 @@
"type": "tidelift"
}
],
- "time": "2021-11-30T18:21:41+00:00"
+ "time": "2024-06-19T12:30:46+00:00"
},
{
"name": "symfony/polyfill-php72",
- "version": "v1.25.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
- "reference": "9a142215a36a3888e30d0a9eeea9766764e96976"
+ "reference": "10112722600777e02d2745716b70c5db4ca70442"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976",
- "reference": "9a142215a36a3888e30d0a9eeea9766764e96976",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442",
+ "reference": "10112722600777e02d2745716b70c5db4ca70442",
"shasum": ""
},
"require": {
@@ -3309,9 +3674,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3348,7 +3710,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php72/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0"
},
"funding": [
{
@@ -3364,20 +3726,20 @@
"type": "tidelift"
}
],
- "time": "2021-05-27T09:17:38+00:00"
+ "time": "2024-06-19T12:30:46+00:00"
},
{
- "name": "symfony/polyfill-php73",
- "version": "v1.25.0",
+ "name": "symfony/polyfill-php80",
+ "version": "v1.30.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php73.git",
- "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5"
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "77fa7995ac1b21ab60769b7323d600a991a90433"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5",
- "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433",
+ "reference": "77fa7995ac1b21ab60769b7323d600a991a90433",
"shasum": ""
},
"require": {
@@ -3385,9 +3747,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3398,7 +3757,7 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Php73\\": ""
+ "Symfony\\Polyfill\\Php80\\": ""
},
"classmap": [
"Resources/stubs"
@@ -3409,6 +3768,10 @@
"MIT"
],
"authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
@@ -3418,7 +3781,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
@@ -3427,7 +3790,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0"
},
"funding": [
{
@@ -3443,20 +3806,20 @@
"type": "tidelift"
}
],
- "time": "2021-06-05T21:20:04+00:00"
+ "time": "2024-05-31T15:07:36+00:00"
},
{
- "name": "symfony/polyfill-php80",
- "version": "v1.25.0",
+ "name": "symfony/polyfill-php83",
+ "version": "v1.30.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c"
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c",
- "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9",
+ "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9",
"shasum": ""
},
"require": {
@@ -3464,9 +3827,6 @@
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3477,7 +3837,7 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Php80\\": ""
+ "Symfony\\Polyfill\\Php83\\": ""
},
"classmap": [
"Resources/stubs"
@@ -3488,10 +3848,6 @@
"MIT"
],
"authors": [
- {
- "name": "Ion Bazan",
- "email": "ion.bazan@gmail.com"
- },
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
@@ -3501,7 +3857,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
@@ -3510,7 +3866,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0"
},
"funding": [
{
@@ -3526,30 +3882,33 @@
"type": "tidelift"
}
],
- "time": "2022-03-04T08:16:47+00:00"
+ "time": "2024-06-19T12:35:24+00:00"
},
{
- "name": "symfony/polyfill-php81",
- "version": "v1.25.0",
+ "name": "symfony/polyfill-uuid",
+ "version": "v1.30.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php81.git",
- "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f"
+ "url": "https://github.com/symfony/polyfill-uuid.git",
+ "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f",
- "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f",
+ "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/2ba1f33797470debcda07fe9dce20a0003df18e9",
+ "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
+ "provide": {
+ "ext-uuid": "*"
+ },
+ "suggest": {
+ "ext-uuid": "For best performance"
+ },
"type": "library",
"extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
@@ -3560,11 +3919,8 @@
"bootstrap.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Php81\\": ""
- },
- "classmap": [
- "Resources/stubs"
- ]
+ "Symfony\\Polyfill\\Uuid\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3572,24 +3928,24 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Grégoire Pineau",
+ "email": "lyrixx@lyrixx.info"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+ "description": "Symfony polyfill for uuid functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
- "shim"
+ "uuid"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php81/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-uuid/tree/v1.30.0"
},
"funding": [
{
@@ -3605,25 +3961,24 @@
"type": "tidelift"
}
],
- "time": "2021-09-13T13:58:11+00:00"
+ "time": "2024-05-31T15:07:36+00:00"
},
{
"name": "symfony/process",
- "version": "v5.4.7",
+ "version": "v6.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "38a44b2517b470a436e1c944bf9b9ba3961137fb"
+ "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/38a44b2517b470a436e1c944bf9b9ba3961137fb",
- "reference": "38a44b2517b470a436e1c944bf9b9ba3961137fb",
+ "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5",
+ "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/polyfill-php80": "^1.16"
+ "php": ">=8.1"
},
"type": "library",
"autoload": {
@@ -3651,7 +4006,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v5.4.7"
+ "source": "https://github.com/symfony/process/tree/v6.4.8"
},
"funding": [
{
@@ -3667,47 +4022,40 @@
"type": "tidelift"
}
],
- "time": "2022-03-18T16:18:52+00:00"
+ "time": "2024-05-31T14:49:08+00:00"
},
{
"name": "symfony/routing",
- "version": "v5.4.3",
+ "version": "v6.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "44b29c7a94e867ccde1da604792f11a469958981"
+ "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/44b29c7a94e867ccde1da604792f11a469958981",
- "reference": "44b29c7a94e867ccde1da604792f11a469958981",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58",
+ "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.1|^3",
- "symfony/polyfill-php80": "^1.16"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3"
},
"conflict": {
"doctrine/annotations": "<1.12",
- "symfony/config": "<5.3",
- "symfony/dependency-injection": "<4.4",
- "symfony/yaml": "<4.4"
+ "symfony/config": "<6.2",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/yaml": "<5.4"
},
"require-dev": {
- "doctrine/annotations": "^1.12",
+ "doctrine/annotations": "^1.12|^2",
"psr/log": "^1|^2|^3",
- "symfony/config": "^5.3|^6.0",
- "symfony/dependency-injection": "^4.4|^5.0|^6.0",
- "symfony/expression-language": "^4.4|^5.0|^6.0",
- "symfony/http-foundation": "^4.4|^5.0|^6.0",
- "symfony/yaml": "^4.4|^5.0|^6.0"
- },
- "suggest": {
- "symfony/config": "For using the all-in-one router or any loader",
- "symfony/expression-language": "For using expression matching",
- "symfony/http-foundation": "For using a Symfony Request object",
- "symfony/yaml": "For using the YAML loader"
+ "symfony/config": "^6.2|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@@ -3741,7 +4089,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v5.4.3"
+ "source": "https://github.com/symfony/routing/tree/v6.4.8"
},
"funding": [
{
@@ -3757,37 +4105,34 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:53:40+00:00"
+ "time": "2024-05-31T14:49:08+00:00"
},
{
"name": "symfony/service-contracts",
- "version": "v2.5.1",
+ "version": "v3.5.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c"
+ "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c",
- "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
+ "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "psr/container": "^1.1",
- "symfony/deprecation-contracts": "^2.1|^3"
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
},
"conflict": {
"ext-psr": "<1.1|>=2"
},
- "suggest": {
- "symfony/service-implementation": ""
- },
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.5-dev"
+ "dev-main": "3.5-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -3797,7 +4142,10 @@
"autoload": {
"psr-4": {
"Symfony\\Contracts\\Service\\": ""
- }
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3824,7 +4172,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v2.5.1"
+ "source": "https://github.com/symfony/service-contracts/tree/v3.5.0"
},
"funding": [
{
@@ -3840,37 +4188,38 @@
"type": "tidelift"
}
],
- "time": "2022-03-13T20:07:29+00:00"
+ "time": "2024-04-18T09:32:20+00:00"
},
{
"name": "symfony/string",
- "version": "v6.0.3",
+ "version": "v6.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2"
+ "reference": "76792dbd99690a5ebef8050d9206c60c59e681d7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/522144f0c4c004c80d56fa47e40e17028e2eefc2",
- "reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2",
+ "url": "https://api.github.com/repos/symfony/string/zipball/76792dbd99690a5ebef8050d9206c60c59e681d7",
+ "reference": "76792dbd99690a5ebef8050d9206c60c59e681d7",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
+ "php": ">=8.1",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-grapheme": "~1.0",
"symfony/polyfill-intl-normalizer": "~1.0",
"symfony/polyfill-mbstring": "~1.0"
},
"conflict": {
- "symfony/translation-contracts": "<2.0"
+ "symfony/translation-contracts": "<2.5"
},
"require-dev": {
- "symfony/error-handler": "^5.4|^6.0",
- "symfony/http-client": "^5.4|^6.0",
- "symfony/translation-contracts": "^2.0|^3.0",
- "symfony/var-exporter": "^5.4|^6.0"
+ "symfony/error-handler": "^5.4|^6.0|^7.0",
+ "symfony/http-client": "^5.4|^6.0|^7.0",
+ "symfony/intl": "^6.2|^7.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@@ -3909,7 +4258,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v6.0.3"
+ "source": "https://github.com/symfony/string/tree/v6.4.9"
},
"funding": [
{
@@ -3925,32 +4274,35 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:55:41+00:00"
+ "time": "2024-06-28T09:25:38+00:00"
},
{
"name": "symfony/translation",
- "version": "v6.0.7",
+ "version": "v6.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "b2792b39d74cf41ea3065f27fd2ddf0b556ac7a1"
+ "reference": "a002933b13989fc4bd0b58e04bf7eec5210e438a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/b2792b39d74cf41ea3065f27fd2ddf0b556ac7a1",
- "reference": "b2792b39d74cf41ea3065f27fd2ddf0b556ac7a1",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/a002933b13989fc4bd0b58e04bf7eec5210e438a",
+ "reference": "a002933b13989fc4bd0b58e04bf7eec5210e438a",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0",
- "symfony/translation-contracts": "^2.3|^3.0"
+ "symfony/translation-contracts": "^2.5|^3.0"
},
"conflict": {
"symfony/config": "<5.4",
"symfony/console": "<5.4",
"symfony/dependency-injection": "<5.4",
+ "symfony/http-client-contracts": "<2.5",
"symfony/http-kernel": "<5.4",
+ "symfony/service-contracts": "<2.5",
"symfony/twig-bundle": "<5.4",
"symfony/yaml": "<5.4"
},
@@ -3958,22 +4310,19 @@
"symfony/translation-implementation": "2.3|3.0"
},
"require-dev": {
+ "nikic/php-parser": "^4.18|^5.0",
"psr/log": "^1|^2|^3",
- "symfony/config": "^5.4|^6.0",
- "symfony/console": "^5.4|^6.0",
- "symfony/dependency-injection": "^5.4|^6.0",
- "symfony/finder": "^5.4|^6.0",
- "symfony/http-client-contracts": "^1.1|^2.0|^3.0",
- "symfony/http-kernel": "^5.4|^6.0",
- "symfony/intl": "^5.4|^6.0",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/http-client-contracts": "^2.5|^3.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/intl": "^5.4|^6.0|^7.0",
"symfony/polyfill-intl-icu": "^1.21",
- "symfony/service-contracts": "^1.1.2|^2|^3",
- "symfony/yaml": "^5.4|^6.0"
- },
- "suggest": {
- "psr/log-implementation": "To use logging capability in translator",
- "symfony/config": "",
- "symfony/yaml": ""
+ "symfony/routing": "^5.4|^6.0|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@@ -4004,7 +4353,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/translation/tree/v6.0.7"
+ "source": "https://github.com/symfony/translation/tree/v6.4.8"
},
"funding": [
{
@@ -4020,32 +4369,29 @@
"type": "tidelift"
}
],
- "time": "2022-03-31T17:18:25+00:00"
+ "time": "2024-05-31T14:49:08+00:00"
},
{
"name": "symfony/translation-contracts",
- "version": "v3.0.1",
+ "version": "v3.5.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation-contracts.git",
- "reference": "c4183fc3ef0f0510893cbeedc7718fb5cafc9ac9"
+ "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/c4183fc3ef0f0510893cbeedc7718fb5cafc9ac9",
- "reference": "c4183fc3ef0f0510893cbeedc7718fb5cafc9ac9",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a",
+ "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a",
"shasum": ""
},
"require": {
- "php": ">=8.0.2"
- },
- "suggest": {
- "symfony/translation-implementation": ""
+ "php": ">=8.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-main": "3.5-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -4055,7 +4401,10 @@
"autoload": {
"psr-4": {
"Symfony\\Contracts\\Translation\\": ""
- }
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -4082,7 +4431,81 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/translation-contracts/tree/v3.0.1"
+ "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:32:20+00:00"
+ },
+ {
+ "name": "symfony/uid",
+ "version": "v6.4.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/uid.git",
+ "reference": "35904eca37a84bb764c560cbfcac9f0ac2bcdbdf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/uid/zipball/35904eca37a84bb764c560cbfcac9f0ac2bcdbdf",
+ "reference": "35904eca37a84bb764c560cbfcac9f0ac2bcdbdf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-uuid": "^1.15"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Uid\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Grégoire Pineau",
+ "email": "lyrixx@lyrixx.info"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to generate and represent UIDs",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "UID",
+ "ulid",
+ "uuid"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/uid/tree/v6.4.8"
},
"funding": [
{
@@ -4098,43 +4521,39 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:55:41+00:00"
+ "time": "2024-05-31T14:49:08+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v5.4.6",
+ "version": "v6.4.9",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0"
+ "reference": "c31566e4ca944271cc8d8ac6887cbf31b8c6a172"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/294e9da6e2e0dd404e983daa5aa74253d92c05d0",
- "reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c31566e4ca944271cc8d8ac6887cbf31b8c6a172",
+ "reference": "c31566e4ca944271cc8d8ac6887cbf31b8c6a172",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/polyfill-mbstring": "~1.0",
- "symfony/polyfill-php80": "^1.16"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0"
},
"conflict": {
- "phpunit/phpunit": "<5.4.3",
- "symfony/console": "<4.4"
+ "symfony/console": "<5.4"
},
"require-dev": {
"ext-iconv": "*",
- "symfony/console": "^4.4|^5.0|^6.0",
- "symfony/process": "^4.4|^5.0|^6.0",
- "symfony/uid": "^5.1|^6.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/error-handler": "^6.3|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/uid": "^5.4|^6.0|^7.0",
"twig/twig": "^2.13|^3.0.4"
},
- "suggest": {
- "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
- "ext-intl": "To show region name in time zone dump",
- "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
- },
"bin": [
"Resources/bin/var-dump-server"
],
@@ -4171,7 +4590,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v5.4.6"
+ "source": "https://github.com/symfony/var-dumper/tree/v6.4.9"
},
"funding": [
{
@@ -4187,27 +4606,27 @@
"type": "tidelift"
}
],
- "time": "2022-03-02T12:42:23+00:00"
+ "time": "2024-06-27T13:23:14+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
- "version": "2.2.4",
+ "version": "v2.2.7",
"source": {
"type": "git",
"url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
- "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c"
+ "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/da444caae6aca7a19c0c140f68c6182e337d5b1c",
- "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c",
+ "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/83ee6f38df0a63106a9e4536e3060458b74ccedb",
+ "reference": "83ee6f38df0a63106a9e4536e3060458b74ccedb",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"php": "^5.5 || ^7.0 || ^8.0",
- "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
+ "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0"
},
"require-dev": {
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10"
@@ -4238,9 +4657,9 @@
"homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
"support": {
"issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues",
- "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.4"
+ "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.2.7"
},
- "time": "2021-12-08T09:12:39+00:00"
+ "time": "2023-12-08T13:03:43+00:00"
},
{
"name": "tmilos/lexer",
@@ -4437,39 +4856,43 @@
},
{
"name": "vlucas/phpdotenv",
- "version": "v5.4.1",
+ "version": "v5.6.1",
"source": {
"type": "git",
"url": "https://github.com/vlucas/phpdotenv.git",
- "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f"
+ "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f",
- "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2",
+ "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2",
"shasum": ""
},
"require": {
"ext-pcre": "*",
- "graham-campbell/result-type": "^1.0.2",
- "php": "^7.1.3 || ^8.0",
- "phpoption/phpoption": "^1.8",
- "symfony/polyfill-ctype": "^1.23",
- "symfony/polyfill-mbstring": "^1.23.1",
- "symfony/polyfill-php80": "^1.23.1"
+ "graham-campbell/result-type": "^1.1.3",
+ "php": "^7.2.5 || ^8.0",
+ "phpoption/phpoption": "^1.9.3",
+ "symfony/polyfill-ctype": "^1.24",
+ "symfony/polyfill-mbstring": "^1.24",
+ "symfony/polyfill-php80": "^1.24"
},
"require-dev": {
- "bamarni/composer-bin-plugin": "^1.4.1",
+ "bamarni/composer-bin-plugin": "^1.8.2",
"ext-filter": "*",
- "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10"
+ "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
},
"suggest": {
"ext-filter": "Required to use the boolean validator."
},
"type": "library",
"extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ },
"branch-alias": {
- "dev-master": "5.4-dev"
+ "dev-master": "5.6-dev"
}
},
"autoload": {
@@ -4501,7 +4924,7 @@
],
"support": {
"issues": "https://github.com/vlucas/phpdotenv/issues",
- "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1"
+ "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1"
},
"funding": [
{
@@ -4513,20 +4936,20 @@
"type": "tidelift"
}
],
- "time": "2021-12-12T23:22:04+00:00"
+ "time": "2024-07-20T21:52:34+00:00"
},
{
"name": "voku/portable-ascii",
- "version": "1.6.1",
+ "version": "2.0.1",
"source": {
"type": "git",
"url": "https://github.com/voku/portable-ascii.git",
- "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a"
+ "reference": "b56450eed252f6801410d810c8e1727224ae0743"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/voku/portable-ascii/zipball/87337c91b9dfacee02452244ee14ab3c43bc485a",
- "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743",
+ "reference": "b56450eed252f6801410d810c8e1727224ae0743",
"shasum": ""
},
"require": {
@@ -4563,7 +4986,7 @@
],
"support": {
"issues": "https://github.com/voku/portable-ascii/issues",
- "source": "https://github.com/voku/portable-ascii/tree/1.6.1"
+ "source": "https://github.com/voku/portable-ascii/tree/2.0.1"
},
"funding": [
{
@@ -4587,25 +5010,25 @@
"type": "tidelift"
}
],
- "time": "2022-01-24T18:55:24+00:00"
+ "time": "2022-03-08T17:03:00+00:00"
},
{
"name": "webmozart/assert",
- "version": "1.10.0",
+ "version": "1.11.0",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
- "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
- "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0",
- "symfony/polyfill-ctype": "^1.8"
+ "ext-ctype": "*",
+ "php": "^7.2 || ^8.0"
},
"conflict": {
"phpstan/phpstan": "<0.12.20",
@@ -4643,43 +5066,38 @@
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
- "source": "https://github.com/webmozarts/assert/tree/1.10.0"
+ "source": "https://github.com/webmozarts/assert/tree/1.11.0"
},
- "time": "2021-03-09T10:59:23+00:00"
+ "time": "2022-06-03T18:03:27+00:00"
}
],
"packages-dev": [
{
- "name": "doctrine/instantiator",
- "version": "1.4.1",
+ "name": "clue/ndjson-react",
+ "version": "v1.3.0",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/instantiator.git",
- "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
+ "url": "https://github.com/clue/reactphp-ndjson.git",
+ "reference": "392dc165fce93b5bb5c637b67e59619223c931b0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
- "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
+ "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0",
+ "reference": "392dc165fce93b5bb5c637b67e59619223c931b0",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
+ "php": ">=5.3",
+ "react/stream": "^1.2"
},
"require-dev": {
- "doctrine/coding-standard": "^9",
- "ext-pdo": "*",
- "ext-phar": "*",
- "phpbench/phpbench": "^0.16 || ^1",
- "phpstan/phpstan": "^1.4",
- "phpstan/phpstan-phpunit": "^1",
- "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
- "vimeo/psalm": "^4.22"
+ "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35",
+ "react/event-loop": "^1.2"
},
"type": "library",
"autoload": {
"psr-4": {
- "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ "Clue\\React\\NDJson\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -4688,81 +5106,75 @@
],
"authors": [
{
- "name": "Marco Pivetta",
- "email": "ocramius@gmail.com",
- "homepage": "https://ocramius.github.io/"
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering"
}
],
- "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
- "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.",
+ "homepage": "https://github.com/clue/reactphp-ndjson",
"keywords": [
- "constructor",
- "instantiate"
+ "NDJSON",
+ "json",
+ "jsonlines",
+ "newline",
+ "reactphp",
+ "streaming"
],
"support": {
- "issues": "https://github.com/doctrine/instantiator/issues",
- "source": "https://github.com/doctrine/instantiator/tree/1.4.1"
+ "issues": "https://github.com/clue/reactphp-ndjson/issues",
+ "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0"
},
"funding": [
{
- "url": "https://www.doctrine-project.org/sponsorship.html",
+ "url": "https://clue.engineering/support",
"type": "custom"
},
{
- "url": "https://www.patreon.com/phpdoctrine",
- "type": "patreon"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
- "type": "tidelift"
+ "url": "https://github.com/clue",
+ "type": "github"
}
],
- "time": "2022-03-03T08:28:38+00:00"
+ "time": "2022-12-23T10:58:28+00:00"
},
{
- "name": "fakerphp/faker",
- "version": "v1.19.0",
+ "name": "composer/pcre",
+ "version": "3.2.0",
"source": {
"type": "git",
- "url": "https://github.com/FakerPHP/Faker.git",
- "reference": "d7f08a622b3346766325488aa32ddc93ccdecc75"
+ "url": "https://github.com/composer/pcre.git",
+ "reference": "ea4ab6f9580a4fd221e0418f2c357cdd39102a90"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/d7f08a622b3346766325488aa32ddc93ccdecc75",
- "reference": "d7f08a622b3346766325488aa32ddc93ccdecc75",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/ea4ab6f9580a4fd221e0418f2c357cdd39102a90",
+ "reference": "ea4ab6f9580a4fd221e0418f2c357cdd39102a90",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0",
- "psr/container": "^1.0 || ^2.0",
- "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ "php": "^7.4 || ^8.0"
},
"conflict": {
- "fzaninotto/faker": "*"
+ "phpstan/phpstan": "<1.11.8"
},
"require-dev": {
- "bamarni/composer-bin-plugin": "^1.4.1",
- "doctrine/persistence": "^1.3 || ^2.0",
- "ext-intl": "*",
- "symfony/phpunit-bridge": "^4.4 || ^5.2"
- },
- "suggest": {
- "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
- "ext-curl": "Required by Faker\\Provider\\Image to download images.",
- "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
- "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
- "ext-mbstring": "Required for multibyte Unicode string functionality."
+ "phpstan/phpstan": "^1.11.8",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "phpunit/phpunit": "^8 || ^9"
},
"type": "library",
"extra": {
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ },
"branch-alias": {
- "dev-main": "v1.19-dev"
+ "dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
- "Faker\\": "src/Faker/"
+ "Composer\\Pcre\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -4771,62 +5183,68 @@
],
"authors": [
{
- "name": "François Zaninotto"
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
}
],
- "description": "Faker is a PHP library that generates fake data for you.",
+ "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
"keywords": [
- "data",
- "faker",
- "fixtures"
+ "PCRE",
+ "preg",
+ "regex",
+ "regular expression"
],
"support": {
- "issues": "https://github.com/FakerPHP/Faker/issues",
- "source": "https://github.com/FakerPHP/Faker/tree/v1.19.0"
+ "issues": "https://github.com/composer/pcre/issues",
+ "source": "https://github.com/composer/pcre/tree/3.2.0"
},
- "time": "2022-02-02T17:38:57+00:00"
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-25T09:36:02+00:00"
},
{
- "name": "guzzlehttp/psr7",
- "version": "2.2.1",
+ "name": "composer/semver",
+ "version": "3.4.2",
"source": {
"type": "git",
- "url": "https://github.com/guzzle/psr7.git",
- "reference": "c94a94f120803a18554c1805ef2e539f8285f9a2"
+ "url": "https://github.com/composer/semver.git",
+ "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/c94a94f120803a18554c1805ef2e539f8285f9a2",
- "reference": "c94a94f120803a18554c1805ef2e539f8285f9a2",
+ "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6",
+ "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6",
"shasum": ""
},
"require": {
- "php": "^7.2.5 || ^8.0",
- "psr/http-factory": "^1.0",
- "psr/http-message": "^1.0",
- "ralouphie/getallheaders": "^3.0"
- },
- "provide": {
- "psr/http-factory-implementation": "1.0",
- "psr/http-message-implementation": "1.0"
+ "php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
- "bamarni/composer-bin-plugin": "^1.4.1",
- "http-interop/http-factory-tests": "^0.9",
- "phpunit/phpunit": "^8.5.8 || ^9.3.10"
- },
- "suggest": {
- "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ "phpstan/phpstan": "^1.4",
+ "symfony/phpunit-bridge": "^4.2 || ^5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.2-dev"
+ "dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
- "GuzzleHttp\\Psr7\\": "src/"
+ "Composer\\Semver\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -4835,159 +5253,139 @@
],
"authors": [
{
- "name": "Graham Campbell",
- "email": "hello@gjcampbell.co.uk",
- "homepage": "https://github.com/GrahamCampbell"
- },
- {
- "name": "Michael Dowling",
- "email": "mtdowling@gmail.com",
- "homepage": "https://github.com/mtdowling"
- },
- {
- "name": "George Mponos",
- "email": "gmponos@gmail.com",
- "homepage": "https://github.com/gmponos"
- },
- {
- "name": "Tobias Nyholm",
- "email": "tobias.nyholm@gmail.com",
- "homepage": "https://github.com/Nyholm"
- },
- {
- "name": "Márk Sági-Kazár",
- "email": "mark.sagikazar@gmail.com",
- "homepage": "https://github.com/sagikazarmark"
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
},
{
- "name": "Tobias Schultze",
- "email": "webmaster@tubo-world.de",
- "homepage": "https://github.com/Tobion"
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
},
{
- "name": "Márk Sági-Kazár",
- "email": "mark.sagikazar@gmail.com",
- "homepage": "https://sagikazarmark.hu"
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
}
],
- "description": "PSR-7 message implementation that also provides common utility methods",
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
"keywords": [
- "http",
- "message",
- "psr-7",
- "request",
- "response",
- "stream",
- "uri",
- "url"
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
],
"support": {
- "issues": "https://github.com/guzzle/psr7/issues",
- "source": "https://github.com/guzzle/psr7/tree/2.2.1"
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.4.2"
},
"funding": [
{
- "url": "https://github.com/GrahamCampbell",
- "type": "github"
+ "url": "https://packagist.com",
+ "type": "custom"
},
{
- "url": "https://github.com/Nyholm",
+ "url": "https://github.com/composer",
"type": "github"
},
{
- "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
"type": "tidelift"
}
],
- "time": "2022-03-20T21:55:58+00:00"
+ "time": "2024-07-12T11:35:52+00:00"
},
{
- "name": "hamcrest/hamcrest-php",
- "version": "v2.0.1",
+ "name": "composer/xdebug-handler",
+ "version": "3.0.5",
"source": {
"type": "git",
- "url": "https://github.com/hamcrest/hamcrest-php.git",
- "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3"
+ "url": "https://github.com/composer/xdebug-handler.git",
+ "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
- "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef",
+ "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef",
"shasum": ""
},
"require": {
- "php": "^5.3|^7.0|^8.0"
- },
- "replace": {
- "cordoval/hamcrest-php": "*",
- "davedevelopment/hamcrest-php": "*",
- "kodova/hamcrest-php": "*"
+ "composer/pcre": "^1 || ^2 || ^3",
+ "php": "^7.2.5 || ^8.0",
+ "psr/log": "^1 || ^2 || ^3"
},
"require-dev": {
- "phpunit/php-file-iterator": "^1.4 || ^2.0",
- "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0"
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.1-dev"
- }
- },
"autoload": {
- "classmap": [
- "hamcrest"
- ]
+ "psr-4": {
+ "Composer\\XdebugHandler\\": "src"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
- "description": "This is the PHP port of Hamcrest Matchers",
+ "authors": [
+ {
+ "name": "John Stevenson",
+ "email": "john-stevenson@blueyonder.co.uk"
+ }
+ ],
+ "description": "Restarts a process without Xdebug.",
"keywords": [
- "test"
+ "Xdebug",
+ "performance"
],
"support": {
- "issues": "https://github.com/hamcrest/hamcrest-php/issues",
- "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1"
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/xdebug-handler/issues",
+ "source": "https://github.com/composer/xdebug-handler/tree/3.0.5"
},
- "time": "2020-07-09T08:09:16+00:00"
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-06T16:37:16+00:00"
},
{
- "name": "laravel/legacy-factories",
- "version": "v1.3.0",
+ "name": "evenement/evenement",
+ "version": "v3.0.2",
"source": {
"type": "git",
- "url": "https://github.com/laravel/legacy-factories.git",
- "reference": "5edc7e7eb76e7b4b29221f32139bcbf806c8870f"
+ "url": "https://github.com/igorw/evenement.git",
+ "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/legacy-factories/zipball/5edc7e7eb76e7b4b29221f32139bcbf806c8870f",
- "reference": "5edc7e7eb76e7b4b29221f32139bcbf806c8870f",
+ "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc",
+ "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc",
"shasum": ""
},
"require": {
- "illuminate/macroable": "^8.0|^9.0",
- "php": "^7.3|^8.0",
- "symfony/finder": "^3.4|^4.0|^5.0|^6.0"
+ "php": ">=7.0"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.x-dev"
- },
- "laravel": {
- "providers": [
- "Illuminate\\Database\\Eloquent\\LegacyFactoryServiceProvider"
- ]
- }
+ "require-dev": {
+ "phpunit/phpunit": "^9 || ^6"
},
+ "type": "library",
"autoload": {
- "files": [
- "helpers.php"
- ],
"psr-4": {
- "Illuminate\\Database\\Eloquent\\": "src/"
+ "Evenement\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -4996,385 +5394,1676 @@
],
"authors": [
{
- "name": "Taylor Otwell",
- "email": "taylor@laravel.com"
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
}
],
- "description": "The legacy version of the Laravel Eloquent factories.",
- "homepage": "http://laravel.com",
+ "description": "Événement is a very simple event dispatching library for PHP",
+ "keywords": [
+ "event-dispatcher",
+ "event-emitter"
+ ],
"support": {
- "issues": "https://github.com/laravel/framework/issues",
- "source": "https://github.com/laravel/framework"
+ "issues": "https://github.com/igorw/evenement/issues",
+ "source": "https://github.com/igorw/evenement/tree/v3.0.2"
},
- "time": "2022-01-13T08:45:08+00:00"
+ "time": "2023-08-08T05:53:35+00:00"
},
{
- "name": "mockery/mockery",
- "version": "1.5.0",
+ "name": "fakerphp/faker",
+ "version": "v1.23.1",
"source": {
"type": "git",
- "url": "https://github.com/mockery/mockery.git",
- "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac"
+ "url": "https://github.com/FakerPHP/Faker.git",
+ "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mockery/mockery/zipball/c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac",
- "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac",
+ "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b",
+ "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b",
"shasum": ""
},
"require": {
- "hamcrest/hamcrest-php": "^2.0.1",
- "lib-pcre": ">=7.0",
- "php": "^7.3 || ^8.0"
+ "php": "^7.4 || ^8.0",
+ "psr/container": "^1.0 || ^2.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
},
"conflict": {
- "phpunit/phpunit": "<8.0"
+ "fzaninotto/faker": "*"
},
"require-dev": {
- "phpunit/phpunit": "^8.5 || ^9.3"
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "doctrine/persistence": "^1.3 || ^2.0",
+ "ext-intl": "*",
+ "phpunit/phpunit": "^9.5.26",
+ "symfony/phpunit-bridge": "^5.4.16"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.4.x-dev"
- }
+ "suggest": {
+ "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
+ "ext-curl": "Required by Faker\\Provider\\Image to download images.",
+ "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
+ "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
+ "ext-mbstring": "Required for multibyte Unicode string functionality."
},
+ "type": "library",
"autoload": {
- "psr-0": {
- "Mockery": "library/"
+ "psr-4": {
+ "Faker\\": "src/Faker/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Pádraic Brady",
- "email": "padraic.brady@gmail.com",
- "homepage": "http://blog.astrumfutura.com"
- },
- {
- "name": "Dave Marshall",
- "email": "dave.marshall@atstsolutions.co.uk",
- "homepage": "http://davedevelopment.co.uk"
+ "name": "François Zaninotto"
}
],
- "description": "Mockery is a simple yet flexible PHP mock object framework",
- "homepage": "https://github.com/mockery/mockery",
+ "description": "Faker is a PHP library that generates fake data for you.",
"keywords": [
- "BDD",
- "TDD",
- "library",
- "mock",
- "mock objects",
- "mockery",
- "stub",
- "test",
- "test double",
- "testing"
+ "data",
+ "faker",
+ "fixtures"
],
"support": {
- "issues": "https://github.com/mockery/mockery/issues",
- "source": "https://github.com/mockery/mockery/tree/1.5.0"
+ "issues": "https://github.com/FakerPHP/Faker/issues",
+ "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1"
},
- "time": "2022-01-20T13:18:17+00:00"
+ "time": "2024-01-02T13:46:09+00:00"
},
{
- "name": "myclabs/deep-copy",
- "version": "1.11.0",
+ "name": "fidry/cpu-core-counter",
+ "version": "1.2.0",
"source": {
"type": "git",
- "url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
+ "url": "https://github.com/theofidry/cpu-core-counter.git",
+ "reference": "8520451a140d3f46ac33042715115e290cf5785f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
- "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
+ "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f",
+ "reference": "8520451a140d3f46ac33042715115e290cf5785f",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
- },
- "conflict": {
- "doctrine/collections": "<1.6.8",
- "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+ "php": "^7.2 || ^8.0"
},
"require-dev": {
- "doctrine/collections": "^1.6.8",
- "doctrine/common": "^2.13.3 || ^3.2.2",
- "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ "fidry/makefile": "^0.2.0",
+ "fidry/php-cs-fixer-config": "^1.1.2",
+ "phpstan/extension-installer": "^1.2.0",
+ "phpstan/phpstan": "^1.9.2",
+ "phpstan/phpstan-deprecation-rules": "^1.0.0",
+ "phpstan/phpstan-phpunit": "^1.2.2",
+ "phpstan/phpstan-strict-rules": "^1.4.4",
+ "phpunit/phpunit": "^8.5.31 || ^9.5.26",
+ "webmozarts/strict-phpunit": "^7.5"
},
"type": "library",
"autoload": {
- "files": [
- "src/DeepCopy/deep_copy.php"
- ],
"psr-4": {
- "DeepCopy\\": "src/DeepCopy/"
+ "Fidry\\CpuCoreCounter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "description": "Create deep copies (clones) of your objects",
+ "authors": [
+ {
+ "name": "Théo FIDRY",
+ "email": "theo.fidry@gmail.com"
+ }
+ ],
+ "description": "Tiny utility to get the number of CPU cores.",
"keywords": [
- "clone",
- "copy",
- "duplicate",
- "object",
- "object graph"
+ "CPU",
+ "core"
],
"support": {
- "issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
+ "issues": "https://github.com/theofidry/cpu-core-counter/issues",
+ "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0"
},
"funding": [
{
- "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
- "type": "tidelift"
+ "url": "https://github.com/theofidry",
+ "type": "github"
}
],
- "time": "2022-03-03T13:19:32+00:00"
+ "time": "2024-08-06T10:04:20+00:00"
},
{
- "name": "nikic/php-parser",
- "version": "v4.13.2",
+ "name": "filp/whoops",
+ "version": "2.15.4",
"source": {
"type": "git",
- "url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "210577fe3cf7badcc5814d99455df46564f3c077"
+ "url": "https://github.com/filp/whoops.git",
+ "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
- "reference": "210577fe3cf7badcc5814d99455df46564f3c077",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546",
+ "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546",
"shasum": ""
},
"require": {
- "ext-tokenizer": "*",
- "php": ">=7.0"
+ "php": "^5.5.9 || ^7.0 || ^8.0",
+ "psr/log": "^1.0.1 || ^2.0 || ^3.0"
},
"require-dev": {
- "ircmaxell/php-yacc": "^0.0.7",
- "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ "mockery/mockery": "^0.9 || ^1.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
+ "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
+ },
+ "suggest": {
+ "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
+ "whoops/soap": "Formats errors as SOAP responses"
},
- "bin": [
- "bin/php-parse"
- ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.9-dev"
+ "dev-master": "2.7-dev"
}
},
"autoload": {
"psr-4": {
- "PhpParser\\": "lib/PhpParser"
+ "Whoops\\": "src/Whoops/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Nikita Popov"
+ "name": "Filipe Dobreira",
+ "homepage": "https://github.com/filp",
+ "role": "Developer"
}
],
- "description": "A PHP parser written in PHP",
+ "description": "php error handling for cool kids",
+ "homepage": "https://filp.github.io/whoops/",
"keywords": [
- "parser",
+ "error",
+ "exception",
+ "handling",
+ "library",
+ "throwable",
+ "whoops"
+ ],
+ "support": {
+ "issues": "https://github.com/filp/whoops/issues",
+ "source": "https://github.com/filp/whoops/tree/2.15.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/denis-sokolov",
+ "type": "github"
+ }
+ ],
+ "time": "2023-11-03T12:00:00+00:00"
+ },
+ {
+ "name": "friendsofphp/php-cs-fixer",
+ "version": "v3.66.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
+ "reference": "5f5f2a142ff36b93c41885bca29cc5f861c013e6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/5f5f2a142ff36b93c41885bca29cc5f861c013e6",
+ "reference": "5f5f2a142ff36b93c41885bca29cc5f861c013e6",
+ "shasum": ""
+ },
+ "require": {
+ "clue/ndjson-react": "^1.0",
+ "composer/semver": "^3.4",
+ "composer/xdebug-handler": "^3.0.3",
+ "ext-filter": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "fidry/cpu-core-counter": "^1.2",
+ "php": "^7.4 || ^8.0",
+ "react/child-process": "^0.6.5",
+ "react/event-loop": "^1.0",
+ "react/promise": "^2.0 || ^3.0",
+ "react/socket": "^1.0",
+ "react/stream": "^1.0",
+ "sebastian/diff": "^4.0 || ^5.0 || ^6.0",
+ "symfony/console": "^5.4 || ^6.0 || ^7.0",
+ "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0",
+ "symfony/filesystem": "^5.4 || ^6.0 || ^7.0",
+ "symfony/finder": "^5.4 || ^6.0 || ^7.0",
+ "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0",
+ "symfony/polyfill-mbstring": "^1.28",
+ "symfony/polyfill-php80": "^1.28",
+ "symfony/polyfill-php81": "^1.28",
+ "symfony/process": "^5.4 || ^6.0 || ^7.0 <7.2",
+ "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0"
+ },
+ "require-dev": {
+ "facile-it/paraunit": "^1.3.1 || ^2.4",
+ "infection/infection": "^0.29.8",
+ "justinrainbow/json-schema": "^5.3 || ^6.0",
+ "keradus/cli-executor": "^2.1",
+ "mikey179/vfsstream": "^1.6.12",
+ "php-coveralls/php-coveralls": "^2.7",
+ "php-cs-fixer/accessible-object": "^1.1",
+ "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5",
+ "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5",
+ "phpunit/phpunit": "^9.6.21 || ^10.5.38 || ^11.4.3",
+ "symfony/var-dumper": "^5.4.47 || ^6.4.15 || ^7.1.8",
+ "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.1.6"
+ },
+ "suggest": {
+ "ext-dom": "For handling output formats in XML",
+ "ext-mbstring": "For handling non-UTF8 characters."
+ },
+ "bin": [
+ "php-cs-fixer"
+ ],
+ "type": "application",
+ "autoload": {
+ "psr-4": {
+ "PhpCsFixer\\": "src/"
+ },
+ "exclude-from-classmap": [
+ "src/Fixer/Internal/*"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Dariusz Rumiński",
+ "email": "dariusz.ruminski@gmail.com"
+ }
+ ],
+ "description": "A tool to automatically fix PHP code style",
+ "keywords": [
+ "Static code analysis",
+ "fixer",
+ "standards",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
+ "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.66.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/keradus",
+ "type": "github"
+ }
+ ],
+ "time": "2024-12-29T13:46:23+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
+ "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "http-interop/http-factory-tests": "0.9.0",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-18T11:15:46+00:00"
+ },
+ {
+ "name": "hamcrest/hamcrest-php",
+ "version": "v2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hamcrest/hamcrest-php.git",
+ "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+ "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3|^7.0|^8.0"
+ },
+ "replace": {
+ "cordoval/hamcrest-php": "*",
+ "davedevelopment/hamcrest-php": "*",
+ "kodova/hamcrest-php": "*"
+ },
+ "require-dev": {
+ "phpunit/php-file-iterator": "^1.4 || ^2.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "hamcrest"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "This is the PHP port of Hamcrest Matchers",
+ "keywords": [
+ "test"
+ ],
+ "support": {
+ "issues": "https://github.com/hamcrest/hamcrest-php/issues",
+ "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1"
+ },
+ "time": "2020-07-09T08:09:16+00:00"
+ },
+ {
+ "name": "laravel/legacy-factories",
+ "version": "v1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/legacy-factories.git",
+ "reference": "6cb79f668fc36b8b396ada1da3ba45867889c30f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/legacy-factories/zipball/6cb79f668fc36b8b396ada1da3ba45867889c30f",
+ "reference": "6cb79f668fc36b8b396ada1da3ba45867889c30f",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/macroable": "^8.0|^9.0|^10.0|^11.0",
+ "php": "^7.3|^8.0",
+ "symfony/finder": "^3.4|^4.0|^5.0|^6.0|^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Illuminate\\Database\\Eloquent\\LegacyFactoryServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "files": [
+ "helpers.php"
+ ],
+ "psr-4": {
+ "Illuminate\\Database\\Eloquent\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The legacy version of the Laravel Eloquent factories.",
+ "homepage": "http://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2024-01-15T13:55:14+00:00"
+ },
+ {
+ "name": "laravel/tinker",
+ "version": "v2.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/tinker.git",
+ "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe",
+ "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
+ "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
+ "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
+ "php": "^7.2.5|^8.0",
+ "psy/psysh": "^0.11.1|^0.12.0",
+ "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.3|^1.4.2",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^8.5.8|^9.3.3"
+ },
+ "suggest": {
+ "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)."
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Laravel\\Tinker\\TinkerServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Tinker\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Powerful REPL for the Laravel framework.",
+ "keywords": [
+ "REPL",
+ "Tinker",
+ "laravel",
+ "psysh"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/tinker/issues",
+ "source": "https://github.com/laravel/tinker/tree/v2.9.0"
+ },
+ "time": "2024-01-04T16:10:04+00:00"
+ },
+ {
+ "name": "mockery/mockery",
+ "version": "1.6.12",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mockery/mockery.git",
+ "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699",
+ "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699",
+ "shasum": ""
+ },
+ "require": {
+ "hamcrest/hamcrest-php": "^2.0.1",
+ "lib-pcre": ">=7.0",
+ "php": ">=7.3"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5 || ^9.6.17",
+ "symplify/easy-coding-standard": "^12.1.14"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "library/helpers.php",
+ "library/Mockery.php"
+ ],
+ "psr-4": {
+ "Mockery\\": "library/Mockery"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Pádraic Brady",
+ "email": "padraic.brady@gmail.com",
+ "homepage": "https://github.com/padraic",
+ "role": "Author"
+ },
+ {
+ "name": "Dave Marshall",
+ "email": "dave.marshall@atstsolutions.co.uk",
+ "homepage": "https://davedevelopment.co.uk",
+ "role": "Developer"
+ },
+ {
+ "name": "Nathanael Esayeas",
+ "email": "nathanael.esayeas@protonmail.com",
+ "homepage": "https://github.com/ghostwriter",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Mockery is a simple yet flexible PHP mock object framework",
+ "homepage": "https://github.com/mockery/mockery",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "library",
+ "mock",
+ "mock objects",
+ "mockery",
+ "stub",
+ "test",
+ "test double",
+ "testing"
+ ],
+ "support": {
+ "docs": "https://docs.mockery.io/",
+ "issues": "https://github.com/mockery/mockery/issues",
+ "rss": "https://github.com/mockery/mockery/releases.atom",
+ "security": "https://github.com/mockery/mockery/security/advisories",
+ "source": "https://github.com/mockery/mockery"
+ },
+ "time": "2024-05-16T03:13:13+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.12.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
+ "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-06-12T14:39:25+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1",
+ "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
"php"
],
"support": {
- "issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2"
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0"
+ },
+ "time": "2024-07-01T20:03:41+00:00"
+ },
+ {
+ "name": "nunomaduro/collision",
+ "version": "v7.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nunomaduro/collision.git",
+ "reference": "49ec67fa7b002712da8526678abd651c09f375b2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/49ec67fa7b002712da8526678abd651c09f375b2",
+ "reference": "49ec67fa7b002712da8526678abd651c09f375b2",
+ "shasum": ""
+ },
+ "require": {
+ "filp/whoops": "^2.15.3",
+ "nunomaduro/termwind": "^1.15.1",
+ "php": "^8.1.0",
+ "symfony/console": "^6.3.4"
+ },
+ "conflict": {
+ "laravel/framework": ">=11.0.0"
+ },
+ "require-dev": {
+ "brianium/paratest": "^7.3.0",
+ "laravel/framework": "^10.28.0",
+ "laravel/pint": "^1.13.3",
+ "laravel/sail": "^1.25.0",
+ "laravel/sanctum": "^3.3.1",
+ "laravel/tinker": "^2.8.2",
+ "nunomaduro/larastan": "^2.6.4",
+ "orchestra/testbench-core": "^8.13.0",
+ "pestphp/pest": "^2.23.2",
+ "phpunit/phpunit": "^10.4.1",
+ "sebastian/environment": "^6.0.1",
+ "spatie/laravel-ignition": "^2.3.1"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "files": [
+ "./src/Adapters/Phpunit/Autoload.php"
+ ],
+ "psr-4": {
+ "NunoMaduro\\Collision\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nuno Maduro",
+ "email": "enunomaduro@gmail.com"
+ }
+ ],
+ "description": "Cli error handling for console/command-line PHP applications.",
+ "keywords": [
+ "artisan",
+ "cli",
+ "command-line",
+ "console",
+ "error",
+ "handling",
+ "laravel",
+ "laravel-zero",
+ "php",
+ "symfony"
+ ],
+ "support": {
+ "issues": "https://github.com/nunomaduro/collision/issues",
+ "source": "https://github.com/nunomaduro/collision"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.com/paypalme/enunomaduro",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/nunomaduro",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/nunomaduro",
+ "type": "patreon"
+ }
+ ],
+ "time": "2023-10-11T15:45:01+00:00"
+ },
+ {
+ "name": "orchestra/canvas",
+ "version": "v8.11.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/orchestral/canvas.git",
+ "reference": "9bed1ce6084af2ce166e9ea1cb160ff22dc94a6d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/orchestral/canvas/zipball/9bed1ce6084af2ce166e9ea1cb160ff22dc94a6d",
+ "reference": "9bed1ce6084af2ce166e9ea1cb160ff22dc94a6d",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2.2",
+ "composer/semver": "^3.0",
+ "illuminate/console": "^10.48.4",
+ "illuminate/database": "^10.48.4",
+ "illuminate/filesystem": "^10.48.4",
+ "illuminate/support": "^10.48.4",
+ "orchestra/canvas-core": "^8.10.2",
+ "orchestra/testbench-core": "^8.19",
+ "php": "^8.1",
+ "symfony/polyfill-php83": "^1.28",
+ "symfony/yaml": "^6.2"
+ },
+ "require-dev": {
+ "laravel/framework": "^10.48.4",
+ "laravel/pint": "^1.6",
+ "mockery/mockery": "^1.5.1",
+ "phpstan/phpstan": "^1.11",
+ "phpunit/phpunit": "^10.5",
+ "spatie/laravel-ray": "^1.33"
+ },
+ "bin": [
+ "canvas"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Orchestra\\Canvas\\LaravelServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Orchestra\\Canvas\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ },
+ {
+ "name": "Mior Muhammad Zaki",
+ "email": "crynobone@gmail.com"
+ }
+ ],
+ "description": "Code Generators for Laravel Applications and Packages",
+ "support": {
+ "issues": "https://github.com/orchestral/canvas/issues",
+ "source": "https://github.com/orchestral/canvas/tree/v8.11.9"
+ },
+ "time": "2024-06-18T08:26:09+00:00"
+ },
+ {
+ "name": "orchestra/canvas-core",
+ "version": "v8.10.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/orchestral/canvas-core.git",
+ "reference": "3af8fb6b1ebd85903ba5d0e6df1c81aedacfedfc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/orchestral/canvas-core/zipball/3af8fb6b1ebd85903ba5d0e6df1c81aedacfedfc",
+ "reference": "3af8fb6b1ebd85903ba5d0e6df1c81aedacfedfc",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2.2",
+ "composer/semver": "^3.0",
+ "illuminate/console": "^10.38.1",
+ "illuminate/filesystem": "^10.38.1",
+ "php": "^8.1",
+ "symfony/polyfill-php83": "^1.28"
+ },
+ "conflict": {
+ "orchestra/canvas": "<8.11.0",
+ "orchestra/testbench-core": "<8.2.0"
+ },
+ "require-dev": {
+ "laravel/framework": "^10.38.1",
+ "laravel/pint": "^1.6",
+ "mockery/mockery": "^1.5.1",
+ "orchestra/testbench-core": "^8.19",
+ "phpstan/phpstan": "^1.10.6",
+ "phpunit/phpunit": "^10.1",
+ "symfony/yaml": "^6.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Orchestra\\Canvas\\Core\\LaravelServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Orchestra\\Canvas\\Core\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ },
+ {
+ "name": "Mior Muhammad Zaki",
+ "email": "crynobone@gmail.com"
+ }
+ ],
+ "description": "Code Generators Builder for Laravel Applications and Packages",
+ "support": {
+ "issues": "https://github.com/orchestral/canvas/issues",
+ "source": "https://github.com/orchestral/canvas-core/tree/v8.10.2"
+ },
+ "time": "2023-12-28T01:27:59+00:00"
+ },
+ {
+ "name": "orchestra/testbench",
+ "version": "v8.24.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/orchestral/testbench.git",
+ "reference": "2e5ca3ac1e8170a787532c4fc19403f91e9dd7d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/orchestral/testbench/zipball/2e5ca3ac1e8170a787532c4fc19403f91e9dd7d4",
+ "reference": "2e5ca3ac1e8170a787532c4fc19403f91e9dd7d4",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2.2",
+ "fakerphp/faker": "^1.21",
+ "laravel/framework": "^10.48.10",
+ "mockery/mockery": "^1.5.1",
+ "orchestra/testbench-core": "^8.25",
+ "orchestra/workbench": "^1.4.1 || ^8.5",
+ "php": "^8.1",
+ "phpunit/phpunit": "^9.6 || ^10.1",
+ "symfony/process": "^6.2",
+ "symfony/yaml": "^6.2",
+ "vlucas/phpdotenv": "^5.4.1"
+ },
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mior Muhammad Zaki",
+ "email": "crynobone@gmail.com",
+ "homepage": "https://github.com/crynobone"
+ }
+ ],
+ "description": "Laravel Testing Helper for Packages Development",
+ "homepage": "https://packages.tools/testbench/",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "dev",
+ "laravel",
+ "laravel-packages",
+ "testing"
+ ],
+ "support": {
+ "issues": "https://github.com/orchestral/testbench/issues",
+ "source": "https://github.com/orchestral/testbench/tree/v8.24.0"
+ },
+ "time": "2024-07-13T07:05:48+00:00"
+ },
+ {
+ "name": "orchestra/testbench-core",
+ "version": "v8.25.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/orchestral/testbench-core.git",
+ "reference": "df0a606dd557a1e350914be64632cd9040fa4bc0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/df0a606dd557a1e350914be64632cd9040fa4bc0",
+ "reference": "df0a606dd557a1e350914be64632cd9040fa4bc0",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2.2",
+ "php": "^8.1",
+ "symfony/polyfill-php83": "^1.28"
+ },
+ "conflict": {
+ "brianium/paratest": "<6.4.0 || >=7.0.0 <7.1.4 || >=8.0.0",
+ "laravel/framework": "<10.48.2 || >=11.0.0",
+ "nunomaduro/collision": "<6.4.0 || >=7.0.0 <7.4.0 || >=8.0.0",
+ "orchestra/testbench-dusk": "<8.21.0 || >=9.0.0",
+ "orchestra/workbench": "<1.0.0",
+ "phpunit/phpunit": "<9.6.0 || >=10.6.0"
+ },
+ "require-dev": {
+ "fakerphp/faker": "^1.21",
+ "laravel/framework": "^10.48.2",
+ "laravel/pint": "^1.6",
+ "mockery/mockery": "^1.5.1",
+ "phpstan/phpstan": "^1.11",
+ "phpunit/phpunit": "^10.1",
+ "spatie/laravel-ray": "^1.32.4",
+ "symfony/process": "^6.2",
+ "symfony/yaml": "^6.2",
+ "vlucas/phpdotenv": "^5.4.1"
+ },
+ "suggest": {
+ "brianium/paratest": "Allow using parallel testing (^6.4 || ^7.1.4).",
+ "ext-pcntl": "Required to use all features of the console signal trapping.",
+ "fakerphp/faker": "Allow using Faker for testing (^1.21).",
+ "laravel/framework": "Required for testing (^10.48.2).",
+ "mockery/mockery": "Allow using Mockery for testing (^1.5.1).",
+ "nunomaduro/collision": "Allow using Laravel style tests output and parallel testing (^6.4 || ^7.4).",
+ "orchestra/testbench-browser-kit": "Allow using legacy Laravel BrowserKit for testing (^8.0).",
+ "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^8.0).",
+ "phpunit/phpunit": "Allow using PHPUnit for testing (^9.6 || ^10.1).",
+ "symfony/process": "Required to use Orchestra\\Testbench\\remote function (^6.2).",
+ "symfony/yaml": "Required for Testbench CLI (^6.2).",
+ "vlucas/phpdotenv": "Required for Testbench CLI (^5.4.1)."
+ },
+ "bin": [
+ "testbench"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Orchestra\\Testbench\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mior Muhammad Zaki",
+ "email": "crynobone@gmail.com",
+ "homepage": "https://github.com/crynobone"
+ }
+ ],
+ "description": "Testing Helper for Laravel Development",
+ "homepage": "https://packages.tools/testbench",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "dev",
+ "laravel",
+ "laravel-packages",
+ "testing"
+ ],
+ "support": {
+ "issues": "https://github.com/orchestral/testbench/issues",
+ "source": "https://github.com/orchestral/testbench-core"
+ },
+ "time": "2024-07-19T10:25:12+00:00"
+ },
+ {
+ "name": "orchestra/workbench",
+ "version": "v8.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/orchestral/workbench.git",
+ "reference": "dce002c20de63b6bde74e0cae2ca558d031a8a17"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/orchestral/workbench/zipball/dce002c20de63b6bde74e0cae2ca558d031a8a17",
+ "reference": "dce002c20de63b6bde74e0cae2ca558d031a8a17",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2.2",
+ "fakerphp/faker": "^1.21",
+ "laravel/framework": "^10.38.1",
+ "laravel/tinker": "^2.8.2",
+ "nunomaduro/collision": "^6.4 || ^7.10",
+ "orchestra/canvas": "^8.11.4",
+ "orchestra/testbench-core": "^8.24",
+ "php": "^8.1",
+ "spatie/laravel-ray": "^1.32.4",
+ "symfony/polyfill-php83": "^1.28",
+ "symfony/yaml": "^6.2"
+ },
+ "require-dev": {
+ "laravel/pint": "^1.4",
+ "mockery/mockery": "^1.5.1",
+ "phpstan/phpstan": "^1.11",
+ "phpunit/phpunit": "^10.1",
+ "symfony/process": "^6.2"
+ },
+ "suggest": {
+ "ext-pcntl": "Required to use all features of the console signal trapping."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Orchestra\\Workbench\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mior Muhammad Zaki",
+ "email": "crynobone@gmail.com"
+ }
+ ],
+ "description": "Workbench Companion for Laravel Packages Development",
+ "keywords": [
+ "dev",
+ "laravel",
+ "laravel-packages",
+ "testing"
+ ],
+ "support": {
+ "issues": "https://github.com/orchestral/workbench/issues",
+ "source": "https://github.com/orchestral/workbench/tree/v8.5.0"
+ },
+ "time": "2024-05-20T23:51:13+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:33:53+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
},
- "time": "2021-11-30T19:35:32+00:00"
+ "time": "2022-02-21T01:04:05+00:00"
},
{
- "name": "orchestra/testbench",
- "version": "v6.24.1",
+ "name": "php-di/invoker",
+ "version": "2.3.4",
"source": {
"type": "git",
- "url": "https://github.com/orchestral/testbench.git",
- "reference": "7b6a225851f6c148a80e241af5cbd833c83e572c"
+ "url": "https://github.com/PHP-DI/Invoker.git",
+ "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/orchestral/testbench/zipball/7b6a225851f6c148a80e241af5cbd833c83e572c",
- "reference": "7b6a225851f6c148a80e241af5cbd833c83e572c",
+ "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/33234b32dafa8eb69202f950a1fc92055ed76a86",
+ "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86",
"shasum": ""
},
"require": {
- "laravel/framework": "^8.75",
- "mockery/mockery": "^1.4.4",
- "orchestra/testbench-core": "^6.28.1",
- "php": "^7.3 || ^8.0",
- "phpunit/phpunit": "^8.5.21 || ^9.5.10",
- "spatie/laravel-ray": "^1.26.2"
+ "php": ">=7.3",
+ "psr/container": "^1.0|^2.0"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "mnapoli/hard-mode": "~0.3.0",
+ "phpunit/phpunit": "^9.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "6.0-dev"
+ "autoload": {
+ "psr-4": {
+ "Invoker\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "authors": [
+ "description": "Generic and extensible callable invoker",
+ "homepage": "https://github.com/PHP-DI/Invoker",
+ "keywords": [
+ "callable",
+ "dependency",
+ "dependency-injection",
+ "injection",
+ "invoke",
+ "invoker"
+ ],
+ "support": {
+ "issues": "https://github.com/PHP-DI/Invoker/issues",
+ "source": "https://github.com/PHP-DI/Invoker/tree/2.3.4"
+ },
+ "funding": [
{
- "name": "Mior Muhammad Zaki",
- "email": "crynobone@gmail.com",
- "homepage": "https://github.com/crynobone"
+ "url": "https://github.com/mnapoli",
+ "type": "github"
}
],
- "description": "Laravel Testing Helper for Packages Development",
- "homepage": "https://packages.tools/testbench/",
+ "time": "2023-09-08T09:24:21+00:00"
+ },
+ {
+ "name": "php-di/php-di",
+ "version": "7.0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHP-DI/PHP-DI.git",
+ "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/e87435e3c0e8f22977adc5af0d5cdcc467e15cf1",
+ "reference": "e87435e3c0e8f22977adc5af0d5cdcc467e15cf1",
+ "shasum": ""
+ },
+ "require": {
+ "laravel/serializable-closure": "^1.0",
+ "php": ">=8.0",
+ "php-di/invoker": "^2.0",
+ "psr/container": "^1.1 || ^2.0"
+ },
+ "provide": {
+ "psr/container-implementation": "^1.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3",
+ "friendsofphp/proxy-manager-lts": "^1",
+ "mnapoli/phpunit-easymock": "^1.3",
+ "phpunit/phpunit": "^9.5",
+ "vimeo/psalm": "^4.6"
+ },
+ "suggest": {
+ "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "DI\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "The dependency injection container for humans",
+ "homepage": "https://php-di.org/",
"keywords": [
- "BDD",
- "TDD",
- "laravel",
- "orchestra-platform",
- "orchestral",
- "testing"
+ "PSR-11",
+ "container",
+ "container-interop",
+ "dependency injection",
+ "di",
+ "ioc",
+ "psr11"
],
"support": {
- "issues": "https://github.com/orchestral/testbench/issues",
- "source": "https://github.com/orchestral/testbench/tree/v6.24.1"
+ "issues": "https://github.com/PHP-DI/PHP-DI/issues",
+ "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.7"
},
"funding": [
{
- "url": "https://paypal.me/crynobone",
- "type": "custom"
+ "url": "https://github.com/mnapoli",
+ "type": "github"
},
{
- "url": "https://liberapay.com/crynobone",
- "type": "liberapay"
+ "url": "https://tidelift.com/funding/github/packagist/php-di/php-di",
+ "type": "tidelift"
}
],
- "time": "2022-02-08T12:57:17+00:00"
+ "time": "2024-07-21T15:55:45+00:00"
},
{
- "name": "orchestra/testbench-core",
- "version": "v6.28.1",
+ "name": "phpstan/phpstan",
+ "version": "1.11.8",
"source": {
"type": "git",
- "url": "https://github.com/orchestral/testbench-core.git",
- "reference": "e66074e825e21b40b3433703dc3f76f2bfebebe0"
+ "url": "https://github.com/phpstan/phpstan.git",
+ "reference": "6adbd118e6c0515dd2f36b06cde1d6da40f1b8ec"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/6adbd118e6c0515dd2f36b06cde1d6da40f1b8ec",
+ "reference": "6adbd118e6c0515dd2f36b06cde1d6da40f1b8ec",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-24T07:01:22+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "10.1.15",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/e66074e825e21b40b3433703dc3f76f2bfebebe0",
- "reference": "e66074e825e21b40b3433703dc3f76f2bfebebe0",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae",
+ "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae",
"shasum": ""
},
"require": {
- "fakerphp/faker": "^1.9.1",
- "php": "^7.3 || ^8.0",
- "symfony/yaml": "^5.0",
- "vlucas/phpdotenv": "^5.1"
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=8.1",
+ "phpunit/php-file-iterator": "^4.0",
+ "phpunit/php-text-template": "^3.0",
+ "sebastian/code-unit-reverse-lookup": "^3.0",
+ "sebastian/complexity": "^3.0",
+ "sebastian/environment": "^6.0",
+ "sebastian/lines-of-code": "^2.0",
+ "sebastian/version": "^4.0",
+ "theseer/tokenizer": "^1.2.0"
},
"require-dev": {
- "laravel/framework": "^8.75",
- "laravel/laravel": "8.x-dev",
- "mockery/mockery": "^1.4.4",
- "orchestra/canvas": "^6.1",
- "phpunit/phpunit": "^8.5.21 || ^9.5.10 || ^10.0",
- "spatie/laravel-ray": "^1.7.1",
- "symfony/process": "^5.0"
+ "phpunit/phpunit": "^10.1"
},
"suggest": {
- "laravel/framework": "Required for testing (^8.75).",
- "mockery/mockery": "Allow using Mockery for testing (^1.4.4).",
- "orchestra/testbench-browser-kit": "Allow using legacy Laravel BrowserKit for testing (^6.0).",
- "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^6.0).",
- "phpunit/phpunit": "Allow using PHPUnit for testing (^8.5.21|^9.5.10|^10.0)."
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
},
- "bin": [
- "testbench"
- ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "6.0-dev"
+ "dev-main": "10.1-dev"
}
},
"autoload": {
- "files": [
- "src/helpers.php"
- ],
- "psr-4": {
- "Orchestra\\Testbench\\": "src/"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Mior Muhammad Zaki",
- "email": "crynobone@gmail.com",
- "homepage": "https://github.com/crynobone"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Testing Helper for Laravel Development",
- "homepage": "https://packages.tools/testbench",
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
"keywords": [
- "BDD",
- "TDD",
- "laravel",
- "orchestra-platform",
- "orchestral",
- "testing"
+ "coverage",
+ "testing",
+ "xunit"
],
"support": {
- "issues": "https://github.com/orchestral/testbench/issues",
- "source": "https://github.com/orchestral/testbench-core"
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15"
},
"funding": [
{
- "url": "https://paypal.me/crynobone",
- "type": "custom"
- },
- {
- "url": "https://liberapay.com/crynobone",
- "type": "liberapay"
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
}
],
- "time": "2022-02-08T12:50:35+00:00"
+ "time": "2024-06-29T08:25:15+00:00"
},
{
- "name": "phar-io/manifest",
- "version": "2.0.3",
+ "name": "phpunit/php-file-iterator",
+ "version": "4.1.0",
"source": {
"type": "git",
- "url": "https://github.com/phar-io/manifest.git",
- "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
- "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c",
+ "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-phar": "*",
- "ext-xmlwriter": "*",
- "phar-io/version": "^3.0.1",
- "php": "^7.2 || ^8.0"
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -5388,46 +7077,119 @@
],
"authors": [
{
- "name": "Arne Blankerts",
- "email": "arne@blankerts.de",
- "role": "Developer"
- },
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0"
+ },
+ "funding": [
{
- "name": "Sebastian Heuer",
- "email": "sebastian@phpeople.de",
- "role": "Developer"
- },
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-31T06:24:48+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+ "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^10.0"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
- "role": "Developer"
+ "role": "lead"
}
],
- "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
"support": {
- "issues": "https://github.com/phar-io/manifest/issues",
- "source": "https://github.com/phar-io/manifest/tree/2.0.3"
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0"
},
- "time": "2021-07-20T11:28:43+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:56:09+00:00"
},
{
- "name": "phar-io/version",
- "version": "3.2.1",
+ "name": "phpunit/php-text-template",
+ "version": "3.0.1",
"source": {
"type": "git",
- "url": "https://github.com/phar-io/version.git",
- "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
- "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748",
+ "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0"
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
"autoload": {
"classmap": [
"src/"
@@ -5438,170 +7200,217 @@
"BSD-3-Clause"
],
"authors": [
- {
- "name": "Arne Blankerts",
- "email": "arne@blankerts.de",
- "role": "Developer"
- },
- {
- "name": "Sebastian Heuer",
- "email": "sebastian@phpeople.de",
- "role": "Developer"
- },
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
- "role": "Developer"
+ "role": "lead"
}
],
- "description": "Library for handling version information and constraints",
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
"support": {
- "issues": "https://github.com/phar-io/version/issues",
- "source": "https://github.com/phar-io/version/tree/3.2.1"
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "security": "https://github.com/sebastianbergmann/php-text-template/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1"
},
- "time": "2022-02-21T01:04:05+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-31T14:07:24+00:00"
},
{
- "name": "phpdocumentor/reflection-common",
- "version": "2.2.0",
+ "name": "phpunit/php-timer",
+ "version": "6.0.0",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
- "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
- "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+ "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0"
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-2.x": "2.x-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src/"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Jaap van Otterdijk",
- "email": "opensource@ijaap.nl"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
- "homepage": "http://www.phpdoc.org",
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
"keywords": [
- "FQSEN",
- "phpDocumentor",
- "phpdoc",
- "reflection",
- "static analysis"
+ "timer"
],
"support": {
- "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
- "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0"
},
- "time": "2020-06-27T09:03:43+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:57:52+00:00"
},
{
- "name": "phpdocumentor/reflection-docblock",
- "version": "5.3.0",
+ "name": "phpunit/phpunit",
+ "version": "10.5.28",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "ff7fb85cdf88131b83e721fb2a327b664dbed275"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
- "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ff7fb85cdf88131b83e721fb2a327b664dbed275",
+ "reference": "ff7fb85cdf88131b83e721fb2a327b664dbed275",
"shasum": ""
},
"require": {
- "ext-filter": "*",
- "php": "^7.2 || ^8.0",
- "phpdocumentor/reflection-common": "^2.2",
- "phpdocumentor/type-resolver": "^1.3",
- "webmozart/assert": "^1.9.1"
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.12.0",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
+ "php": ">=8.1",
+ "phpunit/php-code-coverage": "^10.1.15",
+ "phpunit/php-file-iterator": "^4.1.0",
+ "phpunit/php-invoker": "^4.0.0",
+ "phpunit/php-text-template": "^3.0.1",
+ "phpunit/php-timer": "^6.0.0",
+ "sebastian/cli-parser": "^2.0.1",
+ "sebastian/code-unit": "^2.0.0",
+ "sebastian/comparator": "^5.0.1",
+ "sebastian/diff": "^5.1.1",
+ "sebastian/environment": "^6.1.0",
+ "sebastian/exporter": "^5.1.2",
+ "sebastian/global-state": "^6.0.2",
+ "sebastian/object-enumerator": "^5.0.0",
+ "sebastian/recursion-context": "^5.0.0",
+ "sebastian/type": "^4.0.0",
+ "sebastian/version": "^4.0.1"
},
- "require-dev": {
- "mockery/mockery": "~1.3.2",
- "psalm/phar": "^4.8"
+ "suggest": {
+ "ext-soap": "To be able to generate mocks based on WSDL files"
},
+ "bin": [
+ "phpunit"
+ ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.x-dev"
+ "dev-main": "10.5-dev"
}
},
"autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src"
- }
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
- },
- {
- "name": "Jaap van Otterdijk",
- "email": "account@ijaap.nl"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
"support": {
- "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
- "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.28"
},
- "time": "2021-10-19T17:43:47+00:00"
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-18T14:54:16+00:00"
},
{
- "name": "phpdocumentor/type-resolver",
- "version": "1.6.1",
+ "name": "psr/http-factory",
+ "version": "1.1.0",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "77a32518733312af16a44300404e945338981de3"
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
- "reference": "77a32518733312af16a44300404e945338981de3",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0",
- "phpdocumentor/reflection-common": "^2.0"
- },
- "require-dev": {
- "ext-tokenizer": "*",
- "psalm/phar": "^4.8"
+ "php": ">=7.1",
+ "psr/http-message": "^1.0 || ^2.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-1.x": "1.x-dev"
+ "dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": "src"
+ "Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -5610,51 +7419,52 @@
],
"authors": [
{
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
}
],
- "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
"support": {
- "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
- "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1"
+ "source": "https://github.com/php-fig/http-factory"
},
- "time": "2022-03-15T21:29:03+00:00"
+ "time": "2024-04-15T12:06:14+00:00"
},
{
- "name": "phpspec/prophecy",
- "version": "v1.15.0",
+ "name": "psr/http-message",
+ "version": "2.0",
"source": {
"type": "git",
- "url": "https://github.com/phpspec/prophecy.git",
- "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13"
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
- "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "^1.2",
- "php": "^7.2 || ~8.0, <8.2",
- "phpdocumentor/reflection-docblock": "^5.2",
- "sebastian/comparator": "^3.0 || ^4.0",
- "sebastian/recursion-context": "^3.0 || ^4.0"
- },
- "require-dev": {
- "phpspec/phpspec": "^6.0 || ^7.0",
- "phpunit/phpunit": "^8.0 || ^9.0"
+ "php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.x-dev"
+ "dev-master": "2.0.x-dev"
}
},
"autoload": {
"psr-4": {
- "Prophecy\\": "src/Prophecy"
+ "Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -5663,482 +7473,471 @@
],
"authors": [
{
- "name": "Konstantin Kudryashov",
- "email": "ever.zet@gmail.com",
- "homepage": "http://everzet.com"
- },
- {
- "name": "Marcello Duarte",
- "email": "marcello.duarte@gmail.com"
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
}
],
- "description": "Highly opinionated mocking framework for PHP 5.3+",
- "homepage": "https://github.com/phpspec/prophecy",
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
"keywords": [
- "Double",
- "Dummy",
- "fake",
- "mock",
- "spy",
- "stub"
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
],
"support": {
- "issues": "https://github.com/phpspec/prophecy/issues",
- "source": "https://github.com/phpspec/prophecy/tree/v1.15.0"
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
},
- "time": "2021-12-08T12:19:24+00:00"
+ "time": "2023-04-04T09:54:51+00:00"
},
{
- "name": "phpunit/php-code-coverage",
- "version": "9.2.15",
+ "name": "psy/psysh",
+ "version": "v0.12.4",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f"
+ "url": "https://github.com/bobthecow/psysh.git",
+ "reference": "2fd717afa05341b4f8152547f142cd2f130f6818"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
- "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818",
+ "reference": "2fd717afa05341b4f8152547f142cd2f130f6818",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-libxml": "*",
- "ext-xmlwriter": "*",
- "nikic/php-parser": "^4.13.0",
- "php": ">=7.3",
- "phpunit/php-file-iterator": "^3.0.3",
- "phpunit/php-text-template": "^2.0.2",
- "sebastian/code-unit-reverse-lookup": "^2.0.2",
- "sebastian/complexity": "^2.0",
- "sebastian/environment": "^5.1.2",
- "sebastian/lines-of-code": "^1.0.3",
- "sebastian/version": "^3.0.1",
- "theseer/tokenizer": "^1.2.0"
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "nikic/php-parser": "^5.0 || ^4.0",
+ "php": "^8.0 || ^7.4",
+ "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4",
+ "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4"
+ },
+ "conflict": {
+ "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "bamarni/composer-bin-plugin": "^1.2"
},
"suggest": {
- "ext-pcov": "*",
- "ext-xdebug": "*"
+ "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
+ "ext-pdo-sqlite": "The doc command requires SQLite to work.",
+ "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well."
},
+ "bin": [
+ "bin/psysh"
+ ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "9.2-dev"
+ "dev-main": "0.12.x-dev"
+ },
+ "bamarni-bin": {
+ "bin-links": false,
+ "forward-command": false
}
},
"autoload": {
- "classmap": [
- "src/"
- ]
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Psy\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
+ "name": "Justin Hileman",
+ "email": "justin@justinhileman.info",
+ "homepage": "http://justinhileman.com"
}
],
- "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
- "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "description": "An interactive shell for modern PHP.",
+ "homepage": "http://psysh.org",
"keywords": [
- "coverage",
- "testing",
- "xunit"
+ "REPL",
+ "console",
+ "interactive",
+ "shell"
],
"support": {
- "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15"
+ "issues": "https://github.com/bobthecow/psysh/issues",
+ "source": "https://github.com/bobthecow/psysh/tree/v0.12.4"
},
- "funding": [
- {
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
- }
- ],
- "time": "2022-03-07T09:28:20+00:00"
+ "time": "2024-06-10T01:18:23+00:00"
},
{
- "name": "phpunit/php-file-iterator",
- "version": "3.0.6",
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
- "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=5.6"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0-dev"
- }
- },
"autoload": {
- "classmap": [
- "src/"
+ "files": [
+ "src/getallheaders.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
}
],
- "description": "FilterIterator implementation that filters files based on a list of suffixes.",
- "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
- "keywords": [
- "filesystem",
- "iterator"
- ],
+ "description": "A polyfill for getallheaders.",
"support": {
- "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
- "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
},
- "funding": [
- {
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
- }
- ],
- "time": "2021-12-02T12:48:52+00:00"
+ "time": "2019-03-08T08:55:37+00:00"
},
{
- "name": "phpunit/php-invoker",
- "version": "3.1.1",
+ "name": "react/cache",
+ "version": "v1.2.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-invoker.git",
- "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ "url": "https://github.com/reactphp/cache.git",
+ "reference": "d47c472b64aa5608225f47965a484b75c7817d5b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
- "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b",
+ "reference": "d47c472b64aa5608225f47965a484b75c7817d5b",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=5.3.0",
+ "react/promise": "^3.0 || ^2.0 || ^1.1"
},
"require-dev": {
- "ext-pcntl": "*",
- "phpunit/phpunit": "^9.3"
- },
- "suggest": {
- "ext-pcntl": "*"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.1-dev"
- }
+ "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35"
},
+ "type": "library",
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "React\\Cache\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
}
],
- "description": "Invoke callables with a timeout",
- "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "description": "Async, Promise-based cache interface for ReactPHP",
"keywords": [
- "process"
+ "cache",
+ "caching",
+ "promise",
+ "reactphp"
],
"support": {
- "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
- "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+ "issues": "https://github.com/reactphp/cache/issues",
+ "source": "https://github.com/reactphp/cache/tree/v1.2.0"
},
"funding": [
{
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
}
],
- "time": "2020-09-28T05:58:55+00:00"
+ "time": "2022-11-30T15:59:55+00:00"
},
{
- "name": "phpunit/php-text-template",
- "version": "2.0.4",
+ "name": "react/child-process",
+ "version": "v0.6.6",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-text-template.git",
- "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ "url": "https://github.com/reactphp/child-process.git",
+ "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
- "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159",
+ "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+ "php": ">=5.3.0",
+ "react/event-loop": "^1.2",
+ "react/stream": "^1.4"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+ "react/socket": "^1.16",
+ "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0-dev"
- }
- },
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "React\\ChildProcess\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
}
],
- "description": "Simple template engine.",
- "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "description": "Event-driven library for executing child processes with ReactPHP.",
"keywords": [
- "template"
+ "event-driven",
+ "process",
+ "reactphp"
],
"support": {
- "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
- "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+ "issues": "https://github.com/reactphp/child-process/issues",
+ "source": "https://github.com/reactphp/child-process/tree/v0.6.6"
},
"funding": [
{
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
}
],
- "time": "2020-10-26T05:33:50+00:00"
+ "time": "2025-01-01T16:37:48+00:00"
},
{
- "name": "phpunit/php-timer",
- "version": "5.0.3",
+ "name": "react/dns",
+ "version": "v1.13.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ "url": "https://github.com/reactphp/dns.git",
+ "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
- "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
+ "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=5.3.0",
+ "react/cache": "^1.0 || ^0.6 || ^0.5",
+ "react/event-loop": "^1.2",
+ "react/promise": "^3.2 || ^2.7 || ^1.2.1"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+ "react/async": "^4.3 || ^3 || ^2",
+ "react/promise-timer": "^1.11"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.0-dev"
- }
- },
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "React\\Dns\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
}
],
- "description": "Utility class for timing",
- "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "description": "Async DNS resolver for ReactPHP",
"keywords": [
- "timer"
+ "async",
+ "dns",
+ "dns-resolver",
+ "reactphp"
],
"support": {
- "issues": "https://github.com/sebastianbergmann/php-timer/issues",
- "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+ "issues": "https://github.com/reactphp/dns/issues",
+ "source": "https://github.com/reactphp/dns/tree/v1.13.0"
},
"funding": [
{
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
}
],
- "time": "2020-10-26T13:16:10+00:00"
+ "time": "2024-06-13T14:18:03+00:00"
},
{
- "name": "phpunit/phpunit",
- "version": "9.5.20",
+ "name": "react/event-loop",
+ "version": "v1.5.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba"
+ "url": "https://github.com/reactphp/event-loop.git",
+ "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba",
- "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba",
+ "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
+ "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "^1.3.1",
- "ext-dom": "*",
- "ext-json": "*",
- "ext-libxml": "*",
- "ext-mbstring": "*",
- "ext-xml": "*",
- "ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.10.1",
- "phar-io/manifest": "^2.0.3",
- "phar-io/version": "^3.0.2",
- "php": ">=7.3",
- "phpspec/prophecy": "^1.12.1",
- "phpunit/php-code-coverage": "^9.2.13",
- "phpunit/php-file-iterator": "^3.0.5",
- "phpunit/php-invoker": "^3.1.1",
- "phpunit/php-text-template": "^2.0.3",
- "phpunit/php-timer": "^5.0.2",
- "sebastian/cli-parser": "^1.0.1",
- "sebastian/code-unit": "^1.0.6",
- "sebastian/comparator": "^4.0.5",
- "sebastian/diff": "^4.0.3",
- "sebastian/environment": "^5.1.3",
- "sebastian/exporter": "^4.0.3",
- "sebastian/global-state": "^5.0.1",
- "sebastian/object-enumerator": "^4.0.3",
- "sebastian/resource-operations": "^3.0.3",
- "sebastian/type": "^3.0",
- "sebastian/version": "^3.0.2"
+ "php": ">=5.3.0"
},
"require-dev": {
- "ext-pdo": "*",
- "phpspec/prophecy-phpunit": "^2.0.1"
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
},
"suggest": {
- "ext-soap": "*",
- "ext-xdebug": "*"
+ "ext-pcntl": "For signal handling support when using the StreamSelectLoop"
},
- "bin": [
- "phpunit"
- ],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "9.5-dev"
- }
- },
"autoload": {
- "files": [
- "src/Framework/Assert/Functions.php"
- ],
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "React\\EventLoop\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
}
],
- "description": "The PHP Unit Testing framework.",
- "homepage": "https://phpunit.de/",
+ "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
"keywords": [
- "phpunit",
- "testing",
- "xunit"
+ "asynchronous",
+ "event-loop"
],
"support": {
- "issues": "https://github.com/sebastianbergmann/phpunit/issues",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20"
+ "issues": "https://github.com/reactphp/event-loop/issues",
+ "source": "https://github.com/reactphp/event-loop/tree/v1.5.0"
},
"funding": [
{
- "url": "https://phpunit.de/sponsors.html",
- "type": "custom"
- },
- {
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
}
],
- "time": "2022-04-01T12:37:26+00:00"
+ "time": "2023-11-13T13:48:05+00:00"
},
{
- "name": "pimple/pimple",
- "version": "v3.5.0",
+ "name": "react/promise",
+ "version": "v3.2.0",
"source": {
"type": "git",
- "url": "https://github.com/silexphp/Pimple.git",
- "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed"
+ "url": "https://github.com/reactphp/promise.git",
+ "reference": "8a164643313c71354582dc850b42b33fa12a4b63"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
- "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
+ "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63",
+ "reference": "8a164643313c71354582dc850b42b33fa12a4b63",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "psr/container": "^1.1 || ^2.0"
+ "php": ">=7.1.0"
},
"require-dev": {
- "symfony/phpunit-bridge": "^5.4@dev"
+ "phpstan/phpstan": "1.10.39 || 1.4.10",
+ "phpunit/phpunit": "^9.6 || ^7.5"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.4.x-dev"
- }
- },
"autoload": {
- "psr-0": {
- "Pimple": "src/"
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "React\\Promise\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -6147,48 +7946,75 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
}
],
- "description": "Pimple, a simple Dependency Injection Container",
- "homepage": "https://pimple.symfony.com",
+ "description": "A lightweight implementation of CommonJS Promises/A for PHP",
"keywords": [
- "container",
- "dependency injection"
+ "promise",
+ "promises"
],
"support": {
- "source": "https://github.com/silexphp/Pimple/tree/v3.5.0"
+ "issues": "https://github.com/reactphp/promise/issues",
+ "source": "https://github.com/reactphp/promise/tree/v3.2.0"
},
- "time": "2021-10-28T11:13:42+00:00"
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-05-24T10:39:05+00:00"
},
{
- "name": "psr/http-factory",
- "version": "1.0.1",
+ "name": "react/socket",
+ "version": "v1.16.0",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/http-factory.git",
- "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
+ "url": "https://github.com/reactphp/socket.git",
+ "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
- "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1",
+ "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1",
"shasum": ""
},
"require": {
- "php": ">=7.0.0",
- "psr/http-message": "^1.0"
+ "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+ "php": ">=5.3.0",
+ "react/dns": "^1.13",
+ "react/event-loop": "^1.2",
+ "react/promise": "^3.2 || ^2.6 || ^1.2.1",
+ "react/stream": "^1.4"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
+ "require-dev": {
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+ "react/async": "^4.3 || ^3.3 || ^2",
+ "react/promise-stream": "^1.4",
+ "react/promise-timer": "^1.11"
},
+ "type": "library",
"autoload": {
"psr-4": {
- "Psr\\Http\\Message\\": "src/"
+ "React\\Socket\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -6197,52 +8023,73 @@
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
}
],
- "description": "Common interfaces for PSR-7 HTTP message factories",
+ "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP",
"keywords": [
- "factory",
- "http",
- "message",
- "psr",
- "psr-17",
- "psr-7",
- "request",
- "response"
+ "Connection",
+ "Socket",
+ "async",
+ "reactphp",
+ "stream"
],
"support": {
- "source": "https://github.com/php-fig/http-factory/tree/master"
+ "issues": "https://github.com/reactphp/socket/issues",
+ "source": "https://github.com/reactphp/socket/tree/v1.16.0"
},
- "time": "2019-04-30T12:38:16+00:00"
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-07-26T10:38:09+00:00"
},
{
- "name": "psr/http-message",
- "version": "1.0.1",
+ "name": "react/stream",
+ "version": "v1.4.0",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/http-message.git",
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ "url": "https://github.com/reactphp/stream.git",
+ "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d",
+ "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+ "php": ">=5.3.8",
+ "react/event-loop": "^1.2"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
+ "require-dev": {
+ "clue/stream-filter": "~1.2",
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
},
+ "type": "library",
"autoload": {
"psr-4": {
- "Psr\\Http\\Message\\": "src/"
+ "React\\Stream\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -6251,93 +8098,132 @@
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
}
],
- "description": "Common interface for HTTP messages",
- "homepage": "https://github.com/php-fig/http-message",
+ "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP",
"keywords": [
- "http",
- "http-message",
- "psr",
- "psr-7",
- "request",
- "response"
+ "event-driven",
+ "io",
+ "non-blocking",
+ "pipe",
+ "reactphp",
+ "readable",
+ "stream",
+ "writable"
],
"support": {
- "source": "https://github.com/php-fig/http-message/tree/master"
+ "issues": "https://github.com/reactphp/stream/issues",
+ "source": "https://github.com/reactphp/stream/tree/v1.4.0"
},
- "time": "2016-08-06T14:39:51+00:00"
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-06-11T12:45:25+00:00"
},
{
- "name": "ralouphie/getallheaders",
- "version": "3.0.3",
+ "name": "rector/rector",
+ "version": "1.2.2",
"source": {
"type": "git",
- "url": "https://github.com/ralouphie/getallheaders.git",
- "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ "url": "https://github.com/rectorphp/rector.git",
+ "reference": "044e6364017882d1e346da8690eeabc154da5495"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
- "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/044e6364017882d1e346da8690eeabc154da5495",
+ "reference": "044e6364017882d1e346da8690eeabc154da5495",
"shasum": ""
},
"require": {
- "php": ">=5.6"
+ "php": "^7.2|^8.0",
+ "phpstan/phpstan": "^1.11"
},
- "require-dev": {
- "php-coveralls/php-coveralls": "^2.1",
- "phpunit/phpunit": "^5 || ^6.5"
+ "conflict": {
+ "rector/rector-doctrine": "*",
+ "rector/rector-downgrade-php": "*",
+ "rector/rector-phpunit": "*",
+ "rector/rector-symfony": "*"
+ },
+ "suggest": {
+ "ext-dom": "To manipulate phpunit.xml via the custom-rule command"
},
+ "bin": [
+ "bin/rector"
+ ],
"type": "library",
"autoload": {
"files": [
- "src/getallheaders.php"
+ "bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Ralph Khattar",
- "email": "ralph.khattar@gmail.com"
- }
+ "description": "Instant Upgrade and Automated Refactoring of any PHP code",
+ "keywords": [
+ "automation",
+ "dev",
+ "migration",
+ "refactoring"
],
- "description": "A polyfill for getallheaders.",
"support": {
- "issues": "https://github.com/ralouphie/getallheaders/issues",
- "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ "issues": "https://github.com/rectorphp/rector/issues",
+ "source": "https://github.com/rectorphp/rector/tree/1.2.2"
},
- "time": "2019-03-08T08:55:37+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/tomasvotruba",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-25T07:44:34+00:00"
},
{
"name": "sebastian/cli-parser",
- "version": "1.0.1",
+ "version": "2.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
- "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
- "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084",
+ "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-main": "2.0-dev"
}
},
"autoload": {
@@ -6360,7 +8246,8 @@
"homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
- "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+ "security": "https://github.com/sebastianbergmann/cli-parser/security/policy",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1"
},
"funding": [
{
@@ -6368,32 +8255,32 @@
"type": "github"
}
],
- "time": "2020-09-28T06:08:49+00:00"
+ "time": "2024-03-02T07:12:49+00:00"
},
{
"name": "sebastian/code-unit",
- "version": "1.0.8",
+ "version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit.git",
- "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ "reference": "a81fee9eef0b7a76af11d121767abc44c104e503"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
- "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503",
+ "reference": "a81fee9eef0b7a76af11d121767abc44c104e503",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-main": "2.0-dev"
}
},
"autoload": {
@@ -6416,7 +8303,7 @@
"homepage": "https://github.com/sebastianbergmann/code-unit",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit/issues",
- "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0"
},
"funding": [
{
@@ -6424,32 +8311,32 @@
"type": "github"
}
],
- "time": "2020-10-26T13:08:54+00:00"
+ "time": "2023-02-03T06:58:43+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
- "version": "2.0.3",
+ "version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
- "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
- "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+ "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -6471,7 +8358,7 @@
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
- "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0"
},
"funding": [
{
@@ -6479,34 +8366,36 @@
"type": "github"
}
],
- "time": "2020-09-28T05:30:19+00:00"
+ "time": "2023-02-03T06:59:15+00:00"
},
{
"name": "sebastian/comparator",
- "version": "4.0.6",
+ "version": "5.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
+ "reference": "2db5010a484d53ebf536087a70b4a5423c102372"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
- "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372",
+ "reference": "2db5010a484d53ebf536087a70b4a5423c102372",
"shasum": ""
},
"require": {
- "php": ">=7.3",
- "sebastian/diff": "^4.0",
- "sebastian/exporter": "^4.0"
+ "ext-dom": "*",
+ "ext-mbstring": "*",
+ "php": ">=8.1",
+ "sebastian/diff": "^5.0",
+ "sebastian/exporter": "^5.0"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^10.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -6545,7 +8434,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
- "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
+ "security": "https://github.com/sebastianbergmann/comparator/security/policy",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1"
},
"funding": [
{
@@ -6553,33 +8443,33 @@
"type": "github"
}
],
- "time": "2020-10-26T15:49:45+00:00"
+ "time": "2023-08-14T13:18:12+00:00"
},
{
"name": "sebastian/complexity",
- "version": "2.0.2",
+ "version": "3.2.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
- "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ "reference": "68ff824baeae169ec9f2137158ee529584553799"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
- "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799",
+ "reference": "68ff824baeae169ec9f2137158ee529584553799",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.7",
- "php": ">=7.3"
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-main": "3.2-dev"
}
},
"autoload": {
@@ -6602,7 +8492,8 @@
"homepage": "https://github.com/sebastianbergmann/complexity",
"support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues",
- "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+ "security": "https://github.com/sebastianbergmann/complexity/security/policy",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0"
},
"funding": [
{
@@ -6610,33 +8501,33 @@
"type": "github"
}
],
- "time": "2020-10-26T15:52:27+00:00"
+ "time": "2023-12-21T08:37:17+00:00"
},
{
"name": "sebastian/diff",
- "version": "4.0.4",
+ "version": "5.1.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+ "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
- "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e",
+ "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^9.3",
- "symfony/process": "^4.2 || ^5"
+ "phpunit/phpunit": "^10.0",
+ "symfony/process": "^6.4"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-main": "5.1-dev"
}
},
"autoload": {
@@ -6668,7 +8559,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
- "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
+ "security": "https://github.com/sebastianbergmann/diff/security/policy",
+ "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1"
},
"funding": [
{
@@ -6676,27 +8568,27 @@
"type": "github"
}
],
- "time": "2020-10-26T13:10:38+00:00"
+ "time": "2024-03-02T07:15:17+00:00"
},
{
"name": "sebastian/environment",
- "version": "5.1.4",
+ "version": "6.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
+ "reference": "8074dbcd93529b357029f5cc5058fd3e43666984"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
- "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984",
+ "reference": "8074dbcd93529b357029f5cc5058fd3e43666984",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^10.0"
},
"suggest": {
"ext-posix": "*"
@@ -6704,7 +8596,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.1-dev"
+ "dev-main": "6.1-dev"
}
},
"autoload": {
@@ -6723,7 +8615,7 @@
}
],
"description": "Provides functionality to handle HHVM/PHP environments",
- "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "homepage": "https://github.com/sebastianbergmann/environment",
"keywords": [
"Xdebug",
"environment",
@@ -6731,7 +8623,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
- "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
+ "security": "https://github.com/sebastianbergmann/environment/security/policy",
+ "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0"
},
"funding": [
{
@@ -6739,34 +8632,34 @@
"type": "github"
}
],
- "time": "2022-04-03T09:37:03+00:00"
+ "time": "2024-03-23T08:47:14+00:00"
},
{
"name": "sebastian/exporter",
- "version": "4.0.4",
+ "version": "5.1.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9"
+ "reference": "955288482d97c19a372d3f31006ab3f37da47adf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9",
- "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf",
+ "reference": "955288482d97c19a372d3f31006ab3f37da47adf",
"shasum": ""
},
"require": {
- "php": ">=7.3",
- "sebastian/recursion-context": "^4.0"
+ "ext-mbstring": "*",
+ "php": ">=8.1",
+ "sebastian/recursion-context": "^5.0"
},
"require-dev": {
- "ext-mbstring": "*",
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-main": "5.1-dev"
}
},
"autoload": {
@@ -6808,7 +8701,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
- "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4"
+ "security": "https://github.com/sebastianbergmann/exporter/security/policy",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2"
},
"funding": [
{
@@ -6816,38 +8710,35 @@
"type": "github"
}
],
- "time": "2021-11-11T14:18:36+00:00"
+ "time": "2024-03-02T07:17:12+00:00"
},
{
"name": "sebastian/global-state",
- "version": "5.0.5",
+ "version": "6.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
+ "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
- "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
+ "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
"shasum": ""
},
"require": {
- "php": ">=7.3",
- "sebastian/object-reflector": "^2.0",
- "sebastian/recursion-context": "^4.0"
+ "php": ">=8.1",
+ "sebastian/object-reflector": "^3.0",
+ "sebastian/recursion-context": "^5.0"
},
"require-dev": {
"ext-dom": "*",
- "phpunit/phpunit": "^9.3"
- },
- "suggest": {
- "ext-uopz": "*"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.0-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
@@ -6866,13 +8757,14 @@
}
],
"description": "Snapshotting of global state",
- "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "homepage": "https://www.github.com/sebastianbergmann/global-state",
"keywords": [
"global state"
],
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
- "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
+ "security": "https://github.com/sebastianbergmann/global-state/security/policy",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2"
},
"funding": [
{
@@ -6880,33 +8772,33 @@
"type": "github"
}
],
- "time": "2022-02-14T08:28:10+00:00"
+ "time": "2024-03-02T07:19:19+00:00"
},
{
"name": "sebastian/lines-of-code",
- "version": "1.0.3",
+ "version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
- "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
- "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0",
+ "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.6",
- "php": ">=7.3"
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-main": "2.0-dev"
}
},
"autoload": {
@@ -6929,7 +8821,8 @@
"homepage": "https://github.com/sebastianbergmann/lines-of-code",
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
- "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+ "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2"
},
"funding": [
{
@@ -6937,34 +8830,34 @@
"type": "github"
}
],
- "time": "2020-11-28T06:42:11+00:00"
+ "time": "2023-12-21T08:38:20+00:00"
},
{
"name": "sebastian/object-enumerator",
- "version": "4.0.4",
+ "version": "5.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
- "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
- "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906",
+ "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906",
"shasum": ""
},
"require": {
- "php": ">=7.3",
- "sebastian/object-reflector": "^2.0",
- "sebastian/recursion-context": "^4.0"
+ "php": ">=8.1",
+ "sebastian/object-reflector": "^3.0",
+ "sebastian/recursion-context": "^5.0"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -6986,7 +8879,7 @@
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
- "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0"
},
"funding": [
{
@@ -6994,32 +8887,32 @@
"type": "github"
}
],
- "time": "2020-10-26T13:12:34+00:00"
+ "time": "2023-02-03T07:08:32+00:00"
},
{
"name": "sebastian/object-reflector",
- "version": "2.0.4",
+ "version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-reflector.git",
- "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ "reference": "24ed13d98130f0e7122df55d06c5c4942a577957"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
- "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957",
+ "reference": "24ed13d98130f0e7122df55d06c5c4942a577957",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -7041,7 +8934,7 @@
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-reflector/issues",
- "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0"
},
"funding": [
{
@@ -7049,32 +8942,32 @@
"type": "github"
}
],
- "time": "2020-10-26T13:14:26+00:00"
+ "time": "2023-02-03T07:06:18+00:00"
},
{
"name": "sebastian/recursion-context",
- "version": "4.0.4",
+ "version": "5.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
+ "reference": "05909fb5bc7df4c52992396d0116aed689f93712"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
- "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712",
+ "reference": "05909fb5bc7df4c52992396d0116aed689f93712",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -7101,10 +8994,10 @@
}
],
"description": "Provides functionality to recursively process PHP variables",
- "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
"support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
- "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0"
},
"funding": [
{
@@ -7112,32 +9005,32 @@
"type": "github"
}
],
- "time": "2020-10-26T13:17:30+00:00"
+ "time": "2023-02-03T07:05:40+00:00"
},
{
- "name": "sebastian/resource-operations",
- "version": "3.0.3",
+ "name": "sebastian/type",
+ "version": "4.0.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/resource-operations.git",
- "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "462699a16464c3944eefc02ebdd77882bd3925bf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
- "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf",
+ "reference": "462699a16464c3944eefc02ebdd77882bd3925bf",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^9.0"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -7152,14 +9045,15 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Provides a list of PHP built-in functions that operate on resources",
- "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
"support": {
- "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
- "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/4.0.0"
},
"funding": [
{
@@ -7167,32 +9061,29 @@
"type": "github"
}
],
- "time": "2020-09-28T06:45:17+00:00"
+ "time": "2023-02-03T07:10:45+00:00"
},
{
- "name": "sebastian/type",
- "version": "3.0.0",
+ "name": "sebastian/version",
+ "version": "4.0.1",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/type.git",
- "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad"
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
- "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+ "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17",
"shasum": ""
},
"require": {
- "php": ">=7.3"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.5"
+ "php": ">=8.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -7211,11 +9102,11 @@
"role": "lead"
}
],
- "description": "Collection of value objects that represent the types of the PHP type system",
- "homepage": "https://github.com/sebastianbergmann/type",
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
"support": {
- "issues": "https://github.com/sebastianbergmann/type/issues",
- "source": "https://github.com/sebastianbergmann/type/tree/3.0.0"
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/4.0.1"
},
"funding": [
{
@@ -7223,88 +9114,323 @@
"type": "github"
}
],
- "time": "2022-03-15T09:54:48+00:00"
+ "time": "2023-02-07T11:34:05+00:00"
},
{
- "name": "sebastian/version",
- "version": "3.0.2",
+ "name": "spatie/backtrace",
+ "version": "1.6.2",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/version.git",
- "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ "url": "https://github.com/spatie/backtrace.git",
+ "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
- "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "url": "https://api.github.com/repos/spatie/backtrace/zipball/1a9a145b044677ae3424693f7b06479fc8c137a9",
+ "reference": "1a9a145b044677ae3424693f7b06479fc8c137a9",
"shasum": ""
},
"require": {
- "php": ">=7.3"
+ "php": "^7.3|^8.0"
+ },
+ "require-dev": {
+ "ext-json": "*",
+ "laravel/serializable-closure": "^1.3",
+ "phpunit/phpunit": "^9.3",
+ "spatie/phpunit-snapshot-assertions": "^4.2",
+ "symfony/var-dumper": "^5.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Spatie\\Backtrace\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Freek Van de Herten",
+ "email": "freek@spatie.be",
+ "homepage": "https://spatie.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "A better backtrace",
+ "homepage": "https://github.com/spatie/backtrace",
+ "keywords": [
+ "Backtrace",
+ "spatie"
+ ],
+ "support": {
+ "source": "https://github.com/spatie/backtrace/tree/1.6.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/spatie",
+ "type": "github"
+ },
+ {
+ "url": "https://spatie.be/open-source/support-us",
+ "type": "other"
+ }
+ ],
+ "time": "2024-07-22T08:21:24+00:00"
+ },
+ {
+ "name": "spatie/laravel-ray",
+ "version": "1.37.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/laravel-ray.git",
+ "reference": "c2bedfd1172648df2c80aaceb2541d70f1d9a5b9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/c2bedfd1172648df2c80aaceb2541d70f1d9a5b9",
+ "reference": "c2bedfd1172648df2c80aaceb2541d70f1d9a5b9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "illuminate/contracts": "^7.20|^8.19|^9.0|^10.0|^11.0",
+ "illuminate/database": "^7.20|^8.19|^9.0|^10.0|^11.0",
+ "illuminate/queue": "^7.20|^8.19|^9.0|^10.0|^11.0",
+ "illuminate/support": "^7.20|^8.19|^9.0|^10.0|^11.0",
+ "php": "^7.4|^8.0",
+ "rector/rector": "^0.19.2|^1.0",
+ "spatie/backtrace": "^1.0",
+ "spatie/ray": "^1.41.1",
+ "symfony/stopwatch": "4.2|^5.1|^6.0|^7.0",
+ "zbateson/mail-mime-parser": "^1.3.1|^2.0|^3.0"
+ },
+ "require-dev": {
+ "guzzlehttp/guzzle": "^7.3",
+ "laravel/framework": "^7.20|^8.19|^9.0|^10.0|^11.0",
+ "orchestra/testbench-core": "^5.0|^6.0|^7.0|^8.0|^9.0",
+ "pestphp/pest": "^1.22|^2.0",
+ "phpstan/phpstan": "^1.10.57",
+ "phpunit/phpunit": "^9.3|^10.1",
+ "spatie/pest-plugin-snapshots": "^1.1|^2.0",
+ "symfony/var-dumper": "^4.2|^5.1|^6.0|^7.0.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-main": "1.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Spatie\\LaravelRay\\RayServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Spatie\\LaravelRay\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Freek Van der Herten",
+ "email": "freek@spatie.be",
+ "homepage": "https://spatie.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "Easily debug Laravel apps",
+ "homepage": "https://github.com/spatie/laravel-ray",
+ "keywords": [
+ "laravel-ray",
+ "spatie"
+ ],
+ "support": {
+ "issues": "https://github.com/spatie/laravel-ray/issues",
+ "source": "https://github.com/spatie/laravel-ray/tree/1.37.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/spatie",
+ "type": "github"
+ },
+ {
+ "url": "https://spatie.be/open-source/support-us",
+ "type": "other"
+ }
+ ],
+ "time": "2024-07-12T12:35:17+00:00"
+ },
+ {
+ "name": "spatie/macroable",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/macroable.git",
+ "reference": "ec2c320f932e730607aff8052c44183cf3ecb072"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/macroable/zipball/ec2c320f932e730607aff8052c44183cf3ecb072",
+ "reference": "ec2c320f932e730607aff8052c44183cf3ecb072",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.0|^9.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Spatie\\Macroable\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Freek Van der Herten",
+ "email": "freek@spatie.be",
+ "homepage": "https://spatie.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "A trait to dynamically add methods to a class",
+ "homepage": "https://github.com/spatie/macroable",
+ "keywords": [
+ "macroable",
+ "spatie"
+ ],
+ "support": {
+ "issues": "https://github.com/spatie/macroable/issues",
+ "source": "https://github.com/spatie/macroable/tree/2.0.0"
+ },
+ "time": "2021-03-26T22:39:02+00:00"
+ },
+ {
+ "name": "spatie/ray",
+ "version": "1.41.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/spatie/ray.git",
+ "reference": "c44f8cfbf82c69909b505de61d8d3f2d324e93fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/spatie/ray/zipball/c44f8cfbf82c69909b505de61d8d3f2d324e93fc",
+ "reference": "c44f8cfbf82c69909b505de61d8d3f2d324e93fc",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "ext-json": "*",
+ "php": "^7.3|^8.0",
+ "ramsey/uuid": "^3.0|^4.1",
+ "spatie/backtrace": "^1.1",
+ "spatie/macroable": "^1.0|^2.0",
+ "symfony/stopwatch": "^4.0|^5.1|^6.0|^7.0",
+ "symfony/var-dumper": "^4.2|^5.1|^6.0|^7.0.3"
+ },
+ "require-dev": {
+ "illuminate/support": "6.x|^8.18|^9.0",
+ "nesbot/carbon": "^2.63",
+ "pestphp/pest": "^1.22",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^9.5",
+ "rector/rector": "^0.19.2",
+ "spatie/phpunit-snapshot-assertions": "^4.2",
+ "spatie/test-time": "^1.2"
+ },
+ "bin": [
+ "bin/remove-ray.sh"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
+ "psr-4": {
+ "Spatie\\Ray\\": "src"
}
},
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
+ "name": "Freek Van der Herten",
+ "email": "freek@spatie.be",
+ "homepage": "https://spatie.be",
+ "role": "Developer"
}
],
- "description": "Library that helps with managing the version number of Git-hosted PHP projects",
- "homepage": "https://github.com/sebastianbergmann/version",
+ "description": "Debug with Ray to fix problems faster",
+ "homepage": "https://github.com/spatie/ray",
+ "keywords": [
+ "ray",
+ "spatie"
+ ],
"support": {
- "issues": "https://github.com/sebastianbergmann/version/issues",
- "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+ "issues": "https://github.com/spatie/ray/issues",
+ "source": "https://github.com/spatie/ray/tree/1.41.2"
},
"funding": [
{
- "url": "https://github.com/sebastianbergmann",
+ "url": "https://github.com/sponsors/spatie",
"type": "github"
+ },
+ {
+ "url": "https://spatie.be/open-source/support-us",
+ "type": "other"
}
],
- "time": "2020-09-28T06:39:44+00:00"
+ "time": "2024-04-24T14:21:46+00:00"
},
{
- "name": "spatie/backtrace",
- "version": "1.2.1",
+ "name": "symfony/filesystem",
+ "version": "v7.2.0",
"source": {
"type": "git",
- "url": "https://github.com/spatie/backtrace.git",
- "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b"
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/backtrace/zipball/4ee7d41aa5268107906ea8a4d9ceccde136dbd5b",
- "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
+ "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
"shasum": ""
},
"require": {
- "php": "^7.3|^8.0"
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8"
},
"require-dev": {
- "ext-json": "*",
- "phpunit/phpunit": "^9.3",
- "symfony/var-dumper": "^5.1"
+ "symfony/process": "^6.4|^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
- "Spatie\\Backtrace\\": "src"
- }
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -7312,83 +9438,61 @@
],
"authors": [
{
- "name": "Freek Van de Herten",
- "email": "freek@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "A better backtrace",
- "homepage": "https://github.com/spatie/backtrace",
- "keywords": [
- "Backtrace",
- "spatie"
- ],
+ "description": "Provides basic utilities for the filesystem",
+ "homepage": "https://symfony.com",
"support": {
- "issues": "https://github.com/spatie/backtrace/issues",
- "source": "https://github.com/spatie/backtrace/tree/1.2.1"
+ "source": "https://github.com/symfony/filesystem/tree/v7.2.0"
},
"funding": [
{
- "url": "https://github.com/sponsors/spatie",
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
"type": "github"
},
{
- "url": "https://spatie.be/open-source/support-us",
- "type": "other"
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
],
- "time": "2021-11-09T10:57:15+00:00"
+ "time": "2024-10-25T15:15:23+00:00"
},
{
- "name": "spatie/laravel-ray",
- "version": "1.29.5",
+ "name": "symfony/options-resolver",
+ "version": "v7.2.0",
"source": {
"type": "git",
- "url": "https://github.com/spatie/laravel-ray.git",
- "reference": "7bb6f1f749e235cea5a963b4c12986baefafd624"
+ "url": "https://github.com/symfony/options-resolver.git",
+ "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/7bb6f1f749e235cea5a963b4c12986baefafd624",
- "reference": "7bb6f1f749e235cea5a963b4c12986baefafd624",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50",
+ "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50",
"shasum": ""
},
"require": {
- "ext-json": "*",
- "illuminate/contracts": "^7.20|^8.19|^9.0",
- "illuminate/database": "^7.20|^8.19|^9.0",
- "illuminate/queue": "^7.20|^8.19|^9.0",
- "illuminate/support": "^7.20|^8.19|^9.0",
- "php": "^7.3|^8.0",
- "spatie/backtrace": "^1.0",
- "spatie/ray": "^1.33",
- "symfony/stopwatch": "4.2|^5.1|^6.0",
- "zbateson/mail-mime-parser": "^1.3.1|^2.0"
- },
- "require-dev": {
- "guzzlehttp/guzzle": "^7.3",
- "laravel/framework": "^7.20|^8.19|^9.0",
- "orchestra/testbench-core": "^5.0|^6.0|^7.0",
- "phpstan/phpstan": "^0.12.93",
- "phpunit/phpunit": "^9.3",
- "spatie/phpunit-snapshot-assertions": "^4.2"
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.29.x-dev"
- },
- "laravel": {
- "providers": [
- "Spatie\\LaravelRay\\RayServiceProvider"
- ]
- }
- },
"autoload": {
"psr-4": {
- "Spatie\\LaravelRay\\": "src"
- }
+ "Symfony\\Component\\OptionsResolver\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -7396,58 +9500,76 @@
],
"authors": [
{
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Easily debug Laravel apps",
- "homepage": "https://github.com/spatie/laravel-ray",
+ "description": "Provides an improved replacement for the array_replace PHP function",
+ "homepage": "https://symfony.com",
"keywords": [
- "laravel-ray",
- "spatie"
+ "config",
+ "configuration",
+ "options"
],
"support": {
- "issues": "https://github.com/spatie/laravel-ray/issues",
- "source": "https://github.com/spatie/laravel-ray/tree/1.29.5"
+ "source": "https://github.com/symfony/options-resolver/tree/v7.2.0"
},
"funding": [
{
- "url": "https://github.com/sponsors/spatie",
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
"type": "github"
},
{
- "url": "https://spatie.be/open-source/support-us",
- "type": "other"
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
],
- "time": "2022-04-05T18:07:59+00:00"
+ "time": "2024-11-20T11:17:29+00:00"
},
{
- "name": "spatie/macroable",
- "version": "2.0.0",
+ "name": "symfony/polyfill-iconv",
+ "version": "v1.30.0",
"source": {
"type": "git",
- "url": "https://github.com/spatie/macroable.git",
- "reference": "ec2c320f932e730607aff8052c44183cf3ecb072"
+ "url": "https://github.com/symfony/polyfill-iconv.git",
+ "reference": "c027e6a3c6aee334663ec21f5852e89738abc805"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/macroable/zipball/ec2c320f932e730607aff8052c44183cf3ecb072",
- "reference": "ec2c320f932e730607aff8052c44183cf3ecb072",
+ "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/c027e6a3c6aee334663ec21f5852e89738abc805",
+ "reference": "c027e6a3c6aee334663ec21f5852e89738abc805",
"shasum": ""
},
"require": {
- "php": "^8.0"
+ "php": ">=7.1"
},
- "require-dev": {
- "phpunit/phpunit": "^8.0|^9.3"
+ "provide": {
+ "ext-iconv": "*"
+ },
+ "suggest": {
+ "ext-iconv": "For best performance"
},
"type": "library",
+ "extra": {
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "Spatie\\Macroable\\": "src"
+ "Symfony\\Polyfill\\Iconv\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -7456,64 +9578,76 @@
],
"authors": [
{
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "A trait to dynamically add methods to a class",
- "homepage": "https://github.com/spatie/macroable",
+ "description": "Symfony polyfill for the Iconv extension",
+ "homepage": "https://symfony.com",
"keywords": [
- "macroable",
- "spatie"
+ "compatibility",
+ "iconv",
+ "polyfill",
+ "portable",
+ "shim"
],
"support": {
- "issues": "https://github.com/spatie/macroable/issues",
- "source": "https://github.com/spatie/macroable/tree/2.0.0"
+ "source": "https://github.com/symfony/polyfill-iconv/tree/v1.30.0"
},
- "time": "2021-03-26T22:39:02+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-31T15:07:36+00:00"
},
{
- "name": "spatie/ray",
- "version": "1.34.2",
+ "name": "symfony/polyfill-php81",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/spatie/ray.git",
- "reference": "ef5836b44f7bc4a0162f1a590cbaf33e8ab655dd"
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/ray/zipball/ef5836b44f7bc4a0162f1a590cbaf33e8ab655dd",
- "reference": "ef5836b44f7bc4a0162f1a590cbaf33e8ab655dd",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
"shasum": ""
},
"require": {
- "ext-curl": "*",
- "ext-json": "*",
- "php": "^7.3|^8.0",
- "ramsey/uuid": "^3.0|^4.1",
- "spatie/backtrace": "^1.1",
- "spatie/macroable": "^1.0|^2.0",
- "symfony/stopwatch": "^4.0|^5.1|^6.0",
- "symfony/var-dumper": "^4.2|^5.1|^6.0"
- },
- "require-dev": {
- "illuminate/support": "6.x|^8.18|^9.0",
- "nesbot/carbon": "^2.43",
- "phpstan/phpstan": "^0.12.92",
- "phpunit/phpunit": "^9.5",
- "spatie/phpunit-snapshot-assertions": "^4.2",
- "spatie/test-time": "^1.2"
+ "php": ">=7.2"
},
"type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
"autoload": {
"files": [
- "src/helpers.php"
+ "bootstrap.php"
],
"psr-4": {
- "Spatie\\Ray\\": "src"
- }
+ "Symfony\\Polyfill\\Php81\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -7521,51 +9655,58 @@
],
"authors": [
{
- "name": "Freek Van der Herten",
- "email": "freek@spatie.be",
- "homepage": "https://spatie.be",
- "role": "Developer"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Debug with Ray to fix problems faster",
- "homepage": "https://github.com/spatie/ray",
+ "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
"keywords": [
- "ray",
- "spatie"
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
],
"support": {
- "issues": "https://github.com/spatie/ray/issues",
- "source": "https://github.com/spatie/ray/tree/1.34.2"
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0"
},
"funding": [
{
- "url": "https://github.com/sponsors/spatie",
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
"type": "github"
},
{
- "url": "https://spatie.be/open-source/support-us",
- "type": "other"
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
],
- "time": "2022-04-08T13:41:27+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/stopwatch",
- "version": "v6.0.5",
+ "version": "v6.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/stopwatch.git",
- "reference": "f2c1780607ec6502f2121d9729fd8150a655d337"
+ "reference": "63e069eb616049632cde9674c46957819454b8aa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f2c1780607ec6502f2121d9729fd8150a655d337",
- "reference": "f2c1780607ec6502f2121d9729fd8150a655d337",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/63e069eb616049632cde9674c46957819454b8aa",
+ "reference": "63e069eb616049632cde9674c46957819454b8aa",
"shasum": ""
},
"require": {
- "php": ">=8.0.2",
- "symfony/service-contracts": "^1|^2|^3"
+ "php": ">=8.1",
+ "symfony/service-contracts": "^2.5|^3"
},
"type": "library",
"autoload": {
@@ -7593,7 +9734,7 @@
"description": "Provides a way to profile code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/stopwatch/tree/v6.0.5"
+ "source": "https://github.com/symfony/stopwatch/tree/v6.4.8"
},
"funding": [
{
@@ -7609,35 +9750,32 @@
"type": "tidelift"
}
],
- "time": "2022-02-21T17:15:17+00:00"
+ "time": "2024-05-31T14:49:08+00:00"
},
{
"name": "symfony/yaml",
- "version": "v5.4.3",
+ "version": "v6.4.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "e80f87d2c9495966768310fc531b487ce64237a2"
+ "reference": "52903de178d542850f6f341ba92995d3d63e60c9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2",
- "reference": "e80f87d2c9495966768310fc531b487ce64237a2",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9",
+ "reference": "52903de178d542850f6f341ba92995d3d63e60c9",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.1|^3",
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
- "symfony/console": "<5.3"
+ "symfony/console": "<5.4"
},
"require-dev": {
- "symfony/console": "^5.3|^6.0"
- },
- "suggest": {
- "symfony/console": "For validating YAML files using the lint command"
+ "symfony/console": "^5.4|^6.0|^7.0"
},
"bin": [
"Resources/bin/yaml-lint"
@@ -7668,7 +9806,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/yaml/tree/v5.4.3"
+ "source": "https://github.com/symfony/yaml/tree/v6.4.8"
},
"funding": [
{
@@ -7684,20 +9822,20 @@
"type": "tidelift"
}
],
- "time": "2022-01-26T16:32:32+00:00"
+ "time": "2024-05-31T14:49:08+00:00"
},
{
"name": "theseer/tokenizer",
- "version": "1.2.1",
+ "version": "1.2.3",
"source": {
"type": "git",
"url": "https://github.com/theseer/tokenizer.git",
- "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
- "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
"shasum": ""
},
"require": {
@@ -7726,7 +9864,7 @@
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": {
"issues": "https://github.com/theseer/tokenizer/issues",
- "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.3"
},
"funding": [
{
@@ -7734,32 +9872,35 @@
"type": "github"
}
],
- "time": "2021-07-28T10:34:58+00:00"
+ "time": "2024-03-03T12:36:25+00:00"
},
{
"name": "zbateson/mail-mime-parser",
- "version": "2.2.1",
+ "version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/zbateson/mail-mime-parser.git",
- "reference": "24955de7ec352b3258c1d4551efd21202cb8710c"
+ "reference": "6ade63b0a43047935791d7977e22717a68cc388b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/24955de7ec352b3258c1d4551efd21202cb8710c",
- "reference": "24955de7ec352b3258c1d4551efd21202cb8710c",
+ "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/6ade63b0a43047935791d7977e22717a68cc388b",
+ "reference": "6ade63b0a43047935791d7977e22717a68cc388b",
"shasum": ""
},
"require": {
- "guzzlehttp/psr7": "^1.7.0|^2.0",
- "php": ">=5.4",
- "pimple/pimple": "^3.0",
- "zbateson/mb-wrapper": "^1.0.1",
- "zbateson/stream-decorators": "^1.0.6"
+ "guzzlehttp/psr7": "^2.5",
+ "php": ">=8.0",
+ "php-di/php-di": "^6.0|^7.0",
+ "psr/log": "^1|^2|^3",
+ "zbateson/mb-wrapper": "^2.0",
+ "zbateson/stream-decorators": "^2.1"
},
"require-dev": {
- "mikey179/vfsstream": "^1.6.0",
- "sanmai/phpunit-legacy-adapter": "^6.3 || ^8.2"
+ "friendsofphp/php-cs-fixer": "*",
+ "monolog/monolog": "^2|^3",
+ "phpstan/phpstan": "*",
+ "phpunit/phpunit": "^9.6"
},
"suggest": {
"ext-iconv": "For best support/performance",
@@ -7807,29 +9948,31 @@
"type": "github"
}
],
- "time": "2022-02-22T21:35:59+00:00"
+ "time": "2024-04-29T21:53:01+00:00"
},
{
"name": "zbateson/mb-wrapper",
- "version": "1.1.1",
+ "version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/zbateson/mb-wrapper.git",
- "reference": "bfd45fb3e2a8cf4c496b2c3ebd63b5f815721498"
+ "reference": "9e4373a153585d12b6c621ac4a6bb143264d4619"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/bfd45fb3e2a8cf4c496b2c3ebd63b5f815721498",
- "reference": "bfd45fb3e2a8cf4c496b2c3ebd63b5f815721498",
+ "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/9e4373a153585d12b6c621ac4a6bb143264d4619",
+ "reference": "9e4373a153585d12b6c621ac4a6bb143264d4619",
"shasum": ""
},
"require": {
- "php": ">=5.4",
+ "php": ">=8.0",
"symfony/polyfill-iconv": "^1.9",
"symfony/polyfill-mbstring": "^1.9"
},
"require-dev": {
- "sanmai/phpunit-legacy-adapter": "^6.3 || ^8"
+ "friendsofphp/php-cs-fixer": "*",
+ "phpstan/phpstan": "*",
+ "phpunit/phpunit": "<10.0"
},
"suggest": {
"ext-iconv": "For best support/performance",
@@ -7866,7 +10009,7 @@
],
"support": {
"issues": "https://github.com/zbateson/mb-wrapper/issues",
- "source": "https://github.com/zbateson/mb-wrapper/tree/1.1.1"
+ "source": "https://github.com/zbateson/mb-wrapper/tree/2.0.0"
},
"funding": [
{
@@ -7874,29 +10017,31 @@
"type": "github"
}
],
- "time": "2021-11-22T21:59:45+00:00"
+ "time": "2024-03-20T01:38:07+00:00"
},
{
"name": "zbateson/stream-decorators",
- "version": "1.0.6",
+ "version": "2.1.1",
"source": {
"type": "git",
"url": "https://github.com/zbateson/stream-decorators.git",
- "reference": "3403c4323bd1cd15fe54348b031b26b064c706af"
+ "reference": "32a2a62fb0f26313395c996ebd658d33c3f9c4e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/3403c4323bd1cd15fe54348b031b26b064c706af",
- "reference": "3403c4323bd1cd15fe54348b031b26b064c706af",
+ "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/32a2a62fb0f26313395c996ebd658d33c3f9c4e5",
+ "reference": "32a2a62fb0f26313395c996ebd658d33c3f9c4e5",
"shasum": ""
},
"require": {
- "guzzlehttp/psr7": "^1.7.0|^2.0",
- "php": ">=5.4",
- "zbateson/mb-wrapper": "^1.0.0"
+ "guzzlehttp/psr7": "^2.5",
+ "php": ">=8.0",
+ "zbateson/mb-wrapper": "^2.0"
},
"require-dev": {
- "sanmai/phpunit-legacy-adapter": "^6.3 || ^8"
+ "friendsofphp/php-cs-fixer": "*",
+ "phpstan/phpstan": "*",
+ "phpunit/phpunit": "^9.6|^10.0"
},
"type": "library",
"autoload": {
@@ -7927,7 +10072,7 @@
],
"support": {
"issues": "https://github.com/zbateson/stream-decorators/issues",
- "source": "https://github.com/zbateson/stream-decorators/tree/1.0.6"
+ "source": "https://github.com/zbateson/stream-decorators/tree/2.1.1"
},
"funding": [
{
@@ -7935,17 +10080,17 @@
"type": "github"
}
],
- "time": "2021-07-08T19:01:59+00:00"
+ "time": "2024-04-29T21:42:39+00:00"
}
],
"aliases": [],
"minimum-stability": "stable",
- "stability-flags": [],
+ "stability-flags": {},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
- "php": "^7.0|^8.0"
+ "php": "^8.0"
},
- "platform-dev": [],
- "plugin-api-version": "2.3.0"
+ "platform-dev": {},
+ "plugin-api-version": "2.6.0"
}
diff --git a/config/scim.php b/config/scim.php
index dca39d34..e92941b0 100644
--- a/config/scim.php
+++ b/config/scim.php
@@ -2,5 +2,11 @@
return [
"publish_routes" => true,
- 'omit_main_schema_in_return' => false
+ 'omit_main_schema_in_return' => false,
+ 'omit_null_values' => true,
+
+ 'pagination' => [
+ 'defaultPageSize' => 10,
+ 'maxPageSize' => 100,
+ ]
];
diff --git a/database/factories/GroupFactory.php b/database/factories/GroupFactory.php
new file mode 100644
index 00000000..1147295d
--- /dev/null
+++ b/database/factories/GroupFactory.php
@@ -0,0 +1,10 @@
+define(Group::class, function (Generator $faker) {
+ return [
+ 'displayName' => $faker->company
+ ];
+});
diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php
index c32cef10..641ef872 100644
--- a/database/factories/UserFactory.php
+++ b/database/factories/UserFactory.php
@@ -5,8 +5,10 @@
$factory->define(ArieTimmerman\Laravel\SCIMServer\Tests\Model\User::class, function (Generator $faker) {
return [
// 'username' => $faker->userName,
- 'email' => $faker->email,
+ 'email' => $faker->unique()->email,
+ 'formatted' => $faker->name,
'name' => $faker->name,
- 'password'=>'test'
+ 'password'=>'test',
+ 'active' => false
];
});
diff --git a/docker-compose.yml b/docker-compose.yml
index c3a84a2f..12f972e4 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -3,6 +3,11 @@ services:
laravel-scim-server:
build: .
ports:
+ # forward xdebug ports
- "127.0.0.1:18123:8000"
+ working_dir: /example
+ environment:
+ - XDEBUG_MODE=debug
+ - XDEBUG_SESSION=1
volumes:
- .:/laravel-scim-server
diff --git a/laravel-scim-server.svg b/laravel-scim-server.svg
new file mode 100644
index 00000000..1d79d20f
--- /dev/null
+++ b/laravel-scim-server.svg
@@ -0,0 +1,103 @@
+
+
+
+
diff --git a/phpunit.xml b/phpunit.xml
index 888a80d5..357d2102 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -1,10 +1,8 @@
-parent != null) {
+ return null;
+ }
+
+ return collect($this->subAttributes)->first(fn ($element) => $element instanceof Schema);
+ }
+
+ public function getSchemaNodes(){
+ return collect($this->subAttributes)->filter(fn ($element) => $element instanceof Schema)->values()->toArray();
+ }
+
+ public function getValidations()
+ {
+ $result = [
+ addcslashes($this->getFullKey(),'.') => $this->validations
+ ];
+
+ foreach ($this->subAttributes as $attribute) {
+ $result = array_merge($result, $attribute->getValidations());
+ }
+
+ $result = collect($result)->filter(fn ($v, $k) => !empty($v))->toArray();
+
+ return $result;
+ }
+
+ public function withSubAttributes(...$subAttributes)
+ {
+ foreach ($subAttributes as $attribute) {
+ $attribute->setParent($this);
+ }
+
+ $this->subAttributes = $subAttributes;
+
+ return $this;
+ }
+
+ public function getSubNode(string $key): ?Attribute
+ {
+ $result = collect($this->subAttributes)->first(fn ($element) => $element->name == $key);
+
+ // if this is the root node, search for a subNode in one of the default schema nodes
+ if($result == null){
+ $result = $this->getSchemaNode()?->getSubNode($key);
+ }
+
+ return $result;
+ }
+
+ public function generateSchema()
+ {
+ $base = parent::generateSchema();
+
+ $base['subAttributes'] = collect($this->subAttributes)->map(fn ($element) => $element->generateSchema())->toArray();
+
+ return $base;
+ }
+}
diff --git a/src/Attribute/Attribute.php b/src/Attribute/Attribute.php
new file mode 100644
index 00000000..66a666f9
--- /dev/null
+++ b/src/Attribute/Attribute.php
@@ -0,0 +1,353 @@
+name = $name;
+ }
+
+ public function getValidations()
+ {
+ $key = addcslashes($this->getFullKey(), '.');
+
+ if ($this->parent != null && $this->parent->getMultiValued()) {
+ $key = addcslashes($this->parent->getFullKey(), '.') . '.*.' . $this->name;
+ }
+
+ return [
+ $key => $this->validations
+ ];
+ }
+
+ /**
+ * Return SCIM schema for this attribute
+ */
+ public function generateSchema()
+ {
+ return [
+ 'name' => $this->name,
+ 'type' => $this->getType(),
+ 'mutability' => $this->mutability,
+ 'returned' => $this->returned,
+ 'uniqueness' => 'server',
+ 'required' => $this->isRequired(),
+ 'multiValued' => $this->getMultiValued(),
+ 'caseExact' => false
+ ];
+ }
+
+ public function setMultiValued($multiValued)
+ {
+ $this->multiValued = $multiValued;
+
+ return $this;
+ }
+
+ public function getMultiValued()
+ {
+ return $this->multiValued;
+ }
+
+ public function setMutability($mutability)
+ {
+ $this->mutability = $mutability;
+
+ return $this;
+ }
+
+ public function ensure(...$validations)
+ {
+ $this->validations = $validations;
+
+ return $this;
+ }
+
+ public function default($value)
+ {
+ $this->defaultValue = $value;
+
+ return $this;
+ }
+
+ public function isRequired()
+ {
+ return in_array('required', $this->validations);
+ }
+
+ public function nullable()
+ {
+ return in_array('nullable', $this->validations);
+ }
+
+ public function getType()
+ {
+ $result = $this->type;
+
+ if ($result == null) {
+ if (in_array('boolean', $this->validations)) {
+ $result = 'boolean';
+ } elseif (in_array('integer', $this->validations)) {
+ $result = 'integer';
+ } else {
+ $result = 'string';
+ }
+ }
+
+ return $result;
+ }
+
+ public function isReadSupported()
+ {
+ return $this->readEnabled;
+ }
+
+ public function isWriteSupported()
+ {
+ return $this->writeEnabled;
+ }
+
+ public function shouldReturn(&$object)
+ {
+ return true;
+ }
+
+ public function setReturned($returned)
+ {
+ $this->returned = $returned;
+ return $this;
+ }
+
+ public function setParent($parent)
+ {
+ $this->parent = $parent;
+ return $this;
+ }
+
+ protected function isRequested($attributes)
+ {
+ return empty($attributes) || in_array($this->name, $attributes) || in_array($this->getFullKey(), $attributes) || ($this->parent != null && $this->parent->isRequested($attributes));
+ }
+
+ public function read(&$object, array $attributes = []): ?AttributeValue
+ {
+ // check if name or getFullKey is in attributes
+ if (!$this->isRequested($attributes)) {
+ return null;
+ }
+
+ if ($this->returned == 'never') {
+ return null;
+ }
+
+ return new AttributeValue($this->doRead($object, $attributes) ?? $this->defaultValue);
+ }
+
+ protected function doRead(&$object, $attributes = [])
+ {
+ throw new SCIMException(sprintf('Read is not implemented for "%s"', $this->getFullKey()));
+ }
+
+ public function getFullKey()
+ {
+ if ($this->parent != null && $this->parent->name != null) {
+ $separator = $this->parent instanceof AttributeSchema ? ':' : '.';
+ return $this->parent->getFullKey() . $separator . $this->name;
+ } else {
+ return $this->name;
+ }
+ }
+
+ public function getSchema()
+ {
+ if ($this instanceof AttributeSchema) {
+ return $this->name;
+ } else {
+ return $this->parent?->getSchema();
+ }
+ }
+
+ public function getNode(?AttributePath $attributePath)
+ {
+ if (empty($attributePath)) {
+ return $this;
+ }
+
+ //The first schema should be the default one
+ $schema = $attributePath->schema ?? $this->getDefaultSchema();
+
+ if (!empty($schema) && !empty($this->getSchema()) && $this->getSchema() != $schema) {
+ throw (new SCIMException(sprintf('Trying to get attribute for schema "%s". But schema is already "%s"', $attributePath->schema, $this->getSchema())))->setCode(500)->setScimType('noTarget');
+ }
+
+ $elements = [];
+
+ // The attribute mapping MUST include the schema. Therefore, add the schema to the first element.
+ if (empty($attributePath->attributeNames) && !empty($schema)) {
+ $elements[] = $schema;
+ } elseif (empty($this->getSchema()) && !in_array($attributePath->attributeNames[0], Schema::ATTRIBUTES_CORE)) {
+ $elements[] = $schema ?? (is_array($this->getDefaultSchema()) ? $this->getDefaultSchema()[0] : $this->getDefaultSchema());
+ }
+
+ foreach ($attributePath->attributeNames as $a) {
+ $elements[] = $a;
+ }
+
+ /**
+ * @var Attribute $node
+ */
+ $node = $this;
+
+ foreach ($elements as $element) {
+ try {
+ $node = $node->getSubNode($element, $schema);
+
+ if ($node instanceof Attribute && $this->getDefaultSchema()) {
+ //$node->setDefaultSchema($this->getDefaultSchema());
+ }
+ } catch (\Exception $e) {
+ throw $e;
+ }
+ }
+
+ return $node;
+ }
+
+ /**
+ * Used by scimFilterToLaravelQuery and getEloquentSortAttribute
+ * Example filter:
+ * - urn:ietf:params:scim:schemas:core:2.0:User:userName eq "bjensen"
+ * - userName co "jensen"
+ * example sort:
+ * urn:ietf:params:scim:schemas:core:2.0:User:userName
+ */
+ public function getSubNodeWithPath($path)
+ {
+ if ($path == null) {
+ return $this;
+ } else {
+ $getAttributePath = function () {
+ return $this->attributePath;
+ };
+
+ $getValuePath = function () {
+ return $this->valuePath;
+ };
+
+ $getFilter = function () {
+ return $this->filter;
+ };
+
+ $first = @$getAttributePath->call((object)$getValuePath->call($path));
+ $filter = @$getFilter->call((object)$getValuePath->call($path));
+ $last = $getAttributePath->call((object)$path);
+
+ return $this->getNode($first)->withFilter($filter)->getNode($last);
+ }
+ }
+
+ public function setFilter($filter)
+ {
+ $this->filter = $filter;
+
+ return $this;
+ }
+
+ public function withFilter($filter)
+ {
+ $this->filter = $filter;
+
+ return $this;
+ }
+
+ public function applyComparison(Builder &$query, Path $path, Path $parentAttribute = null)
+ {
+ throw new SCIMException(sprintf('Comparison is not implemented for "%s"', $this->getFullKey()));
+ }
+
+ public function add($value, Model &$object)
+ {
+ throw new SCIMException(sprintf('Write is not implemented for "%s"', $this->getFullKey()));
+ }
+
+ public function replace($value, Model &$object, Path $path = null)
+ {
+ throw new SCIMException(sprintf('Replace is not implemented for "%s"', $this->getFullKey()));
+ }
+
+ public function patch($operation, $value, Model &$object, Path $path = null)
+ {
+ throw new SCIMException(sprintf('Patch is not implemented for "%s"', $this->getFullKey()));
+ }
+
+ public function remove($value, Model &$object, Path $path = null)
+ {
+ throw new SCIMException(sprintf('Remove is not implemented for "%s"', $this->getFullKey()));
+ }
+
+ public function setSortAttribute($attribute)
+ {
+ $this->sortAttribute = $attribute;
+
+ return $this;
+ }
+
+ public function getSortAttribute()
+ {
+ if (!$this->readEnabled) {
+ throw new SCIMException(sprintf('Can\'t sort on unreadable attribute "%s"', $this->getFullKey()));
+ }
+
+ return $this->sortAttribute;
+ }
+
+ public function getSortAttributeByPath(Path $path)
+ {
+ throw new SCIMException(sprintf('Sort is not implemented for "%s"', $this->getFullKey()));
+ }
+
+ public function isDirty()
+ {
+ return $this->dirty;
+ }
+}
diff --git a/src/Attribute/AttributeMapping.php b/src/Attribute/AttributeMapping.php
deleted file mode 100644
index 4037402e..00000000
--- a/src/Attribute/AttributeMapping.php
+++ /dev/null
@@ -1,635 +0,0 @@
-disableWrite()->ignoreRead()->setParent($parent);
- }
-
- public static function arrayOfObjects($mapping, $parent = null) : AttributeMapping
- {
- return (new Collection())->setStaticCollection($mapping)->setRead(
- function (&$object) use ($mapping, $parent) {
- $result = [];
-
- foreach ($mapping as $key => $o) {
- $element = self::ensureAttributeMappingObject($o)->setParent($parent)->read($object);
-
- if ($element != null) {
- $result[] = $element;
- }
- }
-
- return empty($result) ? null : $result;
- }
- );
- }
-
- public static function object($mapping, $parent = null) : AttributeMapping
- {
- return (new AttributeMapping())->setMappingAssocArray($mapping)->setRead(
- function (&$object) use ($mapping, $parent) {
- $result = [];
-
- foreach ($mapping as $key => $value) {
- $result[$key] = self::ensureAttributeMappingObject($value)->setParent($parent)->read($object);
-
- if (empty($result[$key]) && !is_bool($result[$key])) {
- unset($result[$key]);
- }
- }
-
- return empty($result) ? null : $result;
- }
- );
- }
-
- public static function constant($text, $parent = null) : AttributeMapping
- {
- return (new AttributeMapping())->disableWrite()->setParent($parent)->setRead(
- function (&$object) use ($text) {
- return $text;
- }
- );
- }
-
- public static function eloquent($eloquentAttribute, $parent = null) : AttributeMapping
- {
- return (new EloquentAttributeMapping())->setEloquentReadAttribute($eloquentAttribute)->setParent($parent)->setAdd(
- function ($value, &$object) use ($eloquentAttribute) {
- $object->{$eloquentAttribute} = $value;
- }
- )->setReplace(
- function ($value, &$object) use ($eloquentAttribute) {
- $object->{$eloquentAttribute} = $value;
- }
- )->setSortAttribute($eloquentAttribute)->setEloquentAttributes([$eloquentAttribute]);
- }
-
- public static function eloquentCollection($eloquentAttribute, $parent = null) : AttributeMapping
- {
- return (new AttributeMapping())->setParent($parent)->setRead(
- function (&$object) use ($eloquentAttribute) {
- $result = $object->{$eloquentAttribute};
-
- return self::eloquentAttributeToString($result);
- }
- )->setAdd(
- function ($value, &$object) use ($eloquentAttribute) {
- if (!is_array($value)) {
- $value = [$value];
- }
-
- $object->{$eloquentAttribute}()->attach(collect($value)->pluck('value'));
- }
- )->setReplace(
- function ($value, &$object) use ($eloquentAttribute) {
- $object->{$eloquentAttribute}()->sync(collect($value)->pluck('value'));
- }
- )->setSortAttribute($eloquentAttribute)->setEloquentAttributes([$eloquentAttribute]);
- }
-
- public function setMappingAssocArray($mapping) : AttributeMapping
- {
- $this->mappingAssocArray = $mapping;
-
- return $this;
- }
-
- public function setSchema($schema) : AttributeMapping
- {
- $this->schema = $schema;
- return $this;
- }
-
- public function getSchema()
- {
- return $this->schema;
- }
-
- public function setDefaultSchema($schema) : AttributeMapping
- {
- $this->defaultSchema = $schema;
-
- return $this;
- }
-
- public function getDefaultSchema()
- {
- return $this->defaultSchema;
- }
-
- public function setEloquentReadAttribute($attribute)
- {
- $this->eloquentReadAttribute = $attribute;
-
- return $this;
- }
-
- public function setEloquentAttributes(array $attributes)
- {
- $this->eloquentAttributes = $attributes;
-
- return $this;
- }
-
- public function getEloquentAttributes()
- {
- $result = $this->eloquentAttributes;
-
- if ($this->mappingAssocArray) {
- foreach ($this->mappingAssocArray as $key => $value) {
- foreach (self::ensureAttributeMappingObject($value)->setParent($this)->getEloquentAttributes() as $attribute) {
- $result[] = $attribute;
- }
- }
- }
-
- return $result;
- }
-
- public function disableRead()
- {
- $parent = $this;
-
- $this->read = function (&$object) use ($parent) {
- // throw new SCIMException('Read is not supported for ' . $parent->getFullKey());
- return null; //"disabled!!";
- };
-
- $this->readEnabled = false;
-
- return $this;
- }
-
- /**
- * @return self
- */
- public function ignoreRead()
- {
- $this->read = function (&$object) {
- return null;
- };
-
- return $this;
- }
-
- /**
- * @return self
- */
- public function ignoreWrite()
- {
- $ignore = function ($value, &$object) {
- //ignore
- };
-
- $this->add = $ignore;
- $this->replace = $ignore;
- $this->remove = $ignore;
-
- return $this;
- }
-
- public function disableWrite()
- {
- $disable = function ($value, &$object) {
- throw (new SCIMException(sprintf('Write to "%s" is not supported', $this->getFullKey())))->setCode(500)->setScimType('mutability');
- };
-
- $this->add = $disable;
- $this->replace = $disable;
- $this->remove = $disable;
-
- $this->writeEnabled = false;
-
- return $this;
- }
-
- /**
- * @return self
- */
- public function setRead($read) : AttributeMapping
- {
- $this->read = $read;
-
- return $this;
- }
-
- public function setAdd($write)
- {
- $this->add = $write;
-
- return $this;
- }
-
- public function setRemove($write)
- {
- $this->remove = $write;
-
- return $this;
- }
-
- public function setReturned($returned)
- {
- $this->returned = $returned;
-
- return $this;
- }
-
- public function setReplace($replace)
- {
- $this->replace = $replace;
-
- return $this;
- }
-
- public function setWriteAfter($writeAfter)
- {
- $this->writeAfter = $writeAfter;
-
- return $this;
- }
-
- public function setParent($parent)
- {
- $this->parent = $parent;
- return $this;
- }
-
- public function setKey($key)
- {
- $this->key = $key;
- return $this;
- }
-
- public function getKey()
- {
- return $this->key;
- }
-
- public function getFullKey()
- {
- $parent = $this->parent;
-
- $fullKey = [];
-
- while ($parent != null) {
- array_unshift($fullKey, $parent->getKey());
- $parent = $parent->parent;
- }
-
- $fullKey[] = $this->getKey();
-
- //ugly hack
- $fullKey = array_filter(
- $fullKey,
- function ($value) {
- return !empty($value);
- }
- );
-
- return Helper::getFlattenKey($fullKey, [$this->getSchema() ?? $this->getDefaultSchema()]);
- }
-
- public function setFilter($filter)
- {
- $this->filter = $filter;
-
- return $this;
- }
-
- public function readNotImplemented($object)
- {
- throw new SCIMException(sprintf('Read is not implemented for "%s"', $this->getFullKey()));
- }
-
- public function writeNotImplemented($object)
- {
- throw new SCIMException(sprintf('Write is not implemented for "%s"', $this->getFullKey()));
- }
-
- public function writeAfterIgnore($value, &$object)
- {
- }
-
- public function replaceNotImplemented($value, &$object)
- {
- throw new SCIMException(sprintf('Replace is not implemented for "%s"', $this->getFullKey()));
- }
-
- public function defaultRemove($value, &$object)
- {
- }
-
- public function __construct()
- {
- }
-
- public function setSortAttribute($attribute)
- {
- $this->sortAttribute = $attribute;
-
- return $this;
- }
-
- public function getSortAttribute()
- {
- if (!$this->readEnabled) {
- throw new SCIMException(sprintf('Can\'t sort on unreadable attribute "%s"', $this->getFullKey()));
- }
-
- return $this->sortAttribute;
- }
-
- public function withFilter($filter)
- {
- return $this->setFilter($filter);
- }
-
- public function add($value, &$object)
- {
- return $this->add ? ($this->add)($value, $object) : $this->writeNotImplemented($object);
- }
-
- public function replace($value, &$object)
- {
- $current = $this->read($object);
-
- //TODO: Really implement replace ...???
- return $this->replace ? ($this->replace)($value, $object) : $this->replaceNotImplemented($value, $object);
- }
-
- public function remove($value, &$object)
- {
-
- //TODO: implement remove for multi valued attributes
- return $this->remove ? ($this->remove)($value, $object) : $this->defaultRemove($value, $object);
- }
-
- public function writeAfter($value, &$object)
- {
- return $this->writeAfter ? ($this->writeAfter)($value, $object) : $this->writeAfterIgnore($value, $object);
- }
-
- public function read(&$object)
- {
- return $this->read ? ($this->read)($object) : $this->readNotImplemented($object);
- }
-
- public static function eloquentAttributeToString($value)
- {
- if ($value instanceof \Carbon\Carbon) {
- $value = $value->format('c');
- }
-
- return $value;
- }
-
- public function isReadSupported()
- {
- return $this->readEnabled;
- }
-
- public function isWriteSupported()
- {
- return $this->writeEnabled;
- }
-
- public static function ensureAttributeMappingObject($attributeMapping, $parent = null) : AttributeMapping
- {
- $result = null;
-
- if ($attributeMapping == null) {
- $result = self::noMapping($parent);
- } elseif (is_array($attributeMapping) && !empty($attributeMapping) && isset($attributeMapping[0])) {
- $result = self::arrayOfObjects($attributeMapping, $parent);
- } elseif (is_array($attributeMapping)) {
- $result = self::object($attributeMapping, $parent);
- } elseif ($attributeMapping instanceof AttributeMapping) {
- $result = $attributeMapping->setParent($parent);
- } else {
- throw (new SCIMException(sprintf('Found unknown attribute "%s" in "%s"', $attributeMapping, 'unknown')))
- ->setCode(500);
- }
-
- return $result;
- }
-
- /**
- * Returns the AttributeMapping for a specific value. Uses for example for creating queries ... and sorting
- *
- * @param unknown $value
- * @return \ArieTimmerman\Laravel\SCIMServer\Attribute\AttributeMapping
- */
- public function getSubNode($key, $schema = null)
- {
- if ($this->getSubNode != null) {
- return ($this->getSubNode)($key, $schema);
- }
-
- if ($key == null) {
- return $this;
- }
-
- if ($this->mappingAssocArray != null && array_key_exists($key, $this->mappingAssocArray)) {
- return self::ensureAttributeMappingObject($this->mappingAssocArray[$key])->setParent($this)->setKey($key)->setSchema($schema);
- } else {
- throw new SCIMException(sprintf('No mapping for "%s" in "%s"', $key, $this->getFullKey()));
- }
- }
-
- public function setGetSubNode($closure)
- {
- $this->getSubNode = $closure;
-
- return $this;
- }
-
- public function setRelationship($relationship)
- {
- $this->relationship = $relationship;
-
- return $this;
- }
-
- public function getNode($attributePath)
- {
- if (empty($attributePath)) {
- return $this;
- }
-
- //The first schema should be the default one
- $schema = $attributePath->schema ?? $this->getDefaultSchema()[0];
-
- if (!empty($schema) && !empty($this->getSchema()) && $this->getSchema() != $schema) {
- throw (new SCIMException(sprintf('Trying to get attribute for schema "%s". But schema is already "%s"', $attributePath->schema, $this->getSchema())))->setCode(500)->setScimType('noTarget');
- }
-
- $elements = [];
-
- // The attribute mapping MUST include the schema. Therefore, add the schema to the first element.
- if (empty($attributePath->attributeNames) && !empty($schema)) {
- $elements[] = $schema;
- } elseif (empty($this->getSchema()) && !in_array($attributePath->attributeNames[0], Schema::ATTRIBUTES_CORE)) {
- $elements[] = $schema ?? (is_array($this->getDefaultSchema()) ? $this->getDefaultSchema()[0] : $this->getDefaultSchema());
- }
-
- foreach ($attributePath->attributeNames as $a) {
- $elements[] = $a;
- }
-
- /**
- * @var AttributeMapping
- */
- $node = $this;
-
- foreach ($elements as $element) {
- try {
- $node = $node->getSubNode($element, $schema);
- } catch (\Exception $e) {
- throw $e;
- }
- }
-
- return $node;
- }
-
- public function getSubNodeWithPath($path)
- {
- if ($path == null) {
- return $this;
- } else {
- $getAttributePath = function () {
- return $this->attributePath;
- };
-
- $getValuePath = function () {
- return $this->valuePath;
- };
-
- $getFilter = function () {
- return $this->filter;
- };
-
- $first = @$getAttributePath->call((object)$getValuePath->call($path));
- $filter = @$getFilter->call((object)$getValuePath->call($path));
- $last = $getAttributePath->call((object)$path);
-
- return $this->getNode($first)->withFilter($filter)->getNode($last);
- }
- }
-
- public function applyWhereConditionDirect($attribute, &$query, $operator, $value)
- {
- switch ($operator) {
- case "eq":
- $query->where($attribute, $value);
- break;
- case "ne":
- $query->where($attribute, '<>', $value);
- break;
- case "co":
- $query->where($attribute, 'like', '%' . addcslashes($value, '%_') . '%');
- break;
- case "sw":
- $query->where($attribute, 'like', addcslashes($value, '%_') . '%');
- break;
- case "ew":
- $query->where($attribute, 'like', '%' . addcslashes($value, '%_'));
- break;
- case "pr":
- $query->whereNotNull($attribute);
- break;
- case "gt":
- $query->where($attribute, '>', $value);
- break;
- case "ge":
- $query->where($attribute, '>=', $value);
- break;
- case "lt":
- $query->where($attribute, '<', $value);
- break;
- case "le":
- $query->where($attribute, '<=', $value);
- break;
- default:
- die("Not supported!!");
- break;
- }
- }
-
- public function applyWhereCondition(&$query, $operator, $value)
- {
-
- //only filter on OWN eloquent attributes
- if (empty($this->eloquentAttributes)) {
- throw new SCIMException("Can't filter on . " . $this->getFullKey());
- }
-
- $attribute = $this->eloquentAttributes[0];
-
- if ($this->relationship != null) {
- $query->whereHas(
- $this->relationship,
- function ($query) use ($attribute, $operator, $value) {
- $this->applyWhereConditionDirect($attribute, $query, $operator, $value);
- }
- )->get();
- } else {
- $this->applyWhereConditionDirect($attribute, $query, $operator, $value);
- }
- }
-}
diff --git a/src/Attribute/AttributeValue.php b/src/Attribute/AttributeValue.php
new file mode 100644
index 00000000..0c08fdad
--- /dev/null
+++ b/src/Attribute/AttributeValue.php
@@ -0,0 +1,13 @@
+collection = $collection;
+ parent::__construct($name);
- return $this;
+ $this->attribute = $attribute ?? $name;
}
- public function add($value, &$object)
+ public function read(&$object, array $attributes = []): ?AttributeValue
{
-
- //only for creation requests
- if ($object->id == null) {
- foreach ($value as $key => $v) {
- $this->getSubNode($key)->add($v, $object);
- }
- } else {
- foreach ($value as $key => $v) {
- // var_dump($value);
- // echo $this->getFullKey() . " - " . $key . "\n";
-
- if ($this->getSubNode($key) != null) {
- $this->getSubNode($key)->add($v, $object);
- } else {
- //TODO: log ignore
- }
- }
-
- // throw (new SCIMException('Add is not implemented for updates of ' . $this->getFullKey()))->setCode(501);
- }
- }
-
- public function remove($value, &$object)
- {
- // throw (new SCIMException('Remove is not implemented for ' . $this->getFullKey()))->setCode(501);
-
- foreach ($this->collection as $c) {
- foreach ($c as $k => $v) {
- $mapping = AttributeMapping::ensureAttributeMappingObject($v);
-
- if ($mapping->isWriteSupported()) {
- $mapping->remove($value, $object);
- }
- }
+ if (!empty($attributes) && !in_array($this->name, $attributes) && !in_array($this->getFullKey(), $attributes)) {
+ return null;
}
- }
-
- public function replace($value, &$object)
- {
- $this->remove($value, $object);
- $this->add($value, $object);
+ $result = $this->doRead($object, $attributes);
- // var_dump(json_encode($object));exit;
- // throw (new SCIMException('Replace is not implemented for ' . $this->getFullKey()))->setCode(501);
+ return new AttributeValue($result);
}
- public function getEloquentAttributes()
+ protected function doRead(&$object, $attributes = [])
{
- $result = $this->eloquentAttributes;
-
- foreach ($this->collection as $value) {
- $result = array_merge($result, AttributeMapping::ensureAttributeMappingObject($value)->getEloquentAttributes());
- }
-
- return $result;
- }
-
- public function getSubNode($key, $schema = null)
- {
- if ($key == null) {
- return $this;
- }
-
- if (!empty($this->collection) && is_array($this->collection[0]) && array_key_exists($key, $this->collection[0])) {
- $parent = $this;
-
- return (new CollectionValue())->setEloquentAttributes($this->collection[0][$key]->getEloquentAttributes())->setKey($key)->setParent($this)->setAdd(
- function ($value, &$object) use ($key, $parent) {
- $collection = Collection::filterCollection($parent->filter, collect($parent->collection), $object);
-
- $result = [];
-
- foreach ($collection as $o) {
- $o[$key]->add($value, $object);
- }
- }
- )->setRead(
- function (&$object) use ($key, $parent) {
- $collection = Collection::filterCollection($parent->filter, collect($parent->collection), $object);
+ $result = [];
- $result = [];
+ if ($object->{$this->attribute} !== null) {
+ foreach ($object->{$this->attribute} as $o) {
+ $element = [];
- foreach ($collection as $o) {
- $result = AttributeMapping::ensureAttributeMappingObject($o);
+ foreach ($this->subAttributes as $attribute) {
+ if (($r = $attribute->read($o)) != null) {
+ $element[$attribute->name] = $r->value;
}
-
- return $result;
}
- )->setSchema($schema);
- }
- }
-
- public static function filterCollection($scimFilter, $collection, $resourceObject)
- {
- if ($scimFilter == null) {
- return $collection;
- }
-
- $attribute = $scimFilter->attributePath->attributeNames[0];
- $operator = $scimFilter->operator;
- $compareValue = $scimFilter->compareValue;
-
- $result = [];
-
- foreach ($collection->toArray() as $value) {
- $result[] = AttributeMapping::ensureAttributeMappingObject($value)->read($resourceObject);
- }
-
- $collectionOriginal = $collection;
-
- $collection = collect($result);
-
- switch ($operator) {
- case "eq":
- /**
- * @var $collection Coll
- */
- $result = $collection->where($attribute, '==', $compareValue);
- break;
- case "ne":
- $result = $collection->where($attribute, '<>', $compareValue);
- break;
- case "co":
- throw (new SCIMException(sprintf('"co" is not supported for attribute "%s"', $this->getFullKey())))->setCode(501);
- break;
- case "sw":
- throw (new SCIMException(sprintf('"sw" is not supported for attribute "%s"', $this->getFullKey())))->setCode(501);
- break;
- case "ew":
- throw (new SCIMException(sprintf('"ew" is not supported for attribute "%s"', $this->getFullKey())))->setCode(501);
- break;
- case "pr":
- $result = $collection->where($attribute, '!=', null);
- break;
- case "gt":
- $result = $collection->where($attribute, '>', $compareValue);
- break;
- case "ge":
- $result = $collection->where($attribute, '>=', $compareValue);
- break;
- case "lt":
- $result = $collection->where($attribute, '<', $compareValue);
- break;
- case "le":
- $result = $collection->where($attribute, '<=', $compareValue);
- break;
- default:
- die("Not supported!!");
- break;
- }
-
- foreach ($collectionOriginal->keys()->all() as $key) {
- if (!in_array($key, (array)$result->keys()->all())) {
- unset($collectionOriginal[$key]);
+ $result[] = $element;
}
}
- return $collectionOriginal;
+ return $result;
}
- /**
- * Get an operator checker callback.
- *
- * @param string $key
- * @param string $operator
- * @param mixed $value
- * @return \Closure
- */
- protected function operatorForWhere($key, $operator, $value = null)
+ public function applyComparison(Builder &$query, Path $path, Path $parentAttribute = null)
{
- if (func_num_args() == 2) {
- $value = $operator;
-
- $operator = '=';
+ if ($path == null || empty($path->getAttributePathAttributes())) {
+ throw new SCIMException('No attribute path attributes found. Could not apply comparison in ' . $this->getFullKey());
}
- return function ($item) use ($key, $operator, $value) {
- $retrieved = data_get($item, $key);
-
- $strings = array_filter(
- [$retrieved, $value],
- function ($value) {
- return is_string($value) || (is_object($value) && method_exists($value, '__toString'));
- }
- );
-
- if (count($strings) < 2 && count(array_filter([$retrieved, $value], 'is_object')) == 1) {
- return in_array($operator, ['!=', '<>', '!==']);
- }
+ $attribute = $this->getSubNode($path->getAttributePathAttributes()[0]);
- switch ($operator) {
- default:
- case '=':
- case '==':
- return $retrieved == $value;
- case '!=':
- case '<>':
- return $retrieved != $value;
- case '<':
- return $retrieved < $value;
- case '>':
- return $retrieved > $value;
- case '<=':
- return $retrieved <= $value;
- case '>=':
- return $retrieved >= $value;
- case '===':
- return $retrieved === $value;
- case '!==':
- return $retrieved !== $value;
- }
- };
+ $query->whereHas(
+ $this->attribute,
+ fn (Builder $query) => $attribute->applyComparison($query, $path->shiftAttributePathAttributes(), $this->attribute)
+ )->get();
}
- public function applyWhereCondition(&$query, $operator, $value)
+ public function replace($value, Model &$object, Path $path = null)
{
- throw (new SCIMException(sprintf('Filter is not supported for attribute "%s"', $this->getFullKey())))->setCode(501);
+ // ignore replace actions
}
}
diff --git a/src/Attribute/CollectionValue.php b/src/Attribute/CollectionValue.php
deleted file mode 100644
index 698e78e3..00000000
--- a/src/Attribute/CollectionValue.php
+++ /dev/null
@@ -1,7 +0,0 @@
-getSchemaNodes())->map(fn($element) => $element->name)->values()->toArray();
+ }
+
+
+ public function read(&$object, array $attributes = []): ?AttributeValue
+ {
+ if (!($this instanceof Schema) && $this->parent != null && !empty($attributes) && !in_array($this->name, $attributes) && !in_array($this->getFullKey(), $attributes)) {
+ return null;
+ }
+
+ $result = $this->doRead($object, $attributes);
+ return !empty($result) ? new AttributeValue($result) : null;
+ }
+
+ protected function doRead(&$object, $attributes = [])
+ {
+ $result = [];
+ foreach ($this->subAttributes as $attribute) {
+ if (($r = $attribute->read($object, $attributes)) != null) {
+ if (config('scim.omit_null_values') && $r->value === null) {
+ continue;
+ }
+ $result[$attribute->name] = $r->value;
+ }
+ }
+ return $result;
+ }
+
+ public function patch($operation, $value, Model &$object, Path $path = null, $removeIfNotSet = false)
+ {
+ $this->dirty = true;
+
+ if ($this->mutability == 'readOnly') {
+ // silently ignore
+ return;
+ }
+
+ if ($path != null && $path->isNotEmpty()) {
+ $attributeNames = $path->getValuePathAttributes();
+
+ if (!empty($attributeNames)) {
+ // TODO: search for schema node
+ $attribute = $this->getSubNode($attributeNames[0]);
+ if ($attribute != null) {
+ $attribute->patch($operation, $value, $object, $path->shiftValuePathAttributes());
+ } elseif ($this->parent == null) {
+ // pass the unchanged path object to the schema node
+ $this->getSchemaNode()->patch($operation, $value, $object, $path);
+ } else {
+ throw new SCIMException('Unknown path: ' . (string)$path . ", in object: " . $this->getFullKey());
+ }
+ } elseif ($path->getValuePathFilter() != null) {
+ // apply filtering here, for each match, call replace with updated path
+ throw new \Exception('Filtering not implemented for this complex attribute');
+ } elseif ($path->getAttributePath() != null) {
+ $attributeNames = $path?->getAttributePath()?->getAttributeNames() ?? [];
+
+ if (!empty($attributeNames)) {
+ $schema = $path->getAttributePath()?->path?->schema;
+ // Resolve attribute either directly or via schema parent when specified
+ $attribute = $schema
+ ? ((($parent = $this->getSubNode($schema)) instanceof Schema) ? $parent->getSubNode($attributeNames[0]) : null)
+ : $this->getSubNode($attributeNames[0]);
+
+ if ($attribute != null) {
+ $attribute->patch($operation, $value, $object, $path->shiftAttributePathAttributes());
+ return; // done
+ }
+
+ if ($this->parent == null) {
+ // root node: delegate unchanged path to default schema node
+ $this->getSchemaNode()->patch($operation, $value, $object, $path);
+ return; // done
+ }
+
+ throw new SCIMException('Unknown path: ' . (string)$path . ", in object: " . $this->getFullKey());
+ }
+ }
+ } else {
+ // if there is no path, keys of value are attribute names
+ switch ($operation) {
+ case 'replace':
+ $this->replace($value, $object, $path, false);
+ break;
+ case 'add':
+ $this->add($value, $object, $path);
+ break;
+ case 'remove':
+ $this->remove($value, $object, $path);
+ break;
+ default:
+ throw new SCIMException('Unknown operation: ' . $operation);
+ }
+ }
+ }
+
+ /*
+ * @param $value
+ * @param Model $object
+ */
+ public function replace($value, Model &$object, Path $path = null, $removeIfNotSet = false)
+ {
+ $this->dirty = true;
+
+ if ($this->mutability == 'readOnly') {
+ // silently ignore
+ return;
+ }
+
+ // if there is no path, keys of value are attribute paths
+ foreach ($value as $key => $v) {
+ if (is_numeric($key)) {
+ throw new SCIMException('Invalid key: ' . $key . ' for complex object ' . $this->getFullKey());
+ }
+
+ $subNode = null;
+
+ // if path contains : it is a schema node
+ if (strpos($key, ':') !== false) {
+ $subNode = $this->getSubNode($key);
+ } else {
+ $path = Parser::parse($key);
+
+ if ($path->isNotEmpty()) {
+ $attributeNames = $path->getAttributePathAttributes();
+ $path = $path->shiftAttributePathAttributes();
+ $sub = $attributeNames[0] ?? $path->getAttributePath()?->path?->schema;
+ $subNode = $this->getSubNode($attributeNames[0] ?? $path->getAttributePath()?->path?->schema);
+ }
+ }
+
+ if ($subNode != null) {
+ $newValue = $v;
+ if ($path->isNotEmpty()) {
+ $newValue = [
+ implode('.', $path->getAttributePathAttributes()) => $v
+ ];
+ }
+
+ $subNode->replace($newValue, $object, $path);
+ }
+ }
+
+ // if this is the root, we may also check the schema nodes
+ if ($subNode == null && $this->parent == null) {
+ foreach ($this->subAttributes as $attribute) {
+ if ($attribute instanceof Schema) {
+ $attribute->replace($value, $object, $path);
+ }
+ }
+ }
+
+ if ($removeIfNotSet) {
+ foreach ($this->subAttributes as $attribute) {
+ if (!$attribute->isDirty()) {
+ $attribute->remove(null, $object);
+ }
+ }
+ }
+ }
+
+ public function add($value, Model &$object)
+ {
+ $match = false;
+ $this->dirty = true;
+
+ if ($this->mutability == 'readOnly') {
+ // silently ignore
+ return;
+ }
+
+ // keys of value are attribute names
+ foreach ($value as $key => $v) {
+ if (is_numeric($key)) {
+ throw new SCIMException('Invalid key: ' . $key . ' for complex object ' . $this->getFullKey());
+ }
+
+ $path = Parser::parse($key);
+
+ if ($path->isNotEmpty()) {
+ $attributeNames = $path->getAttributePathAttributes();
+ $path = $path->shiftAttributePathAttributes();
+ $subNode = $this->getSubNode($attributeNames[0]);
+ $match = true;
+
+ $newValue = $v;
+ if ($path->isNotEmpty()) {
+ $newValue = [
+ implode('.', $path->getAttributePathAttributes()) => $v
+ ];
+ }
+
+ $subNode->add($newValue, $object);
+ }
+ }
+
+ // if this is the root, we may also check the schema nodes
+ if (!$match && $this->parent == null) {
+ foreach ($this->subAttributes as $attribute) {
+ if ($attribute instanceof Schema) {
+ $attribute->add($value, $object);
+ }
+ }
+ }
+ }
+
+
+ public function remove($value, Model &$object, Path $path = null)
+ {
+ if ($this->mutability == 'readOnly') {
+ // silently ignore
+ return;
+ }
+ // TODO: implement
+ }
+
+ public function getSortAttributeByPath(Path $path)
+ {
+ if ($path->getValuePath() != null) {
+ throw new SCIMException('Incorrect sortBy parameter');
+ }
+
+ $attributeNames = $path->getAttributePathAttributes();
+
+ if (empty($attributeNames)) {
+ throw new SCIMException('Incorrect sortBy parameter. No attributes.');
+ }
+
+ $result = null;
+
+ // TODO: search for schema node
+ $attribute = $this->getSubNode($attributeNames[0]);
+ if ($attribute != null) {
+ $result = $attribute->getSortAttributeByPath($path->shiftAttributePathAttributes());
+ } elseif ($this->parent == null) {
+ // pass the unchanged path object to the schema node
+ $result = $this->getSchemaNode()->getSortAttributeByPath($path);
+ } else {
+ throw new SCIMException('Unknown path: ' . (string)$path . ", in object: " . $this->getFullKey());
+ }
+
+ return $result;
+ }
+
+ public function applyComparison(Builder &$query, Path $path, $parentAttribute = null)
+ {
+ if ($path != null && $path->isNotEmpty()) {
+ $attributeNames = $path->getValuePathAttributes();
+
+ if (!empty($attributeNames)) {
+ // TODO: search for schema node
+ $attribute = $this->getSubNode($attributeNames[0]);
+ if ($attribute != null) {
+ // ($operation, $value, $object, $path->shiftValuePathAttributes());
+ $attribute->applyComparison($query, $path->shiftValuePathAttributes());
+ } elseif ($this->parent == null) {
+ // pass the unchanged path object to the schema node
+ $this->getSchemaNode()->applyComparison($query, $path);
+ } else {
+ throw new SCIMException('Unknown path: ' . (string)$path . ", in object: " . $this->getFullKey());
+ }
+ } elseif ($path->getValuePathFilter() != null) {
+ // apply filtering here, for each match, call replace with updated path
+ throw new \Exception('Filtering not implemented for this complex attribute');
+ } elseif ($path->getAttributePath() != null) {
+ $attributeNames = $path?->getAttributePath()?->getAttributeNames() ?? [];
+
+ if (!empty($attributeNames)) {
+ $attribute = $this->getSubNode($attributeNames[0]);
+ if ($attribute != null) {
+ $attribute->applyComparison($query, $path->shiftAttributePathAttributes());
+ } elseif ($this->parent == null) {
+ // this is the root node, check within the first (the default) schema node
+ // pass the unchanged path object
+ $this->getSchemaNode()->applyComparison($query, $path);
+ } else {
+ throw new SCIMException('Unknown path: ' . (string)$path . ", in object: " . $this->getFullKey());
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Return the default (core) schema. Assume it is the first one.
+ * TODO: This method is only relevant for the top-level complex attribute.
+ * @return string
+ */
+ public function getDefaultSchema()
+ {
+ return collect($this->subAttributes)->first(fn($element) => $element instanceof Schema)->name;
+ }
+}
diff --git a/src/Attribute/Constant.php b/src/Attribute/Constant.php
new file mode 100644
index 00000000..6ab312c0
--- /dev/null
+++ b/src/Attribute/Constant.php
@@ -0,0 +1,45 @@
+value = $value;
+ }
+
+ protected function doRead(&$object, $attributes = [])
+ {
+ return $this->value;
+ }
+
+ public function add($value, &$object)
+ {
+ return $this->replace($value, $object);
+ }
+
+ public function replace($value, &$object, $path = null)
+ {
+ $current = json_encode($this->read($object)?->value);
+
+ if (json_encode($value) != $current) {
+ throw (new SCIMException(sprintf('Write to "%s" is not supported, tried to change "%s" to "%s"', $this->getFullKey(), $current, json_encode($value))))->setCode(403)->setScimType('mutability');
+ }
+
+ $this->dirty = true;
+ }
+
+ public function patch($operation, $value, Model &$object, ?Path $path = null)
+ {
+ throw new SCIMException('Patch operation not supported for constant attributes');
+ }
+}
diff --git a/src/Attribute/Eloquent.php b/src/Attribute/Eloquent.php
new file mode 100644
index 00000000..c3d82127
--- /dev/null
+++ b/src/Attribute/Eloquent.php
@@ -0,0 +1,125 @@
+attribute = $attribute ?? $name;
+ $this->setSortAttribute($this->attribute);
+ }
+
+ protected function doRead(&$object, $attributes = [])
+ {
+ $value = $object->{$this->attribute};
+
+ if ($value instanceof \Carbon\Carbon) {
+ $value = $value->format('c');
+ }
+ return $value;
+ }
+
+ public function add($value, Model &$object)
+ {
+ $object->{$this->attribute} = $value;
+ $this->dirty = true;
+ }
+
+ public function replace($value, Model &$object, $path = null)
+ {
+ $object->{$this->attribute} = $value;
+ $this->dirty = true;
+ }
+
+ public function patch($operation, $value, Model &$object, ?Path $path = null)
+ {
+ if ($path->isNotEmpty()) {
+ throw new SCIMException('path operation not support for eloquent type attributes');
+ }
+
+ if ($operation == 'replace' || $operation == 'add') {
+ $object->{$this->attribute} = $value;
+ $this->dirty = true;
+ } elseif ($operation == 'remove') {
+ $object->{$this->attribute} = null;
+ $this->dirty = true;
+ }
+ }
+
+ public function getSortAttributeByPath(Path $path)
+ {
+ if ($path->getValuePath() != null) {
+ throw new SCIMException('Incorrect sortBy parameter');
+ }
+
+ return $this->attribute;
+ }
+
+ public function applyComparison(Builder &$query, Path $path, $parentAttribute = null)
+ {
+ $attribute = $this->attribute;
+
+ // FIXME: ugly and perhaps incorrect.
+ if($parentAttribute != null){
+ $attribute = $parentAttribute . '.' . $attribute;
+ }
+
+ $operator = $path->node->operator;
+ $value = $path->node->compareValue;
+
+ switch ($operator) {
+ case "eq":
+ $query->where($attribute, $value);
+ break;
+ case "ne":
+ $query->where($attribute, '<>', $value);
+ break;
+ case "co":
+ $query->where($attribute, 'like', '%' . addcslashes($value, '%_') . '%');
+ break;
+ case "sw":
+ $query->where($attribute, 'like', addcslashes($value, '%_') . '%');
+ break;
+ case "ew":
+ $query->where($attribute, 'like', '%' . addcslashes($value, '%_'));
+ break;
+ case "pr":
+ $query->whereNotNull($attribute);
+ break;
+ case "gt":
+ $query->where($attribute, '>', $value);
+ break;
+ case "ge":
+ $query->where($attribute, '>=', $value);
+ break;
+ case "lt":
+ $query->where($attribute, '<', $value);
+ break;
+ case "le":
+ $query->where($attribute, '<=', $value);
+ break;
+ default:
+ throw new SCIMException("Unknown operator " . $operator);
+ }
+ }
+
+
+ public function setRelationship($relationship)
+ {
+ $this->relationship = $relationship;
+
+ return $this;
+ }
+}
diff --git a/src/Attribute/EloquentAttributeMapping.php b/src/Attribute/EloquentAttributeMapping.php
deleted file mode 100644
index fc72f8d8..00000000
--- a/src/Attribute/EloquentAttributeMapping.php
+++ /dev/null
@@ -1,11 +0,0 @@
-read ? ($this->read)($object) : self::eloquentAttributeToString($object->{$this->eloquentReadAttribute});
- }
-}
diff --git a/src/Attribute/JSONCollection.php b/src/Attribute/JSONCollection.php
new file mode 100644
index 00000000..d17f43e0
--- /dev/null
+++ b/src/Attribute/JSONCollection.php
@@ -0,0 +1,155 @@
+{$this->attribute})->contains(
+ fn ($item) => collect($item)->diffAssoc($v)->isEmpty()
+ )) {
+ throw new SCIMException('Value already exists', 400);
+ }
+ }
+ $object->{$this->attribute} = collect($object->{$this->attribute})->merge($value);
+ }
+
+ public function replace($value, Model &$object, ?Path $path = null)
+ {
+ $object->{$this->attribute} = $value;
+ }
+
+ public function doRead(&$object, $attributes = [])
+ {
+ return $object->{$this->attribute}?->values()->all();
+ }
+
+ public function remove($value, Model &$object, Path $path = null)
+ {
+ if ($path?->getValuePathFilter()?->getComparisonExpression() != null) {
+ $attributes = $path?->getValuePathFilter()?->getComparisonExpression()?->attributePath?->attributeNames;
+ $operator = $path?->getValuePathFilter()?->getComparisonExpression()?->operator;
+ $compareValue = $path?->getValuePathFilter()?->getComparisonExpression()?->compareValue;
+
+ if ($value != null) {
+ throw new SCIMException('Non-null value is currently not supported for remove operation with filter');
+ }
+
+ if (count($attributes) != 1) {
+ throw new SCIMException('Only one attribute is currently supported for remove operation with filter');
+ }
+
+ $object->{$this->attribute} = collect($object->{$this->attribute})->filter(function ($item) use ($attributes, $operator, $compareValue) {
+ // check operator eq and ne
+ if ($operator == 'eq') {
+ return !(isset($item[$attributes[0]]) && $item[$attributes[0]] == $compareValue);
+ } elseif ($operator == 'ne') {
+ return !(!isset($item[$attributes[0]]) || $item[$attributes[0]] != $compareValue);
+ } else {
+ throw new SCIMException('Unsupported operator for remove operation with filter');
+ }
+ })->values()->all();
+ } else {
+ foreach ($value as $v) {
+ $object->{$this->attribute} = collect($object->{$this->attribute})->filter(function ($item) use ($v) {
+ return !collect($item)->diffAssoc($v)->isEmpty();
+ })->values()->all();
+ }
+ }
+ }
+
+ public function applyComparison(Builder &$query, Path $path, Path $parentAttribute = null)
+ {
+ $fieldName = 'value';
+
+ if ($path != null && !empty($path->getAttributePathAttributes())) {
+ $fieldName = $path->getAttributePathAttributes()[0];
+ }
+
+ $operator = $path->node->operator;
+ $value = $path->node->compareValue;
+
+ $exists = false;
+
+ foreach ($this->subAttributes as $subAttribute) {
+ if ($subAttribute->name == $fieldName) {
+ $exists = true;
+ break;
+ }
+ }
+
+ if (!$exists) {
+ throw new SCIMException('No attribute found with name ' . $path->getAttributePathAttributes()[0]);
+ }
+
+ // check if engine is postgres
+ if (DB::getConfig("driver") == 'pgsql') {
+ $baseQuery = sprintf("EXISTS (
+ SELECT 1
+ FROM json_array_elements(%s) elem
+ WHERE elem ->> '%s' LIKE ?
+ )", $this->attribute, $fieldName);
+ } elseif (DB::getConfig("driver") == 'sqlite') {
+ $baseQuery = sprintf("EXISTS (
+ SELECT 1
+ FROM json_each(%s) AS elem
+ WHERE json_extract(elem.value, '$.%s') LIKE ?
+ )", $this->attribute, $fieldName);
+ } else {
+ throw new SCIMException('Unsupported database engine');
+ }
+
+ switch ($operator) {
+ case "eq":
+ $query->whereRaw($baseQuery, [addcslashes($value, '%_')]);
+ break;
+ case "ne":
+ if (DB::getConfig("driver") == 'pgsql') {
+ $baseQuery = sprintf("EXISTS (
+ SELECT 1
+ FROM json_array_elements(%s) elem
+ WHERE elem ->> '%s' NOT LIKE ?
+ )", $this->attribute, $fieldName);
+ } elseif (DB::getConfig("driver") == 'sqlite') {
+ $baseQuery = sprintf("EXISTS (
+ SELECT 1
+ FROM json_each(%s) AS elem
+ WHERE json_extract(elem.value, '$.%s') NOT LIKE ?
+ )", $this->attribute, $fieldName);
+ } else {
+ throw new SCIMException('Unsupported database engine');
+ }
+ $query->whereRaw($baseQuery, [addcslashes($value, '%_')])->orWhereNull($this->attribute);
+ break;
+ case "co":
+ $query->whereRaw($baseQuery, ['%' . addcslashes($value, '%_') . "%"]);
+ break;
+ case "sw":
+ // $query->where($jsonAttribute, 'like', addcslashes($value, '%_') . '%');
+ $query->whereRaw($baseQuery, [addcslashes($value, '%_') . "%"]);
+ break;
+ case "ew":
+ $query->whereRaw($baseQuery, ['%' . addcslashes($value, '%_')]);
+ break;
+ case "pr":
+ $query->whereNotNull($this->attribute);
+ break;
+ case "gt":
+ case "ge":
+ case "lt":
+ case "le":
+ throw new SCIMException("This operator is not supported for this field: " . $operator);
+ break;
+ default:
+ throw new SCIMException("Unknown operator " . $operator);
+ }
+ }
+}
diff --git a/src/Attribute/Meta.php b/src/Attribute/Meta.php
new file mode 100644
index 00000000..97caed89
--- /dev/null
+++ b/src/Attribute/Meta.php
@@ -0,0 +1,54 @@
+setMutability('readOnly')->withSubAttributes(
+ new Eloquent('created', 'created_at'),
+ new Eloquent('lastModified', 'updated_at'),
+ (new class ('location', $resourceType) extends Eloquent {
+
+ function __construct($name, public $resourceType)
+ {
+ parent::__construct($name);
+ }
+
+ protected function doRead(&$object, $attributes = [])
+ {
+ return route(
+ 'scim.resource',
+ [
+ 'resourceType' => $this->resourceType,
+ 'resourceObject' => $object->id ?? "not-saved"
+ ]
+ );
+ }
+ }),
+ // get substring of $resourceType, everything till the last character
+ new Constant('resourceType', substr($resourceType, 0, -1)),
+ new class ('version', null) extends Constant {
+ protected function doRead(&$object, $attributes = [])
+ {
+ return Helper::getResourceObjectVersion($object);
+ }
+ }
+ );
+ }
+
+ public function remove($value, Model &$object, Path $path = null)
+ {
+ // ignore
+ }
+
+ public function add($value, Model &$object)
+ {
+ // ignore
+ }
+}
\ No newline at end of file
diff --git a/src/Attribute/MutableCollection.php b/src/Attribute/MutableCollection.php
new file mode 100644
index 00000000..69733370
--- /dev/null
+++ b/src/Attribute/MutableCollection.php
@@ -0,0 +1,113 @@
+pluck('value')->all();
+
+ // Check if objects exist
+ $existingObjects = $object
+ ->{$this->attribute}()
+ ->getRelated()
+ ->findMany($values)
+ ->map(fn ($o) => $o->getKey());
+
+ if (($diff = collect($values)->diff($existingObjects))->count() > 0) {
+ throw new SCIMException(
+ sprintf('One or more %s are unknown: %s', $this->attribute, implode(',', $diff->all())),
+ 500
+ );
+ }
+
+ $object->{$this->attribute}()->syncWithoutDetaching($existingObjects->all());
+
+ $object->load($this->attribute);
+ }
+
+ public function remove($value, Model &$object, ?Path $path = null)
+ {
+ if ($path?->getValuePathFilter()?->getComparisonExpression() != null) {
+ $attributes = $path?->getValuePathFilter()?->getComparisonExpression()?->attributePath?->attributeNames;
+ $operator = $path?->getValuePathFilter()?->getComparisonExpression()?->operator;
+ $compareValue = $path?->getValuePathFilter()?->getComparisonExpression()?->compareValue;
+
+ if ($value != null) {
+ throw new SCIMException('Remove operation with filter requires a null value parameter', 400);
+ }
+
+ if (count($attributes) != 1) {
+ throw new SCIMException(sprintf('Filter must specify exactly one attribute, found %d attributes', count($attributes)), 400);
+ }
+
+ if ($operator != 'eq') {
+ throw new SCIMException(sprintf('Unsupported filter operator "%s" - only "eq" is supported', $operator), 400);
+ }
+
+ if ($attributes[0] != 'value') {
+ throw new SCIMException(sprintf('Cannot filter on "%s" - only filtering on "value" attribute is supported', $attributes[0]), 400);
+ }
+
+ if ($value != null) {
+ throw new SCIMException('Cannot specify both a filter path and a value parameter simultaneously', 400);
+ }
+
+ $object->{$this->attribute}()->detach([$compareValue]);
+ } else {
+ $values = collect($value)->pluck('value')->all();
+
+ $object->{$this->attribute}()->detach($values);
+ }
+
+ $object->load($this->attribute);
+ }
+
+ public function replace($value, Model &$object, ?Path $path = null)
+ {
+ $values = collect($value)->pluck('value')->all();
+
+ // Check if objects exist
+ $existingObjects = $object
+ ->{$this->attribute}()
+ ->getRelated()
+ ::findMany($values);
+ $existingObjectIds = $existingObjects
+ ->map(fn ($o) => $o->getKey());
+
+ if (($diff = collect($values)->diff($existingObjectIds))->count() > 0) {
+ throw new SCIMException(
+ sprintf('One or more %s are unknown: %s', $this->attribute, implode(',', $diff->all())),
+ 500
+ );
+ }
+
+ // Act like the relation is already saved. This allows running validations, if needed.
+ $object->setRelation($this->attribute, $existingObjects);
+
+ $object->saved(function (Model $model) use ($object, $existingObjectIds) {
+ // Save relationships only after the model is saved. Essential if the model is new.
+ // Intentionlly `$object` is used instead of `$model`, to avoid accidentially updating the wrong model.
+ $object->{$this->attribute}()->sync($existingObjectIds->all());
+ });
+
+ }
+
+ public function patch($operation, $value, Model &$object, ?Path $path = null)
+ {
+ if ($operation == 'add') {
+ $this->add($value, $object);
+ } elseif ($operation == 'remove') {
+ $this->remove($value, $object, $path);
+ } elseif ($operation == 'replace') {
+ $this->replace($value, $object, $path);
+ } else {
+ throw new SCIMException('Operation not supported: ' . $operation);
+ }
+ }
+}
diff --git a/src/Attribute/Schema.php b/src/Attribute/Schema.php
new file mode 100644
index 00000000..ee3bd7b2
--- /dev/null
+++ b/src/Attribute/Schema.php
@@ -0,0 +1,45 @@
+required = $required;
+ }
+
+ public function generateSchema()
+ {
+ $result = [
+ "schemas" => [
+ "urn:ietf:params:scim:schemas:core:2.0:Schema"
+ ],
+ "id" => $this->name,
+ "meta" => [
+ "resourceType" => "Schema",
+ "created" => "2001-01-01T00:00:00+00:00",
+ "lastModified" => "2001-01-01T00:00:00+00:00",
+ "version" => sprintf('W/"%s"', sha1(filemtime(__FILE__))),
+ "location" => route('scim.schemas', ['id' => $this->name])
+ ],
+ // name is substring after last occurence of :
+ "name" => substr($this->name, strrpos($this->name, ':') + 1),
+ "attributes" => collect($this->subAttributes)->map(fn ($element) => $element->generateSchema())->toArray()
+ ];
+
+ if($this->description !== null){
+ $result['description'] = $this->description;
+ }
+
+ return $result;
+ }
+
+ public function getName(){
+ return $this->name;
+ }
+
+}
diff --git a/src/Events/AbstractEvent.php b/src/Events/AbstractEvent.php
index 472065da..9766da3a 100644
--- a/src/Events/AbstractEvent.php
+++ b/src/Events/AbstractEvent.php
@@ -2,11 +2,14 @@
namespace ArieTimmerman\Laravel\SCIMServer\Events;
+use ArieTimmerman\Laravel\SCIMServer\ResourceType;
use Illuminate\Queue\SerializesModels;
use Illuminate\Database\Eloquent\Model;
abstract class AbstractEvent implements EventInterface
{
+ use SerializesModels;
+
public $model;
/**
@@ -14,6 +17,12 @@ abstract class AbstractEvent implements EventInterface
*/
public $me;
+ public $resourceType;
+
+ public $oldObjectArray;
+
+ public $input;
+
public function getModel()
{
return $this->model;
@@ -23,4 +32,18 @@ public function isMe()
{
return $this->me;
}
+
+ public function getResourceType(): ResourceType
+ {
+ return $this->resourceType;
+ }
+
+ public function __construct(Model $model, ResourceType $resourceType, bool $me = null, $input, $odlObjectArray = [])
+ {
+ $this->model = $model;
+ $this->resourceType = $resourceType;
+ $this->me = $me;
+ $this->input = $input;
+ $this->oldObjectArray = $odlObjectArray;
+ }
}
diff --git a/src/Events/Create.php b/src/Events/Create.php
index bca78137..9747031c 100644
--- a/src/Events/Create.php
+++ b/src/Events/Create.php
@@ -2,25 +2,6 @@
namespace ArieTimmerman\Laravel\SCIMServer\Events;
-use Illuminate\Queue\SerializesModels;
-use Illuminate\Database\Eloquent\Model;
-
class Create extends AbstractEvent
{
- use SerializesModels;
-
- public $model;
- public $me;
-
- /**
- * Create a new event instance.
- *
- * @param \App\Order $order
- * @return void
- */
- public function __construct(Model $model, bool $me = null)
- {
- $this->model = $model;
- $this->me = $me;
- }
}
diff --git a/src/Events/Delete.php b/src/Events/Delete.php
index 0af8caa8..4b905f2f 100644
--- a/src/Events/Delete.php
+++ b/src/Events/Delete.php
@@ -7,19 +7,4 @@
class Delete extends AbstractEvent
{
- use SerializesModels;
-
- public $model;
-
- /**
- * Create a new event instance.
- *
- * @param \App\Order $order
- * @return void
- */
- public function __construct(Model $model, bool $me = null)
- {
- $this->model = $model;
- $this->me = $me;
- }
}
diff --git a/src/Events/EventInterface.php b/src/Events/EventInterface.php
index 23bc9dde..d3eed147 100644
--- a/src/Events/EventInterface.php
+++ b/src/Events/EventInterface.php
@@ -2,9 +2,10 @@
namespace ArieTimmerman\Laravel\SCIMServer\Events;
+use ArieTimmerman\Laravel\SCIMServer\ResourceType;
use Illuminate\Database\Eloquent\Model;
interface EventInterface
{
- public function __construct(Model $model, bool $me = null);
+ public function __construct(Model $model, ResourceType $resourceType, bool $me = null, $input, $odlObjectArray = []);
}
diff --git a/src/Events/Get.php b/src/Events/Get.php
index bda525c4..80a3c986 100644
--- a/src/Events/Get.php
+++ b/src/Events/Get.php
@@ -7,19 +7,4 @@
class Get extends AbstractEvent
{
- use SerializesModels;
-
- public $model;
-
- /**
- * Create a new event instance.
- *
- * @param \App\Order $order
- * @return void
- */
- public function __construct(Model $model, bool $me = null)
- {
- $this->model = $model;
- $this->me = $me;
- }
}
diff --git a/src/Events/Patch.php b/src/Events/Patch.php
index 58a72c51..36463d00 100644
--- a/src/Events/Patch.php
+++ b/src/Events/Patch.php
@@ -2,25 +2,10 @@
namespace ArieTimmerman\Laravel\SCIMServer\Events;
+use ArieTimmerman\Laravel\SCIMServer\ResourceType;
use Illuminate\Queue\SerializesModels;
use Illuminate\Database\Eloquent\Model;
class Patch extends AbstractEvent
{
- use SerializesModels;
-
- public $odlObjectArray;
-
- /**
- * Create a new event instance.
- *
- * @param \App\Order $order
- * @return void
- */
- public function __construct(Model $model, bool $me = null, $odlObjectArray = [])
- {
- $this->model = $model;
- $this->me = $me;
- $this->odlObjectArray = $odlObjectArray;
- }
}
diff --git a/src/Events/Replace.php b/src/Events/Replace.php
index 5e4451af..1f83a21a 100644
--- a/src/Events/Replace.php
+++ b/src/Events/Replace.php
@@ -2,25 +2,10 @@
namespace ArieTimmerman\Laravel\SCIMServer\Events;
+use ArieTimmerman\Laravel\SCIMServer\ResourceType;
use Illuminate\Queue\SerializesModels;
use Illuminate\Database\Eloquent\Model;
class Replace extends AbstractEvent
{
- use SerializesModels;
-
- public $odlObjectArray;
-
- /**
- * Create a new event instance.
- *
- * @param \App\Order $order
- * @return void
- */
- public function __construct(Model $model, bool $me = null, $odlObjectArray = [])
- {
- $this->model = $model;
- $this->me = $me;
- $this->odlObjectArray = $odlObjectArray;
- }
}
diff --git a/src/Exceptions/SCIMException.php b/src/Exceptions/SCIMException.php
index 6e788a7b..ef3f60b2 100644
--- a/src/Exceptions/SCIMException.php
+++ b/src/Exceptions/SCIMException.php
@@ -12,9 +12,10 @@ class SCIMException extends Exception
protected $errors = [];
- public function __construct($message)
+ public function __construct($message, $code = 404)
{
- parent::__construct($message);
+ parent::__construct($message, $code);
+ $this->setCode($code);
}
public function setScimType($scimType) : SCIMException
diff --git a/src/Helper.php b/src/Helper.php
index 1303ca92..73f65678 100644
--- a/src/Helper.php
+++ b/src/Helper.php
@@ -2,20 +2,16 @@
namespace ArieTimmerman\Laravel\SCIMServer;
-use ArieTimmerman\Laravel\SCIMServer\Attribute\AttributeMapping;
use Illuminate\Contracts\Support\Arrayable;
use Tmilos\ScimFilterParser\Ast\ComparisonExpression;
use Tmilos\ScimFilterParser\Ast\Negation;
use Tmilos\ScimFilterParser\Ast\Conjunction;
use Tmilos\ScimFilterParser\Ast\Disjunction;
-use Tmilos\ScimFilterParser\Parser;
-use Tmilos\ScimFilterParser\Mode;
-use Tmilos\ScimFilterParser\Ast\Path;
-use Tmilos\ScimFilterParser\Ast\AttributePath;
use ArieTimmerman\Laravel\SCIMServer\Exceptions\SCIMException;
+use ArieTimmerman\Laravel\SCIMServer\Parser\Path as ParserPath;
+use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
-use Illuminate\Support\Facades\DB;
use Tmilos\ScimFilterParser\Ast\Factor;
use Tmilos\ScimFilterParser\Ast\ValuePath;
@@ -30,7 +26,7 @@ public static function getAuthUserClass()
*
* @param unknown $object
*/
- public static function prepareReturn(Arrayable $object, ResourceType $resourceType = null)
+ public static function prepareReturn(Arrayable $object, ResourceType $resourceType = null, array $attributes = [])
{
$result = null;
@@ -39,7 +35,7 @@ public static function prepareReturn(Arrayable $object, ResourceType $resourceTy
$result = [];
foreach ($object as $key => $value) {
- $result[] = self::objectToSCIMArray($value, $resourceType);
+ $result[] = self::objectToSCIMArray($value, $resourceType, $attributes);
}
}
}
@@ -51,64 +47,24 @@ public static function prepareReturn(Arrayable $object, ResourceType $resourceTy
return $result;
}
- // TODO: Auto map eloquent attributes with scim naming to the correct attributes
- public static function objectToSCIMArray($object, ResourceType $resourceType = null)
+ public static function objectToSCIMArray($object, ResourceType $resourceType = null, array $attributes = [])
{
- $userArray = $object->toArray();
-
- // If the getDates-method exists, ensure proper formatting of date attributes
- if (method_exists($object, 'getDates')) {
- $dateAttributes = $object->getDates();
- foreach ($dateAttributes as $dateAttribute) {
- if (isset($userArray[$dateAttribute])) {
- $userArray[$dateAttribute] = $object->getAttribute($dateAttribute)->format('c');
- }
- }
+ if($resourceType == null){
+ return $object instanceof Arrayable ? $object->toArray() : $object;
}
- $result = [];
-
- if ($resourceType != null) {
- $mapping = $resourceType->getMapping();
-
- $uses = $mapping->getEloquentAttributes();
-
- $result = $mapping->read($object);
-
- foreach ($uses as $key) {
- unset($userArray[$key]);
- }
+ $mapping = $resourceType->getMapping();
+ $result = $mapping->read($object, $attributes)->value;
- if (!empty($userArray) && (($resourceType->getConfiguration()['map_unmapped']) ?? false)) {
- $namespace = $resourceType->getConfiguration()['unmapped_namespace'] ?? null;
+ if (config('scim.omit_main_schema_in_return')) {
+ $defaultSchema = collect($mapping->getDefaultSchema())->first();
- $parent = null;
-
- if ($namespace != null) {
- if (!isset($result[$namespace])) {
- $result[$namespace] = [];
- }
- $parent = &$result[$namespace];
- } else {
- $parent = &$result;
- }
-
- foreach ($userArray as $key => $value) {
- $parent[$key] = AttributeMapping::eloquentAttributeToString($value);
- }
- }
-
- if (config('scim.omit_main_schema_in_return')) {
- $defaultSchema = collect($mapping->getDefaultSchema())->first();
-
- $main = $result[$defaultSchema];
- unset($result[$defaultSchema]);
-
- $result = array_merge($result, $main);
- }
+ // Move main schema to the top. It may not be defined, for example when only specific attributes are requested.
+ $main = $result[$defaultSchema] ?? [];
- } else {
- $result = $userArray;
+ unset($result[$defaultSchema]);
+
+ $result = array_merge($result, $main);
}
return $result;
@@ -122,11 +78,11 @@ public static function getResourceObjectVersion($object)
if (method_exists($object, "getSCIMVersion")) {
$version = $object->getSCIMVersion();
} else {
- $version = sha1($object->getKey() . $object->updated_at . $object->created_at);
+ $version = sprintf('W/"%s"', sha1($object->getKey() . $object->updated_at . $object->created_at));
}
// Entity tags uniquely representing the requested resources. They are a string of ASCII characters placed between double quotes
- return sprintf('W/"%s"', $version);
+ return $version;
}
/**
@@ -136,41 +92,28 @@ public static function getResourceObjectVersion($object)
*/
public static function objectToSCIMResponse(Model $object, ResourceType $resourceType = null)
{
- return response(self::objectToSCIMArray($object, $resourceType))->setEtag(self::getResourceObjectVersion($object));
- }
-
- public static function objectToSCIMCreateResponse(Model $object, ResourceType $resourceType = null)
- {
- return self::objectToSCIMResponse($object, $resourceType)->setStatusCode(201);
+ return response(self::objectToSCIMArray($object, $resourceType))->header('ETag', self::getResourceObjectVersion($object));
}
/**
* See https://tools.ietf.org/html/rfc7644#section-3.4.2.2
*
- * @param unknown $query
- * @param unknown $node
* @throws SCIMException
*/
- public static function scimFilterToLaravelQuery(ResourceType $resourceType, &$query, $node)
+ public static function scimFilterToLaravelQuery(ResourceType $resourceType, Builder &$query, ParserPath $path)
{
-
- //var_dump($node);exit;
-
+ $node = $path->node;
if ($node instanceof Negation) {
$filter = $node->getFilter();
throw (new SCIMException('Negation filters not supported'))->setCode(400)->setScimType('invalidFilter');
} elseif ($node instanceof ComparisonExpression) {
- $operator = strtolower($node->operator);
-
- $attributeConfig = $resourceType->getMapping()->getSubNodeWithPath($node);
-
- $attributeConfig->applyWhereCondition($query, $operator, $node->compareValue);
+ $resourceType->getMapping()->applyComparison($query, $path);
} elseif ($node instanceof Conjunction) {
foreach ($node->getFactors() as $factor) {
$query->where(
function ($query) use ($factor, $resourceType) {
- Helper::scimFilterToLaravelQuery($resourceType, $query, $factor);
+ Helper::scimFilterToLaravelQuery($resourceType, $query, new ParserPath($factor, $factor->dump()));
}
);
}
@@ -178,90 +121,15 @@ function ($query) use ($factor, $resourceType) {
foreach ($node->getTerms() as $term) {
$query->orWhere(
function ($query) use ($term, $resourceType) {
- Helper::scimFilterToLaravelQuery($resourceType, $query, $term);
+ Helper::scimFilterToLaravelQuery($resourceType, $query, new ParserPath($term, $term->dump()));
}
);
}
} elseif ($node instanceof ValuePath) {
- // ->filer
- $getAttributePath = function () {
- return $this->attributePath;
- };
-
- $getFilter = function () {
- return $this->filter;
- };
-
- $query->whereExists(
- function ($query) {
- $query->select(DB::raw(1))
- ->from('users AS users2')
- ->whereRaw('users.id = users2.id');
- }
- );
-
-
- //$node->
+ throw new SCIMException('ValuePath not supported');
} elseif ($node instanceof Factor) {
- var_dump($node);
- die("Not ok hier!\n");
- }
- }
-
- /**
- * $scimAttribute could be
- * - urn:ietf:params:scim:schemas:core:2.0:User.userName
- * - userName
- * - urn:ietf:params:scim:schemas:core:2.0:User.userName.name.formatted
- * - urn:ietf:params:scim:schemas:core:2.0:User.emails.value
- * - emails.value
- * - emails.0.value
- * - schemas.0
- *
- * @param unknown $name
- * @param unknown $scimAttribute
- * @return AttributeMapping
- */
- public static function getAttributeConfig(ResourceType $resourceType, $scimAttribute)
- {
- $parser = new Parser(Mode::PATH());
-
- $scimAttribute = preg_replace('/\.[0-9]+$/', '', $scimAttribute);
- $scimAttribute = preg_replace('/\.[0-9]+\./', '.', $scimAttribute);
-
- $path = $parser->parse($scimAttribute);
-
- //TODO: FIX this. If $scimAttribute is a schema-indication, it should be considered as a schema
- if ($scimAttribute == 'urn:ietf:params:scim:schemas:core:2.0:User') {
- $attributePath = new AttributePath();
- $attributePath->schema = 'urn:ietf:params:scim:schemas:core:2.0:User';
-
- $path = Path::fromAttributePath($attributePath);
- }
-
- return $resourceType->getMapping()->getSubNodeWithPath($path);
- }
-
- public static function getAttributeConfigOrFail(ResourceType $resourceType, $scimAttribute)
- {
- $result = self::getAttributeConfig($resourceType, $scimAttribute);
-
- if ($result == null) {
- throw (new SCIMException(sprintf('Unknown attribute "%s"', $scimAttribute)))->setCode(400);
- }
-
- return $result;
- }
-
- public static function getEloquentSortAttribute(ResourceType $resourceType, $scimAttribute)
- {
- $mapping = self::getAttributeConfig($resourceType, $scimAttribute);
-
- if ($mapping == null || $mapping->getSortAttribute() == null) {
- throw (new SCIMException("Invalid sort property"))->setCode(400)->setScimType('invalidFilter');
+ throw new SCIMException('Unknown filter not supported');
}
-
- return $mapping->getSortAttribute();
}
public static function getFlattenKey($parts, $schemas)
diff --git a/src/Http/Controllers/BulkController.php b/src/Http/Controllers/BulkController.php
new file mode 100644
index 00000000..1febf40a
--- /dev/null
+++ b/src/Http/Controllers/BulkController.php
@@ -0,0 +1,119 @@
+getContent(), '8bit');
+
+ if($contentSize > static::MAX_PAYLOAD_SIZE){
+ throw (new SCIMException('Payload too large!'))->setCode(413)->setScimType('tooLarge');
+ }
+
+ $validator = Validator::make($request->input(), [
+ 'schemas' => 'required|array',
+ 'schemas.*' => 'required|string|in:urn:ietf:params:scim:api:messages:2.0:BulkRequest',
+ // TODO: implement failOnErrors
+ 'failOnErrors' => 'nullable|int',
+ 'Operations' => 'required|array',
+ 'Operations.*.method' => 'required|string|in:POST,PUT,PATCH,DELETE',
+ 'Operations.*.bulkId' => 'nullable|string',
+ 'Operations.*.data' => 'nullable|array',
+ ]);
+
+ if ($validator->fails()) {
+ $e = $validator->errors();
+
+ throw (new SCIMException('Invalid data!'))->setCode(400)->setScimType('invalidSyntax')->setErrors($e);
+ }
+
+ $operations = $request->input('Operations');
+
+ if(count($operations) > static::MAX_OPERATIONS){
+ throw (new SCIMException('Too many operations!'))->setCode(413)->setScimType('tooLarge');
+ }
+
+ $bulkIdMapping = [];
+ $responses = [];
+
+ // Remove everything till the last occurence of Bulk, e.g. /scim/v2/Bulk should become /scim/v2/
+ $prefix = substr($request->path(), 0, strrpos($request->path(), '/Bulk'));
+
+ foreach ($operations as $operation) {
+
+ $method = $operation['method'];
+ $bulkId = $operation['bulkId'] ?? null;
+
+ // Call internal Laravel route based on method, path and data
+ $encoded = json_encode($operation['data'] ?? []);
+ $encoded = str_replace(array_keys($bulkIdMapping), array_values($bulkIdMapping), $encoded);
+ $path = str_replace(array_keys($bulkIdMapping), array_values($bulkIdMapping), $operation['path']);
+
+ // ensure $path starts with /Users or /Groups
+ if (!preg_match('/^\/(Users|Groups)/', $path)) {
+ throw (new SCIMException('Invalid path!'))->setCode(400)->setScimType('invalidPath');
+ }
+
+ $request = Request::create(
+ $prefix . $path,
+ $operation['method'],
+ server: [
+ 'HTTP_Authorization' => $request->header('Authorization'),
+ 'CONTENT_TYPE' => 'application/scim+json',
+ ],
+ content: $encoded
+ );
+
+ // run request and get response
+ /** @var \Illuminate\Http\Response */
+ $response = app()->handle($request);
+ // Get the JSON content of the response
+ $jsonContent = $response->getContent();
+ // Decode the JSON content
+ $responseData = json_decode($jsonContent, false);
+
+ // Store the id attribute
+ $id = $responseData?->id ?? null;
+
+ // Store the id attribute in the bulkIdMapping array
+ if ($bulkId !== null && $id !== null) {
+ $bulkIdMapping['bulkId:' . $bulkId] = $id;
+ }
+
+ $responses[] = array_filter([
+ "location" => $responseData?->meta?->location ?? null,
+ "method" => $method,
+ "bulkId" => $bulkId,
+ "version" => $responseData?->meta?->version ?? null,
+ "status" => $response->getStatusCode(),
+ "response" => $response->getStatusCode() >= 400 ? $responseData : null,
+ ]);
+ }
+
+ // Return a response indicating the successful processing of the SCIM BULK request
+ return response()->json(
+ [
+ 'schemas' => ['urn:ietf:params:scim:api:messages:2.0:BulkResponse'],
+ 'Operations' =>
+ $responses])->setStatusCode(200)
+ ->withHeaders(['Content-Type' => 'application/scim+json']);
+ }
+}
diff --git a/src/Http/Controllers/ResourceController.php b/src/Http/Controllers/ResourceController.php
index 969d015c..515eb6f4 100644
--- a/src/Http/Controllers/ResourceController.php
+++ b/src/Http/Controllers/ResourceController.php
@@ -6,8 +6,6 @@
use Illuminate\Http\Request;
use ArieTimmerman\Laravel\SCIMServer\Helper;
use ArieTimmerman\Laravel\SCIMServer\Exceptions\SCIMException;
-use Tmilos\ScimFilterParser\Parser;
-use Tmilos\ScimFilterParser\Mode;
use ArieTimmerman\Laravel\SCIMServer\ResourceType;
use Illuminate\Database\Eloquent\Model;
use ArieTimmerman\Laravel\SCIMServer\Events\Delete;
@@ -15,9 +13,12 @@
use ArieTimmerman\Laravel\SCIMServer\Events\Create;
use ArieTimmerman\Laravel\SCIMServer\Events\Replace;
use ArieTimmerman\Laravel\SCIMServer\Events\Patch;
-use ArieTimmerman\Laravel\SCIMServer\SCIM\Schema;
+use ArieTimmerman\Laravel\SCIMServer\Parser\Parser as ParserParser;
use ArieTimmerman\Laravel\SCIMServer\PolicyDecisionPoint;
-use Illuminate\Database\QueryException;
+use ArieTimmerman\Laravel\SCIMServer\Tests\Model\User;
+use Illuminate\Contracts\Pagination\CursorPaginator;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Pagination\Cursor;
use Illuminate\Support\Facades\Validator;
class ResourceController extends Controller
@@ -27,112 +28,50 @@ protected static function isAllowed(PolicyDecisionPoint $pdp, Request $request,
return $pdp->isAllowed($request, $operation, $attributes, $resourceType, $resourceObject, $isMe);
}
- protected static function replaceKeys(array $input)
- {
- $return = array();
- foreach ($input as $key => $value) {
- if (strpos($key, '_') > 0) {
- $key = str_replace('___', '.', $key);
- }
-
- if (is_array($value)) {
- $value = self::replaceKeys($value);
- }
-
- $return[$key] = $value;
- }
- return $return;
- }
-
protected static function validateScim(ResourceType $resourceType, $flattened, ?Model $resourceObject)
{
- $objectPreparedForValidation = [];
$validations = $resourceType->getValidations();
- $simpleValidations = [];
-
- /**
- * Dots have a different meaning in SCIM and in Laravel's validation logic
- */
- foreach ($flattened as $key => $value) {
- $objectPreparedForValidation[preg_replace('/([^*])\.([^*])/', '${1}___${2}', $key)] = $value;
- }
foreach ($validations as $key => $value) {
- $simpleValidations[
- preg_replace('/([^*])\.([^*])/', '${1}___${2}', $key)
- ] = !is_string($value) ? $value : ($resourceObject != null ? preg_replace('/,\[OBJECT_ID\]/', ','.$resourceObject->id, $value) : str_replace(',[OBJECT_ID]', '', $value));
+ if (is_string($value)) {
+ $validations[$key] = $resourceObject ? preg_replace('/,\[OBJECT_ID\]/', ',' . $resourceObject->id, $value) : str_replace(',[OBJECT_ID]', '', $value);
+ }
}
- $validator = Validator::make($objectPreparedForValidation, $simpleValidations);
+ $validator = Validator::make($flattened, $validations);
if ($validator->fails()) {
$e = $validator->errors();
- $e = self::replaceKeys($e->toArray());
throw (new SCIMException('Invalid data!'))->setCode(400)->setScimType('invalidSyntax')->setErrors($e);
}
- $validTemp = $validator->validate();
- $valid = [];
-
- $keys = collect($simpleValidations)->keys()->map(
- function ($rule) {
- return explode('.', $rule)[0];
- }
- )->unique()->toArray();
-
- foreach ($keys as $key) {
- if (array_key_exists($key, $validTemp)) {
- $valid[$key] = $validTemp[$key];
- }
- }
-
- $flattened = [];
- foreach ($valid as $key => $value) {
- $flattened[str_replace(['___'], ['.'], $key)] = $value;
- }
-
- return $flattened;
+ return $validator->validate();
}
public static function createFromSCIM($resourceType, $input, PolicyDecisionPoint $pdp = null, Request $request = null, $allowAlways = false, $isMe = false)
{
if (!isset($input['schemas']) || !is_array($input['schemas'])) {
- throw (new SCIMException('Missing a valid schemas-attribute.'))->setCode(500);
+ throw (new SCIMException('Missing a valid schemas-attribute.'))->setCode(400);
}
$flattened = Helper::flatten($input, $input['schemas']);
- $flattened = self::validateScim($resourceType, $flattened, null);
+ $flattened = static::validateScim($resourceType, $flattened, null);
- if (!$allowAlways && !self::isAllowed($pdp, $request, PolicyDecisionPoint::OPERATION_POST, $flattened, $resourceType, null, $isMe)) {
+ if (!$allowAlways && !static::isAllowed($pdp, $request, PolicyDecisionPoint::OPERATION_POST, $flattened, $resourceType, null, $isMe)) {
throw (new SCIMException('This is not allowed'))->setCode(403);
}
- $class = $resourceType->getClass();
+ $resourceObject = $resourceType->getFactory()();
- /**
- * @var Model
-*/
- $resourceObject = new $class();
-
- $allAttributeConfigs = [];
+ $resourceType->getMapping()->replace($input, $resourceObject);
- foreach ($flattened as $scimAttribute => $value) {
- $attributeConfig = Helper::getAttributeConfigOrFail($resourceType, $scimAttribute);
- $attributeConfig->add($value, $resourceObject);
- $allAttributeConfigs[] = $attributeConfig;
- }
+ //validate
+ $newObject = Helper::flatten(Helper::objectToSCIMArray($resourceObject, $resourceType), $resourceType->getSchema());
- try {
- $resourceObject->save();
- } catch (QueryException $exception) {
- throw $exception;
- // throw new SCIMException('Could not save this');
- }
+ $flattened = static::validateScim($resourceType, $newObject, $resourceObject);
- foreach ($allAttributeConfigs as &$attributeConfig) {
- $attributeConfig->writeAfter($flattened[$attributeConfig->getFullKey()], $resourceObject);
- }
+ $resourceObject->save();
return $resourceObject;
}
@@ -144,9 +83,9 @@ public function createObject(Request $request, PolicyDecisionPoint $pdp, Resourc
{
$input = $request->input();
- $resourceObject = self::createFromSCIM($resourceType, $input, $pdp, $request, false, $isMe);
+ $resourceObject = static::createFromSCIM($resourceType, $input, $pdp, $request, false, $isMe);
- event(new Create($resourceObject, $isMe));
+ event(new Create($resourceObject, $resourceType, $isMe, $request->input()));
return $resourceObject;
}
@@ -163,12 +102,12 @@ public function create(Request $request, PolicyDecisionPoint $pdp, ResourceType
{
$resourceObject = $this->createObject($request, $pdp, $resourceType, $isMe);
- return Helper::objectToSCIMCreateResponse($resourceObject, $resourceType);
+ return Helper::objectToSCIMResponse($resourceObject, $resourceType)->setStatusCode(201);
}
public function show(Request $request, PolicyDecisionPoint $pdp, ResourceType $resourceType, Model $resourceObject)
{
- event(new Get($resourceObject));
+ event(new Get($resourceObject, $resourceType, null, $request->input()));
return Helper::objectToSCIMResponse($resourceObject, $resourceType);
}
@@ -177,7 +116,7 @@ public function delete(Request $request, PolicyDecisionPoint $pdp, ResourceType
{
$resourceObject->delete();
- event(new Delete($resourceObject));
+ event(new Delete($resourceObject, $resourceType, null, $request->input()));
return response(null, 204);
}
@@ -185,59 +124,20 @@ public function delete(Request $request, PolicyDecisionPoint $pdp, ResourceType
public function replace(Request $request, PolicyDecisionPoint $pdp, ResourceType $resourceType, Model $resourceObject, $isMe = false)
{
$originalRaw = Helper::objectToSCIMArray($resourceObject, $resourceType);
- $original = Helper::flatten($originalRaw, $resourceType->getSchema());
- //TODO: get flattend from $resourceObject
- $flattened = Helper::flatten($request->input(), $resourceType->getSchema());
- $flattened = $this->validateScim($resourceType, $flattened, $resourceObject);
+ $resourceType->getMapping()->replace($request->input(), $resourceObject, null, true);
- $updated = [];
+ $newObject = Helper::flatten(Helper::objectToSCIMArray($resourceObject, $resourceType), $resourceType->getSchema());
- foreach ($flattened as $key => $value) {
- if (!isset($original[$key]) || json_encode($original[$key]) != json_encode($flattened[$key])) {
- $updated[$key] = $flattened[$key];
- }
- }
+ $flattened = $this->validateScim($resourceType, $newObject, $resourceObject);
- if (!self::isAllowed($pdp, $request, PolicyDecisionPoint::OPERATION_PUT, $updated, $resourceType, null)) {
+ if (!static::isAllowed($pdp, $request, PolicyDecisionPoint::OPERATION_PATCH, $flattened, $resourceType, null)) {
throw new SCIMException('This is not allowed');
}
- //Keep an array of written values
- $uses = [];
-
- //Write all values
- foreach ($flattened as $scimAttribute => $value) {
- $attributeConfig = Helper::getAttributeConfigOrFail($resourceType, $scimAttribute);
-
- if ($attributeConfig->isWriteSupported()) {
- $attributeConfig->replace($value, $resourceObject);
- }
-
- $uses[] = $attributeConfig;
- }
-
- //Find values that have not been written in order to empty these.
- $allAttributeConfigs = $resourceType->getAllAttributeConfigs();
-
- foreach ($uses as $use) {
- foreach ($allAttributeConfigs as $key => $option) {
- if ($use->getFullKey() == $option->getFullKey()) {
- unset($allAttributeConfigs[$key]);
- }
- }
- }
-
- foreach ($allAttributeConfigs as $attributeConfig) {
- // Do not write write-only attribtues (such as passwords)
- if ($attributeConfig->isReadSupported() && $attributeConfig->isWriteSupported()) {
- // $attributeConfig->remove($resourceObject);
- }
- }
-
$resourceObject->save();
- event(new Replace($resourceObject, $isMe, $originalRaw));
+ event(new Replace($resourceObject, $resourceType, $isMe, $request->input(), $originalRaw));
return Helper::objectToSCIMResponse($resourceObject, $resourceType);
}
@@ -260,50 +160,19 @@ public function update(Request $request, PolicyDecisionPoint $pdp, ResourceType
foreach ($input['Operations'] as $operation) {
switch (strtolower($operation['op'])) {
case "add":
- if (isset($operation['path'])) {
- $attributeConfig = Helper::getAttributeConfigOrFail($resourceType, $operation['path']);
- foreach ((array) $operation['value'] as $value) {
- $attributeConfig->add($value, $resourceObject);
- }
- } else {
- foreach ((array) $operation['value'] as $key => $value) {
- $attributeConfig = Helper::getAttributeConfigOrFail($resourceType, $key);
-
- foreach ((array) $value as $v) {
- $attributeConfig->add($v, $resourceObject);
- }
- }
- }
-
+ $resourceType->getMapping()->patch('add', $operation['value'] ?? null, $resourceObject, ParserParser::parse($operation['path'] ?? null));
break;
case "remove":
if (isset($operation['path'])) {
- $attributeConfig = Helper::getAttributeConfigOrFail($resourceType, $operation['path']);
- $attributeConfig->remove($operation['value'] ?? null, $resourceObject);
+ $resourceType->getMapping()->patch('remove', $operation['value'] ?? null, $resourceObject, ParserParser::parse($operation['path'] ?? null));
} else {
throw new SCIMException('You MUST provide a "Path"');
}
-
-
break;
case "replace":
- if (isset($operation['path'])) {
- // Removed this check. A replace with a null/empty value should be valid.
- // if(!isset($operation['value'])){
- // throw new SCIMException('Please provide a "value"',400);
- // }
-
- $attributeConfig = Helper::getAttributeConfigOrFail($resourceType, $operation['path']);
- $attributeConfig->replace($operation['value'], $resourceObject);
- } else {
- foreach ((array) $operation['value'] as $key => $value) {
- $attributeConfig = Helper::getAttributeConfigOrFail($resourceType, $key);
- $attributeConfig->replace($value, $resourceObject);
- }
- }
-
+ $resourceType->getMapping()->patch('replace', $operation['value'], $resourceObject, ParserParser::parse($operation['path'] ?? null));
break;
default:
@@ -313,18 +182,17 @@ public function update(Request $request, PolicyDecisionPoint $pdp, ResourceType
$dirty = $resourceObject->getDirty();
- // TODO: prevent something from getten written before ...
$newObject = Helper::flatten(Helper::objectToSCIMArray($resourceObject, $resourceType), $resourceType->getSchema());
$flattened = $this->validateScim($resourceType, $newObject, $resourceObject);
- if (!self::isAllowed($pdp, $request, PolicyDecisionPoint::OPERATION_PATCH, $flattened, $resourceType, null)) {
+ if (!static::isAllowed($pdp, $request, PolicyDecisionPoint::OPERATION_PATCH, $flattened, $resourceType, null)) {
throw new SCIMException('This is not allowed');
}
$resourceObject->save();
- event(new Patch($resourceObject, $isMe, $oldObject));
+ event(new Patch($resourceObject, $resourceType, $isMe, $request->input(), $oldObject));
return Helper::objectToSCIMResponse($resourceObject, $resourceType);
}
@@ -343,29 +211,29 @@ public function wrongVersion(Request $request)
public function index(Request $request, PolicyDecisionPoint $pdp, ResourceType $resourceType)
{
- $class = $resourceType->getClass();
+ $query = $resourceType->getQuery();
- // The 1-based index of the first query result. A value less than 1 SHALL be interpreted as 1.
- $startIndex = max(1, intVal($request->input('startIndex', 0)));
+ // if both cursor and startIndex are present, throw an exception
+ if ($request->has('cursor') && $request->has('startIndex')) {
+ throw (new SCIMException('Both cursor and startIndex are present. Only one of them is allowed.'))->setCode(400);
+ }
// Non-negative integer. Specifies the desired maximum number of query results per page, e.g., 10. A negative value SHALL be interpreted as "0". A value of "0" indicates that no resource results are to be returned except for "totalResults".
- $count = max(0, intVal($request->input('count', 10)));
+ $count = min(max(0, intVal($request->input('count', config('scim.pagination.defaultPageSize')))), config('scim.pagination.maxPageSize'));
+ $startIndex = null;
$sortBy = null;
if ($request->input('sortBy')) {
- $sortBy = Helper::getEloquentSortAttribute($resourceType, $request->input('sortBy'));
+ $sortBy = $resourceType->getMapping()->getSortAttributeByPath(\ArieTimmerman\Laravel\SCIMServer\Parser\Parser::parse($request->input('sortBy')));
}
- $resourceObjectsBase = $class::when(
+ $resourceObjectsBase = $query->when(
$filter = $request->input('filter'),
- function ($query) use ($filter, $resourceType) {
- $parser = new Parser(Mode::FILTER());
-
+ function (Builder $query) use ($filter, $resourceType) {
try {
- $node = $parser->parse($filter);
- Helper::scimFilterToLaravelQuery($resourceType, $query, $node);
+ Helper::scimFilterToLaravelQuery($resourceType, $query, ParserParser::parseFilter($filter));
} catch (\Tmilos\ScimFilterParser\Error\FilterException $e) {
throw (new SCIMException($e->getMessage()))->setCode(400)->setScimType('invalidFilter');
}
@@ -374,9 +242,11 @@ function ($query) use ($filter, $resourceType) {
$totalResults = $resourceObjectsBase->count();
- $resourceObjects = $resourceObjectsBase->skip($startIndex - 1)->take($count);
-
- $resourceObjects = $resourceObjects->with($resourceType->getWithRelations());
+ /**
+ * @var \Illuminate\Database\Query\Builder $resourceObjects
+ */
+ $resourceObjects = $resourceObjectsBase
+ ->with($resourceType->getWithRelations());
if ($sortBy != null) {
$direction = $request->input('sortOrder') == 'descending' ? 'desc' : 'asc';
@@ -384,12 +254,84 @@ function ($query) use ($filter, $resourceType) {
$resourceObjects = $resourceObjects->orderBy($sortBy, $direction);
}
- $resourceObjects = $resourceObjects->get();
+ $resources = null;
+ if ($request->has('cursor')) {
+ if($sortBy == null){
+ $resourceObjects = $resourceObjects->orderBy('id');
+ }
+
+ if($request->input('cursor')){
+ $cursor = @Cursor::fromEncoded($request->input('cursor'));
+
+ if($cursor == null){
+ throw (new SCIMException('Invalid Cursor'))->setCode(400)->setScimType('invalidCursor');
+ }
+ }
+
+ $countRaw = $request->input('count');
+
+ if($countRaw < 1 || $countRaw > config('scim.pagination.maxPageSize')){
+ throw (new SCIMException(
+ sprintf('Count value is invalid. Count value must be between 1 - and maxPageSize (%s) (when using cursor pagination)', config('scim.pagination.maxPageSize'))
+ ))->setCode(400)->setScimType('invalidCount');
+ }
+
+ $resourceObjects = $resourceObjects->cursorPaginate(
+ $count,
+ cursor: $request->input('cursor')
+ );
+ $resources = collect($resourceObjects->items());
+
+
+ } else {
+ // The 1-based index of the first query result. A value less than 1 SHALL be interpreted as 1.
+ $startIndex = max(1, intVal($request->input('startIndex', 0)));
+
+ $resourceObjects = $resourceObjects->skip($startIndex - 1)->take($count);
+ $resources = $resourceObjects->get();
+ }
+
+ // TODO: splitting the attributes parameters by dot and comma is not correct, but works in most cases
+ // if body contains attributes and this is an array, use that, else use existing
+ if($request->json('attributes') && is_array($request->json('attributes'))){
+ $attributes = $request->json('attributes');
+ } else {
+ $attributes = $request->input('attributes') ? preg_split('/[,.]/', $request->input('attributes')) : [];
+ }
+ if (!empty($attributes)) {
+ $attributes[] = 'id';
+ $attributes[] = 'meta';
+ $attributes[] = 'schemas';
+ }
- $attributes = [];
+ // TODO: implement excludedAttributes
$excludedAttributes = [];
- return new ListResponse($resourceObjects, $startIndex, $totalResults, $attributes, $excludedAttributes, $resourceType);
+ return new ListResponse(
+ $resources,
+ $startIndex,
+ $totalResults,
+ $attributes,
+ $excludedAttributes,
+ $resourceType,
+ ($resourceObjects instanceof CursorPaginator) ? $resourceObjects->nextCursor()?->encode() : null,
+ ($resourceObjects instanceof CursorPaginator) ? $resourceObjects->previousCursor()?->encode() : null
+ );
+ }
+
+ public function search(Request $request, PolicyDecisionPoint $pdp, ResourceType $resourceType){
+
+ $input = $request->json()->all();
+
+ // ensure request post body is a scim SearchRequest
+ if (!is_array($input) || !isset($input['schemas']) || !in_array("urn:ietf:params:scim:api:messages:2.0:SearchRequest", $input['schemas'])) {
+ throw (new SCIMException('Invalid schema. MUST be "urn:ietf:params:scim:api:messages:2.0:SearchRequest"'))->setCode(400);
+ }
+
+ // ensure $request->input reads from payload/post only, not query parameters
+ $request->replace($request->json()->all());
+
+ return $this->index($request, $pdp, $resourceType);
}
}
diff --git a/src/Http/Controllers/ResourceTypesController.php b/src/Http/Controllers/ResourceTypesController.php
index 520fcfad..445d971c 100644
--- a/src/Http/Controllers/ResourceTypesController.php
+++ b/src/Http/Controllers/ResourceTypesController.php
@@ -4,7 +4,6 @@
use ArieTimmerman\Laravel\SCIMServer\SCIM\ListResponse;
use ArieTimmerman\Laravel\SCIMServer\SCIM\ResourceType;
-use ArieTimmerman\Laravel\SCIMServer\SCIM\Schema;
use Illuminate\Http\Request;
use ArieTimmerman\Laravel\SCIMServer\Exceptions\SCIMException;
@@ -21,7 +20,23 @@ public function __construct()
$resourceTypes = [];
foreach ($config as $key => $value) {
- $resourceTypes[] = new ResourceType($value['singular'], $key, $key, $value['description'] ?? null, Schema::SCHEMA_USER, [ ]);
+ $schemas = $value['map']->getSchemaNodes();
+
+ $resourceTypes[] = new ResourceType(
+ $value['singular'],
+ $value['singular'],
+ $key,
+ $value['description'] ?? null,
+ $schemas[0]->getName(),
+ collect(array_slice($schemas, 1))->map(
+ function ($element) {
+ return [
+ 'schema' => $element->getName(),
+ 'required' => $element->required
+ ];
+ }
+ )->toArray()
+ );
}
$this->resourceTypes = collect($resourceTypes);
diff --git a/src/Http/Controllers/SchemaController.php b/src/Http/Controllers/SchemaController.php
index 5fd151b3..e7b937a4 100644
--- a/src/Http/Controllers/SchemaController.php
+++ b/src/Http/Controllers/SchemaController.php
@@ -9,43 +9,29 @@
class SchemaController extends Controller
{
- private $schemas = null;
-
public function getSchemas()
{
- if ($this->schemas != null) {
- return $this->schemas;
- }
-
$config = resolve(SCIMConfig::class)->getConfig();
+ $schemaNodes = [];
$schemas = [];
- foreach ($config as $key => $value) {
- if ($key != 'Users' && $key != 'Group') {
- continue;
- }
-
- // TODO: FIX THIS. Schema is now an array but should be a string
- $schema = (new SchemaBuilderV2())->get($value['schema'][0]);
+ foreach ($config as $value) {
+ $value['map']->generateSchema();
- if ($schema == null) {
- throw new SCIMException("Schema not found");
- }
-
- $schema->getMeta()->setLocation(route('scim.schemas', ['id' => $schema->getId()]));
-
- $schemas[] = $schema->serializeObject();
+ $schemaNodes = array_merge($schemaNodes, $value['map']->getSchemaNodes());
}
- $this->schemas = collect($schemas);
+ foreach ($schemaNodes as $schemaNode) {
+ $schemas[] = $schemaNode->generateSchema();
+ }
- return $this->schemas;
+ return $schemas;
}
public function show($id)
{
- $result = $this->getSchemas()->first(
+ $result = collect($this->getSchemas())->first(
function ($value, $key) use ($id) {
return $value['id'] == $id;
}
@@ -60,6 +46,7 @@ function ($value, $key) use ($id) {
public function index()
{
- return new ListResponse($this->getSchemas(), 1, $this->getSchemas()->count());
+ $schemas = collect($this->getSchemas());
+ return new ListResponse($schemas, 1, $schemas->count());
}
}
diff --git a/src/Http/Controllers/ServiceProviderController.php b/src/Http/Controllers/ServiceProviderController.php
index eb2cea0b..90987216 100644
--- a/src/Http/Controllers/ServiceProviderController.php
+++ b/src/Http/Controllers/ServiceProviderController.php
@@ -14,7 +14,9 @@ public function index()
"supported" => true,
],
"bulk" => [
- "supported" => false,
+ "supported" => true,
+ "maxPayloadSize" => BulkController::MAX_PAYLOAD_SIZE,
+ "maxOperations" => BulkController::MAX_OPERATIONS
],
"filter" => [
"supported" => true,
@@ -48,10 +50,18 @@ public function index()
"type" => "httpbasic",
],
],
+ "pagination" => [
+ "cursor" => true,
+ "index" => true,
+ "defaultPaginationMethod" => "index",
+ "defaultPageSize" => config('scim.pagination.defaultPageSize'),
+ "maxPageSize" => config('scim.pagination.maxPageSize'),
+ "cursorTimeout" => 3600
+ ],
"meta" => [
"location" => route('scim.serviceproviderconfig'),
"resourceType" => "ServiceProviderConfig",
-
+
"created" => Carbon::createFromTimestampUTC(filectime(__FILE__))->format('c'),
"lastModified" => Carbon::createFromTimestampUTC(filemtime(__FILE__))->format('c'),
"version" => sprintf('W/"%s"', sha1(filemtime(__FILE__))),
diff --git a/src/Parser/AttributePath.php b/src/Parser/AttributePath.php
new file mode 100644
index 00000000..8326872d
--- /dev/null
+++ b/src/Parser/AttributePath.php
@@ -0,0 +1,21 @@
+path = $path;
+ }
+
+ public function getAttributeNames(){
+ return $this->path->attributeNames;
+ }
+
+ public function shiftAttributeName(){
+ return array_shift($this->path->attributeNames);
+ }
+}
diff --git a/src/Parser/Filter.php b/src/Parser/Filter.php
new file mode 100644
index 00000000..0826d57a
--- /dev/null
+++ b/src/Parser/Filter.php
@@ -0,0 +1,18 @@
+filter instanceof ComparisonExpression ? $this->filter : null;
+ }
+}
diff --git a/src/Parser/Parser.php b/src/Parser/Parser.php
new file mode 100644
index 00000000..6f517b76
--- /dev/null
+++ b/src/Parser/Parser.php
@@ -0,0 +1,34 @@
+parse($input);
+
+ return new Path(
+ $node,
+ $input
+ );
+ }
+
+ public static function parseFilter($input): ?Path {
+ if($input == null){
+ return null;
+ }
+
+ $node = (new ScimFilterParserParser(Mode::FILTER()))->parse($input);
+
+ return new Path(
+ $node,
+ $input
+ );
+ }
+}
diff --git a/src/Parser/Path.php b/src/Parser/Path.php
new file mode 100644
index 00000000..e2905598
--- /dev/null
+++ b/src/Parser/Path.php
@@ -0,0 +1,99 @@
+node = $node;
+ $this->text = $text;
+
+ // attribute path
+ $getAttributePath = function () {
+ return $this->attributePath;
+ };
+
+ $attributePath = $getAttributePath->call($this->node);
+ $this->attributePath = $attributePath != null ? new AttributePath($attributePath) : null;
+
+ //value path
+ $getValuePath = function () {
+ return $this instanceof Factor ? null : $this->valuePath;
+ };
+
+ $valuePath = $getValuePath->call($this->node);
+ $this->valuePath = $valuePath != null ? new ValuePath($valuePath) : null;
+
+ }
+
+ public function getAttributePath(): ?AttributePath{
+ return $this->attributePath;
+ }
+
+ public function setAttributePath($attributePath){
+ $this->attributePath = $attributePath;
+ }
+
+ public function getValuePath(): ?ValuePath{
+ return $this->valuePath;
+ }
+
+ public function setValuePath($valuePath){
+ $this->valuePath = $valuePath;
+ }
+
+ public function getValuePathAttributes(): array{
+ return $this->getValuePath()?->getAttributePath()?->getAttributeNames() ?? [];
+ }
+
+ public function getAttributePathAttributes(): array{
+ return $this->getAttributePath()?->getAttributeNames() ?? [];
+ }
+
+ public function getValuePathFilter(){
+ return $this->getValuePath()?->getFilter();
+ }
+
+ public function setValuePathFilter($filter){
+ return $this->getValuePath()?->setFilter($filter);
+ }
+
+ public function shiftValuePathAttributes(): Path {
+ $this->getValuePath()->getAttributePath()->shiftAttributeName();
+
+ if(empty($this->getValuePathAttributes())){
+ // The line below isp probably not needed
+ // $this->setValuePath(null);
+ }
+
+ return $this;
+ }
+
+ public function shiftAttributePathAttributes(): Path {
+ $this->getAttributePath()->shiftAttributeName();
+
+ if(empty($this->getAttributePathAttributes())){
+ $this->setAttributePath(null);
+ }
+
+ return $this;
+ }
+
+ public function __toString()
+ {
+ return $this->text;
+ }
+
+ public function isNotEmpty(){
+ return
+ !empty($this->getAttributePathAttributes()) ||
+ !empty($this->getValuePathAttributes()) ||
+ $this->getValuePathFilter() != null;
+ }
+}
\ No newline at end of file
diff --git a/src/Parser/ValuePath.php b/src/Parser/ValuePath.php
new file mode 100644
index 00000000..089722fb
--- /dev/null
+++ b/src/Parser/ValuePath.php
@@ -0,0 +1,45 @@
+path = $path;
+
+ $getAttributePath = function () {
+ return $this->attributePath;
+ };
+
+ $this->attributePath = new AttributePath($getAttributePath->call($this->path));
+
+ $getFilter = function () {
+ return $this->filter;
+ };
+
+ $this->filter = new Filter($getFilter->call($this->path));
+
+ }
+
+ public function getAttributePath(): AttributePath{
+ return $this->attributePath;
+ }
+
+ public function setAttributePath(AttributePath $attributePath){
+ $this->attributePath = $attributePath;
+ }
+
+ public function getFilter(): Filter{
+ return $this->filter;
+ }
+
+ public function setFilter($filter){
+ $this->filter = $filter;
+ }
+}
\ No newline at end of file
diff --git a/src/ResourceType.php b/src/ResourceType.php
index 36e6b5a8..40d71e3e 100644
--- a/src/ResourceType.php
+++ b/src/ResourceType.php
@@ -2,79 +2,72 @@
namespace ArieTimmerman\Laravel\SCIMServer;
-use ArieTimmerman\Laravel\SCIMServer\Attribute\AttributeMapping;
+use ArieTimmerman\Laravel\SCIMServer\Attribute\Complex;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Support\Arr;
class ResourceType
{
protected $configuration = null;
-
+
protected $name = null;
-
+
public function __construct($name, $configuration)
{
$this->configuration = $configuration;
}
-
+
public function getConfiguration()
{
return $this->configuration;
}
-
- public function getMapping()
+
+ public function getMapping(): Complex
{
- return AttributeMapping::object($this->configuration['mapping'] ?? [])->setDefaultSchema($this->configuration['schema']);
+ return $this->configuration['map'];
}
-
+
public function getName()
{
return $this->name;
}
-
+
public function getSchema()
{
- return $this->configuration['schema'];
+ return $this->getMapping()->getSchemas();
}
-
+
public function getClass()
{
return $this->configuration['class'];
}
+ public function getFactory()
+ {
+ return $this->configuration['factory'] ?? function () {
+ $class = $this->getClass();
+
+ return new $class();
+ };
+ }
+
+ public function getQuery(): Builder
+ {
+ return Arr::get($this->configuration, 'query') ?? $this->getClass()::query();
+ }
+
public function getValidations()
{
- return $this->configuration['validations'];
+ return $this->getMapping()->getValidations();
}
public function getWithRelations()
{
return $this->configuration['withRelations'] ?? [];
}
-
+
public static function user()
{
return new ResourceType('Users', resolve(SCIMConfig::class)->getUserConfig());
}
-
- public function getAllAttributeConfigs($mapping = -1)
- {
- $result = [];
-
- if ($mapping == -1) {
- $mapping = $this->getMapping();
- }
-
- foreach ($mapping as $key => $value) {
- if ($value instanceof AttributeMapping && $value != null) {
- $result[] = $value;
- } elseif (is_array($value)) {
- $extra = $this->getAllAttributeConfigs($value);
-
- if (!empty($extra)) {
- $result = array_merge($result, $extra);
- }
- }
- }
-
- return $result;
- }
}
diff --git a/src/RouteProvider.php b/src/RouteProvider.php
index 3543e9b1..a98d1bff 100644
--- a/src/RouteProvider.php
+++ b/src/RouteProvider.php
@@ -1,10 +1,10 @@
group(
+ Route::prefix(static::$prefix)->group(
function () use ($options) {
- Route::prefix('v2')->middleware(
- [
- // TODO: Not loading this middleware introduces resolve issues. But having it, might slow things down.
- \Illuminate\Routing\Middleware\SubstituteBindings::class,
- 'ArieTimmerman\Laravel\SCIMServer\Middleware\SCIMHeaders'
- ]
- )->group(
+ Route::prefix('v2')->middleware([
+ SubstituteBindings::class,
+ SCIMHeaders::class,
+ ])->group(
function () use ($options) {
- self::allRoutes($options);
+ static::allRoutes($options);
}
);
-
- Route::get('v1', '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@wrongVersion');
+
+ Route::get('v1', [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'wrongVersion']);
Route::prefix('v1')->group(
function () {
- Route::fallback('\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@wrongVersion');
+ Route::fallback([\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'wrongVersion']);
}
);
}
@@ -46,40 +43,48 @@ function () {
public static function meRoutes(array $options = [])
{
- Route::get('/scim/v2/Me', '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\MeController@getMe')->name('scim.me.get');
- Route::put('/scim/v2/Me', '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\MeController@replaceMe')->name('scim.me.put');
+ Route::prefix(static::$prefix)->group(function () {
+ Route::get("/v2/Me", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\MeController::class, 'getMe'])->name('scim.me.get');
+ Route::put('/v2/Me', [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\MeController::class, 'replaceMe'])->name('scim.me.put');
+ });
}
public static function meRoutePost(array $options = [])
{
- Route::post('/scim/v2/Me', '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\MeController@createMe')->name('scim.me.post');
+ Route::prefix(static::$prefix)->group(function () {
+ Route::post('/v2/Me', [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\MeController::class, 'createMe'])->name('scim.me.post');
+ });
}
public static function publicRoutes(array $options = [])
{
- Route::get("/scim/v2/ServiceProviderConfig", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ServiceProviderController@index')->name('scim.serviceproviderconfig');
-
- Route::get("/scim/v2/Schemas", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\SchemaController@index');
- Route::get("/scim/v2/Schemas/{id}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\SchemaController@show')->name('scim.schemas');
-
- Route::get("/scim/v2/ResourceTypes", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceTypesController@index');
- Route::get("/scim/v2/ResourceTypes/{id}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceTypesController@show')->name('scim.resourcetype');
+ Route::prefix(static::$prefix)->group(function () {
+ Route::get("/v2/ServiceProviderConfig", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ServiceProviderController::class, 'index'])->name('scim.serviceproviderconfig');
+
+ Route::get("/v2/Schemas", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\SchemaController::class, 'index']);
+ Route::get("/v2/Schemas/{id}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\SchemaController::class, 'show'])->name('scim.schemas');
+
+ Route::get("/v2/ResourceTypes", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceTypesController::class, 'index']);
+ Route::get("/v2/ResourceTypes/{id}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceTypesController::class, 'show'])->name('scim.resourcetype');
+ });
}
private static function allRoutes(array $options = [])
{
- Route::post('.search', '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@notImplemented');
-
+ Route::post('.search', [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'notImplemented']);
+
+ Route::post("/Bulk", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\BulkController::class, 'processBulkRequest']);
+
// TODO: Use the attributes parameters ?attributes=userName, excludedAttributes=asdg,asdg (respect "returned" settings "always")
- Route::get('/{resourceType}/{resourceObject}', '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@show')->name('scim.resource');
- Route::get("/{resourceType}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@index')->name('scim.resources');
-
- Route::post("/{resourceType}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@create');
-
- Route::put("/{resourceType}/{resourceObject}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@replace');
- Route::patch("/{resourceType}/{resourceObject}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@update');
- Route::delete("/{resourceType}/{resourceObject}", '\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@delete');
-
- Route::fallback('\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController@notImplemented');
+ Route::get('/{resourceType}/{resourceObject}', [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'show'])->name('scim.resource');
+ Route::get("/{resourceType}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'index'])->name('scim.resources');
+ Route::post("/{resourceType}/.search", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'search']);
+ Route::post("/{resourceType}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'create']);
+
+ Route::put("/{resourceType}/{resourceObject}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'replace']);
+ Route::patch("/{resourceType}/{resourceObject}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'update']);
+ Route::delete("/{resourceType}/{resourceObject}", [\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'delete']);
+
+ Route::fallback([\ArieTimmerman\Laravel\SCIMServer\Http\Controllers\ResourceController::class, 'notImplemented']);
}
}
diff --git a/src/SCIM/Error.php b/src/SCIM/Error.php
index ee4c7811..4c6edad3 100644
--- a/src/SCIM/Error.php
+++ b/src/SCIM/Error.php
@@ -19,7 +19,7 @@ public function toJson($options = 0)
"schemas" => ['urn:ietf:params:scim:api:messages:2.0:Error'],
"detail" => $this->detail,
"status" => $this->status,
- "scimType" => ($this->status == 400 ? $this->scimType : null),
+ "scimType" => ($this->status == 400 ? $this->scimType : ($this->status == 409 ? 'uniqueness' : null)),
// not defined in SCIM 2.0
'errors' => $this->errors
diff --git a/src/SCIM/ListResponse.php b/src/SCIM/ListResponse.php
index d8c5a0fc..c17035b0 100644
--- a/src/SCIM/ListResponse.php
+++ b/src/SCIM/ListResponse.php
@@ -5,41 +5,46 @@
use Illuminate\Contracts\Support\Jsonable;
use ArieTimmerman\Laravel\SCIMServer\Helper;
use ArieTimmerman\Laravel\SCIMServer\ResourceType;
+use Illuminate\Contracts\Support\Arrayable;
+use Illuminate\Support\Collection;
class ListResponse implements Jsonable
{
- private $resourceObjects = [];
- private $startIndex;
- private $totalResults;
- private $attributes;
- private $excludedAttributes;
- private $resourceType = null;
-
- public function __construct($resourceObjects, $startIndex = 1, $totalResults = 10, $attributes = [], $excludedAttributes = [], ResourceType $resourceType = null)
- {
- $this->resourceType = $resourceType;
- $this->resourceObjects = $resourceObjects;
- $this->startIndex = $startIndex;
- $this->totalResults = $totalResults;
- $this->attribtues = $attributes;
- $this->excludedAttributes = $excludedAttributes;
+ public function __construct(
+ protected Collection $resourceObjects,
+ protected $startIndex = 1,
+ protected $totalResults = 10,
+ protected array $attributes = [],
+ protected $excludedAttributes = [],
+ protected ?ResourceType $resourceType = null,
+ protected $nextCursor = null,
+ protected $previousCursor = null
+ ) {
}
public function toJson($options = 0)
{
return json_encode($this->toSCIMArray(), $options);
}
-
+
public function toSCIMArray()
{
- return [
- 'totalResults' => $this->totalResults,
- "itemsPerPage" => count($this->resourceObjects),
- "startIndex" => $this->startIndex,
- "schemas" => [
- "urn:ietf:params:scim:api:messages:2.0:ListResponse"
- ],
- 'Resources' => Helper::prepareReturn($this->resourceObjects, $this->resourceType),
- ];
+ return array_filter(
+ [
+ 'totalResults' => $this->totalResults,
+ "itemsPerPage" => count($this->resourceObjects->toArray()),
+
+ "startIndex" => $this->startIndex,
+
+ "nextCursor" => $this->nextCursor,
+ "previousCursor" => $this->previousCursor,
+
+ "schemas" => [
+ "urn:ietf:params:scim:api:messages:2.0:ListResponse"
+ ],
+ 'Resources' => Helper::prepareReturn($this->resourceObjects, $this->resourceType, $this->attributes),
+ ],
+ fn ($value) => $value !== null
+ );
}
}
diff --git a/src/SCIM/ResourceType.php b/src/SCIM/ResourceType.php
index 34892e2f..7d310e3e 100644
--- a/src/SCIM/ResourceType.php
+++ b/src/SCIM/ResourceType.php
@@ -2,9 +2,10 @@
namespace ArieTimmerman\Laravel\SCIMServer\SCIM;
+use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Contracts\Support\Jsonable;
-class ResourceType implements Jsonable
+class ResourceType implements Jsonable, Arrayable
{
public $id;
diff --git a/src/SCIMConfig.php b/src/SCIMConfig.php
index 5fe66825..e8931db8 100644
--- a/src/SCIMConfig.php
+++ b/src/SCIMConfig.php
@@ -4,174 +4,212 @@
use ArieTimmerman\Laravel\SCIMServer\SCIM\Schema;
use ArieTimmerman\Laravel\SCIMServer\Helper;
-use ArieTimmerman\Laravel\SCIMServer\Attribute\AttributeMapping;
+use ArieTimmerman\Laravel\SCIMServer\Attribute\Attribute;
+use ArieTimmerman\Laravel\SCIMServer\Attribute\Collection;
+use ArieTimmerman\Laravel\SCIMServer\Attribute\Complex;
+use ArieTimmerman\Laravel\SCIMServer\Attribute\Constant;
+use ArieTimmerman\Laravel\SCIMServer\Attribute\Eloquent;
+use ArieTimmerman\Laravel\SCIMServer\Attribute\JSONCollection;
+use ArieTimmerman\Laravel\SCIMServer\Attribute\Meta;
+use ArieTimmerman\Laravel\SCIMServer\Attribute\MutableCollection;
+use ArieTimmerman\Laravel\SCIMServer\Attribute\Schema as AttributeSchema;
+use ArieTimmerman\Laravel\SCIMServer\Tests\Model\Group;
+use Illuminate\Database\Eloquent\Model;
+
+function a($name = null): Attribute
+{
+ return new Attribute($name);
+}
+
+function complex($name = null): Complex
+{
+ return new Complex($name);
+}
+
+function eloquent($name, $attribute = null): Attribute
+{
+ return new Eloquent($name, $attribute);
+}
+
class SCIMConfig
{
+ public function __construct()
+ {
+ }
+
public function getConfigForResource($name)
{
- if ($name == 'Users') {
- return $this->getUserConfig();
- } else {
- $result = $this->getConfig();
- return @$result[$name];
- }
+ $result = $this->getConfig();
+ return @$result[$name];
+ }
+
+ public function getGroupClass()
+ {
+ return Group::class;
}
public function getUserConfig()
{
return [
-
+
// Set to 'null' to make use of auth.providers.users.model (App\User::class)
'class' => Helper::getAuthUserClass(),
-
- 'validations' => [
-
- 'urn:ietf:params:scim:schemas:core:2.0:User:userName' => 'required',
- 'urn:ietf:params:scim:schemas:core:2.0:User:password' => 'nullable',
- 'urn:ietf:params:scim:schemas:core:2.0:User:active' => 'boolean',
- 'urn:ietf:params:scim:schemas:core:2.0:User:emails' => 'required|array',
- 'urn:ietf:params:scim:schemas:core:2.0:User:emails.*.value' => 'required|email',
- 'urn:ietf:params:scim:schemas:core:2.0:User:roles' => 'nullable|array',
- 'urn:ietf:params:scim:schemas:core:2.0:User:roles.*.value' => 'required',
-
- ],
-
'singular' => 'User',
- 'schema' => [Schema::SCHEMA_USER],
-
+
//eager loading
'withRelations' => [],
- 'map_unmapped' => true,
- 'unmapped_namespace' => 'urn:ietf:params:scim:schemas:laravel:unmapped',
'description' => 'User Account',
-
- // Map a SCIM attribute to an attribute of the object.
- 'mapping' => [
-
- 'id' => AttributeMapping::eloquent("id")->disableWrite(),
-
- 'externalId' => null,
-
- 'meta' => [
- 'created' => AttributeMapping::eloquent("created_at")->disableWrite(),
- 'lastModified' => AttributeMapping::eloquent("updated_at")->disableWrite(),
-
- 'location' => (new AttributeMapping())->setRead(
- function ($object) {
- return route(
- 'scim.resource',
- [
- 'resourceType' => 'Users',
- 'resourceObject' => $object->id
- ]
- );
+
+ 'map' => complex()->withSubAttributes(
+ new class ('schemas', [
+ "urn:ietf:params:scim:schemas:core:2.0:User",
+ ]) extends Constant {
+ public function replace($value, &$object, $path = null)
+ {
+ // do nothing
+ $this->dirty = true;
+ }
+ },
+ (new class ('id', null) extends Constant {
+ protected function doRead(&$object, $attributes = [])
+ {
+ return (string)$object->id;
+ }
+ public function remove($value, &$object, $path = null)
+ {
+ // do nothing
+ }
+ }
+ ),
+ new Meta('Users'),
+ (new AttributeSchema(Schema::SCHEMA_USER, true))->withSubAttributes(
+ eloquent('userName', 'name')->ensure('required'),
+ eloquent('active')->ensure('boolean')->default(false),
+ complex('name')->withSubAttributes(eloquent('formatted')),
+ eloquent('password')->ensure('nullable')->setReturned('never'),
+ (new class ('emails') extends Complex {
+ protected function doRead(&$object, $attributes = [])
+ {
+ return collect([$object->email])->map(function ($email) {
+ return [
+ 'value' => $email,
+ 'type' => 'other',
+ 'primary' => true
+ ];
+ })->toArray();
+ }
+ public function add($value, Model &$object)
+ {
+ $object->email = $value[0]['value'];
+ }
+ public function replace($value, Model &$object, $path = null, $removeIfNotSet = false)
+ {
+ $object->email = $value[0]['value'];
+ }
+ })->withSubAttributes(
+ eloquent('value', 'email')->ensure('required', 'email'),
+ new Constant('type', 'other'),
+ new Constant('primary', true)
+ )->ensure('required', 'array')
+ ->setMultiValued(true),
+ (new Collection('groups'))->withSubAttributes(
+ eloquent('value', 'id'),
+ (new class ('$ref') extends Eloquent {
+ protected function doRead(&$object, $attributes = [])
+ {
+ return route(
+ 'scim.resource',
+ [
+ 'resourceType' => 'Group',
+ 'resourceObject' => $object->id ?? "not-saved"
+ ]
+ );
+ }
+ }),
+ eloquent('display', 'name')
+ ),
+ (new JSONCollection('roles'))->withSubAttributes(
+ eloquent('value')->ensure('required', 'min:3', 'alpha_dash:ascii'),
+ eloquent('display')->ensure('nullable', 'min:3', 'alpha_dash:ascii'),
+ eloquent('type')->ensure('nullable', 'min:3', 'alpha_dash:ascii'),
+ eloquent('primary')->ensure('boolean')->default(false)
+ )->ensure('nullable', 'array', 'max:20')
+ ),
+ (new AttributeSchema('urn:ietf:params:scim:schemas:extension:enterprise:2.0:User', false))->withSubAttributes(
+ eloquent('employeeNumber')->ensure('nullable')
+ )
+ ),
+ ];
+ }
+
+ public function getGroupConfig()
+ {
+ return [
+
+ 'class' => $this->getGroupClass(),
+ 'singular' => 'Group',
+
+ //eager loading
+ 'withRelations' => [],
+ 'description' => 'Group',
+
+ 'map' => complex()->withSubAttributes(
+ new class ('schemas', [
+ "urn:ietf:params:scim:schemas:core:2.0:Group",
+ ]) extends Constant {
+ public function replace($value, &$object, $path = null)
+ {
+ // do nothing
+ $this->dirty = true;
+ }
+ },
+ (new class ('id', null) extends Constant {
+ protected function doRead(&$object, $attributes = [])
+ {
+ return (string)$object->id;
+ }
+ public function remove($value, &$object, $path = null)
+ {
+ // do nothing
+ }
+ }
+ ),
+ new Meta('Groups'),
+ (new AttributeSchema(Schema::SCHEMA_GROUP, true))->withSubAttributes(
+ eloquent('displayName')->ensure('required', 'min:3', function ($attribute, $value, $fail) {
+ // check if group does not exist or if it exists, it is the same group
+ $group = $this->getGroupClass()::where('displayName', $value)->first();
+ if ($group && (request()->route('resourceObject') == null || $group->id != request()->route('resourceObject')->id)) {
+ $fail('The name has already been taken.');
}
- )->disableWrite(),
-
- 'resourceType' => AttributeMapping::constant("User")
- ],
-
- 'schemas' => AttributeMapping::constant(
- [
- 'urn:ietf:params:scim:schemas:core:2.0:User',
- 'example:name:space',
- ]
- )->ignoreWrite(),
-
- 'example:name:space' => [
- 'cityPrefix' => AttributeMapping::eloquent('cityPrefix')
- ],
-
- 'urn:ietf:params:scim:schemas:core:2.0:User' => [
-
- 'userName' => AttributeMapping::eloquent("name"),
-
- 'name' => [
- 'formatted' => AttributeMapping::eloquent("name"),
- 'familyName' => null,
- 'givenName' => null,
- 'middleName' => null,
- 'honorificPrefix' => null,
- 'honorificSuffix' => null
- ],
-
- 'displayName' => null,
- 'nickName' => null,
- 'profileUrl' => null,
- 'title' => null,
- 'userType' => null,
- 'preferredLanguage' => null, // Section 5.3.5 of [RFC7231]
- 'locale' => null, // see RFC5646
- 'timezone' => null, // see RFC6557
- 'active' => null,
-
- 'password' => AttributeMapping::eloquent('password')->disableRead(),
-
- // Multi-Valued Attributes
- 'emails' => [[
- "value" => AttributeMapping::eloquent("email"),
- "display" => null,
- "type" => AttributeMapping::constant("other")->ignoreWrite(),
- "primary" => AttributeMapping::constant(true)->ignoreWrite()
- ],[
- "value" => AttributeMapping::eloquent("email"),
- "display" => null,
- "type" => AttributeMapping::constant("work")->ignoreWrite(),
- "primary" => AttributeMapping::constant(true)->ignoreWrite()
- ]],
-
- 'phoneNumbers' => [[
- "value" => null,
- "display" => null,
- "type" => null,
- "primary" => null
- ]],
-
- 'ims' => [[
- "value" => null,
- "display" => null,
- "type" => null,
- "primary" => null
- ]], // Instant messaging addresses for the User
-
- 'photos' => [[
- "value" => null,
- "display" => null,
- "type" => null,
- "primary" => null
- ]],
-
- 'addresses' => [[
- 'formatted' => null,
- 'streetAddress' => null,
- 'locality' => null,
- 'region' => null,
- 'postalCode' => null,
- 'country' => null
- ]],
-
- 'groups' => [[
- 'value' => null,
- '$ref' => null,
- 'display' => null,
- 'type' => null,
- 'type' => null
- ]],
-
- 'entitlements' => null,
- 'roles' => null,
- 'x509Certificates' => null
- ],
-
- ]
- ];
+ }),
+ (new MutableCollection('members'))->withSubAttributes(
+ eloquent('value', 'id')->ensure('required'),
+ (new class ('$ref') extends Eloquent {
+ protected function doRead(&$object, $attributes = [])
+ {
+ return route(
+ 'scim.resource',
+ [
+ 'resourceType' => 'Users',
+ 'resourceObject' => $object->id ?? "not-saved"
+ ]
+ );
+ }
+ }),
+ eloquent('display', 'name')
+ )->ensure('nullable', 'array')
+ )
+ ),
+ ];
}
public function getConfig()
{
return [
- 'Users' => $this->getUserConfig()
+ 'Users' => $this->getUserConfig(),
+ 'Groups' => $this->getGroupConfig(),
];
}
}
diff --git a/src/ServiceProvider.php b/src/ServiceProvider.php
index 6f43a3e9..88aaceb4 100644
--- a/src/ServiceProvider.php
+++ b/src/ServiceProvider.php
@@ -1,11 +1,11 @@
loadMigrationsFrom(__DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'database' . DIRECTORY_SEPARATOR . 'migrations');
-
+
$this->publishes([
- __DIR__.'/../config/scim.php' => config_path('scim.php'),
+ __DIR__ . '/../config/scim.php' => config_path('scim.php'),
], 'laravel-scim');
// Match everything, except the Me routes
@@ -25,53 +25,53 @@ public function boot(\Illuminate\Routing\Router $router)
'resourceType',
function ($name, $route) {
$config = resolve(SCIMConfig::class)->getConfigForResource($name);
-
+
if ($config == null) {
throw (new SCIMException(sprintf('No resource "%s" found.', $name)))->setCode(404);
}
-
+
return new ResourceType($name, $config);
}
);
-
+
$router->bind(
'resourceObject',
function ($id, $route) {
$resourceType = $route->parameter('resourceType');
-
+
if (!$resourceType) {
throw (new SCIMException('ResourceType not provided'))->setCode(404);
}
-
- $class = $resourceType->getClass();
-
- $resourceObject = $class::with($resourceType->getWithRelations())->find($id);
-
+
+ $query = $resourceType->getQuery();
+
+ $resourceObject = $query->with($resourceType->getWithRelations())->find($id);
+
if ($resourceObject == null) {
throw (new SCIMException(sprintf('Resource "%s" not found', $id)))->setCode(404);
}
-
+
if (($matchIf = \request()->header('IF-Match'))) {
$versionsAllowed = preg_split('/\s*,\s*/', $matchIf);
$currentVersion = Helper::getResourceObjectVersion($resourceObject);
-
+
//if as version is '*' it is always ok
if (!in_array($currentVersion, $versionsAllowed) && !in_array('*', $versionsAllowed)) {
- throw (new SCIMException('Failed to update. Resource changed on the server.'))->setCode(412);
+ throw (new SCIMException('Failed to update. Resource changed on the server.'))->setCode(412);
}
}
-
+
return $resourceObject;
}
);
-
+
$router->middleware('SCIMHeaders', 'ArieTimmerman\Laravel\SCIMServer\Middleware\SCIMHeaders');
if (config('scim.publish_routes')) {
\ArieTimmerman\Laravel\SCIMServer\RouteProvider::routes();
}
}
-
+
/**
* Register the service provider.
*
@@ -80,7 +80,7 @@ function ($id, $route) {
public function register()
{
$this->mergeConfigFrom(
- __DIR__.'/../config/scim.php',
+ __DIR__ . '/../config/scim.php',
'scim'
);
}
diff --git a/tests/BasicTest.php b/tests/BasicTest.php
index 28c50719..4ae64575 100644
--- a/tests/BasicTest.php
+++ b/tests/BasicTest.php
@@ -2,73 +2,324 @@
namespace ArieTimmerman\Laravel\SCIMServer\Tests;
-use ArieTimmerman\Laravel\SCIMServer\ServiceProvider;
-use Orchestra\Testbench\TestCase;
-use Illuminate\Foundation\Testing\RefreshDatabase;
+use ArieTimmerman\Laravel\SCIMServer\ResourceType;
+use ArieTimmerman\Laravel\SCIMServer\SCIMConfig;
+use ArieTimmerman\Laravel\SCIMServer\Tests\Model\Group;
+use Illuminate\Support\Arr;
class BasicTest extends TestCase
{
- protected $baseUrl = 'http://localhost';
-
- use RefreshDatabase;
-
- protected function setUp(): void
- {
- parent::setUp();
-
- $this->loadLaravelMigrations('testbench');
-
- $this->withFactories(realpath(dirname(__DIR__).'/database/factories'));
-
- \ArieTimmerman\Laravel\SCIMServer\RouteProvider::routes();
-
- factory(\ArieTimmerman\Laravel\SCIMServer\Tests\Model\User::class, 100)->create();
- }
-
- protected function getEnvironmentSetUp($app)
- {
- $app ['config']->set('app.url', 'http://localhost');
- $app ['config']->set('app.debug', true);
-
- $app->register(ServiceProvider::class);
-
- // Setup default database to use sqlite :memory:
- $app['config']->set('scimserver.Users.class', \ArieTimmerman\Laravel\SCIMServer\Tests\Model\User::class);
- $app['config']->set('auth.providers.users.model', \ArieTimmerman\Laravel\SCIMServer\Tests\Model\User::class);
- $app['config']->set('database.default', 'testbench');
- $app['config']->set('database.connections.testbench', [
- 'driver' => 'sqlite',
- 'database' => ':memory:',
- 'prefix' => '',
- ]);
- }
-
public function testGet()
{
$response = $this->get('/scim/v2/Users');
-
+
+ $response->assertStatus(200);
+ $response->assertJsonCount(10, 'Resources');
+ $response->assertJson([
+ 'totalResults' => 100,
+ 'itemsPerPage' => 10,
+ 'startIndex' => 1
+ ]);
+
+ $response->assertJsonStructure([
+ 'Resources' => [
+ '*' => [
+ 'id',
+ 'schemas',
+ 'meta',
+ 'urn:ietf:params:scim:schemas:core:2.0:User' => [
+ 'userName',
+ 'name',
+ 'emails',
+ 'groups' => [
+ '*' => [
+ 'value',
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]);
+ }
+
+ public function testGetAttributes()
+ {
+ $response = $this->get('/scim/v2/Users?attributes=userName,name.formatted,groups');
+
+ $response->assertStatus(200);
+ $response->assertJsonCount(10, 'Resources');
+ $response->assertJsonStructure([
+ 'Resources' => [
+ '*' => [
+ 'urn:ietf:params:scim:schemas:core:2.0:User' => [
+ 'userName',
+ ]
+ ]
+ ]
+ ]);
+
+ foreach ($response->json('Resources') as $resource) {
+ $this->assertArrayNotHasKey('emails', $resource['urn:ietf:params:scim:schemas:core:2.0:User']);
+ }
+ }
+
+ public function testGetAttributesSearch()
+ {
+ $response = $this->postJson(
+ '/scim/v2/Users/.search',
+ [
+ 'schemas' => ['urn:ietf:params:scim:api:messages:2.0:SearchRequest'],
+ 'attributes' => [
+ 'userName',
+ 'name.formatted',
+ 'groups'
+ ]
+ ]
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonCount(10, 'Resources');
+ $response->assertJsonStructure([
+ 'Resources' => [
+ '*' => [
+ 'urn:ietf:params:scim:schemas:core:2.0:User' => [
+ 'userName',
+ ]
+ ]
+ ]
+ ]);
+
+ foreach ($response->json('Resources') as $resource) {
+ $this->assertArrayNotHasKey('emails', $resource['urn:ietf:params:scim:schemas:core:2.0:User']);
+ }
+ }
+
+ public function testGetGroupsAttribute()
+ {
+ config(['scim.omit_main_schema_in_return' => true]);
+ $response = $this->get('/scim/v2/Users?attributes=groups');
+
+ $response->assertStatus(200);
+ $response->assertJsonCount(10, 'Resources');
+ $response->assertJsonStructure([
+ 'Resources' => [
+ '*' => [
+
+ ]
+ ]
+ ]);
+ }
+
+ public function testCursorPagination()
+ {
+ $response1 = $this->get('/scim/v2/Users?count=60&cursor');
+
+ $response1->assertStatus(200);
+ $response1->assertJsonCount(60, 'Resources');
+ $response1->assertJson([
+ 'totalResults' => 100,
+ 'itemsPerPage' => 60
+ ]);
+
+ $response2 = $this->get('/scim/v2/Users?count=60&cursor=' . $response1->json('nextCursor'));
+ $response2->assertStatus(200);
+ $response2->assertJsonCount(40, 'Resources');
+ $response2->assertJson([
+ 'totalResults' => 100,
+ 'itemsPerPage' => 40
+ ]);
+
+ // assert the list of items in response 1 and 2 are different, compare the id of the user items
+ $this->assertNotEquals(
+ collect($response1->json('Resources'))->pluck('id')->toArray(),
+ collect($response2->json('Resources'))->pluck('id')->toArray()
+ );
+
+ // assert the nextCursor is missing in response2
+ $this->assertNull($response2->json('nextCursor'));
+ $this->assertNotNull($response2->json('previousCursor'));
+ $this->assertNull($response2->json('startIndex'));
+ }
+
+ public function testCursorPaginationFailure()
+ {
+ $response1 = $this->get('/scim/v2/Users?count=60&cursor=invalid');
+
+ $response1->assertStatus(400);
+ $response1->assertJson([
+ 'schemas' => ['urn:ietf:params:scim:api:messages:2.0:Error'],
+ 'status' => '400',
+ 'scimType' => 'invalidCursor'
+ ]);
+
+ }
+
+ public function testCursorPaginationFailureMaxCount()
+ {
+ $response1 = $this->get('/scim/v2/Users?count=200&cursor');
+
+ $response1->assertStatus(400);
+ $response1->assertJson([
+ 'schemas' => ['urn:ietf:params:scim:api:messages:2.0:Error'],
+ 'status' => '400',
+ 'scimType' => 'invalidCount'
+ ]);
+
+ }
+
+ public function testPagination()
+ {
+ $response = $this->get('/scim/v2/Users?startIndex=21&count=20');
+
+ $response->assertStatus(200);
+ $response->assertJsonCount(20, 'Resources');
+ $response->assertJson([
+ 'totalResults' => 100,
+ 'itemsPerPage' => 20,
+ 'startIndex' => 21
+ ]);
+
+ $this->assertNull($response->json('nextCursor'));
+ $this->assertNull($response->json('previousCursor'));
+ }
+
+ public function testSort()
+ {
+ $response = $this->get('/scim/v2/Users?sortBy=name.formatted');
+
+ $response->assertStatus(200);
+
+ $formattedNames = collect($response->json('Resources') ?? [])
+ ->map(function ($resource) {
+ return $resource['urn:ietf:params:scim:schemas:core:2.0:User']['name']['formatted'] ?? null;
+ })
+ ->filter() // Remove null values
+ ->values() // Re-index the array
+ ->toArray();
+
+ $this->assertEquals(Arr::sort($formattedNames), $formattedNames);
+ }
+
+ public function testFilter()
+ {
+ // First get a username to search for
+ $response = $this->get('/scim/v2/Users?startIndex=30&count=1');
+ $userName = $response->json('Resources')[0]['urn:ietf:params:scim:schemas:core:2.0:User']['userName'];
+
+ // Now search for this username
+ $response = $this->get('/scim/v2/Users?filter=userName eq "'.$userName.'"');
$response->assertStatus(200);
+
+ $this->assertEquals(1, count($response->json('Resources')));
+ }
+
+ public function testFilterByGroup()
+ {
+ // Find a group
+ $response = $this->get('/scim/v2/Groups?startIndex=30&count=1');
+ $groupValue = $response->json('Resources')[0]['id'];
+
+ // Now search for this username
+ $response = $this->get('/scim/v2/Users?startIndex=30&count=1');
+ $userValue = $response->json('Resources')[0]['id'];
+
+ // SCIM Patch request
+ $response = $this->patch('/scim/v2/Groups/' . $groupValue, [
+ "schemas" => [
+ "urn:ietf:params:scim:api:messages:2.0:PatchOp",
+ ],
+ "Operations" => [[
+ "op" => "add",
+ "path" => "members",
+ "value" => [
+ [
+ "value" => $userValue
+ ]
+ ]
+ ]]
+ ]);
+
+ $response->assertStatus(200);
+
+ $this->assertTrue(Group::find($groupValue)->members->pluck('id')->contains($userValue), 'User was not added to the group');
+
+ // SCIM Patch remove member request
+ $response = $this->patch('/scim/v2/Groups/' . $groupValue, [
+ "schemas" => [
+ "urn:ietf:params:scim:api:messages:2.0:PatchOp",
+ ],
+ "Operations" => [[
+ "op" => "remove",
+ "path" => sprintf("members[value eq \"%s\"]", $userValue),
+ ]]
+ ]);
+
+ $response->assertStatus(200);
+
+ $this->assertFalse(Group::find($groupValue)->members->pluck('id')->contains($userValue), 'User was not removed from the group');
+ }
+
+ public function testSearch()
+ {
+ // First get a username to search for
+ $response = $this->postJson('/scim/v2/Users/.search', [
+ 'schemas' => ['urn:ietf:params:scim:api:messages:2.0:SearchRequest'],
+ "startIndex" => 30,
+ "count" => 1
+ ]);
+
+ $userName = $response->json('Resources')[0]['urn:ietf:params:scim:schemas:core:2.0:User']['userName'];
+
+ // Now search for this username
+ $response = $this->get('/scim/v2/Users?filter=userName eq "'.$userName.'"');
+ $response->assertStatus(200);
+
+ $this->assertEquals(1, count($response->json('Resources')));
+ }
+
+ public function testGroupAssignment()
+ {
+ // First get a username to search for
+ $response = $this->get('/scim/v2/Users?startIndex=20&count=1');
+ $groupValue = $response->json('Resources')[0]['urn:ietf:params:scim:schemas:core:2.0:User']['groups'][0]['value'];
+
+ // find user id
+
+ // (3) assign user to group via group endpoitn
+
+ $this->assertTrue(count($response->json('Resources')) >= 1);
}
public function testPut()
{
$response = $this->put('/scim/v2/Users/1', [
- "id"=> 1,
+ "id" => "1",
+ "meta" => [
+ "resourceType" => "User",
+ "created" => "2010-01-23T04:56:22Z",
+ "lastModified" => "2011-05-13T04:42:34Z",
+ "version" => "W\/\"3694e05e9dff594\""
+ ],
"schemas" => [
"urn:ietf:params:scim:schemas:core:2.0:User",
],
"urn:ietf:params:scim:schemas:core:2.0:User" => [
- "userName"=> "Dr. John Doe",
- "emails"=> [
+ "userName" => "Dr. John Doe",
+ "emails" => [
[
- "value"=> "johndoe@bailey.org",
- "type"=> "other",
- "primary"=> true
+ "value" => "johndoe@bailey.org",
+ "type" => "other",
+ "primary" => true
+ ]
+ ],
+ "groups" => [
+ [
+ "value" => "1"
]
]
]
]);
-
+
$response->assertStatus(200);
$json = $response->json();
@@ -86,18 +337,17 @@ public function testPatch()
],
"Operations" => [[
"op" => "replace",
+ "path" => "emails",
"value" => [
- "emails" => [
[
"value" => "something@example.com",
"type" => "work",
"primary" => true
]
- ]
]
]]
]);
-
+
$response->assertStatus(200);
$json = $response->json();
@@ -106,6 +356,79 @@ public function testPatch()
$this->assertEquals('something@example.com', $json['urn:ietf:params:scim:schemas:core:2.0:User']['emails'][0]['value']);
}
+ public function testPatchMultiple()
+ {
+ $response = $this->patch('/scim/v2/Users/2', [
+ "schemas" => [
+ "urn:ietf:params:scim:api:messages:2.0:PatchOp",
+ ],
+ "Operations" => [[
+ "op" => "add",
+ "value" => [
+ "userName" => "johndoe9858",
+ "name.formatted" => "John",
+ "active" => false
+ ]
+ ]]
+ ]);
+
+ $response->assertStatus(200);
+
+ $json = $response->json();
+
+ $this->assertArrayHasKey('urn:ietf:params:scim:schemas:core:2.0:User', $json);
+ $this->assertEquals('johndoe9858', $json['urn:ietf:params:scim:schemas:core:2.0:User']['userName']);
+ $this->assertEquals('John', $json['urn:ietf:params:scim:schemas:core:2.0:User']['name']['formatted']);
+ $this->assertFalse($json['urn:ietf:params:scim:schemas:core:2.0:User']['active']);
+ }
+
+ public function testPatchMultipleReplace()
+ {
+ $response = $this->patch('/scim/v2/Users/2', [
+ "schemas" => [
+ "urn:ietf:params:scim:api:messages:2.0:PatchOp",
+ ],
+ "Operations" => [[
+ "op" => "replace",
+ "value" => [
+ "userName" => "johndoe9858",
+ "name.formatted" => "John",
+ "active" => true
+ ]
+ ]]
+ ]);
+
+ $response->assertStatus(200);
+
+ $json = $response->json();
+
+ $this->assertArrayHasKey('urn:ietf:params:scim:schemas:core:2.0:User', $json);
+ $this->assertEquals('johndoe9858', $json['urn:ietf:params:scim:schemas:core:2.0:User']['userName']);
+ $this->assertEquals('John', $json['urn:ietf:params:scim:schemas:core:2.0:User']['name']['formatted']);
+ $this->assertTrue($json['urn:ietf:params:scim:schemas:core:2.0:User']['active']);
+ }
+
+ public function testPatchUsername()
+ {
+ $response = $this->patch('/scim/v2/Users/4', [
+ "schemas" => [
+ "urn:ietf:params:scim:api:messages:2.0:PatchOp",
+ ],
+ "Operations" => [[
+ "op" => "add",
+ "path" => "userName",
+ "value" => "johndoe@example.com"
+ ]]
+ ]);
+
+ $response->assertStatus(200);
+
+ $json = $response->json();
+
+ $this->assertArrayHasKey('urn:ietf:params:scim:schemas:core:2.0:User', $json);
+ $this->assertEquals('johndoe@example.com', $json['urn:ietf:params:scim:schemas:core:2.0:User']['userName']);
+ }
+
public function testDelete()
{
$response = $this->delete('/scim/v2/Users/1');
@@ -115,23 +438,23 @@ public function testDelete()
public function testPost()
{
$response = $this->post('/scim/v2/Users', [
- "id"=> 1,
+ // "id" => 1,
"schemas" => [
"urn:ietf:params:scim:schemas:core:2.0:User",
],
"urn:ietf:params:scim:schemas:core:2.0:User" => [
- "userName"=> "Dr. Marie Jo",
- "password"=>"Password123",
- "emails"=> [
+ "userName" => "Dr. Marie Jo",
+ "password" => "Password123",
+ "emails" => [
[
- "value"=> "mariejo@example.com",
- "type"=> "primary",
- "primary"=> true
+ "value" => "mariejo@example.com",
+ "type" => "primary",
+ "primary" => true
]
]
]
]);
-
+
$this->assertEquals(
201,
$response->baseResponse->getStatusCode(),
@@ -143,5 +466,44 @@ public function testPost()
$this->assertArrayHasKey('urn:ietf:params:scim:schemas:core:2.0:User', $json);
$this->assertEquals('mariejo@example.com', $json['urn:ietf:params:scim:schemas:core:2.0:User']['emails'][0]['value']);
$this->assertEquals('Dr. Marie Jo', $json['urn:ietf:params:scim:schemas:core:2.0:User']['userName']);
+ $this->assertArrayNotHasKey('password', $json['urn:ietf:params:scim:schemas:core:2.0:User']);
+ }
+
+ public function testPostTopLevel()
+ {
+ $response = $this->post('/scim/v2/Users', [
+ // "id" => 1,
+ "schemas" => [
+ "urn:ietf:params:scim:schemas:core:2.0:User",
+ ],
+
+ "userName" => "Dr. Marie Jo",
+ "password" => "Password123",
+ "emails" => [
+ [
+ "value" => "mariejo@example.com",
+ "type" => "primary",
+ "primary" => true
+ ]
+ ]
+
+ ]);
+
+ $this->assertEquals(
+ 201,
+ $response->baseResponse->getStatusCode(),
+ 'Wrong status: ' . $response->baseResponse->content()
+ );
+
+ $json = $response->json();
+
+ $this->assertArrayHasKey('urn:ietf:params:scim:schemas:core:2.0:User', $json);
+ $this->assertEquals('mariejo@example.com', $json['urn:ietf:params:scim:schemas:core:2.0:User']['emails'][0]['value']);
+ $this->assertEquals('Dr. Marie Jo', $json['urn:ietf:params:scim:schemas:core:2.0:User']['userName']);
+ }
+
+ public function testTotalResultsOnly(){
+ $response = $this->get('/scim/v2/Users?count=0');
+ $this->assertTrue(true);
}
}
diff --git a/tests/ConfigTest.php b/tests/ConfigTest.php
new file mode 100644
index 00000000..b44cc7bc
--- /dev/null
+++ b/tests/ConfigTest.php
@@ -0,0 +1,115 @@
+post('/scim/v2/Users', [
+ // "id" => 1,
+ "schemas" => [
+ "urn:ietf:params:scim:schemas:core:2.0:User",
+ ],
+ "urn:ietf:params:scim:schemas:core:2.0:User" => [
+ "userName" => "Dr. Marie Jo",
+ "password" => "Password123",
+ "emails" => [
+ [
+ "value" => "mariejo@example.com",
+ "type" => "primary",
+ "primary" => true
+ ]
+ ]
+ ]
+ ]);
+ }
+
+ public function testOmitMainSchema()
+ {
+ config(['scim.omit_main_schema_in_return' => true]);
+ // create user with post
+ $response = $this->createUser();
+
+ $this->assertEquals(
+ 201,
+ $response->baseResponse->getStatusCode(),
+ 'Wrong status: ' . $response->baseResponse->content()
+ );
+
+ $this->assertArrayNotHasKey('urn:ietf:params:scim:schemas:core:2.0:User', $response->json());
+ }
+
+ public function testDoNotOmitMainSchema()
+ {
+ config(['scim.omit_main_schema_in_return' => false]);
+ // create user with post
+ $response = $this->createUser();
+
+ $this->assertEquals(
+ 201,
+ $response->baseResponse->getStatusCode(),
+ 'Wrong status: ' . $response->baseResponse->content()
+ );
+
+ $this->assertArrayHasKey('urn:ietf:params:scim:schemas:core:2.0:User', $response->json());
+ }
+
+ public function testDoNotOmitNullValues()
+ {
+ config(['scim.omit_null_values' => false]);
+ // create user with post
+ $response = $this->createUser();
+
+ $this->assertEquals(
+ 201,
+ $response->baseResponse->getStatusCode(),
+ 'Wrong status: ' . $response->baseResponse->content()
+ );
+
+ $this->assertArrayHasKey('urn:ietf:params:scim:schemas:core:2.0:User', $response->json());
+
+ $expected = [
+ "employeeNumber" => null
+
+ ];
+
+ $this->assertEquals($expected, Arr::get($response->json(), 'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User'));
+ }
+
+ public function testOmitNullValues()
+ {
+ config(['scim.omit_null_values' => true]);
+ // create user with post
+ $response = $this->createUser();
+
+ $this->assertEquals(
+ 201,
+ $response->baseResponse->getStatusCode(),
+ 'Wrong status: ' . $response->baseResponse->content()
+ );
+
+ $this->assertArrayHasKey('urn:ietf:params:scim:schemas:core:2.0:User', $response->json());
+
+ // null because of scim.omit_null_values set to true
+ $expected = null;
+ $this->assertEquals($expected, Arr::get($response->json(), 'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User'));
+ }
+
+}
diff --git a/tests/CustomSchemaTest.php b/tests/CustomSchemaTest.php
new file mode 100644
index 00000000..d1734757
--- /dev/null
+++ b/tests/CustomSchemaTest.php
@@ -0,0 +1,106 @@
+ new Attribute("employeeNumber")
+ ];
+
+ return $config;
+ }
+}
+
+class CustomSchemaTest extends TestCase
+{
+ protected function setUp(): void
+ {
+ parent::setUp();
+
+ Schema::table('users', function (Blueprint $table) {
+ $table->string('employeeNumber')->nullable();
+ });
+ }
+
+ protected function getEnvironmentSetUp($app)
+ {
+ parent::getEnvironmentSetUp($app);
+
+ $app->singleton('ArieTimmerman\Laravel\SCIMServer\SCIMConfig', CustomSCIMConfig::class);
+ }
+
+ public function testPost()
+ {
+ $response = $this->post('/scim/v2/Users', [
+ // "id" => 1,
+ "schemas" => [
+ "urn:ietf:params:scim:schemas:core:2.0:User",
+ 'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User'
+ ],
+ "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User" => [
+ 'employeeNumber' => '123'
+ ],
+ "urn:ietf:params:scim:schemas:core:2.0:User" => [
+ "userName" => "Dr. Marie Jo",
+ "password" => "Password123",
+ "emails" => [
+ [
+ "value" => "mariejo@example.com",
+ "type" => "primary",
+ "primary" => true
+ ]
+ ]
+ ]
+ ]);
+
+ $this->assertEquals(
+ 201,
+ $response->baseResponse->getStatusCode(),
+ 'Wrong status: ' . $response->baseResponse->content()
+ );
+
+ $json = $response->json();
+
+ $this->assertArrayHasKey('urn:ietf:params:scim:schemas:core:2.0:User', $json);
+ $this->assertEquals('mariejo@example.com', $json['urn:ietf:params:scim:schemas:core:2.0:User']['emails'][0]['value']);
+ $this->assertEquals('Dr. Marie Jo', $json['urn:ietf:params:scim:schemas:core:2.0:User']['userName']);
+ $this->assertEquals('123', $json['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['employeeNumber']);
+ }
+
+ public function testPatchEnterpriseSchema()
+ {
+ $response = $this->patch('/scim/v2/Users/2', [
+ "schemas" => [
+ "urn:ietf:params:scim:api:messages:2.0:PatchOp",
+ ],
+ "Operations" => [
+ [
+ "op" => "replace",
+ "path" => "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:employeeNumber",
+ "value" => "12345"
+ ]
+ ]
+ ]);
+
+
+ $response->assertStatus(200);
+
+ $json = $response->json();
+
+ $this->assertArrayHasKey('urn:ietf:params:scim:schemas:extension:enterprise:2.0:User', $json);
+ $this->assertEquals('12345', $json['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User']['employeeNumber']);
+ }
+}
diff --git a/tests/GroupsTest.php b/tests/GroupsTest.php
new file mode 100644
index 00000000..2d7c7968
--- /dev/null
+++ b/tests/GroupsTest.php
@@ -0,0 +1,150 @@
+string('employeeNumber')->nullable();
+ });
+ }
+
+ protected function getEnvironmentSetUp($app)
+ {
+ parent::getEnvironmentSetUp($app);
+ }
+
+ public function testGet()
+ {
+ config(['scim.omit_null_values' => false]);
+ $response = $this->get('/scim/v2/Groups');
+ $response->assertStatus(200);
+
+ $response->assertJsonStructure([
+ "schemas",
+ "totalResults",
+ "itemsPerPage",
+ "startIndex",
+ "Resources" => [
+ '*' => [
+ 'id',
+ 'urn:ietf:params:scim:schemas:core:2.0:Group' => [
+ 'members' => [
+ '*' => [
+ 'value',
+ 'display'
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]);
+ }
+
+ public function testCreate(){
+ $response = $this->post('/scim/v2/Groups', [
+ 'schemas' => ['urn:ietf:params:scim:schemas:core:2.0:Group'], // Required
+ 'urn:ietf:params:scim:schemas:core:2.0:Group' => [
+ 'displayName' => 'TestGroup'
+ ]
+ ]);
+
+ $response->assertJsonStructure([
+ 'id',
+ 'urn:ietf:params:scim:schemas:core:2.0:Group' => [
+ 'displayName'
+ ]
+ ]);
+
+ $this->assertNotNull(Group::find($response->json('id')));
+ $this->assertNotNull(Group::where('displayName', 'TestGroup')->first());
+
+ }
+
+ public function testCreateWithMembers(){
+ $response = $this->post('/scim/v2/Groups', [
+ 'schemas' => ['urn:ietf:params:scim:schemas:core:2.0:Group'], // Required
+ 'urn:ietf:params:scim:schemas:core:2.0:Group' => [
+ 'displayName' => 'TestGroup',
+ 'members' => [
+ [
+ 'value' => User::first()->id,
+ ]
+ ]
+ ]
+ ]);
+
+ $response->assertJsonStructure([
+ 'id',
+ 'urn:ietf:params:scim:schemas:core:2.0:Group' => [
+ 'displayName',
+ 'members' => [
+ 0 => [
+ 'value',
+ 'display'
+ ]
+ ]
+ ]
+ ]);
+
+ $this->assertEquals(User::first()->id, $response->json(['urn:ietf:params:scim:schemas:core:2.0:Group'])['members'][0]['value']);
+ $this->assertNotNull(Group::find($response->json('id')));
+ $this->assertNotNull(Group::where('displayName', 'TestGroup')->first());
+ }
+
+ public function testBulk(){
+ $response = $this->post('/scim/v2/Bulk', [
+ 'schemas' => ['urn:ietf:params:scim:api:messages:2.0:BulkRequest'], // Required
+ 'Operations' => [
+ [
+ 'method' => 'POST',
+ 'path' => '/Groups',
+ 'data' => [
+ 'schemas' => ['urn:ietf:params:scim:schemas:core:2.0:Group'], // Required
+ 'urn:ietf:params:scim:schemas:core:2.0:Group' => [
+ 'displayName' => 'TestGroup'
+ ]
+ ]
+ ],
+ [
+ 'method' => 'POST',
+ 'path' => '/Groups',
+ 'data' => [
+ 'schemas' => ['urn:ietf:params:scim:schemas:core:2.0:Group'], // Required
+ 'urn:ietf:params:scim:schemas:core:2.0:Group' => [
+ 'displayName' => 'TestGroup2'
+ ]
+ ]
+ ]
+ ]
+ ]);
+
+ $response->assertJsonStructure([
+ 'schemas',
+ 'Operations' => [
+ '*' => [
+ 'method',
+ 'location',
+ 'status'
+ ]
+ ]
+ ]);
+
+ // confirm testgroup1 exists
+ $this->assertNotNull(Group::where('displayName', 'TestGroup2')->first());
+ }
+
+ public function testGroupCreationFailure(){
+ $response = $this->post('/scim/v2/Groups', []);
+ $response->assertStatus(400);
+ }
+}
diff --git a/tests/HeaderTest.php b/tests/HeaderTest.php
new file mode 100644
index 00000000..0765112c
--- /dev/null
+++ b/tests/HeaderTest.php
@@ -0,0 +1,58 @@
+singleton('ArieTimmerman\Laravel\SCIMServer\SCIMConfig', CustomSCIMConfigSchema::class);
+ }
+
+ public function testGet()
+ {
+ $response = $this->get('/scim/v2/Users/1');
+ $response->assertStatus(200);
+ $response->assertHeader('ETag');
+ $response->assertJsonStructure(
+ [
+ 'meta' => [
+ 'created',
+ 'lastModified',
+ 'location',
+ 'resourceType',
+ 'version'
+ ],
+ ]
+ );
+ // get the value of version from the response content
+ $version = $response->baseResponse->original['meta']['version'];
+ $this->assertStringStartsWith('W/', $version);
+ $etag = $response->baseResponse->headers->get('ETag');
+ $this->assertStringStartsWith('W/', $etag);
+ $this->assertEquals($etag, $version);
+ }
+
+
+ public function testPut(){
+ $response = $this->put('/scim/v2/Users/1', [
+ 'userName' => 'newUserName'
+ ], ['IF-MATCH' => 'W/"1"']);
+ $response->assertStatus(412);
+
+ // first retrieve the version by sending a get request
+ $response = $this->get('/scim/v2/Users/1');
+ $response->assertStatus(200);
+ $etag = $response->baseResponse->headers->get('ETag');
+
+ // now update it
+ $response = $this->put('/scim/v2/Users/1', [
+ 'schemas' => ['urn:ietf:params:scim:schemas:core:2.0:User'],
+ 'userName' => 'newUserName',
+ 'id' => '1',
+ ], ['If-Match' => $etag]);
+ $response->assertStatus(200);
+ }
+}
diff --git a/tests/Model/Group.php b/tests/Model/Group.php
new file mode 100644
index 00000000..58732f2e
--- /dev/null
+++ b/tests/Model/Group.php
@@ -0,0 +1,14 @@
+belongsToMany(User::class);
+ }
+}
diff --git a/tests/Model/Role.php b/tests/Model/Role.php
new file mode 100644
index 00000000..6b24ffc4
--- /dev/null
+++ b/tests/Model/Role.php
@@ -0,0 +1,16 @@
+ 'boolean',
+ 'roles' => AsCollection::class,
+ ];
+
+ public function groups()
+ {
+ return $this->belongsToMany(Group::class);
+ }
}
diff --git a/tests/ResourceTypesTest.php b/tests/ResourceTypesTest.php
new file mode 100644
index 00000000..24193378
--- /dev/null
+++ b/tests/ResourceTypesTest.php
@@ -0,0 +1,67 @@
+singleton('ArieTimmerman\Laravel\SCIMServer\SCIMConfig', CustomSCIMConfigSchema::class);
+ }
+
+ public function testGet()
+ {
+ $response = $this->get('/scim/v2/ResourceTypes');
+ $response->assertStatus(200);
+
+ $response->assertJsonStructure([
+ 'schemas',
+ 'totalResults',
+ 'Resources' => [
+ '*' => [
+ 'schemas',
+ 'id',
+ 'name',
+ 'endpoint',
+ 'description',
+ 'schema',
+ 'schemaExtensions',
+ 'meta' => [
+ 'location',
+ 'resourceType'
+ ]
+ ]
+ ]
+ ]);
+ }
+
+ public function testGetOne(){
+ $response = $this->get('/scim/v2/ResourceTypes/User');
+ $response->assertJson([
+ "schemas" => [
+ "urn:ietf:params:scim:schemas:core:2.0:ResourceType"
+ ],
+ "id" => "User",
+ "name" => "User",
+ "endpoint" => "http://localhost/scim/v2/Users",
+ "description" => "User Account",
+ "schema" => "urn:ietf:params:scim:schemas:core:2.0:User",
+ "schemaExtensions" => [
+ [
+ "schema" => "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User",
+ "required" => false
+ ]
+ ],
+ "meta" => [
+ "location" => "http://localhost/scim/v2/ResourceTypes/User",
+ "resourceType" => "ResourceType"
+ ]
+ ]);
+
+ $response->assertStatus(200);
+ }
+
+}
diff --git a/tests/RolesTest.php b/tests/RolesTest.php
new file mode 100644
index 00000000..dbaab7f3
--- /dev/null
+++ b/tests/RolesTest.php
@@ -0,0 +1,158 @@
+json('roles')->nullable();
+ });
+ }
+
+ public function testCreate()
+ {
+ $response = $this->post('/scim/v2/Users', [
+ "schemas" => [
+ "urn:ietf:params:scim:schemas:core:2.0:User",
+ ],
+ "urn:ietf:params:scim:schemas:core:2.0:User" => [
+ "userName" => "Dr. John Doe",
+ "password" => "password",
+ "emails" => [
+ [
+ "value" => "john@exampl.com",
+ "type" => "work"
+ ]
+ ],
+ "roles" => [
+ [
+ "value" => "admin",
+ "display" => "Administrator",
+ ],
+ [
+ "value" => "user",
+ "display" => "Users",
+ ]
+ ]
+ ]
+ ]);
+
+ $response->assertStatus(201);
+ }
+
+
+ public function testPatch()
+ {
+ $response = $this->patch('/scim/v2/Users/2', [
+ "schemas" => [
+ "urn:ietf:params:scim:api:messages:2.0:PatchOp",
+ ],
+ "Operations" => [[
+ "op" => "add",
+ "path" => "roles",
+ "value" => [
+ [
+ "value" => "admin",
+ "display" => "Administrator",
+ ]
+ ]
+ ]]
+ ]);
+
+ $response->assertStatus(200);
+
+ $json = $response->json();
+
+ $this->assertArrayHasKey('urn:ietf:params:scim:schemas:core:2.0:User', $json);
+ $this->assertArrayHasKey('roles', $json['urn:ietf:params:scim:schemas:core:2.0:User']);
+ $this->assertCount(1, $json['urn:ietf:params:scim:schemas:core:2.0:User']['roles']);
+ $this->assertEquals('admin', $json['urn:ietf:params:scim:schemas:core:2.0:User']['roles'][0]['value']);
+ $this->assertEquals('Administrator', $json['urn:ietf:params:scim:schemas:core:2.0:User']['roles'][0]['display']);
+ }
+
+ public function testPut()
+ {
+ $response = $this->put('/scim/v2/Users/1', [
+ "id" => "1",
+ "meta" => [
+ "resourceType" => "User",
+ "created" => "2010-01-23T04:56:22Z",
+ "lastModified" => "2011-05-13T04:42:34Z",
+ "version" => "W\/\"3694e05e9dff594\""
+ ],
+ "schemas" => [
+ "urn:ietf:params:scim:schemas:core:2.0:User",
+ ],
+ "urn:ietf:params:scim:schemas:core:2.0:User" => [
+ "userName" => "Dr. John Doe",
+ "emails" => [
+ [
+ "value" => "johndoe@bailey.org",
+ "type" => "other",
+ "primary" => true
+ ]
+ ],
+ "groups" => [
+ [
+ "value" => "1"
+ ]
+ ],
+ "roles" => [
+ [
+ "value" => "admin",
+ "display" => "Administrator",
+ ],
+ [
+ "value" => "user",
+ "display" => "Users",
+ ]
+ ]
+ ]
+ ]);
+
+ $response->assertStatus(200);
+
+ $json = $response->json();
+
+ $this->assertArrayHasKey('urn:ietf:params:scim:schemas:core:2.0:User', $json);
+ $this->assertArrayHasKey('roles', $json['urn:ietf:params:scim:schemas:core:2.0:User']);
+ $this->assertCount(2, $json['urn:ietf:params:scim:schemas:core:2.0:User']['roles']);
+ $this->assertEquals('admin', $json['urn:ietf:params:scim:schemas:core:2.0:User']['roles'][0]['value']);
+ $this->assertEquals('Administrator', $json['urn:ietf:params:scim:schemas:core:2.0:User']['roles'][0]['display']);
+
+ // find role with value admin
+ $response = $this->get('/scim/v2/Users?filter=roles.value sw "adm"');
+ $response->assertStatus(200);
+ $json = $response->json();
+ $this->assertCount(1, $json['Resources']);
+
+ $response = $this->patch('/scim/v2/Users/1', [
+ "schemas" => [
+ "urn:ietf:params:scim:api:messages:2.0:PatchOp",
+ ],
+ "Operations" => [[
+ "op" => "remove",
+ "path" => "roles",
+ "value" => [
+ [
+ "value" => "admin",
+ "display" => "Administrator",
+ ]
+ ]
+ ]]
+ ]);
+
+ $json = $response->json();
+
+ $this->assertCount(1, $json['urn:ietf:params:scim:schemas:core:2.0:User']['roles']);
+ $this->assertEquals('user', $json['urn:ietf:params:scim:schemas:core:2.0:User']['roles'][0]['value']);
+ }
+}
diff --git a/tests/SchemaTest.php b/tests/SchemaTest.php
new file mode 100644
index 00000000..f4f2e1ec
--- /dev/null
+++ b/tests/SchemaTest.php
@@ -0,0 +1,72 @@
+ new Attribute("employeeNumber")
+ ];
+
+ return $config;
+ }
+}
+
+
+class SchemaTest extends TestCase
+{
+
+ protected function getEnvironmentSetUp($app)
+ {
+ parent::getEnvironmentSetUp($app);
+
+ $app->singleton('ArieTimmerman\Laravel\SCIMServer\SCIMConfig', CustomSCIMConfigSchema::class);
+ }
+
+ public function testGet()
+ {
+ $response = $this->get('/scim/v2/Schemas');
+ $response->assertStatus(200);
+
+ $jsonResponse = $response->json();
+ $this->assertNotEmpty($jsonResponse);
+
+ // Find the User schema
+ $userSchema = null;
+ foreach ($jsonResponse['Resources'] as $schema) {
+ if ($schema['id'] === 'urn:ietf:params:scim:schemas:core:2.0:User') {
+ $userSchema = $schema;
+ break;
+ }
+ }
+
+ $this->assertNotNull($userSchema, "User schema not found");
+
+ // Find the active attribute in the schema attributes
+ $activeAttribute = null;
+ foreach ($userSchema['attributes'] as $attribute) {
+ if ($attribute['name'] === 'active') {
+ $activeAttribute = $attribute;
+ break;
+ }
+ }
+
+ $this->assertNotNull($activeAttribute, "Active attribute not found");
+ $this->assertEquals('boolean', $activeAttribute['type'], "Active attribute is not of type boolean");
+
+ }
+
+ public function getSchemaGenerator(){
+ // generateSchema
+ }
+}
diff --git a/tests/ServiceProviderConfigTest.php b/tests/ServiceProviderConfigTest.php
new file mode 100644
index 00000000..0118fb6c
--- /dev/null
+++ b/tests/ServiceProviderConfigTest.php
@@ -0,0 +1,21 @@
+singleton('ArieTimmerman\Laravel\SCIMServer\SCIMConfig', CustomSCIMConfigSchema::class);
+ }
+
+ public function testGet()
+ {
+ $response = $this->get('/scim/v2/ServiceProviderConfig');
+ $response->assertStatus(200);
+ }
+
+}
diff --git a/tests/TestCase.php b/tests/TestCase.php
new file mode 100644
index 00000000..4c47817b
--- /dev/null
+++ b/tests/TestCase.php
@@ -0,0 +1,88 @@
+loadLaravelMigrations('testbench');
+
+ Schema::create('groups', function (Blueprint $table) {
+ $table->increments('id');
+ // timestamp columns
+ $table->timestamps();
+ $table->string('displayName')->nullable();
+ });
+
+ Schema::create('group_user', function (Blueprint $table) {
+ $table->increments('id');
+
+ $table->integer('group_id')->unsigned();
+ $table->integer('user_id')->unsigned();
+
+ $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
+ $table->foreign('group_id')->references('id')->on('groups')->onDelete('cascade');
+
+ $table->unique(['user_id', 'group_id']);
+
+ $table->timestamps();
+ });
+
+ Schema::table('users', function (Blueprint $table) {
+ $table->string('formatted')->nullable();
+ $table->boolean('active')->default(false);
+ });
+
+ $this->withFactories(realpath(dirname(__DIR__) . '/database/factories'));
+
+ \ArieTimmerman\Laravel\SCIMServer\RouteProvider::routes();
+
+ $users = factory(User::class, 100)->create();
+ $groups = factory(Group::class, 100)->create();
+
+ $users->each(function ($user) use ($groups) {
+ $user->groups()->attach(
+ $groups->random(rand(1, 3))->pluck('id')->toArray()
+ );
+ });
+ }
+
+ protected function beforeRefreshingDatabase(){
+ // Schema::dropIfExists('group_user');
+ // Schema::dropIfExists('groups');
+ // Schema::dropIfExists('users');
+ }
+
+ protected function getEnvironmentSetUp($app)
+ {
+ $app ['config']->set('app.url', 'http://localhost');
+ $app ['config']->set('app.debug', true);
+
+ $app->register(ServiceProvider::class);
+
+ // Setup default database to use sqlite :memory:
+ $app['config']->set('scimserver.Users.class', \ArieTimmerman\Laravel\SCIMServer\Tests\Model\User::class);
+ $app['config']->set('auth.providers.users.model', \ArieTimmerman\Laravel\SCIMServer\Tests\Model\User::class);
+ $app['config']->set('database.default', 'testbench');
+ $app['config']->set('database.connections.testbench', [
+ 'driver' => 'sqlite',
+ 'database' => ':memory:',
+ 'prefix' => '',
+ ]);
+ }
+}