From 02dbc14b919b7c495d9d535d0e5f39248fdbbaff Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 14:25:19 +0200 Subject: [PATCH 01/15] Create HydeFront.php --- packages/framework/src/Facades/HydeFront.php | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 packages/framework/src/Facades/HydeFront.php diff --git a/packages/framework/src/Facades/HydeFront.php b/packages/framework/src/Facades/HydeFront.php new file mode 100644 index 00000000000..5f5448313ee --- /dev/null +++ b/packages/framework/src/Facades/HydeFront.php @@ -0,0 +1,10 @@ + Date: Fri, 26 Jul 2024 14:26:32 +0200 Subject: [PATCH 02/15] Create HydeFrontFacadeTest.php --- .../tests/Unit/Facades/HydeFrontFacadeTest.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php diff --git a/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php b/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php new file mode 100644 index 00000000000..e4c6d9e192f --- /dev/null +++ b/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php @@ -0,0 +1,15 @@ + Date: Fri, 26 Jul 2024 14:26:53 +0200 Subject: [PATCH 03/15] Alias the HydeFront facade --- app/config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/config.php b/app/config.php index 143a4a6dda4..009c0f586b7 100644 --- a/app/config.php +++ b/app/config.php @@ -94,6 +94,7 @@ 'Meta' => \Hyde\Facades\Meta::class, 'Asset' => \Hyde\Facades\Asset::class, 'Author' => \Hyde\Facades\Author::class, + 'HydeFront' => \Hyde\Facades\HydeFront::class, 'Features' => \Hyde\Facades\Features::class, 'Config' => \Hyde\Facades\Config::class, 'Filesystem' => \Hyde\Facades\Filesystem::class, From ee69a0a9e0b44afa58d7fce5f326450673292157 Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 14:48:20 +0200 Subject: [PATCH 04/15] Move HydeFront related methods to the new HydeFront facade --- packages/framework/src/Facades/Asset.php | 53 ++++++++----------- packages/framework/src/Facades/HydeFront.php | 27 +++++++++- .../Unit/Facades/AssetFacadeUnitTest.php | 13 ----- .../Unit/Facades/HydeFrontFacadeTest.php | 12 ++++- 4 files changed, 60 insertions(+), 45 deletions(-) diff --git a/packages/framework/src/Facades/Asset.php b/packages/framework/src/Facades/Asset.php index 49065d3b352..6d7a3afaeb3 100644 --- a/packages/framework/src/Facades/Asset.php +++ b/packages/framework/src/Facades/Asset.php @@ -6,15 +6,10 @@ use Hyde\Hyde; use Illuminate\Support\Str; +use JetBrains\PhpStorm\Deprecated; -use function rtrim; -use function explode; -use function implode; use function md5_file; use function file_exists; -use function str_replace; -use function preg_replace; -use function str_contains; use function file_get_contents; /** @@ -25,22 +20,6 @@ */ class Asset { - /** @var string The default HydeFront SemVer tag to load. This constant is set to match the styles used for the installed framework version. */ - final protected const HYDEFRONT_VERSION = 'v3.4'; - - /** @var string The default HydeFront CDN path pattern. The Blade-style placeholders are replaced with the proper values. */ - final protected const HYDEFRONT_CDN_URL = 'https://cdn.jsdelivr.net/npm/hydefront@{{ $version }}/dist/{{ $file }}'; - - public static function version(): string - { - return static::HYDEFRONT_VERSION; - } - - public static function cdnLink(string $file): string - { - return static::constructCdnPath($file); - } - public static function mediaLink(string $file): string { return Hyde::mediaLink($file).static::getCacheBustKey($file); @@ -69,18 +48,32 @@ public static function injectTailwindConfig(): string return preg_replace('/\s+/', ' ', "/* tailwind.config.js */ \n".rtrim($config, ",\n\r")); } - protected static function constructCdnPath(string $file): string - { - return str_replace( - ['{{ $version }}', '{{ $file }}'], [static::version(), $file], - static::HYDEFRONT_CDN_URL - ); - } - protected static function getCacheBustKey(string $file): string { return Config::getBool('hyde.enable_cache_busting', true) ? '?v='.md5_file(Hyde::mediaPath("$file")) : ''; } + + /** + * @deprecated Use HydeFront::version() instead. + * + * @codeCoverageIgnore Deprecated method. + */ + #[Deprecated(reason: 'Use HydeFront::version() instead.', replacement: '\Hyde\Facades\HydeFront::version()')] + public static function version(): string + { + return HydeFront::version(); + } + + /** + * @deprecated Use HydeFront::cdnLink() instead. + * + * @codeCoverageIgnore Deprecated method. + */ + #[Deprecated(reason: 'Use HydeFront::cdnLink() instead.', replacement: '\Hyde\Facades\HydeFront::cdnLink()')] + public static function cdnLink(string $file): string + { + return HydeFront::cdnLink($file); + } } diff --git a/packages/framework/src/Facades/HydeFront.php b/packages/framework/src/Facades/HydeFront.php index 5f5448313ee..e3b5c76f606 100644 --- a/packages/framework/src/Facades/HydeFront.php +++ b/packages/framework/src/Facades/HydeFront.php @@ -4,7 +4,32 @@ namespace Hyde\Facades; +use function str_replace; + class HydeFront { - // + /** @var string The default HydeFront SemVer tag to load. This constant is set to match the styles used for the installed framework version. */ + final protected const HYDEFRONT_VERSION = 'v3.4'; + + /** @var string The default HydeFront CDN path pattern. The Blade-style placeholders are replaced with the proper values. */ + final protected const HYDEFRONT_CDN_URL = 'https://cdn.jsdelivr.net/npm/hydefront@{{ $version }}/dist/{{ $file }}'; + + public static function version(): string + { + return static::HYDEFRONT_VERSION; + } + + public static function cdnLink(string $file): string + { + return static::constructCdnPath($file); + } + + protected static function constructCdnPath(string $file): string + { + return str_replace( + ['{{ $version }}', '{{ $file }}'], + [static::version(), $file], + static::HYDEFRONT_CDN_URL + ); + } } diff --git a/packages/framework/tests/Unit/Facades/AssetFacadeUnitTest.php b/packages/framework/tests/Unit/Facades/AssetFacadeUnitTest.php index ddfafe2ec72..81cbfc029b4 100644 --- a/packages/framework/tests/Unit/Facades/AssetFacadeUnitTest.php +++ b/packages/framework/tests/Unit/Facades/AssetFacadeUnitTest.php @@ -21,19 +21,6 @@ protected function setUp(): void self::mockConfig(); } - public function testServiceHasVersionString() - { - $this->assertIsString(Asset::version()); - } - - public function testCdnLinkHelper() - { - $this->assertSame( - 'https://cdn.jsdelivr.net/npm/hydefront@v3.4/dist/styles.css', - Asset::cdnLink('styles.css') - ); - } - public function testHasMediaFileHelper() { $this->assertFalse(Asset::hasMediaFile('styles.css')); diff --git a/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php b/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php index e4c6d9e192f..37425127bf7 100644 --- a/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php +++ b/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php @@ -4,6 +4,7 @@ namespace Hyde\Framework\Testing\Unit\Facades; +use Hyde\Facades\HydeFront; use Hyde\Testing\UnitTestCase; /** @@ -11,5 +12,14 @@ */ class HydeFrontFacadeTest extends UnitTestCase { - // + public function testVersionReturnsString() + { + $this->assertIsString(HydeFront::version()); + } + + public function testCdnLinkReturnsCorrectUrl() + { + $expected = 'https://cdn.jsdelivr.net/npm/hydefront@v3.4/dist/styles.css'; + $this->assertSame($expected, HydeFront::cdnLink('styles.css')); + } } From 3db1b29adce5f88299de0fc990ce3b19ad3ecfd8 Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 14:54:25 +0200 Subject: [PATCH 05/15] Use the new HydeFront facade --- packages/framework/resources/views/layouts/styles.blade.php | 2 +- .../framework/tests/Unit/Views/StylesComponentViewTest.php | 4 ++-- spec.md | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/framework/resources/views/layouts/styles.blade.php b/packages/framework/resources/views/layouts/styles.blade.php index 497e524ae1b..2a345a4ce18 100644 --- a/packages/framework/resources/views/layouts/styles.blade.php +++ b/packages/framework/resources/views/layouts/styles.blade.php @@ -3,7 +3,7 @@ {{-- The compiled Tailwind/App styles --}} @if(config('hyde.load_app_styles_from_cdn', false)) - + @elseif(Asset::hasMediaFile('app.css')) @endif diff --git a/packages/framework/tests/Unit/Views/StylesComponentViewTest.php b/packages/framework/tests/Unit/Views/StylesComponentViewTest.php index bfe078d00f1..bb5358f9e08 100644 --- a/packages/framework/tests/Unit/Views/StylesComponentViewTest.php +++ b/packages/framework/tests/Unit/Views/StylesComponentViewTest.php @@ -5,7 +5,7 @@ namespace Hyde\Framework\Testing\Unit\Views; use Hyde\Facades\Filesystem; -use Hyde\Facades\Asset; +use Hyde\Facades\HydeFront; use Hyde\Hyde; use Hyde\Support\Facades\Render; use Hyde\Testing\TestCase; @@ -80,7 +80,7 @@ public function testComponentRendersTailwindPlayCdnLinkWhenEnabledInConfig() public function testComponentRendersAppCdnLinkWhenEnabledInConfig() { config(['hyde.load_app_styles_from_cdn' => true]); - $this->assertStringContainsString(Asset::cdnLink('app.css'), $this->renderTestView()); + $this->assertStringContainsString(HydeFront::cdnLink('app.css'), $this->renderTestView()); } public function testComponentDoesNotRenderLinkToLocalAppCssWhenCdnLinkIsEnabledInConfig() diff --git a/spec.md b/spec.md index b404251e8ea..a1ca493ac41 100644 --- a/spec.md +++ b/spec.md @@ -15,7 +15,7 @@ For example: Consider these Blade snippets from the default views, showing commo ```blade {{-- The compiled Tailwind/App styles --}} @if(config('hyde.load_app_styles_from_cdn', false)) - + @elseif(Asset::hasMediaFile('app.css')) @endif @@ -61,7 +61,7 @@ protected function setSource(string $source): string { ### Asset Facade ```php -Asset::cdnLink(string $file) // Gets remote URL to any file in /dist/ in the HydeFront version +HydeFront::cdnLink(string $file) // Gets remote URL to any file in /dist/ in the HydeFront version Asset::mediaLink(string $file) // Returns Hyde::mediaLink but with a cache buster Asset::hasMediaFile(string $file) // Returns file_exists(Hyde::mediaPath($file)) @@ -576,7 +576,7 @@ $size = $logo->getSize(); $mimeType = $logo->getMimeType(); // HydeFront CDN link (for app.js or app.css) -$appJsUrl = Asset::cdnLink('app.js'); +$appJsUrl = HydeFront::cdnLink('app.js'); ``` This API maintains the simplicity-first approach of Hyde while providing power when needed. It should be intuitive for both Laravel-familiar developers and those new to the framework, aligning well with Hyde's philosophy and goals. From f5b752610ac5d9f8027afcaa13428669215b8110 Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 14:52:35 +0200 Subject: [PATCH 06/15] Remove deprecated Asset facade methods See https://github.com/hydephp/develop/pull/1904 for why we are skipping the normal deprecation process. --- packages/framework/src/Facades/Asset.php | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/packages/framework/src/Facades/Asset.php b/packages/framework/src/Facades/Asset.php index 6d7a3afaeb3..2300dd6dc72 100644 --- a/packages/framework/src/Facades/Asset.php +++ b/packages/framework/src/Facades/Asset.php @@ -6,7 +6,6 @@ use Hyde\Hyde; use Illuminate\Support\Str; -use JetBrains\PhpStorm\Deprecated; use function md5_file; use function file_exists; @@ -54,26 +53,4 @@ protected static function getCacheBustKey(string $file): string ? '?v='.md5_file(Hyde::mediaPath("$file")) : ''; } - - /** - * @deprecated Use HydeFront::version() instead. - * - * @codeCoverageIgnore Deprecated method. - */ - #[Deprecated(reason: 'Use HydeFront::version() instead.', replacement: '\Hyde\Facades\HydeFront::version()')] - public static function version(): string - { - return HydeFront::version(); - } - - /** - * @deprecated Use HydeFront::cdnLink() instead. - * - * @codeCoverageIgnore Deprecated method. - */ - #[Deprecated(reason: 'Use HydeFront::cdnLink() instead.', replacement: '\Hyde\Facades\HydeFront::cdnLink()')] - public static function cdnLink(string $file): string - { - return HydeFront::cdnLink($file); - } } From 48a8a94aa8a54f85b3cbeab72594aae8189f3f2e Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 14:58:06 +0200 Subject: [PATCH 07/15] Remove unnecessary final modifiers from protected constants --- packages/framework/src/Facades/HydeFront.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/framework/src/Facades/HydeFront.php b/packages/framework/src/Facades/HydeFront.php index e3b5c76f606..22a25793caa 100644 --- a/packages/framework/src/Facades/HydeFront.php +++ b/packages/framework/src/Facades/HydeFront.php @@ -9,10 +9,10 @@ class HydeFront { /** @var string The default HydeFront SemVer tag to load. This constant is set to match the styles used for the installed framework version. */ - final protected const HYDEFRONT_VERSION = 'v3.4'; + protected const HYDEFRONT_VERSION = 'v3.4'; /** @var string The default HydeFront CDN path pattern. The Blade-style placeholders are replaced with the proper values. */ - final protected const HYDEFRONT_CDN_URL = 'https://cdn.jsdelivr.net/npm/hydefront@{{ $version }}/dist/{{ $file }}'; + protected const HYDEFRONT_CDN_URL = 'https://cdn.jsdelivr.net/npm/hydefront@{{ $version }}/dist/{{ $file }}'; public static function version(): string { From 57835e62662f90e7eae97d630b992e0f93d1f209 Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 15:00:14 +0200 Subject: [PATCH 08/15] Inline helper method --- packages/framework/src/Facades/HydeFront.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/framework/src/Facades/HydeFront.php b/packages/framework/src/Facades/HydeFront.php index 22a25793caa..aa45b7cfc3a 100644 --- a/packages/framework/src/Facades/HydeFront.php +++ b/packages/framework/src/Facades/HydeFront.php @@ -20,11 +20,6 @@ public static function version(): string } public static function cdnLink(string $file): string - { - return static::constructCdnPath($file); - } - - protected static function constructCdnPath(string $file): string { return str_replace( ['{{ $version }}', '{{ $file }}'], From 84a686456893f91fcf56ffed0e1fa6422af6fbda Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 15:00:37 +0200 Subject: [PATCH 09/15] Clean up helper method --- packages/framework/src/Facades/HydeFront.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/framework/src/Facades/HydeFront.php b/packages/framework/src/Facades/HydeFront.php index aa45b7cfc3a..b2a43426e92 100644 --- a/packages/framework/src/Facades/HydeFront.php +++ b/packages/framework/src/Facades/HydeFront.php @@ -22,8 +22,7 @@ public static function version(): string public static function cdnLink(string $file): string { return str_replace( - ['{{ $version }}', '{{ $file }}'], - [static::version(), $file], + ['{{ $version }}', '{{ $file }}'], [static::version(), $file], static::HYDEFRONT_CDN_URL ); } From 324b316ab148ed325df19391a220b28378f9e62d Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 15:03:14 +0200 Subject: [PATCH 10/15] Simplify helper method implementation With the private API we can now use a more specific and cleaner implementation --- packages/framework/src/Facades/HydeFront.php | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/framework/src/Facades/HydeFront.php b/packages/framework/src/Facades/HydeFront.php index b2a43426e92..13892a380e1 100644 --- a/packages/framework/src/Facades/HydeFront.php +++ b/packages/framework/src/Facades/HydeFront.php @@ -4,15 +4,15 @@ namespace Hyde\Facades; -use function str_replace; +use function sprintf; class HydeFront { /** @var string The default HydeFront SemVer tag to load. This constant is set to match the styles used for the installed framework version. */ protected const HYDEFRONT_VERSION = 'v3.4'; - /** @var string The default HydeFront CDN path pattern. The Blade-style placeholders are replaced with the proper values. */ - protected const HYDEFRONT_CDN_URL = 'https://cdn.jsdelivr.net/npm/hydefront@{{ $version }}/dist/{{ $file }}'; + /** @var string The default HydeFront CDN path pattern. */ + protected const HYDEFRONT_CDN_URL = 'https://cdn.jsdelivr.net/npm/hydefront@%s/dist/%s'; public static function version(): string { @@ -21,9 +21,6 @@ public static function version(): string public static function cdnLink(string $file): string { - return str_replace( - ['{{ $version }}', '{{ $file }}'], [static::version(), $file], - static::HYDEFRONT_CDN_URL - ); + return sprintf(static::HYDEFRONT_CDN_URL, static::version(), $file); } } From f2c63bcf3186a5d98973409e79fd39d38fe5f952 Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 15:04:33 +0200 Subject: [PATCH 11/15] Add HydeFront facade class documentation --- packages/framework/src/Facades/HydeFront.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/framework/src/Facades/HydeFront.php b/packages/framework/src/Facades/HydeFront.php index 13892a380e1..5c9223b7c85 100644 --- a/packages/framework/src/Facades/HydeFront.php +++ b/packages/framework/src/Facades/HydeFront.php @@ -6,6 +6,11 @@ use function sprintf; +/** + * HydeFront is the NPM package that bundles the default precompiled CSS and JavaScript assets for HydePHP. + * + * This facade makes it easy to access these assets from the HydeFront CDN, automatically getting the correct version. + */ class HydeFront { /** @var string The default HydeFront SemVer tag to load. This constant is set to match the styles used for the installed framework version. */ From 24571037a9a2ba5eac12f03ffd60267756b9ca67 Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 15:11:24 +0200 Subject: [PATCH 12/15] Add rich PHPDoc method annotations --- packages/framework/src/Facades/HydeFront.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/framework/src/Facades/HydeFront.php b/packages/framework/src/Facades/HydeFront.php index 5c9223b7c85..00f5a6ce543 100644 --- a/packages/framework/src/Facades/HydeFront.php +++ b/packages/framework/src/Facades/HydeFront.php @@ -19,11 +19,21 @@ class HydeFront /** @var string The default HydeFront CDN path pattern. */ protected const HYDEFRONT_CDN_URL = 'https://cdn.jsdelivr.net/npm/hydefront@%s/dist/%s'; + /** + * Get the current version of the HydeFront package. + * + * @return string {@see HYDEFRONT_VERSION} + */ public static function version(): string { return static::HYDEFRONT_VERSION; } + /** + * Get the CDN link for a specific file. + * + * @param 'app.css'|'hyde.css'|'hyde.css.map' $file + */ public static function cdnLink(string $file): string { return sprintf(static::HYDEFRONT_CDN_URL, static::version(), $file); From e33c8213a700df0da06636fdb347674d4540117b Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 15:13:03 +0200 Subject: [PATCH 13/15] Add more tests --- .../tests/Unit/Facades/HydeFrontFacadeTest.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php b/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php index 37425127bf7..4afe8ee9e36 100644 --- a/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php +++ b/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php @@ -22,4 +22,16 @@ public function testCdnLinkReturnsCorrectUrl() $expected = 'https://cdn.jsdelivr.net/npm/hydefront@v3.4/dist/styles.css'; $this->assertSame($expected, HydeFront::cdnLink('styles.css')); } + + public function testCdnLinkReturnsCorrectUrlForHydeCss() + { + $expected = 'https://cdn.jsdelivr.net/npm/hydefront@v3.4/dist/hyde.css'; + $this->assertSame($expected, HydeFront::cdnLink('hyde.css')); + } + + public function testCdnLinkReturnsCorrectUrlForInvalidFile() + { + $expected = 'https://cdn.jsdelivr.net/npm/hydefront@v3.4/dist/invalid'; + $this->assertSame($expected, HydeFront::cdnLink('invalid')); + } } From f00db0771ef14e40b146f6a5cc359ba2953bfef4 Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 15:13:28 +0200 Subject: [PATCH 14/15] Update constant comment --- packages/framework/src/Facades/HydeFront.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/framework/src/Facades/HydeFront.php b/packages/framework/src/Facades/HydeFront.php index 00f5a6ce543..b566839b999 100644 --- a/packages/framework/src/Facades/HydeFront.php +++ b/packages/framework/src/Facades/HydeFront.php @@ -16,7 +16,7 @@ class HydeFront /** @var string The default HydeFront SemVer tag to load. This constant is set to match the styles used for the installed framework version. */ protected const HYDEFRONT_VERSION = 'v3.4'; - /** @var string The default HydeFront CDN path pattern. */ + /** @var string The default HydeFront CDN path pattern used to assemble CDN links. */ protected const HYDEFRONT_CDN_URL = 'https://cdn.jsdelivr.net/npm/hydefront@%s/dist/%s'; /** From dc129051b7831a23ebe81f41e37783d5f8a2fac7 Mon Sep 17 00:00:00 2001 From: Caen De Silva Date: Fri, 26 Jul 2024 15:17:26 +0200 Subject: [PATCH 15/15] Add todo --- packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php b/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php index 4afe8ee9e36..fd4336eff3a 100644 --- a/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php +++ b/packages/framework/tests/Unit/Facades/HydeFrontFacadeTest.php @@ -12,6 +12,8 @@ */ class HydeFrontFacadeTest extends UnitTestCase { + // Todo: Check the version is correct? (When running in monorepo) + public function testVersionReturnsString() { $this->assertIsString(HydeFront::version());