Compare commits

..

4 commits
0.30.0 ... main

Author SHA1 Message Date
Benjamin Nussbaum
90fbfadfa4 chore: update dependencies
Some checks are pending
tests / ci (push) Waiting to run
2026-03-14 19:06:52 +01:00
Benjamin Nussbaum
7301cac8ca fix(#203): add iCal workaround where if ORGANIZER has no parameters
Some checks failed
tests / ci (push) Has been cancelled
2026-03-11 11:58:04 +01:00
Benjamin Nussbaum
5ca028b885 chore(#155): update om/icalparser; require PHP 8.4
Some checks are pending
tests / ci (push) Waiting to run
2026-03-11 06:46:14 +01:00
Benjamin Nussbaum
7864c8b7ab chore: update dependencies 2026-03-11 06:41:17 +01:00
4 changed files with 264 additions and 94 deletions

View file

@ -25,7 +25,12 @@ class IcalResponseParser implements ResponseParser
} }
try { try {
$this->parser->parseString($body); // Workaround for om/icalparser v4.0.0 bug where it fails if ORGANIZER or ATTENDEE has no parameters.
// When ORGANIZER or ATTENDEE has no parameters (no semicolon after the key),
// IcalParser::parseRow returns an empty string for $middle instead of an array,
// which causes a type error in a foreach loop in IcalParser::parseString.
$normalizedBody = preg_replace('/^(ORGANIZER|ATTENDEE):/m', '$1;CN=Unknown:', $body);
$this->parser->parseString($normalizedBody);
$events = $this->parser->getEvents()->sorted()->getArrayCopy(); $events = $this->parser->getEvents()->sorted()->getArrayCopy();
$windowStart = now()->subDays(7); $windowStart = now()->subDays(7);

View file

@ -11,7 +11,7 @@
], ],
"license": "MIT", "license": "MIT",
"require": { "require": {
"php": "^8.2", "php": "^8.4",
"ext-imagick": "*", "ext-imagick": "*",
"ext-simplexml": "*", "ext-simplexml": "*",
"ext-zip": "*", "ext-zip": "*",
@ -25,7 +25,7 @@
"laravel/tinker": "^2.10.1", "laravel/tinker": "^2.10.1",
"livewire/flux": "^2.0", "livewire/flux": "^2.0",
"livewire/livewire": "^4.0", "livewire/livewire": "^4.0",
"om/icalparser": "^3.2", "om/icalparser": "^4.0",
"spatie/browsershot": "^5.0", "spatie/browsershot": "^5.0",
"spatie/laravel-settings": "^3.6", "spatie/laravel-settings": "^3.6",
"stevebauman/purify": "^6.3", "stevebauman/purify": "^6.3",

184
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "a1b56974da6a4f33fe847dba0549a6e0", "content-hash": "c13d003eb08beac106e67bfbeff85dd9",
"packages": [ "packages": [
{ {
"name": "aws/aws-crt-php", "name": "aws/aws-crt-php",
@ -62,16 +62,16 @@
}, },
{ {
"name": "aws/aws-sdk-php", "name": "aws/aws-sdk-php",
"version": "3.372.1", "version": "3.373.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/aws/aws-sdk-php.git", "url": "https://github.com/aws/aws-sdk-php.git",
"reference": "a48ff951eaad7f038eca3e0e89f168048b99082b" "reference": "483fba51c28b3a0c0647bf5100e0edca82090b18"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a48ff951eaad7f038eca3e0e89f168048b99082b", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/483fba51c28b3a0c0647bf5100e0edca82090b18",
"reference": "a48ff951eaad7f038eca3e0e89f168048b99082b", "reference": "483fba51c28b3a0c0647bf5100e0edca82090b18",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -92,12 +92,12 @@
"aws/aws-php-sns-message-validator": "~1.0", "aws/aws-php-sns-message-validator": "~1.0",
"behat/behat": "~3.0", "behat/behat": "~3.0",
"composer/composer": "^2.7.8", "composer/composer": "^2.7.8",
"dms/phpunit-arraysubset-asserts": "^0.4.0", "dms/phpunit-arraysubset-asserts": "^v0.5.0",
"doctrine/cache": "~1.4", "doctrine/cache": "~1.4",
"ext-dom": "*", "ext-dom": "*",
"ext-openssl": "*", "ext-openssl": "*",
"ext-sockets": "*", "ext-sockets": "*",
"phpunit/phpunit": "^9.6", "phpunit/phpunit": "^10.0",
"psr/cache": "^2.0 || ^3.0", "psr/cache": "^2.0 || ^3.0",
"psr/simple-cache": "^2.0 || ^3.0", "psr/simple-cache": "^2.0 || ^3.0",
"sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0", "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0",
@ -153,9 +153,9 @@
"support": { "support": {
"forum": "https://github.com/aws/aws-sdk-php/discussions", "forum": "https://github.com/aws/aws-sdk-php/discussions",
"issues": "https://github.com/aws/aws-sdk-php/issues", "issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.372.1" "source": "https://github.com/aws/aws-sdk-php/tree/3.373.2"
}, },
"time": "2026-03-06T21:27:21+00:00" "time": "2026-03-13T18:08:30+00:00"
}, },
{ {
"name": "bacon/bacon-qr-code", "name": "bacon/bacon-qr-code",
@ -1435,16 +1435,16 @@
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
"version": "2.8.0", "version": "2.9.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/psr7.git", "url": "https://github.com/guzzle/psr7.git",
"reference": "21dc724a0583619cd1652f673303492272778051" "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884",
"reference": "21dc724a0583619cd1652f673303492272778051", "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1460,6 +1460,7 @@
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2", "bamarni/composer-bin-plugin": "^1.8.2",
"http-interop/http-factory-tests": "0.9.0", "http-interop/http-factory-tests": "0.9.0",
"jshttp/mime-db": "1.54.0.1",
"phpunit/phpunit": "^8.5.44 || ^9.6.25" "phpunit/phpunit": "^8.5.44 || ^9.6.25"
}, },
"suggest": { "suggest": {
@ -1531,7 +1532,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/psr7/issues", "issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.8.0" "source": "https://github.com/guzzle/psr7/tree/2.9.0"
}, },
"funding": [ "funding": [
{ {
@ -1547,7 +1548,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-08-23T21:21:41+00:00" "time": "2026-03-10T16:41:02+00:00"
}, },
{ {
"name": "guzzlehttp/uri-template", "name": "guzzlehttp/uri-template",
@ -1831,16 +1832,16 @@
}, },
{ {
"name": "laravel/fortify", "name": "laravel/fortify",
"version": "v1.35.0", "version": "v1.36.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/fortify.git", "url": "https://github.com/laravel/fortify.git",
"reference": "24c5bb81ea4787e0865c4a62f054ed7d1cb7a093" "reference": "cad8bfeb63f6818f173d40090725c565c92651d4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/fortify/zipball/24c5bb81ea4787e0865c4a62f054ed7d1cb7a093", "url": "https://api.github.com/repos/laravel/fortify/zipball/cad8bfeb63f6818f173d40090725c565c92651d4",
"reference": "24c5bb81ea4787e0865c4a62f054ed7d1cb7a093", "reference": "cad8bfeb63f6818f173d40090725c565c92651d4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1890,20 +1891,20 @@
"issues": "https://github.com/laravel/fortify/issues", "issues": "https://github.com/laravel/fortify/issues",
"source": "https://github.com/laravel/fortify" "source": "https://github.com/laravel/fortify"
}, },
"time": "2026-02-24T14:00:44+00:00" "time": "2026-03-10T19:59:49+00:00"
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v12.53.0", "version": "v12.54.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "f57f035c0d34503d9ff30be76159bb35a003cd1f" "reference": "325497463e7599cd14224c422c6e5dd2fe832868"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/f57f035c0d34503d9ff30be76159bb35a003cd1f", "url": "https://api.github.com/repos/laravel/framework/zipball/325497463e7599cd14224c422c6e5dd2fe832868",
"reference": "f57f035c0d34503d9ff30be76159bb35a003cd1f", "reference": "325497463e7599cd14224c422c6e5dd2fe832868",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1924,7 +1925,7 @@
"guzzlehttp/uri-template": "^1.0", "guzzlehttp/uri-template": "^1.0",
"laravel/prompts": "^0.3.0", "laravel/prompts": "^0.3.0",
"laravel/serializable-closure": "^1.3|^2.0", "laravel/serializable-closure": "^1.3|^2.0",
"league/commonmark": "^2.7", "league/commonmark": "^2.8.1",
"league/flysystem": "^3.25.1", "league/flysystem": "^3.25.1",
"league/flysystem-local": "^3.25.1", "league/flysystem-local": "^3.25.1",
"league/uri": "^7.5.1", "league/uri": "^7.5.1",
@ -2112,20 +2113,20 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2026-02-24T14:35:15+00:00" "time": "2026-03-10T20:25:56+00:00"
}, },
{ {
"name": "laravel/prompts", "name": "laravel/prompts",
"version": "v0.3.13", "version": "v0.3.14",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/prompts.git", "url": "https://github.com/laravel/prompts.git",
"reference": "ed8c466571b37e977532fb2fd3c272c784d7050d" "reference": "9f0e371244eedfe2ebeaa72c79c54bb5df6e0176"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/prompts/zipball/ed8c466571b37e977532fb2fd3c272c784d7050d", "url": "https://api.github.com/repos/laravel/prompts/zipball/9f0e371244eedfe2ebeaa72c79c54bb5df6e0176",
"reference": "ed8c466571b37e977532fb2fd3c272c784d7050d", "reference": "9f0e371244eedfe2ebeaa72c79c54bb5df6e0176",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2169,9 +2170,9 @@
"description": "Add beautiful and user-friendly forms to your command-line applications.", "description": "Add beautiful and user-friendly forms to your command-line applications.",
"support": { "support": {
"issues": "https://github.com/laravel/prompts/issues", "issues": "https://github.com/laravel/prompts/issues",
"source": "https://github.com/laravel/prompts/tree/v0.3.13" "source": "https://github.com/laravel/prompts/tree/v0.3.14"
}, },
"time": "2026-02-06T12:17:10+00:00" "time": "2026-03-01T09:02:38+00:00"
}, },
{ {
"name": "laravel/sanctum", "name": "laravel/sanctum",
@ -2299,16 +2300,16 @@
}, },
{ {
"name": "laravel/socialite", "name": "laravel/socialite",
"version": "v5.24.3", "version": "v5.25.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/socialite.git", "url": "https://github.com/laravel/socialite.git",
"reference": "0feb62267e7b8abc68593ca37639ad302728c129" "reference": "231f572e1a37c9ca1fb8085e9fb8608285beafb3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/socialite/zipball/0feb62267e7b8abc68593ca37639ad302728c129", "url": "https://api.github.com/repos/laravel/socialite/zipball/231f572e1a37c9ca1fb8085e9fb8608285beafb3",
"reference": "0feb62267e7b8abc68593ca37639ad302728c129", "reference": "231f572e1a37c9ca1fb8085e9fb8608285beafb3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2367,7 +2368,7 @@
"issues": "https://github.com/laravel/socialite/issues", "issues": "https://github.com/laravel/socialite/issues",
"source": "https://github.com/laravel/socialite" "source": "https://github.com/laravel/socialite"
}, },
"time": "2026-02-21T13:32:50+00:00" "time": "2026-02-27T13:56:35+00:00"
}, },
{ {
"name": "laravel/tinker", "name": "laravel/tinker",
@ -3517,16 +3518,16 @@
}, },
{ {
"name": "nesbot/carbon", "name": "nesbot/carbon",
"version": "3.11.1", "version": "3.11.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/CarbonPHP/carbon.git", "url": "https://github.com/CarbonPHP/carbon.git",
"reference": "f438fcc98f92babee98381d399c65336f3a3827f" "reference": "6a7e652845bb018c668220c2a545aded8594fbbf"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/f438fcc98f92babee98381d399c65336f3a3827f", "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/6a7e652845bb018c668220c2a545aded8594fbbf",
"reference": "f438fcc98f92babee98381d399c65336f3a3827f", "reference": "6a7e652845bb018c668220c2a545aded8594fbbf",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3618,7 +3619,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-01-29T09:26:29+00:00" "time": "2026-03-11T17:23:39+00:00"
}, },
{ {
"name": "nette/schema", "name": "nette/schema",
@ -3925,32 +3926,32 @@
}, },
{ {
"name": "om/icalparser", "name": "om/icalparser",
"version": "v3.2.1", "version": "v4.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/OzzyCzech/icalparser.git", "url": "https://github.com/OzzyCzech/icalparser.git",
"reference": "bc7a82b12455ae9b62ce8e7f2d0273e86c931ecc" "reference": "3e60e2edf0bdfed6c81b69dccf0b7f2852cd87a6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/OzzyCzech/icalparser/zipball/bc7a82b12455ae9b62ce8e7f2d0273e86c931ecc", "url": "https://api.github.com/repos/OzzyCzech/icalparser/zipball/3e60e2edf0bdfed6c81b69dccf0b7f2852cd87a6",
"reference": "bc7a82b12455ae9b62ce8e7f2d0273e86c931ecc", "reference": "3e60e2edf0bdfed6c81b69dccf0b7f2852cd87a6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1.0" "php": "^8.4"
}, },
"require-dev": { "require-dev": {
"nette/tester": "^2.5.7" "nette/tester": "^2.6.0"
}, },
"suggest": { "suggest": {
"ext-dom": "for timezone tool" "ext-dom": "for timezone tool"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
"classmap": [ "psr-4": {
"src/" "om\\": "src/"
] }
}, },
"notification-url": "https://packagist.org/downloads/", "notification-url": "https://packagist.org/downloads/",
"license": [ "license": [
@ -3970,9 +3971,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/OzzyCzech/icalparser/issues", "issues": "https://github.com/OzzyCzech/icalparser/issues",
"source": "https://github.com/OzzyCzech/icalparser/tree/v3.2.1" "source": "https://github.com/OzzyCzech/icalparser/tree/v4.0.0"
}, },
"time": "2025-12-15T06:25:09+00:00" "time": "2026-01-29T16:45:33+00:00"
}, },
{ {
"name": "paragonie/constant_time_encoding", "name": "paragonie/constant_time_encoding",
@ -8451,21 +8452,21 @@
}, },
{ {
"name": "wnx/sidecar-browsershot", "name": "wnx/sidecar-browsershot",
"version": "v2.8.0", "version": "v2.9.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/stefanzweifel/sidecar-browsershot.git", "url": "https://github.com/stefanzweifel/sidecar-browsershot.git",
"reference": "1d2a20a6723b74c139f98f7a020fe5c0f57d05a5" "reference": "352083995009bec142ff0c7ae4b2883831be0685"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/stefanzweifel/sidecar-browsershot/zipball/1d2a20a6723b74c139f98f7a020fe5c0f57d05a5", "url": "https://api.github.com/repos/stefanzweifel/sidecar-browsershot/zipball/352083995009bec142ff0c7ae4b2883831be0685",
"reference": "1d2a20a6723b74c139f98f7a020fe5c0f57d05a5", "reference": "352083995009bec142ff0c7ae4b2883831be0685",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"hammerstone/sidecar": "^0.7.1", "hammerstone/sidecar": "^0.7.1 | ^0.8.0",
"illuminate/contracts": "^12.0", "illuminate/contracts": "^12.0 | ^13.0",
"php": "^8.4", "php": "^8.4",
"spatie/browsershot": "^5.0", "spatie/browsershot": "^5.0",
"spatie/laravel-package-tools": "^1.9.2" "spatie/laravel-package-tools": "^1.9.2"
@ -8475,7 +8476,7 @@
"laravel/pint": "^1.13", "laravel/pint": "^1.13",
"league/flysystem-aws-s3-v3": "^1.0|^2.0|^3.0", "league/flysystem-aws-s3-v3": "^1.0|^2.0|^3.0",
"nunomaduro/collision": "^7.0|^8.0", "nunomaduro/collision": "^7.0|^8.0",
"orchestra/testbench": "^10.0", "orchestra/testbench": "^10.0 | ^11.0",
"pestphp/pest": "^3.0|^4.0", "pestphp/pest": "^3.0|^4.0",
"pestphp/pest-plugin-laravel": "^3.0|^4.0", "pestphp/pest-plugin-laravel": "^3.0|^4.0",
"phpstan/extension-installer": "^1.1", "phpstan/extension-installer": "^1.1",
@ -8525,7 +8526,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/stefanzweifel/sidecar-browsershot/issues", "issues": "https://github.com/stefanzweifel/sidecar-browsershot/issues",
"source": "https://github.com/stefanzweifel/sidecar-browsershot/tree/v2.8.0" "source": "https://github.com/stefanzweifel/sidecar-browsershot/tree/v2.9.0"
}, },
"funding": [ "funding": [
{ {
@ -8533,7 +8534,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2026-03-07T18:24:28+00:00" "time": "2026-03-13T20:12:58+00:00"
} }
], ],
"packages-dev": [ "packages-dev": [
@ -9069,16 +9070,16 @@
}, },
{ {
"name": "laravel/boost", "name": "laravel/boost",
"version": "v2.2.3", "version": "v2.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/boost.git", "url": "https://github.com/laravel/boost.git",
"reference": "44ab65a5455c2d6fceb71d6145f8d5d89c02d889" "reference": "ba0a9e6497398b6ce8243f5517b67d6761509150"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/boost/zipball/44ab65a5455c2d6fceb71d6145f8d5d89c02d889", "url": "https://api.github.com/repos/laravel/boost/zipball/ba0a9e6497398b6ce8243f5517b67d6761509150",
"reference": "44ab65a5455c2d6fceb71d6145f8d5d89c02d889", "reference": "ba0a9e6497398b6ce8243f5517b67d6761509150",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9131,20 +9132,20 @@
"issues": "https://github.com/laravel/boost/issues", "issues": "https://github.com/laravel/boost/issues",
"source": "https://github.com/laravel/boost" "source": "https://github.com/laravel/boost"
}, },
"time": "2026-03-06T20:20:28+00:00" "time": "2026-03-12T09:06:47+00:00"
}, },
{ {
"name": "laravel/mcp", "name": "laravel/mcp",
"version": "v0.6.0", "version": "v0.6.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/mcp.git", "url": "https://github.com/laravel/mcp.git",
"reference": "28860a10ca0cc5433e25d897ba7af844e6c7b6a2" "reference": "f696e44735b95ff275392eab8ce5a3b4b42a2223"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/mcp/zipball/28860a10ca0cc5433e25d897ba7af844e6c7b6a2", "url": "https://api.github.com/repos/laravel/mcp/zipball/f696e44735b95ff275392eab8ce5a3b4b42a2223",
"reference": "28860a10ca0cc5433e25d897ba7af844e6c7b6a2", "reference": "f696e44735b95ff275392eab8ce5a3b4b42a2223",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9204,7 +9205,7 @@
"issues": "https://github.com/laravel/mcp/issues", "issues": "https://github.com/laravel/mcp/issues",
"source": "https://github.com/laravel/mcp" "source": "https://github.com/laravel/mcp"
}, },
"time": "2026-02-24T08:43:06+00:00" "time": "2026-03-10T20:00:23+00:00"
}, },
{ {
"name": "laravel/pail", "name": "laravel/pail",
@ -9288,16 +9289,16 @@
}, },
{ {
"name": "laravel/pint", "name": "laravel/pint",
"version": "v1.27.1", "version": "v1.29.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/pint.git", "url": "https://github.com/laravel/pint.git",
"reference": "54cca2de13790570c7b6f0f94f37896bee4abcb5" "reference": "bdec963f53172c5e36330f3a400604c69bf02d39"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/pint/zipball/54cca2de13790570c7b6f0f94f37896bee4abcb5", "url": "https://api.github.com/repos/laravel/pint/zipball/bdec963f53172c5e36330f3a400604c69bf02d39",
"reference": "54cca2de13790570c7b6f0f94f37896bee4abcb5", "reference": "bdec963f53172c5e36330f3a400604c69bf02d39",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9308,13 +9309,14 @@
"php": "^8.2.0" "php": "^8.2.0"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^3.93.1", "friendsofphp/php-cs-fixer": "^3.94.2",
"illuminate/view": "^12.51.0", "illuminate/view": "^12.54.1",
"larastan/larastan": "^3.9.2", "larastan/larastan": "^3.9.3",
"laravel-zero/framework": "^12.0.5", "laravel-zero/framework": "^12.0.5",
"mockery/mockery": "^1.6.12", "mockery/mockery": "^1.6.12",
"nunomaduro/termwind": "^2.3.3", "nunomaduro/termwind": "^2.4.0",
"pestphp/pest": "^3.8.5" "pestphp/pest": "^3.8.6",
"shipfastlabs/agent-detector": "^1.1.0"
}, },
"bin": [ "bin": [
"builds/pint" "builds/pint"
@ -9351,7 +9353,7 @@
"issues": "https://github.com/laravel/pint/issues", "issues": "https://github.com/laravel/pint/issues",
"source": "https://github.com/laravel/pint" "source": "https://github.com/laravel/pint"
}, },
"time": "2026-02-10T20:00:20+00:00" "time": "2026-03-12T15:51:39+00:00"
}, },
{ {
"name": "laravel/roster", "name": "laravel/roster",
@ -9718,21 +9720,21 @@
}, },
{ {
"name": "pestphp/pest", "name": "pestphp/pest",
"version": "v4.4.1", "version": "v4.4.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/pestphp/pest.git", "url": "https://github.com/pestphp/pest.git",
"reference": "f96a1b27864b585b0b29b0ee7331176726f7e54a" "reference": "5d42e8fe3ae1d9fdf7c9f73ee88138fd30265701"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/pestphp/pest/zipball/f96a1b27864b585b0b29b0ee7331176726f7e54a", "url": "https://api.github.com/repos/pestphp/pest/zipball/5d42e8fe3ae1d9fdf7c9f73ee88138fd30265701",
"reference": "f96a1b27864b585b0b29b0ee7331176726f7e54a", "reference": "5d42e8fe3ae1d9fdf7c9f73ee88138fd30265701",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"brianium/paratest": "^7.19.0", "brianium/paratest": "^7.19.0",
"nunomaduro/collision": "^8.9.0", "nunomaduro/collision": "^8.9.1",
"nunomaduro/termwind": "^2.4.0", "nunomaduro/termwind": "^2.4.0",
"pestphp/pest-plugin": "^4.0.0", "pestphp/pest-plugin": "^4.0.0",
"pestphp/pest-plugin-arch": "^4.0.0", "pestphp/pest-plugin-arch": "^4.0.0",
@ -9752,7 +9754,7 @@
"pestphp/pest-dev-tools": "^4.1.0", "pestphp/pest-dev-tools": "^4.1.0",
"pestphp/pest-plugin-browser": "^4.3.0", "pestphp/pest-plugin-browser": "^4.3.0",
"pestphp/pest-plugin-type-coverage": "^4.0.3", "pestphp/pest-plugin-type-coverage": "^4.0.3",
"psy/psysh": "^0.12.20" "psy/psysh": "^0.12.21"
}, },
"bin": [ "bin": [
"bin/pest" "bin/pest"
@ -9818,7 +9820,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/pestphp/pest/issues", "issues": "https://github.com/pestphp/pest/issues",
"source": "https://github.com/pestphp/pest/tree/v4.4.1" "source": "https://github.com/pestphp/pest/tree/v4.4.2"
}, },
"funding": [ "funding": [
{ {
@ -9830,7 +9832,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2026-02-17T15:27:18+00:00" "time": "2026-03-10T21:09:12+00:00"
}, },
{ {
"name": "pestphp/pest-plugin", "name": "pestphp/pest-plugin",
@ -12121,7 +12123,7 @@
"prefer-stable": true, "prefer-stable": true,
"prefer-lowest": false, "prefer-lowest": false,
"platform": { "platform": {
"php": "^8.2", "php": "^8.4",
"ext-imagick": "*", "ext-imagick": "*",
"ext-simplexml": "*", "ext-simplexml": "*",
"ext-zip": "*" "ext-zip": "*"

View file

@ -0,0 +1,163 @@
<?php
declare(strict_types=1);
use App\Models\Plugin;
use Carbon\Carbon;
use Illuminate\Support\Facades\Http;
test('iCal plugin parses Google Calendar invitation event', function (): void {
// Set test time close to the event in the issue
Carbon::setTestNow(Carbon::parse('2026-03-10 12:00:00', 'Europe/Budapest'));
$icalContent = <<<'ICS'
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//EN
BEGIN:VEVENT
DTSTART;TZID=Europe/Budapest:20260311T100000
DTEND;TZID=Europe/Budapest:20260311T110000
DTSTAMP:20260301T100000Z
ORGANIZER:mailto:organizer@example.com
UID:xxxxxxxxxxxxxxxxxxx@google.com
SEQUENCE:0
DESCRIPTION:-::~:~::~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~
·:~:~:~:~:~:~:~:~::~:~::-
Csatlakozás a Google Meet szolgáltatással: https://meet.google.com/xxx-xxxx-xxx
További információ a Meetről: https://support.google.com/a/users/answer/9282720
Kérjük, ne szerkeszd ezt a szakaszt.
-::~:~::~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~:~
·:~:~:~:~:~:~:~:~:~:~:~:~::~:~::-
LOCATION:Meet XY Street, ZIP; https://meet.google.com/xxx-xxxx-xxx
SUMMARY:Meeting
STATUS:CONFIRMED
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSVP=TRUE;X-NUM-GUESTS=0;X-PM-TOKEN=REDACTED;PARTSTAT=ACCEPTED:mailto:participant1@example.com
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN=participant2@example.com;X-NUM-GUESTS=0;X-PM-TOKEN=REDACTED;PARTSTAT=ACCEPTED:mailto:participant2@example.com
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN=participant3@example.com;X-NUM-GUESTS=0;X-PM-TOKEN=REDACTED;PARTSTAT=NEEDS-ACTION:mailto:participant3@example.com
END:VEVENT
END:VCALENDAR
ICS;
Http::fake([
'example.com/calendar.ics' => Http::response($icalContent, 200, ['Content-Type' => 'text/calendar']),
]);
$plugin = Plugin::factory()->create([
'data_strategy' => 'polling',
'polling_url' => 'https://example.com/calendar.ics',
'polling_verb' => 'get',
]);
$plugin->updateDataPayload();
$plugin->refresh();
expect($plugin->data_payload)->not->toHaveKey('error');
expect($plugin->data_payload)->toHaveKey('ical');
expect($plugin->data_payload['ical'])->toHaveCount(1);
expect($plugin->data_payload['ical'][0]['SUMMARY'])->toBe('Meeting');
Carbon::setTestNow();
});
test('iCal plugin parses recurring events with multiple BYDAY correctly', function (): void {
// Set test now to Monday 2024-03-25
Carbon::setTestNow(Carbon::parse('2024-03-25 12:00:00', 'UTC'));
$icalContent = <<<'ICS'
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//EN
BEGIN:VEVENT
DESCRIPTION:XXX-REDACTED
RRULE:FREQ=WEEKLY;UNTIL=20250604T220000Z;INTERVAL=1;BYDAY=TU,TH;WKST=MO
UID:040000008200E00074C5B7101A82E00800000000E07AF34F937EDA01000000000000000
01000000061F3E918C753424E8154B36E55452933
SUMMARY:Recurring Meeting
DTSTART;VALUE=DATE:20240326
DTEND;VALUE=DATE:20240327
DTSTAMP:20240605T082436Z
CLASS:PUBLIC
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR
ICS;
Http::fake([
'example.com/recurring.ics' => Http::response($icalContent, 200, ['Content-Type' => 'text/calendar']),
]);
$plugin = Plugin::factory()->create([
'data_strategy' => 'polling',
'polling_url' => 'https://example.com/recurring.ics',
'polling_verb' => 'get',
]);
$plugin->updateDataPayload();
$plugin->refresh();
$ical = $plugin->data_payload['ical'];
// Week of March 25, 2024:
// Tue March 26: 2024-03-26 (DTSTART)
// Thu March 28: 2024-03-28 (Recurrence)
// The parser window is now-7 days to now+30 days.
// Window: 2024-03-18 to 2024-04-24.
$summaries = collect($ical)->pluck('SUMMARY');
expect($summaries)->toContain('Recurring Meeting');
$dates = collect($ical)->map(fn ($event) => Carbon::parse($event['DTSTART'])->format('Y-m-d'))->values();
// Check if Tuesday March 26 is present
expect($dates)->toContain('2024-03-26');
// Check if Thursday March 28 is present (THIS IS WHERE IT IS EXPECTED TO FAIL BASED ON THE ISSUE)
expect($dates)->toContain('2024-03-28');
Carbon::setTestNow();
});
test('iCal plugin parses recurring events with multiple BYDAY and specific DTSTART correctly', function (): void {
// Set test now to Monday 2024-03-25
Carbon::setTestNow(Carbon::parse('2024-03-25 12:00:00', 'UTC'));
$icalContent = <<<'ICS'
BEGIN:VCALENDAR
VERSION:2.0
X-WR-TIMEZONE:UTC
PRODID:-//Example Corp.//EN
BEGIN:VEVENT
RRULE:FREQ=WEEKLY;UNTIL=20250604T220000Z;INTERVAL=1;BYDAY=TU,TH;WKST=MO
UID:recurring-event-2
SUMMARY:Recurring Meeting 2
DTSTART:20240326T100000
DTEND:20240326T110000
DTSTAMP:20240605T082436Z
END:VEVENT
END:VCALENDAR
ICS;
Http::fake([
'example.com/recurring2.ics' => Http::response($icalContent, 200, ['Content-Type' => 'text/calendar']),
]);
$plugin = Plugin::factory()->create([
'data_strategy' => 'polling',
'polling_url' => 'https://example.com/recurring2.ics',
'polling_verb' => 'get',
]);
$plugin->updateDataPayload();
$plugin->refresh();
$ical = $plugin->data_payload['ical'];
$dates = collect($ical)->map(fn ($event) => Carbon::parse($event['DTSTART'])->format('Y-m-d'))->values();
expect($dates)->toContain('2024-03-26');
expect($dates)->toContain('2024-03-28');
Carbon::setTestNow();
});