From 68ec0d3eb2ed6768b234b445efd16627b5462162 Mon Sep 17 00:00:00 2001 From: rubenvanassche Date: Wed, 29 May 2024 08:11:41 +0000 Subject: [PATCH 01/30] Update CHANGELOG --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dd0252c..6d3e2b2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to `ignition` will be documented in this file +## 1.14.2 - 2024-05-29 + +- Add Cursor as an editor + +**Full Changelog**: https://github.com/spatie/ignition/compare/1.14.1...1.14.2 + ## 1.14.1 - 2024-05-03 ### What's Changed From 276e921eaeb7a61ca96419b6ab219409a0c8e5cd Mon Sep 17 00:00:00 2001 From: Ruben Van Assche Date: Wed, 12 Jun 2024 12:11:49 +0200 Subject: [PATCH 02/30] Solutions refactor --- composer.json | 5 +- phpstan-baseline.neon | 45 ------- src/Contracts/BaseSolution.php | 65 ---------- src/Contracts/HasSolutionsForThrowable.php | 16 --- src/Contracts/ProvidesSolution.php | 11 -- src/Contracts/RunnableSolution.php | 16 --- src/Contracts/Solution.php | 13 -- src/Contracts/SolutionProviderRepository.php | 36 ------ src/ErrorPage/ErrorPageViewModel.php | 4 +- src/Ignition.php | 12 +- src/Solutions/OpenAi/DummyCache.php | 48 ------- .../OpenAi/OpenAiPromptViewModel.php | 46 ------- src/Solutions/OpenAi/OpenAiSolution.php | 115 ----------------- .../OpenAi/OpenAiSolutionProvider.php | 62 --------- .../OpenAi/OpenAiSolutionResponse.php | 58 --------- .../BadMethodCallSolutionProvider.php | 98 -------------- .../MergeConflictSolutionProvider.php | 74 ----------- .../SolutionProviderRepository.php | 101 --------------- .../UndefinedPropertySolutionProvider.php | 121 ------------------ src/Solutions/SolutionTransformer.php | 30 ----- .../SuggestCorrectVariableNameSolution.php | 43 ------- src/Solutions/SuggestImportSolution.php | 30 ----- .../Solutions/OpenAiSolutionProviderTest.php | 29 ----- .../UndefinedPropertySolutionProviderTest.php | 41 ------ 24 files changed, 11 insertions(+), 1108 deletions(-) delete mode 100644 src/Contracts/BaseSolution.php delete mode 100644 src/Contracts/HasSolutionsForThrowable.php delete mode 100644 src/Contracts/ProvidesSolution.php delete mode 100644 src/Contracts/RunnableSolution.php delete mode 100644 src/Contracts/Solution.php delete mode 100644 src/Contracts/SolutionProviderRepository.php delete mode 100644 src/Solutions/OpenAi/DummyCache.php delete mode 100644 src/Solutions/OpenAi/OpenAiPromptViewModel.php delete mode 100644 src/Solutions/OpenAi/OpenAiSolution.php delete mode 100644 src/Solutions/OpenAi/OpenAiSolutionProvider.php delete mode 100644 src/Solutions/OpenAi/OpenAiSolutionResponse.php delete mode 100644 src/Solutions/SolutionProviders/BadMethodCallSolutionProvider.php delete mode 100644 src/Solutions/SolutionProviders/MergeConflictSolutionProvider.php delete mode 100644 src/Solutions/SolutionProviders/SolutionProviderRepository.php delete mode 100644 src/Solutions/SolutionProviders/UndefinedPropertySolutionProvider.php delete mode 100644 src/Solutions/SolutionTransformer.php delete mode 100644 src/Solutions/SuggestCorrectVariableNameSolution.php delete mode 100644 src/Solutions/SuggestImportSolution.php delete mode 100644 tests/Solutions/OpenAiSolutionProviderTest.php delete mode 100644 tests/Solutions/UndefinedPropertySolutionProviderTest.php diff --git a/composer.json b/composer.json index a749b10c..96c68f3d 100644 --- a/composer.json +++ b/composer.json @@ -21,9 +21,10 @@ "ext-json": "*", "ext-mbstring": "*", "spatie/backtrace": "^1.5.3", - "spatie/flare-client-php": "^1.4.0", + "spatie/flare-client-php": "dev-solutions-refactor", "symfony/console": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0", + "spatie/error-solutions": "dev-main" }, "require-dev" : { "illuminate/cache" : "^9.52|^10.0|^11.0", diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 0c39cdfa..363209dd 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1,10 +1,5 @@ parameters: ignoreErrors: - - - message: "#^PHPDoc tag @param for parameter \\$solutionProvider with type class\\-string\\\\|Spatie\\\\Ignition\\\\Contracts\\\\HasSolutionsForThrowable is not subtype of native type string\\.$#" - count: 1 - path: src/Contracts/SolutionProviderRepository.php - - message: "#^Method Spatie\\\\Ignition\\\\ErrorPage\\\\Renderer\\:\\:renderAsString\\(\\) has parameter \\$date with no value type specified in iterable type array\\.$#" count: 1 @@ -24,43 +19,3 @@ parameters: message: "#^Parameter \\#1 \\$callback of function set_exception_handler expects \\(callable\\(Throwable\\)\\: void\\)\\|null, array\\{\\$this\\(Spatie\\\\Ignition\\\\Ignition\\), 'handleException'\\} given\\.$#" count: 1 path: src/Ignition.php - - - - message: "#^Method Spatie\\\\Ignition\\\\Solutions\\\\OpenAi\\\\DummyCache\\:\\:setMultiple\\(\\) has parameter \\$values with no value type specified in iterable type iterable\\.$#" - count: 1 - path: src/Solutions/OpenAi/DummyCache.php - - - - message: "#^Cannot call method get\\(\\) on Psr\\\\SimpleCache\\\\CacheInterface\\|null\\.$#" - count: 1 - path: src/Solutions/OpenAi/OpenAiSolution.php - - - - message: "#^Cannot call method getSnippetAsString\\(\\) on Spatie\\\\Backtrace\\\\Frame\\|null\\.$#" - count: 1 - path: src/Solutions/OpenAi/OpenAiSolution.php - - - - message: "#^Cannot call method set\\(\\) on Psr\\\\SimpleCache\\\\CacheInterface\\|null\\.$#" - count: 1 - path: src/Solutions/OpenAi/OpenAiSolution.php - - - - message: "#^Parameter \\#1 \\$rawText of class Spatie\\\\Ignition\\\\Solutions\\\\OpenAi\\\\OpenAiSolutionResponse constructor expects string, string\\|null given\\.$#" - count: 1 - path: src/Solutions/OpenAi/OpenAiSolution.php - - - - message: "#^Parameter \\$line of class Spatie\\\\Ignition\\\\Solutions\\\\OpenAi\\\\OpenAiPromptViewModel constructor expects string, int given\\.$#" - count: 1 - path: src/Solutions/OpenAi/OpenAiSolution.php - - - - message: "#^Property Spatie\\\\Ignition\\\\Solutions\\\\OpenAi\\\\OpenAiSolution\\:\\:\\$openAiSolutionResponse \\(Spatie\\\\Ignition\\\\Solutions\\\\OpenAi\\\\OpenAiSolutionResponse\\) does not accept Spatie\\\\Ignition\\\\Solutions\\\\OpenAi\\\\OpenAiSolutionResponse\\|null\\.$#" - count: 1 - path: src/Solutions/OpenAi/OpenAiSolution.php - - - - message: "#^Method Spatie\\\\Ignition\\\\Solutions\\\\OpenAi\\\\OpenAiSolutionResponse\\:\\:links\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/Solutions/OpenAi/OpenAiSolutionResponse.php diff --git a/src/Contracts/BaseSolution.php b/src/Contracts/BaseSolution.php deleted file mode 100644 index 1670baa2..00000000 --- a/src/Contracts/BaseSolution.php +++ /dev/null @@ -1,65 +0,0 @@ - */ - protected array $links = []; - - public static function create(string $title = ''): static - { - // It's important to keep the return type as static because - // the old Facade Ignition contracts extend from this method. - - /** @phpstan-ignore-next-line */ - return new static($title); - } - - public function __construct(string $title = '') - { - $this->title = $title; - } - - public function getSolutionTitle(): string - { - return $this->title; - } - - public function setSolutionTitle(string $title): self - { - $this->title = $title; - - return $this; - } - - public function getSolutionDescription(): string - { - return $this->description; - } - - public function setSolutionDescription(string $description): self - { - $this->description = $description; - - return $this; - } - - /** @return array */ - public function getDocumentationLinks(): array - { - return $this->links; - } - - /** @param array $links */ - public function setDocumentationLinks(array $links): self - { - $this->links = $links; - - return $this; - } -} diff --git a/src/Contracts/HasSolutionsForThrowable.php b/src/Contracts/HasSolutionsForThrowable.php deleted file mode 100644 index 3b8b1685..00000000 --- a/src/Contracts/HasSolutionsForThrowable.php +++ /dev/null @@ -1,16 +0,0 @@ - */ - public function getSolutions(Throwable $throwable): array; -} diff --git a/src/Contracts/ProvidesSolution.php b/src/Contracts/ProvidesSolution.php deleted file mode 100644 index 7d935fef..00000000 --- a/src/Contracts/ProvidesSolution.php +++ /dev/null @@ -1,11 +0,0 @@ - $parameters */ - public function run(array $parameters = []): void; - - /** @return array */ - public function getRunParameters(): array; -} diff --git a/src/Contracts/Solution.php b/src/Contracts/Solution.php deleted file mode 100644 index 58eddc27..00000000 --- a/src/Contracts/Solution.php +++ /dev/null @@ -1,13 +0,0 @@ - */ - public function getDocumentationLinks(): array; -} diff --git a/src/Contracts/SolutionProviderRepository.php b/src/Contracts/SolutionProviderRepository.php deleted file mode 100644 index 2c4ebe06..00000000 --- a/src/Contracts/SolutionProviderRepository.php +++ /dev/null @@ -1,36 +0,0 @@ -|HasSolutionsForThrowable $solutionProvider - * - * @return $this - */ - public function registerSolutionProvider(string $solutionProvider): self; - - /** - * @param array|HasSolutionsForThrowable> $solutionProviders - * - * @return $this - */ - public function registerSolutionProviders(array $solutionProviders): self; - - /** - * @param Throwable $throwable - * - * @return array - */ - public function getSolutionsForThrowable(Throwable $throwable): array; - - /** - * @param class-string $solutionClass - * - * @return null|Solution - */ - public function getSolutionForClass(string $solutionClass): ?Solution; -} diff --git a/src/ErrorPage/ErrorPageViewModel.php b/src/ErrorPage/ErrorPageViewModel.php index efae9297..8b449f6a 100644 --- a/src/ErrorPage/ErrorPageViewModel.php +++ b/src/ErrorPage/ErrorPageViewModel.php @@ -5,8 +5,8 @@ use Spatie\FlareClient\Report; use Spatie\FlareClient\Truncation\ReportTrimmer; use Spatie\Ignition\Config\IgnitionConfig; -use Spatie\Ignition\Contracts\Solution; -use Spatie\Ignition\Solutions\SolutionTransformer; +use Spatie\ErrorSolutions\Contracts\Solution; +use Spatie\ErrorSolutions\Solutions\SolutionTransformer; use Throwable; class ErrorPageViewModel diff --git a/src/Ignition.php b/src/Ignition.php index 75be968b..9fe385a7 100644 --- a/src/Ignition.php +++ b/src/Ignition.php @@ -13,14 +13,14 @@ use Spatie\FlareClient\FlareMiddleware\FlareMiddleware; use Spatie\FlareClient\Report; use Spatie\Ignition\Config\IgnitionConfig; -use Spatie\Ignition\Contracts\HasSolutionsForThrowable; -use Spatie\Ignition\Contracts\SolutionProviderRepository as SolutionProviderRepositoryContract; +use Spatie\ErrorSolutions\Contracts\HasSolutionsForThrowable; +use Spatie\ErrorSolutions\Contracts\SolutionProviderRepository as SolutionProviderRepositoryContract; use Spatie\Ignition\ErrorPage\ErrorPageViewModel; use Spatie\Ignition\ErrorPage\Renderer; -use Spatie\Ignition\Solutions\SolutionProviders\BadMethodCallSolutionProvider; -use Spatie\Ignition\Solutions\SolutionProviders\MergeConflictSolutionProvider; -use Spatie\Ignition\Solutions\SolutionProviders\SolutionProviderRepository; -use Spatie\Ignition\Solutions\SolutionProviders\UndefinedPropertySolutionProvider; +use Spatie\ErrorSolutions\SolutionProviders\BadMethodCallSolutionProvider; +use Spatie\ErrorSolutions\SolutionProviders\MergeConflictSolutionProvider; +use Spatie\ErrorSolutions\SolutionProviderRepository; +use Spatie\ErrorSolutions\SolutionProviders\UndefinedPropertySolutionProvider; use Throwable; class Ignition diff --git a/src/Solutions/OpenAi/DummyCache.php b/src/Solutions/OpenAi/DummyCache.php deleted file mode 100644 index 43abf616..00000000 --- a/src/Solutions/OpenAi/DummyCache.php +++ /dev/null @@ -1,48 +0,0 @@ -file; - } - - public function line(): string - { - return $this->line; - } - - public function snippet(): string - { - return $this->snippet; - } - - public function exceptionMessage(): string - { - return $this->exceptionMessage; - } - - public function exceptionClass(): string - { - return $this->exceptionClass; - } - - public function applicationType(): string|null - { - return $this->applicationType; - } -} diff --git a/src/Solutions/OpenAi/OpenAiSolution.php b/src/Solutions/OpenAi/OpenAiSolution.php deleted file mode 100644 index deb2a132..00000000 --- a/src/Solutions/OpenAi/OpenAiSolution.php +++ /dev/null @@ -1,115 +0,0 @@ -prompt = $this->generatePrompt(); - - $this->openAiSolutionResponse = $this->getAiSolution(); - } - - public function getSolutionTitle(): string - { - return 'AI Generated Solution'; - } - - public function getSolutionDescription(): string - { - return $this->openAiSolutionResponse->description(); - } - - public function getDocumentationLinks(): array - { - return $this->openAiSolutionResponse->links(); - } - - public function getAiSolution(): ?OpenAiSolutionResponse - { - $solution = $this->cache->get($this->getCacheKey()); - - if ($solution) { - return new OpenAiSolutionResponse($solution); - } - - $solutionText = OpenAI::client($this->openAiKey) - ->chat() - ->create([ - 'model' => $this->getModel(), - 'messages' => [['role' => 'user', 'content' => $this->prompt]], - 'max_tokens' => 1000, - 'temperature' => 0, - ])->choices[0]->message->content; - - $this->cache->set($this->getCacheKey(), $solutionText, $this->cacheTtlInSeconds); - - return new OpenAiSolutionResponse($solutionText); - } - - protected function getCacheKey(): string - { - $hash = sha1($this->prompt); - - return "ignition-solution-{$hash}"; - } - - protected function generatePrompt(): string - { - $viewPath = Ignition::viewPath('aiPrompt'); - - $viewModel = new OpenAiPromptViewModel( - file: $this->throwable->getFile(), - exceptionMessage: $this->throwable->getMessage(), - exceptionClass: get_class($this->throwable), - snippet: $this->getApplicationFrame($this->throwable)->getSnippetAsString(15), - line: $this->throwable->getLine(), - applicationType: $this->applicationType, - ); - - return (new Renderer())->renderAsString( - ['viewModel' => $viewModel], - $viewPath, - ); - } - - protected function getModel(): string - { - return 'gpt-3.5-turbo'; - } - - protected function getApplicationFrame(Throwable $throwable): ?Frame - { - $backtrace = Backtrace::createForThrowable($throwable); - - if ($this->applicationPath) { - $backtrace->applicationPath($this->applicationPath); - } - - $frames = $backtrace->frames(); - - return $frames[$backtrace->firstApplicationFrameIndex()] ?? null; - } -} diff --git a/src/Solutions/OpenAi/OpenAiSolutionProvider.php b/src/Solutions/OpenAi/OpenAiSolutionProvider.php deleted file mode 100644 index 2cac8683..00000000 --- a/src/Solutions/OpenAi/OpenAiSolutionProvider.php +++ /dev/null @@ -1,62 +0,0 @@ -cache ??= new DummyCache(); - } - - public function canSolve(Throwable $throwable): bool - { - return true; - } - - public function getSolutions(Throwable $throwable): array - { - return [ - new OpenAiSolution( - $throwable, - $this->openAiKey, - $this->cache, - $this->cacheTtlInSeconds, - $this->applicationType, - $this->applicationPath, - ), - ]; - } - - public function applicationType(string $applicationType): self - { - $this->applicationType = $applicationType; - - return $this; - } - - public function applicationPath(string $applicationPath): self - { - $this->applicationPath = $applicationPath; - - return $this; - } - - public function useCache(CacheInterface $cache, int $cacheTtlInSeconds = 60 * 60): self - { - $this->cache = $cache; - - $this->cacheTtlInSeconds = $cacheTtlInSeconds; - - return $this; - } -} diff --git a/src/Solutions/OpenAi/OpenAiSolutionResponse.php b/src/Solutions/OpenAi/OpenAiSolutionResponse.php deleted file mode 100644 index 27799978..00000000 --- a/src/Solutions/OpenAi/OpenAiSolutionResponse.php +++ /dev/null @@ -1,58 +0,0 @@ -rawText = trim($rawText); - } - - public function description(): string - { - return $this->between('FIX', 'ENDFIX', $this->rawText); - } - - public function links(): array - { - $textLinks = $this->between('LINKS', 'ENDLINKS', $this->rawText); - - $textLinks = explode(PHP_EOL, $textLinks); - - $textLinks = array_map(function ($textLink) { - $textLink = str_replace('\\', '\\\\', $textLink); - $textLink = str_replace('\\\\\\', '\\\\', $textLink); - - return json_decode($textLink, true); - }, $textLinks); - - array_filter($textLinks); - - $links = []; - foreach ($textLinks as $textLink) { - $links[$textLink['title']] = $textLink['url']; - } - - return $links; - } - - protected function between(string $start, string $end, string $text): string - { - $startPosition = strpos($text, $start); - if ($startPosition === false) { - return ""; - } - - $startPosition += strlen($start); - $endPosition = strpos($text, $end, $startPosition); - - if ($endPosition === false) { - return ""; - } - - return trim(substr($text, $startPosition, $endPosition - $startPosition)); - } -} diff --git a/src/Solutions/SolutionProviders/BadMethodCallSolutionProvider.php b/src/Solutions/SolutionProviders/BadMethodCallSolutionProvider.php deleted file mode 100644 index df1544b8..00000000 --- a/src/Solutions/SolutionProviders/BadMethodCallSolutionProvider.php +++ /dev/null @@ -1,98 +0,0 @@ -getClassAndMethodFromExceptionMessage($throwable->getMessage()))) { - return false; - } - - return true; - } - - public function getSolutions(Throwable $throwable): array - { - return [ - BaseSolution::create('Bad Method Call') - ->setSolutionDescription($this->getSolutionDescription($throwable)), - ]; - } - - public function getSolutionDescription(Throwable $throwable): string - { - if (! $this->canSolve($throwable)) { - return ''; - } - - /** @phpstan-ignore-next-line */ - extract($this->getClassAndMethodFromExceptionMessage($throwable->getMessage()), EXTR_OVERWRITE); - - $possibleMethod = $this->findPossibleMethod($class ?? '', $method ?? ''); - - $class ??= 'UnknownClass'; - - return "Did you mean {$class}::{$possibleMethod?->name}() ?"; - } - - /** - * @param string $message - * - * @return null|array - */ - protected function getClassAndMethodFromExceptionMessage(string $message): ?array - { - if (! preg_match(self::REGEX, $message, $matches)) { - return null; - } - - return [ - 'class' => $matches[1], - 'method' => $matches[2], - ]; - } - - /** - * @param class-string $class - * @param string $invalidMethodName - * - * @return \ReflectionMethod|null - */ - protected function findPossibleMethod(string $class, string $invalidMethodName): ?ReflectionMethod - { - return $this->getAvailableMethods($class) - ->sortByDesc(function (ReflectionMethod $method) use ($invalidMethodName) { - similar_text($invalidMethodName, $method->name, $percentage); - - return $percentage; - })->first(); - } - - /** - * @param class-string $class - * - * @return \Illuminate\Support\Collection - */ - protected function getAvailableMethods(string $class): Collection - { - $class = new ReflectionClass($class); - - return Collection::make($class->getMethods()); - } -} diff --git a/src/Solutions/SolutionProviders/MergeConflictSolutionProvider.php b/src/Solutions/SolutionProviders/MergeConflictSolutionProvider.php deleted file mode 100644 index 974d1f7b..00000000 --- a/src/Solutions/SolutionProviders/MergeConflictSolutionProvider.php +++ /dev/null @@ -1,74 +0,0 @@ -hasMergeConflictExceptionMessage($throwable)) { - return false; - } - - $file = (string)file_get_contents($throwable->getFile()); - - if (! str_contains($file, '=======')) { - return false; - } - if (! str_contains($file, '>>>>>>>')) { - return false; - } - - return true; - } - - public function getSolutions(Throwable $throwable): array - { - $file = (string)file_get_contents($throwable->getFile()); - preg_match('/\>\>\>\>\>\>\> (.*?)\n/', $file, $matches); - $source = $matches[1]; - - $target = $this->getCurrentBranch(basename($throwable->getFile())); - - return [ - BaseSolution::create("Merge conflict from branch '$source' into $target") - ->setSolutionDescription('You have a Git merge conflict. To undo your merge do `git reset --hard HEAD`'), - ]; - } - - protected function getCurrentBranch(string $directory): string - { - $branch = "'".trim((string)shell_exec("cd {$directory}; git branch | grep \\* | cut -d ' ' -f2"))."'"; - - if ($branch === "''") { - $branch = 'current branch'; - } - - return $branch; - } - - protected function hasMergeConflictExceptionMessage(Throwable $throwable): bool - { - // For PHP 7.x and below - if (Str::startsWith($throwable->getMessage(), 'syntax error, unexpected \'<<\'')) { - return true; - } - - // For PHP 8+ - if (Str::startsWith($throwable->getMessage(), 'syntax error, unexpected token "<<"')) { - return true; - } - - return false; - } -} diff --git a/src/Solutions/SolutionProviders/SolutionProviderRepository.php b/src/Solutions/SolutionProviders/SolutionProviderRepository.php deleted file mode 100644 index 648e69b9..00000000 --- a/src/Solutions/SolutionProviders/SolutionProviderRepository.php +++ /dev/null @@ -1,101 +0,0 @@ -|HasSolutionsForThrowable> */ - protected Collection $solutionProviders; - - /** @param array|HasSolutionsForThrowable> $solutionProviders */ - public function __construct(array $solutionProviders = []) - { - $this->solutionProviders = Collection::make($solutionProviders); - } - - public function registerSolutionProvider(string|HasSolutionsForThrowable $solutionProvider): SolutionProviderRepositoryContract - { - $this->solutionProviders->push($solutionProvider); - - return $this; - } - - public function registerSolutionProviders(array $solutionProviderClasses): SolutionProviderRepositoryContract - { - $this->solutionProviders = $this->solutionProviders->merge($solutionProviderClasses); - - return $this; - } - - public function getSolutionsForThrowable(Throwable $throwable): array - { - $solutions = []; - - if ($throwable instanceof Solution) { - $solutions[] = $throwable; - } - - if ($throwable instanceof ProvidesSolution) { - $solutions[] = $throwable->getSolution(); - } - - $providedSolutions = $this - ->initialiseSolutionProviderRepositories() - ->filter(function (HasSolutionsForThrowable $solutionProvider) use ($throwable) { - try { - return $solutionProvider->canSolve($throwable); - } catch (Throwable $exception) { - return false; - } - }) - ->map(function (HasSolutionsForThrowable $solutionProvider) use ($throwable) { - try { - return $solutionProvider->getSolutions($throwable); - } catch (Throwable $exception) { - return []; - } - }) - ->flatten() - ->toArray(); - - return array_merge($solutions, $providedSolutions); - } - - public function getSolutionForClass(string $solutionClass): ?Solution - { - if (! class_exists($solutionClass)) { - return null; - } - - if (! in_array(Solution::class, class_implements($solutionClass) ?: [])) { - return null; - } - - if (! function_exists('app')) { - return null; - } - - return app($solutionClass); - } - - /** @return Collection */ - protected function initialiseSolutionProviderRepositories(): Collection - { - return $this->solutionProviders - ->filter(fn (HasSolutionsForThrowable|string $provider) => in_array(HasSolutionsForThrowable::class, class_implements($provider) ?: [])) - ->map(function (string|HasSolutionsForThrowable $provider): HasSolutionsForThrowable { - if (is_string($provider)) { - return new $provider; - } - - return $provider; - }); - } -} diff --git a/src/Solutions/SolutionProviders/UndefinedPropertySolutionProvider.php b/src/Solutions/SolutionProviders/UndefinedPropertySolutionProvider.php deleted file mode 100644 index 574a6efd..00000000 --- a/src/Solutions/SolutionProviders/UndefinedPropertySolutionProvider.php +++ /dev/null @@ -1,121 +0,0 @@ -getClassAndPropertyFromExceptionMessage($throwable->getMessage()))) { - return false; - } - - if (! $this->similarPropertyExists($throwable)) { - return false; - } - - return true; - } - - public function getSolutions(Throwable $throwable): array - { - return [ - BaseSolution::create('Unknown Property') - ->setSolutionDescription($this->getSolutionDescription($throwable)), - ]; - } - - public function getSolutionDescription(Throwable $throwable): string - { - if (! $this->canSolve($throwable) || ! $this->similarPropertyExists($throwable)) { - return ''; - } - - extract( - /** @phpstan-ignore-next-line */ - $this->getClassAndPropertyFromExceptionMessage($throwable->getMessage()), - EXTR_OVERWRITE, - ); - - $possibleProperty = $this->findPossibleProperty($class ?? '', $property ?? ''); - - $class = $class ?? ''; - - return "Did you mean {$class}::\${$possibleProperty->name} ?"; - } - - protected function similarPropertyExists(Throwable $throwable): bool - { - /** @phpstan-ignore-next-line */ - extract($this->getClassAndPropertyFromExceptionMessage($throwable->getMessage()), EXTR_OVERWRITE); - - $possibleProperty = $this->findPossibleProperty($class ?? '', $property ?? ''); - - return $possibleProperty !== null; - } - - /** - * @param string $message - * - * @return null|array - */ - protected function getClassAndPropertyFromExceptionMessage(string $message): ?array - { - if (! preg_match(self::REGEX, $message, $matches)) { - return null; - } - - return [ - 'class' => $matches[1], - 'property' => $matches[2], - ]; - } - - /** - * @param class-string $class - * @param string $invalidPropertyName - * - * @return mixed - */ - protected function findPossibleProperty(string $class, string $invalidPropertyName): mixed - { - return $this->getAvailableProperties($class) - ->sortByDesc(function (ReflectionProperty $property) use ($invalidPropertyName) { - similar_text($invalidPropertyName, $property->name, $percentage); - - return $percentage; - }) - ->filter(function (ReflectionProperty $property) use ($invalidPropertyName) { - similar_text($invalidPropertyName, $property->name, $percentage); - - return $percentage >= self::MINIMUM_SIMILARITY; - })->first(); - } - - /** - * @param class-string $class - * - * @return Collection - */ - protected function getAvailableProperties(string $class): Collection - { - $class = new ReflectionClass($class); - - return Collection::make($class->getProperties()); - } -} diff --git a/src/Solutions/SolutionTransformer.php b/src/Solutions/SolutionTransformer.php deleted file mode 100644 index d1de59b4..00000000 --- a/src/Solutions/SolutionTransformer.php +++ /dev/null @@ -1,30 +0,0 @@ -|string|false> */ -class SolutionTransformer implements Arrayable -{ - protected Solution $solution; - - public function __construct(Solution $solution) - { - $this->solution = $solution; - } - - /** @return array|string|false> */ - public function toArray(): array - { - return [ - 'class' => get_class($this->solution), - 'title' => $this->solution->getSolutionTitle(), - 'links' => $this->solution->getDocumentationLinks(), - 'description' => $this->solution->getSolutionDescription(), - 'is_runnable' => false, - 'ai_generated' => $this->solution->aiGenerated ?? false, - ]; - } -} diff --git a/src/Solutions/SuggestCorrectVariableNameSolution.php b/src/Solutions/SuggestCorrectVariableNameSolution.php deleted file mode 100644 index d00e438e..00000000 --- a/src/Solutions/SuggestCorrectVariableNameSolution.php +++ /dev/null @@ -1,43 +0,0 @@ -variableName = $variableName; - - $this->viewFile = $viewFile; - - $this->suggested = $suggested; - } - - public function getSolutionTitle(): string - { - return 'Possible typo $'.$this->variableName; - } - - public function getDocumentationLinks(): array - { - return []; - } - - public function getSolutionDescription(): string - { - return "Did you mean `$$this->suggested`?"; - } - - public function isRunnable(): bool - { - return false; - } -} diff --git a/src/Solutions/SuggestImportSolution.php b/src/Solutions/SuggestImportSolution.php deleted file mode 100644 index ccfa2553..00000000 --- a/src/Solutions/SuggestImportSolution.php +++ /dev/null @@ -1,30 +0,0 @@ -class = $class; - } - - public function getSolutionTitle(): string - { - return 'A class import is missing'; - } - - public function getSolutionDescription(): string - { - return 'You have a missing class import. Try importing this class: `'.$this->class.'`.'; - } - - public function getDocumentationLinks(): array - { - return []; - } -} diff --git a/tests/Solutions/OpenAiSolutionProviderTest.php b/tests/Solutions/OpenAiSolutionProviderTest.php deleted file mode 100644 index eba84e78..00000000 --- a/tests/Solutions/OpenAiSolutionProviderTest.php +++ /dev/null @@ -1,29 +0,0 @@ -markTestSkipped('Cannot run AI test'); - - return; - } - - $repository = new Repository(new ArrayStore()); - - $solutionProvider = new OpenAiSolutionProvider( - env('OPEN_API_KEY'), - $repository, - ); - - $solutions = $solutionProvider->getSolutions(new Exception('T_PAAMAYIM_NEKUDOTAYIM expected')); - - $solution = $solutions[0]; - - expect($solution->getSolutionDescription())->toBeString(); -}); diff --git a/tests/Solutions/UndefinedPropertySolutionProviderTest.php b/tests/Solutions/UndefinedPropertySolutionProviderTest.php deleted file mode 100644 index d0176b60..00000000 --- a/tests/Solutions/UndefinedPropertySolutionProviderTest.php +++ /dev/null @@ -1,41 +0,0 @@ -canSolve(getUndefinedPropertyException()); - - expect($canSolve)->toBeTrue(); -}); - -it('cannot solve an undefined property exception when there is no similar property', function () { - $providerClass = UndefinedPropertySolutionProvider::class; - - $canSolve = (new $providerClass)->canSolve(getUndefinedPropertyException('balance')); - - expect($canSolve)->toBeFalse(); -}); - -it('can recommend a property name when there is a similar property', function () { - $providerClass = UndefinedPropertySolutionProvider::class; - - $solution = (new $providerClass)->getSolutions(getUndefinedPropertyException())[0]; - - expect($solution->getSolutionDescription())->toEqual('Did you mean Spatie\Ignition\Tests\TestClasses\Models\Car::$color ?'); -}); - -it('cannot recommend a property name when there is no similar property', function () { - $providerClass = UndefinedPropertySolutionProvider::class; - - $solution = (new $providerClass)->getSolutions(getUndefinedPropertyException('balance'))[0]; - - expect($solution->getSolutionDescription())->toEqual(''); -}); - -// Helpers -function getUndefinedPropertyException(string $property = 'colro'): ErrorException -{ - return new ErrorException("Undefined property: Spatie\Ignition\Tests\TestClasses\Models\Car::$$property "); -} From 2bb05b0d571347d364f3000bc762a43bb25f170d Mon Sep 17 00:00:00 2001 From: rubenvanassche Date: Wed, 12 Jun 2024 10:12:12 +0000 Subject: [PATCH 03/30] Fix styling --- src/ErrorPage/ErrorPageViewModel.php | 4 ++-- src/Ignition.php | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ErrorPage/ErrorPageViewModel.php b/src/ErrorPage/ErrorPageViewModel.php index 8b449f6a..d3ae8b3c 100644 --- a/src/ErrorPage/ErrorPageViewModel.php +++ b/src/ErrorPage/ErrorPageViewModel.php @@ -2,11 +2,11 @@ namespace Spatie\Ignition\ErrorPage; +use Spatie\ErrorSolutions\Contracts\Solution; +use Spatie\ErrorSolutions\Solutions\SolutionTransformer; use Spatie\FlareClient\Report; use Spatie\FlareClient\Truncation\ReportTrimmer; use Spatie\Ignition\Config\IgnitionConfig; -use Spatie\ErrorSolutions\Contracts\Solution; -use Spatie\ErrorSolutions\Solutions\SolutionTransformer; use Throwable; class ErrorPageViewModel diff --git a/src/Ignition.php b/src/Ignition.php index 9fe385a7..eb28a4bf 100644 --- a/src/Ignition.php +++ b/src/Ignition.php @@ -4,6 +4,12 @@ use ArrayObject; use ErrorException; +use Spatie\ErrorSolutions\Contracts\HasSolutionsForThrowable; +use Spatie\ErrorSolutions\Contracts\SolutionProviderRepository as SolutionProviderRepositoryContract; +use Spatie\ErrorSolutions\SolutionProviderRepository; +use Spatie\ErrorSolutions\SolutionProviders\BadMethodCallSolutionProvider; +use Spatie\ErrorSolutions\SolutionProviders\MergeConflictSolutionProvider; +use Spatie\ErrorSolutions\SolutionProviders\UndefinedPropertySolutionProvider; use Spatie\FlareClient\Context\BaseContextProviderDetector; use Spatie\FlareClient\Context\ContextProviderDetector; use Spatie\FlareClient\Enums\MessageLevels; @@ -13,14 +19,8 @@ use Spatie\FlareClient\FlareMiddleware\FlareMiddleware; use Spatie\FlareClient\Report; use Spatie\Ignition\Config\IgnitionConfig; -use Spatie\ErrorSolutions\Contracts\HasSolutionsForThrowable; -use Spatie\ErrorSolutions\Contracts\SolutionProviderRepository as SolutionProviderRepositoryContract; use Spatie\Ignition\ErrorPage\ErrorPageViewModel; use Spatie\Ignition\ErrorPage\Renderer; -use Spatie\ErrorSolutions\SolutionProviders\BadMethodCallSolutionProvider; -use Spatie\ErrorSolutions\SolutionProviders\MergeConflictSolutionProvider; -use Spatie\ErrorSolutions\SolutionProviderRepository; -use Spatie\ErrorSolutions\SolutionProviders\UndefinedPropertySolutionProvider; use Throwable; class Ignition From cbb2bc22b5cc479d0eba7959b8586c1f90009eb3 Mon Sep 17 00:00:00 2001 From: Ruben Van Assche Date: Wed, 12 Jun 2024 16:52:09 +0200 Subject: [PATCH 04/30] Update dependencies --- composer.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 96c68f3d..d830f937 100644 --- a/composer.json +++ b/composer.json @@ -20,8 +20,7 @@ "php": "^8.0", "ext-json": "*", "ext-mbstring": "*", - "spatie/backtrace": "^1.5.3", - "spatie/flare-client-php": "dev-solutions-refactor", + "spatie/flare-client-php": "^1.7", "symfony/console": "^5.4|^6.0|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0", "spatie/error-solutions": "dev-main" From d0f5a1dd190f7ca8744b1971a1e3bf9fa0fc9e75 Mon Sep 17 00:00:00 2001 From: Ruben Van Assche Date: Wed, 12 Jun 2024 16:52:40 +0200 Subject: [PATCH 05/30] Update dependencies --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index d830f937..9ef2b27d 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,7 @@ "spatie/flare-client-php": "^1.7", "symfony/console": "^5.4|^6.0|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0", - "spatie/error-solutions": "dev-main" + "spatie/error-solutions": "^1.0" }, "require-dev" : { "illuminate/cache" : "^9.52|^10.0|^11.0", From f55d02463fbbf6350c5ce0fdb03512f3870afe17 Mon Sep 17 00:00:00 2001 From: rubenvanassche Date: Wed, 12 Jun 2024 14:55:50 +0000 Subject: [PATCH 06/30] Update CHANGELOG --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d3e2b2b..9e1256fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ All notable changes to `ignition` will be documented in this file +## 1.15.0 - 2024-06-12 + +### What's Changed + +* Solutions refactor by @rubenvanassche in https://github.com/spatie/ignition/pull/671 + +**Full Changelog**: https://github.com/spatie/ignition/compare/1.14.2...1.15.0 + ## 1.14.2 - 2024-05-29 - Add Cursor as an editor From 3c9a505344e7c4fbcafd2ecf833834609a80a871 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:51:18 +0000 Subject: [PATCH 07/30] Bump dependabot/fetch-metadata from 2.1.0 to 2.2.0 Bumps [dependabot/fetch-metadata](https://github.com/dependabot/fetch-metadata) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/dependabot/fetch-metadata/releases) - [Commits](https://github.com/dependabot/fetch-metadata/compare/v2.1.0...v2.2.0) --- updated-dependencies: - dependency-name: dependabot/fetch-metadata dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/dependabot-auto-merge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependabot-auto-merge.yml b/.github/workflows/dependabot-auto-merge.yml index 611344aa..eb537d8c 100644 --- a/.github/workflows/dependabot-auto-merge.yml +++ b/.github/workflows/dependabot-auto-merge.yml @@ -13,7 +13,7 @@ jobs: - name: Dependabot metadata id: metadata - uses: dependabot/fetch-metadata@v2.1.0 + uses: dependabot/fetch-metadata@v2.2.0 with: github-token: "${{ secrets.GITHUB_TOKEN }}" From b9ff76c91e1e6bf115e9f595e8a303f68d4d8733 Mon Sep 17 00:00:00 2001 From: Rias Date: Fri, 20 Sep 2024 15:08:06 +0200 Subject: [PATCH 08/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 36f0eded..70f6748f 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ By default, Ignition uses a nice white based theme. If this is too bright for yo ```php \Spatie\Ignition\Ignition::make() - ->useDarkMode() + ->setTheme('dark') ->register(); ``` From 9c36a31011a304bc4e490f8fafb157b62f431391 Mon Sep 17 00:00:00 2001 From: riasvdv Date: Fri, 20 Sep 2024 13:08:26 +0000 Subject: [PATCH 09/30] Fix styling --- src/Ignition.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ignition.php b/src/Ignition.php index eb28a4bf..18f44867 100644 --- a/src/Ignition.php +++ b/src/Ignition.php @@ -268,7 +268,7 @@ public function renderError( int $line = 0, array $context = [] ): void { - if(error_reporting() === (E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE)) { + if (error_reporting() === (E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE)) { // This happens when PHP version is >=8 and we caught an error that was suppressed with the "@" operator // See the first warning box in https://www.php.net/manual/en/language.operators.errorcontrol.php return; From f9a18dc274aa3ea2cfa7ba08627589f47201b515 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 10:08:44 +0000 Subject: [PATCH 10/30] Bump dependabot/fetch-metadata from 2.2.0 to 2.3.0 Bumps [dependabot/fetch-metadata](https://github.com/dependabot/fetch-metadata) from 2.2.0 to 2.3.0. - [Release notes](https://github.com/dependabot/fetch-metadata/releases) - [Commits](https://github.com/dependabot/fetch-metadata/compare/v2.2.0...v2.3.0) --- updated-dependencies: - dependency-name: dependabot/fetch-metadata dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/dependabot-auto-merge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependabot-auto-merge.yml b/.github/workflows/dependabot-auto-merge.yml index eb537d8c..2cb1d5e1 100644 --- a/.github/workflows/dependabot-auto-merge.yml +++ b/.github/workflows/dependabot-auto-merge.yml @@ -13,7 +13,7 @@ jobs: - name: Dependabot metadata id: metadata - uses: dependabot/fetch-metadata@v2.2.0 + uses: dependabot/fetch-metadata@v2.3.0 with: github-token: "${{ secrets.GITHUB_TOKEN }}" From 8b56a0be43c25a7306d8311d30178770501cea72 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Tue, 11 Feb 2025 11:31:17 +0000 Subject: [PATCH 11/30] Supports Laravel 12 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9ef2b27d..ce7a5136 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,7 @@ "spatie/error-solutions": "^1.0" }, "require-dev" : { - "illuminate/cache" : "^9.52|^10.0|^11.0", + "illuminate/cache" : "^9.52|^10.0|^11.0|^12.0", "mockery/mockery" : "^1.4", "pestphp/pest" : "^1.20|^2.0", "phpstan/extension-installer" : "^1.1", From 018fa133255383c7af915f2f9c5b895bcdbc3a85 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Fri, 14 Feb 2025 14:23:53 +0000 Subject: [PATCH 12/30] Empty commit From 2e9d1508aad2a05a52ee68b5faa05c0316a5f176 Mon Sep 17 00:00:00 2001 From: freekmurze <483853+freekmurze@users.noreply.github.com> Date: Fri, 21 Feb 2025 14:32:18 +0000 Subject: [PATCH 13/30] Update CHANGELOG --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e1256fe..dd37fcd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ All notable changes to `ignition` will be documented in this file +## 1.15.1 - 2025-02-21 + +### What's Changed + +* Bump dependabot/fetch-metadata from 2.1.0 to 2.2.0 by @dependabot in https://github.com/spatie/ignition/pull/683 +* Bump dependabot/fetch-metadata from 2.2.0 to 2.3.0 by @dependabot in https://github.com/spatie/ignition/pull/785 +* Supports Laravel 12 by @duncanmcclean in https://github.com/spatie/ignition/pull/790 + +### New Contributors + +* @duncanmcclean made their first contribution in https://github.com/spatie/ignition/pull/790 + +**Full Changelog**: https://github.com/spatie/ignition/compare/1.15.0...1.15.1 + ## 1.15.0 - 2024-06-12 ### What's Changed From 03688e9fca52baa7db65d047cca02aa488e0f08d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 10:18:42 +0000 Subject: [PATCH 14/30] Bump dependabot/fetch-metadata from 2.3.0 to 2.4.0 Bumps [dependabot/fetch-metadata](https://github.com/dependabot/fetch-metadata) from 2.3.0 to 2.4.0. - [Release notes](https://github.com/dependabot/fetch-metadata/releases) - [Commits](https://github.com/dependabot/fetch-metadata/compare/v2.3.0...v2.4.0) --- updated-dependencies: - dependency-name: dependabot/fetch-metadata dependency-version: 2.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/dependabot-auto-merge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependabot-auto-merge.yml b/.github/workflows/dependabot-auto-merge.yml index 2cb1d5e1..1a13177d 100644 --- a/.github/workflows/dependabot-auto-merge.yml +++ b/.github/workflows/dependabot-auto-merge.yml @@ -13,7 +13,7 @@ jobs: - name: Dependabot metadata id: metadata - uses: dependabot/fetch-metadata@v2.3.0 + uses: dependabot/fetch-metadata@v2.4.0 with: github-token: "${{ secrets.GITHUB_TOKEN }}" From 1a7f05c640fc5d3887509bad5e129321c1c26afc Mon Sep 17 00:00:00 2001 From: Alex Vanderbist Date: Mon, 8 Sep 2025 09:00:50 +0200 Subject: [PATCH 15/30] Update issue template --- .github/ISSUE_TEMPLATE/config.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 64cd01c7..3ca2e087 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,11 +1,8 @@ -blank_issues_enabled: false +blank_issues_enabled: true contact_links: - - name: Bug Report - url: https://github.com/spatie/ignition/issues/new - about: Report a bug - name: Feature Request - url: https://github.com/spatie/ignition/discussions/new?category_id=3330702 + url: https://github.com/spatie/ignition/discussions/new?category=ideas about: Share ideas for new features - name: Ask a Question - url: https://github.com/spatie/ignition/discussions/new?category_id=3330701 + url: https://github.com/spatie/ignition/discussions/new?category=q-a about: Ask the community for help From c97f8cda193e5c11e36b67fd7ea881785c6e2aa0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 10:10:40 +0000 Subject: [PATCH 16/30] Bump dependabot/fetch-metadata from 2.4.0 to 2.5.0 Bumps [dependabot/fetch-metadata](https://github.com/dependabot/fetch-metadata) from 2.4.0 to 2.5.0. - [Release notes](https://github.com/dependabot/fetch-metadata/releases) - [Commits](https://github.com/dependabot/fetch-metadata/compare/v2.4.0...v2.5.0) --- updated-dependencies: - dependency-name: dependabot/fetch-metadata dependency-version: 2.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/dependabot-auto-merge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependabot-auto-merge.yml b/.github/workflows/dependabot-auto-merge.yml index 1a13177d..8dffc03b 100644 --- a/.github/workflows/dependabot-auto-merge.yml +++ b/.github/workflows/dependabot-auto-merge.yml @@ -13,7 +13,7 @@ jobs: - name: Dependabot metadata id: metadata - uses: dependabot/fetch-metadata@v2.4.0 + uses: dependabot/fetch-metadata@v2.5.0 with: github-token: "${{ secrets.GITHUB_TOKEN }}" From bb2f508777db435c830da74485c578a65b8be94e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 31 Jan 2026 15:12:20 +0530 Subject: [PATCH 17/30] Bump actions/checkout from 4 to 6 (#852) Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- .github/workflows/php-cs-fixer.yml | 2 +- .github/workflows/phpstan.yml | 2 +- .github/workflows/run-tests.yml | 2 +- .github/workflows/update-changelog.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 83e29a0a..e5696d71 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: ${{ github.head_ref }} diff --git a/.github/workflows/php-cs-fixer.yml b/.github/workflows/php-cs-fixer.yml index b2bd42b1..26892bbe 100644 --- a/.github/workflows/php-cs-fixer.yml +++ b/.github/workflows/php-cs-fixer.yml @@ -8,7 +8,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Fix style uses: docker://oskarstark/php-cs-fixer-ga diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index bb24fb18..6f17daa4 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -16,7 +16,7 @@ jobs: name: phpstan runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup PHP uses: shivammathur/setup-php@v2 diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 1570c2e6..a79ba0c4 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup PHP uses: shivammathur/setup-php@v2 diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml index 0cdea233..dbcd0a8c 100644 --- a/.github/workflows/update-changelog.yml +++ b/.github/workflows/update-changelog.yml @@ -10,7 +10,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: main From e364245470e7414a20550592d07f68f0a414296f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 31 Jan 2026 15:15:41 +0530 Subject: [PATCH 18/30] Bump actions/setup-node from 4 to 6 (#842) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v4...v6) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e5696d71..7791bd35 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,7 +16,7 @@ jobs: ref: ${{ github.head_ref }} - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '18.x' From 6d206b5fea137808fc0f06c06aa70bf5e5baebbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 31 Jan 2026 15:18:23 +0530 Subject: [PATCH 19/30] Bump stefanzweifel/git-auto-commit-action from 5 to 7 (#838) Bumps [stefanzweifel/git-auto-commit-action](https://github.com/stefanzweifel/git-auto-commit-action) from 5 to 7. - [Release notes](https://github.com/stefanzweifel/git-auto-commit-action/releases) - [Changelog](https://github.com/stefanzweifel/git-auto-commit-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/stefanzweifel/git-auto-commit-action/compare/v5...v7) --- updated-dependencies: - dependency-name: stefanzweifel/git-auto-commit-action dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- .github/workflows/php-cs-fixer.yml | 2 +- .github/workflows/update-changelog.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7791bd35..657b80ba 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,6 +34,6 @@ jobs: run: yarn run bundle-temp - name: Commit changes - uses: stefanzweifel/git-auto-commit-action@v5 + uses: stefanzweifel/git-auto-commit-action@v7 with: commit_message: Add new JS bundle build diff --git a/.github/workflows/php-cs-fixer.yml b/.github/workflows/php-cs-fixer.yml index 26892bbe..d974597c 100644 --- a/.github/workflows/php-cs-fixer.yml +++ b/.github/workflows/php-cs-fixer.yml @@ -21,7 +21,7 @@ jobs: id: extract_branch - name: Commit changes - uses: stefanzweifel/git-auto-commit-action@v5 + uses: stefanzweifel/git-auto-commit-action@v7 with: commit_message: Fix styling branch: ${{ steps.extract_branch.outputs.branch }} diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml index dbcd0a8c..86459827 100644 --- a/.github/workflows/update-changelog.yml +++ b/.github/workflows/update-changelog.yml @@ -21,7 +21,7 @@ jobs: release-notes: ${{ github.event.release.body }} - name: Commit updated CHANGELOG - uses: stefanzweifel/git-auto-commit-action@v5 + uses: stefanzweifel/git-auto-commit-action@v7 with: branch: main commit_message: Update CHANGELOG From 68f2e5704a97b8c304dc4481ee00b8ff18c308ff Mon Sep 17 00:00:00 2001 From: erikn69 Date: Sun, 1 Feb 2026 04:32:19 -0500 Subject: [PATCH 20/30] Add zed, windsurf editors template (#820) * Add zed editor template * Add windsurf editor template --- src/Config/IgnitionConfig.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Config/IgnitionConfig.php b/src/Config/IgnitionConfig.php index 2cedb803..2563636a 100644 --- a/src/Config/IgnitionConfig.php +++ b/src/Config/IgnitionConfig.php @@ -219,6 +219,14 @@ protected function getDefaultOptions(): array 'label' => 'NetBeans', 'url' => 'netbeans://open/?f=%path:%line', ], + 'zed' => [ + 'label' => 'Zed', + 'url' => 'zed://file/%path:%line', + ], + 'windsurf' => [ + 'label' => 'Windsurf', + 'url' => 'windsurf://file/%path:%line', + ], 'xdebug' => [ 'label' => 'Xdebug', 'url' => 'xdebug://%path@%line', From 65e766f6a11d8846ade47da7d687fbb8c2cf265d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 09:04:28 +0000 Subject: [PATCH 21/30] Bump ramsey/composer-install from 3 to 4 Bumps [ramsey/composer-install](https://github.com/ramsey/composer-install) from 3 to 4. - [Release notes](https://github.com/ramsey/composer-install/releases) - [Commits](https://github.com/ramsey/composer-install/compare/v3...v4) --- updated-dependencies: - dependency-name: ramsey/composer-install dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/phpstan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 6f17daa4..39f1a58c 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -25,7 +25,7 @@ jobs: coverage: none - name: Install composer dependencies - uses: ramsey/composer-install@v3 + uses: ramsey/composer-install@v4 - name: Install extra package run: composer require openai-php/client From 79a67ae8d51a9807fb7b315990aa3a5945b21cbf Mon Sep 17 00:00:00 2001 From: erikn69 Date: Mon, 16 Mar 2026 14:37:20 -0500 Subject: [PATCH 22/30] Update Symfony and Illuminate package versions --- composer.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index ce7a5136..d7b2db8d 100644 --- a/composer.json +++ b/composer.json @@ -21,20 +21,20 @@ "ext-json": "*", "ext-mbstring": "*", "spatie/flare-client-php": "^1.7", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0|^8.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0", "spatie/error-solutions": "^1.0" }, "require-dev" : { - "illuminate/cache" : "^9.52|^10.0|^11.0|^12.0", + "illuminate/cache" : "^9.52|^10.0|^11.0|^12.0|^13.0", "mockery/mockery" : "^1.4", "pestphp/pest" : "^1.20|^2.0", "phpstan/extension-installer" : "^1.1", "phpstan/phpstan-deprecation-rules" : "^1.0", "phpstan/phpstan-phpunit" : "^1.0", "psr/simple-cache-implementation" : "*", - "symfony/cache" : "^5.4|^6.0|^7.0", - "symfony/process" : "^5.4|^6.0|^7.0", + "symfony/cache" : "^5.4|^6.0|^7.0|^8.0", + "symfony/process" : "^5.4|^6.0|^7.0|^8.0", "vlucas/phpdotenv" : "^5.5" }, "suggest" : { From edffbdd7b8486524682af3eda84ce5b6355ca0b6 Mon Sep 17 00:00:00 2001 From: erikn69 Date: Mon, 16 Mar 2026 14:59:53 -0500 Subject: [PATCH 23/30] Add PHP versions 8.4 and 8.5 to test matrix --- .github/workflows/run-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index a79ba0c4..85cad7f5 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -9,7 +9,7 @@ jobs: fail-fast: false matrix: os: [ ubuntu-latest, windows-latest ] - php: [ 8.0, 8.1, 8.2, 8.3 ] + php: [ 8.0, 8.1, 8.2, 8.3, 8.4, 8.5 ] stability: [ prefer-lowest, prefer-stable ] name: P${{ matrix.php }} - ${{ matrix.stability }} - ${{ matrix.os }} From 19da4799a65f4ddce87c506ac5c690c0e27ab0a6 Mon Sep 17 00:00:00 2001 From: Ruben Van Assche Date: Tue, 17 Mar 2026 10:23:50 +0100 Subject: [PATCH 24/30] Bump minimum dependency versions for PHP 8.4 compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - spatie/flare-client-php: ^1.7 → ^1.9 - spatie/error-solutions: ^1.0 → ^1.1.2 - symfony/var-dumper: ^5.4 → ^5.4.42 - symfony/cache: ^5.4 → ^5.4.38 - symfony/process: ^5.4 → ^5.4.35 --- composer.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index d7b2db8d..ad2271bd 100644 --- a/composer.json +++ b/composer.json @@ -20,10 +20,10 @@ "php": "^8.0", "ext-json": "*", "ext-mbstring": "*", - "spatie/flare-client-php": "^1.7", + "spatie/flare-client-php": "^1.9", "symfony/console": "^5.4|^6.0|^7.0|^8.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0", - "spatie/error-solutions": "^1.0" + "symfony/var-dumper": "^5.4.42|^6.0|^7.0|^8.0", + "spatie/error-solutions": "^1.1.2" }, "require-dev" : { "illuminate/cache" : "^9.52|^10.0|^11.0|^12.0|^13.0", @@ -33,8 +33,8 @@ "phpstan/phpstan-deprecation-rules" : "^1.0", "phpstan/phpstan-phpunit" : "^1.0", "psr/simple-cache-implementation" : "*", - "symfony/cache" : "^5.4|^6.0|^7.0|^8.0", - "symfony/process" : "^5.4|^6.0|^7.0|^8.0", + "symfony/cache" : "^5.4.38|^6.0|^7.0|^8.0", + "symfony/process" : "^5.4.35|^6.0|^7.0|^8.0", "vlucas/phpdotenv" : "^5.5" }, "suggest" : { From 78eabd29ba85c9c2aa5967308868fa5aa0949143 Mon Sep 17 00:00:00 2001 From: Ruben Van Assche Date: Tue, 17 Mar 2026 10:30:31 +0100 Subject: [PATCH 25/30] Add spatie/backtrace ^1.7 for PHP 8.4 compatibility --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index ad2271bd..9d5354cb 100644 --- a/composer.json +++ b/composer.json @@ -20,6 +20,7 @@ "php": "^8.0", "ext-json": "*", "ext-mbstring": "*", + "spatie/backtrace": "^1.7", "spatie/flare-client-php": "^1.9", "symfony/console": "^5.4|^6.0|^7.0|^8.0", "symfony/var-dumper": "^5.4.42|^6.0|^7.0|^8.0", From 96ef53d9074bb1a7b8618b3af1f96c53868ac7ed Mon Sep 17 00:00:00 2001 From: Ruben Van Assche Date: Tue, 17 Mar 2026 10:35:33 +0100 Subject: [PATCH 26/30] Bump symfony/console, add symfony/http-foundation and symfony/mime constraints for PHP 8.4 --- composer.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9d5354cb..feabbd74 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,9 @@ "ext-mbstring": "*", "spatie/backtrace": "^1.7", "spatie/flare-client-php": "^1.9", - "symfony/console": "^5.4|^6.0|^7.0|^8.0", + "symfony/console": "^5.4.42|^6.0|^7.0|^8.0", + "symfony/http-foundation": "^5.4.42|^6.0|^7.0|^8.0", + "symfony/mime": "^5.4.42|^6.0|^7.0|^8.0", "symfony/var-dumper": "^5.4.42|^6.0|^7.0|^8.0", "spatie/error-solutions": "^1.1.2" }, From 4ab5648458faa3ee87d1d6ce94f917c3972eb0c2 Mon Sep 17 00:00:00 2001 From: Ruben Van Assche Date: Tue, 17 Mar 2026 11:40:18 +0100 Subject: [PATCH 27/30] Fix CI tests for PHP 8.4/8.5 with prefer-lowest - Bump spatie/backtrace minimum to ^1.7.1 (fixes implicit nullable deprecation that crashes error rendering on PHP 8.5) - Add pestphp/pest ^3.0 to allowed versions - Require Pest 3 and illuminate/cache ^12.0 for PHP 8.4+ in CI (Pest 2 cannot resolve with prefer-lowest due to Symfony conflicts, and illuminate/cache <12 produces deprecation warnings on PHP 8.5) --- .github/workflows/run-tests.yml | 12 ++++++++++++ composer.json | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 85cad7f5..fb5d9af4 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -30,6 +30,18 @@ jobs: echo "::add-matcher::${{ runner.tool_cache }}/php.json" echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + - name: Require Pest 1 for PHP 8.0/8.1 + if: matrix.php == '8.0' || matrix.php == '8.1' + run: composer require pestphp/pest:^1.20 --dev --no-update + + - name: Require Pest 2 for PHP 8.2/8.3 + if: matrix.php == '8.2' || matrix.php == '8.3' + run: composer require pestphp/pest:^2.0 --dev --no-update + + - name: Require Pest 3 for PHP 8.4+ + if: matrix.php == '8.4' || matrix.php == '8.5' + run: composer require pestphp/pest:^3.0 illuminate/cache:^12.0 --dev --no-update + - name: Install dependencies run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction diff --git a/composer.json b/composer.json index feabbd74..00210cb1 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ "php": "^8.0", "ext-json": "*", "ext-mbstring": "*", - "spatie/backtrace": "^1.7", + "spatie/backtrace": "^1.7.1", "spatie/flare-client-php": "^1.9", "symfony/console": "^5.4.42|^6.0|^7.0|^8.0", "symfony/http-foundation": "^5.4.42|^6.0|^7.0|^8.0", @@ -31,7 +31,7 @@ "require-dev" : { "illuminate/cache" : "^9.52|^10.0|^11.0|^12.0|^13.0", "mockery/mockery" : "^1.4", - "pestphp/pest" : "^1.20|^2.0", + "pestphp/pest" : "^1.20|^2.0|^3.0", "phpstan/extension-installer" : "^1.1", "phpstan/phpstan-deprecation-rules" : "^1.0", "phpstan/phpstan-phpunit" : "^1.0", From 15510cd621e9ead357abc8388303257f844469f1 Mon Sep 17 00:00:00 2001 From: Ruben Van Assche Date: Tue, 17 Mar 2026 11:46:47 +0100 Subject: [PATCH 28/30] Quote composer version constraints for PowerShell compatibility PowerShell treats ^ as a special character, stripping it from unquoted arguments. This caused exact version matches instead of caret ranges on Windows CI runners. --- .github/workflows/run-tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index fb5d9af4..58a5f0ba 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -32,15 +32,15 @@ jobs: - name: Require Pest 1 for PHP 8.0/8.1 if: matrix.php == '8.0' || matrix.php == '8.1' - run: composer require pestphp/pest:^1.20 --dev --no-update + run: composer require "pestphp/pest:^1.20" --dev --no-update - name: Require Pest 2 for PHP 8.2/8.3 if: matrix.php == '8.2' || matrix.php == '8.3' - run: composer require pestphp/pest:^2.0 --dev --no-update + run: composer require "pestphp/pest:^2.0" --dev --no-update - name: Require Pest 3 for PHP 8.4+ if: matrix.php == '8.4' || matrix.php == '8.5' - run: composer require pestphp/pest:^3.0 illuminate/cache:^12.0 --dev --no-update + run: composer require "pestphp/pest:^3.0" "illuminate/cache:^12.0" --dev --no-update - name: Install dependencies run: composer update --${{ matrix.stability }} --prefer-dist --no-interaction From b59385bb7aa24dae81bcc15850ebecfda7b40838 Mon Sep 17 00:00:00 2001 From: Ruben Van Assche Date: Tue, 17 Mar 2026 11:51:08 +0100 Subject: [PATCH 29/30] Use bash shell for composer require steps to fix Windows CI PowerShell strips ^ from arguments even when quoted. Using bash shell explicitly for the composer require steps ensures caret version constraints are passed correctly on Windows runners. --- .github/workflows/run-tests.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 58a5f0ba..8184533a 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -32,14 +32,17 @@ jobs: - name: Require Pest 1 for PHP 8.0/8.1 if: matrix.php == '8.0' || matrix.php == '8.1' + shell: bash run: composer require "pestphp/pest:^1.20" --dev --no-update - name: Require Pest 2 for PHP 8.2/8.3 if: matrix.php == '8.2' || matrix.php == '8.3' + shell: bash run: composer require "pestphp/pest:^2.0" --dev --no-update - name: Require Pest 3 for PHP 8.4+ if: matrix.php == '8.4' || matrix.php == '8.5' + shell: bash run: composer require "pestphp/pest:^3.0" "illuminate/cache:^12.0" --dev --no-update - name: Install dependencies From b1cb3bee4811a44c678e5994ada39164fb89a677 Mon Sep 17 00:00:00 2001 From: rubenvanassche <619804+rubenvanassche@users.noreply.github.com> Date: Tue, 17 Mar 2026 11:54:06 +0000 Subject: [PATCH 30/30] Update CHANGELOG --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd37fcd6..aa856da7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ All notable changes to `ignition` will be documented in this file +## 1.16.0 - 2026-03-17 + +### What's Changed + +#### PHP 8.4 & 8.5 Compatibility + +- Bump minimum dependency versions for PHP 8.4 compatibility +- Bump spatie/backtrace minimum to ^1.7.1 to fix implicit nullable deprecation on PHP 8.5 +- Add symfony/http-foundation and symfony/mime constraints for PHP 8.4 +- Allow pestphp/pest ^3.0 + +**Full Changelog**: https://github.com/spatie/ignition/compare/1.15.1...1.16.0 + ## 1.15.1 - 2025-02-21 ### What's Changed