| @@ -0,0 +1,15 @@ | |||||
| root = true | |||||
| [*] | |||||
| charset = utf-8 | |||||
| end_of_line = lf | |||||
| insert_final_newline = true | |||||
| indent_style = space | |||||
| indent_size = 4 | |||||
| trim_trailing_whitespace = true | |||||
| [*.md] | |||||
| trim_trailing_whitespace = false | |||||
| [*.yml] | |||||
| indent_size = 2 | |||||
| @@ -0,0 +1,6 @@ | |||||
| * text=auto eol=lf | |||||
| /.github export-ignore | |||||
| .scrutinizer.yml export-ignore | |||||
| BACKERS.md export-ignore | |||||
| CONTRIBUTING.md export-ignore | |||||
| CHANGELOG.md export-ignore | |||||
| @@ -0,0 +1,5 @@ | |||||
| /vendor | |||||
| /.idea | |||||
| /.vscode | |||||
| /.vagrant | |||||
| .phpunit.result.cache | |||||
| @@ -0,0 +1,40 @@ | |||||
| <a href="https://supportukrainenow.org/"><img src="https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner-direct.svg" width="100%"></a> | |||||
| ------ | |||||
| <p align="center"> | |||||
| <img title="Laravel Zero" height="100" src="https://raw.githubusercontent.com/laravel-zero/docs/master/images/logo/laravel-zero-readme.png" /> | |||||
| </p> | |||||
| <p align="center"> | |||||
| <a href="https://github.com/laravel-zero/framework/actions"><img src="https://github.com/laravel-zero/laravel-zero/actions/workflows/tests.yml/badge.svg" alt="Build Status"></img></a> | |||||
| <a href="https://packagist.org/packages/laravel-zero/framework"><img src="https://img.shields.io/packagist/dt/laravel-zero/framework.svg" alt="Total Downloads"></a> | |||||
| <a href="https://packagist.org/packages/laravel-zero/framework"><img src="https://img.shields.io/packagist/v/laravel-zero/framework.svg?label=stable" alt="Latest Stable Version"></a> | |||||
| <a href="https://packagist.org/packages/laravel-zero/framework"><img src="https://img.shields.io/packagist/l/laravel-zero/framework.svg" alt="License"></a> | |||||
| </p> | |||||
| <h4> <center>This is a <bold>community project</bold> and not an official Laravel one </center></h4> | |||||
| Laravel Zero was created by [Nuno Maduro](https://github.com/nunomaduro) and [Owen Voke](https://github.com/owenvoke), and is a micro-framework that provides an elegant starting point for your console application. It is an **unofficial** and customized version of Laravel optimized for building command-line applications. | |||||
| - Built on top of the [Laravel](https://laravel.com) components. | |||||
| - Optional installation of Laravel [Eloquent](https://laravel-zero.com/docs/database/), Laravel [Logging](https://laravel-zero.com/docs/logging/) and many others. | |||||
| - Supports interactive [menus](https://laravel-zero.com/docs/build-interactive-menus/) and [desktop notifications](https://laravel-zero.com/docs/send-desktop-notifications/) on Linux, Windows & MacOS. | |||||
| - Ships with a [Scheduler](https://laravel-zero.com/docs/task-scheduling/) and a [Standalone Compiler](https://laravel-zero.com/docs/build-a-standalone-application/). | |||||
| - Integration with [Collision](https://github.com/nunomaduro/collision) - Beautiful error reporting | |||||
| ------ | |||||
| ## Documentation | |||||
| For full documentation, visit [laravel-zero.com](https://laravel-zero.com/). | |||||
| ## Support the development | |||||
| **Do you like this project? Support it by donating** | |||||
| - PayPal: [Donate](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L) | |||||
| - Patreon: [Donate](https://www.patreon.com/nunomaduro) | |||||
| ## License | |||||
| Laravel Zero is an open-source software licensed under the MIT license. | |||||
| @@ -0,0 +1,47 @@ | |||||
| <?php | |||||
| namespace App\Commands; | |||||
| use Illuminate\Console\Scheduling\Schedule; | |||||
| use LaravelZero\Framework\Commands\Command; | |||||
| use function Termwind\{render}; | |||||
| class InspireCommand extends Command | |||||
| { | |||||
| /** | |||||
| * The signature of the command. | |||||
| * | |||||
| * @var string | |||||
| */ | |||||
| protected $signature = 'inspire {name=Artisan}'; | |||||
| /** | |||||
| * The description of the command. | |||||
| * | |||||
| * @var string | |||||
| */ | |||||
| protected $description = 'Display an inspiring quote'; | |||||
| /** | |||||
| * Execute the console command. | |||||
| */ | |||||
| public function handle(): void | |||||
| { | |||||
| render(<<<'HTML' | |||||
| <div class="py-1 ml-2"> | |||||
| <div class="px-1 bg-blue-300 text-black">Laravel Zero</div> | |||||
| <em class="ml-1"> | |||||
| Simplicity is the ultimate sophistication. | |||||
| </em> | |||||
| </div> | |||||
| HTML); | |||||
| } | |||||
| /** | |||||
| * Define the command's schedule. | |||||
| */ | |||||
| public function schedule(Schedule $schedule): void | |||||
| { | |||||
| // $schedule->command(static::class)->everyMinute(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| <?php | |||||
| namespace App\Providers; | |||||
| use Illuminate\Support\ServiceProvider; | |||||
| class AppServiceProvider extends ServiceProvider | |||||
| { | |||||
| /** | |||||
| * Bootstrap any application services. | |||||
| */ | |||||
| public function boot(): void | |||||
| { | |||||
| // | |||||
| } | |||||
| /** | |||||
| * Register any application services. | |||||
| */ | |||||
| public function register(): void | |||||
| { | |||||
| // | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,53 @@ | |||||
| #!/usr/bin/env php | |||||
| <?php | |||||
| define('LARAVEL_START', microtime(true)); | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Register The Auto Loader | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Composer provides a convenient, automatically generated class loader | |||||
| | for our application. We just need to utilize it! We'll require it | |||||
| | into the script here so that we do not have to worry about the | |||||
| | loading of any our classes "manually". Feels great to relax. | |||||
| | | |||||
| */ | |||||
| $autoloader = require file_exists(__DIR__.'/vendor/autoload.php') ? __DIR__.'/vendor/autoload.php' : __DIR__.'/../../autoload.php'; | |||||
| $app = require_once __DIR__.'/bootstrap/app.php'; | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Run The Artisan Application | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | When we run the console application, the current CLI command will be | |||||
| | executed in this console and the response sent back to a terminal | |||||
| | or another output device for the developers. Here goes nothing! | |||||
| | | |||||
| */ | |||||
| $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class); | |||||
| $status = $kernel->handle( | |||||
| $input = new Symfony\Component\Console\Input\ArgvInput, | |||||
| new Symfony\Component\Console\Output\ConsoleOutput | |||||
| ); | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Shutdown The Application | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Once Artisan has finished running, we will fire off the shutdown events | |||||
| | so that any final work may be done by the application before we shut | |||||
| | down the process. This is the last thing to happen to the request. | |||||
| | | |||||
| */ | |||||
| $kernel->terminate($input, $status); | |||||
| exit($status); | |||||
| @@ -0,0 +1,50 @@ | |||||
| <?php | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Create The Application | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | The first thing we will do is create a new Laravel application instance | |||||
| | which serves as the "glue" for all the components of Laravel, and is | |||||
| | the IoC container for the system binding all of the various parts. | |||||
| | | |||||
| */ | |||||
| $app = new LaravelZero\Framework\Application( | |||||
| dirname(__DIR__) | |||||
| ); | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Bind Important Interfaces | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Next, we need to bind some important interfaces into the container so | |||||
| | we will be able to resolve them when needed. The kernels serve the | |||||
| | incoming requests to this application from both the web and CLI. | |||||
| | | |||||
| */ | |||||
| $app->singleton( | |||||
| Illuminate\Contracts\Console\Kernel::class, | |||||
| LaravelZero\Framework\Kernel::class | |||||
| ); | |||||
| $app->singleton( | |||||
| Illuminate\Contracts\Debug\ExceptionHandler::class, | |||||
| Illuminate\Foundation\Exceptions\Handler::class | |||||
| ); | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Return The Application | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | This script returns the application instance. The instance is given to | |||||
| | the calling script so we can separate the building of the instances | |||||
| | from the actual running of the application and sending responses. | |||||
| | | |||||
| */ | |||||
| return $app; | |||||
| @@ -0,0 +1,18 @@ | |||||
| { | |||||
| "chmod": "0755", | |||||
| "directories": [ | |||||
| "app", | |||||
| "bootstrap", | |||||
| "config", | |||||
| "vendor" | |||||
| ], | |||||
| "files": [ | |||||
| "composer.json" | |||||
| ], | |||||
| "exclude-composer-files": false, | |||||
| "compression": "GZ", | |||||
| "compactors": [ | |||||
| "KevinGH\\Box\\Compactor\\Php", | |||||
| "KevinGH\\Box\\Compactor\\Json" | |||||
| ] | |||||
| } | |||||
| @@ -0,0 +1,51 @@ | |||||
| { | |||||
| "name": "laravel-zero/laravel-zero", | |||||
| "description": "The Laravel Zero Framework.", | |||||
| "keywords": ["framework", "laravel", "laravel zero", "console", "cli"], | |||||
| "homepage": "https://laravel-zero.com", | |||||
| "type": "project", | |||||
| "license": "MIT", | |||||
| "support": { | |||||
| "issues": "https://github.com/laravel-zero/laravel-zero/issues", | |||||
| "source": "https://github.com/laravel-zero/laravel-zero" | |||||
| }, | |||||
| "authors": [ | |||||
| { | |||||
| "name": "Nuno Maduro", | |||||
| "email": "enunomaduro@gmail.com" | |||||
| } | |||||
| ], | |||||
| "require": { | |||||
| "php": "^8.1", | |||||
| "laravel-zero/framework": "^10.0.2", | |||||
| "nunomaduro/termwind": "^1.15.1" | |||||
| }, | |||||
| "require-dev": { | |||||
| "laravel/pint": "^1.8", | |||||
| "mockery/mockery": "^1.5.1", | |||||
| "pestphp/pest": "^2.5" | |||||
| }, | |||||
| "autoload": { | |||||
| "psr-4": { | |||||
| "App\\": "app/", | |||||
| "Database\\Factories\\": "database/factories/", | |||||
| "Database\\Seeders\\": "database/seeders/" | |||||
| } | |||||
| }, | |||||
| "autoload-dev": { | |||||
| "psr-4": { | |||||
| "Tests\\": "tests/" | |||||
| } | |||||
| }, | |||||
| "config": { | |||||
| "preferred-install": "dist", | |||||
| "sort-packages": true, | |||||
| "optimize-autoloader": true, | |||||
| "allow-plugins": { | |||||
| "pestphp/pest-plugin": true | |||||
| } | |||||
| }, | |||||
| "minimum-stability": "stable", | |||||
| "prefer-stable": true, | |||||
| "bin": ["application"] | |||||
| } | |||||
| @@ -0,0 +1,73 @@ | |||||
| <?php | |||||
| return [ | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Application Name | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | This value is the name of your application. This value is used when the | |||||
| | framework needs to place the application's name in a notification or | |||||
| | any other location as required by the application or its packages. | |||||
| | | |||||
| */ | |||||
| 'name' => 'Application', | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Application Version | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | This value determines the "version" your application is currently running | |||||
| | in. You may want to follow the "Semantic Versioning" - Given a version | |||||
| | number MAJOR.MINOR.PATCH when an update happens: https://semver.org. | |||||
| | | |||||
| */ | |||||
| 'version' => app('git.version'), | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | 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. This can be overridden using | |||||
| | the global command line "--env" option when calling commands. | |||||
| | | |||||
| */ | |||||
| 'env' => 'development', | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Application Timezone | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Here you may specify the default timezone for your application, which | |||||
| | will be used by the PHP date and date-time functions. We have gone | |||||
| | ahead and set this to a sensible default for you out of the box. | |||||
| | | |||||
| */ | |||||
| 'timezone' => 'UTC', | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Autoloaded Service Providers | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | The service providers listed here will be automatically loaded on the | |||||
| | request to your application. Feel free to add your own services to | |||||
| | this array to grant expanded functionality to your applications. | |||||
| | | |||||
| */ | |||||
| 'providers' => [ | |||||
| App\Providers\AppServiceProvider::class, | |||||
| ], | |||||
| ]; | |||||
| @@ -0,0 +1,83 @@ | |||||
| <?php | |||||
| return [ | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Default Command | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Laravel Zero will always run the command specified below when no command name is | |||||
| | provided. Consider update the default command for single command applications. | |||||
| | You cannot pass arguments to the default command because they are ignored. | |||||
| | | |||||
| */ | |||||
| 'default' => NunoMaduro\LaravelConsoleSummary\SummaryCommand::class, | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Commands Paths | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | This value determines the "paths" that should be loaded by the console's | |||||
| | kernel. Foreach "path" present on the array provided below the kernel | |||||
| | will extract all "Illuminate\Console\Command" based class commands. | |||||
| | | |||||
| */ | |||||
| 'paths' => [app_path('Commands')], | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Added Commands | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | You may want to include a single command class without having to load an | |||||
| | entire folder. Here you can specify which commands should be added to | |||||
| | your list of commands. The console's kernel will try to load them. | |||||
| | | |||||
| */ | |||||
| 'add' => [ | |||||
| // .. | |||||
| ], | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Hidden Commands | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Your application commands will always be visible on the application list | |||||
| | of commands. But you can still make them "hidden" specifying an array | |||||
| | of commands below. All "hidden" commands can still be run/executed. | |||||
| | | |||||
| */ | |||||
| 'hidden' => [ | |||||
| NunoMaduro\LaravelConsoleSummary\SummaryCommand::class, | |||||
| Symfony\Component\Console\Command\DumpCompletionCommand::class, | |||||
| Symfony\Component\Console\Command\HelpCommand::class, | |||||
| Illuminate\Console\Scheduling\ScheduleRunCommand::class, | |||||
| Illuminate\Console\Scheduling\ScheduleListCommand::class, | |||||
| Illuminate\Console\Scheduling\ScheduleFinishCommand::class, | |||||
| Illuminate\Foundation\Console\VendorPublishCommand::class, | |||||
| LaravelZero\Framework\Commands\StubPublishCommand::class, | |||||
| ], | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Removed Commands | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | Do you have a service provider that loads a list of commands that | |||||
| | you don't need? No problem. Laravel Zero allows you to specify | |||||
| | below a list of commands that you don't to see in your app. | |||||
| | | |||||
| */ | |||||
| 'remove' => [ | |||||
| // .. | |||||
| ], | |||||
| ]; | |||||
| @@ -0,0 +1,20 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
| xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd" | |||||
| bootstrap="vendor/autoload.php" | |||||
| colors="true" | |||||
| > | |||||
| <testsuites> | |||||
| <testsuite name="Feature"> | |||||
| <directory suffix="Test.php">./tests/Feature</directory> | |||||
| </testsuite> | |||||
| <testsuite name="Unit"> | |||||
| <directory suffix="Test.php">./tests/Unit</directory> | |||||
| </testsuite> | |||||
| </testsuites> | |||||
| <source> | |||||
| <include> | |||||
| <directory suffix=".php">./app</directory> | |||||
| </include> | |||||
| </source> | |||||
| </phpunit> | |||||
| @@ -0,0 +1,21 @@ | |||||
| <?php | |||||
| namespace Tests; | |||||
| use Illuminate\Contracts\Console\Kernel; | |||||
| use Illuminate\Foundation\Application; | |||||
| trait CreatesApplication | |||||
| { | |||||
| /** | |||||
| * Creates the application. | |||||
| */ | |||||
| public function createApplication(): Application | |||||
| { | |||||
| $app = require __DIR__.'/../bootstrap/app.php'; | |||||
| $app->make(Kernel::class)->bootstrap(); | |||||
| return $app; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,5 @@ | |||||
| <?php | |||||
| it('inspires artisans', function () { | |||||
| $this->artisan('inspire')->assertExitCode(0); | |||||
| }); | |||||
| @@ -0,0 +1,45 @@ | |||||
| <?php | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Test Case | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | The closure you provide to your test functions is always bound to a specific PHPUnit test | |||||
| | case class. By default, that class is "PHPUnit\Framework\TestCase". Of course, you may | |||||
| | need to change it using the "uses()" function to bind a different classes or traits. | |||||
| | | |||||
| */ | |||||
| uses(Tests\TestCase::class)->in('Feature'); | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Expectations | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | When you're writing tests, you often need to check that values meet certain conditions. The | |||||
| | "expect()" function gives you access to a set of "expectations" methods that you can use | |||||
| | to assert different things. Of course, you may extend the Expectation API at any time. | |||||
| | | |||||
| */ | |||||
| expect()->extend('toBeOne', function () { | |||||
| return $this->toBe(1); | |||||
| }); | |||||
| /* | |||||
| |-------------------------------------------------------------------------- | |||||
| | Functions | |||||
| |-------------------------------------------------------------------------- | |||||
| | | |||||
| | While Pest is very powerful out-of-the-box, you may have some testing code specific to your | |||||
| | project that you don't want to repeat in every file. Here you can also expose helpers as | |||||
| | global functions to help you to reduce the number of lines of code in your test files. | |||||
| | | |||||
| */ | |||||
| function something(): void | |||||
| { | |||||
| // .. | |||||
| } | |||||
| @@ -0,0 +1,10 @@ | |||||
| <?php | |||||
| namespace Tests; | |||||
| use LaravelZero\Framework\Testing\TestCase as BaseTestCase; | |||||
| abstract class TestCase extends BaseTestCase | |||||
| { | |||||
| use CreatesApplication; | |||||
| } | |||||
| @@ -0,0 +1,5 @@ | |||||
| <?php | |||||
| test('example', function () { | |||||
| expect(true)->toBeTrue(); | |||||
| }); | |||||