From b92dce9ca447dedaf05143ca74e6e0c3761759d5 Mon Sep 17 00:00:00 2001 From: Joel Male Date: Tue, 25 Feb 2025 11:47:10 +1000 Subject: [PATCH 1/7] wip: initial working database support --- composer.json | 3 +- composer.lock | 131 +++++++++++++++++++++++++++++- config/config.php | 3 + src/Cart.php | 71 ++++++---------- src/CartSession.php | 103 +++++++++++++++++++++++ tests/Helpers/SessionMock.php | 5 ++ tests/Unit/CartConditionsTest.php | 4 +- 7 files changed, 267 insertions(+), 53 deletions(-) create mode 100644 src/CartSession.php diff --git a/composer.json b/composer.json index 1188ca6..3816788 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,8 @@ "require-dev": { "mockery/mockery": "^1.4.2", "laravel/pint": "^1.21", - "pestphp/pest": "^3.0" + "pestphp/pest": "^3.0", + "larapack/dd": "dev-master" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 34df18a..a2d2864 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3672e97ffb5cb3bbc7081868046fec07", + "content-hash": "3177332c8f53e0104abe4aa29e537ce4", "packages": [ { "name": "brick/math", @@ -2462,6 +2462,47 @@ }, "time": "2024-11-18T16:19:46+00:00" }, + { + "name": "larapack/dd", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/larapack/dd.git", + "reference": "561b5111a13d0094b59b5c81b1572489485fb948" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/larapack/dd/zipball/561b5111a13d0094b59b5c81b1572489485fb948", + "reference": "561b5111a13d0094b59b5c81b1572489485fb948", + "shasum": "" + }, + "require": { + "symfony/var-dumper": "*" + }, + "default-branch": true, + "type": "package", + "autoload": { + "files": [ + "src/helper.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Topper", + "email": "hi@webman.io" + } + ], + "description": "`dd` is a helper method in Laravel. This package will add the `dd` to your application.", + "support": { + "issues": "https://github.com/larapack/dd/issues", + "source": "https://github.com/larapack/dd/tree/v1.1" + }, + "time": "2016-12-15T09:34:34+00:00" + }, { "name": "laravel/pint", "version": "v1.21.0", @@ -5528,6 +5569,90 @@ ], "time": "2025-02-24T14:05:52+00:00" }, + { + "name": "symfony/var-dumper", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "9b59e65b4b07c04d4a33f209ec9347352ca7b0e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9b59e65b4b07c04d4a33f209ec9347352ca7b0e7", + "reference": "9b59e65b4b07c04d4a33f209ec9347352ca7b0e7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/7.3" + }, + "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": "2025-01-19T13:07:55+00:00" + }, { "name": "ta-tikoma/phpunit-architecture-test", "version": "0.8.4", @@ -5698,7 +5823,9 @@ ], "aliases": [], "minimum-stability": "dev", - "stability-flags": {}, + "stability-flags": { + "larapack/dd": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/config/config.php b/config/config.php index 49ff845..56412ae 100644 --- a/config/config.php +++ b/config/config.php @@ -18,6 +18,9 @@ * --------------------------------------------------------------- */ 'storage' => null, + 'storage_id' => null, + 'storage_items' => null, + 'storage_conditions' => null, /* * --------------------------------------------------------------- diff --git a/src/Cart.php b/src/Cart.php index f0b6f1e..71bd7dd 100644 --- a/src/Cart.php +++ b/src/Cart.php @@ -15,6 +15,7 @@ class Cart protected $instanceName; + protected $customStorage = false; protected $sessionKey; protected $sessionKeyCartItems; protected $sessionKeyCartConditions; @@ -26,41 +27,17 @@ class Cart protected $decimals; protected $decPoint; - public function __construct($session, $events, $instanceName, $session_key, $config) + public function __construct($session, $events, $instanceName, $sessionKey, $config) { $this->events = $events; - $this->session = $session; + $this->session = new CartSession($session, $sessionKey, $config); $this->instanceName = $instanceName; - $this->sessionKey = $session_key; - $this->sessionKeyCartItems = $this->sessionKey . '_cart_items'; - $this->sessionKeyCartConditions = $this->sessionKey . '_cart_conditions'; $this->config = $config; $this->currentItemId = null; $this->fireEvent('created'); } - /** - * sets the session key - * - * @param string $sessionKey the session key or identifier - * @return $this|bool - * - * @throws \Exception - */ - public function session($sessionKey) - { - if (! $sessionKey) { - throw new \Exception('Session key is required.'); - } - - $this->sessionKey = $sessionKey; - $this->sessionKeyCartItems = $this->sessionKey . '_cart_items'; - $this->sessionKeyCartConditions = $this->sessionKey . '_cart_conditions'; - - return $this; - } - /** * get instance name of the cart * @@ -284,10 +261,7 @@ public function clear() return false; } - $this->session->put( - $this->sessionKeyCartItems, - [] - ); + $this->session->putItems([]); $this->fireEvent('cleared'); @@ -326,7 +300,9 @@ public function condition(array|CartCondition $condition): self $conditions->put($condition->getName(), $condition); - $conditions = $conditions->sortBy(function ($condition, $key) { + $conditions = $conditions->reject(function ($condition) { + return empty($condition); + })->sortBy(function ($condition, $key) { return $condition->getOrder(); }); @@ -342,9 +318,14 @@ public function condition(array|CartCondition $condition): self */ public function getConditions(bool $array = false, bool $active = false): CartConditionCollection|array { - $conditions = new CartConditionCollection( - $this->session->get($this->sessionKeyCartConditions) - ); + $conditions = new CartConditionCollection($this->session->getConditions()); + + $conditions = $conditions->reject(function ($condition) { + return empty($condition); + }) + ->transform(function ($condition) { + return $condition instanceof CartCondition ? $condition : new CartCondition($condition); + }); if ($active) { return $conditions->filter(function (CartCondition $condition) { @@ -488,10 +469,7 @@ public function clearItemConditions($itemId) */ public function clearCartConditions(): void { - $this->session->put( - $this->sessionKeyCartConditions, - [] - ); + $this->session->putConditions([]); } /** @@ -653,14 +631,11 @@ public function getTotalQuantity() return $count; } - /** - * get the cart - * - * @return CartCollection - */ - public function getContent() + public function getContent(): CartCollection { - return (new CartCollection($this->session->get($this->sessionKeyCartItems)))->reject(function ($item) { + return (new CartCollection($this->session->getItems()))->transform(function ($item) { + return $item instanceof ItemCollection ? $item : new ItemCollection($item, $this->config); + })->reject(function ($item) { return ! ($item instanceof ItemCollection); }); } @@ -734,11 +709,11 @@ protected function addItem($id, $item) /** * save the cart * - * @param $cart CartCollection + * @param $cart CartCollection */ protected function save($cart) { - $this->session->put($this->sessionKeyCartItems, $cart); + $this->session->putItems($cart); } /** @@ -746,7 +721,7 @@ protected function save($cart) */ protected function saveConditions($conditions) { - $this->session->put($this->sessionKeyCartConditions, $conditions); + $this->session->putConditions($conditions); } /** diff --git a/src/CartSession.php b/src/CartSession.php new file mode 100644 index 0000000..8946ee4 --- /dev/null +++ b/src/CartSession.php @@ -0,0 +1,103 @@ +isInternalSession($session)) { + $this->customStorage = false; + $this->session = $session; + $this->itemsKey = $sessionKey . '_cart_items'; + $this->conditionsKey = $sessionKey . '_cart_conditions'; + } else { + $this->customStorage = true; + + // @TODO validate these 3 exist + $this->sessionId = $config['storage_id']; + $this->itemsKey = $config['storage_items']; + $this->conditionsKey = $config['storage_conditions']; + + // get the base class to do findOrCreate + $this->session = $config['storage']; + $this->session = (new $this->session)->firstOrNew([$this->sessionId => $sessionKey]); + + $this->session[$this->itemsKey] = $this->session[$this->itemsKey] ?? []; + $this->session[$this->conditionsKey] = $this->session[$this->conditionsKey] ?? []; + } + } + + public function isInternalSession($session) + { + return in_array(is_object($session) ? get_class($session) : $session, [ + 'Illuminate\Session\SessionManager', + 'Joelwmale\Cart\Tests\Helpers\SessionMock', + ]); + } + + public function has($key) + { + return $this->session->has($key) ?? $this->session; + } + + public function getItems() + { + return ! $this->customStorage ? $this->session->get($this->itemsKey) : $this->session[$this->itemsKey]; + } + + public function getConditions() + { + return ! $this->customStorage ? $this->session->get($this->conditionsKey) : $this->session[$this->conditionsKey]; + } + + public function putItems($value) + { + if (! $this->customStorage) { + return $this->session->put($this->itemsKey, $value); + } + + $this->session[$this->itemsKey] = $value; + $this->session->save(); + + return $this->session; + } + + public function putConditions($value) + { + if (! $this->customStorage) { + return $this->session->put($this->conditionsKey, $value); + } + + if (! empty($value)) { + $value = $value->mapWithKeys(function ($condition) { + return [$condition->getName() => $condition->toArray()]; + }); + } + + $this->session[$this->conditionsKey] = $value; + $this->session->save(); + + return $this->session; + } + + public function clear() + { + if ($this->customStorage) { + return $this->session->delete(); + } + + $this->session->forget($this->itemsKey); + $this->session->forget($this->conditionsKey); + + return true; + } +} diff --git a/tests/Helpers/SessionMock.php b/tests/Helpers/SessionMock.php index 6ef6d64..5120aa4 100644 --- a/tests/Helpers/SessionMock.php +++ b/tests/Helpers/SessionMock.php @@ -20,4 +20,9 @@ public function put($key, $value) { $this->session[$key] = $value; } + + public function forget($key) + { + unset($this->session[$key]); + } } diff --git a/tests/Unit/CartConditionsTest.php b/tests/Unit/CartConditionsTest.php index b4a17a6..aef51d4 100644 --- a/tests/Unit/CartConditionsTest.php +++ b/tests/Unit/CartConditionsTest.php @@ -10,11 +10,11 @@ $events->shouldReceive('dispatch'); $this->cart = new Cart( - new SessionMock(), + new SessionMock, $events, 'cart', 'SAMPLESESSIONKEY', - require(__DIR__ . '/../Helpers/ConfigConditionsMock.php') + require (__DIR__ . '/../Helpers/ConfigConditionsMock.php') ); }); From 8d6e1bcc2662d44fcbdb201e8205fc5c1d585ff5 Mon Sep 17 00:00:00 2001 From: Joel Male Date: Tue, 25 Feb 2025 13:49:09 +1000 Subject: [PATCH 2/7] wip: readme updates --- README.md | 162 +++++++++++++++++++++++------------------- docs/laravel-cart.png | Bin 0 -> 10195 bytes 2 files changed, 89 insertions(+), 73 deletions(-) create mode 100644 docs/laravel-cart.png diff --git a/README.md b/README.md index 743fddc..222964e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,11 @@ + +[![Laravel Cart](./docs/laravel-cart.png)](https://joelmale.com) [![Latest Version on Packagist](https://img.shields.io/packagist/v/joelwmale/laravel-cart.svg?style=flat-square)](https://packagist.org/packages/joelwmale/laravel-cart) [![GitHub Tests Action Status](https://img.shields.io/github/actions/workflow/status/joelwmale/laravel-cart/tests.yml?branch=master&label=Tests)](https://github.com/joelwmale/laravel-cart/actions?query=workflow%3ATests+branch%3Amaster) [![Total Downloads](https://img.shields.io/packagist/dt/joelwmale/laravel-cart.svg?style=flat-square)](https://packagist.org/packages/joelwmale/laravel-cart) +[![GitHub last commit](https://img.shields.io/github/last-commit/joelwmale/laravel-cart)](#) [![License](https://poser.pugx.org/joelwmale/laravel-cart/license.svg)](https://packagist.org/packages/joelwmale/laravel-cart) +[![Free](https://img.shields.io/badge/free_for_non_commercial_use-brightgreen)](#-license) A Cart Implementation for Laravel. @@ -9,35 +13,58 @@ For Laravel 9.0 and below, please use version [1.0](https://github.com/joelwmale/laravel-cart/releases/tag/1.0.12) -## Quick Demo +## Table of Contents +- [Getting Started](#-getting-started) +- [Demo](#-deni) +- [Documentation](#-documentation) + - [Configuration](#configuration) + - [Basic Usage](#basic-usage) + - [Conditions](#conditions) + - [Items](#items) +- [Credits](#-credits) +- [License](#-license) -```php -// Add an item to the cart -\Cart::add(1, 'Product 1', 19.99, 2, ['size' => 'large']); - -// Get the cart contents -$cartContents = \Cart::getContent(); - -// Update item quantity by its id -\Cart::update(1, ['quantity' => 3]); - -// Remove an item from the cart by its id -\Cart::remove(1); - -// Get cart total -\$total = Cart::getTotal(); - -// Clear the entire cart -\Cart::clear(); -``` - -## Installing +## 🚀 Getting Started +### 🔥 Installing Install the package through [Composer](http://getcomposer.org/). `composer require "joelwmale/laravel-cart"` -## Configuration +## 🧑‍🍳 Demo + +```php +// Add an item to the cart +\Cart::add( + 1, // any unique id + 'Product 1', // product name + 19.99, // product price + 2, // quantity + ['size' => 'large'] // an array of extra attributes +); + +// get the entire cart +$cartContents = \Cart::getContent(); + +// update an item already in the cart +\Cart::update( + 1, // the same unique id that was used to add the item + ['quantity' => 3] // the quantity to update +); + +// remove the item by its id +\Cart::remove(1); + +// get the total of the cart +\$total = Cart::getTotal(); + +// clear it all when you've finished (like when you've stored the order) +\Cart::clear(); +``` + +## 📚 Documentation + +### ⚙️ Configuration You can publish the configuration file to customize various options. @@ -45,7 +72,7 @@ ## Configuration php artisan vendor:publish --provider="Joelwmale\Cart\CartServiceProvider" --tag="config" ``` -### Formatting Numbers +#### Formatting Numbers The package by default does not use round to format numbers, and instead returns the number using floatval(). @@ -58,7 +85,7 @@ ### Formatting Numbers 'round_mode' => env('LARAVEL_CART_ROUND_MODE', 'down'), ``` -### Decimals +#### Decimals You can customize the number of decimals in the configuration file. @@ -68,7 +95,7 @@ ### Decimals 'decimals' => env('LARAVEL_CART_DECIMALS', 2), ``` -### Round Mode +#### Round Mode The package uses the `round` function to round the prices. You can customize the rounding mode in the configuration file. @@ -78,21 +105,8 @@ ### Round Mode 'round_mode' => env('LARAVEL_CART_ROUND_MODE', 'down'), ``` -## Usage -- [Basic Usage](#basic-usage) -- [Conditions](#conditions) -- [Items](#items) -- [Associating Models](#associating-models) -- [Instances](#instances) -- [Exceptions](#exceptions) -- [Events](#events) -- [Format Response](#format) -- [Examples](#examples) -- [Using Different Storage](#storage) -- [License](#license) - -## Usage +### Basic Usage The cart has a default sessionKey that holds the cart data and stores it in the session. @@ -111,7 +125,7 @@ ## Usage \Cart::session(User::first()->id)->add(1, 'Product 1', 19.99, 2, ['size' => 'large']); ``` -### Adding to the cart: **Cart::add()** +#### Adding to the cart: **Cart::add()** There are a few ways to add items to the cart. @@ -182,7 +196,7 @@ ### Adding to the cart: **Cart::add()** ); ``` -### Updating an item on a cart: **Cart::update()** +#### Updating an item on a cart: **Cart::update()** ```php Cart::update( @@ -221,14 +235,14 @@ ### Updating an item on a cart: **Cart::update()** ); ``` -### Removing an item on a cart: **Cart::remove()** +#### Removing an item on a cart: **Cart::remove()** ```php // Remove an item from the cart by its id Cart::remove(456); ``` -### Getting an item on a cart: **Cart::get()** +#### Getting an item on a cart: **Cart::get()** ```php // Get an item from the cart by its id @@ -238,7 +252,7 @@ ### Getting an item on a cart: **Cart::get()** $summedPrice = Cart::get($itemId)->getPriceSum(); ``` -### Getting the cart content: **Cart::getContent()** +#### Getting the cart content: **Cart::getContent()** ```php // Returns a collection of the cart's contents @@ -258,13 +272,13 @@ ### Getting the cart content: **Cart::getContent()** $cartTotalQuantity = Cart::getTotalQuantity(); ``` -### Cart subtotal: **Cart::getSubTotal()** +#### Cart subtotal: **Cart::getSubTotal()** ```php $subTotal = Cart::getSubTotal(); ``` -### Cart subtotal without conditions: **Cart::getSubTotalWithoutConditions()** +#### Cart subtotal without conditions: **Cart::getSubTotalWithoutConditions()** ```php $subTotalWithoutConditions = Cart::getSubTotalWithoutConditions(); @@ -276,19 +290,19 @@ ### Cart subtotal without conditions: **Cart::getSubTotalWithoutConditions()** $total = Cart::getTotal(); ``` -### Check if cart is empty: **Cart::isEmpty()** +#### Check if cart is empty: **Cart::isEmpty()** ```php Cart::isEmpty(); ``` -### Clearing the Cart: **Cart::clear()** +#### Clearing the Cart: **Cart::clear()** ```php Cart::clear(); ``` -## Conditions +### Conditions Conditions are very useful for adding things like discounts, taxes, shipping, etc. @@ -300,9 +314,9 @@ ## Conditions You can also provide an `order` to cart conditions which tells the cart in what order to apply the conditions. Item level conditions do not support the `order` parameter. -### Conditions on the cart +#### Conditions on the cart -#### Adding a condition to the cart: **Cart::condition()** +##### Adding a condition to the cart: **Cart::condition()** ```php // Add a single condition to the cart @@ -353,7 +367,7 @@ #### Adding a condition to the cart: **Cart::condition()** Cart::condition($shipping); ``` -#### Getting conditions on the cart: **Cart::getConditions()** +##### Getting conditions on the cart: **Cart::getConditions()** ```php // To get all applied conditions on a cart, use below: @@ -372,7 +386,7 @@ #### Getting conditions on the cart: **Cart::getConditions()** } ``` -#### Getting conditions on the cart as an array: **Cart::getConditions(array: true)** +##### Getting conditions on the cart as an array: **Cart::getConditions(array: true)** You can get all cart conditions in array format by passing "array: true". This is useful if you want to store the carts conditions on a Livewire component since by default we have collections inside collections for conditions which Livewire does not support. @@ -391,7 +405,7 @@ #### Getting conditions on the cart as an array: **Cart::getConditions(array: tr } ``` -#### Getting conditions by name: **Cart::getCondition($conditionName)** +##### Getting conditions by name: **Cart::getCondition($conditionName)** ```php $condition = Cart::getCondition('GST'); @@ -405,7 +419,7 @@ #### Getting conditions by name: **Cart::getCondition($conditionName)** $condition->getAttributes(); // the attributes of the condition, returns an empty [] if no attributes added ``` -#### Getting active conditions on the cart: **Cart::getConditions(active: true)** +##### Getting active conditions on the cart: **Cart::getConditions(active: true)** You can get only active conditions by passsing `active: true` to the `getConditions()` method. @@ -441,14 +455,14 @@ #### Getting active conditions on the cart: **Cart::getConditions(active: true)* // will return no conditions if the subtotal is $210 ``` -### Calculating condition value +##### Calculating condition value There are 2 ways to calculate the value of a condition: 1. Using the `getCalculatedValue` method on the condition instance 2. Using the `getCalculatedValueForCondition` method on the cart instance and passing the condition name -#### Using the `getCalculatedValue` method on the condition instance +##### Using the `getCalculatedValue` method on the condition instance ```php $subTotal = Cart::getSubTotal(); @@ -456,7 +470,7 @@ #### Using the `getCalculatedValue` method on the condition instance $conditionCalculatedValue = $condition->getCalculatedValue($subTotal); ``` -#### Using the `getCalculatedValueForCondition` method on the cart instance +##### Using the `getCalculatedValueForCondition` method on the cart instance This method automatically calculates the value of a condition by it's name based on the order of the conditions. @@ -489,7 +503,7 @@ #### Using the `getCalculatedValueForCondition` method on the cart instance Cart::getCalculatedValueForCondition('Gift Card'); // returns 0 as the coupon discount is applied first and brings the subtotal to 0 ``` -### Adding conditions that activate once a minimum value is met +##### Adding conditions that activate once a minimum value is met You can add a `minimum` amount required for a condition to activate. @@ -508,7 +522,7 @@ ### Adding conditions that activate once a minimum value is met Cart::condition($tenPercentOff) ``` -### Adding conditions that only activate up to a maximum value +##### Adding conditions that only activate up to a maximum value You can add a `maximum` amount required for a condition to activate. @@ -527,7 +541,7 @@ ### Adding conditions that only activate up to a maximum value Cart::condition($shipping) ``` -### Condition on items +#### Conditions on items Item conditions are useful if you have discounts to be applied specifically on an item and not on the whole cart value. @@ -588,7 +602,7 @@ ### Condition on items $cartSubTotal = Cart::getSubTotal(); ``` -#### Add a condition to an existing item on the cart: **Cart::addItemCondition($productId, $itemCondition)** +##### Add a condition to an existing item on the cart: **Cart::addItemCondition($productId, $itemCondition)** Adding Condition to an existing Item on the cart is simple as well. @@ -602,7 +616,7 @@ #### Add a condition to an existing item on the cart: **Cart::addItemCondition($ Cart::addItemCondition(456, $condition); ``` -### Clearing Cart Conditions: **Cart::clearCartConditions()** +#### Clearing Cart Conditions: **Cart::clearCartConditions()** This clears all cart level conditions, and does not affect item level conditions. @@ -616,25 +630,25 @@ ### Clearing Cart Conditions: **Cart::clearCartConditions()** Cart::clearAllConditions() ``` -### Remove a specific cart condtion: **Cart::removeCartCondition($conditionName)** +##### Remove a specific cart condtion: **Cart::removeCartCondition($conditionName)** ```php Cart::removeCartCondition('Summer Sale 5%') ``` -### Remove a specific item condition: **Cart::removeItemCondition($itemId, $conditionName)** +##### Remove a specific item condition: **Cart::removeItemCondition($itemId, $conditionName)** ```php Cart::removeItemCondition(456, 'SALE 5%') ``` -### Clear all item conditions: **Cart::clearItemConditions($itemId)** +##### Clear all item conditions: **Cart::clearItemConditions($itemId)** ```php Cart::clearItemConditions(456) ``` -### Get conditions by type: **Cart::getConditionsByType($type)** +#### Get conditions by type: **Cart::getConditionsByType($type)** This returns all conditions that has been added to the cart by the type specified. @@ -642,13 +656,13 @@ ### Get conditions by type: **Cart::getConditionsByType($type)** $tax = Cart::getConditionsByType('tax'); ``` -### Remove conditions by type: **Cart::removeConditionsByType($type)** +##### Remove conditions by type: **Cart::removeConditionsByType($type)** ```php Cart::removeConditionsByType('tax'); ``` -## Cart Items +### Cart Items The method **Cart::getContent()** returns a collection of items. @@ -670,8 +684,10 @@ ## Cart Items $item->getPriceSumWithConditions(); ``` -## Credits +## 🫡 Credits -Huge credits to the original maintainer of the package, located at [darryldecode/laravelshoppingcart](https://github.com/darryldecode/laravelshoppingcart) +This package was orignally created by [darryldecode](https://github.com/darryldecode) but has since seen almost no updates. I have decided to take the old package and transform it into a new package with new features and updates. -We have forked this package to update it to Laravel 11 and to add some features and support for newer PHP versions. \ No newline at end of file +## 📓 License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. \ No newline at end of file diff --git a/docs/laravel-cart.png b/docs/laravel-cart.png new file mode 100644 index 0000000000000000000000000000000000000000..f8cac1fb394bda26720a800941129bfc9b5b826d GIT binary patch literal 10195 zcmXw9bwHC**QXQ^X+&^HC?Oz%g7gNCkOmQ?TS^)v$H-9# zAaz#IbHl?UqrLs%>c%^W%E3-Rzcw9D$vTwA! z@OLuQ?U^Q_T?;?)zYxW)8l=Wo(y*XorPtm+JvCjU8M*VkUb>q-$@C6qobKJ{X&~4= z(>Sq2Eei8{DP@GZuG06u@^El7eviA)j#NL)LaN7+#i~)*X2kOOl*_h+@+r++G|eq+ z?aZ86&Hvesua{V$l#Z1+`g?Zsr|`Jx=(2Hv7kV|!WhqC(2BQM&cmB%sli%4+q+|QI zcOLZwmqo(Hw{ioN8-;HX^a5-ak&P%?*gH3TO+vZGpTa zy+7O7mq*XGL(m-k-%bMNnZfADK^|N&t_v+zFAtCGvp!V%T`C!lu9wcgL`zOrr8qbViqW9vR`;Z?Ey$_{tKJLo>m z;$M6mKg&7)GnW_Q&=a7Q>r-TgX)fS)dJ43|^UPmxgHzmNxg9)~vki6^R>5^;MRS`J zBK3ig*qS`^y`2|0m8cO2tKh%#_-|R@<=Ms#8#3en7fO)1>#Q%QAkpsh>_1(rE$-C% zXWp)i@qeAC56#FZT(&!L|EHY7cOIeHJE-`P+vJc*2fynGTdWk*tc*C)+u=+i2Q8n+g{!=T z9_QGaG(>T^%aZGNRq>u;!lkS9rSKVNi~y~gAL=tYqsl{dXTbS z-e_UHW!ri%B}hXDWr%`;oEHPc-M8*k>U`&0fSlG>4ssztSuc#Q^8T~yJxa4^M1xbq zQKCAgwOgiqtD9%2EWA=^?a;V<(!Fz9k+&^X&$GY1Ss5((QKOFy$WswyfQ3*KTLS2b9_k9Ngk z-iJs>GPe3RwS{BAU7QTNT3&--RGJ#{p;`H+{jkmNl$=_dQ_ zrXj!EJ38bQDX`-n`SbI}P(% z`xNAxRN{$7;gU*W#CI$BrZNzSiS^dr!?GJd^DuLso1d9+QBh+-pNgv5#8&G`Np)S- zPk1!wNF@Ub$YZI3I&iX+J#d2GDAy)CrzsaCeKAoo7QT7m4N8`@OzJ{4R!Hntf5}r9 zLvL+G7WcdKt*>-;SFO~kaa0UzhdCJBshD~Fw`vC|%y}|gwTH>s1Ldcbq3ob19COt} zrSS3<0N}^0g^A_?l=R=+hhmIK4?)Y?nq_j;XS@<#-PTrD{BW?I&F&fg?aq%==UYNT~UtBD{C|sO1v<2H)chlhi z55%XmFVZ&3TBQ*-CMM$9RCbrUEZFCV>ZqV#rSJrrZdw{*c-`(@Vg0WOS{G#-87ryP z0OVLRv2uD*SePFmzOsGZ*(q|W!~us+?ExQxx~oplrS9hsLT?7g zb+9-3&;$PF@BUJd!}?P5yXNcL)0=g6rYrj`3weDy^IEv$(H1D(s?XwOIA7-?V^r^> z9UT+%sWiaNZJifPv~Fc>ec~OSesK{ZE+IOxu)yMNH*vh4lvG_ACI{=?`m}c5vJ{AZ z{r>%X^b0>{;8vorVU2UvSJ)e}9|~UN@(84-<9uP|FtIF60N>Ob?DL7D;~p{@6f7GLbQYU+OUYhMc;T+WV9J zUE*d`--_h#-i-}GtSD}y!dVSfu$Py|PT|bq>=(o9Se|uLvZYU^xsN!BJI!J6f_~G2 zPhqiz+helo)7W>26%WP*cb=arnno_}1pyYEhn;geo;_t*1nAhY7$hd~SCebo!dl8J zlwG2dl*byKrB;;c15zUpQsNuDQ(#mlDqzBWoBf4H##aP{+S}k(#BZ<;4`i&P4uO0Uv7P|K5ondx9Y{rX*FGBJekdhg#=rjP%M=kVa(cn%z-FF~w6((mbb zYs(H;sqq`0>qZ90id=Py1DJxH11Ilh<9C%X6O$6gJeEL(L`B2u*(AxE&2sn;XP@)& z*#fLm3?BWSxVmbfuqZ&TfOhyO2NN8RE|k)SJxtO_N$+I;O7~!vC$S|vl|64bO~CHI zCP6G*`RHYc3Ff^p_LV8R>8f{MUO(NT9GB3>ce^+YK9QKBb3dJh+gTo5tV>;1i_c6J z|5Ks{lSI6QxS@>4+raTm(l(0>0lJJVER)&zJtVOjcy?}!b1s3-!r?JZpK{Sd8XOI( zzm-2Aqp76CA?Xi;JXpO%MpIQ-?6M~IJV#ysaGqeE9)={P z;@Iz&{(aT)uvtTgzRP8vh|TdYmf6b#A&J$>=%-p#49W#JnrvRCrLJ%M9_4xxck&(w zHstOs-_aY3Eo@P_!_9aGg*wu5)B1nX-o3Z71tj;cyQmnABj2OA`{J=IRPFD9y+^NOoONQuJ3^Vc)| zvpkqE9vTl{RcC>&Oy9p}lCUG?UmD7i(MQ%Q)cfI-k@$mY!7wVC&g)A$5bU#ftt4pw zIK?&(dU?qDvX%Pj>V4)++Bm9Ljp9!X?HBuBo-KPXjd8oL^`=#p>H7lbpXrv=a!;Im zcLYp%om5U19*z!RNpToR(>?_!pk3Bv+)1--ihYGoK+OFMPz-J7R#GtqWOo%3n&0jE zbM0d&EnvnMO*WMxdBi&WrsKU(&VTTjJ*)5H-V&w%`RKG%EsV0QlNDUzC_k})$Nr>6 z9w|y3xI!32VyW=~7DYl2%Q2H;88ahfgSk-|s{=3KmA^^}tiz(T%W*ZI6 zg+;)1u&+PL9p9GhuJ>?d=7$W_mJN0UzE=F@FEG3a3@WMh7KE4+Dbg$*9%|VyXiXNI zOwJ2R1V3hj(NTZIR+NgEb08T7^6=T_WU^qCWi3FQDSWN|XPTvdEP`B6yNbLQmjlV4 zK9_~heZ@@r|4@_q{Qbp_2%DURySsML2a!3t{ZN*?Z=|*l3hW9#Ik>ChaFLDrXoiI6 zvCFjV$^KINCmZJy-tyI~VhjL7-c@?`p1Q$K<&(66=euW1go{A$ol2d`5`pqwZA~kG zRimcEpGV>(oB&uMo5AC<>FX_QbHVeeWwI_%wnkm=IPa!{uibQQzOy2OlS|sH!VLDM-x0JC+*JwN*{YeBSDBO7DcNs(Z(SYo z$jHd8se_d~Ie1?vFFxTWQw>ff?&b)z5ofQ4TfBTO`-jm&J(G$ZS{2QW((l-rseXWi z#DB{h%CdpLve2%u!kq}h?6Bou<jlz7mMoz1z?A%WSjhzQbku_(c^4sr_e3BIkaYh7c#4>+WhLGX4a z3N}_*prie)B%;!ulIGd=z*M(e4PelhD}btc5qWp$ZAKzq)+jpdfsWLgF8ZZSXUa}T z&BHb0U*9#_i03nsO%Pflj)s$&Y)_WKvoL;WUekT>T1hhH=`M9Fy+qM|pphU1a1(cZ zG3YlOTlUC92CYbE1vG@0h7LeSOKWoH{7CqIo?UA|HthLgSutfde6H_39N zAps{9oPdRsXYRj&k|n>`q{@#K#z7&Ekfn`TxV5##OeiSI;M#eq-p}LIa4eL1?=>&4 z6XX(a$e*2fDl&0QL2VIWK=Lq|A(teZ`ueDM)=*}dJm4~bom3H8mPrg?S8D;%NtpPp z#)ZB@eV)&qq5r(mCo%3`;6Xs_@Kk)yCsbwo^YYJr$3^D0*%49SL-DX))iPQoUJSL_ zuo4*atb<8;rqk-!mOnlGv*E{W1rFj10>ji!CzbX08gc0YYPgpi86c znPdjGp53ECDP3NoH+Kv~7V@sv+0uTrDZ2}I_{qRx1^zz#J5Ku+zD0^~di4Sk5KEP- zA)pxQ9G<3&c1X|6RJYGjPON1RmHf^%BJ7dx%%ZH^e2jL-e;0Vud4j)zBpCNw)w4*T z52t|DPXCTz284IMQ}=j75-Ix8cNsyP-aaLb6d{uwEvZejnB(5YViECM2+}Rb%0M6 zlrQ1{uryLsNHyCATBuhXFbc z6*9ooprF;hBkL8P?aq7VWATi&wa}FpY{^7K)~P3wdL3_#TZ2H>-c?`PfImw(k#<@8 zFTKu}g58%1GF2%ai)+p7tvCK__>sV*04A^($D-AZ-K~sdXb4Alvzl=*kvV(oI(h-q z7=XIMtaW4Dl*yh=b=Ky*&D8vbkQy&J4Wo)@Rza_DLd(7qME1UXW2k3547RQQmLj?X z3=^iH@M{!)`4&K(pVUbkpeVjA zIzh>>ga--oD#$w#^oCJU6&@MyM%+Y&gy`m0-drmPludo}st<_@w zIy`Kx8CGB0HcKUJy^{L;a^la%>$f_@=~+;p_d^N{7Za3g9U{g>1BoJ@Hw{NMZc*7w zas(kCB*Un_L*w46B4jqJnfG$%$2V#)#>?L@o!d@lyD$Gl$2x}M)Vby}U$TCjg0B-n zDskrMdX7Y$JeWioMQ3#Ld(UsL@YVC%rA~JaMZ84gy|g^*dANHwZm|q##kciVEctuD zLpH~-!u;3No5TO+y7sOHR2|zQ#-}3QDGsR^KJZ7x+QWVri9?o=K591f7oU!~TsfcG6X~ zYOQOQ1X-64$;m1H`cW9Hy}^8B^-1M`{BiL9!)I+ca{{whd_UkEo%o&ydTO0~Ei`jf zgWcN-K1^4Z`D)jP@4zc|qh>L4R?B#fPOhA561J{fs()c?AHStM^Fl`q$7U&*?W>CR zpS*UF)-XNHu#T3~H1e#P3*zWUvRKMYV$WeT@f;~^_DupJlSF8ax_J7dy$2{4hrf>= zJp^55F{fC0eX4VTsu}N!y!=x{x9>SyihPxoFkDExTe$N%>15|&s?ZC)EhUI5FZ%0= zv1QTI{&ITr!K?H$L{}2&#dbYt@Mus&1gx+$-LGgmQ3vi|Q~>0!-ODIzlt2koD@~LR zAfzwR%`<5}9&LhCJOA0YTg$KMrGFjT%xLdeiHb&1@xtoAApkllX?A;v55xKHB7`wf zpT8$zz8HSSwd!w~X}5QTeU`fK{uD+Rdea12cPYFk^(Kqyu`S@r1q}{hvGV(MQ5Ey| zj^`?WQ8q}Dc)Equc5v`+;BbrR-Mt~oUq7`z=yUiEQNm)TEkc3e^3jc zq}Y6kGV!`Nf3US#CS+n z8#eXvK}*yQ%*gZIdu*J(`Hj&!#UR}p3|_ZaL--ENfJmNJu$;BrOgH;ye&X=?m*cj3 z4QG|-RLhKU5ZR4zTG5T_P>$(0g+dO}eRsu*rGL9b4LdHAogDoL-IKkQs;IzNG}Xuf zyEo1LguW(TdwJlHFeLs9>GR)%nnJ_E3q!@v`KxDFObOpD>AMjMP=_%HOlI2K+uQI< zf29&h7%m+SZK`V^V*}Wj2dmUy+prL|b$5s3;A8_S&Jpo)CJoEV$}*aEyLXq-0U+s=-|oUsHctbc3_Dfru|P(K-3L|@VsgSq4%%<`Hu9F!?I2r*Vu zACz_QsjotiS$3wDlx`V2H>)hkD7^cQBhfz#y?PgA;pL@!?d9>|U(v$uAmYe4xM$5+ zMZlq?is(t}9qj!*^>Wg=t1-i38tXm|c2fY`$8$x3gk2#!`@^7BGAf}ajaRU&ABxZM z)ZtD$44sV2R0M5u^^#$DL4%Hwk6ptc;}LDdY>sQ3y9+WTwoVLN@+90$DT#22HhBD0 zKh#cO`Z&a-gH5lu?3JV>6NDKNKJ+pmHo%jMjOy+~V}Ix*?Gw{K<&pqS8u8?h*7l#D zzc;e5u=perD2@5R@K;`;^mZY1G!4;j88mI`%vBaU>?#bt4+tgrhsRet&UPnZ#cZ9J zVYxrpB4Y!bWuy*CY9tq@rLXm5lV^i9TEpr_qTqgxp2K8!_p@0eN%n|#BddQ+8}ug^ zvRr!2R`$B6YCcx9)K>X61mZ|ioS~SkRP-1{3rZzRo+N2ii6?$(u2wu#&0F=6nc22` z8xBlzcHr)+{$Qee@4?b5T#AWod7oK8;dbE7)Zd}Lr>Zw#&UsKhn>%}w zgM4OuFVZ0lgJ!R{-Kp)IL#bO9wvSt{2{d*Mi7k@`7>iNHE%xP+y>c--ai_WG_-(?1TR!mVn;(GAYC z^*WjoXG&kFG?~uxgKzUfR+wo4RGOmyjgx4K_C|T)>iw_2#_X>RHe~Gor@C)|ii)L% zmht=3C4KB1{fEqW=#Ju`S`3VBQX3ou(mwoUkK5yeqSs9f{R!Mh)uW8tQ;I1pv8QR4UDwg zpSBOfcH$Ag?^9A1#BFqS7#<5lpcd_V6i&ZX0eDr`*4B3JMY78s4fGBM`i5gCluXP+ zYx{p061s+m-vL{bEtJPa7I41dICe4gQRDzuWzX*V*jOSnF`kpWx;nfn*zVo0KDAjf z9pFe;R_mKNV*ECTye;?OXg(GCoaW)5Xi?cNoq0b4a=&ZL>$op=!r3=D=>Ztw36bn3 zrrcC|HE{qLzi934n=Q8s0750x{UEyqT z`#U4RUURWjj`8v1p!PGvZx#%zW%Sa!uH`bwj-oAUOAner zPNz=XG>_5@4BRa&LA=9bl4X}Dknn4IK`+Pn zmPX^6&x&wzwDWm^$@q2B9(Cv1ev7o$f~Phy;lyXg_U2P7#LpJI}1)vNnU!W8SKBray%Dy#aO7@wAM ztpql;|5O<>vap@^_x9^Aebq%^=`y&V-g~~>fN7fY?>m#X&&n8iSi85uiw4ki=CvQ^ z4@OWdMPj2cX2b;Y)lyi%3C=)nSj#|q%u$;=JH!5I%w{AX!e4I&dpGZUmbVje`;c%8 zI2*GrcyDzofd3-}iWo|LkO2p{oL){i!=Cu+@n(dch zm?6+gF)(8WdbQb}=3p2}m4mP;yW=8A)%dMbR)w=WQhPA$Lf8mGl)uwe`GCJCzloyj z-JXPq(*$~z#?fVi^syxKaGFbn5u~FxiS#8JhTZ=QSRXPz>TfcHTZnR9zm?{S0QA@lR(Nt!&XF8lI@`3;FH1BDcX00>SQhDu%nIOa7Z~nK@3+k z$L{0aZ!2M?0j4i^!l6^c1l>xetjx?&54Kv}o-F{5K+>Y$2A@d+T^AB!tq*_XlK*vc z%GtX%ND`O3N|{VSaCk*%7&o++G2hEdMD2mF@XNSU2t9H8?Eecm+}ivcu#g*ZpM(%V z%}C>D_0-AlrP=l2Q}_nUH>9JZb^~7to5wz6C`C6~E9Cw>odugvTNDy?aDY3@&%z}Gu z6$|B}y=M>DkS)&9lx*xGG`+zkOtcMoClO2!8^s8P1G<(CyW*Iam#^89hK%BB8HMF-D`eC|L@kjXUx#q1IKN5z* zBk2@T(-^Lu~f1(gRfMiMWo#7l(^hp1y*2KY|O^xsK z^UWiZ-=4fd5z{!X6FP+PyvZF9qOaF!AE?U7y!g~TI%Il1W8aX~g{0U?2-)K-Ll9-@ zdC|t4nm-{|PZ}#_AzRLQMdIHE@Nv7U(2eY5uzSYJ#C~Soyl`tq~q53*TyuiA(`%|XN zFBI^LaFBk`sO)(<~mk`wc14aF{bjNZ_`gKXljE<&kxH` z$`ie;LaN)T4*AU<3hL(?#Atq}@;iov61s~oJlL;PvC(&qTnFsyZ3$_uztN>S#NAjB zM4qlNaVEN)Nl(1qjB?feHBPW3s7dYwK7We6XSVgo->cyi({Y&OBCi)N8)c>sr>xn> zV#YhpC=tX_Zs9<^NRBgC)>PlVsT`JbMgX7yFoP@=%3MH}Dg;YPu?^ZV{qMgAIM;L~7XM??uq3Jxk8aq=0}#EZ+5m=%yKgkG=ULla?#PFaR`7y7m8@1{xlUb6F^vErOy z0-$@lE5?tvpfMtRroiVYcI>a(X2SGFVP93}8 zoQzl8=CFWgSyghYPD?@s`!0HSD;E#qtoT#}FL9%J+lFl57uB5Up;LeP_cxh<+YO8t zV0OivjTtppxrs-<^%{p)bB>8Lpz1P|T2Xs`*e!h&BCV-Avt$j64breOCj@_?kh#rl z`Ez#?#T@6zF4Pbm`{8KQs0qV?-1r}KE_h=eobeb(zI>th_ka}#Y!!6gTcrTlWM9_e z-{Rc5bXP`9+78}BK}rOHXBD9; ze0Y8q?llxhDP8P^*fk_-PiPNJGEa*AXhXczF>=|Q0V8^90#HL*p)M9hiT<+*XuzRw z*y+oUf0)NQaO?{XY=3?&A;H1tm#Un;s8ILQNFnv=lJi#|MPc42!J_xdrhgY(^@IxH#RdONkT0r0YMB5zg}8!_QU`H literal 0 HcmV?d00001 From ec99aa05630e53bba700aea2e9c1e6b7665edfc6 Mon Sep 17 00:00:00 2001 From: Joel Male Date: Tue, 25 Feb 2025 14:53:49 +1000 Subject: [PATCH 3/7] feat: clean up and starting documentation --- README.md | 26 ++++++++++++- config/config.php | 22 +++++------ src/Cart.php | 50 +++++++++++++++++-------- src/CartServiceProvider.php | 21 ++++------- src/CartSession.php | 17 ++++----- tests/Helpers/ConfigConditionsMock.php | 3 +- tests/Helpers/ConfigMock.php | 1 + tests/Helpers/ConfigMockOtherFormat.php | 2 +- tests/Unit/CartTestEventsTest.php | 42 ++++++++++----------- 9 files changed, 111 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index 222964e..3c5fc6e 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,8 @@ ## Table of Contents - [Configuration](#configuration) - [Basic Usage](#basic-usage) - [Conditions](#conditions) - - [Items](#items) + - [Cart Items](#cart-items) + - [Database Support](#database-support) - [Credits](#-credits) - [License](#-license) @@ -684,6 +685,29 @@ ### Cart Items $item->getPriceSumWithConditions(); ``` +### Database Support + +Sometimes you might want to store the cart in the database so that the cart can be retrieved even after the user logs out or closes the browser. + +You may also find yourself wanting to add cart timeouts and support for multiple computers. + +To get started, you'll need to create a new model for your Cart, the package requires only 3 columns, but you're free to extend this as you wish: + +```php +$table->string('session_id'); +$table->text('items'); +$table->text('conditions'); +``` + +Then add some json casts to your model: + +```php +protected $casts = [ + 'items' => 'array', + 'conditions' => 'array', +]; +``` + ## 🫡 Credits This package was orignally created by [darryldecode](https://github.com/darryldecode) but has since seen almost no updates. I have decided to take the old package and transform it into a new package with new features and updates. diff --git a/config/config.php b/config/config.php index 56412ae..cebf9f3 100644 --- a/config/config.php +++ b/config/config.php @@ -14,18 +14,18 @@ /* * --------------------------------------------------------------- - * Persistence + * Storage * --------------------------------------------------------------- */ - 'storage' => null, - 'storage_id' => null, - 'storage_items' => null, - 'storage_conditions' => null, + 'driver' => 'session', - /* - * --------------------------------------------------------------- - * Events - * --------------------------------------------------------------- - */ - 'events' => null, + 'storage' => [ + 'session', + 'database' => [ + 'model' => '', + 'id' => '', + 'items' => '', + 'conditions' => '', + ], + ], ]; diff --git a/src/Cart.php b/src/Cart.php index 71bd7dd..24973ad 100644 --- a/src/Cart.php +++ b/src/Cart.php @@ -27,15 +27,38 @@ class Cart protected $decimals; protected $decPoint; - public function __construct($session, $events, $instanceName, $sessionKey, $config) + public function __construct($sessionStorage, $events, $instanceName, $sessionKey, $config) { + $this->validateConfig($config); + $this->events = $events; - $this->session = new CartSession($session, $sessionKey, $config); + $this->session = new CartSession($sessionStorage, $sessionKey, $config); $this->instanceName = $instanceName; $this->config = $config; $this->currentItemId = null; - $this->fireEvent('created'); + $this->fireEvent('Created'); + } + + private function validateConfig($config) + { + if ($config['driver'] == 'database') { + if (! isset($config['storage']['database']['model'])) { + throw new \Exception('You need to set a model for the database driver in the cart configuration.'); + } + + if (! isset($config['storage']['database']['id'])) { + throw new \Exception('You need to set an id (for the session) for the database driver in the cart configuration.'); + } + + if (! isset($config['storage']['database']['items'])) { + throw new \Exception('You need to set an items key for the database driver in the cart configuration.'); + } + + if (! isset($config['storage']['database']['conditions'])) { + throw new \Exception('You need to set a conditions key for the database driver in the cart configuration.'); + } + } } /** @@ -145,7 +168,7 @@ public function add( */ public function update(int|string $id, array $data): bool { - if ($this->fireEvent('updating', $data) === false) { + if ($this->fireEvent('Updating', $data) === false) { return false; } @@ -178,7 +201,7 @@ public function update(int|string $id, array $data): bool $this->save($cart); - $this->fireEvent('updated', $item); + $this->fireEvent('Updated', $item); return true; } @@ -237,7 +260,7 @@ public function remove($id) { $cart = $this->getContent(); - if ($this->fireEvent('removing', $id) === false) { + if ($this->fireEvent('Removing', $id) === false) { return false; } @@ -245,7 +268,7 @@ public function remove($id) $this->save($cart); - $this->fireEvent('removed', $id); + $this->fireEvent('Removed', $id); return true; } @@ -257,13 +280,13 @@ public function remove($id) */ public function clear() { - if ($this->fireEvent('clearing') === false) { + if ($this->fireEvent('Clearing') === false) { return false; } $this->session->putItems([]); - $this->fireEvent('cleared'); + $this->fireEvent('Cleared'); return true; } @@ -691,7 +714,7 @@ protected function validate($item) */ protected function addItem($id, $item) { - if ($this->fireEvent('adding', $item) === false) { + if ($this->fireEvent('Adding', $item) === false) { return false; } @@ -701,7 +724,7 @@ protected function addItem($id, $item) $this->save($cart); - $this->fireEvent('added', $item); + $this->fireEvent('Added', $item); return true; } @@ -792,12 +815,9 @@ public function setDecimals($decimals) $this->decimals = $decimals; } - /** - * @return mixed - */ protected function fireEvent($name, $value = []) { - return $this->events->dispatch($this->getInstanceName() . '.' . $name, array_values([$value, $this]), true); + return $this->events->dispatch('LaravelCart.' . $name, array_values([$value, $this]), true); } /** diff --git a/src/CartServiceProvider.php b/src/CartServiceProvider.php index ecd768b..4cb74db 100644 --- a/src/CartServiceProvider.php +++ b/src/CartServiceProvider.php @@ -35,24 +35,19 @@ public function register() $this->mergeConfigFrom(__DIR__ . '/../config/config.php', 'cart'); $this->app->singleton('cart', function ($app) { - $storageClass = config('cart.storage'); - $eventsClass = config('cart.events'); + $config = config('cart'); + $events = $app['events']; - $storage = $storageClass ? new $storageClass : $app['session']; - $events = $eventsClass ? new $eventsClass : $app['events']; - $instanceName = 'cart'; - - // default session or cart identifier. This will be overridden when calling Cart::session($sessionKey)->add() etc.. - // like when adding a cart for a specific user name. Session Key can be string or maybe a unique identifier to bind a cart - // to a specific user, this can also be a user ID - $session_key = '4yTlTDKu3oJOfzD'; + $storage = $config['driver'] === 'database' + ? new $config['storage']['database']['model'] + : $app['session']; return new Cart( $storage, $events, - $instanceName, - $session_key, - config('cart') + 'cart', + '4yTlTDKu3oJOfzD', + $config ); }); } diff --git a/src/CartSession.php b/src/CartSession.php index 8946ee4..4bd4a14 100644 --- a/src/CartSession.php +++ b/src/CartSession.php @@ -14,23 +14,22 @@ class CartSession public function __construct($session, $sessionKey, $config) { - if ($this->isInternalSession($session)) { + if ($config['driver'] === 'session') { $this->customStorage = false; $this->session = $session; $this->itemsKey = $sessionKey . '_cart_items'; $this->conditionsKey = $sessionKey . '_cart_conditions'; - } else { + } elseif ($config['driver'] === 'database') { $this->customStorage = true; - // @TODO validate these 3 exist - $this->sessionId = $config['storage_id']; - $this->itemsKey = $config['storage_items']; - $this->conditionsKey = $config['storage_conditions']; + $this->sessionId = $config['storage']['database']['id']; + $this->itemsKey = $config['storage']['database']['items']; + $this->conditionsKey = $config['storage']['database']['conditions']; - // get the base class to do findOrCreate - $this->session = $config['storage']; - $this->session = (new $this->session)->firstOrNew([$this->sessionId => $sessionKey]); + // find or create the session in the database + $this->session = $session->firstOrNew([$this->sessionId => $sessionKey]); + // initialize the items and conditions $this->session[$this->itemsKey] = $this->session[$this->itemsKey] ?? []; $this->session[$this->conditionsKey] = $this->session[$this->conditionsKey] ?? []; } diff --git a/tests/Helpers/ConfigConditionsMock.php b/tests/Helpers/ConfigConditionsMock.php index bf208ed..b5cd675 100644 --- a/tests/Helpers/ConfigConditionsMock.php +++ b/tests/Helpers/ConfigConditionsMock.php @@ -4,6 +4,5 @@ 'format_numbers' => true, 'decimals' => 2, 'dec_point' => '.', - 'thousands_sep' => ',', - 'use_cents' => false, + 'driver' => 'session', ]; diff --git a/tests/Helpers/ConfigMock.php b/tests/Helpers/ConfigMock.php index a2bf615..94c3538 100644 --- a/tests/Helpers/ConfigMock.php +++ b/tests/Helpers/ConfigMock.php @@ -4,4 +4,5 @@ 'format_numbers' => true, 'decimals' => 2, 'round_mode' => 'up', + 'driver' => 'session', ]; diff --git a/tests/Helpers/ConfigMockOtherFormat.php b/tests/Helpers/ConfigMockOtherFormat.php index 01cfec5..fc2323d 100644 --- a/tests/Helpers/ConfigMockOtherFormat.php +++ b/tests/Helpers/ConfigMockOtherFormat.php @@ -4,5 +4,5 @@ 'format_numbers' => false, 'decimals' => 3, 'dec_point' => ',', - 'thousands_sep' => '.', + 'driver' => 'session', ]; diff --git a/tests/Unit/CartTestEventsTest.php b/tests/Unit/CartTestEventsTest.php index 686de6a..80c0ef1 100644 --- a/tests/Unit/CartTestEventsTest.php +++ b/tests/Unit/CartTestEventsTest.php @@ -9,9 +9,9 @@ Mockery::close(); }); -test('event cart created', function () { +test('event cart Created', function () { $events = Mockery::mock('Illuminate\Contracts\Events\Dispatcher'); - $events->shouldReceive('dispatch')->once()->with('cart.created', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->once()->with('LaravelCart.Created', Mockery::type('array'), true); $cart = new Cart( new SessionMock, @@ -26,9 +26,9 @@ test('event cart adding', function () { $events = Mockery::mock('Illuminate\Events\Dispatcher'); - $events->shouldReceive('dispatch')->once()->with('cart.created', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->once()->with('cart.adding', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->once()->with('cart.added', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->once()->with('LaravelCart.Created', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->once()->with('LaravelCart.Adding', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->once()->with('LaravelCart.Added', Mockery::type('array'), true); $cart = new Cart( new SessionMock, @@ -45,9 +45,9 @@ test('event cart adding multiple times', function () { $events = Mockery::mock('Illuminate\Events\Dispatcher'); - $events->shouldReceive('dispatch')->once()->with('cart.created', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->times(2)->with('cart.adding', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->times(2)->with('cart.added', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->once()->with('LaravelCart.Created', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->times(2)->with('LaravelCart.Adding', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->times(2)->with('LaravelCart.Added', Mockery::type('array'), true); $cart = new Cart( new SessionMock, @@ -65,9 +65,9 @@ test('event cart adding multiple times scenario two', function () { $events = Mockery::mock('Illuminate\Events\Dispatcher'); - $events->shouldReceive('dispatch')->once()->with('cart.created', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->times(3)->with('cart.adding', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->times(3)->with('cart.added', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->once()->with('LaravelCart.Created', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->times(3)->with('LaravelCart.Adding', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->times(3)->with('LaravelCart.Added', Mockery::type('array'), true); $items = [ [ @@ -108,11 +108,11 @@ test('event cart remove item', function () { $events = Mockery::mock('Illuminate\Events\Dispatcher'); - $events->shouldReceive('dispatch')->once()->with('cart.created', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->times(3)->with('cart.adding', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->times(3)->with('cart.added', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->times(1)->with('cart.removing', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->times(1)->with('cart.removed', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->once()->with('LaravelCart.Created', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->times(3)->with('LaravelCart.Adding', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->times(3)->with('LaravelCart.Added', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->times(1)->with('LaravelCart.Removing', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->times(1)->with('LaravelCart.Removed', Mockery::type('array'), true); $items = [ [ @@ -155,11 +155,11 @@ test('event cart clear', function () { $events = Mockery::mock('Illuminate\Events\Dispatcher'); - $events->shouldReceive('dispatch')->once()->with('cart.created', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->times(3)->with('cart.adding', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->times(3)->with('cart.added', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->once()->with('cart.clearing', Mockery::type('array'), true); - $events->shouldReceive('dispatch')->once()->with('cart.cleared', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->once()->with('LaravelCart.Created', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->times(3)->with('LaravelCart.Adding', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->times(3)->with('LaravelCart.Added', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->once()->with('LaravelCart.Clearing', Mockery::type('array'), true); + $events->shouldReceive('dispatch')->once()->with('LaravelCart.Cleared', Mockery::type('array'), true); $items = [ [ From 0f07b9ae8a453bc7e1067275662398acc7887391 Mon Sep 17 00:00:00 2001 From: Joel Male Date: Tue, 25 Feb 2025 16:03:17 +1000 Subject: [PATCH 4/7] feat: database support --- README.md | 137 +- composer.json | 13 +- composer.lock | 5388 ++++++++++++++++++++++---- phpunit.xml.dist | 3 + src/Cart.php | 31 +- src/CartServiceProvider.php | 2 +- src/CartSession.php | 21 +- tests/Helpers/ConfigDatabaseMock.php | 17 + tests/Helpers/MockCartModel.php | 23 + tests/Pest.php | 28 +- tests/TestCase.php | 46 +- tests/Unit/DatabaseCartTest.php | 55 + 12 files changed, 4882 insertions(+), 882 deletions(-) create mode 100644 tests/Helpers/ConfigDatabaseMock.php create mode 100644 tests/Helpers/MockCartModel.php create mode 100644 tests/Unit/DatabaseCartTest.php diff --git a/README.md b/README.md index 3c5fc6e..35376be 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ ## Table of Contents - [Conditions](#conditions) - [Cart Items](#cart-items) - [Database Support](#database-support) + - [Events](#events) - [Credits](#-credits) - [License](#-license) @@ -685,29 +686,149 @@ ### Cart Items $item->getPriceSumWithConditions(); ``` -### Database Support +### Storage Options -Sometimes you might want to store the cart in the database so that the cart can be retrieved even after the user logs out or closes the browser. +By default the cart is stored in the session, but there are times you may want to store the cart in the database. -You may also find yourself wanting to add cart timeouts and support for multiple computers. +For instance, you may want to store the cart in the database so that the cart can be retrieved even after the user logs out or closes the browser, or you may want to add cart timeouts and support for multiple computers. -To get started, you'll need to create a new model for your Cart, the package requires only 3 columns, but you're free to extend this as you wish: +#### Session + +The cart is stored in the session by default, using Laravel's in-built SessionManager. + +#### Database Support + +To get started, you'll need to create a new model for your Cart, the package requires only 3 columns, but you're free to extend this as you wish and add more columns. + +You can utilise the [events](#events) provided by the package to store additional information alongside the cart. ```php -$table->string('session_id'); -$table->text('items'); -$table->text('conditions'); +$table->string('session_id'); // this handles the session id of the cart +$table->text('items'); // this will store the cart items +$table->text('conditions'); // this will store the cart level conditions ``` -Then add some json casts to your model: +Then add some json casts to your model and fillable columns: ```php +protected $guarded = []; + protected $casts = [ 'items' => 'array', 'conditions' => 'array', ]; ``` +Then update the configuration file to use the database driver: + +```php +'driver' => 'database', + +'storage' => [ + 'session', + 'database' => [ + 'model' => \App\Models\Cart::class, // your model here + 'id' => 'session_id', + 'items' => 'items', + 'conditions' => 'conditions', + ], +], +``` + +### Events + +The package provides a few events that you can listen to in order to manipulate the cart or take actions based on cart events. + +#### LaravelCart.Created + +This fires every time a cart is instantiated (i.e every time \Cart::add() is called) + +``` +Event::listen('LaravelCart.Added', function () { + // cart was created +}); +``` + +#### LaravelCart.Adding + +This fires every time an item is being added to the cart + +``` +Event::listen('LaravelCart.Adding', function ($item) { + // item is being added +}); +``` + +#### LaravelCart.Added + +This fires every time an item is successfully added to the cart + +``` +Event::listen('LaravelCart.Added', function ($item) { + // item was added +}); +``` + +#### LaravelCart.Updating + +This fires every time an item is being updated + +``` +Event::listen('LaravelCart.Updating', function ($item) { + // item is being updated +}); +``` + +#### LaravelCart.Updated + +This fires every time an item is successfully updated + +``` +Event::listen('LaravelCart.Updated', function ($item) { + // item was updated +}); +``` + +#### LaravelCart.Removing + +This fires every time an item is being removed + +``` +Event::listen('LaravelCart.Removing', function ($item) { + // item is being removed +}); +``` + +#### LaravelCart.Removed + +This fires every time an item is successfully removed + +``` +Event::listen('LaravelCart.Removed', function ($item) { + // item was removed +}); +``` + +#### LaravelCart.Clearing + +This fires every time the cart is being cleared + +``` +Event::listen('LaravelCart.Clearing', function () { + // cart is being cleared +}); +``` + +#### LaravelCart.Cleared + +This fires every time the cart is successfully cleared + +``` +Event::listen('LaravelCart.Cleared', function () { + // cart was cleared +}); +``` + ## 🫡 Credits This package was orignally created by [darryldecode](https://github.com/darryldecode) but has since seen almost no updates. I have decided to take the old package and transform it into a new package with new features and updates. diff --git a/composer.json b/composer.json index 3816788..52df40f 100644 --- a/composer.json +++ b/composer.json @@ -21,20 +21,31 @@ "require": { "php": ">=8.2", "illuminate/support": "^10.0|^11.0|^12.0", + "illuminate/auth": "^10.0|^11.0|^12.0", + "illuminate/container": "^10.0|^11.0|^12.0", + "illuminate/contracts": "^10.0|^11.0|^12.0", + "illuminate/database": "^10.0|^11.0|^12.0", "illuminate/validation": "^10.0|^11.0|^12.0", "illuminate/translation": "^10.0|^11.0|^12.0" }, "require-dev": { "mockery/mockery": "^1.4.2", "laravel/pint": "^1.21", + "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0|^10.0", "pestphp/pest": "^3.0", - "larapack/dd": "dev-master" + "larapack/dd": "dev-master", + "illuminate/testing": "*" }, "autoload": { "psr-4": { "Joelwmale\\Cart\\": "src/" } }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, "minimum-stability": "dev", "extra": { "laravel": { diff --git a/composer.lock b/composer.lock index a2d2864..a46bd5c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3177332c8f53e0104abe4aa29e537ce4", + "content-hash": "065b782e76310ad3b044dda79ab5038e", "packages": [ { "name": "brick/math", @@ -135,6 +135,82 @@ ], "time": "2024-02-09T16:56:22+00:00" }, + { + "name": "dflydev/dot-access-data", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, { "name": "doctrine/inflector", "version": "2.1.x-dev", @@ -303,6 +379,71 @@ ], "time": "2024-07-29T08:29:21+00:00" }, + { + "name": "dragonmantank/cron-expression", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "f37e405332cd1cca9d287f5044ae2a72c2f53239" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/f37e405332cd1cca9d287f5044ae2a72c2f53239", + "reference": "f37e405332cd1cca9d287f5044ae2a72c2f53239", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/master" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2024-10-21T12:57:55+00:00" + }, { "name": "egulias/email-validator", "version": "4.x-dev", @@ -372,41 +513,38 @@ "time": "2024-12-31T15:29:41+00:00" }, { - "name": "illuminate/collections", - "version": "12.x-dev", + "name": "fruitcake/php-cors", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/illuminate/collections.git", - "reference": "a7dc526f2279c4ddac69e296842db90626820157" + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "6d8900646a4d9b15c4ef12ecb43c2b383b0a5b43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/a7dc526f2279c4ddac69e296842db90626820157", - "reference": "a7dc526f2279c4ddac69e296842db90626820157", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/6d8900646a4d9b15c4ef12ecb43c2b383b0a5b43", + "reference": "6d8900646a4d9b15c4ef12ecb43c2b383b0a5b43", "shasum": "" }, "require": { - "illuminate/conditionable": "^12.0", - "illuminate/contracts": "^12.0", - "illuminate/macroable": "^12.0", - "php": "^8.2" + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" }, - "suggest": { - "symfony/var-dumper": "Required to use the dump method (^7.2)." + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" }, + "default-branch": true, "type": "library", "extra": { "branch-alias": { - "dev-master": "12.x-dev" + "dev-master": "1.3-dev" } }, "autoload": { - "files": [ - "functions.php", - "helpers.php" - ], "psr-4": { - "Illuminate\\Support\\": "" + "Fruitcake\\Cors\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -415,44 +553,63 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" } ], - "description": "The Illuminate Collections package.", - "homepage": "https://laravel.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/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/master" }, - "time": "2025-02-19T22:50:56+00:00" + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2024-11-19T11:35:11+00:00" }, { - "name": "illuminate/conditionable", - "version": "12.x-dev", + "name": "graham-campbell/result-type", + "version": "1.1.x-dev", "source": { "type": "git", - "url": "https://github.com/illuminate/conditionable.git", - "reference": "a2b3c66f3ca532e12e694bd5c9254adc303b922d" + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "9d6c1d7ce69a3329936e603617e59ba205ab0a66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/conditionable/zipball/a2b3c66f3ca532e12e694bd5c9254adc303b922d", - "reference": "a2b3c66f3ca532e12e694bd5c9254adc303b922d", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/9d6c1d7ce69a3329936e603617e59ba205ab0a66", + "reference": "9d6c1d7ce69a3329936e603617e59ba205ab0a66", "shasum": "" }, "require": { - "php": "^8.2" + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" }, + "require-dev": { + "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" + }, + "default-branch": true, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, "autoload": { "psr-4": { - "Illuminate\\Support\\": "" + "GrahamCampbell\\ResultType\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -461,164 +618,87 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" } ], - "description": "The Illuminate Conditionable package.", - "homepage": "https://laravel.com", + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/1.1" }, - "time": "2025-02-19T19:08:33+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2025-02-09T22:43:44+00:00" }, { - "name": "illuminate/container", - "version": "12.x-dev", + "name": "guzzlehttp/guzzle", + "version": "7.9.x-dev", "source": { "type": "git", - "url": "https://github.com/illuminate/container.git", - "reference": "2f99ed909d7439d5298b85e2f51d3965aa77e5a9" + "url": "https://github.com/guzzle/guzzle.git", + "reference": "41f5ce75250c5c3af5a4bb2410143ddfede8127c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/container/zipball/2f99ed909d7439d5298b85e2f51d3965aa77e5a9", - "reference": "2f99ed909d7439d5298b85e2f51d3965aa77e5a9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41f5ce75250c5c3af5a4bb2410143ddfede8127c", + "reference": "41f5ce75250c5c3af5a4bb2410143ddfede8127c", "shasum": "" }, "require": { - "illuminate/contracts": "^12.0", - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1" + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "provide": { - "psr/container-implementation": "1.1|2.0" + "psr/http-client-implementation": "1.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Container\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Container package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-02-17T16:39:31+00:00" - }, - { - "name": "illuminate/contracts", - "version": "12.x-dev", - "source": { - "type": "git", - "url": "https://github.com/illuminate/contracts.git", - "reference": "bd1fb3b0dacf0d399b9c39dba89f8cda345218e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/bd1fb3b0dacf0d399b9c39dba89f8cda345218e6", - "reference": "bd1fb3b0dacf0d399b9c39dba89f8cda345218e6", - "shasum": "" - }, - "require": { - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1", - "psr/simple-cache": "^1.0|^2.0|^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Contracts\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Contracts package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-02-17T16:39:31+00:00" - }, - { - "name": "illuminate/filesystem", - "version": "12.x-dev", - "source": { - "type": "git", - "url": "https://github.com/illuminate/filesystem.git", - "reference": "b0991dd483bae9645633f38ad61287d20e18c413" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/filesystem/zipball/b0991dd483bae9645633f38ad61287d20e18c413", - "reference": "b0991dd483bae9645633f38ad61287d20e18c413", - "shasum": "" - }, - "require": { - "illuminate/collections": "^12.0", - "illuminate/contracts": "^12.0", - "illuminate/macroable": "^12.0", - "illuminate/support": "^12.0", - "php": "^8.2", - "symfony/finder": "^7.2.0" + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { - "ext-fileinfo": "Required to use the Filesystem class.", - "ext-ftp": "Required to use the Flysystem FTP driver.", - "ext-hash": "Required to use the Filesystem class.", - "illuminate/http": "Required for handling uploaded files (^12.0).", - "league/flysystem": "Required to use the Flysystem local driver (^3.25.1).", - "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", - "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", - "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", - "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", - "symfony/mime": "Required to enable support for guessing extensions (^7.2)." + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" }, + "default-branch": true, "type": "library", "extra": { - "branch-alias": { - "dev-master": "12.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "files": [ - "functions.php" + "src/functions_include.php" ], "psr-4": { - "Illuminate\\Filesystem\\": "" + "GuzzleHttp\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -627,44 +707,105 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], - "description": "The Illuminate Filesystem package.", - "homepage": "https://laravel.com", + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9" }, - "time": "2025-02-19T22:50:56+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-02-03T10:53:14+00:00" }, { - "name": "illuminate/macroable", - "version": "12.x-dev", + "name": "guzzlehttp/promises", + "version": "2.0.x-dev", "source": { "type": "git", - "url": "https://github.com/illuminate/macroable.git", - "reference": "e862e5648ee34004fa56046b746f490dfa86c613" + "url": "https://github.com/guzzle/promises.git", + "reference": "90c5be4a7c8374e8079c06232b07eb6e5cbbfdf3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/macroable/zipball/e862e5648ee34004fa56046b746f490dfa86c613", - "reference": "e862e5648ee34004fa56046b746f490dfa86c613", + "url": "https://api.github.com/repos/guzzle/promises/zipball/90c5be4a7c8374e8079c06232b07eb6e5cbbfdf3", + "reference": "90c5be4a7c8374e8079c06232b07eb6e5cbbfdf3", "shasum": "" }, "require": { - "php": "^8.2" + "php": "^7.2.5 || ^8.0" }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "default-branch": true, "type": "library", "extra": { - "branch-alias": { - "dev-master": "12.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { - "Illuminate\\Support\\": "" + "GuzzleHttp\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -673,62 +814,422 @@ ], "authors": [ { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" } ], - "description": "The Illuminate Macroable package.", - "homepage": "https://laravel.com", + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0" }, - "time": "2024-07-23T16:31:01+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-02-03T10:48:03+00:00" }, { - "name": "illuminate/support", - "version": "12.x-dev", + "name": "guzzlehttp/psr7", + "version": "2.7.x-dev", "source": { "type": "git", - "url": "https://github.com/illuminate/support.git", - "reference": "6ce0835a5fa92db4322a3de8a6974983133bdddc" + "url": "https://github.com/guzzle/psr7.git", + "reference": "ca06f23f35cf0b70a6f56d3d95c51bbc1062fade" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/6ce0835a5fa92db4322a3de8a6974983133bdddc", - "reference": "6ce0835a5fa92db4322a3de8a6974983133bdddc", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/ca06f23f35cf0b70a6f56d3d95c51bbc1062fade", + "reference": "ca06f23f35cf0b70a6f56d3d95c51bbc1062fade", "shasum": "" }, "require": { - "doctrine/inflector": "^2.0", + "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" + }, + "default-branch": true, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7" + }, + "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": "2025-02-03T10:49:42+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "1.0.x-dev", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "30e286560c137526eccd4ce21b2de477ab0676d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/30e286560c137526eccd4ce21b2de477ab0676d2", + "reference": "30e286560c137526eccd4ce21b2de477ab0676d2", + "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" + }, + "default-branch": true, + "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.4" + }, + "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": "2025-02-03T10:55:03+00:00" + }, + { + "name": "laravel/framework", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "abf823f36b5cb31b910cbbb14225dccfeeb52263" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/abf823f36b5cb31b910cbbb14225dccfeeb52263", + "reference": "abf823f36b5cb31b910cbbb14225dccfeeb52263", + "shasum": "" + }, + "require": { + "brick/math": "^0.11|^0.12", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^3.2.1|^4.0", "ext-ctype": "*", "ext-filter": "*", + "ext-hash": "*", "ext-mbstring": "*", - "illuminate/collections": "^12.0", - "illuminate/conditionable": "^12.0", - "illuminate/contracts": "^12.0", - "illuminate/macroable": "^12.0", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.3.0", + "laravel/serializable-closure": "^1.3|^2.0", + "league/commonmark": "^2.6", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", "nesbot/carbon": "^3.8.4", + "nunomaduro/termwind": "^2.0", "php": "^8.2", + "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": "^7.2.0", + "symfony/error-handler": "^7.2.0", + "symfony/finder": "^7.2.0", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.2.0", + "symfony/mailer": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.31", + "symfony/process": "^7.2.0", + "symfony/routing": "^7.2.0", + "symfony/uid": "^7.2.0", + "symfony/var-dumper": "^7.2.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", "voku/portable-ascii": "^2.0.2" }, "conflict": { "tightenco/collect": "<5.5.33" }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "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", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", "spatie/once": "*" }, - "suggest": { - "illuminate/filesystem": "Required to use the Composer class (^12.0).", - "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", - "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.6).", - "league/uri": "Required to use the Uri class (^7.5.1).", - "ramsey/uuid": "Required to use Str::uuid() (^4.7).", - "symfony/process": "Required to use the Composer class (^7.2).", - "symfony/uid": "Required to use Str::ulid() (^7.2).", - "symfony/var-dumper": "Required to use the dd function (^7.2).", - "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "laravel/pint": "^1.18", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "orchestra/testbench-core": "^10.0", + "pda/pheanstalk": "^5.0.6", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", + "predis/predis": "^2.3", + "resend/resend-php": "^0.10.0", + "symfony/cache": "^7.2.0", + "symfony/http-client": "^7.2.0", + "symfony/psr-http-message-bridge": "^7.2.0", + "symfony/translation": "^7.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.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "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 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|^6.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).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", + "predis/predis": "Required to use the predis connector (^2.3).", + "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 (^6.0|^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." + }, + "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -737,11 +1238,22 @@ }, "autoload": { "files": [ - "functions.php", - "helpers.php" + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" ], "psr-4": { - "Illuminate\\Support\\": "" + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] } }, "notification-url": "https://packagist.org/downloads/", @@ -754,107 +1266,112 @@ "email": "taylor@laravel.com" } ], - "description": "The Illuminate Support package.", + "description": "The Laravel Framework.", "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], "support": { "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-02-24T13:15:26+00:00" + "time": "2025-02-24T13:33:05+00:00" }, { - "name": "illuminate/translation", - "version": "12.x-dev", + "name": "laravel/prompts", + "version": "dev-main", "source": { "type": "git", - "url": "https://github.com/illuminate/translation.git", - "reference": "91da1d7c6e187860a42f2beba28bbea52ae0e931" + "url": "https://github.com/laravel/prompts.git", + "reference": "d474c3a6b857ea712e55988159026f2809166296" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/translation/zipball/91da1d7c6e187860a42f2beba28bbea52ae0e931", - "reference": "91da1d7c6e187860a42f2beba28bbea52ae0e931", + "url": "https://api.github.com/repos/laravel/prompts/zipball/d474c3a6b857ea712e55988159026f2809166296", + "reference": "d474c3a6b857ea712e55988159026f2809166296", "shasum": "" }, "require": { - "illuminate/collections": "^12.0", - "illuminate/contracts": "^12.0", - "illuminate/filesystem": "^12.0", - "illuminate/macroable": "^12.0", - "illuminate/support": "^12.0", - "php": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "12.x-dev" - } - }, - "autoload": { - "psr-4": { - "Illuminate\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Illuminate Translation package.", - "homepage": "https://laravel.com", - "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" - }, - "time": "2025-02-18T15:38:29+00:00" - }, - { - "name": "illuminate/validation", - "version": "12.x-dev", - "source": { - "type": "git", - "url": "https://github.com/illuminate/validation.git", - "reference": "568bef44f3c65f127f8fa2f04cd6689b53237c71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/illuminate/validation/zipball/568bef44f3c65f127f8fa2f04cd6689b53237c71", - "reference": "568bef44f3c65f127f8fa2f04cd6689b53237c71", - "shasum": "" - }, - "require": { - "brick/math": "^0.11|^0.12", - "egulias/email-validator": "^3.2.5|^4.0", - "ext-filter": "*", + "composer-runtime-api": "^2.2", "ext-mbstring": "*", - "illuminate/collections": "^12.0", - "illuminate/container": "^12.0", - "illuminate/contracts": "^12.0", - "illuminate/macroable": "^12.0", - "illuminate/support": "^12.0", - "illuminate/translation": "^12.0", - "php": "^8.2", - "symfony/http-foundation": "^7.2", - "symfony/mime": "^7.2" + "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": { + "illuminate/collections": "^10.0|^11.0|^12.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" }, "suggest": { - "illuminate/database": "Required to use the database presence verifier (^12.0).", - "ramsey/uuid": "Required to use Validator::validateUuid() (^4.7)." + "ext-pcntl": "Required for the spinner to be animated." }, + "default-branch": true, "type": "library", "extra": { "branch-alias": { - "dev-master": "12.x-dev" + "dev-main": "0.3.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/main" + }, + "time": "2025-02-12T01:46:58+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "1327ae37c2e0a1a9864b7188cf9c27995e555e68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/1327ae37c2e0a1a9864b7188cf9c27995e555e68", + "reference": "1327ae37c2e0a1a9864b7188cf9c27995e555e68", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" } }, "autoload": { "psr-4": { - "Illuminate\\Validation\\": "" + "Laravel\\SerializableClosure\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -865,15 +1382,686 @@ { "name": "Taylor Otwell", "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" } ], - "description": "The Illuminate Validation package.", - "homepage": "https://laravel.com", + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], "support": { - "issues": "https://github.com/laravel/framework/issues", - "source": "https://github.com/laravel/framework" + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" }, - "time": "2025-02-19T22:50:56+00:00" + "time": "2025-02-12T01:45:10+00:00" + }, + { + "name": "league/commonmark", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "01ad002b538ff3164e954d5ce15ec59d270c068c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/01ad002b538ff3164e954d5ce15ec59d270c068c", + "reference": "01ad002b538ff3164e954d5ce15ec59d270c068c", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "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 || ^2.0", + "nyholm/psr7": "^1.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 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^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" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2025-02-23T10:38:56+00:00" + }, + { + "name": "league/config", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "708b87250055f20a21cc6dbe232369b79a71a4fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/708b87250055f20a21cc6dbe232369b79a71a4fa", + "reference": "708b87250055f20a21cc6dbe232369b79a71a4fa", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5 || ^10.0.0 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2024-09-23T00:17:42+00:00" + }, + { + "name": "league/flysystem", + "version": "3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "9d6fc2cf27bf7525e50e0a109e5f768a17038670" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9d6fc2cf27bf7525e50e0a109e5f768a17038670", + "reference": "9d6fc2cf27bf7525e50e0a109e5f768a17038670", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "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": { + "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|^2", + "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|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.x" + }, + "time": "2025-02-11T19:47:21+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" + }, + "time": "2024-08-09T21:24:39+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "league/uri", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "bace4da7296808d22043c585192b71c4bf47d83e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/bace4da7296808d22043c585192b71c4bf47d83e", + "reference": "bace4da7296808d22043c585192b71c4bf47d83e", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.6", + "php": "^8.1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", + "league/uri-components": "Needed to easily manipulate URI objects components", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle WHATWG URL", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/master" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2025-01-25T19:52:43+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "3efb68920c63580186e589c130c95a5ac96465b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/3efb68920c63580186e589c130c95a5ac96465b7", + "reference": "3efb68920c63580186e589c130c95a5ac96465b7", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-factory": "^1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle WHATWG URL", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common interfaces and classes for URI representation and interaction", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/master" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2025-01-25T14:02:31+00:00" + }, + { + "name": "monolog/monolog", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "548eeb3f1e313d943712b9fab0dc2e865a5a7bfc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/548eeb3f1e313d943712b9fab0dc2e865a5a7bfc", + "reference": "548eeb3f1e313d943712b9fab0dc2e865a5a7bfc", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/main" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2025-02-03T10:34:40+00:00" }, { "name": "nesbot/carbon", @@ -982,6 +2170,319 @@ ], "time": "2025-02-20T17:33:38+00:00" }, + { + "name": "nette/schema", + "version": "v1.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.4" + }, + "require-dev": { + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3" + }, + "time": "2024-10-06T23:10:23+00:00" + }, + { + "name": "nette/utils", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "be534713c227aeef57ce1883fc17bc9f9e29eca2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/be534713c227aeef57ce1883fc17bc9f9e29eca2", + "reference": "be534713c227aeef57ce1883fc17bc9f9e29eca2", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "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()" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/master" + }, + "time": "2025-02-03T00:58:56+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/52915afe6a1044e8b9cee1bcff836fb63acf9cda", + "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.1.8" + }, + "require-dev": { + "illuminate/console": "^11.33.2", + "laravel/pint": "^1.18.2", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0", + "phpstan/phpstan": "^1.12.11", + "phpstan/phpstan-strict-rules": "^1.6.1", + "symfony/var-dumper": "^7.1.8", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.0" + }, + "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": "2024-11-21T10:39:51+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "default-branch": true, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:41:07+00:00" + }, { "name": "psr/clock", "version": "1.0.0", @@ -1084,6 +2585,272 @@ }, "time": "2023-09-22T11:11:30+00:00" }, + { + "name": "psr/event-dispatcher", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "bbd9eacc080d33861e5b5c75b3b8c4d7e6d01874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/bbd9eacc080d33861e5b5c75b3b8c4d7e6d01874", + "reference": "bbd9eacc080d33861e5b5c75b3b8c4d7e6d01874", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "suggest": { + "fig/event-dispatcher-util": "Provides some useful PSR-14 utilities" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "source": "https://github.com/php-fig/event-dispatcher" + }, + "time": "2024-03-17T21:29:03+00:00" + }, + { + "name": "psr/http-client", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, { "name": "psr/simple-cache", "version": "dev-master", @@ -1136,6 +2903,232 @@ }, "time": "2022-04-08T16:41:45+00:00" }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "99fc2f461452e2f4243d70f9099c4dd2b1c2bffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/99fc2f461452e2f4243d70f9099c4dd2b1c2bffd", + "reference": "99fc2f461452e2f4243d70f9099c4dd2b1c2bffd", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "default-branch": true, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.x" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-11-25T21:13:53+00:00" + }, { "name": "symfony/clock", "version": "7.3.x-dev", @@ -1210,6 +3203,165 @@ ], "time": "2024-09-25T14:21:43+00:00" }, + { + "name": "symfony/console", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "eec43776d7ed956cbcc4ce92f7331c72fbf02040" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/eec43776d7ed956cbcc4ce92f7331c72fbf02040", + "reference": "eec43776d7ed956cbcc4ce92f7331c72fbf02040", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/7.3" + }, + "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": "2025-02-06T08:27:43+00:00" + }, + { + "name": "symfony/css-selector", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.2.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-09-25T14:21:43+00:00" + }, { "name": "symfony/deprecation-contracts", "version": "dev-main", @@ -1278,6 +3430,238 @@ ], "time": "2024-09-25T14:21:43+00:00" }, + { + "name": "symfony/error-handler", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "d916392aa2e658ce1df0ac34ec69a11f5d57b3c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/d916392aa2e658ce1df0ac34ec69a11f5d57b3c0", + "reference": "d916392aa2e658ce1df0ac34ec69a11f5d57b3c0", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/7.3" + }, + "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": "2025-02-02T20:28:54+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.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-09-25T14:21:43+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, { "name": "symfony/finder", "version": "7.3.x-dev", @@ -1420,6 +3804,200 @@ ], "time": "2025-02-06T06:06:26+00:00" }, + { + "name": "symfony/http-kernel", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "cb1eeade523fd4daae0b053678bca1361b4465e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cb1eeade523fd4daae0b053678bca1361b4465e3", + "reference": "cb1eeade523fd4daae0b053678bca1361b4465e3", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/7.3" + }, + "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": "2025-02-07T08:14:01+00:00" + }, + { + "name": "symfony/mailer", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "879d6df416d927894bb0e0423fa1e324aa264f20" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/879d6df416d927894bb0e0423fa1e324aa264f20", + "reference": "879d6df416d927894bb0e0423fa1e324aa264f20", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/mime": "^7.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/twig-bridge": "^6.4|^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/7.3" + }, + "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": "2025-02-11T07:45:17+00:00" + }, { "name": "symfony/mime", "version": "7.3.x-dev", @@ -1504,6 +4082,165 @@ ], "time": "2025-02-19T08:51:26+00:00" }, + { + "name": "symfony/polyfill-ctype", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.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-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.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-09-09T11:45:10+00:00" + }, { "name": "symfony/polyfill-intl-idn", "version": "1.x-dev", @@ -1752,6 +4489,87 @@ ], "time": "2024-12-23T08:48:59+00:00" }, + { + "name": "symfony/polyfill-php80", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/1.x" + }, + "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": "2025-01-02T08:10:11+00:00" + }, { "name": "symfony/polyfill-php83", "version": "1.x-dev", @@ -1829,6 +4647,399 @@ ], "time": "2024-09-09T11:45:10+00:00" }, + { + "name": "symfony/polyfill-uuid", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.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-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "2b42be26326a4fae4313751b40a2ecb60e619311" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/2b42be26326a4fae4313751b40a2ecb60e619311", + "reference": "2b42be26326a4fae4313751b40a2ecb60e619311", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/7.3" + }, + "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": "2025-02-14T16:23:49+00:00" + }, + { + "name": "symfony/routing", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "7c910761bef0ee0f86139ffaf2b7bcd6afc1990c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/7c910761bef0ee0f86139ffaf2b7bcd6afc1990c", + "reference": "7c910761bef0ee0f86139ffaf2b7bcd6afc1990c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "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": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/7.3" + }, + "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": "2025-01-25T08:29:00+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "5ad38698559cf88b6296629e19b15ef3239c9d7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/5ad38698559cf88b6296629e19b15ef3239c9d7a", + "reference": "5ad38698559cf88b6296629e19b15ef3239c9d7a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "default-branch": true, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/main" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/string", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "a75110076ac661a4a52792b5a1d286d113653a70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/a75110076ac661a4a52792b5a1d286d113653a70", + "reference": "a75110076ac661a4a52792b5a1d286d113653a70", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/7.3" + }, + "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": "2025-02-24T14:05:52+00:00" + }, { "name": "symfony/translation", "version": "7.3.x-dev", @@ -2003,6 +5214,305 @@ ], "time": "2024-09-27T08:32:26+00:00" }, + { + "name": "symfony/uid", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "f5e643aee01ab83011b08a466b5194131763dd3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/f5e643aee01ab83011b08a466b5194131763dd3e", + "reference": "f5e643aee01ab83011b08a466b5194131763dd3e", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^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/7.3" + }, + "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-12-07T08:11:28+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "7.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "9b59e65b4b07c04d4a33f209ec9347352ca7b0e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9b59e65b4b07c04d4a33f209ec9347352ca7b0e7", + "reference": "9b59e65b4b07c04d4a33f209ec9347352ca7b0e7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/7.3" + }, + "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": "2025-01-19T13:07:55+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" + }, + "time": "2024-12-21T16:25:41+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "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.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "default-branch": true, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:52:34+00:00" + }, { "name": "voku/portable-ascii", "version": "2.0.3", @@ -2172,6 +5682,88 @@ ], "time": "2024-12-11T14:50:44+00:00" }, + { + "name": "composer/semver", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, { "name": "doctrine/deprecations", "version": "1.1.x-dev", @@ -2218,6 +5810,69 @@ }, "time": "2025-02-10T14:53:34+00:00" }, + { + "name": "fakerphp/faker", + "version": "1.24.x-dev", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "f7ac50712e417f008402c8fc889c964e75eecfe9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/f7ac50712e417f008402c8fc889c964e75eecfe9", + "reference": "f7ac50712e417f008402c8fc889c964e75eecfe9", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "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" + }, + "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-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/1.24" + }, + "time": "2025-02-22T09:07:46+00:00" + }, { "name": "fidry/cpu-core-counter", "version": "1.2.0", @@ -2503,6 +6158,85 @@ }, "time": "2016-12-15T09:34:34+00:00" }, + { + "name": "laravel/pail", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "1caf314b89d851ed3235680db63072e5b830ba06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/1caf314b89d851ed3235680db63072e5b830ba06", + "reference": "1caf314b89d851ed3235680db63072e5b830ba06", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0", + "illuminate/contracts": "^10.24|^11.0|^12.0", + "illuminate/log": "^10.24|^11.0|^12.0", + "illuminate/process": "^10.24|^11.0|^12.0", + "illuminate/support": "^10.24|^11.0|^12.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "laravel/framework": "^10.24|^11.0|^12.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.0|^10.0", + "pestphp/pest": "^2.20|^3.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0", + "phpstan/phpstan": "^1.10", + "symfony/var-dumper": "^6.3|^7.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2025-02-12T01:31:45+00:00" + }, { "name": "laravel/pint", "version": "v1.21.0", @@ -2569,6 +6303,73 @@ }, "time": "2025-02-18T03:18:57+00:00" }, + { + "name": "laravel/tinker", + "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "102bfc19b79817022e9fb1d3dd235d43d42f1954" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/102bfc19b79817022e9fb1d3dd235d43d42f1954", + "reference": "102bfc19b79817022e9fb1d3dd235d43d42f1954", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.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|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + }, + "default-branch": true, + "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/2.x" + }, + "time": "2025-02-12T01:36:47+00:00" + }, { "name": "mockery/mockery", "version": "1.7.x-dev", @@ -2870,52 +6671,56 @@ "time": "2025-02-05T12:47:34+00:00" }, { - "name": "nunomaduro/termwind", - "version": "2.x-dev", + "name": "orchestra/canvas", + "version": "10.x-dev", "source": { "type": "git", - "url": "https://github.com/nunomaduro/termwind.git", - "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda" + "url": "https://github.com/orchestral/canvas.git", + "reference": "607aecbe8728c969466d82c27e179177db3bf417" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/52915afe6a1044e8b9cee1bcff836fb63acf9cda", - "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda", + "url": "https://api.github.com/repos/orchestral/canvas/zipball/607aecbe8728c969466d82c27e179177db3bf417", + "reference": "607aecbe8728c969466d82c27e179177db3bf417", "shasum": "" }, "require": { - "ext-mbstring": "*", + "composer-runtime-api": "^2.2", + "composer/semver": "^3.0", + "illuminate/console": "^12.0.1", + "illuminate/database": "^12.0.1", + "illuminate/filesystem": "^12.0.1", + "illuminate/support": "^12.0.1", + "orchestra/canvas-core": "^10.0.1", + "orchestra/sidekick": "^1.0.3", + "orchestra/testbench-core": "^10.0.1", "php": "^8.2", - "symfony/console": "^7.1.8" + "symfony/polyfill-php83": "^1.31", + "symfony/yaml": "^7.0.3" }, "require-dev": { - "illuminate/console": "^11.33.2", - "laravel/pint": "^1.18.2", - "mockery/mockery": "^1.6.12", - "pestphp/pest": "^2.36.0", - "phpstan/phpstan": "^1.12.11", - "phpstan/phpstan-strict-rules": "^1.6.1", - "symfony/var-dumper": "^7.1.8", - "thecodingmachine/phpstan-strict-rules": "^1.0.0" + "laravel/framework": "^12.0.1", + "laravel/pint": "^1.21", + "mockery/mockery": "^1.6.10", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^11.5.7", + "spatie/laravel-ray": "^1.39.1" }, "default-branch": true, + "bin": [ + "canvas" + ], "type": "library", "extra": { "laravel": { "providers": [ - "Termwind\\Laravel\\TermwindServiceProvider" + "Orchestra\\Canvas\\LaravelServiceProvider" ] - }, - "branch-alias": { - "dev-2.x": "2.x-dev" } }, "autoload": { - "files": [ - "src/Functions.php" - ], "psr-4": { - "Termwind\\": "src/" + "Orchestra\\Canvas\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2924,38 +6729,360 @@ ], "authors": [ { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" } ], - "description": "Its like Tailwind CSS, but for the console.", + "description": "Code Generators for Laravel Applications and Packages", + "support": { + "issues": "https://github.com/orchestral/canvas/issues", + "source": "https://github.com/orchestral/canvas/tree/10.x" + }, + "time": "2025-02-24T14:46:01+00:00" + }, + { + "name": "orchestra/canvas-core", + "version": "10.x-dev", + "source": { + "type": "git", + "url": "https://github.com/orchestral/canvas-core.git", + "reference": "c5741447620807a9ee4f54ccd2f57fb23914b6d6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/canvas-core/zipball/c5741447620807a9ee4f54ccd2f57fb23914b6d6", + "reference": "c5741447620807a9ee4f54ccd2f57fb23914b6d6", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "composer/semver": "^3.0", + "illuminate/console": "^12.0", + "illuminate/support": "^12.0", + "orchestra/sidekick": "^1.0.3", + "php": "^8.2", + "symfony/polyfill-php83": "^1.31" + }, + "require-dev": { + "laravel/framework": "^12.0", + "laravel/pint": "^1.21", + "mockery/mockery": "^1.6.10", + "orchestra/testbench-core": "^10.0", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^11.5.7", + "symfony/yaml": "^7.2" + }, + "default-branch": true, + "type": "library", + "extra": { + "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/10.x" + }, + "time": "2025-02-24T15:29:36+00:00" + }, + { + "name": "orchestra/sidekick", + "version": "1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/orchestral/sidekick.git", + "reference": "1f251f336afa92e4899b6916f52032ff8d5bc47a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/sidekick/zipball/1f251f336afa92e4899b6916f52032ff8d5bc47a", + "reference": "1f251f336afa92e4899b6916f52032ff8d5bc47a", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "php": "^8.0", + "symfony/polyfill-php83": "^1.31" + }, + "require-dev": { + "laravel/framework": "^9.52.16|^10.48.28|^11.42.1|^12.0|^13.0", + "laravel/pint": "^1.4", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^9.6|^10.0|^11.0", + "symfony/process": "^6.0|^7.0" + }, + "default-branch": true, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Orchestra\\Sidekick\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com" + } + ], + "description": "Packages Toolkit Utilities and Helpers for Laravel", + "support": { + "issues": "https://github.com/orchestral/sidekick/issues", + "source": "https://github.com/orchestral/sidekick/tree/v1.0.3" + }, + "time": "2025-02-20T12:05:57+00:00" + }, + { + "name": "orchestra/testbench", + "version": "10.x-dev", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench.git", + "reference": "b10f1dec6253a87961349e92ac1420c9aebfacd0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench/zipball/b10f1dec6253a87961349e92ac1420c9aebfacd0", + "reference": "b10f1dec6253a87961349e92ac1420c9aebfacd0", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.23", + "laravel/framework": "^12.0.1", + "mockery/mockery": "^1.6.10", + "orchestra/testbench-core": "^10.0.0", + "orchestra/workbench": "^10.0.0", + "php": "^8.2", + "phpunit/phpunit": "^11.5.3", + "symfony/process": "^7.2", + "symfony/yaml": "^7.2", + "vlucas/phpdotenv": "^5.6.1" + }, + "default-branch": true, + "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": [ - "cli", - "console", - "css", - "package", - "php", - "style" + "BDD", + "TDD", + "dev", + "laravel", + "laravel-packages", + "testing" ], "support": { - "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.3.0" + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench/tree/v10.0.0" }, - "funding": [ + "time": "2025-02-24T13:49:40+00:00" + }, + { + "name": "orchestra/testbench-core", + "version": "10.x-dev", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "c06dfb1195d5e09218665437038f96ae7afe6929" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/c06dfb1195d5e09218665437038f96ae7afe6929", + "reference": "c06dfb1195d5e09218665437038f96ae7afe6929", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "orchestra/sidekick": "^1.0.3", + "php": "^8.2", + "symfony/polyfill-php83": "^1.31", + "symfony/polyfill-php84": "^1.31" + }, + "conflict": { + "brianium/paratest": "<7.3.0 || >=8.0.0", + "laravel/framework": "<12.0.0 || >=13.0.0", + "laravel/serializable-closure": "<1.3.0 || >=3.0.0", + "nunomaduro/collision": "<8.0.0 || >=9.0.0", + "phpunit/phpunit": "<10.5.35 || >=11.0.0 <11.5.3 || 12.0.0 || >=12.1.0" + }, + "require-dev": { + "fakerphp/faker": "^1.24", + "laravel/framework": "^12.0.0", + "laravel/pint": "^1.21", + "laravel/serializable-closure": "^1.3 || ^2.0", + "mockery/mockery": "^1.6.10", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.5.35 || ^11.5.3 || ^12.0.1", + "spatie/laravel-ray": "^1.39.1", + "symfony/process": "^7.2.0", + "symfony/yaml": "^7.2.0", + "vlucas/phpdotenv": "^5.6.1" + }, + "suggest": { + "brianium/paratest": "Allow using parallel testing (^7.3).", + "ext-pcntl": "Required to use all features of the console signal trapping.", + "fakerphp/faker": "Allow using Faker for testing (^1.23).", + "laravel/framework": "Required for testing (^12.0.0).", + "mockery/mockery": "Allow using Mockery for testing (^1.6).", + "nunomaduro/collision": "Allow using Laravel style tests output and parallel testing (^8.0).", + "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^9.0).", + "phpunit/phpunit": "Allow using PHPUnit for testing (^10.5 || ^11.0 || ^12.0).", + "symfony/process": "Required to use Orchestra\\Testbench\\remote function (^7.2).", + "symfony/yaml": "Required for Testbench CLI (^7.2).", + "vlucas/phpdotenv": "Required for Testbench CLI (^5.4.1)." + }, + "default-branch": true, + "bin": [ + "testbench" + ], + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Orchestra\\Testbench\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://github.com/xiCO2k", - "type": "github" + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" } ], - "time": "2024-11-21T10:39:51+00:00" + "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": "2025-02-25T04:50:01+00:00" + }, + { + "name": "orchestra/workbench", + "version": "10.x-dev", + "source": { + "type": "git", + "url": "https://github.com/orchestral/workbench.git", + "reference": "da0cba53f414272d2238b80c3fe384ba5b9edcfc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/workbench/zipball/da0cba53f414272d2238b80c3fe384ba5b9edcfc", + "reference": "da0cba53f414272d2238b80c3fe384ba5b9edcfc", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "fakerphp/faker": "^1.23", + "laravel/framework": "^12.0.0", + "laravel/pail": "^1.2.2", + "laravel/tinker": "^2.10.1", + "nunomaduro/collision": "^8.6", + "orchestra/canvas": "^10.0.1", + "orchestra/sidekick": "^1.0.3", + "orchestra/testbench-core": "^10.0.0", + "php": "^8.2", + "symfony/polyfill-php83": "^1.31", + "symfony/polyfill-php84": "^1.31", + "symfony/process": "^7.2", + "symfony/yaml": "^7.2" + }, + "require-dev": { + "laravel/pint": "^1.21", + "mockery/mockery": "^1.6.10", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^11.5.3", + "spatie/laravel-ray": "^1.39.1" + }, + "suggest": { + "ext-pcntl": "Required to use all features of the console signal trapping." + }, + "default-branch": true, + "type": "library", + "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/10.x" + }, + "time": "2025-02-24T13:44:55+00:00" }, { "name": "pestphp/pest", @@ -4054,32 +8181,58 @@ "time": "2025-01-31T07:03:30+00:00" }, { - "name": "psr/log", - "version": "dev-master", + "name": "psy/psysh", + "version": "dev-main", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + "url": "https://github.com/bobthecow/psysh.git", + "reference": "6a5c8a21aa608aae8f838b4b03a196038bbaa726" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/6a5c8a21aa608aae8f838b4b03a196038bbaa726", + "reference": "6a5c8a21aa608aae8f838b4b03a196038bbaa726", "shasum": "" }, "require": { - "php": ">=8.0.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": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "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." }, "default-branch": true, + "bin": [ + "bin/psysh" + ], "type": "library", "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, "branch-alias": { - "dev-master": "3.x-dev" + "dev-main": "0.12.x-dev" } }, "autoload": { + "files": [ + "src/functions.php" + ], "psr-4": { - "Psr\\Log\\": "src" + "Psy\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -4088,21 +8241,24 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", "keywords": [ - "log", - "psr", - "psr-3" + "REPL", + "console", + "interactive", + "shell" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/main" }, - "time": "2024-09-11T13:17:53+00:00" + "time": "2025-01-27T06:15:00+00:00" }, { "name": "sebastian/cli-parser", @@ -5085,219 +9241,45 @@ "time": "2024-10-20T05:08:20+00:00" }, { - "name": "symfony/console", - "version": "7.3.x-dev", + "name": "symfony/polyfill-php84", + "version": "1.x-dev", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "eec43776d7ed956cbcc4ce92f7331c72fbf02040" + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "000df7860439609837bbe28670b0be15783b7fbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/eec43776d7ed956cbcc4ce92f7331c72fbf02040", - "reference": "eec43776d7ed956cbcc4ce92f7331c72fbf02040", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf", + "reference": "000df7860439609837bbe28670b0be15783b7fbf", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/dotenv": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/lock": "<6.4", - "symfony/process": "<6.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "php": ">=7.2" }, + "default-branch": true, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Console\\": "" + "Symfony\\Polyfill\\Php84\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/7.3" - }, - "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": "2025-02-06T08:27:43+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.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-09-09T11:45:10+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], "authors": [ { "name": "Nicolas Grekas", @@ -5308,18 +9290,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "grapheme", - "intl", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php84/tree/1.x" }, "funding": [ { @@ -5335,29 +9315,40 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-02-20T12:04:08+00:00" }, { - "name": "symfony/process", + "name": "symfony/yaml", "version": "7.3.x-dev", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "2b42be26326a4fae4313751b40a2ecb60e619311" + "url": "https://github.com/symfony/yaml.git", + "reference": "491c6ac3b64c3fde28df9b795b52db74567619e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/2b42be26326a4fae4313751b40a2ecb60e619311", - "reference": "2b42be26326a4fae4313751b40a2ecb60e619311", + "url": "https://api.github.com/repos/symfony/yaml/zipball/491c6ac3b64c3fde28df9b795b52db74567619e2", + "reference": "491c6ac3b64c3fde28df9b795b52db74567619e2", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Process\\": "" + "Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -5377,10 +9368,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Executes commands in sub-processes", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/7.3" + "source": "https://github.com/symfony/yaml/tree/7.3" }, "funding": [ { @@ -5396,262 +9387,7 @@ "type": "tidelift" } ], - "time": "2025-02-14T16:23:49+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "5ad38698559cf88b6296629e19b15ef3239c9d7a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/5ad38698559cf88b6296629e19b15ef3239c9d7a", - "reference": "5ad38698559cf88b6296629e19b15ef3239c9d7a", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "default-branch": true, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/main" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-25T14:21:43+00:00" - }, - { - "name": "symfony/string", - "version": "7.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "a75110076ac661a4a52792b5a1d286d113653a70" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/a75110076ac661a4a52792b5a1d286d113653a70", - "reference": "a75110076ac661a4a52792b5a1d286d113653a70", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/translation-contracts": "<2.5" - }, - "require-dev": { - "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/7.3" - }, - "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": "2025-02-24T14:05:52+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "7.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "9b59e65b4b07c04d4a33f209ec9347352ca7b0e7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9b59e65b4b07c04d4a33f209ec9347352ca7b0e7", - "reference": "9b59e65b4b07c04d4a33f209ec9347352ca7b0e7", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/console": "<6.4" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.12" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "support": { - "source": "https://github.com/symfony/var-dumper/tree/7.3" - }, - "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": "2025-01-19T13:07:55+00:00" + "time": "2025-02-04T14:29:11+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 4020e1b..c77bb5e 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -14,4 +14,7 @@ tests + + + diff --git a/src/Cart.php b/src/Cart.php index 24973ad..dee5865 100644 --- a/src/Cart.php +++ b/src/Cart.php @@ -15,11 +15,6 @@ class Cart protected $instanceName; - protected $customStorage = false; - protected $sessionKey; - protected $sessionKeyCartItems; - protected $sessionKeyCartConditions; - protected $config; protected $currentItemId; @@ -168,7 +163,7 @@ public function add( */ public function update(int|string $id, array $data): bool { - if ($this->fireEvent('Updating', $data) === false) { + if ($this->fireEvent('Updating', 'item', $data) === false) { return false; } @@ -201,7 +196,7 @@ public function update(int|string $id, array $data): bool $this->save($cart); - $this->fireEvent('Updated', $item); + $this->fireEvent('Updated', 'item', $item); return true; } @@ -260,7 +255,7 @@ public function remove($id) { $cart = $this->getContent(); - if ($this->fireEvent('Removing', $id) === false) { + if ($this->fireEvent('Removing', 'item', $id) === false) { return false; } @@ -268,7 +263,7 @@ public function remove($id) $this->save($cart); - $this->fireEvent('Removed', $id); + $this->fireEvent('Removed', 'item', $id); return true; } @@ -714,7 +709,7 @@ protected function validate($item) */ protected function addItem($id, $item) { - if ($this->fireEvent('Adding', $item) === false) { + if ($this->fireEvent('Adding', 'item', $item) === false) { return false; } @@ -724,7 +719,7 @@ protected function addItem($id, $item) $this->save($cart); - $this->fireEvent('Added', $item); + $this->fireEvent('Added', 'item', $item); return true; } @@ -815,9 +810,19 @@ public function setDecimals($decimals) $this->decimals = $decimals; } - protected function fireEvent($name, $value = []) + protected function fireEvent($name, $type = null, $data = null) { - return $this->events->dispatch('LaravelCart.' . $name, array_values([$value, $this]), true); + $eventData = [ + 'session_key' => $this->session->sessionKey, + 'session_driver' => $this->session->driver, + 'session_model' => $this->session->getSessionModel(), + ]; + + if ($type) { + $eventData[$type] = $data; + } + + return $this->events->dispatch('LaravelCart.' . $name, array_values([$eventData, $this]), true); } /** diff --git a/src/CartServiceProvider.php b/src/CartServiceProvider.php index 4cb74db..71e3506 100644 --- a/src/CartServiceProvider.php +++ b/src/CartServiceProvider.php @@ -46,7 +46,7 @@ public function register() $storage, $events, 'cart', - '4yTlTDKu3oJOfzD', + session()->getId(), $config ); }); diff --git a/src/CartSession.php b/src/CartSession.php index 4bd4a14..06dbeb2 100644 --- a/src/CartSession.php +++ b/src/CartSession.php @@ -6,6 +6,9 @@ class CartSession { private $customStorage; + public $sessionKey; + public $driver; + private $session; private $sessionId = null; @@ -14,12 +17,15 @@ class CartSession public function __construct($session, $sessionKey, $config) { - if ($config['driver'] === 'session') { + $this->sessionKey = $sessionKey; + $this->driver = $config['driver']; + + if ($this->driver === 'session') { $this->customStorage = false; $this->session = $session; - $this->itemsKey = $sessionKey . '_cart_items'; - $this->conditionsKey = $sessionKey . '_cart_conditions'; - } elseif ($config['driver'] === 'database') { + $this->itemsKey = $this->sessionKey . '_cart_items'; + $this->conditionsKey = $this->sessionKey . '_cart_conditions'; + } elseif ($this->driver === 'database') { $this->customStorage = true; $this->sessionId = $config['storage']['database']['id']; @@ -27,7 +33,7 @@ public function __construct($session, $sessionKey, $config) $this->conditionsKey = $config['storage']['database']['conditions']; // find or create the session in the database - $this->session = $session->firstOrNew([$this->sessionId => $sessionKey]); + $this->session = $session->firstOrNew([$this->sessionId => $this->sessionKey]); // initialize the items and conditions $this->session[$this->itemsKey] = $this->session[$this->itemsKey] ?? []; @@ -99,4 +105,9 @@ public function clear() return true; } + + public function getSessionModel() + { + return $this->session; + } } diff --git a/tests/Helpers/ConfigDatabaseMock.php b/tests/Helpers/ConfigDatabaseMock.php new file mode 100644 index 0000000..bf93d0d --- /dev/null +++ b/tests/Helpers/ConfigDatabaseMock.php @@ -0,0 +1,17 @@ + true, + 'decimals' => 2, + 'round_mode' => 'up', + 'driver' => 'database', + 'storage' => [ + 'session', + 'database' => [ + 'model' => \Joelwmale\Cart\Tests\Helpers\MockCartModel::class, + 'id' => 'session_id', + 'items' => 'items', + 'conditions' => 'conditions', + ], + ], +]; diff --git a/tests/Helpers/MockCartModel.php b/tests/Helpers/MockCartModel.php new file mode 100644 index 0000000..6093e61 --- /dev/null +++ b/tests/Helpers/MockCartModel.php @@ -0,0 +1,23 @@ + 'array', + 'conditions' => 'array', + ]; + + protected $table = 'carts'; +} diff --git a/tests/Pest.php b/tests/Pest.php index a0ebdc0..d47845c 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -1,29 +1,5 @@ extend(Tests\TestCase::class)->in('Feature'); - -/* -|-------------------------------------------------------------------------- -| Expectations -|-------------------------------------------------------------------------- -| -| When you're writing tests, you often need to check that values meet certain conditions. The -| "expect()" function gives you access to a set of "expectations" methods that you can use -| to assert different things. Of course, you may extend the Expectation API at any time. -| -*/ - -expect()->extend('toBeOne', function () { - return $this->toBe(1); -}); +uses(TestCase::class)->in(__DIR__); diff --git a/tests/TestCase.php b/tests/TestCase.php index cfb05b6..194658e 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -1,10 +1,52 @@ db = new DB($container); + $this->db->addConnection([ + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', + ]); + $this->db->setAsGlobal(); + $this->db->bootEloquent(); + $this->db->getConnection()->setEventDispatcher($dispatcher); + + // Run migrations (optional, for testing models) + $this->migrateDatabase(); + } + + protected function migrateDatabase() + { + $schema = $this->db->schema(); + + $schema->create('carts', function (Blueprint $table) { + $table->id(); + $table->string('session_id'); + $table->text('items'); + $table->text('conditions'); + $table->timestamps(); + }); + } } diff --git a/tests/Unit/DatabaseCartTest.php b/tests/Unit/DatabaseCartTest.php new file mode 100644 index 0000000..2e8a55f --- /dev/null +++ b/tests/Unit/DatabaseCartTest.php @@ -0,0 +1,55 @@ +shouldReceive('dispatch'); + + $storage = new MockCartModel; + + $this->cart = new Cart( + $storage, + $events, + 'cart', + 'SAMPLESESSIONKEY', + require (__DIR__ . '/../Helpers/ConfigDatabaseMock.php') + ); +}); + +afterEach(function () { + Mockery::close(); +}); + +describe('database cart', function () { + test('can add an item', function () { + $this->cart->add(1, 'Sample Item', 100.99, 2, []); + + expect($this->cart->isEmpty())->toBeFalse('Cart should not be empty'); + expect($this->cart->getContent()->count())->toEqual(1, 'Cart content should be 1'); + expect($this->cart->getContent()->first()['id'])->toEqual(1, 'Item added has ID of 1 so first content ID should be 1'); + expect($this->cart->getContent()->first()['price'])->toEqual(100.99, 'Item added has price of 100.99 so first content price should be 100.99'); + + expect(MockCartModel::all()->count())->toEqual(1, 'The carts database table should have 1 row'); + }); + + test('can add and remove an item', function () { + $this->cart->add(1, 'Sample Item', 100.99, 2, []); + + expect($this->cart->isEmpty())->toBeFalse('Cart should not be empty'); + expect($this->cart->getContent()->count())->toEqual(1, 'Cart content should be 1'); + expect($this->cart->getContent()->first()['id'])->toEqual(1, 'Item added has ID of 1 so first content ID should be 1'); + expect($this->cart->getContent()->first()['price'])->toEqual(100.99, 'Item added has price of 100.99 so first content price should be 100.99'); + + expect(MockCartModel::all()->count())->toEqual(1, 'The carts database table should have 1 row'); + + $this->cart->remove(1); + + $cartModel = MockCartModel::first(); + + expect($this->cart->isEmpty())->toBeTrue('Cart should be empty'); + expect($this->cart->getContent()->count())->toEqual(0, 'Cart content should be 0'); + expect($cartModel->items)->toEqual([], 'The carts database table should have 0 row'); + }); +}); From 158cf38f14dde623846ba32b271769f42445ced3 Mon Sep 17 00:00:00 2001 From: Joel Male Date: Tue, 25 Feb 2025 16:08:27 +1000 Subject: [PATCH 5/7] feat: update composer deps & version --- README.md | 4 +- composer.json | 12 +- composer.lock | 3773 ++++++++++++++----------------------------------- 3 files changed, 1057 insertions(+), 2732 deletions(-) diff --git a/README.md b/README.md index 35376be..44c705f 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ ### 🔥 Installing Install the package through [Composer](http://getcomposer.org/). -`composer require "joelwmale/laravel-cart"` +`composer require joelwmale/laravel-cart` ## 🧑‍🍳 Demo @@ -58,7 +58,7 @@ ## 🧑‍🍳 Demo \Cart::remove(1); // get the total of the cart -\$total = Cart::getTotal(); +$total = Cart::getTotal(); // clear it all when you've finished (like when you've stored the order) \Cart::clear(); diff --git a/composer.json b/composer.json index 52df40f..158bb78 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "joelwmale/laravel-cart", - "version": "1.1.0", + "version": "1.2.0", "description": "A cart implementation for Laravel", "keywords": [ "laravel", @@ -23,18 +23,14 @@ "illuminate/support": "^10.0|^11.0|^12.0", "illuminate/auth": "^10.0|^11.0|^12.0", "illuminate/container": "^10.0|^11.0|^12.0", - "illuminate/contracts": "^10.0|^11.0|^12.0", "illuminate/database": "^10.0|^11.0|^12.0", - "illuminate/validation": "^10.0|^11.0|^12.0", - "illuminate/translation": "^10.0|^11.0|^12.0" + "illuminate/validation": "^10.0|^11.0|^12.0" }, "require-dev": { - "mockery/mockery": "^1.4.2", + "mockery/mockery": "^1.6", "laravel/pint": "^1.21", - "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0|^10.0", "pestphp/pest": "^3.0", - "larapack/dd": "dev-master", - "illuminate/testing": "*" + "larapack/dd": "dev-master" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index a46bd5c..b5d4e06 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "065b782e76310ad3b044dda79ab5038e", + "content-hash": "f793be451d0e7ab030f23c46cb371171", "packages": [ { "name": "brick/math", @@ -135,82 +135,6 @@ ], "time": "2024-02-09T16:56:22+00:00" }, - { - "name": "dflydev/dot-access-data", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/dflydev/dflydev-dot-access-data.git", - "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", - "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.42", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", - "scrutinizer/ocular": "1.6.0", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.0.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Dflydev\\DotAccessData\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Dragonfly Development Inc.", - "email": "info@dflydev.com", - "homepage": "http://dflydev.com" - }, - { - "name": "Beau Simensen", - "email": "beau@dflydev.com", - "homepage": "http://beausimensen.com" - }, - { - "name": "Carlos Frutos", - "email": "carlos@kiwing.it", - "homepage": "https://github.com/cfrutos" - }, - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com" - } - ], - "description": "Given a deep data structure, access data by dot notation.", - "homepage": "https://github.com/dflydev/dflydev-dot-access-data", - "keywords": [ - "access", - "data", - "dot", - "notation" - ], - "support": { - "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", - "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" - }, - "time": "2024-07-08T12:26:09+00:00" - }, { "name": "doctrine/inflector", "version": "2.1.x-dev", @@ -379,71 +303,6 @@ ], "time": "2024-07-29T08:29:21+00:00" }, - { - "name": "dragonmantank/cron-expression", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "f37e405332cd1cca9d287f5044ae2a72c2f53239" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/f37e405332cd1cca9d287f5044ae2a72c2f53239", - "reference": "f37e405332cd1cca9d287f5044ae2a72c2f53239", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "replace": { - "mtdowling/cron-expression": "^1.0" - }, - "require-dev": { - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.0", - "phpunit/phpunit": "^7.0|^8.0|^9.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Cron\\": "src/Cron/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Tankersley", - "email": "chris@ctankersley.com", - "homepage": "https://github.com/dragonmantank" - } - ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], - "support": { - "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/master" - }, - "funding": [ - { - "url": "https://github.com/dragonmantank", - "type": "github" - } - ], - "time": "2024-10-21T12:57:55+00:00" - }, { "name": "egulias/email-validator", "version": "4.x-dev", @@ -584,69 +443,6 @@ ], "time": "2024-11-19T11:35:11+00:00" }, - { - "name": "graham-campbell/result-type", - "version": "1.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "9d6c1d7ce69a3329936e603617e59ba205ab0a66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/9d6c1d7ce69a3329936e603617e59ba205ab0a66", - "reference": "9d6c1d7ce69a3329936e603617e59ba205ab0a66", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.3" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" - }, - "default-branch": true, - "type": "library", - "autoload": { - "psr-4": { - "GrahamCampbell\\ResultType\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "An Implementation Of The Result Type", - "keywords": [ - "Graham Campbell", - "GrahamCampbell", - "Result Type", - "Result-Type", - "result" - ], - "support": { - "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/1.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", - "type": "tidelift" - } - ], - "time": "2025-02-09T22:43:44+00:00" - }, { "name": "guzzlehttp/guzzle", "version": "7.9.x-dev", @@ -1063,173 +859,34 @@ "time": "2025-02-03T10:55:03+00:00" }, { - "name": "laravel/framework", + "name": "illuminate/auth", "version": "12.x-dev", "source": { "type": "git", - "url": "https://github.com/laravel/framework.git", - "reference": "abf823f36b5cb31b910cbbb14225dccfeeb52263" + "url": "https://github.com/illuminate/auth.git", + "reference": "e54e976fa16e0f7b1e277b72fc6a204033e556a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/abf823f36b5cb31b910cbbb14225dccfeeb52263", - "reference": "abf823f36b5cb31b910cbbb14225dccfeeb52263", + "url": "https://api.github.com/repos/illuminate/auth/zipball/e54e976fa16e0f7b1e277b72fc6a204033e556a6", + "reference": "e54e976fa16e0f7b1e277b72fc6a204033e556a6", "shasum": "" }, "require": { - "brick/math": "^0.11|^0.12", - "composer-runtime-api": "^2.2", - "doctrine/inflector": "^2.0.5", - "dragonmantank/cron-expression": "^3.4", - "egulias/email-validator": "^3.2.1|^4.0", - "ext-ctype": "*", - "ext-filter": "*", "ext-hash": "*", - "ext-mbstring": "*", - "ext-openssl": "*", - "ext-session": "*", - "ext-tokenizer": "*", - "fruitcake/php-cors": "^1.3", - "guzzlehttp/guzzle": "^7.8.2", - "guzzlehttp/uri-template": "^1.0", - "laravel/prompts": "^0.3.0", - "laravel/serializable-closure": "^1.3|^2.0", - "league/commonmark": "^2.6", - "league/flysystem": "^3.25.1", - "league/flysystem-local": "^3.25.1", - "league/uri": "^7.5.1", - "monolog/monolog": "^3.0", - "nesbot/carbon": "^3.8.4", - "nunomaduro/termwind": "^2.0", - "php": "^8.2", - "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": "^7.2.0", - "symfony/error-handler": "^7.2.0", - "symfony/finder": "^7.2.0", - "symfony/http-foundation": "^7.2.0", - "symfony/http-kernel": "^7.2.0", - "symfony/mailer": "^7.2.0", - "symfony/mime": "^7.2.0", - "symfony/polyfill-php83": "^1.31", - "symfony/process": "^7.2.0", - "symfony/routing": "^7.2.0", - "symfony/uid": "^7.2.0", - "symfony/var-dumper": "^7.2.0", - "tijsverkoyen/css-to-inline-styles": "^2.2.5", - "vlucas/phpdotenv": "^5.6.1", - "voku/portable-ascii": "^2.0.2" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "provide": { - "psr/container-implementation": "1.1|2.0", - "psr/log-implementation": "1.0|2.0|3.0", - "psr/simple-cache-implementation": "1.0|2.0|3.0" - }, - "replace": { - "illuminate/auth": "self.version", - "illuminate/broadcasting": "self.version", - "illuminate/bus": "self.version", - "illuminate/cache": "self.version", - "illuminate/collections": "self.version", - "illuminate/concurrency": "self.version", - "illuminate/conditionable": "self.version", - "illuminate/config": "self.version", - "illuminate/console": "self.version", - "illuminate/container": "self.version", - "illuminate/contracts": "self.version", - "illuminate/cookie": "self.version", - "illuminate/database": "self.version", - "illuminate/encryption": "self.version", - "illuminate/events": "self.version", - "illuminate/filesystem": "self.version", - "illuminate/hashing": "self.version", - "illuminate/http": "self.version", - "illuminate/log": "self.version", - "illuminate/macroable": "self.version", - "illuminate/mail": "self.version", - "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", - "illuminate/session": "self.version", - "illuminate/support": "self.version", - "illuminate/testing": "self.version", - "illuminate/translation": "self.version", - "illuminate/validation": "self.version", - "illuminate/view": "self.version", - "spatie/once": "*" - }, - "require-dev": { - "ably/ably-php": "^1.0", - "aws/aws-sdk-php": "^3.322.9", - "ext-gmp": "*", - "fakerphp/faker": "^1.24", - "guzzlehttp/promises": "^2.0.3", - "guzzlehttp/psr7": "^2.4", - "laravel/pint": "^1.18", - "league/flysystem-aws-s3-v3": "^3.25.1", - "league/flysystem-ftp": "^3.25.1", - "league/flysystem-path-prefixing": "^3.25.1", - "league/flysystem-read-only": "^3.25.1", - "league/flysystem-sftp-v3": "^3.25.1", - "mockery/mockery": "^1.6.10", - "orchestra/testbench-core": "^10.0", - "pda/pheanstalk": "^5.0.6", - "php-http/discovery": "^1.15", - "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", - "predis/predis": "^2.3", - "resend/resend-php": "^0.10.0", - "symfony/cache": "^7.2.0", - "symfony/http-client": "^7.2.0", - "symfony/psr-http-message-bridge": "^7.2.0", - "symfony/translation": "^7.2.0" + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/http": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/queue": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2" }, "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.322.9).", - "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", - "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 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|^6.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).", - "laravel/tinker": "Required to use the tinker console command (^2.0).", - "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", - "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", - "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", - "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", - "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", - "mockery/mockery": "Required to use mocking (^1.6).", - "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", - "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", - "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", - "predis/predis": "Required to use the predis connector (^2.3).", - "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 (^6.0|^7.0).", - "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", - "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", - "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", - "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." + "illuminate/console": "Required to use the auth:clear-resets command (^12.0).", + "illuminate/queue": "Required to fire login / logout events (^12.0).", + "illuminate/session": "Required to use the session based guard (^12.0)." }, - "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -1237,23 +894,8 @@ } }, "autoload": { - "files": [ - "src/Illuminate/Collections/functions.php", - "src/Illuminate/Collections/helpers.php", - "src/Illuminate/Events/functions.php", - "src/Illuminate/Filesystem/functions.php", - "src/Illuminate/Foundation/helpers.php", - "src/Illuminate/Log/functions.php", - "src/Illuminate/Support/functions.php", - "src/Illuminate/Support/helpers.php" - ], "psr-4": { - "Illuminate\\": "src/Illuminate/", - "Illuminate\\Support\\": [ - "src/Illuminate/Macroable/", - "src/Illuminate/Collections/", - "src/Illuminate/Conditionable/" - ] + "Illuminate\\Auth\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1266,17 +908,1047 @@ "email": "taylor@laravel.com" } ], - "description": "The Laravel Framework.", + "description": "The Illuminate Auth package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-12T02:37:45+00:00" + }, + { + "name": "illuminate/bus", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/bus.git", + "reference": "6f027af455868588fc0c4eb9fb35116a96ae8ff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/bus/zipball/6f027af455868588fc0c4eb9fb35116a96ae8ff2", + "reference": "6f027af455868588fc0c4eb9fb35116a96ae8ff2", + "shasum": "" + }, + "require": { + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/pipeline": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2" + }, + "suggest": { + "illuminate/queue": "Required to use closures when chaining jobs (^12.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Bus\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Bus package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-19T19:08:33+00:00" + }, + { + "name": "illuminate/collections", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "a7dc526f2279c4ddac69e296842db90626820157" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/a7dc526f2279c4ddac69e296842db90626820157", + "reference": "a7dc526f2279c4ddac69e296842db90626820157", + "shasum": "" + }, + "require": { + "illuminate/conditionable": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "php": "^8.2" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php", + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-19T22:50:56+00:00" + }, + { + "name": "illuminate/conditionable", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/conditionable.git", + "reference": "a2b3c66f3ca532e12e694bd5c9254adc303b922d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/a2b3c66f3ca532e12e694bd5c9254adc303b922d", + "reference": "a2b3c66f3ca532e12e694bd5c9254adc303b922d", + "shasum": "" + }, + "require": { + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Conditionable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-19T19:08:33+00:00" + }, + { + "name": "illuminate/console", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/console.git", + "reference": "26c60e0139abe8b66a02d0fb9f8ad71c858ec77e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/console/zipball/26c60e0139abe8b66a02d0fb9f8ad71c858ec77e", + "reference": "26c60e0139abe8b66a02d0fb9f8ad71c858ec77e", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/support": "^12.0", + "illuminate/view": "^12.0", + "laravel/prompts": "^0.3.0", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "symfony/console": "^7.2.0", + "symfony/polyfill-php83": "^1.31", + "symfony/process": "^7.2.0" + }, + "suggest": { + "dragonmantank/cron-expression": "Required to use scheduler (^3.3.2).", + "ext-pcntl": "Required to use signal trapping.", + "guzzlehttp/guzzle": "Required to use the ping methods on schedules (^7.8).", + "illuminate/bus": "Required to use the scheduled job dispatcher (^12.0).", + "illuminate/container": "Required to use the scheduler (^12.0).", + "illuminate/filesystem": "Required to use the generator command (^12.0).", + "illuminate/queue": "Required to use closures for scheduled jobs (^12.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Console package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-12T02:37:45+00:00" + }, + { + "name": "illuminate/container", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "2f99ed909d7439d5298b85e2f51d3965aa77e5a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/2f99ed909d7439d5298b85e2f51d3965aa77e5a9", + "reference": "2f99ed909d7439d5298b85e2f51d3965aa77e5a9", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^12.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1" + }, + "provide": { + "psr/container-implementation": "1.1|2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-17T16:39:31+00:00" + }, + { + "name": "illuminate/contracts", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "bd1fb3b0dacf0d399b9c39dba89f8cda345218e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/bd1fb3b0dacf0d399b9c39dba89f8cda345218e6", + "reference": "bd1fb3b0dacf0d399b9c39dba89f8cda345218e6", + "shasum": "" + }, + "require": { + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-17T16:39:31+00:00" + }, + { + "name": "illuminate/database", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/database.git", + "reference": "f82b711b65cd4ce29e128c5292f814c39643bec2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/database/zipball/f82b711b65cd4ce29e128c5292f814c39643bec2", + "reference": "f82b711b65cd4ce29e128c5292f814c39643bec2", + "shasum": "" + }, + "require": { + "brick/math": "^0.11|^0.12", + "ext-pdo": "*", + "illuminate/collections": "^12.0", + "illuminate/container": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/support": "^12.0", + "laravel/serializable-closure": "^1.3|^2.0", + "php": "^8.2" + }, + "suggest": { + "ext-filter": "Required to use the Postgres database driver.", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.24).", + "illuminate/console": "Required to use the database commands (^12.0).", + "illuminate/events": "Required to use the observers with Eloquent (^12.0).", + "illuminate/filesystem": "Required to use the migrations (^12.0).", + "illuminate/pagination": "Required to paginate the result set (^12.0).", + "symfony/finder": "Required to use Eloquent model factories (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Database\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Database package.", "homepage": "https://laravel.com", "keywords": [ - "framework", - "laravel" + "database", + "laravel", + "orm", + "sql" ], "support": { "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-02-24T13:33:05+00:00" + "time": "2025-02-24T13:29:37+00:00" + }, + { + "name": "illuminate/events", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/events.git", + "reference": "93ce43bef5815e719530cc32cd4c69c665eeb9a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/events/zipball/93ce43bef5815e719530cc32cd4c69c665eeb9a7", + "reference": "93ce43bef5815e719530cc32cd4c69c665eeb9a7", + "shasum": "" + }, + "require": { + "illuminate/bus": "^12.0", + "illuminate/collections": "^12.0", + "illuminate/container": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Illuminate\\Events\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Events package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-12T02:37:45+00:00" + }, + { + "name": "illuminate/filesystem", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "b0991dd483bae9645633f38ad61287d20e18c413" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/b0991dd483bae9645633f38ad61287d20e18c413", + "reference": "b0991dd483bae9645633f38ad61287d20e18c413", + "shasum": "" + }, + "require": { + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2", + "symfony/finder": "^7.2.0" + }, + "suggest": { + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-hash": "Required to use the Filesystem class.", + "illuminate/http": "Required for handling uploaded files (^12.0).", + "league/flysystem": "Required to use the Flysystem local driver (^3.25.1).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/mime": "Required to enable support for guessing extensions (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-19T22:50:56+00:00" + }, + { + "name": "illuminate/http", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/http.git", + "reference": "1edcf7c32d115725de24c8c37e5f9f99ebd51a6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/http/zipball/1edcf7c32d115725de24c8c37e5f9f99ebd51a6f", + "reference": "1edcf7c32d115725de24c8c37e5f9f99ebd51a6f", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "illuminate/collections": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/session": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.31" + }, + "suggest": { + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image()." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Http\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Http package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-01-28T20:54:28+00:00" + }, + { + "name": "illuminate/macroable", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "e862e5648ee34004fa56046b746f490dfa86c613" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e862e5648ee34004fa56046b746f490dfa86c613", + "reference": "e862e5648ee34004fa56046b746f490dfa86c613", + "shasum": "" + }, + "require": { + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-07-23T16:31:01+00:00" + }, + { + "name": "illuminate/pipeline", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "22f183f6da5f74c614091503298877a001385b42" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/22f183f6da5f74c614091503298877a001385b42", + "reference": "22f183f6da5f74c614091503298877a001385b42", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-18T15:38:29+00:00" + }, + { + "name": "illuminate/queue", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/queue.git", + "reference": "d84eb7c2a95a78b928a753346e13f846fd3c4b55" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/queue/zipball/d84eb7c2a95a78b928a753346e13f846fd3c4b55", + "reference": "d84eb7c2a95a78b928a753346e13f846fd3c4b55", + "shasum": "" + }, + "require": { + "illuminate/collections": "^12.0", + "illuminate/console": "^12.0", + "illuminate/container": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/database": "^12.0", + "illuminate/filesystem": "^12.0", + "illuminate/pipeline": "^12.0", + "illuminate/support": "^12.0", + "laravel/serializable-closure": "^1.3|^2.0", + "php": "^8.2", + "ramsey/uuid": "^4.7", + "symfony/process": "^7.2.0" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver and DynamoDb failed job storage (^3.322.9).", + "ext-filter": "Required to use the SQS queue worker.", + "ext-mbstring": "Required to use the database failed job providers.", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-pdo": "Required to use the database queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "illuminate/redis": "Required to use the Redis queue driver (^12.0).", + "pda/pheanstalk": "Required to use the Beanstalk queue driver (^5.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Queue\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Queue package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-14T15:24:14+00:00" + }, + { + "name": "illuminate/session", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/session.git", + "reference": "a2ba80dc87a9f36c66d0ae21a95095d56096f66e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/session/zipball/a2ba80dc87a9f36c66d0ae21a95095d56096f66e", + "reference": "a2ba80dc87a9f36c66d0ae21a95095d56096f66e", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-session": "*", + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/filesystem": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2", + "symfony/finder": "^7.2.0", + "symfony/http-foundation": "^7.2.0" + }, + "suggest": { + "illuminate/console": "Required to use the session:table command (^12.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Session\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Session package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-01-28T15:35:17+00:00" + }, + { + "name": "illuminate/support", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "6ce0835a5fa92db4322a3de8a6974983133bdddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/6ce0835a5fa92db4322a3de8a6974983133bdddc", + "reference": "6ce0835a5fa92db4322a3de8a6974983133bdddc", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-mbstring": "*", + "illuminate/collections": "^12.0", + "illuminate/conditionable": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "nesbot/carbon": "^3.8.4", + "php": "^8.2", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "replace": { + "spatie/once": "*" + }, + "suggest": { + "illuminate/filesystem": "Required to use the Composer class (^12.0).", + "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.6).", + "league/uri": "Required to use the Uri class (^7.5.1).", + "ramsey/uuid": "Required to use Str::uuid() (^4.7).", + "symfony/process": "Required to use the Composer class (^7.2).", + "symfony/uid": "Required to use Str::ulid() (^7.2).", + "symfony/var-dumper": "Required to use the dd function (^7.2).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php", + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-24T13:15:26+00:00" + }, + { + "name": "illuminate/translation", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/translation.git", + "reference": "91da1d7c6e187860a42f2beba28bbea52ae0e931" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/translation/zipball/91da1d7c6e187860a42f2beba28bbea52ae0e931", + "reference": "91da1d7c6e187860a42f2beba28bbea52ae0e931", + "shasum": "" + }, + "require": { + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/filesystem": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Translation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-18T15:38:29+00:00" + }, + { + "name": "illuminate/validation", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/validation.git", + "reference": "568bef44f3c65f127f8fa2f04cd6689b53237c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/validation/zipball/568bef44f3c65f127f8fa2f04cd6689b53237c71", + "reference": "568bef44f3c65f127f8fa2f04cd6689b53237c71", + "shasum": "" + }, + "require": { + "brick/math": "^0.11|^0.12", + "egulias/email-validator": "^3.2.5|^4.0", + "ext-filter": "*", + "ext-mbstring": "*", + "illuminate/collections": "^12.0", + "illuminate/container": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/support": "^12.0", + "illuminate/translation": "^12.0", + "php": "^8.2", + "symfony/http-foundation": "^7.2", + "symfony/mime": "^7.2" + }, + "suggest": { + "illuminate/database": "Required to use the database presence verifier (^12.0).", + "ramsey/uuid": "Required to use Validator::validateUuid() (^4.7)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Validation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Validation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-19T22:50:56+00:00" + }, + { + "name": "illuminate/view", + "version": "12.x-dev", + "source": { + "type": "git", + "url": "https://github.com/illuminate/view.git", + "reference": "0f9a7ffebbd4fb921b9092f60555d171c67f8e63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/view/zipball/0f9a7ffebbd4fb921b9092f60555d171c67f8e63", + "reference": "0f9a7ffebbd4fb921b9092f60555d171c67f8e63", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "illuminate/collections": "^12.0", + "illuminate/container": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/events": "^12.0", + "illuminate/filesystem": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\View\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate View package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-02-18T15:38:29+00:00" }, { "name": "laravel/prompts", @@ -1400,669 +2072,6 @@ }, "time": "2025-02-12T01:45:10+00:00" }, - { - "name": "league/commonmark", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/commonmark.git", - "reference": "01ad002b538ff3164e954d5ce15ec59d270c068c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/01ad002b538ff3164e954d5ce15ec59d270c068c", - "reference": "01ad002b538ff3164e954d5ce15ec59d270c068c", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "league/config": "^1.1.1", - "php": "^7.4 || ^8.0", - "psr/event-dispatcher": "^1.0", - "symfony/deprecation-contracts": "^2.1 || ^3.0", - "symfony/polyfill-php80": "^1.16" - }, - "require-dev": { - "cebe/markdown": "^1.0", - "commonmark/cmark": "0.31.1", - "commonmark/commonmark.js": "0.31.1", - "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 || ^2.0", - "nyholm/psr7": "^1.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 | ^6.0 | ^7.0", - "symfony/process": "^5.4 | ^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" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "League\\CommonMark\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } - ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", - "homepage": "https://commonmark.thephpleague.com", - "keywords": [ - "commonmark", - "flavored", - "gfm", - "github", - "github-flavored", - "markdown", - "md", - "parser" - ], - "support": { - "docs": "https://commonmark.thephpleague.com/", - "forum": "https://github.com/thephpleague/commonmark/discussions", - "issues": "https://github.com/thephpleague/commonmark/issues", - "rss": "https://github.com/thephpleague/commonmark/releases.atom", - "source": "https://github.com/thephpleague/commonmark" - }, - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/commonmark", - "type": "tidelift" - } - ], - "time": "2025-02-23T10:38:56+00:00" - }, - { - "name": "league/config", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/config.git", - "reference": "708b87250055f20a21cc6dbe232369b79a71a4fa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/config/zipball/708b87250055f20a21cc6dbe232369b79a71a4fa", - "reference": "708b87250055f20a21cc6dbe232369b79a71a4fa", - "shasum": "" - }, - "require": { - "dflydev/dot-access-data": "^3.0.1", - "nette/schema": "^1.2", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.8.2", - "phpunit/phpunit": "^9.5.5 || ^10.0.0 || ^11.0.0", - "scrutinizer/ocular": "^1.8.1", - "unleashedtech/php-coding-standard": "^3.1", - "vimeo/psalm": "^4.7.3" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.2-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Config\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } - ], - "description": "Define configuration arrays with strict schemas and access values with dot notation", - "homepage": "https://config.thephpleague.com", - "keywords": [ - "array", - "config", - "configuration", - "dot", - "dot-access", - "nested", - "schema" - ], - "support": { - "docs": "https://config.thephpleague.com/", - "issues": "https://github.com/thephpleague/config/issues", - "rss": "https://github.com/thephpleague/config/releases.atom", - "source": "https://github.com/thephpleague/config" - }, - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - } - ], - "time": "2024-09-23T00:17:42+00:00" - }, - { - "name": "league/flysystem", - "version": "3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "9d6fc2cf27bf7525e50e0a109e5f768a17038670" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9d6fc2cf27bf7525e50e0a109e5f768a17038670", - "reference": "9d6fc2cf27bf7525e50e0a109e5f768a17038670", - "shasum": "" - }, - "require": { - "league/flysystem-local": "^3.0.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" - }, - "conflict": { - "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": { - "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|^2", - "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|^2", - "phpseclib/phpseclib": "^3.0.36", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.5.11|^10.0", - "sabre/dav": "^4.6.0" - }, - "default-branch": true, - "type": "library", - "autoload": { - "psr-4": { - "League\\Flysystem\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "File storage abstraction for PHP", - "keywords": [ - "WebDAV", - "aws", - "cloud", - "file", - "files", - "filesystem", - "filesystems", - "ftp", - "s3", - "sftp", - "storage" - ], - "support": { - "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.x" - }, - "time": "2025-02-11T19:47:21+00:00" - }, - { - "name": "league/flysystem-local", - "version": "3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "league/flysystem": "^3.0.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" - }, - "default-branch": true, - "type": "library", - "autoload": { - "psr-4": { - "League\\Flysystem\\Local\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "Local filesystem adapter for Flysystem.", - "keywords": [ - "Flysystem", - "file", - "files", - "filesystem", - "local" - ], - "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" - }, - "time": "2024-08-09T21:24:39+00:00" - }, - { - "name": "league/mime-type-detection", - "version": "1.16.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\MimeTypeDetection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "Mime-type detection for Flysystem", - "support": { - "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" - }, - "funding": [ - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "time": "2024-09-21T08:32:55+00:00" - }, - { - "name": "league/uri", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/uri.git", - "reference": "bace4da7296808d22043c585192b71c4bf47d83e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/bace4da7296808d22043c585192b71c4bf47d83e", - "reference": "bace4da7296808d22043c585192b71c4bf47d83e", - "shasum": "" - }, - "require": { - "league/uri-interfaces": "^7.6", - "php": "^8.1" - }, - "conflict": { - "league/uri-schemes": "^1.0" - }, - "suggest": { - "ext-bcmath": "to improve IPV4 host parsing", - "ext-dom": "to convert the URI into an HTML anchor tag", - "ext-fileinfo": "to create Data URI from file contennts", - "ext-gmp": "to improve IPV4 host parsing", - "ext-intl": "to handle IDN host with the best performance", - "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain", - "league/uri-components": "Needed to easily manipulate URI objects components", - "php-64bit": "to improve IPV4 host parsing", - "rowbot/url": "to handle WHATWG URL", - "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Uri\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://nyamsprod.com" - } - ], - "description": "URI manipulation library", - "homepage": "https://uri.thephpleague.com", - "keywords": [ - "data-uri", - "file-uri", - "ftp", - "hostname", - "http", - "https", - "middleware", - "parse_str", - "parse_url", - "psr-7", - "query-string", - "querystring", - "rfc3986", - "rfc3987", - "rfc6570", - "uri", - "uri-template", - "url", - "ws" - ], - "support": { - "docs": "https://uri.thephpleague.com", - "forum": "https://thephpleague.slack.com", - "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sponsors/nyamsprod", - "type": "github" - } - ], - "time": "2025-01-25T19:52:43+00:00" - }, - { - "name": "league/uri-interfaces", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "3efb68920c63580186e589c130c95a5ac96465b7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/3efb68920c63580186e589c130c95a5ac96465b7", - "reference": "3efb68920c63580186e589c130c95a5ac96465b7", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^8.1", - "psr/http-factory": "^1", - "psr/http-message": "^1.1 || ^2.0" - }, - "suggest": { - "ext-bcmath": "to improve IPV4 host parsing", - "ext-gmp": "to improve IPV4 host parsing", - "ext-intl": "to handle IDN host with the best performance", - "php-64bit": "to improve IPV4 host parsing", - "rowbot/url": "to handle WHATWG URL", - "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Uri\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://nyamsprod.com" - } - ], - "description": "Common interfaces and classes for URI representation and interaction", - "homepage": "https://uri.thephpleague.com", - "keywords": [ - "data-uri", - "file-uri", - "ftp", - "hostname", - "http", - "https", - "parse_str", - "parse_url", - "psr-7", - "query-string", - "querystring", - "rfc3986", - "rfc3987", - "rfc6570", - "uri", - "url", - "ws" - ], - "support": { - "docs": "https://uri.thephpleague.com", - "forum": "https://thephpleague.slack.com", - "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sponsors/nyamsprod", - "type": "github" - } - ], - "time": "2025-01-25T14:02:31+00:00" - }, - { - "name": "monolog/monolog", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "548eeb3f1e313d943712b9fab0dc2e865a5a7bfc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/548eeb3f1e313d943712b9fab0dc2e865a5a7bfc", - "reference": "548eeb3f1e313d943712b9fab0dc2e865a5a7bfc", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/log": "^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "3.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7 || ^8", - "ext-json": "*", - "graylog2/gelf-php": "^1.4.2 || ^2.0", - "guzzlehttp/guzzle": "^7.4.5", - "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4 || ^3", - "php-console/php-console": "^3.1.8", - "phpstan/phpstan": "^2", - "phpstan/phpstan-deprecation-rules": "^2", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^10.5.17 || ^11.0.7", - "predis/predis": "^1.1 || ^2", - "rollbar/rollbar": "^4.0", - "ruflin/elastica": "^7 || ^8", - "symfony/mailer": "^5.4 || ^6", - "symfony/mime": "^5.4 || ^6" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "ext-openssl": "Required to send log messages using SSL", - "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/main" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2025-02-03T10:34:40+00:00" - }, { "name": "nesbot/carbon", "version": "dev-master", @@ -2170,155 +2179,6 @@ ], "time": "2025-02-20T17:33:38+00:00" }, - { - "name": "nette/schema", - "version": "v1.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/nette/schema.git", - "reference": "da801d52f0354f70a638673c4a0f04e16529431d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", - "reference": "da801d52f0354f70a638673c4a0f04e16529431d", - "shasum": "" - }, - "require": { - "nette/utils": "^4.0", - "php": "8.1 - 8.4" - }, - "require-dev": { - "nette/tester": "^2.5.2", - "phpstan/phpstan-nette": "^1.0", - "tracy/tracy": "^2.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "📐 Nette Schema: validating data structures against a given Schema.", - "homepage": "https://nette.org", - "keywords": [ - "config", - "nette" - ], - "support": { - "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3" - }, - "time": "2024-10-06T23:10:23+00:00" - }, - { - "name": "nette/utils", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "be534713c227aeef57ce1883fc17bc9f9e29eca2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/be534713c227aeef57ce1883fc17bc9f9e29eca2", - "reference": "be534713c227aeef57ce1883fc17bc9f9e29eca2", - "shasum": "" - }, - "require": { - "php": "8.0 - 8.4" - }, - "conflict": { - "nette/finder": "<3", - "nette/schema": "<1.2.2" - }, - "require-dev": { - "jetbrains/phpstorm-attributes": "dev-master", - "nette/tester": "^2.5", - "phpstan/phpstan": "^1.0", - "tracy/tracy": "^2.9" - }, - "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", - "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()" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", - "homepage": "https://nette.org", - "keywords": [ - "array", - "core", - "datetime", - "images", - "json", - "nette", - "paginator", - "password", - "slugify", - "string", - "unicode", - "utf-8", - "utility", - "validation" - ], - "support": { - "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/master" - }, - "time": "2025-02-03T00:58:56+00:00" - }, { "name": "nunomaduro/termwind", "version": "2.x-dev", @@ -2407,82 +2267,6 @@ ], "time": "2024-11-21T10:39:51+00:00" }, - { - "name": "phpoption/phpoption", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", - "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" - }, - "default-branch": true, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - }, - "branch-alias": { - "dev-master": "1.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpOption\\": "src/PhpOption/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh" - }, - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "Option Type for PHP", - "keywords": [ - "language", - "option", - "php", - "type" - ], - "support": { - "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", - "type": "tidelift" - } - ], - "time": "2024-07-20T21:41:07+00:00" - }, { "name": "psr/clock", "version": "1.0.0", @@ -3297,71 +3081,6 @@ ], "time": "2025-02-06T08:27:43+00:00" }, - { - "name": "symfony/css-selector", - "version": "7.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", - "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\CssSelector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Converts CSS selectors to XPath expressions", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.2.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-09-25T14:21:43+00:00" - }, { "name": "symfony/deprecation-contracts", "version": "dev-main", @@ -3918,86 +3637,6 @@ ], "time": "2025-02-07T08:14:01+00:00" }, - { - "name": "symfony/mailer", - "version": "7.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/mailer.git", - "reference": "879d6df416d927894bb0e0423fa1e324aa264f20" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/879d6df416d927894bb0e0423fa1e324aa264f20", - "reference": "879d6df416d927894bb0e0423fa1e324aa264f20", - "shasum": "" - }, - "require": { - "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.2", - "psr/event-dispatcher": "^1", - "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/mime": "^7.2", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/messenger": "<6.4", - "symfony/mime": "<6.4", - "symfony/twig-bridge": "<6.4" - }, - "require-dev": { - "symfony/console": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/twig-bridge": "^6.4|^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/7.3" - }, - "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": "2025-02-11T07:45:17+00:00" - }, { "name": "symfony/mime", "version": "7.3.x-dev", @@ -4647,86 +4286,6 @@ ], "time": "2024-09-09T11:45:10+00:00" }, - { - "name": "symfony/polyfill-uuid", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-uuid": "*" - }, - "suggest": { - "ext-uuid": "For best performance" - }, - "default-branch": true, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Uuid\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Grégoire Pineau", - "email": "lyrixx@lyrixx.info" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for uuid functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "uuid" - ], - "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.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-09-09T11:45:10+00:00" - }, { "name": "symfony/process", "version": "7.3.x-dev", @@ -4788,87 +4347,6 @@ ], "time": "2025-02-14T16:23:49+00:00" }, - { - "name": "symfony/routing", - "version": "7.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "7c910761bef0ee0f86139ffaf2b7bcd6afc1990c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/7c910761bef0ee0f86139ffaf2b7bcd6afc1990c", - "reference": "7c910761bef0ee0f86139ffaf2b7bcd6afc1990c", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/yaml": "<6.4" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "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": "Maps an HTTP request to a set of configuration variables", - "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "support": { - "source": "https://github.com/symfony/routing/tree/7.3" - }, - "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": "2025-01-25T08:29:00+00:00" - }, { "name": "symfony/service-contracts", "version": "dev-main", @@ -5214,80 +4692,6 @@ ], "time": "2024-09-27T08:32:26+00:00" }, - { - "name": "symfony/uid", - "version": "7.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/uid.git", - "reference": "f5e643aee01ab83011b08a466b5194131763dd3e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/f5e643aee01ab83011b08a466b5194131763dd3e", - "reference": "f5e643aee01ab83011b08a466b5194131763dd3e", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-uuid": "^1.15" - }, - "require-dev": { - "symfony/console": "^6.4|^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/7.3" - }, - "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-12-07T08:11:28+00:00" - }, { "name": "symfony/var-dumper", "version": "7.3.x-dev", @@ -5372,147 +4776,6 @@ ], "time": "2025-01-19T13:07:55+00:00" }, - { - "name": "tijsverkoyen/css-to-inline-styles", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "0d72ac1c00084279c1816675284073c5a337c20d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", - "reference": "0d72ac1c00084279c1816675284073c5a337c20d", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "php": "^7.4 || ^8.0", - "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" - }, - "require-dev": { - "phpstan/phpstan": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^8.5.21 || ^9.5.10" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "TijsVerkoyen\\CssToInlineStyles\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Tijs Verkoyen", - "email": "css_to_inline_styles@verkoyen.eu", - "role": "Developer" - } - ], - "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", - "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", - "support": { - "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" - }, - "time": "2024-12-21T16:25:41+00:00" - }, - { - "name": "vlucas/phpdotenv", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", - "shasum": "" - }, - "require": { - "ext-pcre": "*", - "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.8.2", - "ext-filter": "*", - "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" - }, - "suggest": { - "ext-filter": "Required to use the boolean validator." - }, - "default-branch": true, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - }, - "branch-alias": { - "dev-master": "5.6-dev" - } - }, - "autoload": { - "psr-4": { - "Dotenv\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "https://github.com/vlucas" - } - ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "support": { - "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", - "type": "tidelift" - } - ], - "time": "2024-07-20T21:52:34+00:00" - }, { "name": "voku/portable-ascii", "version": "2.0.3", @@ -5682,88 +4945,6 @@ ], "time": "2024-12-11T14:50:44+00:00" }, - { - "name": "composer/semver", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" - }, - "default-branch": true, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.3" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-09-19T14:15:21+00:00" - }, { "name": "doctrine/deprecations", "version": "1.1.x-dev", @@ -5810,69 +4991,6 @@ }, "time": "2025-02-10T14:53:34+00:00" }, - { - "name": "fakerphp/faker", - "version": "1.24.x-dev", - "source": { - "type": "git", - "url": "https://github.com/FakerPHP/Faker.git", - "reference": "f7ac50712e417f008402c8fc889c964e75eecfe9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/f7ac50712e417f008402c8fc889c964e75eecfe9", - "reference": "f7ac50712e417f008402c8fc889c964e75eecfe9", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0", - "psr/container": "^1.0 || ^2.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "conflict": { - "fzaninotto/faker": "*" - }, - "require-dev": { - "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" - }, - "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-4": { - "Faker\\": "src/Faker/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "François Zaninotto" - } - ], - "description": "Faker is a PHP library that generates fake data for you.", - "keywords": [ - "data", - "faker", - "fixtures" - ], - "support": { - "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/1.24" - }, - "time": "2025-02-22T09:07:46+00:00" - }, { "name": "fidry/cpu-core-counter", "version": "1.2.0", @@ -6158,85 +5276,6 @@ }, "time": "2016-12-15T09:34:34+00:00" }, - { - "name": "laravel/pail", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/laravel/pail.git", - "reference": "1caf314b89d851ed3235680db63072e5b830ba06" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/pail/zipball/1caf314b89d851ed3235680db63072e5b830ba06", - "reference": "1caf314b89d851ed3235680db63072e5b830ba06", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "illuminate/console": "^10.24|^11.0|^12.0", - "illuminate/contracts": "^10.24|^11.0|^12.0", - "illuminate/log": "^10.24|^11.0|^12.0", - "illuminate/process": "^10.24|^11.0|^12.0", - "illuminate/support": "^10.24|^11.0|^12.0", - "nunomaduro/termwind": "^1.15|^2.0", - "php": "^8.2", - "symfony/console": "^6.0|^7.0" - }, - "require-dev": { - "laravel/framework": "^10.24|^11.0|^12.0", - "laravel/pint": "^1.13", - "orchestra/testbench-core": "^8.13|^9.0|^10.0", - "pestphp/pest": "^2.20|^3.0", - "pestphp/pest-plugin-type-coverage": "^2.3|^3.0", - "phpstan/phpstan": "^1.10", - "symfony/var-dumper": "^6.3|^7.0" - }, - "default-branch": true, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Laravel\\Pail\\PailServiceProvider" - ] - }, - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Laravel\\Pail\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - }, - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Easily delve into your Laravel application's log files directly from the command line.", - "homepage": "https://github.com/laravel/pail", - "keywords": [ - "laravel", - "logs", - "php", - "tail" - ], - "support": { - "issues": "https://github.com/laravel/pail/issues", - "source": "https://github.com/laravel/pail" - }, - "time": "2025-02-12T01:31:45+00:00" - }, { "name": "laravel/pint", "version": "v1.21.0", @@ -6303,73 +5342,6 @@ }, "time": "2025-02-18T03:18:57+00:00" }, - { - "name": "laravel/tinker", - "version": "2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/laravel/tinker.git", - "reference": "102bfc19b79817022e9fb1d3dd235d43d42f1954" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/102bfc19b79817022e9fb1d3dd235d43d42f1954", - "reference": "102bfc19b79817022e9fb1d3dd235d43d42f1954", - "shasum": "" - }, - "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.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|^10.0" - }, - "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." - }, - "default-branch": true, - "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/2.x" - }, - "time": "2025-02-12T01:36:47+00:00" - }, { "name": "mockery/mockery", "version": "1.7.x-dev", @@ -6670,420 +5642,6 @@ ], "time": "2025-02-05T12:47:34+00:00" }, - { - "name": "orchestra/canvas", - "version": "10.x-dev", - "source": { - "type": "git", - "url": "https://github.com/orchestral/canvas.git", - "reference": "607aecbe8728c969466d82c27e179177db3bf417" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/orchestral/canvas/zipball/607aecbe8728c969466d82c27e179177db3bf417", - "reference": "607aecbe8728c969466d82c27e179177db3bf417", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.2", - "composer/semver": "^3.0", - "illuminate/console": "^12.0.1", - "illuminate/database": "^12.0.1", - "illuminate/filesystem": "^12.0.1", - "illuminate/support": "^12.0.1", - "orchestra/canvas-core": "^10.0.1", - "orchestra/sidekick": "^1.0.3", - "orchestra/testbench-core": "^10.0.1", - "php": "^8.2", - "symfony/polyfill-php83": "^1.31", - "symfony/yaml": "^7.0.3" - }, - "require-dev": { - "laravel/framework": "^12.0.1", - "laravel/pint": "^1.21", - "mockery/mockery": "^1.6.10", - "phpstan/phpstan": "^2.1", - "phpunit/phpunit": "^11.5.7", - "spatie/laravel-ray": "^1.39.1" - }, - "default-branch": true, - "bin": [ - "canvas" - ], - "type": "library", - "extra": { - "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/10.x" - }, - "time": "2025-02-24T14:46:01+00:00" - }, - { - "name": "orchestra/canvas-core", - "version": "10.x-dev", - "source": { - "type": "git", - "url": "https://github.com/orchestral/canvas-core.git", - "reference": "c5741447620807a9ee4f54ccd2f57fb23914b6d6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/orchestral/canvas-core/zipball/c5741447620807a9ee4f54ccd2f57fb23914b6d6", - "reference": "c5741447620807a9ee4f54ccd2f57fb23914b6d6", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.2", - "composer/semver": "^3.0", - "illuminate/console": "^12.0", - "illuminate/support": "^12.0", - "orchestra/sidekick": "^1.0.3", - "php": "^8.2", - "symfony/polyfill-php83": "^1.31" - }, - "require-dev": { - "laravel/framework": "^12.0", - "laravel/pint": "^1.21", - "mockery/mockery": "^1.6.10", - "orchestra/testbench-core": "^10.0", - "phpstan/phpstan": "^2.1", - "phpunit/phpunit": "^11.5.7", - "symfony/yaml": "^7.2" - }, - "default-branch": true, - "type": "library", - "extra": { - "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/10.x" - }, - "time": "2025-02-24T15:29:36+00:00" - }, - { - "name": "orchestra/sidekick", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/orchestral/sidekick.git", - "reference": "1f251f336afa92e4899b6916f52032ff8d5bc47a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/orchestral/sidekick/zipball/1f251f336afa92e4899b6916f52032ff8d5bc47a", - "reference": "1f251f336afa92e4899b6916f52032ff8d5bc47a", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.2", - "php": "^8.0", - "symfony/polyfill-php83": "^1.31" - }, - "require-dev": { - "laravel/framework": "^9.52.16|^10.48.28|^11.42.1|^12.0|^13.0", - "laravel/pint": "^1.4", - "phpstan/phpstan": "^2.1", - "phpunit/phpunit": "^9.6|^10.0|^11.0", - "symfony/process": "^6.0|^7.0" - }, - "default-branch": true, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Orchestra\\Sidekick\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mior Muhammad Zaki", - "email": "crynobone@gmail.com" - } - ], - "description": "Packages Toolkit Utilities and Helpers for Laravel", - "support": { - "issues": "https://github.com/orchestral/sidekick/issues", - "source": "https://github.com/orchestral/sidekick/tree/v1.0.3" - }, - "time": "2025-02-20T12:05:57+00:00" - }, - { - "name": "orchestra/testbench", - "version": "10.x-dev", - "source": { - "type": "git", - "url": "https://github.com/orchestral/testbench.git", - "reference": "b10f1dec6253a87961349e92ac1420c9aebfacd0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/orchestral/testbench/zipball/b10f1dec6253a87961349e92ac1420c9aebfacd0", - "reference": "b10f1dec6253a87961349e92ac1420c9aebfacd0", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.2", - "fakerphp/faker": "^1.23", - "laravel/framework": "^12.0.1", - "mockery/mockery": "^1.6.10", - "orchestra/testbench-core": "^10.0.0", - "orchestra/workbench": "^10.0.0", - "php": "^8.2", - "phpunit/phpunit": "^11.5.3", - "symfony/process": "^7.2", - "symfony/yaml": "^7.2", - "vlucas/phpdotenv": "^5.6.1" - }, - "default-branch": true, - "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/v10.0.0" - }, - "time": "2025-02-24T13:49:40+00:00" - }, - { - "name": "orchestra/testbench-core", - "version": "10.x-dev", - "source": { - "type": "git", - "url": "https://github.com/orchestral/testbench-core.git", - "reference": "c06dfb1195d5e09218665437038f96ae7afe6929" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/c06dfb1195d5e09218665437038f96ae7afe6929", - "reference": "c06dfb1195d5e09218665437038f96ae7afe6929", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.2", - "orchestra/sidekick": "^1.0.3", - "php": "^8.2", - "symfony/polyfill-php83": "^1.31", - "symfony/polyfill-php84": "^1.31" - }, - "conflict": { - "brianium/paratest": "<7.3.0 || >=8.0.0", - "laravel/framework": "<12.0.0 || >=13.0.0", - "laravel/serializable-closure": "<1.3.0 || >=3.0.0", - "nunomaduro/collision": "<8.0.0 || >=9.0.0", - "phpunit/phpunit": "<10.5.35 || >=11.0.0 <11.5.3 || 12.0.0 || >=12.1.0" - }, - "require-dev": { - "fakerphp/faker": "^1.24", - "laravel/framework": "^12.0.0", - "laravel/pint": "^1.21", - "laravel/serializable-closure": "^1.3 || ^2.0", - "mockery/mockery": "^1.6.10", - "phpstan/phpstan": "^2.1", - "phpunit/phpunit": "^10.5.35 || ^11.5.3 || ^12.0.1", - "spatie/laravel-ray": "^1.39.1", - "symfony/process": "^7.2.0", - "symfony/yaml": "^7.2.0", - "vlucas/phpdotenv": "^5.6.1" - }, - "suggest": { - "brianium/paratest": "Allow using parallel testing (^7.3).", - "ext-pcntl": "Required to use all features of the console signal trapping.", - "fakerphp/faker": "Allow using Faker for testing (^1.23).", - "laravel/framework": "Required for testing (^12.0.0).", - "mockery/mockery": "Allow using Mockery for testing (^1.6).", - "nunomaduro/collision": "Allow using Laravel style tests output and parallel testing (^8.0).", - "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^9.0).", - "phpunit/phpunit": "Allow using PHPUnit for testing (^10.5 || ^11.0 || ^12.0).", - "symfony/process": "Required to use Orchestra\\Testbench\\remote function (^7.2).", - "symfony/yaml": "Required for Testbench CLI (^7.2).", - "vlucas/phpdotenv": "Required for Testbench CLI (^5.4.1)." - }, - "default-branch": true, - "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": "2025-02-25T04:50:01+00:00" - }, - { - "name": "orchestra/workbench", - "version": "10.x-dev", - "source": { - "type": "git", - "url": "https://github.com/orchestral/workbench.git", - "reference": "da0cba53f414272d2238b80c3fe384ba5b9edcfc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/orchestral/workbench/zipball/da0cba53f414272d2238b80c3fe384ba5b9edcfc", - "reference": "da0cba53f414272d2238b80c3fe384ba5b9edcfc", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.2", - "fakerphp/faker": "^1.23", - "laravel/framework": "^12.0.0", - "laravel/pail": "^1.2.2", - "laravel/tinker": "^2.10.1", - "nunomaduro/collision": "^8.6", - "orchestra/canvas": "^10.0.1", - "orchestra/sidekick": "^1.0.3", - "orchestra/testbench-core": "^10.0.0", - "php": "^8.2", - "symfony/polyfill-php83": "^1.31", - "symfony/polyfill-php84": "^1.31", - "symfony/process": "^7.2", - "symfony/yaml": "^7.2" - }, - "require-dev": { - "laravel/pint": "^1.21", - "mockery/mockery": "^1.6.10", - "phpstan/phpstan": "^2.1", - "phpunit/phpunit": "^11.5.3", - "spatie/laravel-ray": "^1.39.1" - }, - "suggest": { - "ext-pcntl": "Required to use all features of the console signal trapping." - }, - "default-branch": true, - "type": "library", - "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/10.x" - }, - "time": "2025-02-24T13:44:55+00:00" - }, { "name": "pestphp/pest", "version": "3.x-dev", @@ -8180,86 +6738,6 @@ ], "time": "2025-01-31T07:03:30+00:00" }, - { - "name": "psy/psysh", - "version": "dev-main", - "source": { - "type": "git", - "url": "https://github.com/bobthecow/psysh.git", - "reference": "6a5c8a21aa608aae8f838b4b03a196038bbaa726" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/6a5c8a21aa608aae8f838b4b03a196038bbaa726", - "reference": "6a5c8a21aa608aae8f838b4b03a196038bbaa726", - "shasum": "" - }, - "require": { - "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": { - "bamarni/composer-bin-plugin": "^1.2" - }, - "suggest": { - "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." - }, - "default-branch": true, - "bin": [ - "bin/psysh" - ], - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": false, - "forward-command": false - }, - "branch-alias": { - "dev-main": "0.12.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Psy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" - } - ], - "description": "An interactive shell for modern PHP.", - "homepage": "http://psysh.org", - "keywords": [ - "REPL", - "console", - "interactive", - "shell" - ], - "support": { - "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/main" - }, - "time": "2025-01-27T06:15:00+00:00" - }, { "name": "sebastian/cli-parser", "version": "3.0.x-dev", @@ -9240,155 +7718,6 @@ ], "time": "2024-10-20T05:08:20+00:00" }, - { - "name": "symfony/polyfill-php84", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "000df7860439609837bbe28670b0be15783b7fbf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf", - "reference": "000df7860439609837bbe28670b0be15783b7fbf", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "default-branch": true, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php84\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/1.x" - }, - "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": "2025-02-20T12:04:08+00:00" - }, - { - "name": "symfony/yaml", - "version": "7.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "491c6ac3b64c3fde28df9b795b52db74567619e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/491c6ac3b64c3fde28df9b795b52db74567619e2", - "reference": "491c6ac3b64c3fde28df9b795b52db74567619e2", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<6.4" - }, - "require-dev": { - "symfony/console": "^6.4|^7.0" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/7.3" - }, - "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": "2025-02-04T14:29:11+00:00" - }, { "name": "ta-tikoma/phpunit-architecture-test", "version": "0.8.4", From 7adf5ecd1f06a2a3fb213ec4e9f1ee02b17d3d15 Mon Sep 17 00:00:00 2001 From: Joel Male Date: Tue, 25 Feb 2025 16:31:42 +1000 Subject: [PATCH 6/7] feat: add tests and fix item level conditions for database storage --- src/Cart.php | 6 +--- src/CartSession.php | 26 ++++++++++++++++ src/ItemCollection.php | 38 ++++++++++++++++++++--- tests/Unit/DatabaseCartTest.php | 55 +++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 9 deletions(-) diff --git a/src/Cart.php b/src/Cart.php index dee5865..ae2d2f4 100644 --- a/src/Cart.php +++ b/src/Cart.php @@ -521,14 +521,10 @@ public function getSubTotalWithoutConditions($formatted = true) return Helpers::formatValue(floatval($sum), $formatted, $this->config); } - /** - * get cart sub total - * - * @param bool $formatted - */ public function getSubTotal($formatted = true): int|float|string { $subTotal = 0.00; + // add all the items together with conditions applied $subTotalSum = $this->getContent()->sum(function (ItemCollection $item) { return $item->getPriceSumWithConditions(false); diff --git a/src/CartSession.php b/src/CartSession.php index 06dbeb2..70de9ca 100644 --- a/src/CartSession.php +++ b/src/CartSession.php @@ -70,6 +70,32 @@ public function putItems($value) return $this->session->put($this->itemsKey, $value); } + // convert any conditions to arrays + $value = $value->toArray(); + + foreach ($value as $key => $item) { + if ($item['conditions']) { + if (is_array($item['conditions'])) { + $value[$key]['conditions'] = collect($item['conditions'])->map(function ($condition) { + return $condition->toArray(); + }); + } else { + $value[$key]['conditions'] = $item['conditions']->toArray(); + } + } + } + + // if ($value['conditions']) { + // $value['conditions'] = $value['conditions']->map(function ($condition) { + // return $condition->toArray(); + // }); + // } + + // dd($value); + // $value = $value->map(function ($item) { + // return $item->toArray(); + // }); + $this->session[$this->itemsKey] = $value; $this->session->save(); diff --git a/src/ItemCollection.php b/src/ItemCollection.php index 59866de..d34766f 100644 --- a/src/ItemCollection.php +++ b/src/ItemCollection.php @@ -91,7 +91,37 @@ public function getConditions() return []; } - return $this['conditions']; + $conditionsArray = []; + + $conditions = $this['conditions']; + + // check if we're already an array of CartConditions + foreach ($conditions as $key => $condition) { + if ($condition instanceof CartCondition) { + return $conditions; + } + } + + $hasSubArray = false; + + foreach ($conditions as $key => $condition) { + if (is_array($condition) && ! $condition instanceof CartCondition) { + $hasSubArray = true; + $conditionsArray[] = new CartCondition($condition); + } elseif ($condition instanceof CartCondition) { + $conditionsArray[] = $condition; + } + } + + if (! $hasSubArray) { + if ($conditions instanceof CartCondition) { + return $conditions; + } + + $conditionsArray[] = new CartCondition($conditions); + } + + return $conditionsArray; } /** @@ -108,14 +138,14 @@ public function getPriceWithConditions($formatted = true) $processed = 0; if ($this->hasConditions()) { - if (is_array($this->conditions)) { - foreach ($this->conditions as $condition) { + if (is_array($this->getConditions())) { + foreach ($this->getConditions() as $condition) { ($processed > 0) ? $toBeCalculated = $newPrice : $toBeCalculated = $originalPrice; $newPrice = $condition->applyCondition($toBeCalculated); $processed++; } } else { - $newPrice = $this['conditions']->applyCondition($originalPrice); + $newPrice = $this->getConditions()->applyCondition($originalPrice); } return Helpers::formatValue($newPrice, $formatted, $this->config); diff --git a/tests/Unit/DatabaseCartTest.php b/tests/Unit/DatabaseCartTest.php index 2e8a55f..f3deeda 100644 --- a/tests/Unit/DatabaseCartTest.php +++ b/tests/Unit/DatabaseCartTest.php @@ -1,6 +1,7 @@ cart->getContent()->count())->toEqual(0, 'Cart content should be 0'); expect($cartModel->items)->toEqual([], 'The carts database table should have 0 row'); }); + + test('can add an item with an item level condition', function () { + $saleCondition = new CartCondition([ + 'name' => '5% Discount', + 'type' => 'sale', + 'value' => '-5%', + ]); + + $item = [ + 'id' => 1, + 'name' => 'Chicken Curry', + 'price' => 18.95, + 'quantity' => 1, + 'attributes' => [], + 'conditions' => $saleCondition, + ]; + + $this->cart->add($item); + + expect($this->cart->get(1)->getPriceSum())->toEqual(18.95); + expect($this->cart->get(1)->getPriceSumWithConditions())->toEqual(18); + expect($this->cart->getSubTotal())->toEqual(18, 'Cart should have subtotal of 18'); + expect($this->cart->getTotal())->toEqual(18, 'Cart should have total of 18'); + }); + + test('can add an item with multiple item level conditions', function () { + $saleCondition = new CartCondition([ + 'name' => '5% Discount', + 'type' => 'sale', + 'value' => '-5%', + ]); + + $gstCondition = new CartCondition([ + 'name' => 'GST', + 'type' => 'gst', + 'value' => '2.5%', + ]); + + $item = [ + 'id' => 1, + 'name' => 'Chicken Curry', + 'price' => 18.95, + 'quantity' => 1, + 'attributes' => [], + 'conditions' => [$saleCondition, $gstCondition], + ]; + + $this->cart->add($item); + + expect($this->cart->get(1)->getPriceSum())->toEqual(18.95); + expect($this->cart->get(1)->getPriceSumWithConditions())->toEqual(18.45); + expect($this->cart->getSubTotal())->toEqual(18.45, 'Cart should have subtotal of 18.45'); + expect($this->cart->getTotal())->toEqual(18.45, 'Cart should have total of 18.45'); + }); }); From 4cf078277d9c9af15dd422cd59bcd4a1e47a65e1 Mon Sep 17 00:00:00 2001 From: Joel Male Date: Tue, 25 Feb 2025 16:54:03 +1000 Subject: [PATCH 7/7] feat: finish tests & docs --- README.md | 10 ++++++ src/Cart.php | 27 ++++++++------- src/CartSession.php | 55 +++++++++++++++++-------------- tests/Unit/CartConditionsTest.php | 6 ++-- tests/Unit/DatabaseCartTest.php | 16 +++++++++ 5 files changed, 75 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 44c705f..409dadf 100644 --- a/README.md +++ b/README.md @@ -300,10 +300,20 @@ #### Check if cart is empty: **Cart::isEmpty()** #### Clearing the Cart: **Cart::clear()** +This clears all items and conditions from the cart. + ```php Cart::clear(); ``` +#### Clearing the cart items only: **Cart::clearItems()** + +This clears all items, but keeps the conditions (useful for when you want to keep the conditions but remove the items) + +```php +Cart::clearItems(); +``` + ### Conditions Conditions are very useful for adding things like discounts, taxes, shipping, etc. diff --git a/src/Cart.php b/src/Cart.php index ae2d2f4..afc2d40 100644 --- a/src/Cart.php +++ b/src/Cart.php @@ -268,18 +268,26 @@ public function remove($id) return true; } - /** - * clear cart - * - * @return bool - */ public function clear() { if ($this->fireEvent('Clearing') === false) { return false; } - $this->session->putItems([]); + $this->session->clear(); + + $this->fireEvent('Cleared'); + + return true; + } + + public function clearItems() + { + if ($this->fireEvent('Clearing') === false) { + return false; + } + + $this->session->clearItems(); $this->fireEvent('Cleared'); @@ -654,12 +662,7 @@ public function getContent(): CartCollection }); } - /** - * check if cart is empty - * - * @return bool - */ - public function isEmpty() + public function isEmpty($test = null) { return $this->getContent()->isEmpty(); } diff --git a/src/CartSession.php b/src/CartSession.php index 70de9ca..38b11e6 100644 --- a/src/CartSession.php +++ b/src/CartSession.php @@ -32,10 +32,8 @@ public function __construct($session, $sessionKey, $config) $this->itemsKey = $config['storage']['database']['items']; $this->conditionsKey = $config['storage']['database']['conditions']; - // find or create the session in the database $this->session = $session->firstOrNew([$this->sessionId => $this->sessionKey]); - // initialize the items and conditions $this->session[$this->itemsKey] = $this->session[$this->itemsKey] ?? []; $this->session[$this->conditionsKey] = $this->session[$this->conditionsKey] ?? []; } @@ -56,22 +54,22 @@ public function has($key) public function getItems() { - return ! $this->customStorage ? $this->session->get($this->itemsKey) : $this->session[$this->itemsKey]; + return $this->driver == 'session' ? $this->session->get($this->itemsKey) : $this->session[$this->itemsKey]; } public function getConditions() { - return ! $this->customStorage ? $this->session->get($this->conditionsKey) : $this->session[$this->conditionsKey]; + return $this->driver == 'session' ? $this->session->get($this->conditionsKey) : $this->session[$this->conditionsKey]; } public function putItems($value) { - if (! $this->customStorage) { + if ($this->driver == 'session') { return $this->session->put($this->itemsKey, $value); } // convert any conditions to arrays - $value = $value->toArray(); + $value = is_array($value) ? $value : $value->toArray(); foreach ($value as $key => $item) { if ($item['conditions']) { @@ -85,17 +83,6 @@ public function putItems($value) } } - // if ($value['conditions']) { - // $value['conditions'] = $value['conditions']->map(function ($condition) { - // return $condition->toArray(); - // }); - // } - - // dd($value); - // $value = $value->map(function ($item) { - // return $item->toArray(); - // }); - $this->session[$this->itemsKey] = $value; $this->session->save(); @@ -104,7 +91,7 @@ public function putItems($value) public function putConditions($value) { - if (! $this->customStorage) { + if ($this->driver == 'session') { return $this->session->put($this->conditionsKey, $value); } @@ -120,16 +107,36 @@ public function putConditions($value) return $this->session; } - public function clear() + public function clearItems() { - if ($this->customStorage) { - return $this->session->delete(); + if ($this->driver == 'session') { + $this->session->forget($this->itemsKey); + + return true; } - $this->session->forget($this->itemsKey); - $this->session->forget($this->conditionsKey); + $this->session[$this->itemsKey] = []; - return true; + return $this->session->save(); + } + + public function clear() + { + if ($this->driver == 'session') { + $this->session->forget($this->itemsKey); + $this->session->forget($this->conditionsKey); + + return true; + } + + $deleted = $this->session->delete(); + + $this->session = [ + $this->itemsKey => [], + $this->conditionsKey => [], + ]; + + return $deleted; } public function getSessionModel() diff --git a/tests/Unit/CartConditionsTest.php b/tests/Unit/CartConditionsTest.php index aef51d4..ed0f020 100644 --- a/tests/Unit/CartConditionsTest.php +++ b/tests/Unit/CartConditionsTest.php @@ -1065,7 +1065,7 @@ expect($this->cart->getTotal())->toEqual(90, 'Cart should have total of 90'); - $this->cart->clear(); + $this->cart->clearItems(); $this->cart->add([ 'id' => 1, @@ -1099,7 +1099,7 @@ expect($this->cart->getTotal())->toEqual(90, 'Cart should have total of 90'); - $this->cart->clear(); + $this->cart->clearItems(); $this->cart->add([ 'id' => 1, @@ -1201,7 +1201,7 @@ expect($this->cart->getConditions(active: true))->toHaveCount(0, 'Cart should have 0 conditions'); - $this->cart->clear(); + $this->cart->clearItems(); $this->cart->add([ 'id' => 1, diff --git a/tests/Unit/DatabaseCartTest.php b/tests/Unit/DatabaseCartTest.php index f3deeda..4e4f5ba 100644 --- a/tests/Unit/DatabaseCartTest.php +++ b/tests/Unit/DatabaseCartTest.php @@ -107,4 +107,20 @@ expect($this->cart->getSubTotal())->toEqual(18.45, 'Cart should have subtotal of 18.45'); expect($this->cart->getTotal())->toEqual(18.45, 'Cart should have total of 18.45'); }); + + test('can clear a simple cart', function () { + $this->cart->add(1, 'Sample Item', 100.99, 2, []); + + expect($this->cart->isEmpty())->toBeFalse('Cart should not be empty'); + expect($this->cart->getContent()->count())->toEqual(1, 'Cart content should be 1'); + expect($this->cart->getContent()->first()['id'])->toEqual(1, 'Item added has ID of 1 so first content ID should be 1'); + expect($this->cart->getContent()->first()['price'])->toEqual(100.99, 'Item added has price of 100.99 so first content price should be 100.99'); + expect(MockCartModel::all()->count())->toEqual(1, 'The carts database table should have 1 row'); + + $this->cart->clear(); + + expect($this->cart->isEmpty())->toBeTrue('Cart should be empty'); + expect($this->cart->getContent()->count())->toEqual(0, 'Cart content should be 0'); + expect(MockCartModel::all()->count())->toEqual(0, 'The carts database table should have 0 rows'); + }); });