Compare commits

..

34 Commits

Author SHA1 Message Date
KHOUBZA Younes 9abe8b76ea update workflows test yml 2021-05-06 12:14:54 +00:00
KHOUBZA Younes 4d7d950f6f Merge remote-tracking branch 'toastr-symfony/main' 2021-05-02 14:41:24 +00:00
KHOUBZA Younes ce0a6e70fc rename extensions 2021-04-17 18:40:02 +02:00
KHOUBZA Younes 60a76cf1c3 rename symfony extensions 2021-04-17 18:13:10 +02:00
KHOUBZA Younes 3f0087d7c3 rename symfony bundles names to fix symfony flex bundle auto register 2021-04-17 17:57:12 +02:00
KHOUBZA Younes 5492d30374 update composer.json 2021-04-16 20:26:48 +02:00
KHOUBZA Younes 7ff1ec4fc1 clean up code 2021-04-16 20:08:36 +02:00
KHOUBZA Younes e6237cbe42 refactor symfony bundle configuration and response manager 2021-02-09 05:15:19 +01:00
Khoubza Younes 09fc4d6ec5 update home page 2020-12-17 11:26:35 +01:00
Khoubza Younes 1dac7bfdbb update README.md for all packages 2020-12-17 11:22:04 +01:00
Khoubza Younes b6ff681393 add open_collective to FUNDING.yml 2020-12-17 11:02:48 +01:00
Khoubza Younes 3e0b49d9db update README.md for all packages 2020-12-17 11:00:17 +01:00
Khoubza Younes ff48db2429 run tests on stable versions 2020-12-16 08:58:28 +01:00
Khoubza Younes 669e389677 run tests on stable versions 2020-12-16 08:48:36 +01:00
KHOUBZA Younes a19f4c4da1 update tests 2020-12-15 15:17:00 +01:00
KHOUBZA Younes 7e5116eaed update factories and add tailwindcss template 2020-12-15 15:00:08 +01:00
Khoubza Younes fd6f43026b tag 0.1.0 version 2020-12-14 09:20:45 +01:00
Khoubza Younes 8e852700c4 add toastr symfony tests 2020-12-12 09:11:32 +01:00
Khoubza Younes ed1d4154e9 update tests for flasher prime repository 2020-12-11 08:56:17 +01:00
Khoubza Younes 13012ce31e update laravel and js files 2020-12-10 13:55:46 +01:00
Khoubza Younes 3bd0365245 update session listener inject javascript before html tag instead of body 2020-12-10 05:13:54 +01:00
Khoubza Younes 68fee8dcf0 update flasherjs and flasher symfony bundle 2020-12-10 04:55:20 +01:00
Khoubza Younes 018e83b8da remove middelawares and delete renderer and rename presenter to renderer 2020-12-08 22:33:56 +01:00
Khoubza Younes aeaf31b5bb add FUNDING.yml file 2020-12-07 17:34:15 +01:00
Khoubza Younes be50c09c04 fix github workflow 2020-12-06 21:40:28 +01:00
Khoubza Younes 6e4620ef77 fix github workflow 2020-12-06 21:27:21 +01:00
Khoubza Younes c675167ec5 update github worklow.yaml 2020-12-06 19:39:19 +01:00
Khoubza Younes d7783cae2a fix all tests 2020-12-06 19:33:03 +01:00
Khoubza Younes 412e386eb6 fix composer.json psr-4 autoloading 2020-12-06 18:29:43 +01:00
Khoubza Younes 3588ac8d16 update namespaces 2020-12-06 17:29:32 +01:00
Khoubza Younes cdf0f7949a update composer.json 2020-12-06 16:34:11 +01:00
Khoubza Younes c5029a5d44 fix event dispatcher and call the storage service 2020-12-06 04:03:14 +01:00
KHOUBZA Younes e845b33608 update namespace 2020-12-03 09:15:47 +01:00
KHOUBZA Younes 30fb4672f1 add php-notify classes and rename namespaces 2020-12-02 00:57:12 +01:00
1158 changed files with 1139 additions and 136897 deletions
-19
View File
@@ -1,19 +0,0 @@
--ignore-dir=.idea
--ignore-dir=.cache
--ignore-dir=vendor
--ignore-dir=yoeunes
--ignore-dir=node_modules
--ignore-dir=demo/laravel/vendor
--ignore-dir=demo/laravel/node_modules
--ignore-dir=demo/laravel/storage
--ignore-dir=demo/laravel/bootstrap/cache
--ignore-dir=demo/symfony/vendor
--ignore-dir=demo/symfony/node_modules
--ignore-dir=demo/symfony/var
--ignore-dir=docs/.jekyll-cache
--ignore-dir=docs/_site
--ignore-dir=docs/node_modules
--ignore-dir=docs/dist
-109
View File
@@ -1,109 +0,0 @@
{
"projectName": "php-flasher",
"projectOwner": "php-flasher",
"repoType": "github",
"repoHost": "https://github.com",
"files": [
"README.md"
],
"imageSize": 100,
"commit": false,
"commitConvention": "angular",
"contributorsPerLine": 7,
"linkToUsage": false,
"contributors": [
{
"login": "yoeunes",
"name": "Younes ENNAJI",
"avatar_url": "https://avatars.githubusercontent.com/u/10859693?v=4",
"profile": "https://www.linkedin.com/in/younes--ennaji/",
"contributions": [
"code",
"doc",
"maintenance"
]
},
{
"login": "salmayno",
"name": "Salma Mourad",
"avatar_url": "https://avatars.githubusercontent.com/u/27933199?v=4",
"profile": "https://github.com/salmayno",
"contributions": [
"financial"
]
},
{
"login": "codenashwan",
"name": "Nashwan Abdullah",
"avatar_url": "https://avatars.githubusercontent.com/u/35005761?v=4",
"profile": "https://www.youtube.com/rstacode",
"contributions": [
"financial"
]
},
{
"login": "darviscommerce",
"name": "Arvid de Jong",
"avatar_url": "https://avatars.githubusercontent.com/u/7394837?v=4",
"profile": "https://darvis.nl/",
"contributions": [
"financial"
]
},
{
"login": "ash-jc-allen",
"name": "Ash Allen",
"avatar_url": "https://avatars.githubusercontent.com/u/39652331?v=4",
"profile": "https://ashallendesign.co.uk/",
"contributions": [
"design"
]
},
{
"login": "murrant",
"name": "Tony Murray",
"avatar_url": "https://avatars.githubusercontent.com/u/39462?v=4",
"profile": "https://about.me/murrant",
"contributions": [
"code"
]
},
{
"login": "n3wborn",
"name": "Stéphane P",
"avatar_url": "https://avatars.githubusercontent.com/u/10246722?v=4",
"profile": "https://github.com/n3wborn",
"contributions": [
"doc"
]
},
{
"login": "LucasStorm",
"name": "Lucas Maciel",
"avatar_url": "https://avatars.githubusercontent.com/u/80225404?v=4",
"profile": "https://www.instagram.com/lucas.maciel_z",
"contributions": [
"design"
]
},
{
"login": "AhmedGamal",
"name": "Ahmed Gamal",
"avatar_url": "https://avatars.githubusercontent.com/u/11786167?v=4",
"profile": "https://github.com/AhmedGamal",
"contributions": [
"code",
"doc"
]
},
{
"login": "BrookeDot",
"name": "Brooke.",
"avatar_url": "https://avatars.githubusercontent.com/u/150348?v=4",
"profile": "https://github.com/BrookeDot",
"contributions": [
"doc"
]
}
]
}
-3
View File
@@ -1,3 +0,0 @@
{
"presets": [["@babel/env", { "modules": false }]]
}
-4
View File
@@ -1,4 +0,0 @@
> 1%
last 2 versions
not dead
not IE 11
-22
View File
@@ -1,22 +0,0 @@
; This file is for unifying the coding style for different editors and IDEs.
; More information at http://editorconfig.org
root = true
[*]
charset = utf-8
indent_size = 4
indent_style = space
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
max_line_length = 0
trim_trailing_whitespace = false
[auto_closer.yaml]
indent_size = 2
[COMMIT_EDITMSG]
max_line_length = 0
-3
View File
@@ -1,3 +0,0 @@
**/node_modules
src/**/Resources/public/**
src/**/Resources/dist/**
+11 -14
View File
@@ -1,16 +1,13 @@
* text=auto
*.css diff=css
*.md diff=markdown
*.php diff=php
# Path-based git attributes
# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
/.github export-ignore
/bin export-ignore
/tests export-ignore
/.editorconfig export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/CHANGELOG-* export-ignore
/CODE_OF_CONDUCT.md export-ignore
/CONTRIBUTING.md export-ignore
/phpunit.xml.dist export-ignore
# Ignore all test and documentation with "export-ignore".
/.gitattributes export-ignore
/.gitignore export-ignore
/.travis.yml export-ignore
/phpunit.xml.dist export-ignore
/.scrutinizer.yml export-ignore
/.styleci.yml export-ignore
/tests export-ignore
/.editorconfig export-ignore
+6 -1
View File
@@ -1 +1,6 @@
github: yoeunes
# These are supported funding model platforms
patreon: yoeunes
ko_fi: yoeunes
open_collective: php-flasher
custom: ['https://www.paypal.com/paypalme/yoeunes']
+7
View File
@@ -0,0 +1,7 @@
version: 2
updates:
- package-ecosystem: composer
directory: "/"
schedule:
interval: daily
open-pull-requests-limit: 10
-61
View File
@@ -1,61 +0,0 @@
name: 🚀 Publish assets to NPM
on:
release:
types: [ published ]
jobs:
publish-prime:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./src/Prime/Resources
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20.x'
registry-url: 'https://registry.npmjs.org'
- name: Install dependencies
run: npm install
- name: Publish to NPM
run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
publish-plugin:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
strategy:
fail-fast: false
matrix:
path:
- ./src/Noty/Prime/Resources
- ./src/Notyf/Prime/Resources
- ./src/SweetAlert/Prime/Resources
- ./src/Toastr/Prime/Resources
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20.x'
registry-url: 'https://registry.npmjs.org'
- name: Install dependencies
run: npm install
working-directory: ${{ matrix.path }}
- name: Publish to NPM
run: npm publish --access public
working-directory: ${{ matrix.path }}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+80 -151
View File
@@ -1,174 +1,103 @@
name: qa
name: Running tests
on:
push:
branches:
- main
- 2.x
pull_request:
schedule:
- cron: '0 0 * * *' # Daily at midnight
- cron: '* * * * *'
jobs:
static-analysis:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php: [ 8.2 ]
name: php v${{ matrix.php }}
steps:
- name: 📥 Checkout Code
uses: actions/checkout@v4
- name: 🔧 Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
- name: 🚚 Cache Composer Dependencies
uses: actions/cache@v4
with:
path: ~/.composer/cache
key: ${{ runner.os }}-composer-${{ matrix.php }}-${{ hashFiles('composer.json') }}
restore-keys: ${{ runner.os }}-composer-${{ matrix.php }}-
- name: 📦 Install Dependencies
run: |
composer config --global allow-plugins true
composer install --no-interaction --prefer-dist --optimize-autoloader
- name: 🧹 Run PHP CS Fixer (Code Style)
run: vendor/bin/php-cs-fixer fix --dry-run --diff
- name: 🔍 Run PHPStan (Static Analysis)
run: vendor/bin/phpstan analyse --no-progress
- name: 🚀 Run PHPLint (Syntax Check)
run: vendor/bin/phplint
prime-test:
needs: static-analysis
runs-on: ubuntu-latest
strategy:
fail-fast: false
fail-fast: true
matrix:
symfony: [5.2.*, 5.1.*, 5.0.*, 4.4.*, 4.3.*, 4.2.*, 4.1.*, 4.0.*, 3.4.*, 3.3.*, 3.2.*, 3.1.*, 3.0.*, 2.8.*, 2.7.*]
include:
- { php: 8.4, phpunit: 10.5.* }
- { php: 8.3, phpunit: 10.5.* }
- { php: 8.2, phpunit: 10.5.* }
- symfony: 5.2.*
php: 7.2
phpunit: 8.3.*
name: php v${{ matrix.php }}
- symfony: 5.1.*
php: 7.2
phpunit: 8.3.*
- symfony: 5.0.*
php: 7.2
phpunit: 8.3.*
- symfony: 4.4.*
php: 7.1
phpunit: 7.0.*
- symfony: 4.3.*
php: 7.1
phpunit: 7.0.*
- symfony: 4.2.*
php: 7.1
phpunit: 7.0.*
- symfony: 4.1.*
php: 7.1
phpunit: 7.0.*
- symfony: 4.0.*
php: 7.1
phpunit: 7.0.*
- symfony: 3.4.*
php: 5.5
phpunit: 4.8.36
- symfony: 3.3.*
php: 5.5
phpunit: 4.8.36
- symfony: 3.2.*
php: 5.5
phpunit: 4.8.36
- symfony: 3.1.*
php: 5.5
phpunit: 4.8.36
- symfony: 3.0.*
php: 5.5
phpunit: 4.8.36
- symfony: 2.8.*
php: 5.3
phpunit: 4.8.36
- symfony: 2.7.*
php: 5.3
phpunit: 4.8.36
name: S${{ matrix.symfony }} - P${{ matrix.php }}
steps:
- name: 📥 Checkout code
uses: actions/checkout@v4
- name: Checkout code
uses: actions/checkout@v1
- name: 🔧 Setup PHP
- name: Cache dependencies
uses: actions/cache@v1
with:
path: ~/.composer/cache/files
key: dependencies-symfony-${{ matrix.symfony }}-php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }}
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick
coverage: none
- name: 🚚 Cache dependencies
uses: actions/cache@v4
with:
path: ~/.composer/cache
key: ${{ runner.os }}-composer-${{ matrix.php }}-${{ hashFiles('composer.json') }}
restore-keys: ${{ runner.os }}-composer-${{ matrix.php }}-
- name: 📦 Install dependencies
- name: Install dependencies
run: |
sed -i '/"require": {/,/},/d; /"require-dev": {/,/},/d' composer.json
composer config --global allow-plugins true
composer require "phpunit/phpunit:${{ matrix.phpunit }}" "mockery/mockery" "psr/container" --no-interaction --no-update
composer update --prefer-lowest -W --no-interaction --prefer-dist --optimize-autoloader
- name: ✅ Execute tests
run: vendor/bin/phpunit --testsuite prime
symfony-test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- { symfony: 7.2.*, php: 8.4, phpunit: 10.5.* }
- { symfony: 7.2.*, php: 8.3, phpunit: 10.5.* }
- { symfony: 7.2.*, php: 8.2, phpunit: 10.5.* }
- { symfony: 7.1.*, php: 8.2, phpunit: 10.5.* }
- { symfony: 7.0.*, php: 8.2, phpunit: 10.5.* }
name: symfony v${{ matrix.symfony }} x php v${{ matrix.php }}
steps:
- name: 📥 Checkout code
uses: actions/checkout@v4
- name: 🔧 Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
- name: 🚚 Cache dependencies
uses: actions/cache@v4
with:
path: ~/.composer/cache
key: ${{ runner.os }}-composer-${{ matrix.php }}-${{ hashFiles('composer.json') }}
restore-keys: ${{ runner.os }}-composer-${{ matrix.php }}-
- name: 📦 Install dependencies
run: |
sed -i '/"require": {/,/},/d; /"require-dev": {/,/},/d' composer.json
composer config --global allow-plugins true
composer require "symfony/symfony:${{ matrix.symfony }}" "phpunit/phpunit:${{ matrix.phpunit }}" --no-interaction --no-update
composer config extra.symfony.require "${{ matrix.symfony }}"
composer require "symfony/config:${{ matrix.symfony }}" "symfony/console:${{ matrix.symfony }}" "symfony/dependency-injection:${{ matrix.symfony }}" "symfony/framework-bundle:${{ matrix.symfony }}" "symfony/http-kernel:${{ matrix.symfony }}" "symfony/translation:${{ matrix.symfony }}" "symfony/twig-bundle:${{ matrix.symfony }}" "phpunit/phpunit:${{ matrix.phpunit }}" "mockery/mockery" "psr/container" "monolog/monolog" --no-interaction --no-update
composer update --prefer-lowest -W --no-interaction --prefer-dist --optimize-autoloader
composer update --prefer-dist --no-interaction --no-suggest
- name: Execute tests
run: vendor/bin/phpunit --testsuite symfony
laravel-test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- { laravel: 12.*, testbench: 10.*, php: 8.4, phpunit: 11.5.* }
- { laravel: 12.*, testbench: 10.*, php: 8.3, phpunit: 11.5.* }
- { laravel: 12.*, testbench: 10.*, php: 8.2, phpunit: 11.5.* }
- { laravel: 11.*, testbench: 9.*, php: 8.2, phpunit: 10.5.* }
name: laravel v${{ matrix.laravel }} x php v${{ matrix.php }}
steps:
- name: 📥 Checkout code
uses: actions/checkout@v4
- name: 🔧 Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: fileinfo
coverage: none
- name: 🚚 Cache dependencies
uses: actions/cache@v4
with:
path: ~/.composer/cache
key: ${{ matrix.php }}-composer-${{ hashFiles('composer.json') }}
restore-keys: ${{ matrix.php }}-composer
- name: 📦 Install dependencies
run: |
sed -i '/\"require\": {/,/},/d; /\"require-dev\": {/,/},/d' composer.json
composer config --global allow-plugins true
composer require "laravel/framework:${{ matrix.laravel }}" "phpunit/phpunit:${{ matrix.phpunit }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update
composer update --prefer-lowest -W --no-interaction --prefer-dist --optimize-autoloader
- name: ✅ Execute tests
run: vendor/bin/phpunit --testsuite laravel
- name: Execute tests
run: vendor/bin/phpunit
+5 -19
View File
@@ -1,19 +1,5 @@
/.idea/
/.DS_Store
/vendor/
/node_modules/
/.cache/php-cs-fixer/
/.cache/phplint/
/.cache/phpstan/
/.cache/phpunit/
/.php-cs-fixer.php
/phpunit.xml
/taskfile.yml
/phpstan.neon
/npm-debug.log
/tests/Symfony/Fixtures/project/public/vendor/
.idea
vendor
composer.lock
.phpunit.result.cache
.phpcs-cache
-7
View File
@@ -1,7 +0,0 @@
{
"upgrade": true,
"target": "semver",
"format": "group",
"color": true,
"root": true
}
-1
View File
@@ -1 +0,0 @@
23.0.0
-40
View File
@@ -1,40 +0,0 @@
<?php
declare(strict_types=1);
use PhpCsFixer\Config;
use PhpCsFixer\Finder;
use PhpCsFixer\Runner\Parallel\ParallelConfigFactory;
$finder = Finder::create()
->in([
__DIR__.'/src',
__DIR__.'/tests',
__DIR__.'/phpstorm',
])
->append([__FILE__])
;
return (new Config())
->setParallelConfig(ParallelConfigFactory::detect())
->setRiskyAllowed(true)
->setRules([
'@PSR12' => true,
'declare_strict_types' => true,
'@PHP71Migration' => true,
'@PHPUnit75Migration:risky' => true,
'@Symfony' => true,
'@Symfony:risky' => true,
'protected_to_private' => false,
'native_constant_invocation' => ['strict' => false],
'no_superfluous_phpdoc_tags' => [
'remove_inheritdoc' => true,
'allow_unused_params' => true, // for future-ready params, to be replaced with https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7377
],
'modernize_strpos' => true,
'get_class_to_class_keyword' => true,
'nullable_type_declaration' => true,
'trailing_comma_in_multiline' => ['elements' => ['arrays', 'match', 'parameters']],
])
->setFinder($finder)
->setCacheFile('.cache/php-cs-fixer/cache.json');
-1
View File
@@ -1 +0,0 @@
8.2
+625
View File
@@ -0,0 +1,625 @@
<?xml version="1.0" encoding="UTF-8"?>
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/squizlabs/PHP_CodeSniffer/master/phpcs.xsd"
>
<arg name="basepath" value="."/>
<arg name="extensions" value="php"/>
<arg name="parallel" value="80"/>
<arg name="cache" value=".phpcs-cache"/>
<arg name="colors"/>
<!-- Ignore warnings, show progress of the run and show sniff names -->
<arg value="nps"/>
<!-- Directories to be checked -->
<file>src</file>
<file>tests</file>
<!-- Import PSR-12 coding standard (base) -->
<rule ref="PSR12"/>
<!-- Force array element indentation with 4 spaces -->
<rule ref="Generic.Arrays.ArrayIndent"/>
<!-- Forbid `[...]` -->
<rule ref="Generic.Arrays.DisallowShortArraySyntax"/>
<!-- Forbid duplicate classes -->
<rule ref="Generic.Classes.DuplicateClassName"/>
<!-- Forbid empty statements -->
<rule ref="Generic.CodeAnalysis.EmptyStatement">
<!-- But allow empty catch -->
<exclude name="Generic.CodeAnalysis.EmptyStatement.DetectedCatch"/>
</rule>
<!-- Forbid final methods in final classes -->
<rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
<!-- Forbid useless empty method overrides -->
<rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>
<!-- Align corresponding assignment statement tokens -->
<rule ref="Generic.Formatting.MultipleStatementAlignment">
<properties>
<property name="error" value="true"/>
</properties>
</rule>
<!-- Force whitespace after a type cast -->
<rule ref="Generic.Formatting.SpaceAfterCast">
<properties>
<property name="spacing" value="0"/>
</properties>
</rule>
<!-- Force whitespace after `!` -->
<!-- <rule ref="Generic.Formatting.SpaceAfterNot"/> -->
<!-- Forbid PHP 4 constructors -->
<rule ref="Generic.NamingConventions.ConstructorName"/>
<!-- Forbid any content before opening tag -->
<rule ref="Generic.PHP.CharacterBeforePHPOpeningTag"/>
<!-- Forbid deprecated functions -->
<rule ref="Generic.PHP.DeprecatedFunctions"/>
<!-- Forbid alias functions, i.e. `sizeof()`, `delete()` -->
<rule ref="Generic.PHP.ForbiddenFunctions">
<properties>
<property name="forbiddenFunctions" type="array">
<element key="chop" value="rtrim"/>
<element key="close" value="closedir"/>
<element key="compact" value="null"/>
<element key="delete" value="unset"/>
<element key="doubleval" value="floatval"/>
<element key="extract" value="null"/>
<element key="fputs" value="fwrite"/>
<element key="ini_alter" value="ini_set"/>
<element key="is_double" value="is_float"/>
<element key="is_integer" value="is_int"/>
<element key="is_long" value="is_int"/>
<element key="is_null" value="null"/>
<element key="is_real" value="is_float"/>
<element key="is_writeable" value="is_writable"/>
<element key="join" value="implode"/>
<element key="key_exists" value="array_key_exists"/>
<element key="pos" value="current"/>
<element key="settype" value="null"/>
<element key="show_source" value="highlight_file"/>
<element key="sizeof" value="count"/>
<element key="strchr" value="strstr"/>
<element key="user_error" value="trigger_error"/>
</property>
</properties>
</rule>
<!-- Forbid useless inline string concatenation -->
<rule ref="Generic.Strings.UnnecessaryStringConcat">
<!-- But multiline is useful for readability -->
<properties>
<property name="allowMultiline" value="true"/>
</properties>
</rule>
<!-- Forbid backtick operator -->
<rule ref="Generic.PHP.BacktickOperator"/>
<!-- Force PHP 7 param and return types to be lowercased -->
<rule ref="Generic.PHP.LowerCaseType"/>
<!-- Forbid `php_sapi_name()` function -->
<rule ref="Generic.PHP.SAPIUsage"/>
<!-- Forbid comments starting with # -->
<rule ref="PEAR.Commenting.InlineComment"/>
<!-- Disallow else if in favor of elseif -->
<rule ref="PSR2.ControlStructures.ElseIfDeclaration.NotAllowed">
<type>error</type>
</rule>
<!-- Require that single line arrays have the correct spacing: no space around brackets and one space after comma -->
<rule ref="SlevomatCodingStandard.Arrays.SingleLineArrayWhitespace"/>
<!-- Require comma after last element in multi-line array -->
<rule ref="SlevomatCodingStandard.Arrays.TrailingArrayComma"/>
<!-- Require presence of constant visibility -->
<!-- <rule ref="SlevomatCodingStandard.Classes.ClassConstantVisibility">
<properties>
<property name="fixable" value="true"/>
</properties>
</rule> -->
<!-- Forbid LSB for constants (static::FOO) -->
<rule ref="SlevomatCodingStandard.Classes.DisallowLateStaticBindingForConstants"/>
<!-- Forbid more than one constant declared per statement -->
<rule ref="SlevomatCodingStandard.Classes.DisallowMultiConstantDefinition"/>
<!-- Forbid empty lines around type declarations -->
<rule ref="SlevomatCodingStandard.Classes.EmptyLinesAroundClassBraces">
<properties>
<property name="linesCountAfterOpeningBrace" value="0"/>
<property name="linesCountBeforeClosingBrace" value="0"/>
</properties>
</rule>
<!-- Require usage of ::class instead of __CLASS__, get_class(), get_class($this), get_called_class() and get_parent_class() -->
<!-- <rule ref="SlevomatCodingStandard.Classes.ModernClassNameReference"/> -->
<!-- Forbid uses of multiple traits separated by comma -->
<rule ref="SlevomatCodingStandard.Classes.TraitUseDeclaration"/>
<!-- Require no spaces before trait use, between trait uses and one space after trait uses -->
<rule ref="SlevomatCodingStandard.Classes.TraitUseSpacing">
<properties>
<property name="linesCountAfterLastUse" value="1"/>
<property name="linesCountAfterLastUseWhenLastInClass" value="0"/>
<property name="linesCountBeforeFirstUse" value="0"/>
<property name="linesCountBetweenUses" value="0"/>
</properties>
</rule>
<!-- Forbid dead code -->
<rule ref="SlevomatCodingStandard.Classes.UnusedPrivateElements"/>
<!-- Forbid useless annotations - Git and LICENCE file provide more accurate information -->
<rule ref="SlevomatCodingStandard.Commenting.ForbiddenAnnotations">
<properties>
<property name="forbiddenAnnotations" type="array">
<element value="@api"/>
<element value="@author"/>
<element value="@category"/>
<element value="@copyright"/>
<element value="@created"/>
<element value="@license"/>
<element value="@package"/>
<element value="@since"/>
<element value="@subpackage"/>
<element value="@version"/>
</property>
</properties>
</rule>
<!-- Forbid empty comments -->
<rule ref="SlevomatCodingStandard.Commenting.EmptyComment"/>
<!-- Forbid useless comments -->
<rule ref="SlevomatCodingStandard.Commenting.ForbiddenComments">
<properties>
<property name="forbiddenCommentPatterns" type="array">
<element value="~^(?:(?!private|protected|static)\S+ )?(?:con|de)structor\.\z~i"/>
<element value="~^Created by .+\.\z~i"/>
<element value="~^(User|Date|Time): \S+\z~i"/>
<element value="~^\S+ [gs]etter\.\z~i"/>
<element value="~^(Class|Interface|Trait) \S+\z~i"/>
</property>
</properties>
</rule>
<!-- Require specific order of phpDoc annotations with empty newline between specific groups -->
<rule ref="SlevomatCodingStandard.Commenting.DocCommentSpacing">
<properties>
<property name="linesCountBeforeFirstContent" value="0"/>
<property name="linesCountAfterLastContent" value="0"/>
<property name="linesCountBetweenDescriptionAndAnnotations" value="1"/>
<property name="linesCountBetweenAnnotationsGroups" value="1"/>
<property name="annotationsGroups" type="array">
<element value="
@internal,
@deprecated,
"/>
<element value="
@link,
@see,
@uses,
"/>
<element value="@var"/>
<element value="@ORM\"/>
<element value="@param"/>
<element value="@return"/>
<element value="@throws"/>
</property>
</properties>
</rule>
<!-- Report invalid format of inline phpDocs with @var -->
<rule ref="SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration"/>
<!-- Require comments with single line written as one-liners -->
<!-- <rule ref="SlevomatCodingStandard.Commenting.RequireOneLinePropertyDocComment"/> -->
<!-- Forbid assignments in conditions -->
<rule ref="SlevomatCodingStandard.ControlStructures.AssignmentInCondition"/>
<!-- Require consistent spacing for block structures -->
<rule ref="SlevomatCodingStandard.ControlStructures.BlockControlStructureSpacing">
<exclude name="SlevomatCodingStandard.ControlStructures.BlockControlStructureSpacing.IncorrectLinesCountBeforeControlStructure" />
<exclude name="SlevomatCodingStandard.ControlStructures.BlockControlStructureSpacing.IncorrectLinesCountBeforeFirstControlStructure" />
<properties>
<property name="tokensToCheck" type="array">
<element value="T_IF" />
<element value="T_DO" />
<element value="T_WHILE" />
<element value="T_FOR" />
<element value="T_FOREACH" />
<element value="T_SWITCH" />
<element value="T_TRY" />
<element value="T_DEFAULT" />
</property>
</properties>
</rule>
<!-- Forbid fancy yoda conditions -->
<!-- <rule ref="SlevomatCodingStandard.ControlStructures.DisallowYodaComparison"/> -->
<!-- Require usage of early exit -->
<rule ref="SlevomatCodingStandard.ControlStructures.EarlyExit"/>
<!-- Require consistent spacing for jump statements -->
<rule ref="SlevomatCodingStandard.ControlStructures.JumpStatementsSpacing">
<properties>
<property name="linesCountBeforeWhenFirstInCaseOrDefault" value="0"/>
<property name="linesCountAfterWhenLastInCaseOrDefault" value="1"/>
<property name="linesCountAfterWhenLastInLastCaseOrDefault" value="0"/>
<property name="tokensToCheck" type="array">
<element value="T_RETURN" />
<element value="T_THROW" />
<element value="T_YIELD" />
<element value="T_YIELD_FROM" />
</property>
</properties>
</rule>
<!-- Require language constructs without parentheses -->
<rule ref="SlevomatCodingStandard.ControlStructures.LanguageConstructWithParentheses"/>
<!-- Require usage of null coalesce operator equal operator when possible -->
<!-- <rule ref="SlevomatCodingStandard.ControlStructures.RequireNullCoalesceEqualOperator"/> -->
<!-- Require usage of null coalesce operator when possible -->
<!-- <rule ref="SlevomatCodingStandard.ControlStructures.RequireNullCoalesceOperator"/> -->
<!-- Forbid usage of conditions when a simple return can be used -->
<rule ref="SlevomatCodingStandard.ControlStructures.UselessIfConditionWithReturn"/>
<!-- Forbid usage of boolean-only ternary operator usage (e.g. $foo ? true : false) -->
<rule ref="SlevomatCodingStandard.ControlStructures.UselessTernaryOperator"/>
<!-- Forbid useless unreachable catch blocks -->
<rule ref="SlevomatCodingStandard.Exceptions.DeadCatch"/>
<!-- Require using Throwable instead of Exception -->
<rule ref="SlevomatCodingStandard.Exceptions.ReferenceThrowableOnly"/>
<!-- Ensure Arrow Functions declaration format -->
<rule ref="SlevomatCodingStandard.Functions.ArrowFunctionDeclaration">
<properties>
<property name="spacesCountAfterKeyword" value="1"/>
<property name="spacesCountBeforeArrow" value="1"/>
<property name="spacesCountAfterArrow" value="1"/>
</properties>
</rule>
<!-- Require closures not referencing $this be static -->
<rule ref="SlevomatCodingStandard.Functions.StaticClosure"/>
<!-- Forbid unused variables passed to closures via `use` -->
<rule ref="SlevomatCodingStandard.Functions.UnusedInheritedVariablePassedToClosure"/>
<!-- Require presence of declare(strict_types=1) -->
<!-- <rule ref="SlevomatCodingStandard.TypeHints.DeclareStrictTypes">
<properties>
<property name="newlinesCountBetweenOpenTagAndDeclare" value="2"/>
<property name="spacesCountAroundEqualsSign" value="0"/>
<property name="newlinesCountAfterDeclare" value="2"/>
</properties>
</rule> -->
<!-- Require consistent spacing for block structures -->
<rule ref="SlevomatCodingStandard.ControlStructures.BlockControlStructureSpacing"/>
<!-- Forbid unused use statements -->
<rule ref="SlevomatCodingStandard.Namespaces.UnusedUses">
<properties>
<property name="searchAnnotations" value="true"/>
</properties>
</rule>
<!-- Require use statements to be alphabetically sorted -->
<rule ref="SlevomatCodingStandard.Namespaces.AlphabeticallySortedUses"/>
<!-- Forbid fancy group uses -->
<rule ref="SlevomatCodingStandard.Namespaces.DisallowGroupUse"/>
<!-- Forbid multiple use statements on same line -->
<rule ref="SlevomatCodingStandard.Namespaces.MultipleUsesPerLine"/>
<!-- Require newlines around namespace declaration -->
<rule ref="SlevomatCodingStandard.Namespaces.NamespaceSpacing"/>
<!-- Forbid using absolute class name references -->
<!-- <rule ref="SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly"/> -->
<!-- Forbid superfluous leading backslash in use statements -->
<rule ref="SlevomatCodingStandard.Namespaces.UseDoesNotStartWithBackslash"/>
<!-- Forbid useless uses of the same namespace -->
<rule ref="SlevomatCodingStandard.Namespaces.UseFromSameNamespace"/>
<!-- Require empty newlines before and after uses -->
<rule ref="SlevomatCodingStandard.Namespaces.UseSpacing">
<properties>
<property name="linesCountAfterLastUse" value="1"/>
<property name="linesCountBeforeFirstUse" value="1"/>
<property name="linesCountBetweenUseTypes" value="1"/>
</properties>
</rule>
<!-- Forbid useless alias for classes, constants and functions -->
<rule ref="SlevomatCodingStandard.Namespaces.UselessAlias"/>
<!-- Forbid weak comparisons -->
<rule ref="SlevomatCodingStandard.Operators.DisallowEqualOperators"/>
<!-- Forbid spacing before the negative operator `-` -->
<rule ref="SlevomatCodingStandard.Operators.NegationOperatorSpacing"/>
<!-- Require the usage of assignment operators, eg `+=`, `.=` when possible -->
<rule ref="SlevomatCodingStandard.Operators.RequireCombinedAssignmentOperator"/>
<!-- Require no spacing after spread operator -->
<rule ref="SlevomatCodingStandard.Operators.SpreadOperatorSpacing"/>
<!-- Forbid `list(...)` syntax -->
<!-- <rule ref="SlevomatCodingStandard.PHP.ShortList"/> -->
<!-- Forbid use of longhand cast operators -->
<rule ref="SlevomatCodingStandard.PHP.TypeCast"/>
<!-- Forbid useless parentheses -->
<rule ref="SlevomatCodingStandard.PHP.UselessParentheses"/>
<!-- Forbid useless semicolon `;` -->
<rule ref="SlevomatCodingStandard.PHP.UselessSemicolon"/>
<!-- Require use of short versions of scalar types (i.e. int instead of integer) -->
<rule ref="SlevomatCodingStandard.TypeHints.LongTypeHints"/>
<!-- Require the `null` type hint to be in the last position of annotations -->
<rule ref="SlevomatCodingStandard.TypeHints.NullTypeHintOnLastPosition"/>
<!-- Require ? when default value is null -->
<!-- <rule ref="SlevomatCodingStandard.TypeHints.NullableTypeForNullDefaultValue"/> -->
<!-- Require one space between typehint and variable, require no space between nullability sign and typehint -->
<rule ref="SlevomatCodingStandard.TypeHints.ParameterTypeHintSpacing"/>
<!-- Require space around colon in return types -->
<rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHintSpacing">
<properties>
<property name="spacesCountBeforeColon" value="0"/>
</properties>
</rule>
<!-- Forbid useless @var for constants -->
<rule ref="SlevomatCodingStandard.TypeHints.UselessConstantTypeHint"/>
<!-- Forbid useless inherit doc comment -->
<rule ref="SlevomatCodingStandard.Commenting.UselessInheritDocComment"/>
<!-- Forbid duplicated variables assignments -->
<rule ref="SlevomatCodingStandard.Variables.DuplicateAssignmentToVariable"/>
<!-- Forbid useless variables -->
<rule ref="SlevomatCodingStandard.Variables.UselessVariable"/>
<!-- Forbid spaces around square brackets -->
<rule ref="Squiz.Arrays.ArrayBracketSpacing"/>
<!-- Forbid class being in a file with different name -->
<rule ref="Squiz.Classes.ClassFileName"/>
<!-- Force `self::` for self-reference, force lower-case self, forbid spaces around `::` -->
<rule ref="Squiz.Classes.SelfMemberReference"/>
<!-- Forbid global functions -->
<rule ref="Squiz.Functions.GlobalFunction"/>
<!-- Force camelCase variables -->
<rule ref="Squiz.NamingConventions.ValidVariableName">
<exclude name="Squiz.NamingConventions.ValidVariableName.PrivateNoUnderscore" />
</rule>
<!-- Force phpDoc alignment -->
<rule ref="Squiz.Commenting.DocCommentAlignment">
<!-- Allow extra spaces after star, i.e. for indented annotations -->
<exclude name="Squiz.Commenting.DocCommentAlignment.SpaceAfterStar"/>
</rule>
<!-- Force array declaration structure -->
<rule ref="Squiz.Arrays.ArrayDeclaration">
<!-- Disable arrow alignment -->
<exclude name="Squiz.Arrays.ArrayDeclaration.DoubleArrowNotAligned"/>
<!-- Uses indentation of only single space -->
<exclude name="Squiz.Arrays.ArrayDeclaration.KeyNotAligned"/>
<!-- Allow multiple values on a single line -->
<exclude name="Squiz.Arrays.ArrayDeclaration.SingleLineNotAllowed"/>
<!-- Disable alignment of braces -->
<exclude name="Squiz.Arrays.ArrayDeclaration.CloseBraceNotAligned"/>
<!-- Disable alignment of values with opening brace -->
<exclude name="Squiz.Arrays.ArrayDeclaration.ValueNotAligned"/>
<!-- Checked by SlevomatCodingStandard.Arrays.TrailingArrayComma.MissingTrailingComma -->
<exclude name="Squiz.Arrays.ArrayDeclaration.NoCommaAfterLast"/>
<exclude name="Squiz.Arrays.ArrayDeclaration.NoComma"/>
</rule>
<!-- Force rules for function phpDoc -->
<rule ref="Squiz.Commenting.FunctionComment">
<!-- Allow `@throws` without description -->
<exclude name="Squiz.Commenting.FunctionComment.EmptyThrows"/>
<!-- Does not work properly with PHP 7 / short-named types -->
<exclude name="Squiz.Commenting.FunctionComment.IncorrectParamVarName"/>
<!-- Does not support collections, i.e. `string[]` -->
<exclude name="Squiz.Commenting.FunctionComment.IncorrectTypeHint"/>
<!-- Forces incorrect types -->
<exclude name="Squiz.Commenting.FunctionComment.InvalidReturn"/>
<!-- Breaks with compound return types, i.e. `string|null` -->
<exclude name="Squiz.Commenting.FunctionComment.InvalidReturnNotVoid"/>
<!-- Breaks when all params are not documented -->
<exclude name="Squiz.Commenting.FunctionComment.InvalidTypeHint"/>
<!-- Doc comment is not required for every method -->
<exclude name="Squiz.Commenting.FunctionComment.Missing"/>
<!-- Do not require comments for `@param` -->
<exclude name="Squiz.Commenting.FunctionComment.MissingParamComment"/>
<!-- Do not require `@param` for all parameters -->
<exclude name="Squiz.Commenting.FunctionComment.MissingParamTag"/>
<!-- Do not require `@return` for void methods -->
<exclude name="Squiz.Commenting.FunctionComment.MissingReturn"/>
<!-- Comments don't have to be sentences -->
<exclude name="Squiz.Commenting.FunctionComment.ParamCommentFullFullStop"/>
<!-- Comments don't have to be sentences -->
<exclude name="Squiz.Commenting.FunctionComment.ParamCommentNotCapital"/>
<!-- Breaks when all params are not documented -->
<exclude name="Squiz.Commenting.FunctionComment.ParamNameNoMatch"/>
<!-- Doesn't respect inheritance -->
<exclude name="Squiz.Commenting.FunctionComment.ScalarTypeHintMissing"/>
<!-- `@throws` lines can often be read as a sentence,
i.e. `@throws RuntimeException if the file could not be written.` -->
<exclude name="Squiz.Commenting.FunctionComment.ThrowsNotCapital"/>
<!-- Doesn't work with self as typehint -->
<exclude name="Squiz.Commenting.FunctionComment.TypeHintMissing"/>
</rule>
<!-- Forbid `AND` and `OR`, require `&&` and `||` -->
<rule ref="Squiz.Operators.ValidLogicalOperators"/>
<!-- Forbid `global` -->
<rule ref="Squiz.PHP.GlobalKeyword"/>
<!-- Forbid functions inside functions -->
<rule ref="Squiz.PHP.InnerFunctions"/>
<!-- Require PHP function calls in lowercase -->
<rule ref="Squiz.PHP.LowercasePHPFunctions"/>
<!-- Forbid `$this` inside static function -->
<rule ref="Squiz.Scope.StaticThisUsage"/>
<!-- Force whitespace before and after concatenation -->
<!-- <rule ref="Squiz.Strings.ConcatenationSpacing">
<properties>
<property name="spacing" value="0"/>
<property name="ignoreNewlines" value="true"/>
</properties>
</rule> -->
<!-- Forbid dead code -->
<rule ref="Squiz.PHP.NonExecutableCode"/>
<!-- Forbid strings in `"` unless necessary -->
<rule ref="Squiz.Strings.DoubleQuoteUsage"/>
<rule ref="Squiz.Strings.DoubleQuoteUsage.ContainsVar">
<message>Variable "%s" not allowed in double quoted string; use sprintf() or concatenation instead</message>
</rule>
<!-- Forbid braces around string in `echo` -->
<rule ref="Squiz.Strings.EchoedStrings"/>
<!-- Forbid spaces in type casts -->
<rule ref="Squiz.WhiteSpace.CastSpacing"/>
<!-- Forbid blank line after function opening brace -->
<rule ref="Squiz.WhiteSpace.FunctionOpeningBraceSpace"/>
<!-- Require 1 line before and after function, except at the top and bottom -->
<rule ref="Squiz.WhiteSpace.FunctionSpacing">
<properties>
<property name="spacing" value="1" />
<property name="spacingBeforeFirst" value="0"/>
<property name="spacingAfterLast" value="0"/>
</properties>
</rule>
<!-- Require there be no space between increment/decrement operator and its operand -->
<rule ref="Generic.WhiteSpace.IncrementDecrementSpacing"/>
<!-- Require space after language constructs -->
<rule ref="Squiz.WhiteSpace.LanguageConstructSpacing"/>
<!-- Require space around logical operators -->
<rule ref="Squiz.WhiteSpace.LogicalOperatorSpacing"/>
<!-- Forbid spaces around `->` operator -->
<rule ref="Squiz.WhiteSpace.ObjectOperatorSpacing">
<properties>
<property name="ignoreNewlines" value="true"/>
</properties>
</rule>
<!-- Forbid spaces before semicolon `;` -->
<rule ref="Squiz.WhiteSpace.SemicolonSpacing"/>
<!-- Forbid superfluous whitespaces -->
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace">
<properties>
<!-- turned on by PSR2 -> turning back off -->
<property name="ignoreBlankLines" value="false"/>
</properties>
</rule>
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.EmptyLines">
<!-- turned off by PSR2 -> turning back on -->
<severity>5</severity>
</rule>
<!-- Checks that class/trait/interface members are in the correct order. -->
<rule ref="SlevomatCodingStandard.Classes.ClassStructure"/>
<!-- Disallows use of continue without integer operand in switch because it emits a warning in PHP 7.3 and higher. -->
<rule ref="SlevomatCodingStandard.ControlStructures.DisallowContinueWithoutIntegerOperandInSwitch"/>
<!-- Enforces reasonable end bracket placement for multiline arrays. -->
<rule ref="SlevomatCodingStandard.Arrays.MultiLineArrayEndBracketPlacement"/>
<!-- Checks that there is a certain number of blank lines between properties. -->
<rule ref="SlevomatCodingStandard.Classes.PropertySpacing"/>
<!-- Require consistent spacing for jump statements -->
<rule ref="SlevomatCodingStandard.ControlStructures.JumpStatementsSpacing">
<properties>
<property name="tokensToCheck" type="array">
<element value="T_RETURN" />
<element value="T_THROW" />
<element value="T_YIELD" />
<element value="T_YIELD_FROM" />
</property>
</properties>
</rule>
<!-- Require consistent spacing for block structures -->
<rule ref="SlevomatCodingStandard.ControlStructures.BlockControlStructureSpacing">
<exclude name="SlevomatCodingStandard.ControlStructures.BlockControlStructureSpacing.IncorrectLinesCountBeforeControlStructure" />
<exclude name="SlevomatCodingStandard.ControlStructures.BlockControlStructureSpacing.IncorrectLinesCountBeforeFirstControlStructure" />
<properties>
<property name="tokensToCheck" type="array">
<element value="T_IF" />
<element value="T_DO" />
<element value="T_WHILE" />
<element value="T_FOR" />
<element value="T_FOREACH" />
<element value="T_SWITCH" />
<element value="T_TRY" />
<element value="T_DEFAULT" />
</property>
</properties>
</rule>
<!-- Requires new with parentheses. -->
<rule ref="SlevomatCodingStandard.ControlStructures.NewWithParentheses"/>
<!-- Disallows usage of array type hint syntax (eg. int[], bool[][]) in phpDocs in favour of generic type hint syntax (eg. array<int>, array<array<bool>>) -->
<!-- <rule ref="SlevomatCodingStandard.TypeHints.DisallowArrayTypeHintSyntax" />-->
</ruleset>
-12
View File
@@ -1,12 +0,0 @@
exclude:
- vendor/
- demo/
- docs/
- node_modules/
jobs: 10
extensions:
- php
cache: .cache/phplint/
+3
View File
@@ -0,0 +1,3 @@
<?php
namespace PHPSTORM_META;
-3
View File
@@ -1,3 +0,0 @@
**/node_modules
src/**/Resources/public/**
src/**/Resources/dist/**
-46
View File
@@ -1,46 +0,0 @@
{
"semi": true,
"trailingComma": "all",
"singleQuote": true,
"printWidth": 100,
"tabWidth": 4,
"arrowParens": "avoid",
"jsxBracketSameLine": true,
"overrides": [
{
"files": "*.scss",
"options": {
"parser": "scss",
"singleQuote": false,
"tabWidth": 4
}
},
{
"files": "*.json",
"options": {
"parser": "json",
"singleQuote": false,
"tabWidth": 4
}
},
{
"files": "*.{ts,tsx}",
"options": {
"parser": "typescript"
}
},
{
"files": "*.{js,jsx}",
"options": {
"parser": "babel"
}
},
{
"files": "*.yaml",
"options": {
"parser": "yaml",
"tabWidth": 4
}
}
]
}
-1
View File
@@ -1 +0,0 @@
github: yoeunes
-8
View File
@@ -1,8 +0,0 @@
Please do not submit any Pull Requests here. They will be closed.
---
Please submit your PR here instead:
https://github.com/php-flasher/php-flasher
This repository is what we call a "subtree split": a read-only subset of that main repository.
We're looking forward to your PR there!
-20
View File
@@ -1,20 +0,0 @@
name: Close Pull Request
on:
pull_request_target:
types: [opened]
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: superbrothers/close-pull-request@v3
with:
comment: |
Thanks for your Pull Request! We love contributions.
However, you should instead open your PR on the main repository:
https://github.com/php-flasher/php-flasher
This repository is what we call a "subtree split": a read-only subset of that main repository.
We're looking forward to your PR there!
-3
View File
@@ -1,3 +0,0 @@
{
"extends": ["stylelint-config-standard-scss", "stylelint-config-recess-order"]
}
-43
View File
@@ -1,43 +0,0 @@
# CHANGELOG for 2.x
## [Unreleased](https://github.com/php-flasher/php-flasher/compare/v2.1.4...2.x)
## [v2.1.3](https://github.com/php-flasher/php-flasher/compare/v2.1.2...v2.1.3) - 2025-01-25
* bug [#208](https://github.com/php-flasher/php-flasher/issues/208) [Flasher] Add GitHub workflow for automatic publishing of assets to NPM. See [PR #211](https://github.com/php-flasher/php-flasher/pull/211) by [ToshY](https://github.com/ToshY)
## [v2.1.2](https://github.com/php-flasher/php-flasher/compare/v2.1.1...v2.1.2) - 2025-01-18
* bug [#208](https://github.com/php-flasher/php-flasher/issues/208) [Flasher] Allow `main_script` to be nullable. See [PR #209](https://github.com/php-flasher/php-flasher/pull/209) by [yoeunes](https://github.com/yoeunes)
## [v2.1.1](https://github.com/php-flasher/php-flasher/compare/v2.1.0...v2.1.1) - 2024-10-20
* feature [Laravel] Add `excluded_paths` option. See [PR #203](https://github.com/php-flasher/php-flasher/pull/203) by [yoeunes](https://github.com/yoeunes)
## [v2.1.0](https://github.com/php-flasher/php-flasher/compare/v2.0.4...v2.1.0) - 2024-10-19
* feature [Flasher] Update laravel and symfony configuration documentation . See [PR #201](https://github.com/php-flasher/php-flasher/pull/201) by [yoeunes](https://github.com/yoeunes)
* feature [Flasher] Improve Type Safety and IDE Support with Enhanced PHPDoc Annotations and Stricter PHPStan Validations. See [PR #200](https://github.com/php-flasher/php-flasher/pull/200) by [yoeunes](https://github.com/yoeunes)
* feature [Symfony] Improve configuration descriptions and add examples. See [PR #199](https://github.com/php-flasher/php-flasher/pull/199) by [yoeunes](https://github.com/yoeunes)
* feature [Symfony] Add Symfony Profiler integration for PHPFlasher. See [PR #198](https://github.com/php-flasher/php-flasher/pull/198) by [yoeunes](https://github.com/yoeunes)
## [v2.0.4](https://github.com/php-flasher/php-flasher/compare/v2.0.3...v2.0.4) - 2024-09-22
* bug [laravel] Changed HttpKernel import from `Illuminate\Foundation\Http\Kernel` to `Illuminate\Contracts\Http\Kernel` to use the contract interface instead of the concrete implementation. See [PR #197](https://github.com/php-flasher/php-flasher/pull/197) by [yoeunes](https://github.com/yoeunes)
## [v2.0.3](https://github.com/php-flasher/php-flasher/compare/v2.0.2...v2.0.3) - 2024-09-21
* remove border from flasher container by [yoeunes](https://github.com/yoeunes)
## [v2.0.2](https://github.com/php-flasher/php-flasher/compare/v2.0.1...v2.0.2) - 2024-09-19
* feature [Flasher] add escapeHtml option for secure HTML escaping in notifications. See [PR #196](https://github.com/php-flasher/php-flasher/pull/196) by [yoeunes](https://github.com/yoeunes)
* feature [Flasher] add Default configuration options. See [PR #183](https://github.com/php-flasher/php-flasher/pull/183) by [AhmedGamal](https://github.com/AhmedGamal)
* feature [Laravel] Refactor middleware to use Symfony's base response class, addressing compatibility issues. See [PR #184](https://github.com/php-flasher/php-flasher/pull/184) by [yoeunes](https://github.com/yoeunes)
## [v2.0.1](https://github.com/php-flasher/php-flasher/compare/v2.0.0...v2.0.1) - 2024-05-23
* bug [#176](https://github.com/php-flasher/php-flasher/issues/176) [Laravel] Correctly disable FlasherMiddleware when `inject_assets` is set to false. See [PR #177](https://github.com/php-flasher/php-flasher/pull/177) by [yoeunes](https://github.com/yoeunes)
* bug [#176](https://github.com/php-flasher/php-flasher/issues/176) [Flasher] Ensure global `timeout` option applies to all requests. See [PR #180](https://github.com/php-flasher/php-flasher/pull/180) by [yoeunes](https://github.com/yoeunes)
* bug [#176](https://github.com/php-flasher/php-flasher/issues/176) [Laravel] Allow disabling of default flash replacement by setting `flash_bag` to false. See [PR #181](https://github.com/php-flasher/php-flasher/pull/181) by [yoeunes](https://github.com/yoeunes)
* bug [#176](https://github.com/php-flasher/php-flasher/issues/176) [Flasher] Ensure `flash_bag` option overrides default values instead of appending. See [PR #182](https://github.com/php-flasher/php-flasher/pull/182) by [yoeunes](https://github.com/yoeunes)
+50
View File
@@ -0,0 +1,50 @@
<?php
namespace Flasher\Toastr\Symfony\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
final class Configuration implements ConfigurationInterface
{
/**
* {@inheritdoc}
*/
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder('flasher_toastr');
if (\method_exists($treeBuilder, 'getRootNode')) {
$rootNode = $treeBuilder->getRootNode();
} else {
// BC layer for symfony/config 4.1 and older
$rootNode = $treeBuilder->root('flasher_toastr');
}
$rootNode
->children()
->arrayNode('scripts')
->prototype('scalar')->end()
->defaultValue(array(
'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js',
'https://cdn.jsdelivr.net/npm/@flasher/flasher-toastr@0.1.3/dist/flasher-toastr.min.js',
))
->end()
->arrayNode('styles')
->prototype('scalar')->end()
->defaultValue(array())
->end()
->arrayNode('options')
->prototype('variable')->end()
->ignoreExtraKeys(false)
->defaultValue(array(
'progressBar' => true,
'timeOut' => 5000,
))
->end()
->end()
;
return $treeBuilder;
}
}
@@ -0,0 +1,25 @@
<?php
namespace Flasher\Toastr\Symfony\DependencyInjection;
use Flasher\Symfony\DependencyInjection\Extension;
use Symfony\Component\Config\FileLocator;
final class FlasherToastrExtension extends Extension
{
/**
* @inheritDoc
*/
protected function getConfigFileLocator()
{
return new FileLocator(__DIR__.'/../Resources/config');
}
/**
* @inheritDoc
*/
protected function getConfigClass()
{
return new Configuration();
}
}
+14
View File
@@ -0,0 +1,14 @@
<?php
namespace Flasher\Toastr\Symfony;
use Flasher\Toastr\Symfony\DependencyInjection\FlasherToastrExtension;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class FlasherToastrSymfonyBundle extends Bundle
{
public function getContainerExtension()
{
return new FlasherToastrExtension();
}
}
-21
View File
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2024 PHPFlasher
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+65 -563
View File
@@ -1,585 +1,87 @@
<div align="center">
<a href="https://github.com/php-flasher/php-flasher/blob/2.x/docs/palestine.md">
<img src="https://raw.githubusercontent.com/php-flasher/art/main/palestine-banner-support.svg" width="800px" alt="Help Palestine"/>
<p align="center"><img width="600" alt="flasher" src="https://user-images.githubusercontent.com/10859693/102468596-03317180-4052-11eb-9df3-44dc6235b238.png"></p>
<h1 align="center">A powerful and flexible flash notifications system for PHP, Laravel, Symfony</h1>
<p align="center">
:eyes: PHP Flasher helps you to add flash notifications to your PHP projects.
This library was developed with the idea that you should be able to add flash notification to your application with ease and with few lines of code.
No application-wide rewrites and no big investments upfront.
</p>
<p align="center">
<a href="https://github.com/php-flasher/flasher">
<img src="https://img.shields.io/badge/source-php--flasher/flasher-blue.svg?style=flat-square">
</a>
<a href="https://github.com/php-flasher/flasher/releases">
<img src="https://img.shields.io/github/tag/php-flasher/flasher.svg">
</a>
<a href="https://github.com/php-flasher/flasher/blob/master/LICENSE">
<img src="https://img.shields.io/badge/license-MIT-brightgreen.svg">
</a>
<a href="https://packagist.org/packages/php-flasher/flasher">
<img src="https://img.shields.io/packagist/dt/php-flasher/flasher.svg">
</a>
<a href="https://packagist.org/packages/php-flasher/flasher">
<img src="https://img.shields.io/packagist/php-v/php-flasher/flasher.svg?style=flat-square">
</a>
<a href="https://opencollective.com/php-flasher">
<img src="https://opencollective.com/php-flasher/tiers/backer/badge.svg?label=backer&color=brightgreen" />
</a>
<a href="https://opencollective.com/php-flasher">
<img src="https://opencollective.com/php-flasher/tiers/sponsor/badge.svg?label=sponsor&color=brightgreen" />
</a>
</div>
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/php-flasher/art/main/php-flasher-logo-dark.png">
<img src="https://raw.githubusercontent.com/php-flasher/art/main/php-flasher-logo.png" alt="PHPFlasher Logo">
</picture>
</p>
<p align="center">
<a href="https://www.linkedin.com/in/younes--ennaji"><img src="https://img.shields.io/badge/author-@yoeunes-blue.svg" alt="Author Badge"></a>
<a href="https://github.com/php-flasher/php-flasher"><img src="https://img.shields.io/badge/source-php--flasher/php--flasher-blue.svg" alt="Source Code Badge"></a>
<a href="https://github.com/php-flasher/php-flasher/releases"><img src="https://img.shields.io/github/tag/php-flasher/flasher.svg" alt="GitHub Release Badge"></a>
<a href="https://github.com/php-flasher/flasher/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-brightgreen.svg" alt="License Badge"></a>
<a href="https://packagist.org/packages/php-flasher/flasher"><img src="https://img.shields.io/packagist/dt/php-flasher/flasher.svg" alt="Packagist Downloads Badge"></a>
<a href="https://github.com/php-flasher/php-flasher"><img src="https://img.shields.io/github/stars/php-flasher/php-flasher.svg" alt="GitHub Stars Badge"></a>
<a href="https://packagist.org/packages/php-flasher/flasher"><img src="https://img.shields.io/packagist/php-v/php-flasher/flasher.svg" alt="Supported PHP Version Badge"></a>
</p>
# Why use PHP Flasher ?
# PHPFlasher: Beautiful Notifications Made Simple
The PHP Flasher project supports many notification libraries : __tailwindcss__, __bootstrap__, __toastr.js__, __sweet alert 2__, __pnotify__, __noty__, and __notyf__
and its highly extendable so you can add your custom notifications.
## 🚀 See It In Action
This library is designed, so you can take full control when creating you notifications :
```php
// In your controller
public function updateProfile(Request $request)
{
// Process form submission
$user = Auth::user();
$user->update($request->validated());
// Show a beautiful notification to the user
flash()->success('Your profile has been updated successfully!');
return redirect()->back();
}
```
> * Display multiple notifications
> * Sort and filter notifications
> * Render notification from JSON object
> * Limit the number of displayed notifications
> * Show notifications from different libraries at the same time
> * Framework angostic with integration for : Symfony and Laravel
> * Support templates
> * Easy migration from similar libraries.
> * Very flexible so you can add you own adapters
> * ...and more
That's it! PHPFlasher will display an elegant success notification to your user. No JavaScript to write, no frontend setup needed.
## 🔄 Compatibility
## Official Documentation
| Requirements | Version |
|--------------|---------|
| PHP | ≥ 8.2 |
| Laravel | ≥ 11.0 |
| Symfony | ≥ 7.0 |
Documentation for PHP Flasher can be found on the [PHP Flasher website](https://php-flasher.github.io/).
## 📑 Table of Contents
## Backers && Sponsors
- [Introduction](#-introduction)
- [Features](#-key-features)
- [Installation](#-installation)
- [Usage Examples](#-usage-examples)
- [Themes](#-themes)
- [Adapters](#-adapters)
- [Advanced Configuration](#-advanced-configuration)
- [Adapter Documentation Example](#-adapter-documentation-example)
- [Community & Support](#-community--support)
- [Contributors](#-contributors-and-sponsors)
- [License](#-license)
Support this project by becoming a sponsor. Your name will show up in the Contribute page of all PHP Flasher installations as well as here with a link to your website!
## 🌟 Introduction
Thank you to all our backers and sponsors! 🙏
PHPFlasher is a powerful, framework-agnostic library that makes it simple to add beautiful flash messages to your web applications. It provides a consistent API for displaying notifications across your PHP applications, whether you're using Laravel, Symfony, or any other PHP framework.
<a href="https://opencollective.com/php-flasher#backers" target="_blank">
<img src="https://opencollective.com/php-flasher/backers.svg?width=890" title="Backers" alt="Backers">
</a>
Flash messages are short-lived notifications that appear after a user performs an action, such as submitting a form. PHPFlasher helps you create these notifications with minimal effort while ensuring they look great and behave consistently.
<a href="https://opencollective.com/php-flasher#sponsors" target="_blank">
<img src="https://opencollective.com/php-flasher/sponsors.svg?width=890" title="Sponsors" alt="Sponsors">
</a>
## ✨ Key Features
### Contact
- **Zero JavaScript Required**: Write only PHP code - frontend functionality is handled automatically
- **Framework Support**: First-class Laravel and Symfony integration
- **Beautiful Themes**: Multiple built-in themes ready to use out of the box
- **Multiple Notification Types**: Success, error, warning, and info notifications
- **Highly Customizable**: Positions, timeouts, animations, and more
- **Third-Party Adapters**: Integration with popular libraries like Toastr, SweetAlert, and more
- **API Response Support**: Works with AJAX and API responses
- **TypeScript Support**: Full TypeScript definitions for frontend customization
- **Lightweight**: Minimal performance impact
PHP Flasher is being actively developed by <a href="https://github.com/yoeunes">yoeunes</a>. You can reach out with questions, bug reports, or feature requests
on any of the following:
## 📦 Installation
### For Laravel Projects
```bash
# Install the Laravel adapter
composer require php-flasher/flasher-laravel
# Set up assets automatically
php artisan flasher:install
```
PHPFlasher automatically injects the necessary JavaScript and CSS assets into your Blade templates. No additional setup required!
### For Symfony Projects
```bash
# Install the Symfony adapter
composer require php-flasher/flasher-symfony
# Set up assets automatically
php bin/console flasher:install
```
PHPFlasher automatically injects the necessary JavaScript and CSS assets into your Twig templates.
## 📚 Usage Examples
### Basic Notifications
```php
// Success notification
flash()->success('Operation completed successfully!');
// Error notification
flash()->error('An error occurred. Please try again.');
// Info notification
flash()->info('Your account will expire in 10 days.');
// Warning notification
flash()->warning('Please backup your data before continuing.');
```
### With Custom Titles
```php
flash()->success('Your changes have been saved!', 'Update Successful');
flash()->error('Unable to connect to the server.', 'Connection Error');
```
### With Custom Options
```php
flash()->success('Profile updated successfully!', [
'timeout' => 10000, // Display for 10 seconds
'position' => 'bottom-right',
'closeButton' => true,
]);
flash()->error('Failed to submit form.', 'Error', [
'timeout' => 0, // No timeout (stay until dismissed)
'position' => 'center',
]);
```
### In Controllers
```php
// Laravel
public function store(Request $request)
{
// Process form...
flash()->success('Product created successfully!');
return redirect()->route('products.index');
}
// Symfony
public function store(Request $request, FlasherInterface $flasher)
{
// Process form...
$flasher->success('Product created successfully!');
return $this->redirectToRoute('products.index');
}
```
### Specific Use Cases
```php
// Form validation errors
if ($validator->fails()) {
flash()->error('Please fix the errors in your form.');
return redirect()->back()->withErrors($validator);
}
// Multi-step process
flash()->success('Step 1 completed!');
flash()->info('Please complete step 2.');
// With HTML content (must enable HTML option)
flash()->success('Your <strong>account</strong> is ready!', [
'escapeHtml' => false
]);
```
## 🎨 Themes
PHPFlasher comes with beautiful built-in themes ready to use immediately:
### Default Theme (Flasher)
The default theme provides clean, elegant notifications that work well in any application:
```php
flash()->success('Operation completed!');
```
### Other Built-In Themes
PHPFlasher includes multiple themes to match your application's design:
```php
// Set the theme in your configuration or per notification
flash()->success('Operation completed!', [
'theme' => 'amazon' // Amazon-inspired theme
]);
// Other available themes:
// - amber: Warm amber styling
// - aurora: Subtle gradient effects
// - crystal: Clean, transparent design
// - emerald: Green-focused modern look
// - facebook: Facebook notification style
// - google: Google Material Design inspired
// - ios: iOS notification style
// - jade: Soft jade color palette
// - material: Material Design implementation
// - minimal: Extremely clean and simple
// - neon: Bright, attention-grabbing
// - onyx: Dark mode sleek design
// - ruby: Bold ruby red accents
// - sapphire: Blue-focused elegant style
// - slack: Slack-inspired notifications
```
### Theme Configuration
You can configure theme defaults in your configuration file:
```php
// Laravel: config/flasher.php
return [
'themes' => [
'flasher' => [
'options' => [
'timeout' => 5000,
'position' => 'top-right',
],
],
'amazon' => [
'options' => [
'timeout' => 3000,
'position' => 'bottom-right',
],
],
],
];
```
## 🧩 Adapters
Beyond PHPFlasher's built-in themes, you can use third-party notification libraries:
### Available Adapters
#### Toastr
```bash
composer require php-flasher/flasher-toastr-laravel # For Laravel
composer require php-flasher/flasher-toastr-symfony # For Symfony
```
```php
flash('toastr')->success('Message with Toastr!');
```
#### SweetAlert
```bash
composer require php-flasher/flasher-sweetalert-laravel # For Laravel
composer require php-flasher/flasher-sweetalert-symfony # For Symfony
```
```php
flash('sweetalert')->success('Message with SweetAlert!');
```
#### Noty
```bash
composer require php-flasher/flasher-noty-laravel # For Laravel
composer require php-flasher/flasher-noty-symfony # For Symfony
```
```php
flash('noty')->success('Message with Noty!');
```
#### Notyf
```bash
composer require php-flasher/flasher-notyf-laravel # For Laravel
composer require php-flasher/flasher-notyf-symfony # For Symfony
```
```php
flash('notyf')->success('Message with Notyf!');
```
## ⚙️ Advanced Configuration
### Laravel Configuration
Publish and customize the configuration:
```bash
php artisan vendor:publish --tag=flasher-config
```
This creates `config/flasher.php` where you can configure:
```php
return [
// Default adapter to use
'default' => 'flasher',
// Theme configuration
'themes' => [
'flasher' => [
'options' => [
'timeout' => 5000,
'position' => 'top-right',
],
],
],
// Auto-convert Laravel session flash messages
'auto_create_from_session' => true,
// Automatically render notifications
'auto_render' => true,
// Type mappings for Laravel notifications
'types_mapping' => [
'success' => 'success',
'error' => 'error',
'warning' => 'warning',
'info' => 'info',
],
];
```
### Symfony Configuration
Create or edit `config/packages/flasher.yaml`:
```yaml
flasher:
default: flasher
themes:
flasher:
options:
timeout: 5000
position: top-right
auto_create_from_session: true
auto_render: true
types_mapping:
success: success
error: error
warning: warning
info: info
```
### Notification Options
Common options you can customize:
```php
flash()->success('Message', [
// Display duration in milliseconds (0 = until dismissed)
'timeout' => 5000,
// Notification position
'position' => 'top-right', // top-right, top-left, bottom-right, bottom-left, top-center, bottom-center
// Display a close button
'closeButton' => true,
// Show progress bar during timeout
'progressBar' => true,
// Right-to-left text direction
'rtl' => false,
// Allow HTML content in notifications
'escapeHtml' => false,
// Custom CSS class
'class' => 'my-custom-notification',
]);
```
## 📘 Adapter Documentation Example
Here's a detailed example of using the Toastr adapter with PHPFlasher:
### Installation
```bash
composer require php-flasher/flasher-toastr
```
For Laravel:
```bash
composer require php-flasher/flasher-toastr-laravel
```
For Symfony:
```bash
composer require php-flasher/flasher-toastr-symfony
```
### Usage
#### Basic Usage
```php
use Flasher\Toastr\Prime\ToastrFactory;
// Inject the factory
public function __construct(private ToastrFactory $toastr)
{
}
public function index()
{
$this->toastr->success('Toastr is working!');
// Or using the global helper with the specified adapter
flash('toastr')->success('Toastr is awesome!');
}
```
#### With Options
```php
flash('toastr')->success('Success message', 'Success Title', [
'timeOut' => 5000,
'closeButton' => true,
'newestOnTop' => true,
'progressBar' => true,
'positionClass' => 'toast-top-right',
]);
```
#### Available Methods
```php
// Standard notification types
flash('toastr')->success('Success message');
flash('toastr')->info('Information message');
flash('toastr')->warning('Warning message');
flash('toastr')->error('Error message');
// Custom notification
flash('toastr')->flash('custom-type', 'Custom message');
```
#### Toastr Specific Options
| Option | Type | Default | Description |
|------------------|---------|----------------|--------------------------------------------|
| closeButton | Boolean | false | Display a close button |
| closeClass | String | 'toast-close-button' | CSS class for close button |
| newestOnTop | Boolean | true | Add notifications to the top of the stack |
| progressBar | Boolean | true | Display progress bar |
| positionClass | String | 'toast-top-right' | Position of the notification |
| preventDuplicates | Boolean | false | Prevent duplicates |
| showDuration | Number | 300 | Show animation duration in ms |
| hideDuration | Number | 1000 | Hide animation duration in ms |
| timeOut | Number | 5000 | Auto-close duration (0 = disable) |
| extendedTimeOut | Number | 1000 | Duration after hover |
| showEasing | String | 'swing' | Show animation easing |
| hideEasing | String | 'linear' | Hide animation easing |
| showMethod | String | 'fadeIn' | Show animation method |
| hideMethod | String | 'fadeOut' | Hide animation method |
### Advanced Configuration
#### Laravel Configuration
Publish the configuration file:
```bash
php artisan vendor:publish --tag=flasher-toastr-config
```
#### Symfony Configuration
Edit your `config/packages/flasher.yaml`:
```yaml
flasher:
toastr:
options:
timeOut: 5000
progressBar: true
```
## Learn More
For additional information, see the [PHPFlasher documentation](https://php-flasher.io).
## 👥 Community & Support
### Getting Help
- **Documentation**: Visit [https://php-flasher.io](https://php-flasher.io)
- **GitHub Issues**: [Report bugs or request features](https://github.com/php-flasher/php-flasher/issues)
- **Stack Overflow**: Ask questions with the `php-flasher` tag
### Common Use Cases
- Form submission feedback
- AJAX request notifications
- Authentication messages
- Error reporting
- Success confirmations
- System alerts
## 🌟 Contributors and Sponsors
Join our team of contributors and make a lasting impact on our project!
We are always looking for passionate individuals who want to contribute their skills and ideas.
Whether you're a developer, designer, or simply have a great idea, we welcome your participation and collaboration.
Shining stars of our community:
<!-- ALL-CONTRIBUTORS-LIST:START -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/younes--ennaji/"><img src="https://avatars.githubusercontent.com/u/10859693?v=4?s=100" width="100px;" alt="Younes ENNAJI"/><br /><sub><b>Younes ENNAJI</b></sub></a><br /><a href="https://github.com/php-flasher/php-flasher/commits?author=yoeunes" title="Code">💻</a> <a href="https://github.com/php-flasher/php-flasher/commits?author=yoeunes" title="Documentation">📖</a> <a href="#maintenance-yoeunes" title="Maintenance">🚧</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/salmayno"><img src="https://avatars.githubusercontent.com/u/27933199?v=4?s=100" width="100px;" alt="Salma Mourad"/><br /><sub><b>Salma Mourad</b></sub></a><br /><a href="#financial-salmayno" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.youtube.com/rstacode"><img src="https://avatars.githubusercontent.com/u/35005761?v=4?s=100" width="100px;" alt="Nashwan Abdullah"/><br /><sub><b>Nashwan Abdullah</b></sub></a><br /><a href="#financial-codenashwan" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://darvis.nl/"><img src="https://avatars.githubusercontent.com/u/7394837?v=4?s=100" width="100px;" alt="Arvid de Jong"/><br /><sub><b>Arvid de Jong</b></sub></a><br /><a href="#financial-darviscommerce" title="Financial">💵</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://ashallendesign.co.uk/"><img src="https://avatars.githubusercontent.com/u/39652331?v=4?s=100" width="100px;" alt="Ash Allen"/><br /><sub><b>Ash Allen</b></sub></a><br /><a href="#design-ash-jc-allen" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://about.me/murrant"><img src="https://avatars.githubusercontent.com/u/39462?v=4?s=100" width="100px;" alt="Tony Murray"/><br /><sub><b>Tony Murray</b></sub></a><br /><a href="https://github.com/php-flasher/php-flasher/commits?author=murrant" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/n3wborn"><img src="https://avatars.githubusercontent.com/u/10246722?v=4?s=100" width="100px;" alt="Stéphane P"/><br /><sub><b>Stéphane P</b></sub></a><br /><a href="https://github.com/php-flasher/php-flasher/commits?author=n3wborn" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://www.instagram.com/lucas.maciel_z"><img src="https://avatars.githubusercontent.com/u/80225404?v=4?s=100" width="100px;" alt="Lucas Maciel"/><br /><sub><b>Lucas Maciel</b></sub></a><br /><a href="#design-LucasStorm" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AhmedGamal"><img src="https://avatars.githubusercontent.com/u/11786167?v=4?s=100" width="100px;" alt="Ahmed Gamal"/><br /><sub><b>Ahmed Gamal</b></sub></a><br /><a href="https://github.com/php-flasher/php-flasher/commits?author=AhmedGamal" title="Code">💻</a> <a href="https://github.com/php-flasher/php-flasher/commits?author=AhmedGamal" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BrookeDot"><img src="https://avatars.githubusercontent.com/u/150348?v=4?s=100" width="100px;" alt="Brooke."/><br /><sub><b>Brooke.</b></sub></a><br /><a href="https://github.com/php-flasher/php-flasher/commits?author=BrookeDot" title="Documentation">📖</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
## 📬 Contact
PHPFlasher is being actively developed by <a href="https://github.com/yoeunes">yoeunes</a>.
You can reach out with questions, bug reports, or feature requests on any of the following:
- [Github Issues](https://github.com/php-flasher/php-flasher/issues)
- [Github Issues](https://github.com/php-flasher/flasher/issues)
- [Github](https://github.com/yoeunes)
- [Twitter](https://twitter.com/yoeunes)
- [Linkedin](https://www.linkedin.com/in/younes--ennaji/)
- [Email me directly](mailto:younes.ennaji.pro@gmail.com)
- [Linkedin](https://www.linkedin.com/in/younes-khoubza/)
- [Email me directly](mailto:younes.khoubza@gmail.com)
## 📝 License
## License
PHPFlasher is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
PHP Flasher is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
<p align="center"> <b>Made with ❤️ by <a href="https://www.linkedin.com/in/younes--ennaji/">Younes ENNAJI</a> </b> </p>
<p align="center">
<a href="https://github.com/php-flasher/php-flasher/stargazers">
⭐ Star if you found this useful ⭐
</a>
</p>
<p align="center"> <b>Made with ❤️ by <a href="https://www.linkedin.com/in/younes-khoubza/">Younes KHOUBZA</a> <b> </p>
+8
View File
@@ -0,0 +1,8 @@
services:
flasher.toastr:
parent: 'flasher.notification_factory'
class: Flasher\Toastr\Prime\ToastrFactory
tags:
- { name: 'flasher.factory', alias: 'toastr' }
Flasher\Toastr\Prime\ToastrFactory: '@flasher.toastr'
@@ -0,0 +1,43 @@
<?php
namespace Flasher\Toastr\Symfony\Tests\DependencyInjection;
use Flasher\Prime\Tests\TestCase;
use Flasher\Toastr\Symfony\DependencyInjection\Configuration;
use Symfony\Component\Config\Definition\Processor;
class ConfigurationTest extends TestCase
{
public function testDefaultConfig()
{
$config = $this->process(array());
$expected = array(
'scripts' => array(
'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js',
'https://cdn.jsdelivr.net/npm/@flasher/flasher-toastr@0.1.3/dist/flasher-toastr.min.js',
),
'styles' => array(),
'options' => array(
'progressBar' => true,
'timeOut' => 5000,
)
);
$this->assertSame($expected, $config);
}
/**
* Processes an array of configurations and returns a compiled version.
*
* @param array $configs An array of raw configurations
*
* @return array A normalized array
*/
private function process($configs)
{
$processor = new Processor();
return $processor->processConfiguration(new Configuration(), $configs);
}
}
@@ -0,0 +1,72 @@
<?php
namespace Flasher\Toastr\Symfony\Tests\DependencyInjection;
use Flasher\Prime\Tests\TestCase;
use Flasher\Symfony\DependencyInjection\FlasherExtension;
use Flasher\Symfony\FlasherSymfonyBundle;
use Flasher\Toastr\Symfony\DependencyInjection\FlasherToastrExtension;
use Flasher\Toastr\Symfony\FlasherToastrSymfonyBundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class FlasherToastrExtensionTest extends TestCase
{
public function testContainerContainFlasherServices()
{
$container = $this->getRawContainer();
$container->loadFromExtension('flasher', array());
$container->loadFromExtension('flasher_toastr', array());
$container->compile();
$this->assertTrue($container->has('flasher.toastr'));
}
public function testCreateInstanceOfToastrAdapter()
{
$container = $this->getRawContainer();
$container->loadFromExtension('flasher');
$container->loadFromExtension('flasher_toastr');
$container->compile();
$flasher = $container->getDefinition('flasher');
$calls = $flasher->getMethodCalls();
$this->assertCount(2, $calls);
$this->assertSame('addFactory', $calls[0][0]);
$this->assertSame('template', $calls[0][1][0]);
$this->assertSame('flasher.notification_factory', (string) $calls[0][1][1]);
$this->assertSame('addFactory', $calls[1][0]);
$this->assertSame('toastr', $calls[1][1][0]);
$this->assertSame('flasher.toastr', (string) $calls[1][1][1]);
}
private function getRawContainer()
{
$container = new ContainerBuilder();
$container->registerExtension(new FlasherExtension());
$flasherBundle = new FlasherSymfonyBundle();
$flasherBundle->build($container);
$container->registerExtension(new FlasherToastrExtension());
$adapterBundle = new FlasherToastrSymfonyBundle();
$adapterBundle->build($container);
$container->getCompilerPassConfig()->setOptimizationPasses(array());
$container->getCompilerPassConfig()->setRemovingPasses(array());
$container->getCompilerPassConfig()->setAfterRemovingPasses(array());
return $container;
}
private function getContainer()
{
$container = $this->getRawContainer();
$container->loadFromExtension('flasher', array());
$container->loadFromExtension('flasher_toastr', array());
$container->compile();
return $container;
}
}
View File
-675
View File
@@ -1,675 +0,0 @@
#!/usr/bin/env bash
# =========================================================================
# Build System for PHP-Flasher
# =========================================================================
#
# This script provides an elegant build process for PHP-Flasher assets
# with comprehensive reporting and flexible configuration options.
#
# Author: Younes ENNAJI
# =========================================================================
# Strict error handling
set -o pipefail
# =========================================================================
# CONSTANTS AND CONFIGURATION
# =========================================================================
# Colors and styles
readonly RESET='\033[0m'
readonly BOLD='\033[1m'
readonly DIM='\033[2m'
readonly UNDERLINE='\033[4m'
readonly BLUE='\033[34m'
readonly GREEN='\033[32m'
readonly RED='\033[31m'
readonly YELLOW='\033[33m'
readonly CYAN='\033[36m'
readonly MAGENTA='\033[35m'
readonly WHITE='\033[37m'
# Emoji indicators
readonly ROCKET="🚀"
readonly PACKAGE="📦"
readonly CHECK="✓"
readonly ERROR="❌"
readonly WARNING="⚠️"
readonly HAMMER="🏗️"
readonly CHART="📊"
readonly SPARKLES="✨"
readonly HOURGLASS="⏳"
readonly PALETTE="🎨"
# File paths
readonly SRC_DIR="src"
readonly PRIME_PATH="${SRC_DIR}/Prime/Resources"
readonly TEMP_DIR="/tmp/php-flasher-build-$$"
readonly BUILD_LOG="${TEMP_DIR}/build.log"
readonly SIZE_DATA="${TEMP_DIR}/sizes.data"
# Default configuration
VERBOSE=false
WATCH_MODE=false
THEME_ONLY=false
MODULE_ONLY=false
ANALYZE=false
DEEP_ANALYZE=false
SKIP_CLEAR=false
NODE_ENV="production"
# =========================================================================
# UTILITY FUNCTIONS
# =========================================================================
cleanup() {
# Clean up temporary files when the script exits
rm -rf "${TEMP_DIR}" 2>/dev/null
}
trap cleanup EXIT
mkdir -p "${TEMP_DIR}"
print_header() {
echo -e "\n${BOLD}Date : ${RESET}${CYAN}$(date -u '+%Y-%m-%d %H:%M:%S') UTC${RESET}"
echo -e "${BOLD}User : ${RESET}${MAGENTA}$(whoami)${RESET}"
echo -e "${BOLD}Branch : ${RESET}${GREEN}$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")${RESET}"
echo -e "${BOLD}Directory : ${RESET}${BLUE}$(pwd)${RESET}"
if [ "$NODE_ENV" != "production" ]; then
echo -e "${BOLD}Mode : ${RESET}${YELLOW}${NODE_ENV}${RESET}"
fi
if [ "$WATCH_MODE" = true ]; then
echo -e "${BOLD}Watch : ${RESET}${CYAN}enabled${RESET}"
fi
if [ "$THEME_ONLY" = true ]; then
echo -e "${BOLD}Scope : ${RESET}${MAGENTA}themes only${RESET}"
elif [ "$MODULE_ONLY" = true ]; then
echo -e "${BOLD}Scope : ${RESET}${MAGENTA}modules only${RESET}"
fi
echo
}
print_section() {
echo -e "\n${BOLD}${CYAN}┌─ $1 ${2:-}${RESET}"
}
success_msg() {
echo -e "${GREEN}${CHECK} $*${RESET}"
}
error_msg() {
echo -e "${RED}${ERROR} $*${RESET}"
}
warning_msg() {
echo -e "${YELLOW}${WARNING} $*${RESET}"
}
info_msg() {
echo -e "${BLUE}${HOURGLASS} $*${RESET}"
}
print_usage() {
echo -e "${BOLD}Usage:${RESET} $0 [options]"
echo
echo -e "${BOLD}Options:${RESET}"
echo -e " ${GREEN}-h, --help${RESET} Show this help message"
echo -e " ${GREEN}-v, --verbose${RESET} Display detailed build output"
echo -e " ${GREEN}-w, --watch${RESET} Run in watch mode"
echo -e " ${GREEN}-d, --development${RESET} Build in development mode (unminified)"
echo -e " ${GREEN}-t, --themes-only${RESET} Build only themes"
echo -e " ${GREEN}-m, --modules-only${RESET} Build only modules (core and plugins)"
echo -e " ${GREEN}-a, --analyze${RESET} Show detailed size analysis in table format"
echo -e " ${GREEN}-D, --deep-analyze${RESET} Perform deep analysis of files (checksums, content inspection)"
echo -e " ${GREEN}--skip-clear${RESET} Skip clearing output directories"
echo
}
parse_args() {
while [ "$#" -gt 0 ]; do
case "$1" in
-h|--help)
print_usage
exit 0
;;
-v|--verbose)
VERBOSE=true
;;
-w|--watch)
WATCH_MODE=true
NODE_ENV="development"
;;
-d|--development)
NODE_ENV="development"
;;
-t|--themes-only)
THEME_ONLY=true
;;
-m|--modules-only)
MODULE_ONLY=true
;;
-a|--analyze)
ANALYZE=true
;;
-D|--deep-analyze)
ANALYZE=true
DEEP_ANALYZE=true
;;
--skip-clear)
SKIP_CLEAR=true
;;
*)
warning_msg "Unknown option: $1"
print_usage
exit 1
;;
esac
shift
done
# Validate conflicting options
if [ "$THEME_ONLY" = true ] && [ "$MODULE_ONLY" = true ]; then
error_msg "Cannot specify both --themes-only and --modules-only"
exit 1
fi
# Configure build mode
if [ "$WATCH_MODE" = true ]; then
ROLLUP_ARGS="-c -w"
else
ROLLUP_ARGS="-c"
fi
# When analyzing, we turn off verbosity for rollup
if [ "$ANALYZE" = true ]; then
export FILESIZE_SILENT=true
fi
}
# =========================================================================
# BUILD FUNCTIONS
# =========================================================================
get_size_info() {
local file="$1"
# Get precise byte count for more accurate comparison
local bytes=$(wc -c < "$file")
local size=$(du -h "$file" | awk '{print $1}')
local gzip=$(gzip -c "$file" | wc -c | numfmt --to=iec --format="%.1f")
local brotli_size=$(brotli -c "$file" 2>/dev/null | wc -c | numfmt --to=iec --format="%.1f" || echo "N/A")
echo "$size|$gzip|$bytes|$brotli_size"
}
get_file_hash() {
local file="$1"
if command -v sha256sum &> /dev/null; then
sha256sum "$file" | awk '{print $1}'
elif command -v shasum &> /dev/null; then
shasum -a 256 "$file" | awk '{print $1}'
else
echo "HASH_UNAVAILABLE"
fi
}
analyze_file_content() {
local file="$1"
local filename=$(basename "$file")
local dir="${TEMP_DIR}/analysis/$(dirname "$file" | sed 's/\//_/g')"
mkdir -p "$dir"
# Get first 10 lines for a quick look
head -n 10 "$file" > "${dir}/${filename}.head"
# Get hash for exact comparison
local hash=$(get_file_hash "$file")
echo "$hash" > "${dir}/${filename}.hash"
# For CSS/JS, try to determine if it's minified
if [[ "$file" == *.css || "$file" == *.js ]]; then
# Count semicolons to help identify if minified
local semicolons=$(grep -o ";" "$file" | wc -l)
# Count newlines
local newlines=$(grep -c $'\n' "$file")
# Simple heuristic: if few newlines relative to semicolons, likely minified
if [ "$newlines" -lt 10 ] || [ "$semicolons" -gt "$((newlines * 5))" ]; then
echo "MINIFIED:YES semicolons:$semicolons newlines:$newlines" > "${dir}/${filename}.analysis"
else
echo "MINIFIED:NO semicolons:$semicolons newlines:$newlines" > "${dir}/${filename}.analysis"
fi
fi
echo "$hash"
}
collect_build_statistics() {
local modules_count=0
local themes_count=0
declare -a theme_names=()
local unique_css_hashes=0
local unique_js_hashes=0
declare -A css_hashes=()
declare -A js_hashes=()
# Create temporary directory for data
mkdir -p "${TEMP_DIR}/modules"
mkdir -p "${TEMP_DIR}/themes"
mkdir -p "${TEMP_DIR}/analysis"
echo "DEBUG: Looking for modules and themes..." >> "${BUILD_LOG}"
# Check for core flasher module first
if [ -f "${PRIME_PATH}/dist/flasher.min.js" ]; then
local size_info=$(get_size_info "${PRIME_PATH}/dist/flasher.min.js")
local hash="N/A"
if [ "$DEEP_ANALYZE" = true ]; then
hash=$(analyze_file_content "${PRIME_PATH}/dist/flasher.min.js")
js_hashes["$hash"]=1
((unique_js_hashes++))
fi
echo "flasher:$size_info:$hash" >> "${TEMP_DIR}/modules/data"
((modules_count++))
fi
# Collect module statistics - FIXED to avoid subshell issue
# Store filenames to process in a temporary file
find ${SRC_DIR}/*/Prime/Resources/dist -name "*.min.js" | grep -v themes > "${TEMP_DIR}/module_files.txt" 2>/dev/null
# Process each module file
while IFS= read -r file; do
local module=$(basename "$file" .min.js)
local size_info=$(get_size_info "$file")
local hash="N/A"
if [ "$DEEP_ANALYZE" = true ]; then
hash=$(analyze_file_content "$file")
js_hashes["$hash"]=1
((unique_js_hashes++))
fi
echo "$module:$size_info:$hash" >> "${TEMP_DIR}/modules/data"
((modules_count++))
echo "DEBUG: Found module: $module in $file (${size_info})" >> "${BUILD_LOG}"
done < "${TEMP_DIR}/module_files.txt"
# Collect theme statistics - FIXED to avoid subshell issue
if [ -d "${PRIME_PATH}/dist/themes" ]; then
# Store theme files in a temporary file
find ${PRIME_PATH}/dist/themes -name "*.min.js" > "${TEMP_DIR}/theme_files.txt" 2>/dev/null
# Process each theme file
while IFS= read -r file; do
local theme=$(basename "$(dirname "$file")")
local size_info=$(get_size_info "$file")
local js_hash="N/A"
local css_hash="N/A"
# Also get the CSS file size and analyze it
local css_file="${PRIME_PATH}/dist/themes/${theme}/${theme}.min.css"
local css_size_info="N/A"
if [ -f "$css_file" ]; then
css_size_info=$(get_size_info "$css_file")
if [ "$DEEP_ANALYZE" = true ]; then
css_hash=$(analyze_file_content "$css_file")
if [ -z "${css_hashes[$css_hash]}" ]; then
css_hashes["$css_hash"]=1
((unique_css_hashes++))
else
css_hashes["$css_hash"]=$((css_hashes["$css_hash"] + 1))
fi
js_hash=$(analyze_file_content "$file")
if [ -z "${js_hashes[$js_hash]}" ]; then
js_hashes["$js_hash"]=1
else
js_hashes["$js_hash"]=$((js_hashes["$js_hash"] + 1))
fi
fi
echo "DEBUG: Theme $theme JS: $size_info, CSS: $css_size_info" >> "${BUILD_LOG}"
else
echo "DEBUG: No CSS file found for theme $theme" >> "${BUILD_LOG}"
fi
echo "$theme:$size_info:$js_hash:$css_size_info:$css_hash" >> "${TEMP_DIR}/themes/data"
theme_names+=("$theme")
((themes_count++))
done < "${TEMP_DIR}/theme_files.txt"
# Sort theme names alphabetically
if [ ${#theme_names[@]} -gt 0 ]; then
printf "%s\n" "${theme_names[@]}" | sort > "${TEMP_DIR}/theme_names"
fi
fi
# Store counts for summary
echo "$modules_count" > "${TEMP_DIR}/modules_count"
echo "$themes_count" > "${TEMP_DIR}/themes_count"
echo "$unique_js_hashes" > "${TEMP_DIR}/unique_js_hashes"
echo "$unique_css_hashes" > "${TEMP_DIR}/unique_css_hashes"
# Write hash statistics if deep analysis was enabled
if [ "$DEEP_ANALYZE" = true ]; then
echo "JS Hash Distribution:" > "${TEMP_DIR}/hash_stats.txt"
for hash in "${!js_hashes[@]}"; do
echo " $hash: ${js_hashes[$hash]} files" >> "${TEMP_DIR}/hash_stats.txt"
done
echo -e "\nCSS Hash Distribution:" >> "${TEMP_DIR}/hash_stats.txt"
for hash in "${!css_hashes[@]}"; do
echo " $hash: ${css_hashes[$hash]} files" >> "${TEMP_DIR}/hash_stats.txt"
done
fi
}
run_build() {
print_section "Starting Build Process" "${HAMMER}"
info_msg "Environment: ${NODE_ENV}"
info_msg "Building PHP-Flasher assets..."
# Set environment variables
export NODE_ENV="$NODE_ENV"
export ANALYZE="$ANALYZE"
export DEEP_ANALYZE="$DEEP_ANALYZE"
# Determine which parts to build based on flags
local rollup_args="$ROLLUP_ARGS"
if [ "$THEME_ONLY" = true ]; then
info_msg "Building themes only"
# Here we'd need to extend rollup to support theme-only builds
# For now, we'll complete the full build
elif [ "$MODULE_ONLY" = true ]; then
info_msg "Building modules only"
# Similarly, we'd need to extend rollup
fi
# Execute rollup with appropriate flags
if [ "$VERBOSE" = true ]; then
if npx rollup $rollup_args; then
success_msg "Build process completed"
return 0
else
error_msg "Build process failed"
return 1
fi
else
# Capture output for non-verbose mode
if npx rollup $rollup_args > "$BUILD_LOG" 2>&1; then
success_msg "Build process completed"
return 0
else
error_msg "Build process failed"
cat "$BUILD_LOG"
return 1
fi
fi
}
# =========================================================================
# REPORTING FUNCTIONS
# =========================================================================
print_size_table() {
local title="$1"
local data_file="$2"
local max_name_len=20
if [ ! -f "$data_file" ] || [ ! -s "$data_file" ]; then
return
fi
echo -e "\n${BOLD}${WHITE}${title}${RESET}\n"
# Print table header with or without hashes based on deep analysis
if [ "$DEEP_ANALYZE" = true ]; then
printf "${BOLD}%-${max_name_len}s %-10s %-10s %-10s %-10s${RESET}\n" "Component" "Size" "Gzip" "Bytes" "Hash"
else
printf "${BOLD}%-${max_name_len}s %-10s %-10s %-10s${RESET}\n" "Component" "Size" "Gzip" "Bytes"
fi
echo -e "${DIM}$(printf '%.0s─' {1..70})${RESET}"
# Print table rows
while IFS=: read -r line; do
# Split the line into fields
local fields=()
while IFS=: read -ra parts; do
fields=("${parts[@]}")
done <<< "$line"
local name="${fields[0]}"
local size_data="${fields[1]}"
local hash="N/A"
if [ "${#fields[@]}" -gt 2 ]; then
hash="${fields[2]}"
fi
IFS='|' read -r size gzip bytes brotli <<< "$size_data"
if [ "$DEEP_ANALYZE" = true ]; then
printf "%-${max_name_len}s ${GREEN}%-10s${RESET} ${BLUE}%-10s${RESET} ${YELLOW}%-10s${RESET} ${DIM}%.8s${RESET}\n" \
"$name" "$size" "$gzip" "$bytes" "$hash"
else
printf "%-${max_name_len}s ${GREEN}%-10s${RESET} ${BLUE}%-10s${RESET} ${YELLOW}%-10s${RESET}\n" \
"$name" "$size" "$gzip" "$bytes"
fi
done < "$data_file"
}
print_theme_table() {
local data_file="$1"
local max_name_len=15
if [ ! -f "$data_file" ] || [ ! -s "$data_file" ]; then
return
fi
echo -e "\n${BOLD}${WHITE}Theme Sizes${RESET}\n"
# Print table header
printf "${BOLD}%-${max_name_len}s %-10s %-10s %-10s %-10s${RESET}\n" "Theme" "JS Size" "CSS Size" "JS Bytes" "CSS Bytes"
echo -e "${DIM}$(printf '%.0s─' {1..70})${RESET}"
# Print table rows
while IFS=: read -r line; do
# Split the line into fields
local fields=()
while IFS=: read -ra parts; do
fields=("${parts[@]}")
done <<< "$line"
local name="${fields[0]}"
local js_size_data="${fields[1]}"
local js_hash="N/A"
local css_size_data="N/A"
local css_hash="N/A"
if [ "${#fields[@]}" -gt 2 ]; then
js_hash="${fields[2]}"
fi
if [ "${#fields[@]}" -gt 3 ]; then
css_size_data="${fields[3]}"
fi
if [ "${#fields[@]}" -gt 4 ]; then
css_hash="${fields[4]}"
fi
IFS='|' read -r js_size js_gzip js_bytes js_brotli <<< "$js_size_data"
local css_size="N/A"
local css_bytes="N/A"
if [ "$css_size_data" != "N/A" ]; then
IFS='|' read -r css_size css_gzip css_bytes css_brotli <<< "$css_size_data"
fi
printf "%-${max_name_len}s ${GREEN}%-10s${RESET} ${MAGENTA}%-10s${RESET} ${YELLOW}%-10s${RESET} ${BLUE}%-10s${RESET}\n" \
"$name" "$js_size" "$css_size" "$js_bytes" "$css_bytes"
done < "$data_file"
}
print_theme_grid() {
local theme_names_file="$1"
if [ ! -f "$theme_names_file" ] || [ ! -s "$theme_names_file" ]; then
return
fi
echo -e "\n${BOLD}${MAGENTA}${PALETTE} Themes:${RESET}"
# Define grid parameters
local columns=3
local max_width=15
local count=0
# Print themes in a grid
while read -r theme; do
if [ $((count % columns)) -eq 0 ]; then
echo -ne " "
fi
printf "• %-${max_width}s" "$theme"
count=$((count + 1))
if [ $((count % columns)) -eq 0 ]; then
echo
fi
done < "$theme_names_file"
# Add a newline if the last row wasn't complete
if [ $((count % columns)) -ne 0 ]; then
echo
fi
}
print_deep_analysis() {
if [ ! -d "${TEMP_DIR}/analysis" ]; then
return
fi
local unique_js=0
local unique_css=0
if [ -f "${TEMP_DIR}/unique_js_hashes" ]; then
unique_js=$(cat "${TEMP_DIR}/unique_js_hashes")
fi
if [ -f "${TEMP_DIR}/unique_css_hashes" ]; then
unique_css=$(cat "${TEMP_DIR}/unique_css_hashes")
fi
echo -e "\n${BOLD}${WHITE}Deep File Analysis${RESET}"
echo -e "${DIM}$(printf '%.0s─' {1..50})${RESET}"
echo -e "Unique JavaScript files: ${YELLOW}${unique_js}${RESET}"
echo -e "Unique CSS files: ${MAGENTA}${unique_css}${RESET}"
if [ -f "${TEMP_DIR}/hash_stats.txt" ]; then
echo -e "\n${BOLD}Hash Distribution:${RESET}"
local top_5=$(head -n 10 "${TEMP_DIR}/hash_stats.txt")
echo -e "${DIM}$top_5${RESET}"
echo -e "${DIM}(See ${TEMP_DIR}/hash_stats.txt for full details)${RESET}"
fi
}
print_summary() {
local success=$1
local duration=$2
# Read statistics
local modules_count=0
local themes_count=0
if [ -f "${TEMP_DIR}/modules_count" ]; then
modules_count=$(cat "${TEMP_DIR}/modules_count")
fi
if [ -f "${TEMP_DIR}/themes_count" ]; then
themes_count=$(cat "${TEMP_DIR}/themes_count")
fi
# Print summary header
echo -e "\n${BOLD}${PACKAGE} Build Summary${RESET}"
echo -e "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
# Print statistics
if [ "$MODULE_ONLY" = false ]; then
echo -e "${CHECK} Modules/Plugins: ${BOLD}${CYAN}${modules_count}${RESET}"
fi
if [ "$THEME_ONLY" = false ]; then
echo -e "${CHECK} Themes: ${BOLD}${MAGENTA}${themes_count}${RESET}"
fi
echo -e "${CHECK} Build completed in ${BOLD}${YELLOW}${duration}s${RESET}"
# Print theme names if available
if [ -f "${TEMP_DIR}/theme_names" ]; then
print_theme_grid "${TEMP_DIR}/theme_names"
fi
# Show size analysis if requested
if [ "$ANALYZE" = true ]; then
echo -e "\n${BOLD}${CHART} Size Analysis:${RESET}"
print_size_table "Module Sizes" "${TEMP_DIR}/modules/data"
if [ "$DEEP_ANALYZE" = true ]; then
print_theme_table "${TEMP_DIR}/themes/data"
print_deep_analysis
else
print_size_table "Theme Sizes" "${TEMP_DIR}/themes/data"
fi
# Add option to view detailed logs
echo -e "\nFor detailed build info, run: ${CYAN}cat $BUILD_LOG${RESET}"
echo -e "Temporary files at: ${CYAN}${TEMP_DIR}${RESET}"
fi
}
# =========================================================================
# MAIN EXECUTION
# =========================================================================
main() {
local start_time=$(date +%s)
local build_success=true
# Parse command-line arguments
parse_args "$@"
# Show header
print_header
# Run the build process
run_build || build_success=false
# Only collect statistics if build was successful and not in watch mode
if [ "$WATCH_MODE" = false ] && [ "$build_success" = true ]; then
if [ "$ANALYZE" = true ] || [ ! -t 1 ]; then
print_section "Analyzing Build Output" "${CHART}"
fi
collect_build_statistics
fi
# Print summary (unless in watch mode)
if [ "$WATCH_MODE" = false ]; then
local end_time=$(date +%s)
local duration=$((end_time - start_time))
print_summary "$build_success" "$duration"
fi
# Exit with appropriate code
[ "$build_success" = true ] && exit 0 || exit 1
}
# Execute main function with all arguments
main "$@"
-189
View File
@@ -1,189 +0,0 @@
#!/usr/bin/env bash
set -e
set -o pipefail
# Colors and styles
readonly RESET='\033[0m'
readonly BOLD='\033[1m'
readonly BLUE='\033[34m'
readonly GREEN='\033[32m'
readonly RED='\033[31m'
readonly YELLOW='\033[33m'
# Emojis
readonly ROCKET="🚀"
readonly UPDATE="🔄"
readonly PACKAGE="📦"
readonly SUCCESS="✨"
readonly ERROR="❌"
readonly WARNING="⚠️"
readonly CHECK="✓"
# Header
print_header() {
echo -e "\n${BOLD}${BLUE}╭──────────────────────────────────────────╮${RESET}"
echo -e "${BOLD}${BLUE}│ ${ROCKET} PHP-Flasher Version ${ROCKET} │${RESET}"
echo -e "${BOLD}${BLUE}╰──────────────────────────────────────────╯${RESET}\n"
echo -e " Date : $(date -u '+%Y-%m-%d %H:%M:%S') UTC"
echo -e " User : $(whoami)"
echo -e " Directory: $(pwd)\n"
}
# Version validation
validate_version() {
local version=$1
if [[ ! $version =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo -e "\n${RED}${ERROR} Invalid version format: $version${RESET}"
echo -e " Version must be in format X.Y.Z (e.g., 2.1.6)\n"
exit 1
fi
}
# Get current version from Flasher class
get_current_version() {
local file="src/Prime/Flasher.php"
if [ -f "$file" ]; then
local version=$(grep -o "const VERSION = '[0-9]\+\.[0-9]\+\.[0-9]\+'" "$file" | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+")
echo "$version"
else
echo -e "${RED}${ERROR} Flasher.php not found in src/Prime/Flasher.php${RESET}"
exit 1
fi
}
# Update composer.json file
update_composer_file() {
local file=$1
local current_version=$2
local new_version=$3
# Create a temporary file
local tmp_file="${file}.tmp"
# Use jq with 4-space indentation
if command -v jq >/dev/null 2>&1; then
jq --indent 4 --arg cv "^${current_version}" --arg nv "^${new_version}" '
walk(
if type == "object" and has("require") then
.require |= with_entries(
if .key | startswith("php-flasher/") then
.value = $nv
else
.
end
)
else
.
end
)
' "$file" > "$tmp_file"
else
# Fallback to sed for simple replacement
sed -E "s/\"php-flasher\/[^\"]+\": \"\\^${current_version}\"/\"\\0\": \"^${new_version}\"/" "$file" > "$tmp_file"
fi
# Check if the temporary file exists and has content
if [ -s "$tmp_file" ]; then
mv "$tmp_file" "$file"
echo " ${CHECK} Updated $file"
else
echo " ${WARNING} Failed to update $file"
rm -f "$tmp_file"
fi
}
# Update package.json file
update_package_file() {
local file=$1
local current_version=$2
local new_version=$3
# Create a temporary file
local tmp_file="${file}.tmp"
# Use jq with 4-space indentation
if command -v jq >/dev/null 2>&1; then
jq --indent 4 --arg cv "^${current_version}" --arg nv "^${new_version}" --arg v "${new_version}" '
.version = $v |
if has("peerDependencies") then
.peerDependencies |= with_entries(
if .key | startswith("@flasher/") then
.value = $nv
else
.
end
)
else
.
end |
if has("dependencies") then
.dependencies |= with_entries(
if .key | startswith("@flasher/") then
.value = $nv
else
.
end
)
else
.
end
' "$file" > "$tmp_file"
else
# Fallback to sed for simple replacement
sed -E -e "s/\"version\": \"${current_version}\"/\"version\": \"${new_version}\"/" \
-e "s/\"@flasher\/[^\"]+\": \"\\^${current_version}\"/\"\\0\": \"^${new_version}\"/" \
"$file" > "$tmp_file"
fi
# Check if the temporary file exists and has content
if [ -s "$tmp_file" ]; then
mv "$tmp_file" "$file"
echo " ${CHECK} Updated $file"
else
echo " ${WARNING} Failed to update $file"
rm -f "$tmp_file"
fi
}
# Update version in files
update_version() {
local current_version=$1
local new_version=$2
echo -e " ${UPDATE} Updating version numbers ($current_version → $new_version)\n"
# Update PHP class version
echo -e " ${PACKAGE} Updating Flasher class version..."
if [ -f "src/Prime/Flasher.php" ]; then
sed -i '' "s/const VERSION = '$current_version'/const VERSION = '$new_version'/" src/Prime/Flasher.php
echo -e " ${CHECK} Updated src/Prime/Flasher.php"
fi
# Update composer.json files in src directory
echo -e "\n ${PACKAGE} Updating composer.json files..."
find src -name "composer.json" -type f | while read -r file; do
update_composer_file "$file" "$current_version" "$new_version"
done
# Update package.json files in src directory
echo -e "\n ${PACKAGE} Updating package.json files..."
find src -name "package.json" -type f | while read -r file; do
update_package_file "$file" "$current_version" "$new_version"
done
echo -e "\n ${SUCCESS} Version bump complete!\n"
}
# Main execution
if [ -z "$1" ]; then
echo -e "${RED}${ERROR} Version number is required${RESET}"
echo -e "Usage: $0 <version>\n"
exit 1
fi
print_header
new_version=$1
current_version=$(get_current_version)
validate_version "$new_version"
update_version "$current_version" "$new_version"
-35
View File
@@ -1,35 +0,0 @@
#!/bin/bash
# Default to the current directory if no directory is provided
dir=${1:-.}
# Optional: A list of file extensions to filter by, e.g., "txt md". Leave empty to include all files.
extensions=($2)
# Temporary file to store results
temp_file=$(mktemp)
# Function to print file details (now inline within find command)
print_file_details() {
echo "File Path: $1"
echo "Contents:"
cat "$1"
echo
}
# Finding and processing files
if [ ${#extensions[@]} -eq 0 ]; then
# If no extensions are specified, process all files
find "$dir" -type f -exec bash -c 'echo "File Path: $1"; echo "Contents:"; cat "$1"; echo' bash {} \; >> "$temp_file"
else
# Process only files with specified extensions
for ext in "${extensions[@]}"; do
find "$dir" -type f -name "*.$ext" -exec bash -c 'echo "File Path: $1"; echo "Contents:"; cat "$1"; echo' bash {} \; >> "$temp_file"
done
fi
# Copy results to clipboard and remove the temporary file
cat "$temp_file" | pbcopy
rm "$temp_file"
echo "Results copied to clipboard."
-101
View File
@@ -1,101 +0,0 @@
#!/usr/bin/env bash
set -o pipefail
# Colors and styles
readonly RESET='\033[0m'
readonly BOLD='\033[1m'
readonly DIM='\033[2m'
readonly UNDERLINE='\033[4m'
readonly BLUE='\033[34m'
readonly GREEN='\033[32m'
readonly RED='\033[31m'
readonly YELLOW='\033[33m'
readonly CYAN='\033[36m'
readonly MAGENTA='\033[35m'
# Essential emojis
readonly ROCKET="🚀"
readonly CHECK="✓"
readonly ERROR="❌"
readonly WARNING="⚠️"
readonly BOOKS="📚"
readonly HAMMER="🏗️"
readonly SPARKLES="✨"
print_header() {
echo -e "\n${BOLD}${BLUE}${ROCKET} PHP-Flasher Documentation Builder ${ROCKET}${RESET}\n"
echo -e "${BOLD}Date : ${RESET}${CYAN}$(date -u '+%Y-%m-%d %H:%M:%S') UTC${RESET}"
echo -e "${BOLD}User : ${RESET}${MAGENTA}yoeunes${RESET}"
echo -e "${BOLD}Branch : ${RESET}${GREEN}$(git rev-parse --abbrev-ref HEAD)${RESET}"
echo -e "${BOLD}Directory : ${RESET}${BLUE}$(pwd)${RESET}\n"
}
install_dependencies() {
echo -e "${BOLD}${BOOKS} Installing dependencies${RESET}"
if npm install --force; then
echo -e "${CHECK} ${GREEN}Dependencies installed successfully${RESET}\n"
return 0
else
echo -e "${WARNING} ${YELLOW}Dependency installation had issues${RESET}\n"
return 1
fi
}
build_documentation() {
echo -e "${BOLD}${HAMMER} Building documentation${RESET}"
if npm run build; then
echo -e "${CHECK} ${GREEN}Documentation built successfully${RESET}\n"
return 0
else
echo -e "${ERROR} ${RED}Documentation build failed${RESET}\n"
return 1
fi
}
main() {
local command=${1:-"build"}
local start_time=$(date +%s)
local success=true
# Change directory to docs/
if [[ ! -d "docs/" ]]; then
echo -e "${ERROR} ${RED}Documentation directory 'docs/' not found${RESET}\n"
exit 1
fi
cd docs/
print_header
echo -e "${BOLD}Command : ${RESET}${CYAN}${command}${RESET}\n"
case $command in
"build")
install_dependencies || success=false
build_documentation || success=false
;;
*)
echo -e "${ERROR} ${RED}Unknown command: ${command}${RESET}"
echo -e "Available commands: build"
exit 1
;;
esac
local end_time=$(date +%s)
local duration=$((end_time - start_time))
# Summary
echo -e "${BOLD}${CYAN}Documentation ${command^} Summary${RESET}"
if [ "$success" = true ]; then
echo -e "${SPARKLES} ${GREEN}Documentation ${command} completed successfully${RESET}"
else
echo -e "${WARNING} ${YELLOW}Documentation ${command} completed with issues${RESET}"
fi
echo -e "Duration : ${YELLOW}${duration}s${RESET}\n"
[ "$success" = true ] && exit 0 || exit 1
}
main "$@"
-158
View File
@@ -1,158 +0,0 @@
#!/usr/bin/env bash
set -o pipefail
# Colors and styles
readonly RESET='\033[0m'
readonly BOLD='\033[1m'
readonly DIM='\033[2m'
readonly UNDERLINE='\033[4m'
readonly BLUE='\033[34m'
readonly GREEN='\033[32m'
readonly RED='\033[31m'
readonly YELLOW='\033[33m'
readonly CYAN='\033[36m'
readonly MAGENTA='\033[35m'
# Essential emojis
readonly ROCKET="🚀"
readonly CHECK="✓"
readonly ERROR="❌"
readonly WARNING="⚠️"
readonly SEARCH="🔍"
readonly PALETTE="🎨"
readonly MICROSCOPE="🔬"
readonly MEMO="📝"
readonly MAGNIFIER="🔎"
readonly TEST_TUBE="🧪"
readonly SPARKLES="✨"
print_header() {
echo -e "\n${BOLD}${BLUE}${ROCKET} PHP-Flasher Code Quality Check ${ROCKET}${RESET}\n"
echo -e "${BOLD}Date : ${RESET}${CYAN}$(date -u '+%Y-%m-%d %H:%M:%S') UTC${RESET}"
echo -e "${BOLD}User : ${RESET}${MAGENTA}yoeunes${RESET}"
echo -e "${BOLD}Branch : ${RESET}${GREEN}$(git rev-parse --abbrev-ref HEAD)${RESET}"
echo -e "${BOLD}Directory : ${RESET}${BLUE}$(pwd)${RESET}\n"
}
run_rector() {
echo -e "${BOLD}${SEARCH} Running Rector${RESET}"
if php vendor/bin/rector; then
echo -e "${CHECK} ${GREEN}Rector completed successfully${RESET}\n"
return 0
else
echo -e "${WARNING} ${YELLOW}Rector found issues${RESET}\n"
return 1
fi
}
run_php_cs_fixer() {
echo -e "${BOLD}${PALETTE} Running PHP-CS-Fixer${RESET}"
if php vendor/bin/php-cs-fixer fix -v; then
echo -e "${CHECK} ${GREEN}PHP-CS-Fixer completed successfully${RESET}\n"
return 0
else
echo -e "${WARNING} ${YELLOW}CS-Fixer found issues${RESET}\n"
return 1
fi
}
run_phpstan() {
echo -e "${BOLD}${MICROSCOPE} Running PHPStan${RESET}"
if php vendor/bin/phpstan analyse --memory-limit=-1; then
echo -e "${CHECK} ${GREEN}PHPStan analysis completed successfully${RESET}\n"
return 0
else
echo -e "${WARNING} ${YELLOW}PHPStan found issues${RESET}\n"
return 1
fi
}
validate_composer_files() {
echo -e "${BOLD}${MEMO} Validating Composer Files${RESET}"
local validation_success=true
if ! composer validate --strict; then
echo -e "${WARNING} ${YELLOW}Main composer.json validation failed${RESET}"
validation_success=false
fi
# Find and validate all composer.json files in src/
find src/ -name "composer.json" | while read file; do
echo -e "${DIM}Validating ${file}${RESET}"
if ! composer validate --strict "$file"; then
echo -e "${WARNING} ${YELLOW}Package validation failed for ${file}${RESET}"
validation_success=false
fi
done
if [ "$validation_success" = true ]; then
echo -e "${CHECK} ${GREEN}All composer.json files are valid${RESET}\n"
return 0
else
echo -e "${WARNING} ${YELLOW}Some composer.json files have issues${RESET}\n"
return 1
fi
}
run_phplint() {
echo -e "${BOLD}${MAGNIFIER} Running PHPLint${RESET}"
if php vendor/bin/phplint; then
echo -e "${CHECK} ${GREEN}PHPLint completed successfully${RESET}\n"
return 0
else
echo -e "${WARNING} ${YELLOW}PHPLint found issues${RESET}\n"
return 1
fi
}
run_phpunit() {
echo -e "${BOLD}${TEST_TUBE} Running PHPUnit Tests${RESET}"
if php vendor/bin/phpunit; then
echo -e "${CHECK} ${GREEN}All tests passed successfully${RESET}\n"
return 0
else
echo -e "${WARNING} ${YELLOW}Tests failed${RESET}\n"
return 1
fi
}
main() {
local start_time=$(date +%s)
local issues_found=false
print_header
# Run all quality tools
run_rector || issues_found=true
run_php_cs_fixer || issues_found=true
run_phpstan || issues_found=true
validate_composer_files || issues_found=true
run_phplint || issues_found=true
run_phpunit || issues_found=true
local end_time=$(date +%s)
local duration=$((end_time - start_time))
# Summary
echo -e "${BOLD}${CYAN}Quality Check Summary${RESET}"
if [ "$issues_found" = true ]; then
echo -e "${WARNING} ${YELLOW}Quality check completed with issues${RESET}"
else
echo -e "${SPARKLES} ${GREEN}All quality checks passed successfully${RESET}"
fi
echo -e "Duration : ${YELLOW}${duration}s${RESET}\n"
echo -e "${SPARKLES} ${BOLD}Quality Check Complete${RESET}"
echo -e "${CHECK} All checks finished\n"
# We don't exit with error code because the original task continues despite failures
exit 0
}
main
-225
View File
@@ -1,225 +0,0 @@
#!/usr/bin/env bash
# Set options
set -o pipefail
# Define colors and styles
readonly RESET='\033[0m'
readonly BOLD='\033[1m'
readonly DIM='\033[2m'
readonly GREEN='\033[32m'
readonly BLUE='\033[34m'
readonly CYAN='\033[36m'
readonly YELLOW='\033[33m'
readonly RED='\033[31m'
# Define emoji
readonly ROCKET="🚀"
readonly NPM="📦"
readonly CHECK="✓"
readonly WARN="⚠️"
readonly ERROR="❌"
readonly LOADING="⏳"
readonly SKIP="⏭️"
# Configuration
readonly NPM_PACKAGES=(
"src/Prime/Resources:@flasher/flasher"
"src/Noty/Prime/Resources:@flasher/flasher-noty"
"src/Notyf/Prime/Resources:@flasher/flasher-notyf"
"src/SweetAlert/Prime/Resources:@flasher/flasher-sweetalert"
"src/Toastr/Prime/Resources:@flasher/flasher-toastr"
)
# Print functions
print_header() {
echo -e "\n${BOLD}${BLUE}╭──────────────────────────────────────────╮${RESET}"
echo -e "${BOLD}${BLUE}│ ${ROCKET} PHP-Flasher NPM Release ${ROCKET} │${RESET}"
echo -e "${BOLD}${BLUE}╰──────────────────────────────────────────╯${RESET}\n"
echo -e " ${DIM}Date : $(date -u '+%Y-%m-%d %H:%M:%S') UTC${RESET}"
echo -e " ${DIM}User : $(whoami)${RESET}"
echo -e " ${DIM}Directory: $(pwd)${RESET}"
}
print_section() {
echo -e "\n${BOLD}${CYAN}┌─ $1 ${2:-}${RESET}"
}
success_msg() {
echo -e " ${GREEN}${CHECK} $*${RESET}"
}
info_msg() {
echo -e " ${BLUE}${LOADING} $*${RESET}"
}
warning_msg() {
echo -e " ${YELLOW}${WARN} $*${RESET}"
}
error_msg() {
echo -e " ${RED}${ERROR} $*${RESET}"
}
skip_msg() {
echo -e " ${YELLOW}${SKIP} $*${RESET}"
}
print_summary() {
local version=$1
local duration=$2
local success_count=$3
local skipped_count=$4
local failed_count=$5
local failed_packages=("${@:6}")
print_section "Release Summary"
echo -e "\n ${DIM}Version : ${BOLD}v${version}${RESET}"
echo -e " ${DIM}Duration : ${BOLD}${duration}s${RESET}"
if [ "$success_count" -gt 0 ]; then
echo -e "\n ${DIM}Published : ${GREEN}${success_count}${RESET} packages"
fi
if [ "$skipped_count" -gt 0 ]; then
echo -e "\n ${DIM}Skipped : ${YELLOW}${skipped_count}${RESET} packages"
fi
if [ "$failed_count" -gt 0 ]; then
echo -e "\n ${DIM}Failed : ${RED}${failed_count}${RESET} packages"
echo -e "\n ${DIM}Failed packages:${RESET}"
for package in "${failed_packages[@]}"; do
echo -e " ${RED}• ${package}${RESET}"
done
fi
echo -e ""
if [ "$success_count" -eq 0 ] && [ "$skipped_count" -gt 0 ]; then
success_msg "All packages were already up to date! ${ROCKET}"
elif [ "$success_count" -gt 0 ]; then
success_msg "NPM release completed successfully! ${ROCKET}"
elif [ "$failed_count" -gt 0 ]; then
error_msg "NPM release completed with failures! ${ERROR}"
fi
}
# Check if version exists
check_version_exists() {
local package=$1
local version=$2
npm view "${package}@${version}" version >/dev/null 2>&1
}
# Validate NPM is installed and logged in
validate_npm() {
print_section "NPM Authentication Check"
if ! command -v npm >/dev/null 2>&1; then
error_msg "npm is not installed"
return 1
fi
if ! npm whoami >/dev/null 2>&1; then
error_msg "You are not logged in to npm. Please run 'npm login' first."
return 1
fi
success_msg "Authenticated as $(npm whoami)"
return 0
}
# Process a single package
process_package() {
local path_and_name=$1
local version=$2
local path="${path_and_name%:*}"
local package="${path_and_name#*:}"
print_section "Processing ${package}"
if [ ! -d "$path" ]; then
warning_msg "Directory $path does not exist, skipping..."
return 2
fi
info_msg "Checking version ${version}..."
if check_version_exists "$package" "$version"; then
skip_msg "Version ${version} already exists for ${package}, skipping..."
return 2
fi
info_msg "Installing dependencies..."
(cd "$path" && npm install --silent) || {
error_msg "Failed to install dependencies"
return 1
}
info_msg "Updating package version..."
(cd "$path" && npm version "$version" --no-git-tag-version --allow-same-version >/dev/null 2>&1) || true
info_msg "Publishing ${package}@${version}..."
if (cd "$path" && npm publish --access public); then
success_msg "Successfully published ${package}@${version}"
return 0
else
error_msg "Failed to publish ${package}"
return 1
fi
}
# Main execution
main() {
if [ "$#" -ne 1 ]; then
echo -e "\n${YELLOW}Usage: $0 <version>${RESET}"
echo -e "Example: $0 2.1.5\n"
exit 1
fi
local VERSION=$1
VERSION="${VERSION#v}"
print_header
# Validate npm authentication
validate_npm || exit 1
# Track statistics
local start_time=$(date +%s)
local success_count=0
local failed_count=0
local skipped_count=0
local failed_packages=()
# Process each package
for package_info in "${NPM_PACKAGES[@]}"; do
local package_name="${package_info#*:}"
process_package "$package_info" "$VERSION"
local status=$?
case $status in
0)
((success_count++))
;;
1)
((failed_count++))
failed_packages+=("$package_name")
;;
2)
((skipped_count++))
;;
esac
done
# Print summary
local end_time=$(date +%s)
local duration=$((end_time - start_time))
print_summary "$VERSION" "$duration" "$success_count" "$skipped_count" "$failed_count" "${failed_packages[@]}"
# Exit with failure if any package failed
[ "$failed_count" -gt 0 ] && exit 1 || exit 0
}
# Execute main function
main "$@"
-243
View File
@@ -1,243 +0,0 @@
#!/usr/bin/env bash
set -o pipefail
# Colors and styles
readonly RESET='\033[0m'
readonly BOLD='\033[1m'
readonly DIM='\033[2m'
readonly UNDERLINE='\033[4m'
readonly BLUE='\033[34m'
readonly GREEN='\033[32m'
readonly RED='\033[31m'
readonly YELLOW='\033[33m'
readonly CYAN='\033[36m'
readonly MAGENTA='\033[35m'
# Essential emojis
readonly ROCKET="🚀"
readonly CHECK="✓"
readonly ERROR="❌"
readonly SKIP="⏭️"
# Configuration
readonly RELEASE_BRANCH="2.x"
readonly REPOSITORIES=(
"flasher"
"flasher-laravel"
"flasher-symfony"
"flasher-noty"
"flasher-noty-laravel"
"flasher-noty-symfony"
"flasher-notyf"
"flasher-notyf-laravel"
"flasher-notyf-symfony"
"flasher-sweetalert"
"flasher-sweetalert-laravel"
"flasher-sweetalert-symfony"
"flasher-toastr"
"flasher-toastr-laravel"
"flasher-toastr-symfony"
)
print_header() {
echo -e "\n${BOLD}${BLUE}${ROCKET} PHP-Flasher Release ${ROCKET}${RESET}\n"
echo -e "${BOLD}Date : ${RESET}${CYAN}$(date -u '+%Y-%m-%d %H:%M:%S') UTC${RESET}"
echo -e "${BOLD}User : ${RESET}${MAGENTA}$(whoami)${RESET}"
echo -e "${BOLD}Branch : ${RESET}${GREEN}$RELEASE_BRANCH${RESET}"
echo -e "${BOLD}Directory : ${RESET}${BLUE}$(pwd)${RESET}\n"
}
draw_progress_bar() {
local percent=$1
local width=50
local filled=$(((width * percent + 99) / 100)) # Rounded up division
local empty=$((width - filled))
echo -n "["
printf "${GREEN}█%.0s${RESET}" $(seq 1 $filled)
printf "${DIM}─%.0s${RESET}" $(seq 1 $empty)
echo -n "] ${percent}%"
}
check_tag_exists() {
local repo=$1
local tag=$2
local remote_url="git@github.com:php-flasher/$repo.git"
if git ls-remote --tags "$remote_url" | grep -q "refs/tags/$tag$"; then
return 0
else
return 1
fi
}
release_repository() {
local repo=$1
local version=$2
local tmp_dir="/tmp/php-flasher"
local remote_url="git@github.com:php-flasher/$repo.git"
echo -e "\nGitHub : ${UNDERLINE}${BLUE}https://github.com/php-flasher/${repo}${RESET}"
echo -e "Tag : ${YELLOW}$version${RESET}"
if check_tag_exists "$repo" "$version"; then
echo -e "${SKIP} ${YELLOW}Tag $version already exists, skipping...${RESET}"
return 0
fi
# Clean and create temporary directory
rm -rf "$tmp_dir"
mkdir -p "$tmp_dir"
echo -e "${CYAN}Cloning repository...${RESET}"
if ! git clone "$remote_url" "$tmp_dir" >/dev/null 2>&1; then
echo -e "${ERROR} ${RED}Failed to clone repository${RESET}"
return 1
fi
(
cd "$tmp_dir"
echo -e "${CYAN}Creating tag $version...${RESET}"
git checkout "$RELEASE_BRANCH" >/dev/null 2>&1
git tag "$version"
if ! git push origin --tags --force >/dev/null 2>&1; then
echo -e "${ERROR} ${RED}Failed to push tag${RESET}"
return 1
fi
)
echo -e "${CHECK} ${GREEN}Successfully tagged${RESET}"
return 0
}
validate_version() {
local version=$1
if [[ ! $version =~ ^v?[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo -e "\n${ERROR} ${RED}Invalid version format: $version${RESET}"
echo -e "Version must be in format X.Y.Z or vX.Y.Z (e.g., 2.1.6 or v2.1.6)\n"
exit 1
fi
}
validate_environment() {
echo -e "${CYAN}Validating environment...${RESET}"
local has_error=0
# Check branch
local current_branch=$(git rev-parse --abbrev-ref HEAD)
echo -ne "${CYAN}Checking branch...${RESET} "
if [[ "$RELEASE_BRANCH" != "$current_branch" ]]; then
echo -e "${ERROR} ${RED}Wrong branch: $current_branch (expected: $RELEASE_BRANCH)${RESET}"
has_error=1
else
echo -e "${CHECK} ${GREEN}On correct branch: $current_branch${RESET}"
fi
# Check working directory
echo -ne "${CYAN}Checking working directory...${RESET} "
if [[ ! -z "$(git status --porcelain)" ]]; then
echo -e "${ERROR} ${RED}Working directory is not clean${RESET}"
echo -e "${DIM}Hint: Commit or stash your changes first${RESET}"
has_error=1
else
echo -e "${CHECK} ${GREEN}Working directory is clean${RESET}"
fi
# Check sync with remote
echo -ne "${CYAN}Checking remote synchronization...${RESET} "
git fetch origin > /dev/null 2>&1
local local_sha=$(git rev-parse HEAD)
local remote_sha=$(git rev-parse origin/$RELEASE_BRANCH)
if [[ $local_sha != $remote_sha ]]; then
echo -e "${ERROR} ${RED}Branch is not in sync with origin/$RELEASE_BRANCH${RESET}"
echo -e "\n${YELLOW}Local SHA: ${local_sha}${RESET}"
echo -e "${YELLOW}Remote SHA: ${remote_sha}${RESET}"
echo -e "\n${DIM}To fix this, try:${RESET}"
# Check if we have unpushed commits
if git rev-list origin/$RELEASE_BRANCH..$RELEASE_BRANCH --count > /dev/null 2>&1; then
local ahead=$(git rev-list origin/$RELEASE_BRANCH..$RELEASE_BRANCH --count)
local behind=$(git rev-list $RELEASE_BRANCH..origin/$RELEASE_BRANCH --count)
if [[ $ahead -gt 0 && $behind -gt 0 ]]; then
echo -e "${YELLOW}Your branch is $ahead commits ahead and $behind commits behind origin/$RELEASE_BRANCH${RESET}"
echo -e "1. ${CYAN}git pull origin $RELEASE_BRANCH${RESET} (to get remote changes)"
echo -e "2. ${CYAN}git push origin $RELEASE_BRANCH${RESET} (to push your changes)"
elif [[ $ahead -gt 0 ]]; then
echo -e "${YELLOW}Your branch is $ahead commits ahead of origin/$RELEASE_BRANCH${RESET}"
echo -e "Run: ${CYAN}git push origin $RELEASE_BRANCH${RESET}"
elif [[ $behind -gt 0 ]]; then
echo -e "${YELLOW}Your branch is $behind commits behind origin/$RELEASE_BRANCH${RESET}"
echo -e "Run: ${CYAN}git pull origin $RELEASE_BRANCH${RESET}"
fi
fi
has_error=1
else
echo -e "${CHECK} ${GREEN}Branch is in sync with remote${RESET}"
fi
if [[ $has_error -eq 1 ]]; then
echo -e "\n${ERROR} ${RED}Environment validation failed${RESET}"
exit 1
fi
echo -e "\n${CHECK} ${GREEN}Environment validated successfully${RESET}\n"
}
main() {
if [ "$#" -ne 1 ]; then
echo -e "${ERROR} ${RED}Version tag required${RESET}"
echo -e "Usage: $0 <version>"
echo -e "Example: $0 2.1.6\n"
exit 1
fi
local version=$1
[[ $version != v* ]] && version="v$version"
print_header
validate_version "$version"
validate_environment
local success_count=0
local skipped_count=0
local failed_count=0
local total_count=${#REPOSITORIES[@]}
local start_time=$(date +%s)
for repo in "${REPOSITORIES[@]}"; do
local current_count=$((success_count + skipped_count + failed_count + 1))
local percent=$((current_count * 100 / total_count))
echo -e "\nProgress: ${BOLD}$current_count/$total_count${RESET}"
# draw_progress_bar $percent
if release_repository "$repo" "$version"; then
if check_tag_exists "$repo" "$version"; then
((skipped_count++))
else
((success_count++))
fi
else
((failed_count++))
fi
done
local end_time=$(date +%s)
local duration=$((end_time - start_time))
# Summary
echo -e "\n${BOLD}${CYAN}Release Summary${RESET}"
echo -e "Successful : ${GREEN}$success_count${RESET}"
echo -e "Skipped : ${YELLOW}$skipped_count${RESET}"
[ $failed_count -gt 0 ] && echo -e "Failed : ${RED}$failed_count${RESET}"
echo -e "Duration : ${YELLOW}${duration}s${RESET}"
echo -e "Total repos: ${CYAN}$total_count${RESET}\n"
[ $failed_count -gt 0 ] && exit 1 || exit 0
}
main "$@"
-154
View File
@@ -1,154 +0,0 @@
#!/usr/bin/env bash
set -o pipefail
# Colors and styles
readonly RESET='\033[0m'
readonly BOLD='\033[1m'
readonly DIM='\033[2m'
readonly UNDERLINE='\033[4m'
readonly BLUE='\033[34m'
readonly GREEN='\033[32m'
readonly RED='\033[31m'
readonly YELLOW='\033[33m'
readonly CYAN='\033[36m'
readonly MAGENTA='\033[35m'
# Essential emojis
readonly ROCKET="🚀"
readonly CHECK="✓"
readonly ERROR="❌"
# Repository mappings
declare -A REPOSITORIES=(
# Core packages
["src/Prime"]="flasher"
["src/Laravel"]="flasher-laravel"
["src/Symfony"]="flasher-symfony"
# Toastr packages
["src/Toastr/Prime"]="flasher-toastr"
["src/Toastr/Laravel"]="flasher-toastr-laravel"
["src/Toastr/Symfony"]="flasher-toastr-symfony"
# Notyf packages
["src/Notyf/Prime"]="flasher-notyf"
["src/Notyf/Laravel"]="flasher-notyf-laravel"
["src/Notyf/Symfony"]="flasher-notyf-symfony"
# SweetAlert packages
["src/SweetAlert/Prime"]="flasher-sweetalert"
["src/SweetAlert/Laravel"]="flasher-sweetalert-laravel"
["src/SweetAlert/Symfony"]="flasher-sweetalert-symfony"
# Noty packages
["src/Noty/Prime"]="flasher-noty"
["src/Noty/Laravel"]="flasher-noty-laravel"
["src/Noty/Symfony"]="flasher-noty-symfony"
)
print_header() {
echo -e "\n${BOLD}${BLUE}${ROCKET} PHP-Flasher Split ${ROCKET}${RESET}\n"
echo -e "${BOLD}Date : ${RESET}${CYAN}$(date -u '+%Y-%m-%d %H:%M:%S') UTC${RESET}"
echo -e "${BOLD}User : ${RESET}${MAGENTA}$(whoami)${RESET}"
echo -e "${BOLD}Branch : ${RESET}${GREEN}$(git rev-parse --abbrev-ref HEAD)${RESET}"
echo -e "${BOLD}Directory : ${RESET}${BLUE}$(pwd)${RESET}\n"
}
process_split() {
local prefix=$1
local remote=${REPOSITORIES[$prefix]}
local branch=$(git rev-parse --abbrev-ref HEAD)
local repo_url="https://github.com/php-flasher/${remote}"
local packagist_url="https://packagist.org/packages/php-flasher/${remote}"
echo -e "\nGitHub : ${UNDERLINE}${BLUE}${repo_url}${RESET}"
echo -e "Package : ${UNDERLINE}${BLUE}${packagist_url}${RESET}"
echo -e "Prefix : ${YELLOW}$prefix${RESET}"
echo -e "Branch : ${GREEN}$branch${RESET}\n"
# Split the repository
echo -e "${CYAN}Splitting code...${RESET}"
local sha1
if ! sha1=$(./bin/splitsh-lite --prefix="$prefix" 2>/dev/null); then
echo -e "${ERROR} ${RED}Split failed${RESET}"
return 1
fi
echo -e "${CHECK} Split complete (SHA: ${YELLOW}${sha1:0:8}${RESET})"
echo -e "${CYAN}Pushing to remote...${RESET}"
if ! git push "$remote" "$sha1:refs/heads/$branch" -f > /dev/null 2>&1; then
echo -e "${ERROR} ${RED}Failed to push to $remote${RESET}"
return 1
fi
echo -e "${CHECK} ${GREEN}Pushed to $remote (branch: $branch)${RESET}"
return 0
}
update_repository() {
echo -e "\n${CYAN}Fetching latest changes...${RESET}"
if ! git fetch origin "$(git rev-parse --abbrev-ref HEAD)" > /dev/null 2>&1; then
echo -e "${ERROR} ${RED}Failed to fetch latest changes, continuing...${RESET}"
else
echo -e "${CHECK} ${GREEN}Repository updated successfully${RESET}"
fi
echo
}
draw_progress_bar() {
local percent=$1
local width=50
local filled=$(( (width * percent + 99) / 100 )) # Rounded up division
local empty=$(( width - filled ))
echo -n "["
printf "${GREEN}█%.0s${RESET}" $(seq 1 $filled)
printf "${DIM}─%.0s${RESET}" $(seq 1 $empty)
echo -n "] ${percent}%"
}
main() {
print_header
update_repository
local success_count=0
local failed_count=0
local total_count=${#REPOSITORIES[@]}
local start_time=$(date +%s)
for prefix in "${!REPOSITORIES[@]}"; do
local current_count=$((success_count + failed_count + 1))
local percent=$((current_count * 100 / total_count))
echo -e "\nProgress: ${BOLD}$current_count/$total_count${RESET}"
# draw_progress_bar $percent
if process_split "$prefix"; then
((success_count++))
else
((failed_count++))
fi
done
local end_time=$(date +%s)
local duration=$((end_time - start_time))
# Summary
echo -e "\n${BOLD}${CYAN}Split Summary${RESET}"
echo -e "Successful : ${GREEN}$success_count${RESET}"
[ $failed_count -gt 0 ] && echo -e "Failed : ${RED}$failed_count${RESET}"
echo -e "Duration : ${YELLOW}${duration}s${RESET}"
echo -e "Total repos : ${CYAN}$total_count${RESET}"
# Links
echo -e "\n${BOLD}${CYAN}Quick Links${RESET}"
echo -e "Packagist : ${UNDERLINE}${BLUE}https://packagist.org/packages/php-flasher/${RESET}"
echo -e "NPM : ${UNDERLINE}${BLUE}https://www.npmjs.com/org/flasher${RESET}"
echo -e "GitHub : ${UNDERLINE}${BLUE}https://github.com/php-flasher${RESET}\n"
[ $failed_count -gt 0 ] && exit 1 || exit 0
}
main
BIN
View File
Binary file not shown.
-331
View File
@@ -1,331 +0,0 @@
#!/usr/bin/env bash
# Set options
set -e
set -o pipefail
# Define colors and styles
readonly RESET='\033[0m'
readonly BOLD='\033[1m'
readonly DIM='\033[2m'
readonly ITALIC='\033[3m'
readonly UNDERLINE='\033[4m'
readonly RED='\033[31m'
readonly GREEN='\033[32m'
readonly YELLOW='\033[33m'
readonly BLUE='\033[34m'
readonly MAGENTA='\033[35m'
readonly CYAN='\033[36m'
readonly WHITE='\033[37m'
# Define emoji
readonly ROCKET="🚀"
readonly PACKAGE="📦"
readonly CALENDAR="📅"
readonly CLOCK="🕒"
readonly INFO=""
readonly WARNING="⚠️"
readonly CHECK="✓"
readonly BRANCH="🌿"
readonly TAG="🏷️"
readonly GITHUB="⭐"
readonly STAR="⭐"
readonly NPM="📦"
readonly PACKAGIST="🎯"
# Configuration
readonly ORGANIZATION="php-flasher"
readonly MAIN_BRANCH="2.x"
readonly REPOSITORIES=(
"flasher"
"flasher-laravel"
"flasher-symfony"
"flasher-noty"
"flasher-noty-laravel"
"flasher-noty-symfony"
"flasher-notyf"
"flasher-notyf-laravel"
"flasher-notyf-symfony"
"flasher-sweetalert"
"flasher-sweetalert-laravel"
"flasher-sweetalert-symfony"
"flasher-toastr"
"flasher-toastr-laravel"
"flasher-toastr-symfony"
)
# Print functions
print_header() {
echo -e "\n${BOLD}${BLUE}╭──────────────────────────────────────────╮${RESET}"
echo -e "${BOLD}${BLUE}│ ${ROCKET} PHP-Flasher Status ${ROCKET} │${RESET}"
echo -e "${BOLD}${BLUE}╰──────────────────────────────────────────╯${RESET}\n"
echo -e " ${DIM}Date : $(date -u '+%Y-%m-%d %H:%M:%S') UTC${RESET}"
echo -e " ${DIM}User : $(whoami)${RESET}"
echo -e " ${DIM}Directory: $(pwd)${RESET}"
}
print_section() {
echo -e "\n${BOLD}${CYAN} $1 ${2:-}${RESET}"
}
warning_msg() {
echo -e " ${YELLOW}${WARNING} $*${RESET}"
}
success_msg() {
echo -e " ${GREEN}${CHECK} $*${RESET}"
}
error_msg() {
echo -e " ${RED}${ERROR} $*${RESET}"
}
info_msg() {
echo -e "${BLUE}${INFO} $*${RESET}"
}
# Get the latest tag for a repository
get_latest_tag() {
local repo=$1
git ls-remote --tags --refs "git@github.com:${ORGANIZATION}/${repo}.git" |
sort -t '/' -k 3 -V |
tail -n1 |
awk -F/ '{print $3}'
}
# Get commit count since last tag
get_commit_count_since_tag() {
local repo=$1
local tag=$2
git rev-list "${tag}..HEAD" --count 2>/dev/null || echo "0"
}
# Get repository statistics
get_repo_stats() {
local repo=$1
local tmp_dir="/tmp/php-flasher-status/${repo}"
mkdir -p "$tmp_dir"
if [ ! -d "$tmp_dir/.git" ]; then
git clone -q "git@github.com:${ORGANIZATION}/${repo}.git" "$tmp_dir" 2>/dev/null
fi
(
cd "$tmp_dir"
git fetch -q origin 2>/dev/null
echo "$(git rev-parse --short HEAD)|$(git rev-parse --abbrev-ref HEAD)|$(git log -1 --format='%cr')|$(git log -1 --format='%s')"
)
}
# Check composer.json version
check_composer_version() {
local file="composer.json"
if [ -f "$file" ]; then
grep -o '"version": *"[^"]*"' "$file" 2>/dev/null | cut -d'"' -f4 || echo "N/A"
else
echo "N/A"
fi
}
# Add curl with proper user agent for API calls
curl_cmd() {
# You can set your GitHub token as an environment variable
local gh_token=${GITHUB_TOKEN:-""}
local auth_header=""
if [ ! -z "$gh_token" ]; then
auth_header="-H \"Authorization: token $gh_token\""
fi
curl -s -H "User-Agent: PHP-Flasher-Status-Check" $auth_header "$@"
}
# Get GitHub stars for a repository
get_github_stars() {
local repo=$1
local response=$(curl_cmd "https://api.github.com/repos/${ORGANIZATION}/${repo}")
local stars=$(echo "$response" | grep -o '"stargazers_count":[0-9]*' | cut -d':' -f2)
echo "${stars:-0}"
}
# Get Packagist version
get_packagist_version() {
local package=$1
local response=$(curl -s -f "https://repo.packagist.org/p2/php-flasher/${package}.json")
if [ $? -eq 0 ] && [ ! -z "$response" ]; then
local version=$(echo "$response" | grep -o '"latest":"[^"]*"' | cut -d'"' -f4)
if [ ! -z "$version" ]; then
echo "$version"
else
echo "N/A"
fi
else
echo "N/A"
fi
}
# Get NPM version
get_npm_version() {
local package=$1
# Convert package name format
if [[ "$package" == "flasher" ]]; then
package="flasher"
elif [[ "$package" == *"-prime" ]]; then
# Remove -prime suffix for npm package name
package=${package%-prime}
elif [[ "$package" == *"-laravel" || "$package" == *"-symfony" ]]; then
# These packages don't have npm versions
echo "N/A"
return
fi
local response=$(curl_cmd "https://registry.npmjs.org/@flasher/${package}/latest")
local version=$(echo "$response" | grep -o '"version":"[^"]*"' | cut -d'"' -f4)
echo "${version:-N/A}"
}
# Display repository information
display_repo_info() {
local repo=$1
local latest_tag=$(get_latest_tag "$repo")
local stats=($(get_repo_stats "$repo" | tr '|' ' '))
local github_stars=$(get_github_stars "$repo")
local npm_version="N/A"
local packagist_version="N/A"
# Get NPM version for specific packages
if [[ "$repo" == "flasher" || \
"$repo" == "flasher-noty" || \
"$repo" == "flasher-notyf" || \
"$repo" == "flasher-sweetalert" || \
"$repo" == "flasher-toastr" ]]; then
npm_version=$(get_npm_version "$repo")
fi
# Get Packagist version
packagist_version=$(get_packagist_version "$repo")
# Display repository information
echo -e "\n${BOLD}${MAGENTA} ${PACKAGE} ${repo}${RESET}"
echo -e " ${BRANCH} Branch : ${stats[1]:-unknown}"
echo -e " ${TAG} Latest Tag : ${latest_tag:-none}"
echo -e " ${STAR} Stars : ${github_stars}"
echo -e " ${PACKAGIST} Packagist : v${packagist_version}"
if [ "$npm_version" != "N/A" ]; then
echo -e " ${NPM} NPM : v${npm_version}"
fi
echo -e " ${GITHUB} Last Commit : ${stats[0]:-unknown} (${stats[2]:-unknown})"
echo -e " ${INFO} Message : ${stats[3]:-unknown}"
local commits_since_tag=$(get_commit_count_since_tag "$repo" "$latest_tag")
if [ "$commits_since_tag" -gt 0 ]; then
warning_msg "$commits_since_tag commit(s) since last tag"
fi
}
# Check git status
check_git_status() {
print_section "Git Status" "${GITHUB}"
local current_branch=$(git rev-parse --abbrev-ref HEAD)
echo -e " ${BRANCH} Current Branch : ${current_branch}"
if [ "$current_branch" != "$MAIN_BRANCH" ]; then
warning_msg " Not on main branch ($MAIN_BRANCH)"
fi
if [[ ! -z "$(git status --porcelain)" ]]; then
warning_msg " Working directory is not clean"
git status --short | sed 's/^/ /'
else
success_msg " Working directory is clean"
fi
local behind=$(git rev-list HEAD..origin/$current_branch --count 2>/dev/null || echo "0")
local ahead=$(git rev-list origin/$current_branch..HEAD --count 2>/dev/null || echo "0")
if [ "$behind" -gt 0 ]; then
warning_msg " Branch is behind by $behind commit(s)"
fi
if [ "$ahead" -gt 0 ]; then
warning_msg " Branch is ahead by $ahead commit(s)"
fi
if [ "$behind" -eq 0 ] && [ "$ahead" -eq 0 ]; then
success_msg " Branch is up to date with origin"
fi
}
# Check dependencies
check_dependencies() {
print_section "Dependencies" "${PACKAGE}"
if [ -f "composer.json" ]; then
echo -e " ${BOLD}Composer Dependencies:${RESET}"
composer show | grep "php-flasher/" | sed 's/^/ /' || echo " No PHP-Flasher dependencies found"
fi
if [ -f "package.json" ]; then
echo -e "\n ${BOLD}NPM Dependencies:${RESET}"
npm list | grep "@flasher/" | sed 's/^/ /' || echo " No Flasher dependencies found"
fi
}
# Display modified files
display_modified_files() {
print_section "Modified Files" "📝"
local modified_files=$(git diff --name-only)
if [ ! -z "$modified_files" ]; then
echo -e " ${BOLD}Modified files:${RESET}"
echo "$modified_files" | sed 's/^/ /'
else
success_msg " No modified files"
fi
}
# Main execution
main() {
print_header
# Check current repository status
check_git_status
# Check dependencies
check_dependencies
# Display modified files
display_modified_files
# Display repositories information
print_section "Repositories Status" "${PACKAGE}"
for repo in "${REPOSITORIES[@]}"; do
display_repo_info "$repo"
done
# Display release readiness
print_section "Release Readiness" "${ROCKET}"
local ready=true
if [ ! -z "$(git status --porcelain)" ]; then
warning_msg "Working directory is not clean"
ready=false
fi
if [ "$(git rev-parse --abbrev-ref HEAD)" != "$MAIN_BRANCH" ]; then
warning_msg "Not on main branch ($MAIN_BRANCH)"
ready=false
fi
if $ready; then
success_msg "Ready for release!"
echo -e "\n${BOLD}${GREEN}Suggested next steps:${RESET}"
echo -e "1. Run: ${ITALIC}./bin/split${RESET}"
echo -e "2. Run: ${ITALIC}./bin/release <version>${RESET}"
else
warning_msg "Not ready for release. Please fix the issues above."
fi
}
# Execute main function
main
-124
View File
@@ -1,124 +0,0 @@
#!/usr/bin/env bash
set -o pipefail
# Colors and styles
readonly RESET='\033[0m'
readonly BOLD='\033[1m'
readonly DIM='\033[2m'
readonly UNDERLINE='\033[4m'
readonly BLUE='\033[34m'
readonly GREEN='\033[32m'
readonly RED='\033[31m'
readonly YELLOW='\033[33m'
readonly CYAN='\033[36m'
readonly MAGENTA='\033[35m'
# Essential emojis
readonly ROCKET="🚀"
readonly CHECK="✓"
readonly ERROR="❌"
readonly PACKAGE="📦"
readonly SEARCH="🔍"
readonly HAMMER="🏗️"
readonly SPARKLES="✨"
readonly WARNING="⚠️"
print_header() {
echo -e "\n${BOLD}${BLUE}${ROCKET} PHP-Flasher Update ${ROCKET}${RESET}\n"
echo -e "${BOLD}Date : ${RESET}${CYAN}$(date -u '+%Y-%m-%d %H:%M:%S') UTC${RESET}"
echo -e "${BOLD}User : ${RESET}${MAGENTA}$(whoami)${RESET}"
echo -e "${BOLD}Branch : ${RESET}${GREEN}$(git rev-parse --abbrev-ref HEAD)${RESET}"
echo -e "${BOLD}Directory : ${RESET}${BLUE}$(pwd)${RESET}\n"
}
update_composer_dependencies() {
echo -e "${BOLD}${PACKAGE} Composer Dependencies${RESET}"
if composer update --prefer-lowest -W; then
echo -e "${CHECK} ${GREEN}Dependencies updated successfully${RESET}\n"
return 0
else
echo -e "${ERROR} ${RED}Failed to update Composer dependencies${RESET}\n"
return 1
fi
}
check_npm_updates() {
echo -e "${BOLD}${SEARCH} NPM Updates Check${RESET}"
# Run the commands and capture their exit codes
ncu -u
NCU_EXIT_CODE=$?
npm run ncu --workspaces
NPM_EXIT_CODE=$?
# Check if both commands were successful
if [ $NCU_EXIT_CODE -eq 0 ] && [ $NPM_EXIT_CODE -eq 0 ]; then
echo -e "${CHECK} ${GREEN}NPM check completed successfully${RESET}\n"
else
echo -e "${WARNING} ${YELLOW}NPM check failed, continuing...${RESET}\n"
fi
return 0 # Continue regardless of outcome
}
update_npm_dependencies() {
echo -e "${BOLD}${PACKAGE} NPM Dependencies${RESET}"
if npm install --force; then
echo -e "${CHECK} ${GREEN}NPM dependencies installed successfully${RESET}\n"
return 0
else
echo -e "${WARNING} ${YELLOW}NPM install failed, continuing...${RESET}\n"
return 0 # Continue despite failure
fi
}
build_assets() {
echo -e "${BOLD}${HAMMER} Building Assets${RESET}"
if npm run build; then
echo -e "${CHECK} ${GREEN}Assets built successfully${RESET}\n"
return 0
else
echo -e "${WARNING} ${YELLOW}Build failed, continuing...${RESET}\n"
return 0 # Continue despite failure
fi
}
main() {
local start_time=$(date +%s)
local success=true
print_header
# Update composer dependencies
update_composer_dependencies || success=false
# Check NPM updates
check_npm_updates
# Update NPM dependencies
update_npm_dependencies
# Build assets
build_assets
local end_time=$(date +%s)
local duration=$((end_time - start_time))
# Summary
echo -e "${BOLD}${CYAN}Update Summary${RESET}"
if [ "$success" = true ]; then
echo -e "${SPARKLES} ${GREEN}Update completed successfully${RESET}"
else
echo -e "${WARNING} ${YELLOW}Update completed with some issues${RESET}"
fi
echo -e "Duration : ${YELLOW}${duration}s${RESET}\n"
[ "$success" = true ] && exit 0 || exit 1
}
main
+33 -82
View File
@@ -1,105 +1,56 @@
{
"name": "php-flasher/php-flasher",
"type": "library",
"license": "MIT",
"homepage": "https://php-flasher.io",
"description": "The core repository for PHPFlasher, hosting the source code, contributions, issue tracking, and discussions for the PHPFlasher project. This mono-repo serves as the hub for development and community engagement.",
"keywords": ["php", "flash-messages", "notifications", "phpflasher", "user-feedback", "open-source", "contributions", "discussions", "issue-tracking"],
"support": {
"issues": "https://github.com/php-flasher/php-flasher/issues",
"source": "https://github.com/php-flasher/php-flasher"
},
"name": "php-flasher/flasher-toastr-symfony",
"type": "symfony-bundle",
"description": "PHP Flasher Symfony adapter for Toastr",
"keywords": [
"yoeunes",
"notify",
"php",
"laravel",
"symfony",
"Lumen",
"notifications",
"messages",
"alerts",
"pnotify",
"toastr ",
"bundle",
"flex"
],
"homepage": "https://php-flasher.github.io/",
"authors": [
{
"name": "Younes ENNAJI",
"email": "younes.ennaji.pro@gmail.com",
"homepage": "https://www.linkedin.com/in/younes--ennaji/",
"name": "Younes Khoubza",
"email": "younes.khoubza@gmail.com",
"homepage": "https://github.com/yoeunes",
"role": "Developer"
}
],
"minimum-stability": "dev",
"prefer-stable": true,
"license": "MIT",
"require": {
"php": ">=8.2",
"ext-intl": "*",
"illuminate/contracts": "^11.0|^12.0",
"illuminate/routing": "^11.0|^12.0",
"illuminate/support": "^11.0|^12.0",
"laravel/octane": "^2.3",
"livewire/livewire": "^3.0",
"paragonie/random_compat": "^2.0",
"psr/container": "^1.1|^2.0",
"symfony/config": "^7.0",
"symfony/console": "^7.0",
"symfony/dependency-injection": "^7.0",
"symfony/framework-bundle": "^7.0",
"symfony/http-kernel": "^7.0",
"symfony/translation": "^7.0",
"symfony/twig-bundle": "^7.0",
"symfony/ux-twig-component": "^2.19"
"php": ">=5.3",
"php-flasher/flasher-symfony": "^0.1",
"php-flasher/flasher-toastr": "^0.1"
},
"require-dev": {
"larastan/larastan": "^2.9.9",
"mockery/mockery": "^1.6.12",
"orchestra/testbench": "^9.5.2",
"overtrue/phplint": "^9.5.3",
"php-cs-fixer/shim": "^3.64.0",
"phpstan/phpstan": "^1.12.7",
"phpstan/phpstan-mockery": "^1.1.3",
"phpstan/phpstan-phpunit": "^1.4.0",
"phpstan/phpstan-symfony": "^1.4.10",
"phpunit/phpunit": "^10.5.26",
"rector/rector": "^1.2.8",
"rector/swiss-knife": "^1.0.0",
"symplify/monorepo-builder": "^11.2.22"
"phpunit/phpunit": "^4.8|^5.0|^6.0|^7.0|^8.0|^9.0"
},
"autoload": {
"psr-4": {
"Flasher\\": "src/"
"Flasher\\Toastr\\Symfony\\": ""
},
"files": [
"src/Prime/functions.php",
"src/Prime/helpers.php",
"src/Noty/Prime/functions.php",
"src/Noty/Prime/helpers.php",
"src/Notyf/Prime/functions.php",
"src/Notyf/Prime/helpers.php",
"src/SweetAlert/Prime/functions.php",
"src/SweetAlert/Prime/helpers.php",
"src/Toastr/Prime/functions.php",
"src/Toastr/Prime/helpers.php"
"exclude-from-classmap": [
"/Tests/"
]
},
"autoload-dev": {
"psr-4": {
"Flasher\\Tests\\": "tests/"
"Flasher\\Toastr\\Symfony\\Tests\\": "Tests/"
}
},
"config": {
"preferred-install": "dist",
"sort-packages": true
},
"extra": {
"phpstan": {
"includes": [
"extension.neon"
]
},
"laravel": {
"providers": [
"Flasher\\Laravel\\FlasherServiceProvider",
"Flasher\\Noty\\Laravel\\FlasherNotyServiceProvider",
"Flasher\\Notyf\\Laravel\\FlasherNotyfServiceProvider",
"Flasher\\SweetAlert\\Laravel\\FlasherSweetAlertServiceProvider",
"Flasher\\Toastr\\Laravel\\FlasherToastrServiceProvider"
],
"aliases": {
"Flasher": "Flasher\\Laravel\\Facade\\Flasher",
"Noty": "Flasher\\Noty\\Laravel\\Facade\\Noty",
"Notyf": "Flasher\\Notyf\\Laravel\\Facade\\Notyf",
"SweetAlert": "Flasher\\SweetAlert\\Laravel\\Facade\\SweetAlert",
"Toastr": "Flasher\\Toastr\\Laravel\\Facade\\Toastr"
}
}
}
"minimum-stability": "dev",
"prefer-stable": true
}
+75
View File
@@ -0,0 +1,75 @@
{
"name": "php-flasher/flasher-toastr-symfony",
"type": "symfony-bundle",
"description": "PHP Flasher Symfony adapter for Toastr",
"keywords": [
"yoeunes",
"notify",
"php",
"laravel",
"symfony",
"Lumen",
"notifications",
"messages",
"alerts",
"pnotify",
"toastr ",
"bundle",
"flex"
],
"homepage": "https://php-flasher.github.io/",
"authors": [
{
"name": "Younes Khoubza",
"email": "younes.khoubza@gmail.com",
"homepage": "https://github.com/yoeunes",
"role": "Developer"
}
],
"license": "MIT",
"repositories": [
{
"type": "path",
"url": "../../Symfony",
"options": {
"symlink": true
}
},
{
"type": "path",
"url": "../Prime",
"options": {
"symlink": true
}
}
],
"require": {
"php": ">=5.3",
"php-flasher/flasher-symfony": "@dev",
"php-flasher/flasher-toastr": "@dev"
},
"require-dev": {
"phpunit/phpunit": "^4.8|^5.0|^6.0|^7.0|^8.0|^9.0"
},
"autoload": {
"psr-4": {
"Flasher\\Toastr\\Symfony\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"autoload-dev": {
"psr-4": {
"Flasher\\Toastr\\Symfony\\Tests\\": "Tests/"
}
},
"config": {
"sort-packages": true,
"platform": {
"php": "5.3.10"
}
},
"minimum-stability": "dev",
"prefer-stable": true
}
Generated
-10973
View File
File diff suppressed because it is too large Load Diff
-18
View File
@@ -1,18 +0,0 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2
[docker-compose.yml]
indent_size = 4
-64
View File
@@ -1,64 +0,0 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:mNtM4UEOfGE4dx7IAH4+kx4iPYPdGeu+Gaw/PIcF4II=
APP_DEBUG=true
APP_TIMEZONE=UTC
APP_URL=http://localhost
APP_LOCALE=en
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US
APP_MAINTENANCE_DRIVER=file
APP_MAINTENANCE_STORE=database
BCRYPT_ROUNDS=12
LOG_CHANNEL=stack
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null
BROADCAST_CONNECTION=log
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database
CACHE_STORE=database
CACHE_PREFIX=
MEMCACHED_HOST=127.0.0.1
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=log
MAIL_HOST=127.0.0.1
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
VITE_APP_NAME="${APP_NAME}"
-64
View File
@@ -1,64 +0,0 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_TIMEZONE=UTC
APP_URL=http://localhost
APP_LOCALE=en
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US
APP_MAINTENANCE_DRIVER=file
APP_MAINTENANCE_STORE=database
BCRYPT_ROUNDS=12
LOG_CHANNEL=stack
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null
BROADCAST_CONNECTION=log
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database
CACHE_STORE=database
CACHE_PREFIX=
MEMCACHED_HOST=127.0.0.1
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=log
MAIL_HOST=127.0.0.1
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
VITE_APP_NAME="${APP_NAME}"
-11
View File
@@ -1,11 +0,0 @@
* text=auto eol=lf
*.blade.php diff=html
*.css diff=css
*.html diff=html
*.md diff=markdown
*.php diff=php
/.github export-ignore
CHANGELOG.md export-ignore
.styleci.yml export-ignore
-19
View File
@@ -1,19 +0,0 @@
/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/vendor/flasher
/public/storage
/storage/*.key
/vendor
.env.backup
.env.production
.phpunit.result.cache
Homestead.json
Homestead.yaml
auth.json
npm-debug.log
yarn-error.log
/.fleet
/.idea
/.vscode
-1
View File
@@ -1 +0,0 @@
8.2
-1
View File
@@ -1 +0,0 @@
php=php@8.2
-66
View File
@@ -1,66 +0,0 @@
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
<p align="center">
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
</p>
## About Laravel
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
- [Simple, fast routing engine](https://laravel.com/docs/routing).
- [Powerful dependency injection container](https://laravel.com/docs/container).
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
- [Robust background job processing](https://laravel.com/docs/queues).
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
Laravel is accessible, powerful, and provides tools required for large, robust applications.
## Learning Laravel
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch.
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
## Laravel Sponsors
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com).
### Premium Partners
- **[Vehikl](https://vehikl.com/)**
- **[Tighten Co.](https://tighten.co)**
- **[WebReinvent](https://webreinvent.com/)**
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
- **[64 Robots](https://64robots.com)**
- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**
- **[Cyber-Duck](https://cyber-duck.co.uk)**
- **[DevSquad](https://devsquad.com/hire-laravel-developers)**
- **[Jump24](https://jump24.co.uk)**
- **[Redberry](https://redberry.international/laravel/)**
- **[Active Logic](https://activelogic.com)**
- **[byte5](https://byte5.de)**
- **[OP.GG](https://op.gg)**
## Contributing
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
## Code of Conduct
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
## Security Vulnerabilities
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
## License
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
-15
View File
@@ -1,15 +0,0 @@
<?php
namespace App\Entity;
readonly class Book
{
public function __construct(private string $title)
{
}
public function getFlashIdentifier(): string
{
return sprintf('"%s" book', $this->title);
}
}
@@ -1,8 +0,0 @@
<?php
namespace App\Http\Controllers;
abstract class Controller
{
//
}
@@ -1,54 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DashboardController extends Controller
{
/**
* Show the dashboard with overview of PHPFlasher features
*/
public function index()
{
flash()->option('timeout', 10000)
->info('Welcome to the PHPFlasher Laravel Demo! 👋 Explore different examples using the navigation.');
return view('dashboard');
}
/**
* Show all notification types at once
*/
public function showAllTypes()
{
flash()->success('This is a success notification!');
flash()->info('This is an information notification!');
flash()->warning('This is a warning notification!');
flash()->error('This is an error notification!');
return redirect()->back();
}
/**
* Show theme selector
*/
public function themeSelector()
{
return view('features.themes');
}
/**
* Display a notification with the selected theme
*/
public function showTheme(Request $request)
{
$theme = $request->input('theme', 'default');
flash()
->use("theme.$theme")
->success("This notification uses the '$theme' theme!");
return redirect()->route('themes');
}
}
@@ -1,99 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class ExampleController extends Controller
{
/**
* Form validation example
*/
public function formExample()
{
return view('examples.form');
}
/**
* Process form submission
*/
public function processForm(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|min:2|max:50',
'email' => 'required|email',
'subject' => 'required|min:5',
'message' => 'required|min:10',
]);
if ($validator->fails()) {
flash()->error('Please fix the errors in the form!');
return redirect()->back()
->withErrors($validator)
->withInput();
}
// Success scenario
flash()
->success('Your message has been sent successfully!')
->option('timeout', 8000);
return redirect()->route('form.example');
}
/**
* AJAX example page
*/
public function ajaxExample()
{
return view('examples.ajax');
}
/**
* Process AJAX request
*/
public function processAjax(Request $request)
{
$action = $request->input('action');
$success = rand(0, 10) > 3; // 70% success rate
if ($success) {
flash()->success("The $action action was completed successfully!");
return response()->json(['status' => 'success']);
} else {
flash()->error("The $action action failed. Please try again.");
return response()->json(['status' => 'error'], 422);
}
}
/**
* Demonstrate different notification positions
*/
public function positionsExample()
{
return view('examples.positions');
}
/**
* Show notification at specified position
*/
public function showAtPosition(Request $request)
{
$position = $request->input('position', 'top-right');
flash()
->option('position', $position)
->info("This notification appears at the '$position' position!");
return redirect()->route('positions.example');
}
/**
* Interactive playground to test notification options
*/
public function playground()
{
return view('examples.playground');
}
}
@@ -1,42 +0,0 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Inertia\Middleware;
class HandleInertiaRequests extends Middleware
{
/**
* The root template that's loaded on the first page visit.
*
* @see https://inertiajs.com/server-side-setup#root-template
*
* @var string
*/
protected $rootView = 'app';
/**
* Determines the current asset version.
*
* @see https://inertiajs.com/asset-versioning
*/
public function version(Request $request): ?string
{
return parent::version($request);
}
/**
* Define the props that are shared by default.
*
* @see https://inertiajs.com/shared-data
*
* @return array<string, mixed>
*/
public function share(Request $request): array
{
return array_merge(parent::share($request), [
//
]);
}
}
-29
View File
@@ -1,29 +0,0 @@
<?php
namespace App\Livewire;
use Livewire\Component;
class Counter extends Component
{
public $count = 1;
public function increment()
{
flash()->success('increment');
$this->count++;
}
public function decrement()
{
flash()->info('decrement');
$this->count--;
}
public function render()
{
return view('livewire.counter');
}
}
-31
View File
@@ -1,31 +0,0 @@
<?php
namespace App\Livewire;
use Livewire\Attributes\On;
use Livewire\Component;
class Eventous extends Component
{
public function render()
{
return <<<'HTML'
<div>
<button wire:click="delete">delete</button>
</div>
HTML;
}
public function delete()
{
sweetalert()
->showDenyButton()
->info('confirm or deny action');
}
#[On('sweetalert:confirmed')]
public function onSweetalertConfirmed(array $payload): void
{
toastr()->success('sweetalert was confirmed');
}
}
-47
View File
@@ -1,47 +0,0 @@
<?php
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
}
@@ -1,24 +0,0 @@
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
//
}
}
-15
View File
@@ -1,15 +0,0 @@
#!/usr/bin/env php
<?php
use Symfony\Component\Console\Input\ArgvInput;
define('LARAVEL_START', microtime(true));
// Register the Composer autoloader...
require __DIR__.'/vendor/autoload.php';
// Bootstrap Laravel and handle the command...
$status = (require_once __DIR__.'/bootstrap/app.php')
->handleCommand(new ArgvInput);
exit($status);
-24
View File
@@ -1,24 +0,0 @@
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Support\Facades\Route;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
then: function () {
Route::middleware('web')->group(base_path('routes/issues.php'));
},
)
->withMiddleware(function (Middleware $middleware) {
$middleware->web(append: [
App\Http\Middleware\HandleInertiaRequests::class,
]);
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
-2
View File
@@ -1,2 +0,0 @@
*
!.gitignore
-5
View File
@@ -1,5 +0,0 @@
<?php
return [
App\Providers\AppServiceProvider::class,
];
-87
View File
@@ -1,87 +0,0 @@
{
"name": "laravel/laravel",
"type": "project",
"description": "The skeleton application for the Laravel framework.",
"keywords": ["laravel", "framework"],
"license": "MIT",
"repositories": [
{
"type": "path",
"url": "../..",
"options": {
"symlink": true
}
}
],
"require": {
"php": "^8.2",
"inertiajs/inertia-laravel": "^2.0.1",
"laravel/framework": "^12.3",
"laravel/tinker": "^2.10.1",
"livewire/livewire": "^3.6.2",
"php-flasher/php-flasher": "@dev",
"spatie/laravel-csp": "^2.10.3",
"spatie/laravel-ray": "^1.40.2"
},
"require-dev": {
"barryvdh/laravel-debugbar": "^3.15.2",
"fakerphp/faker": "^1.24.1",
"larastan/larastan": "^3.2",
"laravel/pint": "^1.21.2",
"laravel/sail": "^1.41",
"mockery/mockery": "^1.6.12",
"nunomaduro/collision": "^8.7.0",
"pestphp/pest": "^3.7.4",
"pestphp/pest-plugin-laravel": "^3.1",
"spatie/laravel-ignition": "^2.9.1",
"spatie/ray": "^1.41.6"
},
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi",
"@php artisan flasher:install"
],
"post-update-cmd": [
"@php artisan vendor:publish --tag=laravel-assets --ansi --force",
"@php artisan flasher:install"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\"",
"@php artisan flasher:install"
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi",
"@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
"@php artisan migrate --graceful --ansi"
]
},
"extra": {
"laravel": {
"dont-discover": []
}
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true,
"allow-plugins": {
"pestphp/pest-plugin": true,
"php-http/discovery": true
}
},
"minimum-stability": "stable",
"prefer-stable": true
}
-12359
View File
File diff suppressed because it is too large Load Diff
-126
View File
@@ -1,126 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Application Name
|--------------------------------------------------------------------------
|
| This value is the name of your application, which will be used when the
| framework needs to place the application's name in a notification or
| other UI elements where an application name needs to be displayed.
|
*/
'name' => env('APP_NAME', 'Laravel'),
/*
|--------------------------------------------------------------------------
| Application Environment
|--------------------------------------------------------------------------
|
| This value determines the "environment" your application is currently
| running in. This may determine how you prefer to configure various
| services the application utilizes. Set this in your ".env" file.
|
*/
'env' => env('APP_ENV', 'production'),
/*
|--------------------------------------------------------------------------
| Application Debug Mode
|--------------------------------------------------------------------------
|
| When your application is in debug mode, detailed error messages with
| stack traces will be shown on every error that occurs within your
| application. If disabled, a simple generic error page is shown.
|
*/
'debug' => (bool) env('APP_DEBUG', false),
/*
|--------------------------------------------------------------------------
| Application URL
|--------------------------------------------------------------------------
|
| This URL is used by the console to properly generate URLs when using
| the Artisan command line tool. You should set this to the root of
| the application so that it's available within Artisan commands.
|
*/
'url' => env('APP_URL', 'http://localhost'),
/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. The timezone
| is set to "UTC" by default as it is suitable for most use cases.
|
*/
'timezone' => env('APP_TIMEZONE', 'UTC'),
/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by Laravel's translation / localization methods. This option can be
| set to any locale for which you plan to have translation strings.
|
*/
'locale' => env('APP_LOCALE', 'en'),
'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),
'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'),
/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| This key is utilized by Laravel's encryption services and should be set
| to a random, 32 character string to ensure that all encrypted values
| are secure. You should do this prior to deploying the application.
|
*/
'cipher' => 'AES-256-CBC',
'key' => env('APP_KEY'),
'previous_keys' => [
...array_filter(
explode(',', env('APP_PREVIOUS_KEYS', ''))
),
],
/*
|--------------------------------------------------------------------------
| Maintenance Mode Driver
|--------------------------------------------------------------------------
|
| These configuration options determine the driver used to determine and
| manage Laravel's "maintenance mode" status. The "cache" driver will
| allow maintenance mode to be controlled across multiple machines.
|
| Supported drivers: "file", "cache"
|
*/
'maintenance' => [
'driver' => env('APP_MAINTENANCE_DRIVER', 'file'),
'store' => env('APP_MAINTENANCE_STORE', 'database'),
],
];
-115
View File
@@ -1,115 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Defaults
|--------------------------------------------------------------------------
|
| This option defines the default authentication "guard" and password
| reset "broker" for your application. You may change these values
| as required, but they're a perfect start for most applications.
|
*/
'defaults' => [
'guard' => env('AUTH_GUARD', 'web'),
'passwords' => env('AUTH_PASSWORD_BROKER', 'users'),
],
/*
|--------------------------------------------------------------------------
| Authentication Guards
|--------------------------------------------------------------------------
|
| Next, you may define every authentication guard for your application.
| Of course, a great default configuration has been defined for you
| which utilizes session storage plus the Eloquent user provider.
|
| All authentication guards have a user provider, which defines how the
| users are actually retrieved out of your database or other storage
| system used by the application. Typically, Eloquent is utilized.
|
| Supported: "session"
|
*/
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
],
/*
|--------------------------------------------------------------------------
| User Providers
|--------------------------------------------------------------------------
|
| All authentication guards have a user provider, which defines how the
| users are actually retrieved out of your database or other storage
| system used by the application. Typically, Eloquent is utilized.
|
| If you have multiple user tables or models you may configure multiple
| providers to represent the model / table. These providers may then
| be assigned to any extra authentication guards you have defined.
|
| Supported: "database", "eloquent"
|
*/
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => env('AUTH_MODEL', App\Models\User::class),
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
/*
|--------------------------------------------------------------------------
| Resetting Passwords
|--------------------------------------------------------------------------
|
| These configuration options specify the behavior of Laravel's password
| reset functionality, including the table utilized for token storage
| and the user provider that is invoked to actually retrieve users.
|
| The expiry time is the number of minutes that each reset token will be
| considered valid. This security feature keeps tokens short-lived so
| they have less time to be guessed. You may change this as needed.
|
| The throttle setting is the number of seconds a user must wait before
| generating more password reset tokens. This prevents the user from
| quickly generating a very large amount of password reset tokens.
|
*/
'passwords' => [
'users' => [
'provider' => 'users',
'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'),
'expire' => 60,
'throttle' => 60,
],
],
/*
|--------------------------------------------------------------------------
| Password Confirmation Timeout
|--------------------------------------------------------------------------
|
| Here you may define the amount of seconds before a password confirmation
| window expires and users are asked to re-enter their password via the
| confirmation screen. By default, the timeout lasts for three hours.
|
*/
'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800),
];
-107
View File
@@ -1,107 +0,0 @@
<?php
use Illuminate\Support\Str;
return [
/*
|--------------------------------------------------------------------------
| Default Cache Store
|--------------------------------------------------------------------------
|
| This option controls the default cache store that will be used by the
| framework. This connection is utilized if another isn't explicitly
| specified when running a cache operation inside the application.
|
*/
'default' => env('CACHE_STORE', 'database'),
/*
|--------------------------------------------------------------------------
| Cache Stores
|--------------------------------------------------------------------------
|
| Here you may define all of the cache "stores" for your application as
| well as their drivers. You may even define multiple stores for the
| same cache driver to group types of items stored in your caches.
|
| Supported drivers: "apc", "array", "database", "file", "memcached",
| "redis", "dynamodb", "octane", "null"
|
*/
'stores' => [
'array' => [
'driver' => 'array',
'serialize' => false,
],
'database' => [
'driver' => 'database',
'table' => env('DB_CACHE_TABLE', 'cache'),
'connection' => env('DB_CACHE_CONNECTION'),
'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'),
],
'file' => [
'driver' => 'file',
'path' => storage_path('framework/cache/data'),
'lock_path' => storage_path('framework/cache/data'),
],
'memcached' => [
'driver' => 'memcached',
'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
'sasl' => [
env('MEMCACHED_USERNAME'),
env('MEMCACHED_PASSWORD'),
],
'options' => [
// Memcached::OPT_CONNECT_TIMEOUT => 2000,
],
'servers' => [
[
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
'port' => env('MEMCACHED_PORT', 11211),
'weight' => 100,
],
],
],
'redis' => [
'driver' => 'redis',
'connection' => env('REDIS_CACHE_CONNECTION', 'cache'),
'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'),
],
'dynamodb' => [
'driver' => 'dynamodb',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
'endpoint' => env('DYNAMODB_ENDPOINT'),
],
'octane' => [
'driver' => 'octane',
],
],
/*
|--------------------------------------------------------------------------
| Cache Key Prefix
|--------------------------------------------------------------------------
|
| When utilizing the APC, database, memcached, Redis, and DynamoDB cache
| stores, there might be other applications using the same cache. For
| that reason, you may prefix every cache key to avoid collisions.
|
*/
'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'),
];
-170
View File
@@ -1,170 +0,0 @@
<?php
use Illuminate\Support\Str;
return [
/*
|--------------------------------------------------------------------------
| Default Database Connection Name
|--------------------------------------------------------------------------
|
| Here you may specify which of the database connections below you wish
| to use as your default connection for database operations. This is
| the connection which will be utilized unless another connection
| is explicitly specified when you execute a query / statement.
|
*/
'default' => env('DB_CONNECTION', 'sqlite'),
/*
|--------------------------------------------------------------------------
| Database Connections
|--------------------------------------------------------------------------
|
| Below are all of the database connections defined for your application.
| An example configuration is provided for each database system which
| is supported by Laravel. You're free to add / remove connections.
|
*/
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'url' => env('DB_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
'mysql' => [
'driver' => 'mysql',
'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'mariadb' => [
'driver' => 'mariadb',
'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'charset' => env('DB_CHARSET', 'utf8'),
'prefix' => '',
'prefix_indexes' => true,
'search_path' => 'public',
'sslmode' => 'prefer',
],
'sqlsrv' => [
'driver' => 'sqlsrv',
'url' => env('DB_URL'),
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'laravel'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'charset' => env('DB_CHARSET', 'utf8'),
'prefix' => '',
'prefix_indexes' => true,
// 'encrypt' => env('DB_ENCRYPT', 'yes'),
// 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
],
],
/*
|--------------------------------------------------------------------------
| Migration Repository Table
|--------------------------------------------------------------------------
|
| This table keeps track of all the migrations that have already run for
| your application. Using this information, we can determine which of
| the migrations on disk haven't actually been run on the database.
|
*/
'migrations' => [
'table' => 'migrations',
'update_date_on_publish' => true,
],
/*
|--------------------------------------------------------------------------
| Redis Databases
|--------------------------------------------------------------------------
|
| Redis is an open source, fast, and advanced key-value store that also
| provides a richer body of commands than a typical key-value system
| such as Memcached. You may define your connection settings here.
|
*/
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
],
];
-76
View File
@@ -1,76 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Filesystem Disk
|--------------------------------------------------------------------------
|
| Here you may specify the default filesystem disk that should be used
| by the framework. The "local" disk, as well as a variety of cloud
| based disks are available to your application for file storage.
|
*/
'default' => env('FILESYSTEM_DISK', 'local'),
/*
|--------------------------------------------------------------------------
| Filesystem Disks
|--------------------------------------------------------------------------
|
| Below you may configure as many filesystem disks as necessary, and you
| may even configure multiple disks for the same driver. Examples for
| most supported storage drivers are configured here for reference.
|
| Supported Drivers: "local", "ftp", "sftp", "s3"
|
*/
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
'throw' => false,
],
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
'throw' => false,
],
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
'throw' => false,
],
],
/*
|--------------------------------------------------------------------------
| Symbolic Links
|--------------------------------------------------------------------------
|
| Here you may configure the symbolic links that will be created when the
| `storage:link` Artisan command is executed. The array keys should be
| the locations of the links and the values should be their targets.
|
*/
'links' => [
public_path('storage') => storage_path('app/public'),
],
];
-64
View File
@@ -1,64 +0,0 @@
<?php
declare(strict_types=1);
use Flasher\Prime\Configuration;
/*
* Default PHPFlasher configuration for Laravel.
*
* This configuration file defines the default settings for PHPFlasher when
* used within a Laravel application. It uses the Configuration class from
* the core PHPFlasher library to establish type-safe configuration.
*
* @return array<string, mixed> PHPFlasher configuration
*/
return Configuration::from([
// Default notification library (e.g., 'flasher', 'toastr', 'noty', 'notyf', 'sweetalert')
'default' => 'flasher',
// Path to the main PHPFlasher JavaScript file
'main_script' => '/vendor/flasher/flasher.min.js',
// List of CSS files to style your notifications
'styles' => [
'/vendor/flasher/flasher.min.css',
],
// Set global options for all notifications (optional)
// 'options' => [
// 'timeout' => 5000, // Time in milliseconds before the notification disappears
// 'position' => 'top-right', // Where the notification appears on the screen
// ],
// Automatically inject JavaScript and CSS assets into your HTML pages
'inject_assets' => true,
// Enable message translation using Laravel's translation service
'translate' => true,
// URL patterns to exclude from asset injection and flash_bag conversion
'excluded_paths' => [],
// Map Laravel flash message keys to notification types
'flash_bag' => [
'success' => ['success'],
'error' => ['error', 'danger'],
'warning' => ['warning', 'alarm'],
'info' => ['info', 'notice', 'alert'],
],
// Set criteria to filter which notifications are displayed (optional)
// 'filter' => [
// 'limit' => 5, // Maximum number of notifications to show at once
// ],
// Define notification presets to simplify notification creation (optional)
// 'presets' => [
// 'entity_saved' => [
// 'type' => 'success',
// 'title' => 'Entity saved',
// 'message' => 'Entity saved successfully',
// ],
// ],
]);
-132
View File
@@ -1,132 +0,0 @@
<?php
use Monolog\Handler\NullHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;
use Monolog\Processor\PsrLogMessageProcessor;
return [
/*
|--------------------------------------------------------------------------
| Default Log Channel
|--------------------------------------------------------------------------
|
| This option defines the default log channel that is utilized to write
| messages to your logs. The value provided here should match one of
| the channels present in the list of "channels" configured below.
|
*/
'default' => env('LOG_CHANNEL', 'stack'),
/*
|--------------------------------------------------------------------------
| Deprecations Log Channel
|--------------------------------------------------------------------------
|
| This option controls the log channel that should be used to log warnings
| regarding deprecated PHP and library features. This allows you to get
| your application ready for upcoming major versions of dependencies.
|
*/
'deprecations' => [
'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
'trace' => env('LOG_DEPRECATIONS_TRACE', false),
],
/*
|--------------------------------------------------------------------------
| Log Channels
|--------------------------------------------------------------------------
|
| Here you may configure the log channels for your application. Laravel
| utilizes the Monolog PHP logging library, which includes a variety
| of powerful log handlers and formatters that you're free to use.
|
| Available Drivers: "single", "daily", "slack", "syslog",
| "errorlog", "monolog", "custom", "stack"
|
*/
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => explode(',', env('LOG_STACK', 'single')),
'ignore_exceptions' => false,
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'replace_placeholders' => true,
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => env('LOG_DAILY_DAYS', 14),
'replace_placeholders' => true,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'),
'emoji' => env('LOG_SLACK_EMOJI', ':boom:'),
'level' => env('LOG_LEVEL', 'critical'),
'replace_placeholders' => true,
],
'papertrail' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
'handler_with' => [
'host' => env('PAPERTRAIL_URL'),
'port' => env('PAPERTRAIL_PORT'),
'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
],
'processors' => [PsrLogMessageProcessor::class],
],
'stderr' => [
'driver' => 'monolog',
'level' => env('LOG_LEVEL', 'debug'),
'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [
'stream' => 'php://stderr',
],
'processors' => [PsrLogMessageProcessor::class],
],
'syslog' => [
'driver' => 'syslog',
'level' => env('LOG_LEVEL', 'debug'),
'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER),
'replace_placeholders' => true,
],
'errorlog' => [
'driver' => 'errorlog',
'level' => env('LOG_LEVEL', 'debug'),
'replace_placeholders' => true,
],
'null' => [
'driver' => 'monolog',
'handler' => NullHandler::class,
],
'emergency' => [
'path' => storage_path('logs/laravel.log'),
],
],
];
-103
View File
@@ -1,103 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Mailer
|--------------------------------------------------------------------------
|
| This option controls the default mailer that is used to send all email
| messages unless another mailer is explicitly specified when sending
| the message. All additional mailers can be configured within the
| "mailers" array. Examples of each type of mailer are provided.
|
*/
'default' => env('MAIL_MAILER', 'log'),
/*
|--------------------------------------------------------------------------
| Mailer Configurations
|--------------------------------------------------------------------------
|
| Here you may configure all of the mailers used by your application plus
| their respective settings. Several examples have been configured for
| you and you are free to add your own as your application requires.
|
| Laravel supports a variety of mail "transport" drivers that can be used
| when delivering an email. You may specify which one you're using for
| your mailers below. You may also add additional mailers if needed.
|
| Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2",
| "postmark", "log", "array", "failover", "roundrobin"
|
*/
'mailers' => [
'smtp' => [
'transport' => 'smtp',
'url' => env('MAIL_URL'),
'host' => env('MAIL_HOST', '127.0.0.1'),
'port' => env('MAIL_PORT', 2525),
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'timeout' => null,
'local_domain' => env('MAIL_EHLO_DOMAIN'),
],
'ses' => [
'transport' => 'ses',
],
'postmark' => [
'transport' => 'postmark',
// 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'),
// 'client' => [
// 'timeout' => 5,
// ],
],
'sendmail' => [
'transport' => 'sendmail',
'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),
],
'log' => [
'transport' => 'log',
'channel' => env('MAIL_LOG_CHANNEL'),
],
'array' => [
'transport' => 'array',
],
'failover' => [
'transport' => 'failover',
'mailers' => [
'smtp',
'log',
],
],
],
/*
|--------------------------------------------------------------------------
| Global "From" Address
|--------------------------------------------------------------------------
|
| You may wish for all emails sent by your application to be sent from
| the same address. Here you may specify a name and address that is
| used globally for all emails that are sent by your application.
|
*/
'from' => [
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
'name' => env('MAIL_FROM_NAME', 'Example'),
],
];
-112
View File
@@ -1,112 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Queue Connection Name
|--------------------------------------------------------------------------
|
| Laravel's queue supports a variety of backends via a single, unified
| API, giving you convenient access to each backend using identical
| syntax for each. The default queue connection is defined below.
|
*/
'default' => env('QUEUE_CONNECTION', 'database'),
/*
|--------------------------------------------------------------------------
| Queue Connections
|--------------------------------------------------------------------------
|
| Here you may configure the connection options for every queue backend
| used by your application. An example configuration is provided for
| each backend supported by Laravel. You're also free to add more.
|
| Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
|
*/
'connections' => [
'sync' => [
'driver' => 'sync',
],
'database' => [
'driver' => 'database',
'connection' => env('DB_QUEUE_CONNECTION'),
'table' => env('DB_QUEUE_TABLE', 'jobs'),
'queue' => env('DB_QUEUE', 'default'),
'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90),
'after_commit' => false,
],
'beanstalkd' => [
'driver' => 'beanstalkd',
'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'),
'queue' => env('BEANSTALKD_QUEUE', 'default'),
'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90),
'block_for' => 0,
'after_commit' => false,
],
'sqs' => [
'driver' => 'sqs',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
'queue' => env('SQS_QUEUE', 'default'),
'suffix' => env('SQS_SUFFIX'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'after_commit' => false,
],
'redis' => [
'driver' => 'redis',
'connection' => env('REDIS_QUEUE_CONNECTION', 'default'),
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90),
'block_for' => null,
'after_commit' => false,
],
],
/*
|--------------------------------------------------------------------------
| Job Batching
|--------------------------------------------------------------------------
|
| The following options configure the database and table that store job
| batching information. These options can be updated to any database
| connection and table which has been defined by your application.
|
*/
'batching' => [
'database' => env('DB_CONNECTION', 'sqlite'),
'table' => 'job_batches',
],
/*
|--------------------------------------------------------------------------
| Failed Queue Jobs
|--------------------------------------------------------------------------
|
| These options configure the behavior of failed queue job logging so you
| can control how and where failed jobs are stored. Laravel ships with
| support for storing failed jobs in a simple file or in a database.
|
| Supported drivers: "database-uuids", "dynamodb", "file", "null"
|
*/
'failed' => [
'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
'database' => env('DB_CONNECTION', 'sqlite'),
'table' => 'failed_jobs',
],
];
-34
View File
@@ -1,34 +0,0 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Third Party Services
|--------------------------------------------------------------------------
|
| This file is for storing the credentials for third party services such
| as Mailgun, Postmark, AWS and more. This file provides the de facto
| location for this type of information, allowing packages to have
| a conventional file to locate the various service credentials.
|
*/
'postmark' => [
'token' => env('POSTMARK_TOKEN'),
],
'ses' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],
'slack' => [
'notifications' => [
'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
],
],
];
-218
View File
@@ -1,218 +0,0 @@
<?php
use Illuminate\Support\Str;
return [
/*
|--------------------------------------------------------------------------
| Default Session Driver
|--------------------------------------------------------------------------
|
| This option determines the default session driver that is utilized for
| incoming requests. Laravel supports a variety of storage options to
| persist session data. Database storage is a great default choice.
|
| Supported: "file", "cookie", "database", "apc",
| "memcached", "redis", "dynamodb", "array"
|
*/
'driver' => env('SESSION_DRIVER', 'database'),
/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to expire immediately when the browser is closed then you may
| indicate that via the expire_on_close configuration option.
|
*/
'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
/*
|--------------------------------------------------------------------------
| Session Encryption
|--------------------------------------------------------------------------
|
| This option allows you to easily specify that all of your session data
| should be encrypted before it's stored. All encryption is performed
| automatically by Laravel and you may use the session like normal.
|
*/
'encrypt' => env('SESSION_ENCRYPT', false),
/*
|--------------------------------------------------------------------------
| Session File Location
|--------------------------------------------------------------------------
|
| When utilizing the "file" session driver, the session files are placed
| on disk. The default storage location is defined here; however, you
| are free to provide another location where they should be stored.
|
*/
'files' => storage_path('framework/sessions'),
/*
|--------------------------------------------------------------------------
| Session Database Connection
|--------------------------------------------------------------------------
|
| When using the "database" or "redis" session drivers, you may specify a
| connection that should be used to manage these sessions. This should
| correspond to a connection in your database configuration options.
|
*/
'connection' => env('SESSION_CONNECTION'),
/*
|--------------------------------------------------------------------------
| Session Database Table
|--------------------------------------------------------------------------
|
| When using the "database" session driver, you may specify the table to
| be used to store sessions. Of course, a sensible default is defined
| for you; however, you're welcome to change this to another table.
|
*/
'table' => env('SESSION_TABLE', 'sessions'),
/*
|--------------------------------------------------------------------------
| Session Cache Store
|--------------------------------------------------------------------------
|
| When using one of the framework's cache driven session backends, you may
| define the cache store which should be used to store the session data
| between requests. This must match one of your defined cache stores.
|
| Affects: "apc", "dynamodb", "memcached", "redis"
|
*/
'store' => env('SESSION_STORE'),
/*
|--------------------------------------------------------------------------
| Session Sweeping Lottery
|--------------------------------------------------------------------------
|
| Some session drivers must manually sweep their storage location to get
| rid of old sessions from storage. Here are the chances that it will
| happen on a given request. By default, the odds are 2 out of 100.
|
*/
'lottery' => [2, 100],
/*
|--------------------------------------------------------------------------
| Session Cookie Name
|--------------------------------------------------------------------------
|
| Here you may change the name of the session cookie that is created by
| the framework. Typically, you should not need to change this value
| since doing so does not grant a meaningful security improvement.
|
|
*/
'cookie' => env(
'SESSION_COOKIE',
Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
),
/*
|--------------------------------------------------------------------------
| Session Cookie Path
|--------------------------------------------------------------------------
|
| The session cookie path determines the path for which the cookie will
| be regarded as available. Typically, this will be the root path of
| your application, but you're free to change this when necessary.
|
*/
'path' => env('SESSION_PATH', '/'),
/*
|--------------------------------------------------------------------------
| Session Cookie Domain
|--------------------------------------------------------------------------
|
| This value determines the domain and subdomains the session cookie is
| available to. By default, the cookie will be available to the root
| domain and all subdomains. Typically, this shouldn't be changed.
|
*/
'domain' => env('SESSION_DOMAIN'),
/*
|--------------------------------------------------------------------------
| HTTPS Only Cookies
|--------------------------------------------------------------------------
|
| By setting this option to true, session cookies will only be sent back
| to the server if the browser has a HTTPS connection. This will keep
| the cookie from being sent to you when it can't be done securely.
|
*/
'secure' => env('SESSION_SECURE_COOKIE'),
/*
|--------------------------------------------------------------------------
| HTTP Access Only
|--------------------------------------------------------------------------
|
| Setting this value to true will prevent JavaScript from accessing the
| value of the cookie and the cookie will only be accessible through
| the HTTP protocol. It's unlikely you should disable this option.
|
*/
'http_only' => env('SESSION_HTTP_ONLY', true),
/*
|--------------------------------------------------------------------------
| Same-Site Cookies
|--------------------------------------------------------------------------
|
| This option determines how your cookies behave when cross-site requests
| take place, and can be used to mitigate CSRF attacks. By default, we
| will set this value to "lax" to permit secure cross-site requests.
|
| See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value
|
| Supported: "lax", "strict", "none", null
|
*/
'same_site' => env('SESSION_SAME_SITE', 'lax'),
/*
|--------------------------------------------------------------------------
| Partitioned Cookies
|--------------------------------------------------------------------------
|
| Setting this value to true will tie the cookie to the top-level site for
| a cross-site context. Partitioned cookies are accepted by the browser
| when flagged "secure" and the Same-Site attribute is set to "none".
|
*/
'partitioned' => env('SESSION_PARTITIONED_COOKIE', false),
];
-1
View File
@@ -1 +0,0 @@
*.sqlite*
@@ -1,44 +0,0 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
*/
class UserFactory extends Factory
{
/**
* The current password being used by the factory.
*/
protected static ?string $password;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => static::$password ??= Hash::make('password'),
'remember_token' => Str::random(10),
];
}
/**
* Indicate that the model's email address should be unverified.
*/
public function unverified(): static
{
return $this->state(fn (array $attributes) => [
'email_verified_at' => null,
]);
}
}
@@ -1,49 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
Schema::create('password_reset_tokens', function (Blueprint $table) {
$table->string('email')->primary();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->foreignId('user_id')->nullable()->index();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->longText('payload');
$table->integer('last_activity')->index();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('users');
Schema::dropIfExists('password_reset_tokens');
Schema::dropIfExists('sessions');
}
};
@@ -1,35 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('cache', function (Blueprint $table) {
$table->string('key')->primary();
$table->mediumText('value');
$table->integer('expiration');
});
Schema::create('cache_locks', function (Blueprint $table) {
$table->string('key')->primary();
$table->string('owner');
$table->integer('expiration');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('cache');
Schema::dropIfExists('cache_locks');
}
};
@@ -1,57 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('jobs', function (Blueprint $table) {
$table->id();
$table->string('queue')->index();
$table->longText('payload');
$table->unsignedTinyInteger('attempts');
$table->unsignedInteger('reserved_at')->nullable();
$table->unsignedInteger('available_at');
$table->unsignedInteger('created_at');
});
Schema::create('job_batches', function (Blueprint $table) {
$table->string('id')->primary();
$table->string('name');
$table->integer('total_jobs');
$table->integer('pending_jobs');
$table->integer('failed_jobs');
$table->longText('failed_job_ids');
$table->mediumText('options')->nullable();
$table->integer('cancelled_at')->nullable();
$table->integer('created_at');
$table->integer('finished_at')->nullable();
});
Schema::create('failed_jobs', function (Blueprint $table) {
$table->id();
$table->string('uuid')->unique();
$table->text('connection');
$table->text('queue');
$table->longText('payload');
$table->longText('exception');
$table->timestamp('failed_at')->useCurrent();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('jobs');
Schema::dropIfExists('job_batches');
Schema::dropIfExists('failed_jobs');
}
};
@@ -1,23 +0,0 @@
<?php
namespace Database\Seeders;
use App\Models\User;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
// User::factory(10)->create();
User::factory()->create([
'name' => 'Test User',
'email' => 'test@example.com',
]);
}
}
-13
View File
@@ -1,13 +0,0 @@
{
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build"
},
"devDependencies": {
"axios": "^1.6.4",
"laravel-vite-plugin": "^1.0",
"vite": "^5.0"
}
}
-7
View File
@@ -1,7 +0,0 @@
includes:
- vendor/larastan/larastan/extension.neon
parameters:
level: 9
paths:
- routes/
-21
View File
@@ -1,21 +0,0 @@
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
View File
-17
View File
@@ -1,17 +0,0 @@
<?php
use Illuminate\Http\Request;
define('LARAVEL_START', microtime(true));
// Determine if the application is in maintenance mode...
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
require $maintenance;
}
// Register the Composer autoloader...
require __DIR__.'/../vendor/autoload.php';
// Bootstrap Laravel and handle the request...
(require_once __DIR__.'/../bootstrap/app.php')
->handleRequest(Request::capture());
-2
View File
@@ -1,2 +0,0 @@
User-agent: *
Disallow:
View File
-1
View File
@@ -1 +0,0 @@
import './bootstrap';
-4
View File
@@ -1,4 +0,0 @@
import axios from 'axios';
window.axios = axios;
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
@@ -1,22 +0,0 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ $title ?? 'Page Title' }}</title>
</head>
<body>
<ul>
<li><a href="/">/</a></li>
<li><a href="/adapter/flasher">/adapter/flasher</a></li>
<li><a href="/adapter/noty">/adapter/noty</a></li>
<li><a href="/adapter/notyf">/adapter/notyf</a></li>
<li><a href="/adapter/sweetalert">/adapter/sweetalert</a></li>
<li><a href="/adapter/toastr">/adapter/toastr</a></li>
<li><a href="/livewire/counter">/adapter/livewire/counter</a></li>
<li><a href="/livewire/eventous">/adapter/livewire/eventous</a></li>
</ul>
{{ $slot }}
</body>
</html>
@@ -1,83 +0,0 @@
@extends('layouts.app')
@section('title', 'PHPFlasher Laravel Demo')
@section('content')
<div class="max-w-7xl mx-auto">
<div class="bg-white rounded-xl shadow-md overflow-hidden">
<div class="p-8">
<div class="uppercase tracking-wide text-sm text-indigo-600 font-semibold">Laravel Demo</div>
<h2 class="mt-2 text-3xl font-extrabold tracking-tight text-gray-900">Welcome to PHPFlasher</h2>
<p class="mt-4 text-lg text-gray-500">
PHPFlasher is a powerful notification library for PHP applications.
This demo shows how to use PHPFlasher in a Laravel project.
</p>
<div class="mt-8 grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
<!-- Feature Cards -->
<div class="bg-indigo-50 p-6 rounded-lg">
<div class="text-indigo-600 mb-2">
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z" />
</svg>
</div>
<h3 class="font-bold text-lg mb-2">Easy Integration</h3>
<p class="text-gray-600">Simple API to create notifications from anywhere in your Laravel application.</p>
</div>
<div class="bg-emerald-50 p-6 rounded-lg">
<div class="text-emerald-600 mb-2">
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01" />
</svg>
</div>
<h3 class="font-bold text-lg mb-2">Multiple Themes</h3>
<p class="text-gray-600">Choose from 15+ beautiful themes or create your own custom themes.</p>
</div>
<div class="bg-amber-50 p-6 rounded-lg">
<div class="text-amber-600 mb-2">
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z" />
</svg>
</div>
<h3 class="font-bold text-lg mb-2">Flexible Positioning</h3>
<p class="text-gray-600">Display notifications at any corner or side of your screen.</p>
</div>
</div>
<div class="mt-10">
<h3 class="text-lg font-medium text-gray-900">Try It Now</h3>
<div class="mt-4 flex flex-wrap gap-2">
<a href="{{ route('all.types') }}" class="btn-primary">
Show All Notification Types
</a>
<a href="{{ route('themes') }}" class="btn-outline">
Explore Themes
</a>
</div>
</div>
<div class="mt-10">
<h3 class="text-lg font-medium text-gray-900">Code Example</h3>
<div class="mt-4 code-block">
<div class="code-header">
<span>Basic Usage</span>
</div>
<pre><code class="language-php">// Display a success notification
flash()->success('Item created successfully!');
// Display an error notification
flash()->error('An error occurred!');
// Display a warning notification
flash()->warning('Warning: This action cannot be undone.');
// Display an info notification
flash()->info('The task is running in the background.');</code></pre>
</div>
</div>
</div>
</div>
</div>
@endsection

Some files were not shown because too many files have changed in this diff Show More