From c2aaeb82c930cef8a2cfe27106025c9066e00e41 Mon Sep 17 00:00:00 2001 From: Roel Reijneveld Date: Sat, 14 Nov 2020 14:09:46 +0100 Subject: [PATCH] Initial commit --- .editorconfig | 15 +++++ .gitattributes | 14 ++++ .gitignore | 12 ++++ .php_cs.dist | 37 +++++++++++ CHANGELOG.md | 7 ++ LICENSE.md | 21 ++++++ README.md | 60 ++++++++++++++++++ composer.json | 56 ++++++++++++++++ fortify-preset-image.png | Bin 0 -> 61944 bytes fortify-preset-screenshot.png | Bin 0 -> 22807 bytes phpunit.xml.dist | 31 +++++++++ psalm.xml.dist | 16 +++++ src/Commands/FortifyUIPresetCommand.php | 24 +++++++ src/FortifyUIPresetServiceProvider.php | 23 +++++++ .../views/auth/confirm-password.blade.php | 36 +++++++++++ .../views/auth/forgot-password.blade.php | 40 ++++++++++++ stubs/resources/views/auth/login.blade.php | 52 +++++++++++++++ stubs/resources/views/auth/register.blade.php | 49 ++++++++++++++ .../views/auth/reset-password.blade.php | 42 ++++++++++++ .../views/auth/two-factor-challenge.blade.php | 47 ++++++++++++++ .../views/auth/verify-email.blade.php | 29 +++++++++ stubs/resources/views/home.blade.php | 31 +++++++++ stubs/resources/views/layouts/app.blade.php | 15 +++++ .../two-factor-authentication-form.blade.php | 52 +++++++++++++++ .../profile/update-password-form.blade.php | 27 ++++++++ .../update-profile-information-form.blade.php | 22 +++++++ tests/ExampleTest.php | 12 ++++ tests/TestCase.php | 20 ++++++ 28 files changed, 790 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .php_cs.dist create mode 100644 CHANGELOG.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 composer.json create mode 100644 fortify-preset-image.png create mode 100644 fortify-preset-screenshot.png create mode 100644 phpunit.xml.dist create mode 100644 psalm.xml.dist create mode 100644 src/Commands/FortifyUIPresetCommand.php create mode 100644 src/FortifyUIPresetServiceProvider.php create mode 100644 stubs/resources/views/auth/confirm-password.blade.php create mode 100644 stubs/resources/views/auth/forgot-password.blade.php create mode 100644 stubs/resources/views/auth/login.blade.php create mode 100644 stubs/resources/views/auth/register.blade.php create mode 100644 stubs/resources/views/auth/reset-password.blade.php create mode 100644 stubs/resources/views/auth/two-factor-challenge.blade.php create mode 100644 stubs/resources/views/auth/verify-email.blade.php create mode 100644 stubs/resources/views/home.blade.php create mode 100644 stubs/resources/views/layouts/app.blade.php create mode 100644 stubs/resources/views/profile/two-factor-authentication-form.blade.php create mode 100644 stubs/resources/views/profile/update-password-form.blade.php create mode 100644 stubs/resources/views/profile/update-profile-information-form.blade.php create mode 100644 tests/ExampleTest.php create mode 100644 tests/TestCase.php diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..a7c44dd --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +indent_size = 4 +indent_style = space +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..02419b4 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,14 @@ +# Path-based git attributes +# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html + +# Ignore all test and documentation with "export-ignore". +/.gitattributes export-ignore +/.gitignore export-ignore +/.travis.yml export-ignore +/phpunit.xml.dist export-ignore +/tests export-ignore +/.editorconfig export-ignore +/.php_cs.dist export-ignore +/.github export-ignore +/psalm.xml export-ignore + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c4b8a3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +.idea +.php_cs +.php_cs.cache +.phpunit.result.cache +build +composer.lock +coverage +docs +phpunit.xml +psalm.xml +vendor +.DS_Store diff --git a/.php_cs.dist b/.php_cs.dist new file mode 100644 index 0000000..1c4e7d5 --- /dev/null +++ b/.php_cs.dist @@ -0,0 +1,37 @@ +notPath('bootstrap/*') + ->notPath('storage/*') + ->notPath('resources/view/mail/*') + ->in([ + __DIR__ . '/src', + __DIR__ . '/tests', + ]) + ->name('*.php') + ->notName('*.blade.php') + ->ignoreDotFiles(true) + ->ignoreVCS(true); + +return PhpCsFixer\Config::create() + ->setRules([ + '@PSR2' => true, + 'array_syntax' => ['syntax' => 'short'], + 'ordered_imports' => ['sortAlgorithm' => 'alpha'], + 'no_unused_imports' => true, + 'not_operator_with_successor_space' => true, + 'trailing_comma_in_multiline_array' => true, + 'phpdoc_scalar' => true, + 'unary_operator_spaces' => true, + 'binary_operator_spaces' => true, + 'blank_line_before_statement' => [ + 'statements' => ['break', 'continue', 'declare', 'return', 'throw', 'try'], + ], + 'phpdoc_single_line_var_spacing' => true, + 'phpdoc_var_without_name' => true, + 'method_argument_space' => [ + 'on_multiline' => 'ensure_fully_multiline', + 'keep_multiple_spaces_after_comma' => true, + ] + ]) + ->setFinder($finder); diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..7577be8 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +All notable changes to `fortify-ui-preset` will be documented in this file + +## 1.0.0 - 202X-XX-XX + +- initial release diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..920845b --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Your Name + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..137be47 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +

+ +# Using this template + +Here are the steps to customize this template with your preset + +- Rename the files in the `src` directory. Example `FortifyUIBootstrapCommand.php` + - Make sure you update any `use` statements and namespaces +- Add your preset stubs to the `stubs` directory +- Add your preset image and preset screenshots +- Update the `composer.json` + - Replace all instances of `YourNamespace\\FortifyUIPreset` with your details. For example: `SomeDude\\FortifyUIBootstrap` +- Search & Replace all of the following terms + - YourNamespace + - yournamespace + - YourPreset + - yourpreset + - SomeFramework + - Your Name + - yourusername + - you@yourdomain.com + + +# Introduction + +**YourPreset** is a Laravel Fortify UI preset, built with SomeFramework. + +- [Requirements](#requirements) +- [Installation](#installation) + + +## Requirements + +This package requires Laravel Fortify and FortifyUI. Installing [*FortifyUI*](https://github.com/zacksmash/fortify-ui) will automatically install and configure Laravel Fortify for you, so you may start there. + + +## Installation + +To get started, you'll need to install **YourPreset** using Composer. + +```bash +composer require yournamespace/fortify-yourpreset +``` + +Next, you'll need to run the install command: + +```bash +php artisan fortify-ui:yourpreset +``` + +This command will publish **YourPreset's** views and resources to your project. + +- All `auth` views +- Other files... + +

+ +## License + +**FortifyUIPreset** is open-sourced software licensed under the [MIT license](LICENSE.md). diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..3f933a5 --- /dev/null +++ b/composer.json @@ -0,0 +1,56 @@ +{ + "name": "yournamespace/fortify-yourpreset", + "description": "Fortify-driven Laravel UI replacement", + "keywords": [ + "fortify-ui" + ], + "homepage": "https://github.com/yourusername/fortify-yourpreset", + "license": "MIT", + "authors": [ + { + "name": "Your Name", + "email": "you@yourdomain.com", + "homepage": "https://yourusername.github.io", + "role": "Developer" + } + ], + "require": { + "php": "^7.4", + "illuminate/contracts": "^8.0", + "zacksmash/fortify-ui": "^1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.16", + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.3", + "vimeo/psalm": "^3.11" + }, + "autoload": { + "psr-4": { + "YourNamespace\\FortifyUIPreset\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "YourNamespace\\FortifyUIPreset\\Tests\\": "tests" + } + }, + "scripts": { + "psalm": "vendor/bin/psalm", + "test": "vendor/bin/phpunit --colors=always", + "test-coverage": "vendor/bin/phpunit --coverage-html coverage", + "format": "vendor/bin/php-cs-fixer fix --allow-risky=yes" + }, + "config": { + "sort-packages": true + }, + "extra": { + "laravel": { + "providers": [ + "YourNamespace\\FortifyUIPreset\\FortifyUIPresetServiceProvider" + ] + } + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/fortify-preset-image.png b/fortify-preset-image.png new file mode 100644 index 0000000000000000000000000000000000000000..a45713e9f480bd0915e0873b5e5f6829383aa9ae GIT binary patch literal 61944 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 Z+V{vyx4&>lxRn1M`})9-R{SH9^auP!P38aq literal 0 HcmV?d00001 diff --git a/fortify-preset-screenshot.png b/fortify-preset-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..800cd0928589e560a03104bcfe6482631d3e6bdf GIT binary patch literal 22807 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 literal 0 HcmV?d00001 diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..bbf1419 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + tests + + + + + ./src + + + + + + + + + + + diff --git a/psalm.xml.dist b/psalm.xml.dist new file mode 100644 index 0000000..c6df33e --- /dev/null +++ b/psalm.xml.dist @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/src/Commands/FortifyUIPresetCommand.php b/src/Commands/FortifyUIPresetCommand.php new file mode 100644 index 0000000..821dd7b --- /dev/null +++ b/src/Commands/FortifyUIPresetCommand.php @@ -0,0 +1,24 @@ +publishAssets(); + + $this->comment('YourPreset is now installed.'); + } + + protected function publishAssets() + { + $this->callSilent('vendor:publish', ['--tag' => 'fortify-ui-preset-resources', '--force' => true]); + } +} diff --git a/src/FortifyUIPresetServiceProvider.php b/src/FortifyUIPresetServiceProvider.php new file mode 100644 index 0000000..e173d1c --- /dev/null +++ b/src/FortifyUIPresetServiceProvider.php @@ -0,0 +1,23 @@ +app->runningInConsole()) { + $this->publishes([ + __DIR__ . '/../stubs/resources/views' => base_path('resources/views'), + // Add more resources here + ], 'fortify-ui-preset-resources'); + + $this->commands([ + FortifyUIPresetCommand::class, + ]); + } + } +} diff --git a/stubs/resources/views/auth/confirm-password.blade.php b/stubs/resources/views/auth/confirm-password.blade.php new file mode 100644 index 0000000..984c3d9 --- /dev/null +++ b/stubs/resources/views/auth/confirm-password.blade.php @@ -0,0 +1,36 @@ +@extends('layouts.app') + +@section('content') + @if ($errors->any()) +
+
{{ __('Whoops! Something went wrong.') }}
+ +
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ @csrf + +
+ + +
+ +
+ +
+ + @if (Route::has('password.request')) + + {{ __('Forgot Your Password?') }} + + @endif +
+@endsection diff --git a/stubs/resources/views/auth/forgot-password.blade.php b/stubs/resources/views/auth/forgot-password.blade.php new file mode 100644 index 0000000..8e81622 --- /dev/null +++ b/stubs/resources/views/auth/forgot-password.blade.php @@ -0,0 +1,40 @@ +@extends('layouts.app') + +@section('content') +
+ {{ __('Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.') }} +
+ + @if (session('status')) +
+ {{ session('status') }} +
+ @endif + + @if ($errors->any()) +
+
{{ __('Whoops! Something went wrong.') }}
+ +
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ @csrf + +
+ + +
+ +
+ +
+
+@endsection diff --git a/stubs/resources/views/auth/login.blade.php b/stubs/resources/views/auth/login.blade.php new file mode 100644 index 0000000..e1657e4 --- /dev/null +++ b/stubs/resources/views/auth/login.blade.php @@ -0,0 +1,52 @@ +@extends('layouts.app') + +@section('content') + @if (session('status')) +
+ {{ session('status') }} +
+ @endif + + @if ($errors->any()) +
+
{{ __('Whoops! Something went wrong.') }}
+ +
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ @csrf + +
+ + +
+ +
+ + +
+ +
+ + +
+ + @if (Route::has('password.request')) + + {{ __('Forgot your password?') }} + + @endif + +
+ +
+
+@endsection diff --git a/stubs/resources/views/auth/register.blade.php b/stubs/resources/views/auth/register.blade.php new file mode 100644 index 0000000..56b8356 --- /dev/null +++ b/stubs/resources/views/auth/register.blade.php @@ -0,0 +1,49 @@ +@extends('layouts.app') + +@section('content') + @if ($errors->any()) +
+
{{ __('Whoops! Something went wrong.') }}
+ +
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ @csrf + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + {{ __('Already registered?') }} + + +
+ +
+
+@endsection diff --git a/stubs/resources/views/auth/reset-password.blade.php b/stubs/resources/views/auth/reset-password.blade.php new file mode 100644 index 0000000..2de121a --- /dev/null +++ b/stubs/resources/views/auth/reset-password.blade.php @@ -0,0 +1,42 @@ +@extends('layouts.app') + +@section('content') + @if ($errors->any()) +
+
{{ __('Whoops! Something went wrong.') }}
+ +
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ @csrf + + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+@endsection diff --git a/stubs/resources/views/auth/two-factor-challenge.blade.php b/stubs/resources/views/auth/two-factor-challenge.blade.php new file mode 100644 index 0000000..438fea9 --- /dev/null +++ b/stubs/resources/views/auth/two-factor-challenge.blade.php @@ -0,0 +1,47 @@ +@if ($errors->any()) +
+
{{ __('Whoops! Something went wrong.') }}
+ +
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+@endif + +
+ @csrf + + {{-- + Do not show both of these fields, together. It's recommended + that you only show one field at a time and use some logic + to toggle the visibility of each field + --}} + +
+ {{ __('Please confirm access to your account by entering the authentication code provided by your authenticator application.') }} +
+ +
+ + +
+ + {{-- ** OR ** --}} + +
+ {{ __('Please confirm access to your account by entering one of your emergency recovery codes.') }} +
+ +
+ + +
+ +
+ +
+
diff --git a/stubs/resources/views/auth/verify-email.blade.php b/stubs/resources/views/auth/verify-email.blade.php new file mode 100644 index 0000000..91270a8 --- /dev/null +++ b/stubs/resources/views/auth/verify-email.blade.php @@ -0,0 +1,29 @@ +@extends('layouts.app') + +@section('content') +
+ {{ __('Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn\'t receive the email, we will gladly send you another.') }} +
+ + @if (session('status') == 'verification-link-sent') +
+ {{ __('A new verification link has been sent to the email address you provided during registration.') }} +
+ @endif + +
+ @csrf + + +
+ +
+ @csrf + + +
+@endsection diff --git a/stubs/resources/views/home.blade.php b/stubs/resources/views/home.blade.php new file mode 100644 index 0000000..6ae81d6 --- /dev/null +++ b/stubs/resources/views/home.blade.php @@ -0,0 +1,31 @@ +@extends('layouts.app') + +@section('content') + @if (session('status')) +
{{ session('status') }}
+ @endif + +
You are logged in!
+ +
+ @csrf + + +
+ +
+ + @if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::updateProfileInformation())) + @include('profile.update-profile-information-form') + @endif + + @if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::updatePasswords())) + @include('profile.update-password-form') + @endif + + @if (Laravel\Fortify\Features::enabled(Laravel\Fortify\Features::twoFactorAuthentication())) + @include('profile.two-factor-authentication-form') + @endif +@endsection diff --git a/stubs/resources/views/layouts/app.blade.php b/stubs/resources/views/layouts/app.blade.php new file mode 100644 index 0000000..86e2533 --- /dev/null +++ b/stubs/resources/views/layouts/app.blade.php @@ -0,0 +1,15 @@ + + + + + + + + + + {{ config('app.name', 'Laravel') }} + + + @yield('content') + + diff --git a/stubs/resources/views/profile/two-factor-authentication-form.blade.php b/stubs/resources/views/profile/two-factor-authentication-form.blade.php new file mode 100644 index 0000000..3429898 --- /dev/null +++ b/stubs/resources/views/profile/two-factor-authentication-form.blade.php @@ -0,0 +1,52 @@ +@if(! auth()->user()->two_factor_secret) + {{-- Enable 2FA --}} +
+ @csrf + + +
+@else + {{-- Disable 2FA --}} +
+ @csrf + @method('DELETE') + + +
+ + @if(session('status') == 'two-factor-authentication-enabled') + {{-- Show SVG QR Code, After Enabling 2FA --}} +
+ {{ __('Two factor authentication is now enabled. Scan the following QR code using your phone\'s authenticator application.') }} +
+ +
+ {!! auth()->user()->twoFactorQrCodeSvg() !!} +
+ @endif + + {{-- Show 2FA Recovery Codes --}} +
+ {{ __('Store these recovery codes in a secure password manager. They can be used to recover access to your account if your two factor authentication device is lost.') }} +
+ +
+ @foreach (json_decode(decrypt(auth()->user()->two_factor_recovery_codes), true) as $code) +
{{ $code }}
+ @endforeach +
+ + {{-- Regenerate 2FA Recovery Codes --}} +
+ @csrf + + +
+@endif +
diff --git a/stubs/resources/views/profile/update-password-form.blade.php b/stubs/resources/views/profile/update-password-form.blade.php new file mode 100644 index 0000000..72c16e1 --- /dev/null +++ b/stubs/resources/views/profile/update-password-form.blade.php @@ -0,0 +1,27 @@ +
+ @csrf + @method('PUT') + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ +
diff --git a/stubs/resources/views/profile/update-profile-information-form.blade.php b/stubs/resources/views/profile/update-profile-information-form.blade.php new file mode 100644 index 0000000..6e2ff01 --- /dev/null +++ b/stubs/resources/views/profile/update-profile-information-form.blade.php @@ -0,0 +1,22 @@ +
+ @csrf + @method('PUT') + +
+ + +
+ +
+ + +
+ +
+ +
+
+ +
diff --git a/tests/ExampleTest.php b/tests/ExampleTest.php new file mode 100644 index 0000000..3105839 --- /dev/null +++ b/tests/ExampleTest.php @@ -0,0 +1,12 @@ +assertTrue(true); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..0237dbe --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,20 @@ +