Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
29 / 29
100.00% covered (success)
100.00%
6 / 6
CRAP
100.00% covered (success)
100.00%
1 / 1
CreatesNewPageSourceFile
100.00% covered (success)
100.00%
29 / 29
100.00% covered (success)
100.00%
6 / 6
11
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 canSaveFile
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
3
 createPage
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
4
 createMarkdownFile
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 createBladeFile
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 createDocumentationFile
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace Hyde\Framework\Actions;
4
5use Hyde\Framework\Exceptions\FileConflictException;
6use Hyde\Framework\Exceptions\UnsupportedPageTypeException;
7use Hyde\Framework\Hyde;
8use Hyde\Framework\Models\BladePage;
9use Hyde\Framework\Models\DocumentationPage;
10use Hyde\Framework\Models\MarkdownPage;
11use Illuminate\Support\Str;
12
13/**
14 * Scaffold a new Markdown, Blade, or documentation page.
15 *
16 * @see \Tests\Feature\Actions\CreatesNewPageSourceFileTest
17 */
18class CreatesNewPageSourceFile
19{
20    public string $title;
21    public string $slug;
22    public string $outputPath;
23
24    public function __construct(string $title, string $type = MarkdownPage::class, public bool $force = false)
25    {
26        $this->title = $title;
27        $this->slug = Str::slug($title);
28
29        $this->createPage($type);
30    }
31
32    public function canSaveFile(string $path): void
33    {
34        if (file_exists($path) && ! $this->force) {
35            throw new FileConflictException($path);
36        }
37    }
38
39    public function createPage(string $type): int|false
40    {
41        if ($type === MarkdownPage::class) {
42            return $this->createMarkdownFile();
43        }
44        if ($type === BladePage::class) {
45            return $this->createBladeFile();
46        }
47
48        if ($type === DocumentationPage::class) {
49            return $this->createDocumentationFile();
50        }
51
52        throw new UnsupportedPageTypeException('The page type must be either "markdown", "blade", or "documentation"');
53    }
54
55    public function createMarkdownFile(): int|false
56    {
57        $this->outputPath = Hyde::path("_pages/$this->slug.md");
58
59        $this->canSaveFile($this->outputPath);
60
61        return file_put_contents(
62            $this->outputPath,
63            "---\ntitle: $this->title\n---\n\n# $this->title\n"
64        );
65    }
66
67    public function createBladeFile(): int|false
68    {
69        $this->outputPath = Hyde::path("_pages/$this->slug.blade.php");
70
71        $this->canSaveFile($this->outputPath);
72
73        return file_put_contents(
74            $this->outputPath,
75            <<<EOF
76@extends('hyde::layouts.app')
77@section('content')
78@php(\$title = "$this->title")
79
80<main class="mx-auto max-w-7xl py-16 px-8">
81    <h1 class="text-center text-3xl font-bold">$this->title</h1>
82</main>
83
84@endsection
85
86EOF
87        );
88    }
89
90    public function createDocumentationFile(): int|false
91    {
92        $this->outputPath = Hyde::path("_docs/$this->slug.md");
93
94        $this->canSaveFile($this->outputPath);
95
96        return file_put_contents(
97            $this->outputPath,
98            "$this->title\n"
99        );
100    }
101}