diff --git a/.gitattributes b/.gitattributes index 3ef96b3..1e07184 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,4 +5,5 @@ /.gitignore export-ignore /.travis.yml export-ignore /phpunit.xml export-ignore -/sonar-project.properties export-ignore \ No newline at end of file +/sonar-project.properties export-ignore +/release-commit.php export-ignore \ No newline at end of file diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index f256b3c..761287e 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -7,8 +7,8 @@ on: branches: [ main ] jobs: - build: - + test: + name: Run Tests runs-on: ubuntu-latest strategy: @@ -16,17 +16,45 @@ jobs: steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup PHP - uses: shivammathur/setup-php@2.30.0 + uses: shivammathur/setup-php@v2 with: php-version: 8.3 extensions: mbstring, sqlsrv, iconv - tools: phpunit, composer + tools: phpunit:9.5.20, composer - name: Install dependencies run: composer install --prefer-dist --no-progress - name: Execute Tests run: phpunit --configuration tests/phpunit.xml + + release_staging: + name: Prepare Beta Release Branch + needs: + - "test" + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/dev' + steps: + - uses: actions/checkout@v4 + - uses: google-github-actions/release-please-action@v3 + with: + release-type: php + default-branch: dev + config-file: release-please-config.json + token: ${{ secrets.GITHUB_TOKEN }} + release_prod: + name: Prepare Production Release Branch + needs: + - "test" + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/main' + steps: + - uses: actions/checkout@v4 + - uses: google-github-actions/release-please-action@v3 + with: + release-type: php + config-file: release-please-config.json + token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..c7af98e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,26 @@ +# Changelog + +## [3.0.0-Beta.26](https://github.com/WebFiori/app/compare/v3.0.0-Beta.18...v3.0.0-Beta.26) (2025-04-09) + + +### Miscellaneous Chores + +* release v3.0.0-Beta.26 ([e21bbf5](https://github.com/WebFiori/app/commit/e21bbf5aedcbccaf83faff0e336561adaa72049c)) +* Updated Framework Version ([7416076](https://github.com/WebFiori/app/commit/74160762dafa7509d7bfd531062be1886979f7b2)) + +## [3.0.0-Beta.18](https://github.com/WebFiori/app/compare/v3.0.0-RC7...v3.0.0-Beta.18) (2024-12-04) + + +### Miscellaneous Chores + +* release v3.0.0-Beta.18 ([c82b989](https://github.com/WebFiori/app/commit/c82b98939167749b143c8bc86a325609ae6c4b5e)) +* Updated Composer Dependencies ([09827af](https://github.com/WebFiori/app/commit/09827af2d4d70b5e7d44d5c1234221528a70e3cf)) +* Updated Core Framework Version ([b6e00a3](https://github.com/WebFiori/app/commit/b6e00a3b8883d5736c2ccd96b8c0b8c5e0c025b1)) +* Updated Core Framework Version ([48623e3](https://github.com/WebFiori/app/commit/48623e383356957b2008fd09c90be94afdb7da29)) +* Updated Core Framework Version ([20ed7ea](https://github.com/WebFiori/app/commit/20ed7ea9939e2cf9339b10964ad5e0cc4b028749)) +* Updated Dependencies ([546eec2](https://github.com/WebFiori/app/commit/546eec25bff1736a0b3434243b80ed55df05e532)) +* Updated Framework Version ([bf81d5d](https://github.com/WebFiori/app/commit/bf81d5d746103d3491fd2e4ac54179dd587dbbce)) +* Updated Framework Version ([2df0e28](https://github.com/WebFiori/app/commit/2df0e2846121f7ed57350da2dc10488592362a89)) +* Updated Framework Version ([333ee5c](https://github.com/WebFiori/app/commit/333ee5c3f8d73388dc9d5889006568ce2413d20f)) +* Updated Framework Version ([17fb434](https://github.com/WebFiori/app/commit/17fb434209b611e7cfab5a6e6cd288fae924ab23)) +* Updated Framework Version ([57f362c](https://github.com/WebFiori/app/commit/57f362c61e572c5b3a1fe4d66c2f7bf9b89c7806)) diff --git a/composer.json b/composer.json index 20a9548..5b11792 100644 --- a/composer.json +++ b/composer.json @@ -1,21 +1,10 @@ { "name": "webfiori/app", "description": "WebFiori framework. Made to make the web bloom. This is the basic WebFiori application template. Use it to create your amazing art.", - "authors": [ - - ], - "type":"project", + "authors": [], + "type": "project", "require": { - "php": ">=7.0", - "webfiori/framework":"v3.0.0-Beta.14" - }, - "keywords": [ - "framework", - "webfiori", - "php", - "API", - "Web APIs", - "Themes" - ], - "license": "MIT" + "php": ">=8.1", + "webfiori/framework": "3.0.0-beta.30" + } } diff --git a/composer.lock b/composer.lock index bc60745..0c29faf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,70 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7d6713d2033cddbc85bf171d79a7a079", + "content-hash": "0341e22c2cabc0b8ee8820af85fcd2fa", "packages": [ + { + "name": "webfiori/cache", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/WebFiori/cache.git", + "reference": "04243157f69de111536f0a1dc0b050b6510bb8e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WebFiori/cache/zipball/04243157f69de111536f0a1dc0b050b6510bb8e7", + "reference": "04243157f69de111536f0a1dc0b050b6510bb8e7", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "webfiori\\cache\\": "webfiori/cache/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A simple caching engine which is highly customizable.", + "keywords": [ + "cache", + "customizable", + "file cache" + ], + "support": { + "issues": "https://github.com/WebFiori/cache/issues", + "source": "https://github.com/WebFiori/cache/tree/v1.1.0" + }, + "funding": [ + { + "url": "https://paypal.me/IbrahimBinAlshikh", + "type": "custom" + }, + { + "url": "https://www.buymeacoffee.com/ibrahimdev", + "type": "custom" + }, + { + "url": "https://ko-fi.com/ibrahimdev", + "type": "ko_fi" + } + ], + "time": "2025-01-06T16:32:38+00:00" + }, { "name": "webfiori/cli", - "version": "v1.3.0", + "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/WebFiori/cli.git", - "reference": "d9fc5819dd7024a4aef4cb28775ea892014c08ab" + "reference": "abc3d6b083d83ddf91355c3b6825217cd6123cbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/cli/zipball/d9fc5819dd7024a4aef4cb28775ea892014c08ab", - "reference": "d9fc5819dd7024a4aef4cb28775ea892014c08ab", + "url": "https://api.github.com/repos/WebFiori/cli/zipball/abc3d6b083d83ddf91355c3b6825217cd6123cbe", + "reference": "abc3d6b083d83ddf91355c3b6825217cd6123cbe", "shasum": "" }, "require": { @@ -51,36 +101,22 @@ ], "support": { "issues": "https://github.com/WebFiori/cli/issues", - "source": "https://github.com/WebFiori/cli/tree/v1.3.0" + "source": "https://github.com/WebFiori/cli/tree/v1.3.1" }, - "funding": [ - { - "url": "https://paypal.me/IbrahimBinAlshikh", - "type": "custom" - }, - { - "url": "https://www.buymeacoffee.com/ibrahimdev", - "type": "custom" - }, - { - "url": "https://ko-fi.com/ibrahimdev", - "type": "ko_fi" - } - ], - "time": "2024-08-20T21:10:05+00:00" + "time": "2025-04-07T19:18:39+00:00" }, { "name": "webfiori/collections", - "version": "v1.1.4", + "version": "1.1.5", "source": { "type": "git", "url": "https://github.com/WebFiori/collections.git", - "reference": "e82f0418c298de0c534cf6b1f84b703207c40b5b" + "reference": "18491285e5c698d72590e5081b3f445a47428a93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/collections/zipball/e82f0418c298de0c534cf6b1f84b703207c40b5b", - "reference": "e82f0418c298de0c534cf6b1f84b703207c40b5b", + "url": "https://api.github.com/repos/WebFiori/collections/zipball/18491285e5c698d72590e5081b3f445a47428a93", + "reference": "18491285e5c698d72590e5081b3f445a47428a93", "shasum": "" }, "require": { @@ -92,7 +128,7 @@ "type": "library", "autoload": { "psr-4": { - "webfiori\\collections\\": "webfiori\\collections" + "webfiori\\collections\\": "webfiori/collections/" } }, "notification-url": "https://packagist.org/downloads/", @@ -109,7 +145,7 @@ ], "support": { "issues": "https://github.com/WebFiori/collections/issues", - "source": "https://github.com/WebFiori/collections/tree/v1.1.4" + "source": "https://github.com/WebFiori/collections/tree/v1.1.5" }, "funding": [ { @@ -125,20 +161,20 @@ "type": "ko_fi" } ], - "time": "2023-12-08T22:02:45+00:00" + "time": "2024-12-23T21:59:36+00:00" }, { "name": "webfiori/database", - "version": "v0.8.11", + "version": "0.10.0", "source": { "type": "git", "url": "https://github.com/WebFiori/database.git", - "reference": "fda0e183437061bc75fa3422836433a440baa8c0" + "reference": "6ea57d68da4279d82324b4e90fa7d1a335c3d35b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/database/zipball/fda0e183437061bc75fa3422836433a440baa8c0", - "reference": "fda0e183437061bc75fa3422836433a440baa8c0", + "url": "https://api.github.com/repos/WebFiori/database/zipball/6ea57d68da4279d82324b4e90fa7d1a335c3d35b", + "reference": "6ea57d68da4279d82324b4e90fa7d1a335c3d35b", "shasum": "" }, "require": { @@ -164,7 +200,7 @@ ], "support": { "issues": "https://github.com/WebFiori/database/issues", - "source": "https://github.com/WebFiori/database/tree/v0.8.11" + "source": "https://github.com/WebFiori/database/tree/v0.10.0" }, "funding": [ { @@ -180,20 +216,20 @@ "type": "ko_fi" } ], - "time": "2024-10-28T20:25:53+00:00" + "time": "2025-02-04T12:04:02+00:00" }, { "name": "webfiori/err", - "version": "v1.1.0", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/WebFiori/err.git", - "reference": "dbd6624667e0be7424a48da821ec89a02122ed60" + "reference": "d32499334404f80b1647dcaf35fe572251535835" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/err/zipball/dbd6624667e0be7424a48da821ec89a02122ed60", - "reference": "dbd6624667e0be7424a48da821ec89a02122ed60", + "url": "https://api.github.com/repos/WebFiori/err/zipball/d32499334404f80b1647dcaf35fe572251535835", + "reference": "d32499334404f80b1647dcaf35fe572251535835", "shasum": "" }, "require": { @@ -220,36 +256,22 @@ ], "support": { "issues": "https://github.com/WebFiori/err/issues", - "source": "https://github.com/WebFiori/err/tree/v1.1.0" + "source": "https://github.com/WebFiori/err/tree/v1.2.0" }, - "funding": [ - { - "url": "https://paypal.me/IbrahimBinAlshikh", - "type": "custom" - }, - { - "url": "https://www.buymeacoffee.com/ibrahimdev", - "type": "custom" - }, - { - "url": "https://ko-fi.com/ibrahimdev", - "type": "ko_fi" - } - ], - "time": "2024-06-26T21:03:32+00:00" + "time": "2025-04-07T14:33:57+00:00" }, { "name": "webfiori/file", - "version": "v1.3.6", + "version": "1.3.8", "source": { "type": "git", "url": "https://github.com/WebFiori/file.git", - "reference": "badb7251fb8362abfebc51f90d4c97d12e502f15" + "reference": "d3495a7cb40d047cb92b6bb7a814e064fdd35250" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/file/zipball/badb7251fb8362abfebc51f90d4c97d12e502f15", - "reference": "badb7251fb8362abfebc51f90d4c97d12e502f15", + "url": "https://api.github.com/repos/WebFiori/file/zipball/d3495a7cb40d047cb92b6bb7a814e064fdd35250", + "reference": "d3495a7cb40d047cb92b6bb7a814e064fdd35250", "shasum": "" }, "require": { @@ -262,7 +284,7 @@ "type": "library", "autoload": { "psr-4": { - "webfiori\\file\\": "webfiori\\file" + "webfiori\\file\\": "webfiori/file/" } }, "notification-url": "https://packagist.org/downloads/", @@ -285,7 +307,7 @@ ], "support": { "issues": "https://github.com/WebFiori/file/issues", - "source": "https://github.com/WebFiori/file/tree/v1.3.6" + "source": "https://github.com/WebFiori/file/tree/v1.3.8" }, "funding": [ { @@ -301,20 +323,20 @@ "type": "ko_fi" } ], - "time": "2024-04-29T20:08:30+00:00" + "time": "2025-01-06T22:21:51+00:00" }, { "name": "webfiori/framework", - "version": "3.0.0-Beta.14", + "version": "3.0.0-Beta.26", "source": { "type": "git", "url": "https://github.com/WebFiori/framework.git", - "reference": "ffba40f52f419b6d1b93620757d5e85360d64938" + "reference": "260e4b4c4cb763e9356a536dd539306de51cac82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/framework/zipball/ffba40f52f419b6d1b93620757d5e85360d64938", - "reference": "ffba40f52f419b6d1b93620757d5e85360d64938", + "url": "https://api.github.com/repos/WebFiori/framework/zipball/260e4b4c4cb763e9356a536dd539306de51cac82", + "reference": "260e4b4c4cb763e9356a536dd539306de51cac82", "shasum": "" }, "require": { @@ -323,15 +345,16 @@ "ext-mbstring": "*", "ext-openssl": "*", "php": ">=7.0", - "webfiori/cli": "v1.3.0", - "webfiori/collections": "v1.1.4", - "webfiori/database": "v0.8.11", - "webfiori/err": "v1.1.0", - "webfiori/file": "v1.3.6", - "webfiori/http": "v3.3.15", - "webfiori/jsonx": "v3.3.0", - "webfiori/mailer": "v1.2.0", - "webfiori/ui": "v2.6.3" + "webfiori/cache": "v1.1.0", + "webfiori/cli": "v1.3.1", + "webfiori/collections": "v1.1.5", + "webfiori/database": "v0.10.0", + "webfiori/err": "v1.2.0", + "webfiori/file": "v1.3.8", + "webfiori/http": "v3.6.0", + "webfiori/jsonx": "v3.3.2", + "webfiori/mailer": "v1.3.1", + "webfiori/ui": "v2.6.4" }, "type": "library", "autoload": { @@ -379,20 +402,20 @@ "type": "ko_fi" } ], - "time": "2024-11-21T09:29:08+00:00" + "time": "2025-04-08T21:00:10+00:00" }, { "name": "webfiori/http", - "version": "v3.3.15", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/WebFiori/http.git", - "reference": "842d9aed0bdf96dd45b44b03f9a04fa8ee7d895d" + "reference": "f86c0a5dab2e5979c505e687138ba282eecd8bca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/http/zipball/842d9aed0bdf96dd45b44b03f9a04fa8ee7d895d", - "reference": "842d9aed0bdf96dd45b44b03f9a04fa8ee7d895d", + "url": "https://api.github.com/repos/WebFiori/http/zipball/f86c0a5dab2e5979c505e687138ba282eecd8bca", + "reference": "f86c0a5dab2e5979c505e687138ba282eecd8bca", "shasum": "" }, "require": { @@ -424,7 +447,7 @@ ], "support": { "issues": "https://github.com/WebFiori/http/issues", - "source": "https://github.com/WebFiori/http/tree/v3.3.15" + "source": "https://github.com/WebFiori/http/tree/v3.6.0" }, "funding": [ { @@ -432,20 +455,20 @@ "type": "custom" } ], - "time": "2024-11-20T20:47:16+00:00" + "time": "2024-12-24T20:07:08+00:00" }, { "name": "webfiori/jsonx", - "version": "v3.3.0", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/WebFiori/json.git", - "reference": "833fd51516cce33e9bcc2efd0e81956b541ae7dc" + "reference": "4c5fe729fff65a246bc0715e48ef2cd1465e46c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/json/zipball/833fd51516cce33e9bcc2efd0e81956b541ae7dc", - "reference": "833fd51516cce33e9bcc2efd0e81956b541ae7dc", + "url": "https://api.github.com/repos/WebFiori/json/zipball/4c5fe729fff65a246bc0715e48ef2cd1465e46c2", + "reference": "4c5fe729fff65a246bc0715e48ef2cd1465e46c2", "shasum": "" }, "require": { @@ -469,7 +492,7 @@ ], "support": { "issues": "https://github.com/WebFiori/json/issues", - "source": "https://github.com/WebFiori/json/tree/v3.3.0" + "source": "https://github.com/WebFiori/json/tree/v3.3.2" }, "funding": [ { @@ -477,20 +500,20 @@ "type": "custom" } ], - "time": "2023-08-03T07:59:28+00:00" + "time": "2025-01-28T19:58:59+00:00" }, { "name": "webfiori/mailer", - "version": "v1.2.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/WebFiori/mail.git", - "reference": "e5b61fb9d8bc27c4c2ac8106a98ec7d1335cd65e" + "reference": "8bc23bc22c23a8a39b77539f7ec3648937e87bb9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/mail/zipball/e5b61fb9d8bc27c4c2ac8106a98ec7d1335cd65e", - "reference": "e5b61fb9d8bc27c4c2ac8106a98ec7d1335cd65e", + "url": "https://api.github.com/repos/WebFiori/mail/zipball/8bc23bc22c23a8a39b77539f7ec3648937e87bb9", + "reference": "8bc23bc22c23a8a39b77539f7ec3648937e87bb9", "shasum": "" }, "require": { @@ -501,7 +524,7 @@ "type": "library", "autoload": { "psr-4": { - "webfiori\\email\\": "webfiori\\email" + "webfiori\\email\\": "webfiori/email/" } }, "notification-url": "https://packagist.org/downloads/", @@ -524,7 +547,7 @@ ], "support": { "issues": "https://github.com/WebFiori/mail/issues", - "source": "https://github.com/WebFiori/mail/tree/v1.2.0" + "source": "https://github.com/WebFiori/mail/tree/v1.3.1" }, "funding": [ { @@ -540,33 +563,30 @@ "type": "ko_fi" } ], - "time": "2024-04-14T16:06:30+00:00" + "time": "2024-12-24T19:31:13+00:00" }, { "name": "webfiori/ui", - "version": "v2.6.3", + "version": "2.6.4", "source": { "type": "git", "url": "https://github.com/WebFiori/ui.git", - "reference": "c6d0b13ff0d69473cdef5560edadb67032128150" + "reference": "92684505c2562e78d8881e7720a62d4c4caffd4f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WebFiori/ui/zipball/c6d0b13ff0d69473cdef5560edadb67032128150", - "reference": "c6d0b13ff0d69473cdef5560edadb67032128150", + "url": "https://api.github.com/repos/WebFiori/ui/zipball/92684505c2562e78d8881e7720a62d4c4caffd4f", + "reference": "92684505c2562e78d8881e7720a62d4c4caffd4f", "shasum": "" }, "require": { "php": ">=7.0", - "webfiori/collections": "1.1.x" - }, - "require-dev": { - "phpunit/phpunit": "^5" + "webfiori/collections": "1.x.x" }, "type": "library", "autoload": { "psr-4": { - "webfiori\\ui\\": "webfiori\\ui" + "webfiori\\ui\\": "webfiori/ui/" } }, "notification-url": "https://packagist.org/downloads/", @@ -583,15 +603,23 @@ ], "support": { "issues": "https://github.com/WebFiori/ui/issues", - "source": "https://github.com/WebFiori/ui/tree/v2.6.3" + "source": "https://github.com/WebFiori/ui/tree/v2.6.4" }, "funding": [ { "url": "https://paypal.me/IbrahimBinAlshikh", "type": "custom" + }, + { + "url": "https://www.buymeacoffee.com/ibrahimdev", + "type": "custom" + }, + { + "url": "https://ko-fi.com/ibrahimdev", + "type": "ko_fi" } ], - "time": "2024-07-08T22:04:06+00:00" + "time": "2024-12-24T10:26:50+00:00" } ], "packages-dev": [], @@ -606,5 +634,5 @@ "php": ">=7.0" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.1.0" } diff --git a/public/index.php b/public/index.php index f081333..a671e5c 100644 --- a/public/index.php +++ b/public/index.php @@ -1,88 +1,13 @@ loadAppClass(); - App::setConfigDriver('\\webfiori\\framework\\config\\JsonDriver'); - /** - * This where magic will start. - * - * Planting application seed into the ground and make your work bloom. - */ - App::start(); - - if (App::getRunner()->isCLI() === true) { - App::getRunner()->start(); - } else { - //route user request. - SessionsManager::start('wf-session'); - Router::route(Request::getRequestedURI()); - Response::send(); - } - } - /** - * Try to load the class 'App'. - * - * @throws Exception - */ - private function loadAppClass() { - $DS = DIRECTORY_SEPARATOR; - $frameworkPath = ROOT_PATH.$DS.'vendor'.$DS.'webfiori'.$DS.'framework'; - $corePath = $frameworkPath.$DS.'webfiori'.$DS.'framework'; - $rootClass = $DS.'App.php'; - - if (file_exists($corePath.$rootClass)) { - define('WF_CORE_PATH', $corePath); - require_once $corePath.$rootClass; - } else { - throw new Exception('Unable to locate the class "App".'); - } - } - /** - * Creates a single instance of the class. - */ - public static function create() { - if (self::$instance === null) { - self::$instance = new Index(); - } - } -} -Index::create(); \ No newline at end of file +App::initiate('App', 'public', __DIR__); +App::start(); +App::handle(); diff --git a/release-commit.php b/release-commit.php new file mode 100644 index 0000000..3cb8f8f --- /dev/null +++ b/release-commit.php @@ -0,0 +1,9 @@ +setConfigFileName($configFileName); App::getConfig()->initialize(); App::start(); diff --git a/themes/webfiori108/WebFioriV108.php b/themes/webfiori108/WebFioriV108.php index ad759b2..9510213 100644 --- a/themes/webfiori108/WebFioriV108.php +++ b/themes/webfiori108/WebFioriV108.php @@ -1,15 +1,15 @@ setClassName('col-2'); return $aside; } - public function getFooterNode() { + public function getFooterNode(): HTMLNode { $footer = new HTMLNode('footer'); $footer->setClassName('bd-footer text-muted'); $footer->setClassName('container-fluid p-md-4'); @@ -280,7 +280,7 @@ public function getFooterNode() { return $footer; } - public function getHeadNode() { + public function getHeadNode(): HeadNode { $head = new HeadNode(); $head->addCSS('https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css'); $head->addJs('https://code.jquery.com/jquery-3.4.1.slim.min.js'); @@ -290,7 +290,7 @@ public function getHeadNode() { return $head; } - public function getHeaderNode() { + public function getHeaderNode(): HTMLNode { $header = new HTMLNode('header'); $header->setClassName('container-fluid'); $mainNav = new HTMLNode('nav');