├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── .junie └── coding-standards.md ├── README.md ├── app ├── Actions │ └── .gitkeep ├── Enums │ └── .gitkeep ├── Http │ └── Controllers │ │ └── .gitkeep ├── Models │ └── User.php ├── Providers │ └── AppServiceProvider.php └── Services │ └── .gitkeep ├── artisan ├── bootstrap ├── app.php ├── cache │ └── .gitignore └── providers.php ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── cache.php ├── database.php ├── essentials.php ├── filesystems.php ├── logging.php ├── mail.php ├── queue.php ├── services.php └── session.php ├── database ├── .gitignore ├── factories │ └── UserFactory.php ├── migrations │ ├── 0001_01_01_000000_create_users_table.php │ ├── 0001_01_01_000001_create_cache_table.php │ └── 0001_01_01_000002_create_jobs_table.php └── seeders │ └── DatabaseSeeder.php ├── package-lock.json ├── package.json ├── peck.json ├── phpstan.neon ├── phpunit.xml ├── pint.json ├── public ├── .htaccess ├── favicon.ico ├── index.php └── robots.txt ├── rector.php ├── resources ├── css │ └── app.css ├── js │ └── app.js └── views │ └── welcome.blade.php ├── routes ├── console.php └── web.php ├── storage ├── app │ ├── .gitignore │ ├── private │ │ └── .gitignore │ └── public │ │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── tests ├── Feature │ └── .gitkeep ├── Pest.php ├── TestCase.php └── Unit │ ├── Actions │ └── .gitkeep │ ├── ArchTest.php │ ├── Enum │ └── .gitkeep │ ├── Models │ └── UserTest.php │ └── Services │ └── .gitkeep └── vite.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | 17 | [docker-compose.yml] 18 | indent_size = 4 19 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY= 4 | APP_DEBUG=true 5 | APP_URL=http://localhost 6 | 7 | APP_LOCALE=en 8 | APP_FALLBACK_LOCALE=en 9 | APP_FAKER_LOCALE=en_US 10 | 11 | APP_MAINTENANCE_DRIVER=file 12 | # APP_MAINTENANCE_STORE=database 13 | 14 | PHP_CLI_SERVER_WORKERS=4 15 | 16 | BCRYPT_ROUNDS=12 17 | 18 | LOG_CHANNEL=stack 19 | LOG_STACK=single 20 | LOG_DEPRECATIONS_CHANNEL=null 21 | LOG_LEVEL=debug 22 | 23 | DB_CONNECTION=sqlite 24 | # DB_HOST=127.0.0.1 25 | # DB_PORT=3306 26 | # DB_DATABASE=laravel 27 | # DB_USERNAME=root 28 | # DB_PASSWORD= 29 | 30 | SESSION_DRIVER=database 31 | SESSION_LIFETIME=120 32 | SESSION_ENCRYPT=false 33 | SESSION_PATH=/ 34 | SESSION_DOMAIN=null 35 | 36 | BROADCAST_CONNECTION=log 37 | FILESYSTEM_DISK=local 38 | QUEUE_CONNECTION=database 39 | 40 | CACHE_STORE=database 41 | # CACHE_PREFIX= 42 | 43 | MEMCACHED_HOST=127.0.0.1 44 | 45 | REDIS_CLIENT=phpredis 46 | REDIS_HOST=127.0.0.1 47 | REDIS_PASSWORD=null 48 | REDIS_PORT=6379 49 | 50 | MAIL_MAILER=log 51 | MAIL_SCHEME=null 52 | MAIL_HOST=127.0.0.1 53 | MAIL_PORT=2525 54 | MAIL_USERNAME=null 55 | MAIL_PASSWORD=null 56 | MAIL_FROM_ADDRESS="hello@example.com" 57 | MAIL_FROM_NAME="${APP_NAME}" 58 | 59 | AWS_ACCESS_KEY_ID= 60 | AWS_SECRET_ACCESS_KEY= 61 | AWS_DEFAULT_REGION=us-east-1 62 | AWS_BUCKET= 63 | AWS_USE_PATH_STYLE_ENDPOINT=false 64 | 65 | VITE_APP_NAME="${APP_NAME}" 66 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | *.blade.php diff=html 4 | *.css diff=css 5 | *.html diff=html 6 | *.md diff=markdown 7 | *.php diff=php 8 | 9 | /.github export-ignore 10 | CHANGELOG.md export-ignore 11 | .styleci.yml export-ignore 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.phpunit.cache 2 | /node_modules 3 | /public/build 4 | /public/hot 5 | /public/storage 6 | /storage/*.key 7 | /storage/pail 8 | /vendor 9 | .env 10 | .DS_Store 11 | .env.backup 12 | .env.production 13 | .phpactor.json 14 | .phpunit.result.cache 15 | Homestead.json 16 | Homestead.yaml 17 | npm-debug.log 18 | yarn-error.log 19 | /auth.json 20 | /.fleet 21 | /.idea 22 | /.nova 23 | /.vscode 24 | /.zed 25 | -------------------------------------------------------------------------------- /.junie/coding-standards.md: -------------------------------------------------------------------------------- 1 | You are an expert in PHP, Laravel, Pest, and Tailwind. 2 | 3 | 1. Coding Standards 4 | • Use PHP v8.4 features. 5 | • Follow pint.json coding rules. 6 | • Enforce strict types and array shapes via PHPStan. 7 | 8 | 2. Project Structure & Architecture 9 | • Delete .gitkeep when adding a file. 10 | • Stick to existing structure—no new folders. 11 | • Avoid DB::; use Model::query() only. 12 | • No dependency changes without approval. 13 | 14 | 2.1 Directory Conventions 15 | 16 | app/Http/Controllers 17 | • No abstract/base controllers. 18 | 19 | app/Http/Requests 20 | • Use FormRequest for validation. 21 | • Name with Create, Update, Delete. 22 | 23 | app/Actions 24 | • Use Actions pattern and naming verbs. 25 | • Example: 26 | 27 | ```php 28 | public function store(CreateTodoRequest $request, CreateTodoAction $action) 29 | { 30 | $user = $request->user(); 31 | 32 | $action->handle($user, $request->validated()); 33 | } 34 | ``` 35 | 36 | app/Models 37 | • Avoid fillable. 38 | 39 | database/migrations 40 | • Omit down() in new migrations. 41 | 42 | 3. Testing 43 | • Use Pest PHP for all tests. 44 | • Run composer lint after changes. 45 | • Run composer test before finalizing. 46 | • Don’t remove tests without approval. 47 | • All code must be tested. 48 | • Generate a {Model}Factory with each model. 49 | 50 | 3.1 Test Directory Structure 51 | • Console: tests/Feature/Console 52 | • Controllers: tests/Feature/Http 53 | • Actions: tests/Unit/Actions 54 | • Models: tests/Unit/Models 55 | • Jobs: tests/Unit/Jobs 56 | 57 | 4. Styling & UI 58 | • Use Tailwind CSS. 59 | • Keep UI minimal. 60 | 61 | 5. Task Completion Requirements 62 | • Recompile assets after frontend changes. 63 | • Follow all rules before marking tasks complete. 64 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | WORK IN PROGRESS - DONT USE THIS YET 2 | -------------------------------------------------------------------------------- /app/Actions/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunomaduro/laravel-starter-kit/55a10160281d2085a56b898b296eab17fb36dade/app/Actions/.gitkeep -------------------------------------------------------------------------------- /app/Enums/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunomaduro/laravel-starter-kit/55a10160281d2085a56b898b296eab17fb36dade/app/Enums/.gitkeep -------------------------------------------------------------------------------- /app/Http/Controllers/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunomaduro/laravel-starter-kit/55a10160281d2085a56b898b296eab17fb36dade/app/Http/Controllers/.gitkeep -------------------------------------------------------------------------------- /app/Models/User.php: -------------------------------------------------------------------------------- 1 | */ 27 | use HasFactory, Notifiable; 28 | 29 | /** 30 | * The attributes that should be hidden for serialization. 31 | * 32 | * @var list 33 | */ 34 | protected $hidden = [ 35 | 'password', 36 | 'remember_token', 37 | ]; 38 | 39 | /** 40 | * Get the attributes that should be cast. 41 | * 42 | * @return array 43 | */ 44 | public function casts(): array 45 | { 46 | return [ 47 | 'email_verified_at' => 'datetime', 48 | 'password' => 'hashed', 49 | ]; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | handleCommand(new ArgvInput); 17 | 18 | exit($status); 19 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | withRouting( 11 | web: __DIR__.'/../routes/web.php', 12 | commands: __DIR__.'/../routes/console.php', 13 | ) 14 | ->withMiddleware(function (Middleware $middleware): void { 15 | // 16 | }) 17 | ->withExceptions(function (Exceptions $exceptions): void { 18 | // 19 | })->create(); 20 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /bootstrap/providers.php: -------------------------------------------------------------------------------- 1 | env('APP_NAME', 'Laravel'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Application Environment 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This value determines the "environment" your application is currently 26 | | running in. This may determine how you prefer to configure various 27 | | services the application utilizes. Set this in your ".env" file. 28 | | 29 | */ 30 | 31 | 'env' => env('APP_ENV', 'production'), 32 | 33 | /* 34 | |-------------------------------------------------------------------------- 35 | | Application Debug Mode 36 | |-------------------------------------------------------------------------- 37 | | 38 | | When your application is in debug mode, detailed error messages with 39 | | stack traces will be shown on every error that occurs within your 40 | | application. If disabled, a simple generic error page is shown. 41 | | 42 | */ 43 | 44 | 'debug' => (bool) env('APP_DEBUG', false), 45 | 46 | /* 47 | |-------------------------------------------------------------------------- 48 | | Application URL 49 | |-------------------------------------------------------------------------- 50 | | 51 | | This URL is used by the console to properly generate URLs when using 52 | | the Artisan command line tool. You should set this to the root of 53 | | the application so that it's available within Artisan commands. 54 | | 55 | */ 56 | 57 | 'url' => env('APP_URL', 'http://localhost'), 58 | 59 | /* 60 | |-------------------------------------------------------------------------- 61 | | Application Timezone 62 | |-------------------------------------------------------------------------- 63 | | 64 | | Here you may specify the default timezone for your application, which 65 | | will be used by the PHP date and date-time functions. The timezone 66 | | is set to "UTC" by default as it is suitable for most use cases. 67 | | 68 | */ 69 | 70 | 'timezone' => 'UTC', 71 | 72 | /* 73 | |-------------------------------------------------------------------------- 74 | | Application Locale Configuration 75 | |-------------------------------------------------------------------------- 76 | | 77 | | The application locale determines the default locale that will be used 78 | | by Laravel's translation / localization methods. This option can be 79 | | set to any locale for which you plan to have translation strings. 80 | | 81 | */ 82 | 83 | 'locale' => env('APP_LOCALE', 'en'), 84 | 85 | 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), 86 | 87 | 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), 88 | 89 | /* 90 | |-------------------------------------------------------------------------- 91 | | Encryption Key 92 | |-------------------------------------------------------------------------- 93 | | 94 | | This key is utilized by Laravel's encryption services and should be set 95 | | to a random, 32 character string to ensure that all encrypted values 96 | | are secure. You should do this prior to deploying the application. 97 | | 98 | */ 99 | 100 | 'cipher' => 'AES-256-CBC', 101 | 102 | 'key' => env('APP_KEY'), 103 | 104 | 'previous_keys' => [ 105 | ...array_filter( 106 | explode(',', env('APP_PREVIOUS_KEYS', '')) 107 | ), 108 | ], 109 | 110 | /* 111 | |-------------------------------------------------------------------------- 112 | | Maintenance Mode Driver 113 | |-------------------------------------------------------------------------- 114 | | 115 | | These configuration options determine the driver used to determine and 116 | | manage Laravel's "maintenance mode" status. The "cache" driver will 117 | | allow maintenance mode to be controlled across multiple machines. 118 | | 119 | | Supported drivers: "file", "cache" 120 | | 121 | */ 122 | 123 | 'maintenance' => [ 124 | 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), 125 | 'store' => env('APP_MAINTENANCE_STORE', 'database'), 126 | ], 127 | 128 | ]; 129 | -------------------------------------------------------------------------------- /config/auth.php: -------------------------------------------------------------------------------- 1 | [ 19 | 'guard' => env('AUTH_GUARD', 'web'), 20 | 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), 21 | ], 22 | 23 | /* 24 | |-------------------------------------------------------------------------- 25 | | Authentication Guards 26 | |-------------------------------------------------------------------------- 27 | | 28 | | Next, you may define every authentication guard for your application. 29 | | Of course, a great default configuration has been defined for you 30 | | which utilizes session storage plus the Eloquent user provider. 31 | | 32 | | All authentication guards have a user provider, which defines how the 33 | | users are actually retrieved out of your database or other storage 34 | | system used by the application. Typically, Eloquent is utilized. 35 | | 36 | | Supported: "session" 37 | | 38 | */ 39 | 40 | 'guards' => [ 41 | 'web' => [ 42 | 'driver' => 'session', 43 | 'provider' => 'users', 44 | ], 45 | ], 46 | 47 | /* 48 | |-------------------------------------------------------------------------- 49 | | User Providers 50 | |-------------------------------------------------------------------------- 51 | | 52 | | All authentication guards have a user provider, which defines how the 53 | | users are actually retrieved out of your database or other storage 54 | | system used by the application. Typically, Eloquent is utilized. 55 | | 56 | | If you have multiple user tables or models you may configure multiple 57 | | providers to represent the model / table. These providers may then 58 | | be assigned to any extra authentication guards you have defined. 59 | | 60 | | Supported: "database", "eloquent" 61 | | 62 | */ 63 | 64 | 'providers' => [ 65 | 'users' => [ 66 | 'driver' => 'eloquent', 67 | 'model' => env('AUTH_MODEL', App\Models\User::class), 68 | ], 69 | 70 | // 'users' => [ 71 | // 'driver' => 'database', 72 | // 'table' => 'users', 73 | // ], 74 | ], 75 | 76 | /* 77 | |-------------------------------------------------------------------------- 78 | | Resetting Passwords 79 | |-------------------------------------------------------------------------- 80 | | 81 | | These configuration options specify the behavior of Laravel's password 82 | | reset functionality, including the table utilized for token storage 83 | | and the user provider that is invoked to actually retrieve users. 84 | | 85 | | The expiry time is the number of minutes that each reset token will be 86 | | considered valid. This security feature keeps tokens short-lived so 87 | | they have less time to be guessed. You may change this as needed. 88 | | 89 | | The throttle setting is the number of seconds a user must wait before 90 | | generating more password reset tokens. This prevents the user from 91 | | quickly generating a very large amount of password reset tokens. 92 | | 93 | */ 94 | 95 | 'passwords' => [ 96 | 'users' => [ 97 | 'provider' => 'users', 98 | 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), 99 | 'expire' => 60, 100 | 'throttle' => 60, 101 | ], 102 | ], 103 | 104 | /* 105 | |-------------------------------------------------------------------------- 106 | | Password Confirmation Timeout 107 | |-------------------------------------------------------------------------- 108 | | 109 | | Here you may define the amount of seconds before a password confirmation 110 | | window expires and users are asked to re-enter their password via the 111 | | confirmation screen. By default, the timeout lasts for three hours. 112 | | 113 | */ 114 | 115 | 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), 116 | 117 | ]; 118 | -------------------------------------------------------------------------------- /config/cache.php: -------------------------------------------------------------------------------- 1 | env('CACHE_STORE', 'database'), 21 | 22 | /* 23 | |-------------------------------------------------------------------------- 24 | | Cache Stores 25 | |-------------------------------------------------------------------------- 26 | | 27 | | Here you may define all of the cache "stores" for your application as 28 | | well as their drivers. You may even define multiple stores for the 29 | | same cache driver to group types of items stored in your caches. 30 | | 31 | | Supported drivers: "array", "database", "file", "memcached", 32 | | "redis", "dynamodb", "octane", "null" 33 | | 34 | */ 35 | 36 | 'stores' => [ 37 | 38 | 'array' => [ 39 | 'driver' => 'array', 40 | 'serialize' => false, 41 | ], 42 | 43 | 'database' => [ 44 | 'driver' => 'database', 45 | 'connection' => env('DB_CACHE_CONNECTION'), 46 | 'table' => env('DB_CACHE_TABLE', 'cache'), 47 | 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), 48 | 'lock_table' => env('DB_CACHE_LOCK_TABLE'), 49 | ], 50 | 51 | 'file' => [ 52 | 'driver' => 'file', 53 | 'path' => storage_path('framework/cache/data'), 54 | 'lock_path' => storage_path('framework/cache/data'), 55 | ], 56 | 57 | 'memcached' => [ 58 | 'driver' => 'memcached', 59 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 60 | 'sasl' => [ 61 | env('MEMCACHED_USERNAME'), 62 | env('MEMCACHED_PASSWORD'), 63 | ], 64 | 'options' => [ 65 | // Memcached::OPT_CONNECT_TIMEOUT => 2000, 66 | ], 67 | 'servers' => [ 68 | [ 69 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 70 | 'port' => env('MEMCACHED_PORT', 11211), 71 | 'weight' => 100, 72 | ], 73 | ], 74 | ], 75 | 76 | 'redis' => [ 77 | 'driver' => 'redis', 78 | 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), 79 | 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), 80 | ], 81 | 82 | 'dynamodb' => [ 83 | 'driver' => 'dynamodb', 84 | 'key' => env('AWS_ACCESS_KEY_ID'), 85 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 86 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 87 | 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), 88 | 'endpoint' => env('DYNAMODB_ENDPOINT'), 89 | ], 90 | 91 | 'octane' => [ 92 | 'driver' => 'octane', 93 | ], 94 | 95 | ], 96 | 97 | /* 98 | |-------------------------------------------------------------------------- 99 | | Cache Key Prefix 100 | |-------------------------------------------------------------------------- 101 | | 102 | | When utilizing the APC, database, memcached, Redis, and DynamoDB cache 103 | | stores, there might be other applications using the same cache. For 104 | | that reason, you may prefix every cache key to avoid collisions. 105 | | 106 | */ 107 | 108 | 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), 109 | 110 | ]; 111 | -------------------------------------------------------------------------------- /config/database.php: -------------------------------------------------------------------------------- 1 | env('DB_CONNECTION', 'sqlite'), 22 | 23 | /* 24 | |-------------------------------------------------------------------------- 25 | | Database Connections 26 | |-------------------------------------------------------------------------- 27 | | 28 | | Below are all of the database connections defined for your application. 29 | | An example configuration is provided for each database system which 30 | | is supported by Laravel. You're free to add / remove connections. 31 | | 32 | */ 33 | 34 | 'connections' => [ 35 | 36 | 'sqlite' => [ 37 | 'driver' => 'sqlite', 38 | 'url' => env('DB_URL'), 39 | 'database' => env('DB_DATABASE', database_path('database.sqlite')), 40 | 'prefix' => '', 41 | 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), 42 | 'busy_timeout' => null, 43 | 'journal_mode' => null, 44 | 'synchronous' => null, 45 | ], 46 | 47 | 'mysql' => [ 48 | 'driver' => 'mysql', 49 | 'url' => env('DB_URL'), 50 | 'host' => env('DB_HOST', '127.0.0.1'), 51 | 'port' => env('DB_PORT', '3306'), 52 | 'database' => env('DB_DATABASE', 'laravel'), 53 | 'username' => env('DB_USERNAME', 'root'), 54 | 'password' => env('DB_PASSWORD', ''), 55 | 'unix_socket' => env('DB_SOCKET', ''), 56 | 'charset' => env('DB_CHARSET', 'utf8mb4'), 57 | 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 58 | 'prefix' => '', 59 | 'prefix_indexes' => true, 60 | 'strict' => true, 61 | 'engine' => null, 62 | 'options' => extension_loaded('pdo_mysql') ? array_filter([ 63 | PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), 64 | ]) : [], 65 | ], 66 | 67 | 'mariadb' => [ 68 | 'driver' => 'mariadb', 69 | 'url' => env('DB_URL'), 70 | 'host' => env('DB_HOST', '127.0.0.1'), 71 | 'port' => env('DB_PORT', '3306'), 72 | 'database' => env('DB_DATABASE', 'laravel'), 73 | 'username' => env('DB_USERNAME', 'root'), 74 | 'password' => env('DB_PASSWORD', ''), 75 | 'unix_socket' => env('DB_SOCKET', ''), 76 | 'charset' => env('DB_CHARSET', 'utf8mb4'), 77 | 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 78 | 'prefix' => '', 79 | 'prefix_indexes' => true, 80 | 'strict' => true, 81 | 'engine' => null, 82 | 'options' => extension_loaded('pdo_mysql') ? array_filter([ 83 | PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), 84 | ]) : [], 85 | ], 86 | 87 | 'pgsql' => [ 88 | 'driver' => 'pgsql', 89 | 'url' => env('DB_URL'), 90 | 'host' => env('DB_HOST', '127.0.0.1'), 91 | 'port' => env('DB_PORT', '5432'), 92 | 'database' => env('DB_DATABASE', 'laravel'), 93 | 'username' => env('DB_USERNAME', 'root'), 94 | 'password' => env('DB_PASSWORD', ''), 95 | 'charset' => env('DB_CHARSET', 'utf8'), 96 | 'prefix' => '', 97 | 'prefix_indexes' => true, 98 | 'search_path' => 'public', 99 | 'sslmode' => 'prefer', 100 | ], 101 | 102 | 'sqlsrv' => [ 103 | 'driver' => 'sqlsrv', 104 | 'url' => env('DB_URL'), 105 | 'host' => env('DB_HOST', 'localhost'), 106 | 'port' => env('DB_PORT', '1433'), 107 | 'database' => env('DB_DATABASE', 'laravel'), 108 | 'username' => env('DB_USERNAME', 'root'), 109 | 'password' => env('DB_PASSWORD', ''), 110 | 'charset' => env('DB_CHARSET', 'utf8'), 111 | 'prefix' => '', 112 | 'prefix_indexes' => true, 113 | // 'encrypt' => env('DB_ENCRYPT', 'yes'), 114 | // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), 115 | ], 116 | 117 | ], 118 | 119 | /* 120 | |-------------------------------------------------------------------------- 121 | | Migration Repository Table 122 | |-------------------------------------------------------------------------- 123 | | 124 | | This table keeps track of all the migrations that have already run for 125 | | your application. Using this information, we can determine which of 126 | | the migrations on disk haven't actually been run on the database. 127 | | 128 | */ 129 | 130 | 'migrations' => [ 131 | 'table' => 'migrations', 132 | 'update_date_on_publish' => true, 133 | ], 134 | 135 | /* 136 | |-------------------------------------------------------------------------- 137 | | Redis Databases 138 | |-------------------------------------------------------------------------- 139 | | 140 | | Redis is an open source, fast, and advanced key-value store that also 141 | | provides a richer body of commands than a typical key-value system 142 | | such as Memcached. You may define your connection settings here. 143 | | 144 | */ 145 | 146 | 'redis' => [ 147 | 148 | 'client' => env('REDIS_CLIENT', 'phpredis'), 149 | 150 | 'options' => [ 151 | 'cluster' => env('REDIS_CLUSTER', 'redis'), 152 | 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), 153 | 'persistent' => env('REDIS_PERSISTENT', false), 154 | ], 155 | 156 | 'default' => [ 157 | 'url' => env('REDIS_URL'), 158 | 'host' => env('REDIS_HOST', '127.0.0.1'), 159 | 'username' => env('REDIS_USERNAME'), 160 | 'password' => env('REDIS_PASSWORD'), 161 | 'port' => env('REDIS_PORT', '6379'), 162 | 'database' => env('REDIS_DB', '0'), 163 | ], 164 | 165 | 'cache' => [ 166 | 'url' => env('REDIS_URL'), 167 | 'host' => env('REDIS_HOST', '127.0.0.1'), 168 | 'username' => env('REDIS_USERNAME'), 169 | 'password' => env('REDIS_PASSWORD'), 170 | 'port' => env('REDIS_PORT', '6379'), 171 | 'database' => env('REDIS_CACHE_DB', '1'), 172 | ], 173 | 174 | ], 175 | 176 | ]; 177 | -------------------------------------------------------------------------------- /config/essentials.php: -------------------------------------------------------------------------------- 1 | true, 7 | ]; 8 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DISK', 'local'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Filesystem Disks 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Below you may configure as many filesystem disks as necessary, and you 26 | | may even configure multiple disks for the same driver. Examples for 27 | | most supported storage drivers are configured here for reference. 28 | | 29 | | Supported drivers: "local", "ftp", "sftp", "s3" 30 | | 31 | */ 32 | 33 | 'disks' => [ 34 | 35 | 'local' => [ 36 | 'driver' => 'local', 37 | 'root' => storage_path('app/private'), 38 | 'serve' => true, 39 | 'throw' => false, 40 | 'report' => false, 41 | ], 42 | 43 | 'public' => [ 44 | 'driver' => 'local', 45 | 'root' => storage_path('app/public'), 46 | 'url' => env('APP_URL').'/storage', 47 | 'visibility' => 'public', 48 | 'throw' => false, 49 | 'report' => false, 50 | ], 51 | 52 | 's3' => [ 53 | 'driver' => 's3', 54 | 'key' => env('AWS_ACCESS_KEY_ID'), 55 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 56 | 'region' => env('AWS_DEFAULT_REGION'), 57 | 'bucket' => env('AWS_BUCKET'), 58 | 'url' => env('AWS_URL'), 59 | 'endpoint' => env('AWS_ENDPOINT'), 60 | 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), 61 | 'throw' => false, 62 | 'report' => false, 63 | ], 64 | 65 | ], 66 | 67 | /* 68 | |-------------------------------------------------------------------------- 69 | | Symbolic Links 70 | |-------------------------------------------------------------------------- 71 | | 72 | | Here you may configure the symbolic links that will be created when the 73 | | `storage:link` Artisan command is executed. The array keys should be 74 | | the locations of the links and the values should be their targets. 75 | | 76 | */ 77 | 78 | 'links' => [ 79 | public_path('storage') => storage_path('app/public'), 80 | ], 81 | 82 | ]; 83 | -------------------------------------------------------------------------------- /config/logging.php: -------------------------------------------------------------------------------- 1 | env('LOG_CHANNEL', 'stack'), 24 | 25 | /* 26 | |-------------------------------------------------------------------------- 27 | | Deprecations Log Channel 28 | |-------------------------------------------------------------------------- 29 | | 30 | | This option controls the log channel that should be used to log warnings 31 | | regarding deprecated PHP and library features. This allows you to get 32 | | your application ready for upcoming major versions of dependencies. 33 | | 34 | */ 35 | 36 | 'deprecations' => [ 37 | 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), 38 | 'trace' => env('LOG_DEPRECATIONS_TRACE', false), 39 | ], 40 | 41 | /* 42 | |-------------------------------------------------------------------------- 43 | | Log Channels 44 | |-------------------------------------------------------------------------- 45 | | 46 | | Here you may configure the log channels for your application. Laravel 47 | | utilizes the Monolog PHP logging library, which includes a variety 48 | | of powerful log handlers and formatters that you're free to use. 49 | | 50 | | Available drivers: "single", "daily", "slack", "syslog", 51 | | "errorlog", "monolog", "custom", "stack" 52 | | 53 | */ 54 | 55 | 'channels' => [ 56 | 57 | 'stack' => [ 58 | 'driver' => 'stack', 59 | 'channels' => explode(',', env('LOG_STACK', 'single')), 60 | 'ignore_exceptions' => false, 61 | ], 62 | 63 | 'single' => [ 64 | 'driver' => 'single', 65 | 'path' => storage_path('logs/laravel.log'), 66 | 'level' => env('LOG_LEVEL', 'debug'), 67 | 'replace_placeholders' => true, 68 | ], 69 | 70 | 'daily' => [ 71 | 'driver' => 'daily', 72 | 'path' => storage_path('logs/laravel.log'), 73 | 'level' => env('LOG_LEVEL', 'debug'), 74 | 'days' => env('LOG_DAILY_DAYS', 14), 75 | 'replace_placeholders' => true, 76 | ], 77 | 78 | 'slack' => [ 79 | 'driver' => 'slack', 80 | 'url' => env('LOG_SLACK_WEBHOOK_URL'), 81 | 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), 82 | 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), 83 | 'level' => env('LOG_LEVEL', 'critical'), 84 | 'replace_placeholders' => true, 85 | ], 86 | 87 | 'papertrail' => [ 88 | 'driver' => 'monolog', 89 | 'level' => env('LOG_LEVEL', 'debug'), 90 | 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), 91 | 'handler_with' => [ 92 | 'host' => env('PAPERTRAIL_URL'), 93 | 'port' => env('PAPERTRAIL_PORT'), 94 | 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), 95 | ], 96 | 'processors' => [PsrLogMessageProcessor::class], 97 | ], 98 | 99 | 'stderr' => [ 100 | 'driver' => 'monolog', 101 | 'level' => env('LOG_LEVEL', 'debug'), 102 | 'handler' => StreamHandler::class, 103 | 'formatter' => env('LOG_STDERR_FORMATTER'), 104 | 'with' => [ 105 | 'stream' => 'php://stderr', 106 | ], 107 | 'processors' => [PsrLogMessageProcessor::class], 108 | ], 109 | 110 | 'syslog' => [ 111 | 'driver' => 'syslog', 112 | 'level' => env('LOG_LEVEL', 'debug'), 113 | 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), 114 | 'replace_placeholders' => true, 115 | ], 116 | 117 | 'errorlog' => [ 118 | 'driver' => 'errorlog', 119 | 'level' => env('LOG_LEVEL', 'debug'), 120 | 'replace_placeholders' => true, 121 | ], 122 | 123 | 'null' => [ 124 | 'driver' => 'monolog', 125 | 'handler' => NullHandler::class, 126 | ], 127 | 128 | 'emergency' => [ 129 | 'path' => storage_path('logs/laravel.log'), 130 | ], 131 | 132 | ], 133 | 134 | ]; 135 | -------------------------------------------------------------------------------- /config/mail.php: -------------------------------------------------------------------------------- 1 | env('MAIL_MAILER', 'log'), 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Mailer Configurations 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Here you may configure all of the mailers used by your application plus 27 | | their respective settings. Several examples have been configured for 28 | | you and you are free to add your own as your application requires. 29 | | 30 | | Laravel supports a variety of mail "transport" drivers that can be used 31 | | when delivering an email. You may specify which one you're using for 32 | | your mailers below. You may also add additional mailers if needed. 33 | | 34 | | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", 35 | | "postmark", "resend", "log", "array", 36 | | "failover", "roundrobin" 37 | | 38 | */ 39 | 40 | 'mailers' => [ 41 | 42 | 'smtp' => [ 43 | 'transport' => 'smtp', 44 | 'scheme' => env('MAIL_SCHEME'), 45 | 'url' => env('MAIL_URL'), 46 | 'host' => env('MAIL_HOST', '127.0.0.1'), 47 | 'port' => env('MAIL_PORT', 2525), 48 | 'username' => env('MAIL_USERNAME'), 49 | 'password' => env('MAIL_PASSWORD'), 50 | 'timeout' => null, 51 | 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url(env('APP_URL', 'http://localhost'), PHP_URL_HOST)), 52 | ], 53 | 54 | 'ses' => [ 55 | 'transport' => 'ses', 56 | ], 57 | 58 | 'postmark' => [ 59 | 'transport' => 'postmark', 60 | // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), 61 | // 'client' => [ 62 | // 'timeout' => 5, 63 | // ], 64 | ], 65 | 66 | 'resend' => [ 67 | 'transport' => 'resend', 68 | ], 69 | 70 | 'sendmail' => [ 71 | 'transport' => 'sendmail', 72 | 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), 73 | ], 74 | 75 | 'log' => [ 76 | 'transport' => 'log', 77 | 'channel' => env('MAIL_LOG_CHANNEL'), 78 | ], 79 | 80 | 'array' => [ 81 | 'transport' => 'array', 82 | ], 83 | 84 | 'failover' => [ 85 | 'transport' => 'failover', 86 | 'mailers' => [ 87 | 'smtp', 88 | 'log', 89 | ], 90 | ], 91 | 92 | 'roundrobin' => [ 93 | 'transport' => 'roundrobin', 94 | 'mailers' => [ 95 | 'ses', 96 | 'postmark', 97 | ], 98 | ], 99 | 100 | ], 101 | 102 | /* 103 | |-------------------------------------------------------------------------- 104 | | Global "From" Address 105 | |-------------------------------------------------------------------------- 106 | | 107 | | You may wish for all emails sent by your application to be sent from 108 | | the same address. Here you may specify a name and address that is 109 | | used globally for all emails that are sent by your application. 110 | | 111 | */ 112 | 113 | 'from' => [ 114 | 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 115 | 'name' => env('MAIL_FROM_NAME', 'Example'), 116 | ], 117 | 118 | ]; 119 | -------------------------------------------------------------------------------- /config/queue.php: -------------------------------------------------------------------------------- 1 | env('QUEUE_CONNECTION', 'database'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Queue Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may configure the connection options for every queue backend 26 | | used by your application. An example configuration is provided for 27 | | each backend supported by Laravel. You're also free to add more. 28 | | 29 | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" 30 | | 31 | */ 32 | 33 | 'connections' => [ 34 | 35 | 'sync' => [ 36 | 'driver' => 'sync', 37 | ], 38 | 39 | 'database' => [ 40 | 'driver' => 'database', 41 | 'connection' => env('DB_QUEUE_CONNECTION'), 42 | 'table' => env('DB_QUEUE_TABLE', 'jobs'), 43 | 'queue' => env('DB_QUEUE', 'default'), 44 | 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), 45 | 'after_commit' => false, 46 | ], 47 | 48 | 'beanstalkd' => [ 49 | 'driver' => 'beanstalkd', 50 | 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), 51 | 'queue' => env('BEANSTALKD_QUEUE', 'default'), 52 | 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), 53 | 'block_for' => 0, 54 | 'after_commit' => false, 55 | ], 56 | 57 | 'sqs' => [ 58 | 'driver' => 'sqs', 59 | 'key' => env('AWS_ACCESS_KEY_ID'), 60 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 61 | 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 62 | 'queue' => env('SQS_QUEUE', 'default'), 63 | 'suffix' => env('SQS_SUFFIX'), 64 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 65 | 'after_commit' => false, 66 | ], 67 | 68 | 'redis' => [ 69 | 'driver' => 'redis', 70 | 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), 71 | 'queue' => env('REDIS_QUEUE', 'default'), 72 | 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), 73 | 'block_for' => null, 74 | 'after_commit' => false, 75 | ], 76 | 77 | ], 78 | 79 | /* 80 | |-------------------------------------------------------------------------- 81 | | Job Batching 82 | |-------------------------------------------------------------------------- 83 | | 84 | | The following options configure the database and table that store job 85 | | batching information. These options can be updated to any database 86 | | connection and table which has been defined by your application. 87 | | 88 | */ 89 | 90 | 'batching' => [ 91 | 'database' => env('DB_CONNECTION', 'sqlite'), 92 | 'table' => 'job_batches', 93 | ], 94 | 95 | /* 96 | |-------------------------------------------------------------------------- 97 | | Failed Queue Jobs 98 | |-------------------------------------------------------------------------- 99 | | 100 | | These options configure the behavior of failed queue job logging so you 101 | | can control how and where failed jobs are stored. Laravel ships with 102 | | support for storing failed jobs in a simple file or in a database. 103 | | 104 | | Supported drivers: "database-uuids", "dynamodb", "file", "null" 105 | | 106 | */ 107 | 108 | 'failed' => [ 109 | 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), 110 | 'database' => env('DB_CONNECTION', 'sqlite'), 111 | 'table' => 'failed_jobs', 112 | ], 113 | 114 | ]; 115 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 20 | 'token' => env('POSTMARK_TOKEN'), 21 | ], 22 | 23 | 'ses' => [ 24 | 'key' => env('AWS_ACCESS_KEY_ID'), 25 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 26 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 27 | ], 28 | 29 | 'resend' => [ 30 | 'key' => env('RESEND_KEY'), 31 | ], 32 | 33 | 'slack' => [ 34 | 'notifications' => [ 35 | 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), 36 | 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), 37 | ], 38 | ], 39 | 40 | ]; 41 | -------------------------------------------------------------------------------- /config/session.php: -------------------------------------------------------------------------------- 1 | env('SESSION_DRIVER', 'database'), 24 | 25 | /* 26 | |-------------------------------------------------------------------------- 27 | | Session Lifetime 28 | |-------------------------------------------------------------------------- 29 | | 30 | | Here you may specify the number of minutes that you wish the session 31 | | to be allowed to remain idle before it expires. If you want them 32 | | to expire immediately when the browser is closed then you may 33 | | indicate that via the expire_on_close configuration option. 34 | | 35 | */ 36 | 37 | 'lifetime' => (int) env('SESSION_LIFETIME', 120), 38 | 39 | 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), 40 | 41 | /* 42 | |-------------------------------------------------------------------------- 43 | | Session Encryption 44 | |-------------------------------------------------------------------------- 45 | | 46 | | This option allows you to easily specify that all of your session data 47 | | should be encrypted before it's stored. All encryption is performed 48 | | automatically by Laravel and you may use the session like normal. 49 | | 50 | */ 51 | 52 | 'encrypt' => env('SESSION_ENCRYPT', false), 53 | 54 | /* 55 | |-------------------------------------------------------------------------- 56 | | Session File Location 57 | |-------------------------------------------------------------------------- 58 | | 59 | | When utilizing the "file" session driver, the session files are placed 60 | | on disk. The default storage location is defined here; however, you 61 | | are free to provide another location where they should be stored. 62 | | 63 | */ 64 | 65 | 'files' => storage_path('framework/sessions'), 66 | 67 | /* 68 | |-------------------------------------------------------------------------- 69 | | Session Database Connection 70 | |-------------------------------------------------------------------------- 71 | | 72 | | When using the "database" or "redis" session drivers, you may specify a 73 | | connection that should be used to manage these sessions. This should 74 | | correspond to a connection in your database configuration options. 75 | | 76 | */ 77 | 78 | 'connection' => env('SESSION_CONNECTION'), 79 | 80 | /* 81 | |-------------------------------------------------------------------------- 82 | | Session Database Table 83 | |-------------------------------------------------------------------------- 84 | | 85 | | When using the "database" session driver, you may specify the table to 86 | | be used to store sessions. Of course, a sensible default is defined 87 | | for you; however, you're welcome to change this to another table. 88 | | 89 | */ 90 | 91 | 'table' => env('SESSION_TABLE', 'sessions'), 92 | 93 | /* 94 | |-------------------------------------------------------------------------- 95 | | Session Cache Store 96 | |-------------------------------------------------------------------------- 97 | | 98 | | When using one of the framework's cache driven session backends, you may 99 | | define the cache store which should be used to store the session data 100 | | between requests. This must match one of your defined cache stores. 101 | | 102 | | Affects: "apc", "dynamodb", "memcached", "redis" 103 | | 104 | */ 105 | 106 | 'store' => env('SESSION_STORE'), 107 | 108 | /* 109 | |-------------------------------------------------------------------------- 110 | | Session Sweeping Lottery 111 | |-------------------------------------------------------------------------- 112 | | 113 | | Some session drivers must manually sweep their storage location to get 114 | | rid of old sessions from storage. Here are the chances that it will 115 | | happen on a given request. By default, the odds are 2 out of 100. 116 | | 117 | */ 118 | 119 | 'lottery' => [2, 100], 120 | 121 | /* 122 | |-------------------------------------------------------------------------- 123 | | Session Cookie Name 124 | |-------------------------------------------------------------------------- 125 | | 126 | | Here you may change the name of the session cookie that is created by 127 | | the framework. Typically, you should not need to change this value 128 | | since doing so does not grant a meaningful security improvement. 129 | | 130 | */ 131 | 132 | 'cookie' => env( 133 | 'SESSION_COOKIE', 134 | Str::slug(env('APP_NAME', 'laravel'), '_').'_session' 135 | ), 136 | 137 | /* 138 | |-------------------------------------------------------------------------- 139 | | Session Cookie Path 140 | |-------------------------------------------------------------------------- 141 | | 142 | | The session cookie path determines the path for which the cookie will 143 | | be regarded as available. Typically, this will be the root path of 144 | | your application, but you're free to change this when necessary. 145 | | 146 | */ 147 | 148 | 'path' => env('SESSION_PATH', '/'), 149 | 150 | /* 151 | |-------------------------------------------------------------------------- 152 | | Session Cookie Domain 153 | |-------------------------------------------------------------------------- 154 | | 155 | | This value determines the domain and subdomains the session cookie is 156 | | available to. By default, the cookie will be available to the root 157 | | domain and all subdomains. Typically, this shouldn't be changed. 158 | | 159 | */ 160 | 161 | 'domain' => env('SESSION_DOMAIN'), 162 | 163 | /* 164 | |-------------------------------------------------------------------------- 165 | | HTTPS Only Cookies 166 | |-------------------------------------------------------------------------- 167 | | 168 | | By setting this option to true, session cookies will only be sent back 169 | | to the server if the browser has a HTTPS connection. This will keep 170 | | the cookie from being sent to you when it can't be done securely. 171 | | 172 | */ 173 | 174 | 'secure' => env('SESSION_SECURE_COOKIE'), 175 | 176 | /* 177 | |-------------------------------------------------------------------------- 178 | | HTTP Access Only 179 | |-------------------------------------------------------------------------- 180 | | 181 | | Setting this value to true will prevent JavaScript from accessing the 182 | | value of the cookie and the cookie will only be accessible through 183 | | the HTTP protocol. It's unlikely you should disable this option. 184 | | 185 | */ 186 | 187 | 'http_only' => env('SESSION_HTTP_ONLY', true), 188 | 189 | /* 190 | |-------------------------------------------------------------------------- 191 | | Same-Site Cookies 192 | |-------------------------------------------------------------------------- 193 | | 194 | | This option determines how your cookies behave when cross-site requests 195 | | take place, and can be used to mitigate CSRF attacks. By default, we 196 | | will set this value to "lax" to permit secure cross-site requests. 197 | | 198 | | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value 199 | | 200 | | Supported: "lax", "strict", "none", null 201 | | 202 | */ 203 | 204 | 'same_site' => env('SESSION_SAME_SITE', 'lax'), 205 | 206 | /* 207 | |-------------------------------------------------------------------------- 208 | | Partitioned Cookies 209 | |-------------------------------------------------------------------------- 210 | | 211 | | Setting this value to true will tie the cookie to the top-level site for 212 | | a cross-site context. Partitioned cookies are accepted by the browser 213 | | when flagged "secure" and the Same-Site attribute is set to "none". 214 | | 215 | */ 216 | 217 | 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), 218 | 219 | ]; 220 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite* 2 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | final class UserFactory extends Factory 16 | { 17 | /** 18 | * The current password being used by the factory. 19 | */ 20 | private static ?string $password = null; 21 | 22 | /** 23 | * Define the model's default state. 24 | * 25 | * @return array 26 | */ 27 | public function definition(): array 28 | { 29 | return [ 30 | 'name' => fake()->name(), 31 | 'email' => fake()->unique()->safeEmail(), 32 | 'email_verified_at' => now(), 33 | 'password' => self::$password ??= Hash::make('password'), 34 | 'remember_token' => Str::random(10), 35 | ]; 36 | } 37 | 38 | /** 39 | * Indicate that the model's email address should be unverified. 40 | */ 41 | public function unverified(): self 42 | { 43 | return $this->state(fn (array $attributes): array => [ 44 | 'email_verified_at' => null, 45 | ]); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('email')->unique(); 20 | $table->timestamp('email_verified_at')->nullable(); 21 | $table->string('password'); 22 | $table->rememberToken(); 23 | $table->timestamps(); 24 | }); 25 | 26 | Schema::create('password_reset_tokens', function (Blueprint $table): void { 27 | $table->string('email')->primary(); 28 | $table->string('token'); 29 | $table->timestamp('created_at')->nullable(); 30 | }); 31 | 32 | Schema::create('sessions', function (Blueprint $table): void { 33 | $table->string('id')->primary(); 34 | $table->foreignId('user_id')->nullable()->index(); 35 | $table->string('ip_address', 45)->nullable(); 36 | $table->text('user_agent')->nullable(); 37 | $table->longText('payload'); 38 | $table->integer('last_activity')->index(); 39 | }); 40 | } 41 | }; 42 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000001_create_cache_table.php: -------------------------------------------------------------------------------- 1 | string('key')->primary(); 18 | $table->mediumText('value'); 19 | $table->integer('expiration'); 20 | }); 21 | 22 | Schema::create('cache_locks', function (Blueprint $table): void { 23 | $table->string('key')->primary(); 24 | $table->string('owner'); 25 | $table->integer('expiration'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/0001_01_01_000002_create_jobs_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('queue')->index(); 19 | $table->longText('payload'); 20 | $table->unsignedTinyInteger('attempts'); 21 | $table->unsignedInteger('reserved_at')->nullable(); 22 | $table->unsignedInteger('available_at'); 23 | $table->unsignedInteger('created_at'); 24 | }); 25 | 26 | Schema::create('job_batches', function (Blueprint $table): void { 27 | $table->string('id')->primary(); 28 | $table->string('name'); 29 | $table->integer('total_jobs'); 30 | $table->integer('pending_jobs'); 31 | $table->integer('failed_jobs'); 32 | $table->longText('failed_job_ids'); 33 | $table->mediumText('options')->nullable(); 34 | $table->integer('cancelled_at')->nullable(); 35 | $table->integer('created_at'); 36 | $table->integer('finished_at')->nullable(); 37 | }); 38 | 39 | Schema::create('failed_jobs', function (Blueprint $table): void { 40 | $table->id(); 41 | $table->string('uuid')->unique(); 42 | $table->text('connection'); 43 | $table->text('queue'); 44 | $table->longText('payload'); 45 | $table->longText('exception'); 46 | $table->timestamp('failed_at')->useCurrent(); 47 | }); 48 | } 49 | }; 50 | -------------------------------------------------------------------------------- /database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | create(); 19 | 20 | User::factory()->create([ 21 | 'name' => 'Test User', 22 | 'email' => 'test@example.com', 23 | ]); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "devDependencies": { 8 | "@tailwindcss/vite": "^4.0.0", 9 | "laravel-vite-plugin": "^1.2.0", 10 | "prettier": "^3.4.2", 11 | "prettier-plugin-organize-imports": "^4.1.0", 12 | "prettier-plugin-tailwindcss": "^0.6.11", 13 | "tailwindcss": "^4.0.0", 14 | "vite": "^6.0.11" 15 | } 16 | }, 17 | "node_modules/@esbuild/aix-ppc64": { 18 | "version": "0.25.1", 19 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", 20 | "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", 21 | "cpu": [ 22 | "ppc64" 23 | ], 24 | "dev": true, 25 | "license": "MIT", 26 | "optional": true, 27 | "os": [ 28 | "aix" 29 | ], 30 | "engines": { 31 | "node": ">=18" 32 | } 33 | }, 34 | "node_modules/@esbuild/android-arm": { 35 | "version": "0.25.1", 36 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", 37 | "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", 38 | "cpu": [ 39 | "arm" 40 | ], 41 | "dev": true, 42 | "license": "MIT", 43 | "optional": true, 44 | "os": [ 45 | "android" 46 | ], 47 | "engines": { 48 | "node": ">=18" 49 | } 50 | }, 51 | "node_modules/@esbuild/android-arm64": { 52 | "version": "0.25.1", 53 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", 54 | "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", 55 | "cpu": [ 56 | "arm64" 57 | ], 58 | "dev": true, 59 | "license": "MIT", 60 | "optional": true, 61 | "os": [ 62 | "android" 63 | ], 64 | "engines": { 65 | "node": ">=18" 66 | } 67 | }, 68 | "node_modules/@esbuild/android-x64": { 69 | "version": "0.25.1", 70 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", 71 | "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", 72 | "cpu": [ 73 | "x64" 74 | ], 75 | "dev": true, 76 | "license": "MIT", 77 | "optional": true, 78 | "os": [ 79 | "android" 80 | ], 81 | "engines": { 82 | "node": ">=18" 83 | } 84 | }, 85 | "node_modules/@esbuild/darwin-arm64": { 86 | "version": "0.25.1", 87 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", 88 | "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", 89 | "cpu": [ 90 | "arm64" 91 | ], 92 | "dev": true, 93 | "license": "MIT", 94 | "optional": true, 95 | "os": [ 96 | "darwin" 97 | ], 98 | "engines": { 99 | "node": ">=18" 100 | } 101 | }, 102 | "node_modules/@esbuild/darwin-x64": { 103 | "version": "0.25.1", 104 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", 105 | "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", 106 | "cpu": [ 107 | "x64" 108 | ], 109 | "dev": true, 110 | "license": "MIT", 111 | "optional": true, 112 | "os": [ 113 | "darwin" 114 | ], 115 | "engines": { 116 | "node": ">=18" 117 | } 118 | }, 119 | "node_modules/@esbuild/freebsd-arm64": { 120 | "version": "0.25.1", 121 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", 122 | "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", 123 | "cpu": [ 124 | "arm64" 125 | ], 126 | "dev": true, 127 | "license": "MIT", 128 | "optional": true, 129 | "os": [ 130 | "freebsd" 131 | ], 132 | "engines": { 133 | "node": ">=18" 134 | } 135 | }, 136 | "node_modules/@esbuild/freebsd-x64": { 137 | "version": "0.25.1", 138 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", 139 | "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", 140 | "cpu": [ 141 | "x64" 142 | ], 143 | "dev": true, 144 | "license": "MIT", 145 | "optional": true, 146 | "os": [ 147 | "freebsd" 148 | ], 149 | "engines": { 150 | "node": ">=18" 151 | } 152 | }, 153 | "node_modules/@esbuild/linux-arm": { 154 | "version": "0.25.1", 155 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", 156 | "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", 157 | "cpu": [ 158 | "arm" 159 | ], 160 | "dev": true, 161 | "license": "MIT", 162 | "optional": true, 163 | "os": [ 164 | "linux" 165 | ], 166 | "engines": { 167 | "node": ">=18" 168 | } 169 | }, 170 | "node_modules/@esbuild/linux-arm64": { 171 | "version": "0.25.1", 172 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", 173 | "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", 174 | "cpu": [ 175 | "arm64" 176 | ], 177 | "dev": true, 178 | "license": "MIT", 179 | "optional": true, 180 | "os": [ 181 | "linux" 182 | ], 183 | "engines": { 184 | "node": ">=18" 185 | } 186 | }, 187 | "node_modules/@esbuild/linux-ia32": { 188 | "version": "0.25.1", 189 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", 190 | "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", 191 | "cpu": [ 192 | "ia32" 193 | ], 194 | "dev": true, 195 | "license": "MIT", 196 | "optional": true, 197 | "os": [ 198 | "linux" 199 | ], 200 | "engines": { 201 | "node": ">=18" 202 | } 203 | }, 204 | "node_modules/@esbuild/linux-loong64": { 205 | "version": "0.25.1", 206 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", 207 | "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", 208 | "cpu": [ 209 | "loong64" 210 | ], 211 | "dev": true, 212 | "license": "MIT", 213 | "optional": true, 214 | "os": [ 215 | "linux" 216 | ], 217 | "engines": { 218 | "node": ">=18" 219 | } 220 | }, 221 | "node_modules/@esbuild/linux-mips64el": { 222 | "version": "0.25.1", 223 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", 224 | "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", 225 | "cpu": [ 226 | "mips64el" 227 | ], 228 | "dev": true, 229 | "license": "MIT", 230 | "optional": true, 231 | "os": [ 232 | "linux" 233 | ], 234 | "engines": { 235 | "node": ">=18" 236 | } 237 | }, 238 | "node_modules/@esbuild/linux-ppc64": { 239 | "version": "0.25.1", 240 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", 241 | "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", 242 | "cpu": [ 243 | "ppc64" 244 | ], 245 | "dev": true, 246 | "license": "MIT", 247 | "optional": true, 248 | "os": [ 249 | "linux" 250 | ], 251 | "engines": { 252 | "node": ">=18" 253 | } 254 | }, 255 | "node_modules/@esbuild/linux-riscv64": { 256 | "version": "0.25.1", 257 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", 258 | "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", 259 | "cpu": [ 260 | "riscv64" 261 | ], 262 | "dev": true, 263 | "license": "MIT", 264 | "optional": true, 265 | "os": [ 266 | "linux" 267 | ], 268 | "engines": { 269 | "node": ">=18" 270 | } 271 | }, 272 | "node_modules/@esbuild/linux-s390x": { 273 | "version": "0.25.1", 274 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", 275 | "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", 276 | "cpu": [ 277 | "s390x" 278 | ], 279 | "dev": true, 280 | "license": "MIT", 281 | "optional": true, 282 | "os": [ 283 | "linux" 284 | ], 285 | "engines": { 286 | "node": ">=18" 287 | } 288 | }, 289 | "node_modules/@esbuild/linux-x64": { 290 | "version": "0.25.1", 291 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", 292 | "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", 293 | "cpu": [ 294 | "x64" 295 | ], 296 | "dev": true, 297 | "license": "MIT", 298 | "optional": true, 299 | "os": [ 300 | "linux" 301 | ], 302 | "engines": { 303 | "node": ">=18" 304 | } 305 | }, 306 | "node_modules/@esbuild/netbsd-arm64": { 307 | "version": "0.25.1", 308 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", 309 | "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", 310 | "cpu": [ 311 | "arm64" 312 | ], 313 | "dev": true, 314 | "license": "MIT", 315 | "optional": true, 316 | "os": [ 317 | "netbsd" 318 | ], 319 | "engines": { 320 | "node": ">=18" 321 | } 322 | }, 323 | "node_modules/@esbuild/netbsd-x64": { 324 | "version": "0.25.1", 325 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", 326 | "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", 327 | "cpu": [ 328 | "x64" 329 | ], 330 | "dev": true, 331 | "license": "MIT", 332 | "optional": true, 333 | "os": [ 334 | "netbsd" 335 | ], 336 | "engines": { 337 | "node": ">=18" 338 | } 339 | }, 340 | "node_modules/@esbuild/openbsd-arm64": { 341 | "version": "0.25.1", 342 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", 343 | "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", 344 | "cpu": [ 345 | "arm64" 346 | ], 347 | "dev": true, 348 | "license": "MIT", 349 | "optional": true, 350 | "os": [ 351 | "openbsd" 352 | ], 353 | "engines": { 354 | "node": ">=18" 355 | } 356 | }, 357 | "node_modules/@esbuild/openbsd-x64": { 358 | "version": "0.25.1", 359 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", 360 | "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", 361 | "cpu": [ 362 | "x64" 363 | ], 364 | "dev": true, 365 | "license": "MIT", 366 | "optional": true, 367 | "os": [ 368 | "openbsd" 369 | ], 370 | "engines": { 371 | "node": ">=18" 372 | } 373 | }, 374 | "node_modules/@esbuild/sunos-x64": { 375 | "version": "0.25.1", 376 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", 377 | "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", 378 | "cpu": [ 379 | "x64" 380 | ], 381 | "dev": true, 382 | "license": "MIT", 383 | "optional": true, 384 | "os": [ 385 | "sunos" 386 | ], 387 | "engines": { 388 | "node": ">=18" 389 | } 390 | }, 391 | "node_modules/@esbuild/win32-arm64": { 392 | "version": "0.25.1", 393 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", 394 | "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", 395 | "cpu": [ 396 | "arm64" 397 | ], 398 | "dev": true, 399 | "license": "MIT", 400 | "optional": true, 401 | "os": [ 402 | "win32" 403 | ], 404 | "engines": { 405 | "node": ">=18" 406 | } 407 | }, 408 | "node_modules/@esbuild/win32-ia32": { 409 | "version": "0.25.1", 410 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", 411 | "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", 412 | "cpu": [ 413 | "ia32" 414 | ], 415 | "dev": true, 416 | "license": "MIT", 417 | "optional": true, 418 | "os": [ 419 | "win32" 420 | ], 421 | "engines": { 422 | "node": ">=18" 423 | } 424 | }, 425 | "node_modules/@esbuild/win32-x64": { 426 | "version": "0.25.1", 427 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", 428 | "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", 429 | "cpu": [ 430 | "x64" 431 | ], 432 | "dev": true, 433 | "license": "MIT", 434 | "optional": true, 435 | "os": [ 436 | "win32" 437 | ], 438 | "engines": { 439 | "node": ">=18" 440 | } 441 | }, 442 | "node_modules/@rollup/rollup-android-arm-eabi": { 443 | "version": "4.35.0", 444 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz", 445 | "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==", 446 | "cpu": [ 447 | "arm" 448 | ], 449 | "dev": true, 450 | "license": "MIT", 451 | "optional": true, 452 | "os": [ 453 | "android" 454 | ] 455 | }, 456 | "node_modules/@rollup/rollup-android-arm64": { 457 | "version": "4.35.0", 458 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz", 459 | "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==", 460 | "cpu": [ 461 | "arm64" 462 | ], 463 | "dev": true, 464 | "license": "MIT", 465 | "optional": true, 466 | "os": [ 467 | "android" 468 | ] 469 | }, 470 | "node_modules/@rollup/rollup-darwin-arm64": { 471 | "version": "4.35.0", 472 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz", 473 | "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==", 474 | "cpu": [ 475 | "arm64" 476 | ], 477 | "dev": true, 478 | "license": "MIT", 479 | "optional": true, 480 | "os": [ 481 | "darwin" 482 | ] 483 | }, 484 | "node_modules/@rollup/rollup-darwin-x64": { 485 | "version": "4.35.0", 486 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz", 487 | "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==", 488 | "cpu": [ 489 | "x64" 490 | ], 491 | "dev": true, 492 | "license": "MIT", 493 | "optional": true, 494 | "os": [ 495 | "darwin" 496 | ] 497 | }, 498 | "node_modules/@rollup/rollup-freebsd-arm64": { 499 | "version": "4.35.0", 500 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz", 501 | "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==", 502 | "cpu": [ 503 | "arm64" 504 | ], 505 | "dev": true, 506 | "license": "MIT", 507 | "optional": true, 508 | "os": [ 509 | "freebsd" 510 | ] 511 | }, 512 | "node_modules/@rollup/rollup-freebsd-x64": { 513 | "version": "4.35.0", 514 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz", 515 | "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==", 516 | "cpu": [ 517 | "x64" 518 | ], 519 | "dev": true, 520 | "license": "MIT", 521 | "optional": true, 522 | "os": [ 523 | "freebsd" 524 | ] 525 | }, 526 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 527 | "version": "4.35.0", 528 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz", 529 | "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==", 530 | "cpu": [ 531 | "arm" 532 | ], 533 | "dev": true, 534 | "license": "MIT", 535 | "optional": true, 536 | "os": [ 537 | "linux" 538 | ] 539 | }, 540 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 541 | "version": "4.35.0", 542 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz", 543 | "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==", 544 | "cpu": [ 545 | "arm" 546 | ], 547 | "dev": true, 548 | "license": "MIT", 549 | "optional": true, 550 | "os": [ 551 | "linux" 552 | ] 553 | }, 554 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 555 | "version": "4.35.0", 556 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz", 557 | "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==", 558 | "cpu": [ 559 | "arm64" 560 | ], 561 | "dev": true, 562 | "license": "MIT", 563 | "optional": true, 564 | "os": [ 565 | "linux" 566 | ] 567 | }, 568 | "node_modules/@rollup/rollup-linux-arm64-musl": { 569 | "version": "4.35.0", 570 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz", 571 | "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==", 572 | "cpu": [ 573 | "arm64" 574 | ], 575 | "dev": true, 576 | "license": "MIT", 577 | "optional": true, 578 | "os": [ 579 | "linux" 580 | ] 581 | }, 582 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 583 | "version": "4.35.0", 584 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz", 585 | "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==", 586 | "cpu": [ 587 | "loong64" 588 | ], 589 | "dev": true, 590 | "license": "MIT", 591 | "optional": true, 592 | "os": [ 593 | "linux" 594 | ] 595 | }, 596 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 597 | "version": "4.35.0", 598 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz", 599 | "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==", 600 | "cpu": [ 601 | "ppc64" 602 | ], 603 | "dev": true, 604 | "license": "MIT", 605 | "optional": true, 606 | "os": [ 607 | "linux" 608 | ] 609 | }, 610 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 611 | "version": "4.35.0", 612 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz", 613 | "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==", 614 | "cpu": [ 615 | "riscv64" 616 | ], 617 | "dev": true, 618 | "license": "MIT", 619 | "optional": true, 620 | "os": [ 621 | "linux" 622 | ] 623 | }, 624 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 625 | "version": "4.35.0", 626 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz", 627 | "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==", 628 | "cpu": [ 629 | "s390x" 630 | ], 631 | "dev": true, 632 | "license": "MIT", 633 | "optional": true, 634 | "os": [ 635 | "linux" 636 | ] 637 | }, 638 | "node_modules/@rollup/rollup-linux-x64-gnu": { 639 | "version": "4.35.0", 640 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz", 641 | "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==", 642 | "cpu": [ 643 | "x64" 644 | ], 645 | "dev": true, 646 | "license": "MIT", 647 | "optional": true, 648 | "os": [ 649 | "linux" 650 | ] 651 | }, 652 | "node_modules/@rollup/rollup-linux-x64-musl": { 653 | "version": "4.35.0", 654 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz", 655 | "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==", 656 | "cpu": [ 657 | "x64" 658 | ], 659 | "dev": true, 660 | "license": "MIT", 661 | "optional": true, 662 | "os": [ 663 | "linux" 664 | ] 665 | }, 666 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 667 | "version": "4.35.0", 668 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz", 669 | "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==", 670 | "cpu": [ 671 | "arm64" 672 | ], 673 | "dev": true, 674 | "license": "MIT", 675 | "optional": true, 676 | "os": [ 677 | "win32" 678 | ] 679 | }, 680 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 681 | "version": "4.35.0", 682 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz", 683 | "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==", 684 | "cpu": [ 685 | "ia32" 686 | ], 687 | "dev": true, 688 | "license": "MIT", 689 | "optional": true, 690 | "os": [ 691 | "win32" 692 | ] 693 | }, 694 | "node_modules/@rollup/rollup-win32-x64-msvc": { 695 | "version": "4.35.0", 696 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz", 697 | "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==", 698 | "cpu": [ 699 | "x64" 700 | ], 701 | "dev": true, 702 | "license": "MIT", 703 | "optional": true, 704 | "os": [ 705 | "win32" 706 | ] 707 | }, 708 | "node_modules/@tailwindcss/node": { 709 | "version": "4.0.14", 710 | "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.14.tgz", 711 | "integrity": "sha512-Ux9NbFkKWYE4rfUFz6M5JFLs/GEYP6ysxT8uSyPn6aTbh2K3xDE1zz++eVK4Vwx799fzMF8CID9sdHn4j/Ab8w==", 712 | "dev": true, 713 | "license": "MIT", 714 | "dependencies": { 715 | "enhanced-resolve": "^5.18.1", 716 | "jiti": "^2.4.2", 717 | "tailwindcss": "4.0.14" 718 | } 719 | }, 720 | "node_modules/@tailwindcss/oxide": { 721 | "version": "4.0.14", 722 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.14.tgz", 723 | "integrity": "sha512-M8VCNyO/NBi5vJ2cRcI9u8w7Si+i76a7o1vveoGtbbjpEYJZYiyc7f2VGps/DqawO56l3tImIbq2OT/533jcrA==", 724 | "dev": true, 725 | "license": "MIT", 726 | "engines": { 727 | "node": ">= 10" 728 | }, 729 | "optionalDependencies": { 730 | "@tailwindcss/oxide-android-arm64": "4.0.14", 731 | "@tailwindcss/oxide-darwin-arm64": "4.0.14", 732 | "@tailwindcss/oxide-darwin-x64": "4.0.14", 733 | "@tailwindcss/oxide-freebsd-x64": "4.0.14", 734 | "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.14", 735 | "@tailwindcss/oxide-linux-arm64-gnu": "4.0.14", 736 | "@tailwindcss/oxide-linux-arm64-musl": "4.0.14", 737 | "@tailwindcss/oxide-linux-x64-gnu": "4.0.14", 738 | "@tailwindcss/oxide-linux-x64-musl": "4.0.14", 739 | "@tailwindcss/oxide-win32-arm64-msvc": "4.0.14", 740 | "@tailwindcss/oxide-win32-x64-msvc": "4.0.14" 741 | } 742 | }, 743 | "node_modules/@tailwindcss/oxide-android-arm64": { 744 | "version": "4.0.14", 745 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.14.tgz", 746 | "integrity": "sha512-VBFKC2rFyfJ5J8lRwjy6ub3rgpY186kAcYgiUr8ArR8BAZzMruyeKJ6mlsD22Zp5ZLcPW/FXMasJiJBx0WsdQg==", 747 | "cpu": [ 748 | "arm64" 749 | ], 750 | "dev": true, 751 | "license": "MIT", 752 | "optional": true, 753 | "os": [ 754 | "android" 755 | ], 756 | "engines": { 757 | "node": ">= 10" 758 | } 759 | }, 760 | "node_modules/@tailwindcss/oxide-darwin-arm64": { 761 | "version": "4.0.14", 762 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.14.tgz", 763 | "integrity": "sha512-U3XOwLrefGr2YQZ9DXasDSNWGPZBCh8F62+AExBEDMLDfvLLgI/HDzY8Oq8p/JtqkAY38sWPOaNnRwEGKU5Zmg==", 764 | "cpu": [ 765 | "arm64" 766 | ], 767 | "dev": true, 768 | "license": "MIT", 769 | "optional": true, 770 | "os": [ 771 | "darwin" 772 | ], 773 | "engines": { 774 | "node": ">= 10" 775 | } 776 | }, 777 | "node_modules/@tailwindcss/oxide-darwin-x64": { 778 | "version": "4.0.14", 779 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.14.tgz", 780 | "integrity": "sha512-V5AjFuc3ndWGnOi1d379UsODb0TzAS2DYIP/lwEbfvafUaD2aNZIcbwJtYu2DQqO2+s/XBvDVA+w4yUyaewRwg==", 781 | "cpu": [ 782 | "x64" 783 | ], 784 | "dev": true, 785 | "license": "MIT", 786 | "optional": true, 787 | "os": [ 788 | "darwin" 789 | ], 790 | "engines": { 791 | "node": ">= 10" 792 | } 793 | }, 794 | "node_modules/@tailwindcss/oxide-freebsd-x64": { 795 | "version": "4.0.14", 796 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.14.tgz", 797 | "integrity": "sha512-tXvtxbaZfcPfqBwW3f53lTcyH6EDT+1eT7yabwcfcxTs+8yTPqxsDUhrqe9MrnEzpNkd+R/QAjJapfd4tjWdLg==", 798 | "cpu": [ 799 | "x64" 800 | ], 801 | "dev": true, 802 | "license": "MIT", 803 | "optional": true, 804 | "os": [ 805 | "freebsd" 806 | ], 807 | "engines": { 808 | "node": ">= 10" 809 | } 810 | }, 811 | "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { 812 | "version": "4.0.14", 813 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.14.tgz", 814 | "integrity": "sha512-cSeLNWWqIWeSTmBntQvyY2/2gcLX8rkPFfDDTQVF8qbRcRMVPLxBvFVJyfSAYRNch6ZyVH2GI6dtgALOBDpdNA==", 815 | "cpu": [ 816 | "arm" 817 | ], 818 | "dev": true, 819 | "license": "MIT", 820 | "optional": true, 821 | "os": [ 822 | "linux" 823 | ], 824 | "engines": { 825 | "node": ">= 10" 826 | } 827 | }, 828 | "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { 829 | "version": "4.0.14", 830 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.14.tgz", 831 | "integrity": "sha512-bwDWLBalXFMDItcSXzFk6y7QKvj6oFlaY9vM+agTlwFL1n1OhDHYLZkSjaYsh6KCeG0VB0r7H8PUJVOM1LRZyg==", 832 | "cpu": [ 833 | "arm64" 834 | ], 835 | "dev": true, 836 | "license": "MIT", 837 | "optional": true, 838 | "os": [ 839 | "linux" 840 | ], 841 | "engines": { 842 | "node": ">= 10" 843 | } 844 | }, 845 | "node_modules/@tailwindcss/oxide-linux-arm64-musl": { 846 | "version": "4.0.14", 847 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.14.tgz", 848 | "integrity": "sha512-gVkJdnR/L6iIcGYXx64HGJRmlme2FGr/aZH0W6u4A3RgPMAb+6ELRLi+UBiH83RXBm9vwCfkIC/q8T51h8vUJQ==", 849 | "cpu": [ 850 | "arm64" 851 | ], 852 | "dev": true, 853 | "license": "MIT", 854 | "optional": true, 855 | "os": [ 856 | "linux" 857 | ], 858 | "engines": { 859 | "node": ">= 10" 860 | } 861 | }, 862 | "node_modules/@tailwindcss/oxide-linux-x64-gnu": { 863 | "version": "4.0.14", 864 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.14.tgz", 865 | "integrity": "sha512-EE+EQ+c6tTpzsg+LGO1uuusjXxYx0Q00JE5ubcIGfsogSKth8n8i2BcS2wYTQe4jXGs+BQs35l78BIPzgwLddw==", 866 | "cpu": [ 867 | "x64" 868 | ], 869 | "dev": true, 870 | "license": "MIT", 871 | "optional": true, 872 | "os": [ 873 | "linux" 874 | ], 875 | "engines": { 876 | "node": ">= 10" 877 | } 878 | }, 879 | "node_modules/@tailwindcss/oxide-linux-x64-musl": { 880 | "version": "4.0.14", 881 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.14.tgz", 882 | "integrity": "sha512-KCCOzo+L6XPT0oUp2Jwh233ETRQ/F6cwUnMnR0FvMUCbkDAzHbcyOgpfuAtRa5HD0WbTbH4pVD+S0pn1EhNfbw==", 883 | "cpu": [ 884 | "x64" 885 | ], 886 | "dev": true, 887 | "license": "MIT", 888 | "optional": true, 889 | "os": [ 890 | "linux" 891 | ], 892 | "engines": { 893 | "node": ">= 10" 894 | } 895 | }, 896 | "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { 897 | "version": "4.0.14", 898 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.14.tgz", 899 | "integrity": "sha512-AHObFiFL9lNYcm3tZSPqa/cHGpM5wOrNmM2uOMoKppp+0Hom5uuyRh0QkOp7jftsHZdrZUpmoz0Mp6vhh2XtUg==", 900 | "cpu": [ 901 | "arm64" 902 | ], 903 | "dev": true, 904 | "license": "MIT", 905 | "optional": true, 906 | "os": [ 907 | "win32" 908 | ], 909 | "engines": { 910 | "node": ">= 10" 911 | } 912 | }, 913 | "node_modules/@tailwindcss/oxide-win32-x64-msvc": { 914 | "version": "4.0.14", 915 | "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.14.tgz", 916 | "integrity": "sha512-rNXXMDJfCJLw/ZaFTOLOHoGULxyXfh2iXTGiChFiYTSgKBKQHIGEpV0yn5N25WGzJJ+VBnRjHzlmDqRV+d//oQ==", 917 | "cpu": [ 918 | "x64" 919 | ], 920 | "dev": true, 921 | "license": "MIT", 922 | "optional": true, 923 | "os": [ 924 | "win32" 925 | ], 926 | "engines": { 927 | "node": ">= 10" 928 | } 929 | }, 930 | "node_modules/@tailwindcss/vite": { 931 | "version": "4.0.14", 932 | "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.14.tgz", 933 | "integrity": "sha512-y69ztPTRFy+13EPS/7dEFVl7q2Goh1pQueVO8IfGeyqSpcx/joNJXFk0lLhMgUbF0VFJotwRSb9ZY7Xoq3r26Q==", 934 | "dev": true, 935 | "license": "MIT", 936 | "dependencies": { 937 | "@tailwindcss/node": "4.0.14", 938 | "@tailwindcss/oxide": "4.0.14", 939 | "lightningcss": "1.29.2", 940 | "tailwindcss": "4.0.14" 941 | }, 942 | "peerDependencies": { 943 | "vite": "^5.2.0 || ^6" 944 | } 945 | }, 946 | "node_modules/@types/estree": { 947 | "version": "1.0.6", 948 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 949 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 950 | "dev": true, 951 | "license": "MIT" 952 | }, 953 | "node_modules/detect-libc": { 954 | "version": "2.0.3", 955 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 956 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 957 | "dev": true, 958 | "license": "Apache-2.0", 959 | "engines": { 960 | "node": ">=8" 961 | } 962 | }, 963 | "node_modules/enhanced-resolve": { 964 | "version": "5.18.1", 965 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", 966 | "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", 967 | "dev": true, 968 | "license": "MIT", 969 | "dependencies": { 970 | "graceful-fs": "^4.2.4", 971 | "tapable": "^2.2.0" 972 | }, 973 | "engines": { 974 | "node": ">=10.13.0" 975 | } 976 | }, 977 | "node_modules/esbuild": { 978 | "version": "0.25.1", 979 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", 980 | "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", 981 | "dev": true, 982 | "hasInstallScript": true, 983 | "license": "MIT", 984 | "bin": { 985 | "esbuild": "bin/esbuild" 986 | }, 987 | "engines": { 988 | "node": ">=18" 989 | }, 990 | "optionalDependencies": { 991 | "@esbuild/aix-ppc64": "0.25.1", 992 | "@esbuild/android-arm": "0.25.1", 993 | "@esbuild/android-arm64": "0.25.1", 994 | "@esbuild/android-x64": "0.25.1", 995 | "@esbuild/darwin-arm64": "0.25.1", 996 | "@esbuild/darwin-x64": "0.25.1", 997 | "@esbuild/freebsd-arm64": "0.25.1", 998 | "@esbuild/freebsd-x64": "0.25.1", 999 | "@esbuild/linux-arm": "0.25.1", 1000 | "@esbuild/linux-arm64": "0.25.1", 1001 | "@esbuild/linux-ia32": "0.25.1", 1002 | "@esbuild/linux-loong64": "0.25.1", 1003 | "@esbuild/linux-mips64el": "0.25.1", 1004 | "@esbuild/linux-ppc64": "0.25.1", 1005 | "@esbuild/linux-riscv64": "0.25.1", 1006 | "@esbuild/linux-s390x": "0.25.1", 1007 | "@esbuild/linux-x64": "0.25.1", 1008 | "@esbuild/netbsd-arm64": "0.25.1", 1009 | "@esbuild/netbsd-x64": "0.25.1", 1010 | "@esbuild/openbsd-arm64": "0.25.1", 1011 | "@esbuild/openbsd-x64": "0.25.1", 1012 | "@esbuild/sunos-x64": "0.25.1", 1013 | "@esbuild/win32-arm64": "0.25.1", 1014 | "@esbuild/win32-ia32": "0.25.1", 1015 | "@esbuild/win32-x64": "0.25.1" 1016 | } 1017 | }, 1018 | "node_modules/fsevents": { 1019 | "version": "2.3.3", 1020 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1021 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1022 | "dev": true, 1023 | "hasInstallScript": true, 1024 | "license": "MIT", 1025 | "optional": true, 1026 | "os": [ 1027 | "darwin" 1028 | ], 1029 | "engines": { 1030 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1031 | } 1032 | }, 1033 | "node_modules/graceful-fs": { 1034 | "version": "4.2.11", 1035 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1036 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1037 | "dev": true, 1038 | "license": "ISC" 1039 | }, 1040 | "node_modules/jiti": { 1041 | "version": "2.4.2", 1042 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", 1043 | "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", 1044 | "dev": true, 1045 | "license": "MIT", 1046 | "bin": { 1047 | "jiti": "lib/jiti-cli.mjs" 1048 | } 1049 | }, 1050 | "node_modules/laravel-vite-plugin": { 1051 | "version": "1.2.0", 1052 | "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.2.0.tgz", 1053 | "integrity": "sha512-R0pJ+IcTVeqEMoKz/B2Ij57QVq3sFTABiFmb06gAwFdivbOgsUtuhX6N2MGLEArajrS3U5JbberzwOe7uXHMHQ==", 1054 | "dev": true, 1055 | "license": "MIT", 1056 | "dependencies": { 1057 | "picocolors": "^1.0.0", 1058 | "vite-plugin-full-reload": "^1.1.0" 1059 | }, 1060 | "bin": { 1061 | "clean-orphaned-assets": "bin/clean.js" 1062 | }, 1063 | "engines": { 1064 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 1065 | }, 1066 | "peerDependencies": { 1067 | "vite": "^5.0.0 || ^6.0.0" 1068 | } 1069 | }, 1070 | "node_modules/lightningcss": { 1071 | "version": "1.29.2", 1072 | "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", 1073 | "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", 1074 | "dev": true, 1075 | "license": "MPL-2.0", 1076 | "dependencies": { 1077 | "detect-libc": "^2.0.3" 1078 | }, 1079 | "engines": { 1080 | "node": ">= 12.0.0" 1081 | }, 1082 | "funding": { 1083 | "type": "opencollective", 1084 | "url": "https://opencollective.com/parcel" 1085 | }, 1086 | "optionalDependencies": { 1087 | "lightningcss-darwin-arm64": "1.29.2", 1088 | "lightningcss-darwin-x64": "1.29.2", 1089 | "lightningcss-freebsd-x64": "1.29.2", 1090 | "lightningcss-linux-arm-gnueabihf": "1.29.2", 1091 | "lightningcss-linux-arm64-gnu": "1.29.2", 1092 | "lightningcss-linux-arm64-musl": "1.29.2", 1093 | "lightningcss-linux-x64-gnu": "1.29.2", 1094 | "lightningcss-linux-x64-musl": "1.29.2", 1095 | "lightningcss-win32-arm64-msvc": "1.29.2", 1096 | "lightningcss-win32-x64-msvc": "1.29.2" 1097 | } 1098 | }, 1099 | "node_modules/lightningcss-darwin-arm64": { 1100 | "version": "1.29.2", 1101 | "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", 1102 | "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", 1103 | "cpu": [ 1104 | "arm64" 1105 | ], 1106 | "dev": true, 1107 | "license": "MPL-2.0", 1108 | "optional": true, 1109 | "os": [ 1110 | "darwin" 1111 | ], 1112 | "engines": { 1113 | "node": ">= 12.0.0" 1114 | }, 1115 | "funding": { 1116 | "type": "opencollective", 1117 | "url": "https://opencollective.com/parcel" 1118 | } 1119 | }, 1120 | "node_modules/lightningcss-darwin-x64": { 1121 | "version": "1.29.2", 1122 | "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", 1123 | "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", 1124 | "cpu": [ 1125 | "x64" 1126 | ], 1127 | "dev": true, 1128 | "license": "MPL-2.0", 1129 | "optional": true, 1130 | "os": [ 1131 | "darwin" 1132 | ], 1133 | "engines": { 1134 | "node": ">= 12.0.0" 1135 | }, 1136 | "funding": { 1137 | "type": "opencollective", 1138 | "url": "https://opencollective.com/parcel" 1139 | } 1140 | }, 1141 | "node_modules/lightningcss-freebsd-x64": { 1142 | "version": "1.29.2", 1143 | "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", 1144 | "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", 1145 | "cpu": [ 1146 | "x64" 1147 | ], 1148 | "dev": true, 1149 | "license": "MPL-2.0", 1150 | "optional": true, 1151 | "os": [ 1152 | "freebsd" 1153 | ], 1154 | "engines": { 1155 | "node": ">= 12.0.0" 1156 | }, 1157 | "funding": { 1158 | "type": "opencollective", 1159 | "url": "https://opencollective.com/parcel" 1160 | } 1161 | }, 1162 | "node_modules/lightningcss-linux-arm-gnueabihf": { 1163 | "version": "1.29.2", 1164 | "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", 1165 | "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", 1166 | "cpu": [ 1167 | "arm" 1168 | ], 1169 | "dev": true, 1170 | "license": "MPL-2.0", 1171 | "optional": true, 1172 | "os": [ 1173 | "linux" 1174 | ], 1175 | "engines": { 1176 | "node": ">= 12.0.0" 1177 | }, 1178 | "funding": { 1179 | "type": "opencollective", 1180 | "url": "https://opencollective.com/parcel" 1181 | } 1182 | }, 1183 | "node_modules/lightningcss-linux-arm64-gnu": { 1184 | "version": "1.29.2", 1185 | "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", 1186 | "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", 1187 | "cpu": [ 1188 | "arm64" 1189 | ], 1190 | "dev": true, 1191 | "license": "MPL-2.0", 1192 | "optional": true, 1193 | "os": [ 1194 | "linux" 1195 | ], 1196 | "engines": { 1197 | "node": ">= 12.0.0" 1198 | }, 1199 | "funding": { 1200 | "type": "opencollective", 1201 | "url": "https://opencollective.com/parcel" 1202 | } 1203 | }, 1204 | "node_modules/lightningcss-linux-arm64-musl": { 1205 | "version": "1.29.2", 1206 | "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", 1207 | "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", 1208 | "cpu": [ 1209 | "arm64" 1210 | ], 1211 | "dev": true, 1212 | "license": "MPL-2.0", 1213 | "optional": true, 1214 | "os": [ 1215 | "linux" 1216 | ], 1217 | "engines": { 1218 | "node": ">= 12.0.0" 1219 | }, 1220 | "funding": { 1221 | "type": "opencollective", 1222 | "url": "https://opencollective.com/parcel" 1223 | } 1224 | }, 1225 | "node_modules/lightningcss-linux-x64-gnu": { 1226 | "version": "1.29.2", 1227 | "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", 1228 | "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", 1229 | "cpu": [ 1230 | "x64" 1231 | ], 1232 | "dev": true, 1233 | "license": "MPL-2.0", 1234 | "optional": true, 1235 | "os": [ 1236 | "linux" 1237 | ], 1238 | "engines": { 1239 | "node": ">= 12.0.0" 1240 | }, 1241 | "funding": { 1242 | "type": "opencollective", 1243 | "url": "https://opencollective.com/parcel" 1244 | } 1245 | }, 1246 | "node_modules/lightningcss-linux-x64-musl": { 1247 | "version": "1.29.2", 1248 | "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", 1249 | "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", 1250 | "cpu": [ 1251 | "x64" 1252 | ], 1253 | "dev": true, 1254 | "license": "MPL-2.0", 1255 | "optional": true, 1256 | "os": [ 1257 | "linux" 1258 | ], 1259 | "engines": { 1260 | "node": ">= 12.0.0" 1261 | }, 1262 | "funding": { 1263 | "type": "opencollective", 1264 | "url": "https://opencollective.com/parcel" 1265 | } 1266 | }, 1267 | "node_modules/lightningcss-win32-arm64-msvc": { 1268 | "version": "1.29.2", 1269 | "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", 1270 | "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", 1271 | "cpu": [ 1272 | "arm64" 1273 | ], 1274 | "dev": true, 1275 | "license": "MPL-2.0", 1276 | "optional": true, 1277 | "os": [ 1278 | "win32" 1279 | ], 1280 | "engines": { 1281 | "node": ">= 12.0.0" 1282 | }, 1283 | "funding": { 1284 | "type": "opencollective", 1285 | "url": "https://opencollective.com/parcel" 1286 | } 1287 | }, 1288 | "node_modules/lightningcss-win32-x64-msvc": { 1289 | "version": "1.29.2", 1290 | "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", 1291 | "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", 1292 | "cpu": [ 1293 | "x64" 1294 | ], 1295 | "dev": true, 1296 | "license": "MPL-2.0", 1297 | "optional": true, 1298 | "os": [ 1299 | "win32" 1300 | ], 1301 | "engines": { 1302 | "node": ">= 12.0.0" 1303 | }, 1304 | "funding": { 1305 | "type": "opencollective", 1306 | "url": "https://opencollective.com/parcel" 1307 | } 1308 | }, 1309 | "node_modules/nanoid": { 1310 | "version": "3.3.9", 1311 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", 1312 | "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", 1313 | "dev": true, 1314 | "funding": [ 1315 | { 1316 | "type": "github", 1317 | "url": "https://github.com/sponsors/ai" 1318 | } 1319 | ], 1320 | "license": "MIT", 1321 | "bin": { 1322 | "nanoid": "bin/nanoid.cjs" 1323 | }, 1324 | "engines": { 1325 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1326 | } 1327 | }, 1328 | "node_modules/picocolors": { 1329 | "version": "1.1.1", 1330 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1331 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1332 | "dev": true, 1333 | "license": "ISC" 1334 | }, 1335 | "node_modules/picomatch": { 1336 | "version": "2.3.1", 1337 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1338 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1339 | "dev": true, 1340 | "license": "MIT", 1341 | "engines": { 1342 | "node": ">=8.6" 1343 | }, 1344 | "funding": { 1345 | "url": "https://github.com/sponsors/jonschlinkert" 1346 | } 1347 | }, 1348 | "node_modules/postcss": { 1349 | "version": "8.5.3", 1350 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 1351 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1352 | "dev": true, 1353 | "funding": [ 1354 | { 1355 | "type": "opencollective", 1356 | "url": "https://opencollective.com/postcss/" 1357 | }, 1358 | { 1359 | "type": "tidelift", 1360 | "url": "https://tidelift.com/funding/github/npm/postcss" 1361 | }, 1362 | { 1363 | "type": "github", 1364 | "url": "https://github.com/sponsors/ai" 1365 | } 1366 | ], 1367 | "license": "MIT", 1368 | "dependencies": { 1369 | "nanoid": "^3.3.8", 1370 | "picocolors": "^1.1.1", 1371 | "source-map-js": "^1.2.1" 1372 | }, 1373 | "engines": { 1374 | "node": "^10 || ^12 || >=14" 1375 | } 1376 | }, 1377 | "node_modules/prettier": { 1378 | "version": "3.5.3", 1379 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", 1380 | "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", 1381 | "dev": true, 1382 | "license": "MIT", 1383 | "bin": { 1384 | "prettier": "bin/prettier.cjs" 1385 | }, 1386 | "engines": { 1387 | "node": ">=14" 1388 | }, 1389 | "funding": { 1390 | "url": "https://github.com/prettier/prettier?sponsor=1" 1391 | } 1392 | }, 1393 | "node_modules/prettier-plugin-organize-imports": { 1394 | "version": "4.1.0", 1395 | "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz", 1396 | "integrity": "sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==", 1397 | "dev": true, 1398 | "license": "MIT", 1399 | "peerDependencies": { 1400 | "prettier": ">=2.0", 1401 | "typescript": ">=2.9", 1402 | "vue-tsc": "^2.1.0" 1403 | }, 1404 | "peerDependenciesMeta": { 1405 | "vue-tsc": { 1406 | "optional": true 1407 | } 1408 | } 1409 | }, 1410 | "node_modules/prettier-plugin-tailwindcss": { 1411 | "version": "0.6.11", 1412 | "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.11.tgz", 1413 | "integrity": "sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==", 1414 | "dev": true, 1415 | "license": "MIT", 1416 | "engines": { 1417 | "node": ">=14.21.3" 1418 | }, 1419 | "peerDependencies": { 1420 | "@ianvs/prettier-plugin-sort-imports": "*", 1421 | "@prettier/plugin-pug": "*", 1422 | "@shopify/prettier-plugin-liquid": "*", 1423 | "@trivago/prettier-plugin-sort-imports": "*", 1424 | "@zackad/prettier-plugin-twig": "*", 1425 | "prettier": "^3.0", 1426 | "prettier-plugin-astro": "*", 1427 | "prettier-plugin-css-order": "*", 1428 | "prettier-plugin-import-sort": "*", 1429 | "prettier-plugin-jsdoc": "*", 1430 | "prettier-plugin-marko": "*", 1431 | "prettier-plugin-multiline-arrays": "*", 1432 | "prettier-plugin-organize-attributes": "*", 1433 | "prettier-plugin-organize-imports": "*", 1434 | "prettier-plugin-sort-imports": "*", 1435 | "prettier-plugin-style-order": "*", 1436 | "prettier-plugin-svelte": "*" 1437 | }, 1438 | "peerDependenciesMeta": { 1439 | "@ianvs/prettier-plugin-sort-imports": { 1440 | "optional": true 1441 | }, 1442 | "@prettier/plugin-pug": { 1443 | "optional": true 1444 | }, 1445 | "@shopify/prettier-plugin-liquid": { 1446 | "optional": true 1447 | }, 1448 | "@trivago/prettier-plugin-sort-imports": { 1449 | "optional": true 1450 | }, 1451 | "@zackad/prettier-plugin-twig": { 1452 | "optional": true 1453 | }, 1454 | "prettier-plugin-astro": { 1455 | "optional": true 1456 | }, 1457 | "prettier-plugin-css-order": { 1458 | "optional": true 1459 | }, 1460 | "prettier-plugin-import-sort": { 1461 | "optional": true 1462 | }, 1463 | "prettier-plugin-jsdoc": { 1464 | "optional": true 1465 | }, 1466 | "prettier-plugin-marko": { 1467 | "optional": true 1468 | }, 1469 | "prettier-plugin-multiline-arrays": { 1470 | "optional": true 1471 | }, 1472 | "prettier-plugin-organize-attributes": { 1473 | "optional": true 1474 | }, 1475 | "prettier-plugin-organize-imports": { 1476 | "optional": true 1477 | }, 1478 | "prettier-plugin-sort-imports": { 1479 | "optional": true 1480 | }, 1481 | "prettier-plugin-style-order": { 1482 | "optional": true 1483 | }, 1484 | "prettier-plugin-svelte": { 1485 | "optional": true 1486 | } 1487 | } 1488 | }, 1489 | "node_modules/rollup": { 1490 | "version": "4.35.0", 1491 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz", 1492 | "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==", 1493 | "dev": true, 1494 | "license": "MIT", 1495 | "dependencies": { 1496 | "@types/estree": "1.0.6" 1497 | }, 1498 | "bin": { 1499 | "rollup": "dist/bin/rollup" 1500 | }, 1501 | "engines": { 1502 | "node": ">=18.0.0", 1503 | "npm": ">=8.0.0" 1504 | }, 1505 | "optionalDependencies": { 1506 | "@rollup/rollup-android-arm-eabi": "4.35.0", 1507 | "@rollup/rollup-android-arm64": "4.35.0", 1508 | "@rollup/rollup-darwin-arm64": "4.35.0", 1509 | "@rollup/rollup-darwin-x64": "4.35.0", 1510 | "@rollup/rollup-freebsd-arm64": "4.35.0", 1511 | "@rollup/rollup-freebsd-x64": "4.35.0", 1512 | "@rollup/rollup-linux-arm-gnueabihf": "4.35.0", 1513 | "@rollup/rollup-linux-arm-musleabihf": "4.35.0", 1514 | "@rollup/rollup-linux-arm64-gnu": "4.35.0", 1515 | "@rollup/rollup-linux-arm64-musl": "4.35.0", 1516 | "@rollup/rollup-linux-loongarch64-gnu": "4.35.0", 1517 | "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0", 1518 | "@rollup/rollup-linux-riscv64-gnu": "4.35.0", 1519 | "@rollup/rollup-linux-s390x-gnu": "4.35.0", 1520 | "@rollup/rollup-linux-x64-gnu": "4.35.0", 1521 | "@rollup/rollup-linux-x64-musl": "4.35.0", 1522 | "@rollup/rollup-win32-arm64-msvc": "4.35.0", 1523 | "@rollup/rollup-win32-ia32-msvc": "4.35.0", 1524 | "@rollup/rollup-win32-x64-msvc": "4.35.0", 1525 | "fsevents": "~2.3.2" 1526 | } 1527 | }, 1528 | "node_modules/source-map-js": { 1529 | "version": "1.2.1", 1530 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1531 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1532 | "dev": true, 1533 | "license": "BSD-3-Clause", 1534 | "engines": { 1535 | "node": ">=0.10.0" 1536 | } 1537 | }, 1538 | "node_modules/tailwindcss": { 1539 | "version": "4.0.14", 1540 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.14.tgz", 1541 | "integrity": "sha512-92YT2dpt671tFiHH/e1ok9D987N9fHD5VWoly1CdPD/Cd1HMglvZwP3nx2yTj2lbXDAHt8QssZkxTLCCTNL+xw==", 1542 | "dev": true, 1543 | "license": "MIT" 1544 | }, 1545 | "node_modules/tapable": { 1546 | "version": "2.2.1", 1547 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 1548 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 1549 | "dev": true, 1550 | "license": "MIT", 1551 | "engines": { 1552 | "node": ">=6" 1553 | } 1554 | }, 1555 | "node_modules/typescript": { 1556 | "version": "5.8.2", 1557 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 1558 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 1559 | "dev": true, 1560 | "license": "Apache-2.0", 1561 | "peer": true, 1562 | "bin": { 1563 | "tsc": "bin/tsc", 1564 | "tsserver": "bin/tsserver" 1565 | }, 1566 | "engines": { 1567 | "node": ">=14.17" 1568 | } 1569 | }, 1570 | "node_modules/vite": { 1571 | "version": "6.2.2", 1572 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.2.tgz", 1573 | "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", 1574 | "dev": true, 1575 | "license": "MIT", 1576 | "dependencies": { 1577 | "esbuild": "^0.25.0", 1578 | "postcss": "^8.5.3", 1579 | "rollup": "^4.30.1" 1580 | }, 1581 | "bin": { 1582 | "vite": "bin/vite.js" 1583 | }, 1584 | "engines": { 1585 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 1586 | }, 1587 | "funding": { 1588 | "url": "https://github.com/vitejs/vite?sponsor=1" 1589 | }, 1590 | "optionalDependencies": { 1591 | "fsevents": "~2.3.3" 1592 | }, 1593 | "peerDependencies": { 1594 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 1595 | "jiti": ">=1.21.0", 1596 | "less": "*", 1597 | "lightningcss": "^1.21.0", 1598 | "sass": "*", 1599 | "sass-embedded": "*", 1600 | "stylus": "*", 1601 | "sugarss": "*", 1602 | "terser": "^5.16.0", 1603 | "tsx": "^4.8.1", 1604 | "yaml": "^2.4.2" 1605 | }, 1606 | "peerDependenciesMeta": { 1607 | "@types/node": { 1608 | "optional": true 1609 | }, 1610 | "jiti": { 1611 | "optional": true 1612 | }, 1613 | "less": { 1614 | "optional": true 1615 | }, 1616 | "lightningcss": { 1617 | "optional": true 1618 | }, 1619 | "sass": { 1620 | "optional": true 1621 | }, 1622 | "sass-embedded": { 1623 | "optional": true 1624 | }, 1625 | "stylus": { 1626 | "optional": true 1627 | }, 1628 | "sugarss": { 1629 | "optional": true 1630 | }, 1631 | "terser": { 1632 | "optional": true 1633 | }, 1634 | "tsx": { 1635 | "optional": true 1636 | }, 1637 | "yaml": { 1638 | "optional": true 1639 | } 1640 | } 1641 | }, 1642 | "node_modules/vite-plugin-full-reload": { 1643 | "version": "1.2.0", 1644 | "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", 1645 | "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", 1646 | "dev": true, 1647 | "license": "MIT", 1648 | "dependencies": { 1649 | "picocolors": "^1.0.0", 1650 | "picomatch": "^2.3.1" 1651 | } 1652 | } 1653 | } 1654 | } 1655 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "build": "vite build", 6 | "dev": "vite", 7 | "lint": "prettier --write resources/", 8 | "test:lint": "prettier --check resources/" 9 | }, 10 | "devDependencies": { 11 | "@tailwindcss/vite": "^4.0.14", 12 | "laravel-vite-plugin": "^1.2.0", 13 | "tailwindcss": "^4.0.14", 14 | "vite": "^6.2.2", 15 | "prettier": "^3.5.3", 16 | "prettier-plugin-organize-imports": "^4.1.0", 17 | "prettier-plugin-tailwindcss": "^0.6.11" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /peck.json: -------------------------------------------------------------------------------- 1 | { 2 | "preset": "laravel", 3 | "ignore": { 4 | "words": [ 5 | "php", 6 | "filesystems", 7 | "favicon", 8 | "js" 9 | ], 10 | "paths": [] 11 | } 12 | } -------------------------------------------------------------------------------- /phpstan.neon: -------------------------------------------------------------------------------- 1 | includes: 2 | - vendor/larastan/larastan/extension.neon 3 | - vendor/nesbot/carbon/extension.neon 4 | 5 | parameters: 6 | 7 | paths: 8 | - app/ 9 | 10 | level: max 11 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | tests/Unit 10 | 11 | 12 | tests/Feature 13 | 14 | 15 | 16 | 17 | app 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /pint.json: -------------------------------------------------------------------------------- 1 | { 2 | "preset": "laravel", 3 | "notPath": [ 4 | "tests/TestCase.php" 5 | ], 6 | "rules": { 7 | "array_push": true, 8 | "backtick_to_shell_exec": true, 9 | "date_time_immutable": true, 10 | "declare_strict_types": true, 11 | "lowercase_keywords": true, 12 | "lowercase_static_reference": true, 13 | "final_class": true, 14 | "final_internal_class": true, 15 | "final_public_method_for_abstract_class": true, 16 | "fully_qualified_strict_types": true, 17 | "global_namespace_import": { 18 | "import_classes": true, 19 | "import_constants": true, 20 | "import_functions": true 21 | }, 22 | "mb_str_functions": true, 23 | "modernize_types_casting": true, 24 | "new_with_parentheses": false, 25 | "no_superfluous_elseif": true, 26 | "no_useless_else": true, 27 | "no_multiple_statements_per_line": true, 28 | "ordered_class_elements": { 29 | "order": [ 30 | "use_trait", 31 | "case", 32 | "constant", 33 | "constant_public", 34 | "constant_protected", 35 | "constant_private", 36 | "property_public", 37 | "property_protected", 38 | "property_private", 39 | "construct", 40 | "destruct", 41 | "magic", 42 | "phpunit", 43 | "method_abstract", 44 | "method_public_static", 45 | "method_public", 46 | "method_protected_static", 47 | "method_protected", 48 | "method_private_static", 49 | "method_private" 50 | ], 51 | "sort_algorithm": "none" 52 | }, 53 | "ordered_interfaces": true, 54 | "ordered_traits": true, 55 | "protected_to_private": true, 56 | "self_accessor": true, 57 | "self_static_accessor": true, 58 | "strict_comparison": true, 59 | "visibility_required": true 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Handle X-XSRF-Token Header 13 | RewriteCond %{HTTP:x-xsrf-token} . 14 | RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] 15 | 16 | # Redirect Trailing Slashes If Not A Folder... 17 | RewriteCond %{REQUEST_FILENAME} !-d 18 | RewriteCond %{REQUEST_URI} (.+)/$ 19 | RewriteRule ^ %1 [L,R=301] 20 | 21 | # Send Requests To Front Controller... 22 | RewriteCond %{REQUEST_FILENAME} !-d 23 | RewriteCond %{REQUEST_FILENAME} !-f 24 | RewriteRule ^ index.php [L] 25 | 26 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunomaduro/laravel-starter-kit/55a10160281d2085a56b898b296eab17fb36dade/public/favicon.ico -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | handleRequest(Request::capture()); 23 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /rector.php: -------------------------------------------------------------------------------- 1 | withPaths([ 10 | __DIR__.'/app', 11 | __DIR__.'/bootstrap/app.php', 12 | __DIR__.'/database', 13 | __DIR__.'/public', 14 | ]) 15 | ->withSkip([ 16 | AddOverrideAttributeToOverriddenMethodsRector::class, 17 | ]) 18 | ->withPreparedSets( 19 | deadCode: true, 20 | codeQuality: true, 21 | typeDeclarations: true, 22 | privatization: true, 23 | earlyReturn: true, 24 | strictBooleans: true, 25 | ) 26 | ->withPhpSets(); 27 | -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss"; 2 | 3 | @source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; 4 | @source '../../storage/framework/views/*.php'; 5 | @source "../**/*.blade.php"; 6 | @source "../**/*.js"; 7 | @source "../**/*.vue"; 8 | 9 | @theme { 10 | --font-sans: 11 | "Instrument Sans", ui-sans-serif, system-ui, sans-serif, 12 | "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", 13 | "Noto Color Emoji"; 14 | } 15 | -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | // 2 | -------------------------------------------------------------------------------- /resources/views/welcome.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Laravel 8 | 9 | 10 | 11 | 12 | 13 | 14 | @if (file_exists(public_path('build/manifest.json')) || file_exists(public_path('hot'))) 15 | @vite(['resources/css/app.css', 'resources/js/app.js']) 16 | @else 17 | 20 | @endif 21 | 22 | 23 |
24 | @if (Route::has('login')) 25 | 50 | @endif 51 |
52 |
53 |
54 |
55 |

Let's get started

56 |

Laravel has an incredibly rich ecosystem.
We suggest starting with the following.

57 | 113 | 120 |
121 |
122 | {{-- Laravel Logo --}} 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | {{-- Light Mode 12 SVG --}} 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | {{-- Dark Mode 12 SVG --}} 203 | 268 |
269 |
270 |
271 |
272 | 273 | @if (Route::has('login')) 274 | 275 | @endif 276 | 277 | 278 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | extend(Tests\TestCase::class) 19 | ->use(Illuminate\Foundation\Testing\RefreshDatabase::class) 20 | ->beforeEach(function () { 21 | Str::createRandomStringsNormally(); 22 | Str::createUuidsNormally(); 23 | Http::preventStrayRequests(); 24 | Sleep::fake(); 25 | 26 | $this->freezeTime(); 27 | }) 28 | ->in('Feature', 'Unit'); 29 | 30 | /* 31 | |-------------------------------------------------------------------------- 32 | | Expectations 33 | |-------------------------------------------------------------------------- 34 | | 35 | | When you're writing tests, you often need to check that values meet certain conditions. The 36 | | "expect()" function gives you access to a set of "expectations" methods that you can use 37 | | to assert different things. Of course, you may extend the Expectation API at any time. 38 | | 39 | */ 40 | 41 | expect()->extend('toBeOne', function () { 42 | return $this->toBe(1); 43 | }); 44 | 45 | /* 46 | |-------------------------------------------------------------------------- 47 | | Functions 48 | |-------------------------------------------------------------------------- 49 | | 50 | | While Pest is very powerful out-of-the-box, you may have some testing code specific to your 51 | | project that you don't want to repeat in every file. Here you can also expose helpers as 52 | | global functions to help you to reduce the number of lines of code in your test files. 53 | | 54 | */ 55 | 56 | function something() 57 | { 58 | // .. 59 | } 60 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | preset()->php(); 6 | arch()->preset()->strict(); 7 | arch()->preset()->laravel(); 8 | arch()->preset()->security(); 9 | 10 | arch('controllers') 11 | ->expect('App\Http\Controllers') 12 | ->not->toBeUsed(); 13 | 14 | // 15 | -------------------------------------------------------------------------------- /tests/Unit/Enum/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunomaduro/laravel-starter-kit/55a10160281d2085a56b898b296eab17fb36dade/tests/Unit/Enum/.gitkeep -------------------------------------------------------------------------------- /tests/Unit/Models/UserTest.php: -------------------------------------------------------------------------------- 1 | create()->refresh(); 9 | 10 | expect(array_keys($user->toArray())) 11 | ->toBe([ 12 | 'id', 13 | 'name', 14 | 'email', 15 | 'email_verified_at', 16 | 'created_at', 17 | 'updated_at', 18 | ]); 19 | }); 20 | -------------------------------------------------------------------------------- /tests/Unit/Services/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nunomaduro/laravel-starter-kit/55a10160281d2085a56b898b296eab17fb36dade/tests/Unit/Services/.gitkeep -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import laravel from 'laravel-vite-plugin'; 3 | import tailwindcss from '@tailwindcss/vite'; 4 | 5 | export default defineConfig({ 6 | plugins: [ 7 | laravel({ 8 | input: ['resources/css/app.css', 'resources/js/app.js'], 9 | refresh: true, 10 | }), 11 | tailwindcss(), 12 | ], 13 | }); 14 | --------------------------------------------------------------------------------