├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── README.md ├── app ├── Console │ ├── Commands │ │ ├── InstallTailwind.php │ │ └── WipeCache.php │ └── Kernel.php ├── Exceptions │ └── Handler.php ├── Http │ ├── Controllers │ │ ├── Controller.php │ │ └── GenerateController.php │ ├── Kernel.php │ ├── Middleware │ │ ├── Authenticate.php │ │ ├── EncryptCookies.php │ │ ├── PreventRequestsDuringMaintenance.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── TrimStrings.php │ │ ├── TrustHosts.php │ │ ├── TrustProxies.php │ │ ├── ValidateSignature.php │ │ └── VerifyCsrfToken.php │ └── Requests │ │ └── GenerateRequest.php ├── Models │ └── User.php └── Providers │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── BroadcastServiceProvider.php │ ├── EventServiceProvider.php │ └── RouteServiceProvider.php ├── artisan ├── bin └── .gitignore ├── bootstrap ├── app.php └── cache │ └── .gitignore ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── broadcasting.php ├── cache.php ├── cors.php ├── database.php ├── filesystems.php ├── hashing.php ├── logging.php ├── mail.php ├── queue.php ├── services.php ├── session.php ├── torchlight.php └── view.php ├── database ├── .gitignore ├── factories │ └── UserFactory.php ├── migrations │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2014_10_12_100000_create_password_reset_tokens_table.php │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ └── 2019_12_14_000001_create_personal_access_tokens_table.php └── seeders │ └── DatabaseSeeder.php ├── package-lock.json ├── package.json ├── phpunit.xml ├── public ├── .htaccess ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── browserconfig.xml ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── index.php ├── logo-dark.svg ├── logo-mini.svg ├── logo.svg ├── mstile-150x150.png ├── og_facebook.png ├── og_twitter.png ├── robots.txt ├── safari-pinned-tab.svg └── site.webmanifest ├── resources ├── css │ ├── all.css │ └── app.css ├── examples │ ├── additional-parameters.html │ ├── attach-parameters.html │ ├── enable-plugins.html │ ├── exclude-preflight.html │ ├── insert-tag.html │ ├── prefixed-utilities.html │ ├── receive-stylesheet.css │ └── unminified-css.html ├── js │ ├── app.js │ └── bootstrap.js └── views │ ├── components │ ├── error.blade.php │ ├── layout.blade.php │ └── step.blade.php │ ├── errors │ ├── 401.blade.php │ ├── 402.blade.php │ ├── 403.blade.php │ ├── 404.blade.php │ ├── 419.blade.php │ ├── 422.blade.php │ ├── 429.blade.php │ ├── 500.blade.php │ └── 503.blade.php │ └── welcome.blade.php ├── routes ├── api.php ├── channels.php ├── console.php └── web.php ├── storage ├── app │ ├── .gitignore │ └── public │ │ └── .gitignore ├── css │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore ├── js │ └── .gitignore └── logs │ └── .gitignore ├── tests ├── CreatesApplication.php ├── Feature │ ├── GenerateTest.php │ └── WelcomeTest.php ├── Pest.php └── TestCase.php └── 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 | LOG_CHANNEL=stack 8 | LOG_DEPRECATIONS_CHANNEL=null 9 | LOG_LEVEL=debug 10 | 11 | DB_CONNECTION=mysql 12 | DB_HOST=127.0.0.1 13 | DB_PORT=3306 14 | DB_DATABASE=curlwind 15 | DB_USERNAME=root 16 | DB_PASSWORD= 17 | 18 | BROADCAST_DRIVER=log 19 | CACHE_DRIVER=file 20 | FILESYSTEM_DISK=local 21 | QUEUE_CONNECTION=sync 22 | SESSION_DRIVER=file 23 | SESSION_LIFETIME=120 24 | 25 | MEMCACHED_HOST=127.0.0.1 26 | 27 | REDIS_HOST=127.0.0.1 28 | REDIS_PASSWORD=null 29 | REDIS_PORT=6379 30 | 31 | MAIL_MAILER=smtp 32 | MAIL_HOST=mailpit 33 | MAIL_PORT=1025 34 | MAIL_USERNAME=null 35 | MAIL_PASSWORD=null 36 | MAIL_ENCRYPTION=null 37 | MAIL_FROM_ADDRESS="hello@example.com" 38 | MAIL_FROM_NAME="${APP_NAME}" 39 | 40 | AWS_ACCESS_KEY_ID= 41 | AWS_SECRET_ACCESS_KEY= 42 | AWS_DEFAULT_REGION=us-east-1 43 | AWS_BUCKET= 44 | AWS_USE_PATH_STYLE_ENDPOINT=false 45 | 46 | PUSHER_APP_ID= 47 | PUSHER_APP_KEY= 48 | PUSHER_APP_SECRET= 49 | PUSHER_HOST= 50 | PUSHER_PORT=443 51 | PUSHER_SCHEME=https 52 | PUSHER_APP_CLUSTER=mt1 53 | 54 | VITE_APP_NAME="${APP_NAME}" 55 | VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" 56 | VITE_PUSHER_HOST="${PUSHER_HOST}" 57 | VITE_PUSHER_PORT="${PUSHER_PORT}" 58 | VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" 59 | VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" 60 | -------------------------------------------------------------------------------- /.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 | /vendor 8 | .env 9 | .env.backup 10 | .env.production 11 | .phpunit.result.cache 12 | Homestead.json 13 | Homestead.yaml 14 | auth.json 15 | npm-debug.log 16 | yarn-error.log 17 | /.fleet 18 | /.idea 19 | /.vscode 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Curlwind Logo Logo

2 | 3 |

4 | Dynamically generate Tailwind (v3) CSS utility stylesheets. 5 |

6 | 7 |
8 | 9 |

10 | 11 |

12 | 13 | ## Usage 14 | 15 | ### Insert Tag 16 | 17 | Add the stylesheet tag to your site's head tag: 18 | 19 | ```html 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | ``` 31 | 32 | ### Attach Classes 33 | 34 | Attach the `classes` query parameter to URL receive a stylesheet with only the classes you need. 35 | 36 | Use commas and wildcards to match multiple classes: 37 | 38 | ```html 39 | 40 | ``` 41 | 42 | ### Receive Stylesheet 43 | 44 | The generated stylesheet will contain only the classes you need: 45 | 46 | ```css 47 | /* output.css */ 48 | 49 | .p-0 { 50 | padding: 0px; 51 | } 52 | 53 | .p-1 { 54 | padding: 0.25rem; 55 | } 56 | 57 | /* ... */ 58 | 59 | .m-0 { 60 | margin: 0px; 61 | } 62 | 63 | .m-1 { 64 | margin: 0.25rem; 65 | } 66 | 67 | /* ... */ 68 | ``` 69 | 70 | ### Options 71 | 72 | ### Generate Variants 73 | 74 | Insert a colon (:) after the class name to generate variants: 75 | 76 | ```html 77 | 78 | ``` 79 | 80 | ### Exclude Preflight 81 | 82 | Generate stylesheets without Tailwind's Preflight CSS: 83 | 84 | ```html 85 | 86 | ``` 87 | 88 | ### Prefixed Utilities 89 | 90 | Generate utility classes with a prefix: 91 | 92 | ```html 93 | 94 | ``` 95 | 96 | ### Unminified CSS 97 | 98 | Generate stylesheets unminified: 99 | 100 | ```html 101 | 102 | ``` 103 | 104 | ### Enable Plugins 105 | 106 | Generate stylesheets with built-in Tailwind plugins enabled. 107 | 108 | ```html 109 | 110 | ``` 111 | -------------------------------------------------------------------------------- /app/Console/Commands/InstallTailwind.php: -------------------------------------------------------------------------------- 1 | getBinaryName()) { 34 | throw new Exception('Unsupported OS.'); 35 | }; 36 | 37 | if (! $release = $this->getLatestRelease()) { 38 | throw new Exception('Unable to determine the latest TailwindCSS release.'); 39 | } 40 | 41 | $outputFile = base_path("bin/$binary"); 42 | 43 | if (file_exists($outputFile) && ! $this->option('force')) { 44 | $this->error("The file $outputFile already exists. Use the --force option to overwrite it."); 45 | 46 | return static::FAILURE; 47 | } 48 | 49 | $this->info('Downloading TailwindCSS...'); 50 | 51 | Http::withOptions([ 52 | 'sink' => $outputFile, 53 | 'progress' => $this->onProgress(...), 54 | ])->timeout(0)->throw()->get( 55 | "https://github.com/tailwindlabs/tailwindcss/releases/download/$release/$binary" 56 | ); 57 | 58 | $this->newLine(); 59 | 60 | $this->info("File downloaded successfully to $outputFile."); 61 | 62 | chmod($outputFile, 0755); 63 | 64 | $this->info("File permissions set to executable."); 65 | 66 | return static::SUCCESS; 67 | } 68 | 69 | /** 70 | * Get the name of the binary to save for the current OS. 71 | */ 72 | protected function getBinaryName():?string 73 | { 74 | return match (PHP_OS_FAMILY) { 75 | 'Darwin' => 'tailwindcss-macos-x64', 76 | 'Linux' => 'tailwindcss-linux-x64', 77 | default => null, 78 | }; 79 | } 80 | 81 | /** 82 | * Get the latest (v3.0) release of TailwindCSS. 83 | */ 84 | protected function getLatestRelease(): ?string 85 | { 86 | $releases = Http::get('https://api.github.com/repos/tailwindlabs/tailwindcss/releases')->json(); 87 | 88 | $v3Releases = collect($releases)->filter(function ($release) { 89 | return Str::startsWith($release['tag_name'] ?? '', 'v3.'); 90 | }); 91 | 92 | $latestV3Release = $v3Releases->sortByDesc('published_at')->first(); 93 | 94 | return $latestV3Release['tag_name'] ?? null; 95 | } 96 | 97 | /** 98 | * Handle displaying the download progress. 99 | */ 100 | protected function onProgress(int $total, int $downloaded): void 101 | { 102 | if (! $total) { 103 | return; 104 | } 105 | 106 | static $progress; 107 | 108 | if (! $progress) { 109 | $progress = $this->output->createProgressBar($total); 110 | 111 | $progress->setFormat('%current%/%max% [%bar%] %percent%%'); 112 | 113 | $progress->setPlaceholderFormatterDefinition('current', fn (ProgressBar $bar) => ( 114 | Number::fileSize($bar->getProgress()) 115 | )); 116 | 117 | $progress->setPlaceholderFormatterDefinition('max', fn (ProgressBar $bar) => ( 118 | Number::fileSize($bar->getMaxSteps()) 119 | )); 120 | 121 | $progress->start(); 122 | } 123 | 124 | if ($total === $downloaded) { 125 | $progress->finish(); 126 | 127 | return; 128 | } 129 | 130 | $progress->setProgress($downloaded); 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /app/Console/Commands/WipeCache.php: -------------------------------------------------------------------------------- 1 | disks as $disk) { 35 | $this->info("Wiping $disk disk..."); 36 | 37 | foreach(Storage::disk($disk)->allFiles() as $file) { 38 | if ($file === '.gitignore') { 39 | continue; 40 | } 41 | 42 | Storage::disk($disk)->delete($file); 43 | } 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command(InstallTailwind::class, ['--force' => true])->weekly(); 17 | } 18 | 19 | /** 20 | * Register the commands for the application. 21 | */ 22 | protected function commands(): void 23 | { 24 | $this->load(__DIR__.'/Commands'); 25 | 26 | require base_path('routes/console.php'); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | protected $dontFlash = [ 16 | 'current_password', 17 | 'password', 18 | 'password_confirmation', 19 | ]; 20 | 21 | /** 22 | * Register the exception handling callbacks for the application. 23 | */ 24 | public function register(): void 25 | { 26 | $this->reportable(function (Throwable $e) { 27 | // 28 | }); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | input('prefix') ?? null; 20 | 21 | $plugins = Arr::sort($request->input('plugins')); 22 | $classes = Arr::sort($request->input('classes')); 23 | 24 | $filename = md5(implode(array_merge($classes, $plugins, [ 25 | $preflight = $request->boolean('preflight', true), 26 | $minify = $request->boolean('minify', true), 27 | ]))); 28 | 29 | $js = storage_path("js/$filename.js"); 30 | $css = storage_path("css/$filename.css"); 31 | 32 | if (file_exists($css) && $request->boolean('cache', true)) { 33 | return $this->response($css); 34 | } 35 | 36 | Storage::disk('js')->put( 37 | "$filename.js", 38 | $this->generateTailwindConfig($prefix, $classes, $plugins, $preflight) 39 | ); 40 | 41 | $binary = match (PHP_OS_FAMILY) { 42 | 'Darwin' => './tailwindcss-macos-x64', 43 | 'Linux' => './tailwindcss-linux-x64', 44 | default => throw new Exception('Unsupported OS'), 45 | }; 46 | 47 | // Generate the CSS file 48 | Process::timeout(30) 49 | ->path(base_path('bin')) 50 | ->run(array_filter([ 51 | $binary, 52 | '-i', 53 | resource_path('css/app.css'), 54 | '-c', 55 | $js, 56 | '-o', 57 | $css, 58 | $minify ? '--minify' : null, 59 | ]))->throw(); 60 | 61 | return $this->response($css); 62 | } 63 | 64 | /** 65 | * Return a streamed response. 66 | */ 67 | protected function response(string $css): StreamedResponse 68 | { 69 | return response()->stream(fn () => readfile($css), 200, [ 70 | 'Cache-Control' => 'public, max-age=31536000, immutable', 71 | 'Content-Type' => 'text/css', 72 | ]); 73 | } 74 | 75 | /** 76 | * Generate a new Tailwind config file. 77 | */ 78 | protected function generateTailwindConfig(?string $prefix, array $classes, array $plugins = [], bool $preflight = true): string 79 | { 80 | $patterns = array_map(function (string $pattern) { 81 | [$matcher, $variants] = array_pad(explode(':', $pattern), 2, null); 82 | 83 | $regex = str($matcher) 84 | ->replace('*', '[a-z0-9]+') 85 | ->replace('-', '\\-') 86 | ->replace('/', '\\/') 87 | ->tap(fn ($regex) => json_encode($regex)) 88 | ->unwrap('"'); 89 | 90 | $variants = json_encode($variants ? explode('|', $variants) : []); 91 | 92 | return << ( 100 | "require('@tailwindcss/$plugin')" 101 | ), $plugins)); 102 | 103 | $preflight = $preflight ? 'true' : 'false'; 104 | 105 | return << 15 | */ 16 | protected $middleware = [ 17 | \Torchlight\Middleware\RenderTorchlight::class, 18 | // \App\Http\Middleware\TrustHosts::class, 19 | \App\Http\Middleware\TrustProxies::class, 20 | \Illuminate\Http\Middleware\HandleCors::class, 21 | \App\Http\Middleware\PreventRequestsDuringMaintenance::class, 22 | \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, 23 | \App\Http\Middleware\TrimStrings::class, 24 | \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, 25 | ]; 26 | 27 | /** 28 | * The application's route middleware groups. 29 | * 30 | * @var array> 31 | */ 32 | protected $middlewareGroups = [ 33 | 'web' => [ 34 | \App\Http\Middleware\EncryptCookies::class, 35 | \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 36 | \Illuminate\Session\Middleware\StartSession::class, 37 | \Illuminate\View\Middleware\ShareErrorsFromSession::class, 38 | \App\Http\Middleware\VerifyCsrfToken::class, 39 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 40 | ], 41 | 42 | 'api' => [ 43 | // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 44 | \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', 45 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 46 | ], 47 | ]; 48 | 49 | /** 50 | * The application's middleware aliases. 51 | * 52 | * Aliases may be used instead of class names to conveniently assign middleware to routes and groups. 53 | * 54 | * @var array 55 | */ 56 | protected $middlewareAliases = [ 57 | 'auth' => \App\Http\Middleware\Authenticate::class, 58 | 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 59 | 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, 60 | 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 61 | 'can' => \Illuminate\Auth\Middleware\Authorize::class, 62 | 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 63 | 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 64 | 'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class, 65 | 'signed' => \App\Http\Middleware\ValidateSignature::class, 66 | 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 67 | 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 68 | ]; 69 | } 70 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson() ? null : route('login'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Middleware/PreventRequestsDuringMaintenance.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Middleware/RedirectIfAuthenticated.php: -------------------------------------------------------------------------------- 1 | check()) { 24 | return redirect(RouteServiceProvider::HOME); 25 | } 26 | } 27 | 28 | return $next($request); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | 'current_password', 16 | 'password', 17 | 'password_confirmation', 18 | ]; 19 | } 20 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustHosts.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | public function hosts(): array 15 | { 16 | return [ 17 | $this->allSubdomainsOfApplicationUrl(), 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustProxies.php: -------------------------------------------------------------------------------- 1 | |string|null 14 | */ 15 | protected $proxies; 16 | 17 | /** 18 | * The headers that should be used to detect proxies. 19 | * 20 | * @var int 21 | */ 22 | protected $headers = 23 | Request::HEADER_X_FORWARDED_FOR | 24 | Request::HEADER_X_FORWARDED_HOST | 25 | Request::HEADER_X_FORWARDED_PORT | 26 | Request::HEADER_X_FORWARDED_PROTO | 27 | Request::HEADER_X_FORWARDED_AWS_ELB; 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Middleware/ValidateSignature.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 'fbclid', 16 | // 'utm_campaign', 17 | // 'utm_content', 18 | // 'utm_medium', 19 | // 'utm_source', 20 | // 'utm_term', 21 | ]; 22 | } 23 | -------------------------------------------------------------------------------- /app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Requests/GenerateRequest.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'boolean', 19 | ], 20 | 'preflight' => [ 21 | 'boolean' 22 | ], 23 | 'plugins' => [ 24 | 'array', 25 | ], 26 | 'plugins.*' => [ 27 | 'distinct', 28 | 'in:forms,typography,aspect-ratio,container-queries', 29 | ], 30 | 'prefix' => [ 31 | 'string', 32 | 'max:10', 33 | 'alpha_dash:ascii', 34 | ], 35 | 'classes' => [ 36 | 'array', 37 | ], 38 | 'classes.*' => [ 39 | 'distinct', 40 | // matches {class}:{variant|variant} 41 | 'regex:/^[a-z0-9*-\/]+(:([a-z0-9-]+(\|[a-z0-9-]+)*))?$/u', 42 | ], 43 | ]; 44 | } 45 | 46 | /** 47 | * Prepare the data for validation. 48 | */ 49 | protected function prepareForValidation(): void 50 | { 51 | $this->merge([ 52 | 'classes' => $this->csv('classes'), 53 | 'plugins' => $this->csv('plugins'), 54 | ]); 55 | } 56 | 57 | /** 58 | * Get an input as a CSV string. 59 | */ 60 | public function csv(string $input): array 61 | { 62 | return array_values( 63 | Arr::sort(array_filter(explode(',', $this->input($input))) 64 | )); 65 | } 66 | 67 | /** 68 | * Handle a failed validation attempt. 69 | */ 70 | protected function failedValidation(Validator $validator): void 71 | { 72 | abort(422, $validator->errors()->first()); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/Models/User.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | protected $fillable = [ 21 | 'name', 22 | 'email', 23 | 'password', 24 | ]; 25 | 26 | /** 27 | * The attributes that should be hidden for serialization. 28 | * 29 | * @var array 30 | */ 31 | protected $hidden = [ 32 | 'password', 33 | 'remember_token', 34 | ]; 35 | 36 | /** 37 | * The attributes that should be cast. 38 | * 39 | * @var array 40 | */ 41 | protected $casts = [ 42 | 'email_verified_at' => 'datetime', 43 | 'password' => 'hashed', 44 | ]; 45 | } 46 | -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | protected $policies = [ 16 | // 17 | ]; 18 | 19 | /** 20 | * Register any authentication / authorization services. 21 | */ 22 | public function boot(): void 23 | { 24 | // 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | > 16 | */ 17 | protected $listen = [ 18 | Registered::class => [ 19 | SendEmailVerificationNotification::class, 20 | ], 21 | ]; 22 | 23 | /** 24 | * Register any events for your application. 25 | */ 26 | public function boot(): void 27 | { 28 | // 29 | } 30 | 31 | /** 32 | * Determine if events and listeners should be automatically discovered. 33 | */ 34 | public function shouldDiscoverEvents(): bool 35 | { 36 | return false; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Providers/RouteServiceProvider.php: -------------------------------------------------------------------------------- 1 | by($request->user()?->id ?: $request->ip()); 29 | }); 30 | 31 | $this->routes(function () { 32 | Route::middleware('api') 33 | ->prefix('api') 34 | ->group(base_path('routes/api.php')); 35 | 36 | Route::middleware('web') 37 | ->group(base_path('routes/web.php')); 38 | }); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make(Illuminate\Contracts\Console\Kernel::class); 34 | 35 | $status = $kernel->handle( 36 | $input = new Symfony\Component\Console\Input\ArgvInput, 37 | new Symfony\Component\Console\Output\ConsoleOutput 38 | ); 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Shutdown The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once Artisan has finished running, we will fire off the shutdown events 46 | | so that any final work may be done by the application before we shut 47 | | down the process. This is the last thing to happen to the request. 48 | | 49 | */ 50 | 51 | $kernel->terminate($input, $status); 52 | 53 | exit($status); 54 | -------------------------------------------------------------------------------- /bin/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 30 | Illuminate\Contracts\Http\Kernel::class, 31 | App\Http\Kernel::class 32 | ); 33 | 34 | $app->singleton( 35 | Illuminate\Contracts\Console\Kernel::class, 36 | App\Console\Kernel::class 37 | ); 38 | 39 | $app->singleton( 40 | Illuminate\Contracts\Debug\ExceptionHandler::class, 41 | App\Exceptions\Handler::class 42 | ); 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Return The Application 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This script returns the application instance. The instance is given to 50 | | the calling script so we can separate the building of the instances 51 | | from the actual running of the application and sending responses. 52 | | 53 | */ 54 | 55 | return $app; 56 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel/laravel", 3 | "type": "project", 4 | "description": "The skeleton application for the Laravel framework.", 5 | "keywords": ["laravel", "framework"], 6 | "license": "MIT", 7 | "require": { 8 | "php": "^8.1", 9 | "guzzlehttp/guzzle": "^7.2", 10 | "laravel/framework": "^10.10", 11 | "torchlight/torchlight-laravel": "^0.5.14" 12 | }, 13 | "require-dev": { 14 | "fakerphp/faker": "^1.9.1", 15 | "laravel/pint": "^1.0", 16 | "laravel/sail": "^1.18", 17 | "mockery/mockery": "^1.4.4", 18 | "nunomaduro/collision": "^7.0", 19 | "pestphp/pest": "^2.0", 20 | "pestphp/pest-plugin-laravel": "^2.0", 21 | "spatie/laravel-ignition": "^2.0" 22 | }, 23 | "autoload": { 24 | "psr-4": { 25 | "App\\": "app/", 26 | "Database\\Factories\\": "database/factories/", 27 | "Database\\Seeders\\": "database/seeders/" 28 | } 29 | }, 30 | "autoload-dev": { 31 | "psr-4": { 32 | "Tests\\": "tests/" 33 | } 34 | }, 35 | "scripts": { 36 | "generate" : [ 37 | "npx tailwindcss -i ./resources/css/app.css -o ./resources/css/all.css" 38 | ], 39 | "post-autoload-dump": [ 40 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", 41 | "@php artisan package:discover --ansi" 42 | ], 43 | "post-update-cmd": [ 44 | "@php artisan vendor:publish --tag=laravel-assets --ansi --force" 45 | ], 46 | "post-root-package-install": [ 47 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 48 | ], 49 | "post-create-project-cmd": [ 50 | "@php artisan key:generate --ansi" 51 | ] 52 | }, 53 | "extra": { 54 | "laravel": { 55 | "dont-discover": [] 56 | } 57 | }, 58 | "config": { 59 | "optimize-autoloader": true, 60 | "preferred-install": "dist", 61 | "sort-packages": true, 62 | "allow-plugins": { 63 | "pestphp/pest-plugin": true, 64 | "php-http/discovery": true 65 | } 66 | }, 67 | "minimum-stability": "stable", 68 | "prefer-stable": true 69 | } 70 | -------------------------------------------------------------------------------- /config/app.php: -------------------------------------------------------------------------------- 1 | env('APP_NAME', 'Laravel'), 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Application Environment 24 | |-------------------------------------------------------------------------- 25 | | 26 | | This value determines the "environment" your application is currently 27 | | running in. This may determine how you prefer to configure various 28 | | services the application utilizes. Set this in your ".env" file. 29 | | 30 | */ 31 | 32 | 'env' => env('APP_ENV', 'production'), 33 | 34 | /* 35 | |-------------------------------------------------------------------------- 36 | | Application Debug Mode 37 | |-------------------------------------------------------------------------- 38 | | 39 | | When your application is in debug mode, detailed error messages with 40 | | stack traces will be shown on every error that occurs within your 41 | | application. If disabled, a simple generic error page is shown. 42 | | 43 | */ 44 | 45 | 'debug' => (bool) env('APP_DEBUG', false), 46 | 47 | /* 48 | |-------------------------------------------------------------------------- 49 | | Application URL 50 | |-------------------------------------------------------------------------- 51 | | 52 | | This URL is used by the console to properly generate URLs when using 53 | | the Artisan command line tool. You should set this to the root of 54 | | your application so that it is used when running Artisan tasks. 55 | | 56 | */ 57 | 58 | 'url' => env('APP_URL', 'http://localhost'), 59 | 60 | 'asset_url' => env('ASSET_URL'), 61 | 62 | /* 63 | |-------------------------------------------------------------------------- 64 | | Application Timezone 65 | |-------------------------------------------------------------------------- 66 | | 67 | | Here you may specify the default timezone for your application, which 68 | | will be used by the PHP date and date-time functions. We have gone 69 | | ahead and set this to a sensible default for you out of the box. 70 | | 71 | */ 72 | 73 | 'timezone' => 'UTC', 74 | 75 | /* 76 | |-------------------------------------------------------------------------- 77 | | Application Locale Configuration 78 | |-------------------------------------------------------------------------- 79 | | 80 | | The application locale determines the default locale that will be used 81 | | by the translation service provider. You are free to set this value 82 | | to any of the locales which will be supported by the application. 83 | | 84 | */ 85 | 86 | 'locale' => 'en', 87 | 88 | /* 89 | |-------------------------------------------------------------------------- 90 | | Application Fallback Locale 91 | |-------------------------------------------------------------------------- 92 | | 93 | | The fallback locale determines the locale to use when the current one 94 | | is not available. You may change the value to correspond to any of 95 | | the language folders that are provided through your application. 96 | | 97 | */ 98 | 99 | 'fallback_locale' => 'en', 100 | 101 | /* 102 | |-------------------------------------------------------------------------- 103 | | Faker Locale 104 | |-------------------------------------------------------------------------- 105 | | 106 | | This locale will be used by the Faker PHP library when generating fake 107 | | data for your database seeds. For example, this will be used to get 108 | | localized telephone numbers, street address information and more. 109 | | 110 | */ 111 | 112 | 'faker_locale' => 'en_US', 113 | 114 | /* 115 | |-------------------------------------------------------------------------- 116 | | Encryption Key 117 | |-------------------------------------------------------------------------- 118 | | 119 | | This key is used by the Illuminate encrypter service and should be set 120 | | to a random, 32 character string, otherwise these encrypted strings 121 | | will not be safe. Please do this before deploying an application! 122 | | 123 | */ 124 | 125 | 'key' => env('APP_KEY'), 126 | 127 | 'cipher' => 'AES-256-CBC', 128 | 129 | /* 130 | |-------------------------------------------------------------------------- 131 | | Maintenance Mode Driver 132 | |-------------------------------------------------------------------------- 133 | | 134 | | These configuration options determine the driver used to determine and 135 | | manage Laravel's "maintenance mode" status. The "cache" driver will 136 | | allow maintenance mode to be controlled across multiple machines. 137 | | 138 | | Supported drivers: "file", "cache" 139 | | 140 | */ 141 | 142 | 'maintenance' => [ 143 | 'driver' => 'file', 144 | // 'store' => 'redis', 145 | ], 146 | 147 | /* 148 | |-------------------------------------------------------------------------- 149 | | Autoloaded Service Providers 150 | |-------------------------------------------------------------------------- 151 | | 152 | | The service providers listed here will be automatically loaded on the 153 | | request to your application. Feel free to add your own services to 154 | | this array to grant expanded functionality to your applications. 155 | | 156 | */ 157 | 158 | 'providers' => ServiceProvider::defaultProviders()->merge([ 159 | /* 160 | * Package Service Providers... 161 | */ 162 | 163 | /* 164 | * Application Service Providers... 165 | */ 166 | App\Providers\AppServiceProvider::class, 167 | App\Providers\AuthServiceProvider::class, 168 | // App\Providers\BroadcastServiceProvider::class, 169 | App\Providers\EventServiceProvider::class, 170 | App\Providers\RouteServiceProvider::class, 171 | ])->toArray(), 172 | 173 | /* 174 | |-------------------------------------------------------------------------- 175 | | Class Aliases 176 | |-------------------------------------------------------------------------- 177 | | 178 | | This array of class aliases will be registered when this application 179 | | is started. However, feel free to register as many as you wish as 180 | | the aliases are "lazy" loaded so they don't hinder performance. 181 | | 182 | */ 183 | 184 | 'aliases' => Facade::defaultAliases()->merge([ 185 | // 'Example' => App\Facades\Example::class, 186 | ])->toArray(), 187 | 188 | ]; 189 | -------------------------------------------------------------------------------- /config/auth.php: -------------------------------------------------------------------------------- 1 | [ 17 | 'guard' => 'web', 18 | 'passwords' => 'users', 19 | ], 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Authentication Guards 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Next, you may define every authentication guard for your application. 27 | | Of course, a great default configuration has been defined for you 28 | | here which uses session storage and the Eloquent user provider. 29 | | 30 | | All authentication drivers have a user provider. This defines how the 31 | | users are actually retrieved out of your database or other storage 32 | | mechanisms used by this application to persist your user's data. 33 | | 34 | | Supported: "session" 35 | | 36 | */ 37 | 38 | 'guards' => [ 39 | 'web' => [ 40 | 'driver' => 'session', 41 | 'provider' => 'users', 42 | ], 43 | ], 44 | 45 | /* 46 | |-------------------------------------------------------------------------- 47 | | User Providers 48 | |-------------------------------------------------------------------------- 49 | | 50 | | All authentication drivers have a user provider. This defines how the 51 | | users are actually retrieved out of your database or other storage 52 | | mechanisms used by this application to persist your user's data. 53 | | 54 | | If you have multiple user tables or models you may configure multiple 55 | | sources which represent each model / table. These sources may then 56 | | be assigned to any extra authentication guards you have defined. 57 | | 58 | | Supported: "database", "eloquent" 59 | | 60 | */ 61 | 62 | 'providers' => [ 63 | 'users' => [ 64 | 'driver' => 'eloquent', 65 | 'model' => App\Models\User::class, 66 | ], 67 | 68 | // 'users' => [ 69 | // 'driver' => 'database', 70 | // 'table' => 'users', 71 | // ], 72 | ], 73 | 74 | /* 75 | |-------------------------------------------------------------------------- 76 | | Resetting Passwords 77 | |-------------------------------------------------------------------------- 78 | | 79 | | You may specify multiple password reset configurations if you have more 80 | | than one user table or model in the application and you want to have 81 | | separate password reset settings based on the specific user types. 82 | | 83 | | The expiry time is the number of minutes that each reset token will be 84 | | considered valid. This security feature keeps tokens short-lived so 85 | | they have less time to be guessed. You may change this as needed. 86 | | 87 | | The throttle setting is the number of seconds a user must wait before 88 | | generating more password reset tokens. This prevents the user from 89 | | quickly generating a very large amount of password reset tokens. 90 | | 91 | */ 92 | 93 | 'passwords' => [ 94 | 'users' => [ 95 | 'provider' => 'users', 96 | 'table' => 'password_reset_tokens', 97 | 'expire' => 60, 98 | 'throttle' => 60, 99 | ], 100 | ], 101 | 102 | /* 103 | |-------------------------------------------------------------------------- 104 | | Password Confirmation Timeout 105 | |-------------------------------------------------------------------------- 106 | | 107 | | Here you may define the amount of seconds before a password confirmation 108 | | times out and the user is prompted to re-enter their password via the 109 | | confirmation screen. By default, the timeout lasts for three hours. 110 | | 111 | */ 112 | 113 | 'password_timeout' => 10800, 114 | 115 | ]; 116 | -------------------------------------------------------------------------------- /config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'null'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Broadcast Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the broadcast connections that will be used 26 | | to broadcast events to other systems or over websockets. Samples of 27 | | each available type of connection are provided inside this array. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'pusher' => [ 34 | 'driver' => 'pusher', 35 | 'key' => env('PUSHER_APP_KEY'), 36 | 'secret' => env('PUSHER_APP_SECRET'), 37 | 'app_id' => env('PUSHER_APP_ID'), 38 | 'options' => [ 39 | 'cluster' => env('PUSHER_APP_CLUSTER'), 40 | 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', 41 | 'port' => env('PUSHER_PORT', 443), 42 | 'scheme' => env('PUSHER_SCHEME', 'https'), 43 | 'encrypted' => true, 44 | 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', 45 | ], 46 | 'client_options' => [ 47 | // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html 48 | ], 49 | ], 50 | 51 | 'ably' => [ 52 | 'driver' => 'ably', 53 | 'key' => env('ABLY_KEY'), 54 | ], 55 | 56 | 'redis' => [ 57 | 'driver' => 'redis', 58 | 'connection' => 'default', 59 | ], 60 | 61 | 'log' => [ 62 | 'driver' => 'log', 63 | ], 64 | 65 | 'null' => [ 66 | 'driver' => 'null', 67 | ], 68 | 69 | ], 70 | 71 | ]; 72 | -------------------------------------------------------------------------------- /config/cache.php: -------------------------------------------------------------------------------- 1 | env('CACHE_DRIVER', 'file'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Cache Stores 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the cache "stores" for your application as 26 | | well as their drivers. You may even define multiple stores for the 27 | | same cache driver to group types of items stored in your caches. 28 | | 29 | | Supported drivers: "apc", "array", "database", "file", 30 | | "memcached", "redis", "dynamodb", "octane", "null" 31 | | 32 | */ 33 | 34 | 'stores' => [ 35 | 36 | 'apc' => [ 37 | 'driver' => 'apc', 38 | ], 39 | 40 | 'array' => [ 41 | 'driver' => 'array', 42 | 'serialize' => false, 43 | ], 44 | 45 | 'database' => [ 46 | 'driver' => 'database', 47 | 'table' => 'cache', 48 | 'connection' => null, 49 | 'lock_connection' => null, 50 | ], 51 | 52 | 'file' => [ 53 | 'driver' => 'file', 54 | 'path' => storage_path('framework/cache/data'), 55 | 'lock_path' => storage_path('framework/cache/data'), 56 | ], 57 | 58 | 'memcached' => [ 59 | 'driver' => 'memcached', 60 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 61 | 'sasl' => [ 62 | env('MEMCACHED_USERNAME'), 63 | env('MEMCACHED_PASSWORD'), 64 | ], 65 | 'options' => [ 66 | // Memcached::OPT_CONNECT_TIMEOUT => 2000, 67 | ], 68 | 'servers' => [ 69 | [ 70 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 71 | 'port' => env('MEMCACHED_PORT', 11211), 72 | 'weight' => 100, 73 | ], 74 | ], 75 | ], 76 | 77 | 'redis' => [ 78 | 'driver' => 'redis', 79 | 'connection' => 'cache', 80 | 'lock_connection' => 'default', 81 | ], 82 | 83 | 'dynamodb' => [ 84 | 'driver' => 'dynamodb', 85 | 'key' => env('AWS_ACCESS_KEY_ID'), 86 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 87 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 88 | 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), 89 | 'endpoint' => env('DYNAMODB_ENDPOINT'), 90 | ], 91 | 92 | 'octane' => [ 93 | 'driver' => 'octane', 94 | ], 95 | 96 | ], 97 | 98 | /* 99 | |-------------------------------------------------------------------------- 100 | | Cache Key Prefix 101 | |-------------------------------------------------------------------------- 102 | | 103 | | When utilizing the APC, database, memcached, Redis, or DynamoDB cache 104 | | stores there might be other applications using the same cache. For 105 | | that reason, you may prefix every cache key to avoid collisions. 106 | | 107 | */ 108 | 109 | 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), 110 | 111 | ]; 112 | -------------------------------------------------------------------------------- /config/cors.php: -------------------------------------------------------------------------------- 1 | ['api/*', 'sanctum/csrf-cookie'], 19 | 20 | 'allowed_methods' => ['*'], 21 | 22 | 'allowed_origins' => ['*'], 23 | 24 | 'allowed_origins_patterns' => [], 25 | 26 | 'allowed_headers' => ['*'], 27 | 28 | 'exposed_headers' => [], 29 | 30 | 'max_age' => 0, 31 | 32 | 'supports_credentials' => false, 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /config/database.php: -------------------------------------------------------------------------------- 1 | env('DB_CONNECTION', 'mysql'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Database Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here are each of the database connections setup for your application. 26 | | Of course, examples of configuring each database platform that is 27 | | supported by Laravel is shown below to make development simple. 28 | | 29 | | 30 | | All database work in Laravel is done through the PHP PDO facilities 31 | | so make sure you have the driver for your particular database of 32 | | choice installed on your machine before you begin development. 33 | | 34 | */ 35 | 36 | 'connections' => [ 37 | 38 | 'sqlite' => [ 39 | 'driver' => 'sqlite', 40 | 'url' => env('DATABASE_URL'), 41 | 'database' => env('DB_DATABASE', database_path('database.sqlite')), 42 | 'prefix' => '', 43 | 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), 44 | ], 45 | 46 | 'mysql' => [ 47 | 'driver' => 'mysql', 48 | 'url' => env('DATABASE_URL'), 49 | 'host' => env('DB_HOST', '127.0.0.1'), 50 | 'port' => env('DB_PORT', '3306'), 51 | 'database' => env('DB_DATABASE', 'forge'), 52 | 'username' => env('DB_USERNAME', 'forge'), 53 | 'password' => env('DB_PASSWORD', ''), 54 | 'unix_socket' => env('DB_SOCKET', ''), 55 | 'charset' => 'utf8mb4', 56 | 'collation' => 'utf8mb4_unicode_ci', 57 | 'prefix' => '', 58 | 'prefix_indexes' => true, 59 | 'strict' => true, 60 | 'engine' => null, 61 | 'options' => extension_loaded('pdo_mysql') ? array_filter([ 62 | PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), 63 | ]) : [], 64 | ], 65 | 66 | 'pgsql' => [ 67 | 'driver' => 'pgsql', 68 | 'url' => env('DATABASE_URL'), 69 | 'host' => env('DB_HOST', '127.0.0.1'), 70 | 'port' => env('DB_PORT', '5432'), 71 | 'database' => env('DB_DATABASE', 'forge'), 72 | 'username' => env('DB_USERNAME', 'forge'), 73 | 'password' => env('DB_PASSWORD', ''), 74 | 'charset' => 'utf8', 75 | 'prefix' => '', 76 | 'prefix_indexes' => true, 77 | 'search_path' => 'public', 78 | 'sslmode' => 'prefer', 79 | ], 80 | 81 | 'sqlsrv' => [ 82 | 'driver' => 'sqlsrv', 83 | 'url' => env('DATABASE_URL'), 84 | 'host' => env('DB_HOST', 'localhost'), 85 | 'port' => env('DB_PORT', '1433'), 86 | 'database' => env('DB_DATABASE', 'forge'), 87 | 'username' => env('DB_USERNAME', 'forge'), 88 | 'password' => env('DB_PASSWORD', ''), 89 | 'charset' => 'utf8', 90 | 'prefix' => '', 91 | 'prefix_indexes' => true, 92 | // 'encrypt' => env('DB_ENCRYPT', 'yes'), 93 | // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), 94 | ], 95 | 96 | ], 97 | 98 | /* 99 | |-------------------------------------------------------------------------- 100 | | Migration Repository Table 101 | |-------------------------------------------------------------------------- 102 | | 103 | | This table keeps track of all the migrations that have already run for 104 | | your application. Using this information, we can determine which of 105 | | the migrations on disk haven't actually been run in the database. 106 | | 107 | */ 108 | 109 | 'migrations' => 'migrations', 110 | 111 | /* 112 | |-------------------------------------------------------------------------- 113 | | Redis Databases 114 | |-------------------------------------------------------------------------- 115 | | 116 | | Redis is an open source, fast, and advanced key-value store that also 117 | | provides a richer body of commands than a typical key-value system 118 | | such as APC or Memcached. Laravel makes it easy to dig right in. 119 | | 120 | */ 121 | 122 | 'redis' => [ 123 | 124 | 'client' => env('REDIS_CLIENT', 'phpredis'), 125 | 126 | 'options' => [ 127 | 'cluster' => env('REDIS_CLUSTER', 'redis'), 128 | 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), 129 | ], 130 | 131 | 'default' => [ 132 | 'url' => env('REDIS_URL'), 133 | 'host' => env('REDIS_HOST', '127.0.0.1'), 134 | 'username' => env('REDIS_USERNAME'), 135 | 'password' => env('REDIS_PASSWORD'), 136 | 'port' => env('REDIS_PORT', '6379'), 137 | 'database' => env('REDIS_DB', '0'), 138 | ], 139 | 140 | 'cache' => [ 141 | 'url' => env('REDIS_URL'), 142 | 'host' => env('REDIS_HOST', '127.0.0.1'), 143 | 'username' => env('REDIS_USERNAME'), 144 | 'password' => env('REDIS_PASSWORD'), 145 | 'port' => env('REDIS_PORT', '6379'), 146 | 'database' => env('REDIS_CACHE_DB', '1'), 147 | ], 148 | 149 | ], 150 | 151 | ]; 152 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DISK', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Filesystem Disks 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure as many filesystem "disks" as you wish, and you 24 | | may even configure multiple disks of the same driver. Defaults have 25 | | been set up for each driver as an example of the required values. 26 | | 27 | | Supported Drivers: "local", "ftp", "sftp", "s3" 28 | | 29 | */ 30 | 31 | 'disks' => [ 32 | 33 | 'local' => [ 34 | 'driver' => 'local', 35 | 'root' => storage_path('app'), 36 | 'throw' => false, 37 | ], 38 | 39 | 'css' => [ 40 | 'driver' => 'local', 41 | 'root' => storage_path('css'), 42 | 'throw' => false, 43 | ], 44 | 45 | 'js' => [ 46 | 'driver' => 'local', 47 | 'root' => storage_path('js'), 48 | 'throw' => false, 49 | ], 50 | 51 | 'public' => [ 52 | 'driver' => 'local', 53 | 'root' => storage_path('app/public'), 54 | 'url' => env('APP_URL').'/storage', 55 | 'visibility' => 'public', 56 | 'throw' => false, 57 | ], 58 | 59 | 's3' => [ 60 | 'driver' => 's3', 61 | 'key' => env('AWS_ACCESS_KEY_ID'), 62 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 63 | 'region' => env('AWS_DEFAULT_REGION'), 64 | 'bucket' => env('AWS_BUCKET'), 65 | 'url' => env('AWS_URL'), 66 | 'endpoint' => env('AWS_ENDPOINT'), 67 | 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), 68 | 'throw' => false, 69 | ], 70 | 71 | ], 72 | 73 | /* 74 | |-------------------------------------------------------------------------- 75 | | Symbolic Links 76 | |-------------------------------------------------------------------------- 77 | | 78 | | Here you may configure the symbolic links that will be created when the 79 | | `storage:link` Artisan command is executed. The array keys should be 80 | | the locations of the links and the values should be their targets. 81 | | 82 | */ 83 | 84 | 'links' => [ 85 | public_path('storage') => storage_path('app/public'), 86 | ], 87 | 88 | ]; 89 | -------------------------------------------------------------------------------- /config/hashing.php: -------------------------------------------------------------------------------- 1 | 'bcrypt', 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Bcrypt Options 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may specify the configuration options that should be used when 26 | | passwords are hashed using the Bcrypt algorithm. This will allow you 27 | | to control the amount of time it takes to hash the given password. 28 | | 29 | */ 30 | 31 | 'bcrypt' => [ 32 | 'rounds' => env('BCRYPT_ROUNDS', 12), 33 | 'verify' => true, 34 | ], 35 | 36 | /* 37 | |-------------------------------------------------------------------------- 38 | | Argon Options 39 | |-------------------------------------------------------------------------- 40 | | 41 | | Here you may specify the configuration options that should be used when 42 | | passwords are hashed using the Argon algorithm. These will allow you 43 | | to control the amount of time it takes to hash the given password. 44 | | 45 | */ 46 | 47 | 'argon' => [ 48 | 'memory' => 65536, 49 | 'threads' => 1, 50 | 'time' => 4, 51 | 'verify' => true, 52 | ], 53 | 54 | ]; 55 | -------------------------------------------------------------------------------- /config/logging.php: -------------------------------------------------------------------------------- 1 | env('LOG_CHANNEL', 'stack'), 22 | 23 | /* 24 | |-------------------------------------------------------------------------- 25 | | Deprecations Log Channel 26 | |-------------------------------------------------------------------------- 27 | | 28 | | This option controls the log channel that should be used to log warnings 29 | | regarding deprecated PHP and library features. This allows you to get 30 | | your application ready for upcoming major versions of dependencies. 31 | | 32 | */ 33 | 34 | 'deprecations' => [ 35 | 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), 36 | 'trace' => false, 37 | ], 38 | 39 | /* 40 | |-------------------------------------------------------------------------- 41 | | Log Channels 42 | |-------------------------------------------------------------------------- 43 | | 44 | | Here you may configure the log channels for your application. Out of 45 | | the box, Laravel uses the Monolog PHP logging library. This gives 46 | | you a variety of powerful log handlers / formatters to utilize. 47 | | 48 | | Available Drivers: "single", "daily", "slack", "syslog", 49 | | "errorlog", "monolog", 50 | | "custom", "stack" 51 | | 52 | */ 53 | 54 | 'channels' => [ 55 | 'stack' => [ 56 | 'driver' => 'stack', 57 | 'channels' => ['single'], 58 | 'ignore_exceptions' => false, 59 | ], 60 | 61 | 'single' => [ 62 | 'driver' => 'single', 63 | 'path' => storage_path('logs/laravel.log'), 64 | 'level' => env('LOG_LEVEL', 'debug'), 65 | 'replace_placeholders' => true, 66 | ], 67 | 68 | 'daily' => [ 69 | 'driver' => 'daily', 70 | 'path' => storage_path('logs/laravel.log'), 71 | 'level' => env('LOG_LEVEL', 'debug'), 72 | 'days' => 14, 73 | 'replace_placeholders' => true, 74 | ], 75 | 76 | 'slack' => [ 77 | 'driver' => 'slack', 78 | 'url' => env('LOG_SLACK_WEBHOOK_URL'), 79 | 'username' => 'Laravel Log', 80 | 'emoji' => ':boom:', 81 | 'level' => env('LOG_LEVEL', 'critical'), 82 | 'replace_placeholders' => true, 83 | ], 84 | 85 | 'papertrail' => [ 86 | 'driver' => 'monolog', 87 | 'level' => env('LOG_LEVEL', 'debug'), 88 | 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), 89 | 'handler_with' => [ 90 | 'host' => env('PAPERTRAIL_URL'), 91 | 'port' => env('PAPERTRAIL_PORT'), 92 | 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), 93 | ], 94 | 'processors' => [PsrLogMessageProcessor::class], 95 | ], 96 | 97 | 'stderr' => [ 98 | 'driver' => 'monolog', 99 | 'level' => env('LOG_LEVEL', 'debug'), 100 | 'handler' => StreamHandler::class, 101 | 'formatter' => env('LOG_STDERR_FORMATTER'), 102 | 'with' => [ 103 | 'stream' => 'php://stderr', 104 | ], 105 | 'processors' => [PsrLogMessageProcessor::class], 106 | ], 107 | 108 | 'syslog' => [ 109 | 'driver' => 'syslog', 110 | 'level' => env('LOG_LEVEL', 'debug'), 111 | 'facility' => LOG_USER, 112 | 'replace_placeholders' => true, 113 | ], 114 | 115 | 'errorlog' => [ 116 | 'driver' => 'errorlog', 117 | 'level' => env('LOG_LEVEL', 'debug'), 118 | 'replace_placeholders' => true, 119 | ], 120 | 121 | 'null' => [ 122 | 'driver' => 'monolog', 123 | 'handler' => NullHandler::class, 124 | ], 125 | 126 | 'emergency' => [ 127 | 'path' => storage_path('logs/laravel.log'), 128 | ], 129 | ], 130 | 131 | ]; 132 | -------------------------------------------------------------------------------- /config/mail.php: -------------------------------------------------------------------------------- 1 | env('MAIL_MAILER', 'smtp'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Mailer Configurations 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure all of the mailers used by your application plus 24 | | their respective settings. Several examples have been configured for 25 | | you and you are free to add your own as your application requires. 26 | | 27 | | Laravel supports a variety of mail "transport" drivers to be used while 28 | | sending an e-mail. You will specify which one you are using for your 29 | | mailers below. You are free to add additional mailers as required. 30 | | 31 | | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", 32 | | "postmark", "log", "array", "failover", "roundrobin" 33 | | 34 | */ 35 | 36 | 'mailers' => [ 37 | 'smtp' => [ 38 | 'transport' => 'smtp', 39 | 'url' => env('MAIL_URL'), 40 | 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 41 | 'port' => env('MAIL_PORT', 587), 42 | 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 43 | 'username' => env('MAIL_USERNAME'), 44 | 'password' => env('MAIL_PASSWORD'), 45 | 'timeout' => null, 46 | 'local_domain' => env('MAIL_EHLO_DOMAIN'), 47 | ], 48 | 49 | 'ses' => [ 50 | 'transport' => 'ses', 51 | ], 52 | 53 | 'postmark' => [ 54 | 'transport' => 'postmark', 55 | // 'message_stream_id' => null, 56 | // 'client' => [ 57 | // 'timeout' => 5, 58 | // ], 59 | ], 60 | 61 | 'mailgun' => [ 62 | 'transport' => 'mailgun', 63 | // 'client' => [ 64 | // 'timeout' => 5, 65 | // ], 66 | ], 67 | 68 | 'sendmail' => [ 69 | 'transport' => 'sendmail', 70 | 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), 71 | ], 72 | 73 | 'log' => [ 74 | 'transport' => 'log', 75 | 'channel' => env('MAIL_LOG_CHANNEL'), 76 | ], 77 | 78 | 'array' => [ 79 | 'transport' => 'array', 80 | ], 81 | 82 | 'failover' => [ 83 | 'transport' => 'failover', 84 | 'mailers' => [ 85 | 'smtp', 86 | 'log', 87 | ], 88 | ], 89 | 90 | 'roundrobin' => [ 91 | 'transport' => 'roundrobin', 92 | 'mailers' => [ 93 | 'ses', 94 | 'postmark', 95 | ], 96 | ], 97 | ], 98 | 99 | /* 100 | |-------------------------------------------------------------------------- 101 | | Global "From" Address 102 | |-------------------------------------------------------------------------- 103 | | 104 | | You may wish for all e-mails sent by your application to be sent from 105 | | the same address. Here, you may specify a name and address that is 106 | | used globally for all e-mails that are sent by your application. 107 | | 108 | */ 109 | 110 | 'from' => [ 111 | 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 112 | 'name' => env('MAIL_FROM_NAME', 'Example'), 113 | ], 114 | 115 | /* 116 | |-------------------------------------------------------------------------- 117 | | Markdown Mail Settings 118 | |-------------------------------------------------------------------------- 119 | | 120 | | If you are using Markdown based email rendering, you may configure your 121 | | theme and component paths here, allowing you to customize the design 122 | | of the emails. Or, you may simply stick with the Laravel defaults! 123 | | 124 | */ 125 | 126 | 'markdown' => [ 127 | 'theme' => 'default', 128 | 129 | 'paths' => [ 130 | resource_path('views/vendor/mail'), 131 | ], 132 | ], 133 | 134 | ]; 135 | -------------------------------------------------------------------------------- /config/queue.php: -------------------------------------------------------------------------------- 1 | env('QUEUE_CONNECTION', 'sync'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Queue Connections 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure the connection information for each server that 24 | | is used by your application. A default configuration has been added 25 | | for each back-end shipped with Laravel. You are free to add more. 26 | | 27 | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'sync' => [ 34 | 'driver' => 'sync', 35 | ], 36 | 37 | 'database' => [ 38 | 'driver' => 'database', 39 | 'table' => 'jobs', 40 | 'queue' => 'default', 41 | 'retry_after' => 90, 42 | 'after_commit' => false, 43 | ], 44 | 45 | 'beanstalkd' => [ 46 | 'driver' => 'beanstalkd', 47 | 'host' => 'localhost', 48 | 'queue' => 'default', 49 | 'retry_after' => 90, 50 | 'block_for' => 0, 51 | 'after_commit' => false, 52 | ], 53 | 54 | 'sqs' => [ 55 | 'driver' => 'sqs', 56 | 'key' => env('AWS_ACCESS_KEY_ID'), 57 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 58 | 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 59 | 'queue' => env('SQS_QUEUE', 'default'), 60 | 'suffix' => env('SQS_SUFFIX'), 61 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 62 | 'after_commit' => false, 63 | ], 64 | 65 | 'redis' => [ 66 | 'driver' => 'redis', 67 | 'connection' => 'default', 68 | 'queue' => env('REDIS_QUEUE', 'default'), 69 | 'retry_after' => 90, 70 | 'block_for' => null, 71 | 'after_commit' => false, 72 | ], 73 | 74 | ], 75 | 76 | /* 77 | |-------------------------------------------------------------------------- 78 | | Job Batching 79 | |-------------------------------------------------------------------------- 80 | | 81 | | The following options configure the database and table that store job 82 | | batching information. These options can be updated to any database 83 | | connection and table which has been defined by your application. 84 | | 85 | */ 86 | 87 | 'batching' => [ 88 | 'database' => env('DB_CONNECTION', 'mysql'), 89 | 'table' => 'job_batches', 90 | ], 91 | 92 | /* 93 | |-------------------------------------------------------------------------- 94 | | Failed Queue Jobs 95 | |-------------------------------------------------------------------------- 96 | | 97 | | These options configure the behavior of failed queue job logging so you 98 | | can control which database and table are used to store the jobs that 99 | | have failed. You may change them to any database / table you wish. 100 | | 101 | */ 102 | 103 | 'failed' => [ 104 | 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), 105 | 'database' => env('DB_CONNECTION', 'mysql'), 106 | 'table' => 'failed_jobs', 107 | ], 108 | 109 | ]; 110 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), 21 | 'scheme' => 'https', 22 | ], 23 | 24 | 'postmark' => [ 25 | 'token' => env('POSTMARK_TOKEN'), 26 | ], 27 | 28 | 'ses' => [ 29 | 'key' => env('AWS_ACCESS_KEY_ID'), 30 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 31 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 32 | ], 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /config/session.php: -------------------------------------------------------------------------------- 1 | env('SESSION_DRIVER', 'file'), 22 | 23 | /* 24 | |-------------------------------------------------------------------------- 25 | | Session Lifetime 26 | |-------------------------------------------------------------------------- 27 | | 28 | | Here you may specify the number of minutes that you wish the session 29 | | to be allowed to remain idle before it expires. If you want them 30 | | to immediately expire on the browser closing, set that option. 31 | | 32 | */ 33 | 34 | 'lifetime' => env('SESSION_LIFETIME', 120), 35 | 36 | 'expire_on_close' => false, 37 | 38 | /* 39 | |-------------------------------------------------------------------------- 40 | | Session Encryption 41 | |-------------------------------------------------------------------------- 42 | | 43 | | This option allows you to easily specify that all of your session data 44 | | should be encrypted before it is stored. All encryption will be run 45 | | automatically by Laravel and you can use the Session like normal. 46 | | 47 | */ 48 | 49 | 'encrypt' => false, 50 | 51 | /* 52 | |-------------------------------------------------------------------------- 53 | | Session File Location 54 | |-------------------------------------------------------------------------- 55 | | 56 | | When using the native session driver, we need a location where session 57 | | files may be stored. A default has been set for you but a different 58 | | location may be specified. This is only needed for file sessions. 59 | | 60 | */ 61 | 62 | 'files' => storage_path('framework/sessions'), 63 | 64 | /* 65 | |-------------------------------------------------------------------------- 66 | | Session Database Connection 67 | |-------------------------------------------------------------------------- 68 | | 69 | | When using the "database" or "redis" session drivers, you may specify a 70 | | connection that should be used to manage these sessions. This should 71 | | correspond to a connection in your database configuration options. 72 | | 73 | */ 74 | 75 | 'connection' => env('SESSION_CONNECTION'), 76 | 77 | /* 78 | |-------------------------------------------------------------------------- 79 | | Session Database Table 80 | |-------------------------------------------------------------------------- 81 | | 82 | | When using the "database" session driver, you may specify the table we 83 | | should use to manage the sessions. Of course, a sensible default is 84 | | provided for you; however, you are free to change this as needed. 85 | | 86 | */ 87 | 88 | 'table' => 'sessions', 89 | 90 | /* 91 | |-------------------------------------------------------------------------- 92 | | Session Cache Store 93 | |-------------------------------------------------------------------------- 94 | | 95 | | While using one of the framework's cache driven session backends you may 96 | | list a cache store that should be used for these sessions. This value 97 | | must match with one of the application's configured cache "stores". 98 | | 99 | | Affects: "apc", "dynamodb", "memcached", "redis" 100 | | 101 | */ 102 | 103 | 'store' => env('SESSION_STORE'), 104 | 105 | /* 106 | |-------------------------------------------------------------------------- 107 | | Session Sweeping Lottery 108 | |-------------------------------------------------------------------------- 109 | | 110 | | Some session drivers must manually sweep their storage location to get 111 | | rid of old sessions from storage. Here are the chances that it will 112 | | happen on a given request. By default, the odds are 2 out of 100. 113 | | 114 | */ 115 | 116 | 'lottery' => [2, 100], 117 | 118 | /* 119 | |-------------------------------------------------------------------------- 120 | | Session Cookie Name 121 | |-------------------------------------------------------------------------- 122 | | 123 | | Here you may change the name of the cookie used to identify a session 124 | | instance by ID. The name specified here will get used every time a 125 | | new session cookie is created by the framework for every driver. 126 | | 127 | */ 128 | 129 | 'cookie' => env( 130 | 'SESSION_COOKIE', 131 | Str::slug(env('APP_NAME', 'laravel'), '_').'_session' 132 | ), 133 | 134 | /* 135 | |-------------------------------------------------------------------------- 136 | | Session Cookie Path 137 | |-------------------------------------------------------------------------- 138 | | 139 | | The session cookie path determines the path for which the cookie will 140 | | be regarded as available. Typically, this will be the root path of 141 | | your application but you are free to change this when necessary. 142 | | 143 | */ 144 | 145 | 'path' => '/', 146 | 147 | /* 148 | |-------------------------------------------------------------------------- 149 | | Session Cookie Domain 150 | |-------------------------------------------------------------------------- 151 | | 152 | | Here you may change the domain of the cookie used to identify a session 153 | | in your application. This will determine which domains the cookie is 154 | | available to in your application. A sensible default has been set. 155 | | 156 | */ 157 | 158 | 'domain' => env('SESSION_DOMAIN'), 159 | 160 | /* 161 | |-------------------------------------------------------------------------- 162 | | HTTPS Only Cookies 163 | |-------------------------------------------------------------------------- 164 | | 165 | | By setting this option to true, session cookies will only be sent back 166 | | to the server if the browser has a HTTPS connection. This will keep 167 | | the cookie from being sent to you when it can't be done securely. 168 | | 169 | */ 170 | 171 | 'secure' => env('SESSION_SECURE_COOKIE'), 172 | 173 | /* 174 | |-------------------------------------------------------------------------- 175 | | HTTP Access Only 176 | |-------------------------------------------------------------------------- 177 | | 178 | | Setting this value to true will prevent JavaScript from accessing the 179 | | value of the cookie and the cookie will only be accessible through 180 | | the HTTP protocol. You are free to modify this option if needed. 181 | | 182 | */ 183 | 184 | 'http_only' => true, 185 | 186 | /* 187 | |-------------------------------------------------------------------------- 188 | | Same-Site Cookies 189 | |-------------------------------------------------------------------------- 190 | | 191 | | This option determines how your cookies behave when cross-site requests 192 | | take place, and can be used to mitigate CSRF attacks. By default, we 193 | | will set this value to "lax" since this is a secure default value. 194 | | 195 | | Supported: "lax", "strict", "none", null 196 | | 197 | */ 198 | 199 | 'same_site' => 'lax', 200 | 201 | /* 202 | |-------------------------------------------------------------------------- 203 | | Partitioned Cookies 204 | |-------------------------------------------------------------------------- 205 | | 206 | | Setting this value to true will tie the cookie to the top-level site for 207 | | a cross-site context. Partitioned cookies are accepted by the browser 208 | | when flagged "secure" and the Same-Site attribute is set to "none". 209 | | 210 | */ 211 | 212 | 'partitioned' => false, 213 | 214 | ]; 215 | -------------------------------------------------------------------------------- /config/torchlight.php: -------------------------------------------------------------------------------- 1 | env('TORCHLIGHT_CACHE_DRIVER'), 8 | 9 | // Cache blocks for 30 days. Set null to store permanently 10 | 'cache_seconds' => env('TORCHLIGHT_CACHE_TTL', 60 * 60 * 24 * 30), 11 | 12 | // Which theme you want to use. You can find all of the themes at 13 | // https://torchlight.dev/docs/themes. 14 | 'theme' => env('TORCHLIGHT_THEME', 'material-theme-palenight'), 15 | 16 | // If you want to use two separate themes for dark and light modes, 17 | // you can use an array to define both themes. Torchlight renders 18 | // both on the page, and you will be responsible for hiding one 19 | // or the other depending on the dark / light mode via CSS. 20 | // 'theme' => [ 21 | // 'dark' => 'github-dark', 22 | // 'light' => 'github-light', 23 | // ], 24 | 25 | // Your API token from torchlight.dev. 26 | 'token' => env('TORCHLIGHT_TOKEN'), 27 | 28 | // If you want to register the blade directives, set this to true. 29 | 'blade_components' => true, 30 | 31 | // The Host of the API. 32 | 'host' => env('TORCHLIGHT_HOST', 'https://api.torchlight.dev'), 33 | 34 | // We replace tabs in your code blocks with spaces in HTML. Set 35 | // the number of spaces you'd like to use per tab. Set to 36 | // `false` to leave literal tabs in the HTML. 37 | 'tab_width' => 4, 38 | 39 | // If you pass a filename to the code component or in a markdown 40 | // block, Torchlight will look for code snippets in the 41 | // following directories. 42 | 'snippet_directories' => [ 43 | resource_path() 44 | ], 45 | 46 | // Global options to control blocks-level settings. 47 | // https://torchlight.dev/docs/options 48 | 'options' => [ 49 | 'lineNumbers' => false, 50 | 51 | // Control the `style` attribute applied to line numbers. 52 | // 'lineNumbersStyle' => '', 53 | 54 | // Turn on +/- diff indicators. 55 | // 'diffIndicators' => true, 56 | 57 | // If there are any diff indicators for a line, put them 58 | // in place of the line number to save horizontal space. 59 | // 'diffIndicatorsInPlaceOfLineNumbers' => true, 60 | 61 | // When lines are collapsed, this is the text that will 62 | // be shown to indicate that they can be expanded. 63 | // 'summaryCollapsedIndicator' => '...', 64 | ] 65 | ]; 66 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => env( 32 | 'VIEW_COMPILED_PATH', 33 | realpath(storage_path('framework/views')) 34 | ), 35 | 36 | ]; 37 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite* 2 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class UserFactory extends Factory 13 | { 14 | /** 15 | * The current password being used by the factory. 16 | */ 17 | protected static ?string $password; 18 | 19 | /** 20 | * Define the model's default state. 21 | * 22 | * @return array 23 | */ 24 | public function definition(): array 25 | { 26 | return [ 27 | 'name' => fake()->name(), 28 | 'email' => fake()->unique()->safeEmail(), 29 | 'email_verified_at' => now(), 30 | 'password' => static::$password ??= Hash::make('password'), 31 | 'remember_token' => Str::random(10), 32 | ]; 33 | } 34 | 35 | /** 36 | * Indicate that the model's email address should be unverified. 37 | */ 38 | public function unverified(): static 39 | { 40 | return $this->state(fn (array $attributes) => [ 41 | 'email_verified_at' => null, 42 | ]); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('name'); 17 | $table->string('email')->unique(); 18 | $table->timestamp('email_verified_at')->nullable(); 19 | $table->string('password'); 20 | $table->rememberToken(); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('users'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php: -------------------------------------------------------------------------------- 1 | string('email')->primary(); 16 | $table->string('token'); 17 | $table->timestamp('created_at')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::dropIfExists('password_reset_tokens'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2019_08_19_000000_create_failed_jobs_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('uuid')->unique(); 17 | $table->text('connection'); 18 | $table->text('queue'); 19 | $table->longText('payload'); 20 | $table->longText('exception'); 21 | $table->timestamp('failed_at')->useCurrent(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('failed_jobs'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->morphs('tokenable'); 17 | $table->string('name'); 18 | $table->string('token', 64)->unique(); 19 | $table->text('abilities')->nullable(); 20 | $table->timestamp('last_used_at')->nullable(); 21 | $table->timestamp('expires_at')->nullable(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | */ 29 | public function down(): void 30 | { 31 | Schema::dropIfExists('personal_access_tokens'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | create(); 16 | 17 | // \App\Models\User::factory()->create([ 18 | // 'name' => 'Test User', 19 | // 'email' => 'test@example.com', 20 | // ]); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "curlwind", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "devDependencies": { 8 | "autoprefixer": "^10.4.16", 9 | "axios": "^1.6.4", 10 | "laravel-vite-plugin": "^1.0.0", 11 | "vite": "^6.0.0" 12 | } 13 | }, 14 | "node_modules/@esbuild/aix-ppc64": { 15 | "version": "0.25.0", 16 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", 17 | "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", 18 | "cpu": [ 19 | "ppc64" 20 | ], 21 | "dev": true, 22 | "license": "MIT", 23 | "optional": true, 24 | "os": [ 25 | "aix" 26 | ], 27 | "engines": { 28 | "node": ">=18" 29 | } 30 | }, 31 | "node_modules/@esbuild/android-arm": { 32 | "version": "0.25.0", 33 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", 34 | "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", 35 | "cpu": [ 36 | "arm" 37 | ], 38 | "dev": true, 39 | "license": "MIT", 40 | "optional": true, 41 | "os": [ 42 | "android" 43 | ], 44 | "engines": { 45 | "node": ">=18" 46 | } 47 | }, 48 | "node_modules/@esbuild/android-arm64": { 49 | "version": "0.25.0", 50 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", 51 | "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", 52 | "cpu": [ 53 | "arm64" 54 | ], 55 | "dev": true, 56 | "license": "MIT", 57 | "optional": true, 58 | "os": [ 59 | "android" 60 | ], 61 | "engines": { 62 | "node": ">=18" 63 | } 64 | }, 65 | "node_modules/@esbuild/android-x64": { 66 | "version": "0.25.0", 67 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", 68 | "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", 69 | "cpu": [ 70 | "x64" 71 | ], 72 | "dev": true, 73 | "license": "MIT", 74 | "optional": true, 75 | "os": [ 76 | "android" 77 | ], 78 | "engines": { 79 | "node": ">=18" 80 | } 81 | }, 82 | "node_modules/@esbuild/darwin-arm64": { 83 | "version": "0.25.0", 84 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", 85 | "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", 86 | "cpu": [ 87 | "arm64" 88 | ], 89 | "dev": true, 90 | "license": "MIT", 91 | "optional": true, 92 | "os": [ 93 | "darwin" 94 | ], 95 | "engines": { 96 | "node": ">=18" 97 | } 98 | }, 99 | "node_modules/@esbuild/darwin-x64": { 100 | "version": "0.25.0", 101 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", 102 | "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", 103 | "cpu": [ 104 | "x64" 105 | ], 106 | "dev": true, 107 | "license": "MIT", 108 | "optional": true, 109 | "os": [ 110 | "darwin" 111 | ], 112 | "engines": { 113 | "node": ">=18" 114 | } 115 | }, 116 | "node_modules/@esbuild/freebsd-arm64": { 117 | "version": "0.25.0", 118 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", 119 | "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", 120 | "cpu": [ 121 | "arm64" 122 | ], 123 | "dev": true, 124 | "license": "MIT", 125 | "optional": true, 126 | "os": [ 127 | "freebsd" 128 | ], 129 | "engines": { 130 | "node": ">=18" 131 | } 132 | }, 133 | "node_modules/@esbuild/freebsd-x64": { 134 | "version": "0.25.0", 135 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", 136 | "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", 137 | "cpu": [ 138 | "x64" 139 | ], 140 | "dev": true, 141 | "license": "MIT", 142 | "optional": true, 143 | "os": [ 144 | "freebsd" 145 | ], 146 | "engines": { 147 | "node": ">=18" 148 | } 149 | }, 150 | "node_modules/@esbuild/linux-arm": { 151 | "version": "0.25.0", 152 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", 153 | "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", 154 | "cpu": [ 155 | "arm" 156 | ], 157 | "dev": true, 158 | "license": "MIT", 159 | "optional": true, 160 | "os": [ 161 | "linux" 162 | ], 163 | "engines": { 164 | "node": ">=18" 165 | } 166 | }, 167 | "node_modules/@esbuild/linux-arm64": { 168 | "version": "0.25.0", 169 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", 170 | "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", 171 | "cpu": [ 172 | "arm64" 173 | ], 174 | "dev": true, 175 | "license": "MIT", 176 | "optional": true, 177 | "os": [ 178 | "linux" 179 | ], 180 | "engines": { 181 | "node": ">=18" 182 | } 183 | }, 184 | "node_modules/@esbuild/linux-ia32": { 185 | "version": "0.25.0", 186 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", 187 | "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", 188 | "cpu": [ 189 | "ia32" 190 | ], 191 | "dev": true, 192 | "license": "MIT", 193 | "optional": true, 194 | "os": [ 195 | "linux" 196 | ], 197 | "engines": { 198 | "node": ">=18" 199 | } 200 | }, 201 | "node_modules/@esbuild/linux-loong64": { 202 | "version": "0.25.0", 203 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", 204 | "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", 205 | "cpu": [ 206 | "loong64" 207 | ], 208 | "dev": true, 209 | "license": "MIT", 210 | "optional": true, 211 | "os": [ 212 | "linux" 213 | ], 214 | "engines": { 215 | "node": ">=18" 216 | } 217 | }, 218 | "node_modules/@esbuild/linux-mips64el": { 219 | "version": "0.25.0", 220 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", 221 | "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", 222 | "cpu": [ 223 | "mips64el" 224 | ], 225 | "dev": true, 226 | "license": "MIT", 227 | "optional": true, 228 | "os": [ 229 | "linux" 230 | ], 231 | "engines": { 232 | "node": ">=18" 233 | } 234 | }, 235 | "node_modules/@esbuild/linux-ppc64": { 236 | "version": "0.25.0", 237 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", 238 | "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", 239 | "cpu": [ 240 | "ppc64" 241 | ], 242 | "dev": true, 243 | "license": "MIT", 244 | "optional": true, 245 | "os": [ 246 | "linux" 247 | ], 248 | "engines": { 249 | "node": ">=18" 250 | } 251 | }, 252 | "node_modules/@esbuild/linux-riscv64": { 253 | "version": "0.25.0", 254 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", 255 | "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", 256 | "cpu": [ 257 | "riscv64" 258 | ], 259 | "dev": true, 260 | "license": "MIT", 261 | "optional": true, 262 | "os": [ 263 | "linux" 264 | ], 265 | "engines": { 266 | "node": ">=18" 267 | } 268 | }, 269 | "node_modules/@esbuild/linux-s390x": { 270 | "version": "0.25.0", 271 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", 272 | "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", 273 | "cpu": [ 274 | "s390x" 275 | ], 276 | "dev": true, 277 | "license": "MIT", 278 | "optional": true, 279 | "os": [ 280 | "linux" 281 | ], 282 | "engines": { 283 | "node": ">=18" 284 | } 285 | }, 286 | "node_modules/@esbuild/linux-x64": { 287 | "version": "0.25.0", 288 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", 289 | "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", 290 | "cpu": [ 291 | "x64" 292 | ], 293 | "dev": true, 294 | "license": "MIT", 295 | "optional": true, 296 | "os": [ 297 | "linux" 298 | ], 299 | "engines": { 300 | "node": ">=18" 301 | } 302 | }, 303 | "node_modules/@esbuild/netbsd-arm64": { 304 | "version": "0.25.0", 305 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", 306 | "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", 307 | "cpu": [ 308 | "arm64" 309 | ], 310 | "dev": true, 311 | "license": "MIT", 312 | "optional": true, 313 | "os": [ 314 | "netbsd" 315 | ], 316 | "engines": { 317 | "node": ">=18" 318 | } 319 | }, 320 | "node_modules/@esbuild/netbsd-x64": { 321 | "version": "0.25.0", 322 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", 323 | "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", 324 | "cpu": [ 325 | "x64" 326 | ], 327 | "dev": true, 328 | "license": "MIT", 329 | "optional": true, 330 | "os": [ 331 | "netbsd" 332 | ], 333 | "engines": { 334 | "node": ">=18" 335 | } 336 | }, 337 | "node_modules/@esbuild/openbsd-arm64": { 338 | "version": "0.25.0", 339 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", 340 | "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", 341 | "cpu": [ 342 | "arm64" 343 | ], 344 | "dev": true, 345 | "license": "MIT", 346 | "optional": true, 347 | "os": [ 348 | "openbsd" 349 | ], 350 | "engines": { 351 | "node": ">=18" 352 | } 353 | }, 354 | "node_modules/@esbuild/openbsd-x64": { 355 | "version": "0.25.0", 356 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", 357 | "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", 358 | "cpu": [ 359 | "x64" 360 | ], 361 | "dev": true, 362 | "license": "MIT", 363 | "optional": true, 364 | "os": [ 365 | "openbsd" 366 | ], 367 | "engines": { 368 | "node": ">=18" 369 | } 370 | }, 371 | "node_modules/@esbuild/sunos-x64": { 372 | "version": "0.25.0", 373 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", 374 | "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", 375 | "cpu": [ 376 | "x64" 377 | ], 378 | "dev": true, 379 | "license": "MIT", 380 | "optional": true, 381 | "os": [ 382 | "sunos" 383 | ], 384 | "engines": { 385 | "node": ">=18" 386 | } 387 | }, 388 | "node_modules/@esbuild/win32-arm64": { 389 | "version": "0.25.0", 390 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", 391 | "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", 392 | "cpu": [ 393 | "arm64" 394 | ], 395 | "dev": true, 396 | "license": "MIT", 397 | "optional": true, 398 | "os": [ 399 | "win32" 400 | ], 401 | "engines": { 402 | "node": ">=18" 403 | } 404 | }, 405 | "node_modules/@esbuild/win32-ia32": { 406 | "version": "0.25.0", 407 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", 408 | "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", 409 | "cpu": [ 410 | "ia32" 411 | ], 412 | "dev": true, 413 | "license": "MIT", 414 | "optional": true, 415 | "os": [ 416 | "win32" 417 | ], 418 | "engines": { 419 | "node": ">=18" 420 | } 421 | }, 422 | "node_modules/@esbuild/win32-x64": { 423 | "version": "0.25.0", 424 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", 425 | "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", 426 | "cpu": [ 427 | "x64" 428 | ], 429 | "dev": true, 430 | "license": "MIT", 431 | "optional": true, 432 | "os": [ 433 | "win32" 434 | ], 435 | "engines": { 436 | "node": ">=18" 437 | } 438 | }, 439 | "node_modules/@rollup/rollup-android-arm-eabi": { 440 | "version": "4.34.9", 441 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.9.tgz", 442 | "integrity": "sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==", 443 | "cpu": [ 444 | "arm" 445 | ], 446 | "dev": true, 447 | "license": "MIT", 448 | "optional": true, 449 | "os": [ 450 | "android" 451 | ] 452 | }, 453 | "node_modules/@rollup/rollup-android-arm64": { 454 | "version": "4.34.9", 455 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.9.tgz", 456 | "integrity": "sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==", 457 | "cpu": [ 458 | "arm64" 459 | ], 460 | "dev": true, 461 | "license": "MIT", 462 | "optional": true, 463 | "os": [ 464 | "android" 465 | ] 466 | }, 467 | "node_modules/@rollup/rollup-darwin-arm64": { 468 | "version": "4.34.9", 469 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz", 470 | "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==", 471 | "cpu": [ 472 | "arm64" 473 | ], 474 | "dev": true, 475 | "license": "MIT", 476 | "optional": true, 477 | "os": [ 478 | "darwin" 479 | ] 480 | }, 481 | "node_modules/@rollup/rollup-darwin-x64": { 482 | "version": "4.34.9", 483 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz", 484 | "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==", 485 | "cpu": [ 486 | "x64" 487 | ], 488 | "dev": true, 489 | "license": "MIT", 490 | "optional": true, 491 | "os": [ 492 | "darwin" 493 | ] 494 | }, 495 | "node_modules/@rollup/rollup-freebsd-arm64": { 496 | "version": "4.34.9", 497 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.9.tgz", 498 | "integrity": "sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==", 499 | "cpu": [ 500 | "arm64" 501 | ], 502 | "dev": true, 503 | "license": "MIT", 504 | "optional": true, 505 | "os": [ 506 | "freebsd" 507 | ] 508 | }, 509 | "node_modules/@rollup/rollup-freebsd-x64": { 510 | "version": "4.34.9", 511 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.9.tgz", 512 | "integrity": "sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==", 513 | "cpu": [ 514 | "x64" 515 | ], 516 | "dev": true, 517 | "license": "MIT", 518 | "optional": true, 519 | "os": [ 520 | "freebsd" 521 | ] 522 | }, 523 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 524 | "version": "4.34.9", 525 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.9.tgz", 526 | "integrity": "sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==", 527 | "cpu": [ 528 | "arm" 529 | ], 530 | "dev": true, 531 | "license": "MIT", 532 | "optional": true, 533 | "os": [ 534 | "linux" 535 | ] 536 | }, 537 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 538 | "version": "4.34.9", 539 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.9.tgz", 540 | "integrity": "sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==", 541 | "cpu": [ 542 | "arm" 543 | ], 544 | "dev": true, 545 | "license": "MIT", 546 | "optional": true, 547 | "os": [ 548 | "linux" 549 | ] 550 | }, 551 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 552 | "version": "4.34.9", 553 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz", 554 | "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==", 555 | "cpu": [ 556 | "arm64" 557 | ], 558 | "dev": true, 559 | "license": "MIT", 560 | "optional": true, 561 | "os": [ 562 | "linux" 563 | ] 564 | }, 565 | "node_modules/@rollup/rollup-linux-arm64-musl": { 566 | "version": "4.34.9", 567 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz", 568 | "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==", 569 | "cpu": [ 570 | "arm64" 571 | ], 572 | "dev": true, 573 | "license": "MIT", 574 | "optional": true, 575 | "os": [ 576 | "linux" 577 | ] 578 | }, 579 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 580 | "version": "4.34.9", 581 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.9.tgz", 582 | "integrity": "sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==", 583 | "cpu": [ 584 | "loong64" 585 | ], 586 | "dev": true, 587 | "license": "MIT", 588 | "optional": true, 589 | "os": [ 590 | "linux" 591 | ] 592 | }, 593 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 594 | "version": "4.34.9", 595 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.9.tgz", 596 | "integrity": "sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==", 597 | "cpu": [ 598 | "ppc64" 599 | ], 600 | "dev": true, 601 | "license": "MIT", 602 | "optional": true, 603 | "os": [ 604 | "linux" 605 | ] 606 | }, 607 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 608 | "version": "4.34.9", 609 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.9.tgz", 610 | "integrity": "sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==", 611 | "cpu": [ 612 | "riscv64" 613 | ], 614 | "dev": true, 615 | "license": "MIT", 616 | "optional": true, 617 | "os": [ 618 | "linux" 619 | ] 620 | }, 621 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 622 | "version": "4.34.9", 623 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.9.tgz", 624 | "integrity": "sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==", 625 | "cpu": [ 626 | "s390x" 627 | ], 628 | "dev": true, 629 | "license": "MIT", 630 | "optional": true, 631 | "os": [ 632 | "linux" 633 | ] 634 | }, 635 | "node_modules/@rollup/rollup-linux-x64-gnu": { 636 | "version": "4.34.9", 637 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz", 638 | "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==", 639 | "cpu": [ 640 | "x64" 641 | ], 642 | "dev": true, 643 | "license": "MIT", 644 | "optional": true, 645 | "os": [ 646 | "linux" 647 | ] 648 | }, 649 | "node_modules/@rollup/rollup-linux-x64-musl": { 650 | "version": "4.34.9", 651 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz", 652 | "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==", 653 | "cpu": [ 654 | "x64" 655 | ], 656 | "dev": true, 657 | "license": "MIT", 658 | "optional": true, 659 | "os": [ 660 | "linux" 661 | ] 662 | }, 663 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 664 | "version": "4.34.9", 665 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz", 666 | "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==", 667 | "cpu": [ 668 | "arm64" 669 | ], 670 | "dev": true, 671 | "license": "MIT", 672 | "optional": true, 673 | "os": [ 674 | "win32" 675 | ] 676 | }, 677 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 678 | "version": "4.34.9", 679 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.9.tgz", 680 | "integrity": "sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==", 681 | "cpu": [ 682 | "ia32" 683 | ], 684 | "dev": true, 685 | "license": "MIT", 686 | "optional": true, 687 | "os": [ 688 | "win32" 689 | ] 690 | }, 691 | "node_modules/@rollup/rollup-win32-x64-msvc": { 692 | "version": "4.34.9", 693 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz", 694 | "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==", 695 | "cpu": [ 696 | "x64" 697 | ], 698 | "dev": true, 699 | "license": "MIT", 700 | "optional": true, 701 | "os": [ 702 | "win32" 703 | ] 704 | }, 705 | "node_modules/@types/estree": { 706 | "version": "1.0.6", 707 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 708 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 709 | "dev": true, 710 | "license": "MIT" 711 | }, 712 | "node_modules/asynckit": { 713 | "version": "0.4.0", 714 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 715 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 716 | "dev": true, 717 | "license": "MIT" 718 | }, 719 | "node_modules/autoprefixer": { 720 | "version": "10.4.20", 721 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", 722 | "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", 723 | "dev": true, 724 | "funding": [ 725 | { 726 | "type": "opencollective", 727 | "url": "https://opencollective.com/postcss/" 728 | }, 729 | { 730 | "type": "tidelift", 731 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 732 | }, 733 | { 734 | "type": "github", 735 | "url": "https://github.com/sponsors/ai" 736 | } 737 | ], 738 | "license": "MIT", 739 | "dependencies": { 740 | "browserslist": "^4.23.3", 741 | "caniuse-lite": "^1.0.30001646", 742 | "fraction.js": "^4.3.7", 743 | "normalize-range": "^0.1.2", 744 | "picocolors": "^1.0.1", 745 | "postcss-value-parser": "^4.2.0" 746 | }, 747 | "bin": { 748 | "autoprefixer": "bin/autoprefixer" 749 | }, 750 | "engines": { 751 | "node": "^10 || ^12 || >=14" 752 | }, 753 | "peerDependencies": { 754 | "postcss": "^8.1.0" 755 | } 756 | }, 757 | "node_modules/axios": { 758 | "version": "1.8.1", 759 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.1.tgz", 760 | "integrity": "sha512-NN+fvwH/kV01dYUQ3PTOZns4LWtWhOFCAhQ/pHb88WQ1hNe5V/dvFwc4VJcDL11LT9xSX0QtsR8sWUuyOuOq7g==", 761 | "dev": true, 762 | "license": "MIT", 763 | "dependencies": { 764 | "follow-redirects": "^1.15.6", 765 | "form-data": "^4.0.0", 766 | "proxy-from-env": "^1.1.0" 767 | } 768 | }, 769 | "node_modules/browserslist": { 770 | "version": "4.24.4", 771 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", 772 | "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", 773 | "dev": true, 774 | "funding": [ 775 | { 776 | "type": "opencollective", 777 | "url": "https://opencollective.com/browserslist" 778 | }, 779 | { 780 | "type": "tidelift", 781 | "url": "https://tidelift.com/funding/github/npm/browserslist" 782 | }, 783 | { 784 | "type": "github", 785 | "url": "https://github.com/sponsors/ai" 786 | } 787 | ], 788 | "license": "MIT", 789 | "dependencies": { 790 | "caniuse-lite": "^1.0.30001688", 791 | "electron-to-chromium": "^1.5.73", 792 | "node-releases": "^2.0.19", 793 | "update-browserslist-db": "^1.1.1" 794 | }, 795 | "bin": { 796 | "browserslist": "cli.js" 797 | }, 798 | "engines": { 799 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 800 | } 801 | }, 802 | "node_modules/call-bind-apply-helpers": { 803 | "version": "1.0.2", 804 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 805 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 806 | "dev": true, 807 | "license": "MIT", 808 | "dependencies": { 809 | "es-errors": "^1.3.0", 810 | "function-bind": "^1.1.2" 811 | }, 812 | "engines": { 813 | "node": ">= 0.4" 814 | } 815 | }, 816 | "node_modules/caniuse-lite": { 817 | "version": "1.0.30001701", 818 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001701.tgz", 819 | "integrity": "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==", 820 | "dev": true, 821 | "funding": [ 822 | { 823 | "type": "opencollective", 824 | "url": "https://opencollective.com/browserslist" 825 | }, 826 | { 827 | "type": "tidelift", 828 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 829 | }, 830 | { 831 | "type": "github", 832 | "url": "https://github.com/sponsors/ai" 833 | } 834 | ], 835 | "license": "CC-BY-4.0" 836 | }, 837 | "node_modules/combined-stream": { 838 | "version": "1.0.8", 839 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 840 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 841 | "dev": true, 842 | "license": "MIT", 843 | "dependencies": { 844 | "delayed-stream": "~1.0.0" 845 | }, 846 | "engines": { 847 | "node": ">= 0.8" 848 | } 849 | }, 850 | "node_modules/delayed-stream": { 851 | "version": "1.0.0", 852 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 853 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 854 | "dev": true, 855 | "license": "MIT", 856 | "engines": { 857 | "node": ">=0.4.0" 858 | } 859 | }, 860 | "node_modules/dunder-proto": { 861 | "version": "1.0.1", 862 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 863 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 864 | "dev": true, 865 | "license": "MIT", 866 | "dependencies": { 867 | "call-bind-apply-helpers": "^1.0.1", 868 | "es-errors": "^1.3.0", 869 | "gopd": "^1.2.0" 870 | }, 871 | "engines": { 872 | "node": ">= 0.4" 873 | } 874 | }, 875 | "node_modules/electron-to-chromium": { 876 | "version": "1.5.109", 877 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.109.tgz", 878 | "integrity": "sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==", 879 | "dev": true, 880 | "license": "ISC" 881 | }, 882 | "node_modules/es-define-property": { 883 | "version": "1.0.1", 884 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 885 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 886 | "dev": true, 887 | "license": "MIT", 888 | "engines": { 889 | "node": ">= 0.4" 890 | } 891 | }, 892 | "node_modules/es-errors": { 893 | "version": "1.3.0", 894 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 895 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 896 | "dev": true, 897 | "license": "MIT", 898 | "engines": { 899 | "node": ">= 0.4" 900 | } 901 | }, 902 | "node_modules/es-object-atoms": { 903 | "version": "1.1.1", 904 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 905 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 906 | "dev": true, 907 | "license": "MIT", 908 | "dependencies": { 909 | "es-errors": "^1.3.0" 910 | }, 911 | "engines": { 912 | "node": ">= 0.4" 913 | } 914 | }, 915 | "node_modules/es-set-tostringtag": { 916 | "version": "2.1.0", 917 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 918 | "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 919 | "dev": true, 920 | "license": "MIT", 921 | "dependencies": { 922 | "es-errors": "^1.3.0", 923 | "get-intrinsic": "^1.2.6", 924 | "has-tostringtag": "^1.0.2", 925 | "hasown": "^2.0.2" 926 | }, 927 | "engines": { 928 | "node": ">= 0.4" 929 | } 930 | }, 931 | "node_modules/esbuild": { 932 | "version": "0.25.0", 933 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", 934 | "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", 935 | "dev": true, 936 | "hasInstallScript": true, 937 | "license": "MIT", 938 | "bin": { 939 | "esbuild": "bin/esbuild" 940 | }, 941 | "engines": { 942 | "node": ">=18" 943 | }, 944 | "optionalDependencies": { 945 | "@esbuild/aix-ppc64": "0.25.0", 946 | "@esbuild/android-arm": "0.25.0", 947 | "@esbuild/android-arm64": "0.25.0", 948 | "@esbuild/android-x64": "0.25.0", 949 | "@esbuild/darwin-arm64": "0.25.0", 950 | "@esbuild/darwin-x64": "0.25.0", 951 | "@esbuild/freebsd-arm64": "0.25.0", 952 | "@esbuild/freebsd-x64": "0.25.0", 953 | "@esbuild/linux-arm": "0.25.0", 954 | "@esbuild/linux-arm64": "0.25.0", 955 | "@esbuild/linux-ia32": "0.25.0", 956 | "@esbuild/linux-loong64": "0.25.0", 957 | "@esbuild/linux-mips64el": "0.25.0", 958 | "@esbuild/linux-ppc64": "0.25.0", 959 | "@esbuild/linux-riscv64": "0.25.0", 960 | "@esbuild/linux-s390x": "0.25.0", 961 | "@esbuild/linux-x64": "0.25.0", 962 | "@esbuild/netbsd-arm64": "0.25.0", 963 | "@esbuild/netbsd-x64": "0.25.0", 964 | "@esbuild/openbsd-arm64": "0.25.0", 965 | "@esbuild/openbsd-x64": "0.25.0", 966 | "@esbuild/sunos-x64": "0.25.0", 967 | "@esbuild/win32-arm64": "0.25.0", 968 | "@esbuild/win32-ia32": "0.25.0", 969 | "@esbuild/win32-x64": "0.25.0" 970 | } 971 | }, 972 | "node_modules/escalade": { 973 | "version": "3.2.0", 974 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 975 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 976 | "dev": true, 977 | "license": "MIT", 978 | "engines": { 979 | "node": ">=6" 980 | } 981 | }, 982 | "node_modules/follow-redirects": { 983 | "version": "1.15.9", 984 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 985 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 986 | "dev": true, 987 | "funding": [ 988 | { 989 | "type": "individual", 990 | "url": "https://github.com/sponsors/RubenVerborgh" 991 | } 992 | ], 993 | "license": "MIT", 994 | "engines": { 995 | "node": ">=4.0" 996 | }, 997 | "peerDependenciesMeta": { 998 | "debug": { 999 | "optional": true 1000 | } 1001 | } 1002 | }, 1003 | "node_modules/form-data": { 1004 | "version": "4.0.2", 1005 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", 1006 | "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", 1007 | "dev": true, 1008 | "license": "MIT", 1009 | "dependencies": { 1010 | "asynckit": "^0.4.0", 1011 | "combined-stream": "^1.0.8", 1012 | "es-set-tostringtag": "^2.1.0", 1013 | "mime-types": "^2.1.12" 1014 | }, 1015 | "engines": { 1016 | "node": ">= 6" 1017 | } 1018 | }, 1019 | "node_modules/fraction.js": { 1020 | "version": "4.3.7", 1021 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", 1022 | "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", 1023 | "dev": true, 1024 | "license": "MIT", 1025 | "engines": { 1026 | "node": "*" 1027 | }, 1028 | "funding": { 1029 | "type": "patreon", 1030 | "url": "https://github.com/sponsors/rawify" 1031 | } 1032 | }, 1033 | "node_modules/fsevents": { 1034 | "version": "2.3.3", 1035 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1036 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1037 | "dev": true, 1038 | "hasInstallScript": true, 1039 | "license": "MIT", 1040 | "optional": true, 1041 | "os": [ 1042 | "darwin" 1043 | ], 1044 | "engines": { 1045 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1046 | } 1047 | }, 1048 | "node_modules/function-bind": { 1049 | "version": "1.1.2", 1050 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1051 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1052 | "dev": true, 1053 | "license": "MIT", 1054 | "funding": { 1055 | "url": "https://github.com/sponsors/ljharb" 1056 | } 1057 | }, 1058 | "node_modules/get-intrinsic": { 1059 | "version": "1.3.0", 1060 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 1061 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 1062 | "dev": true, 1063 | "license": "MIT", 1064 | "dependencies": { 1065 | "call-bind-apply-helpers": "^1.0.2", 1066 | "es-define-property": "^1.0.1", 1067 | "es-errors": "^1.3.0", 1068 | "es-object-atoms": "^1.1.1", 1069 | "function-bind": "^1.1.2", 1070 | "get-proto": "^1.0.1", 1071 | "gopd": "^1.2.0", 1072 | "has-symbols": "^1.1.0", 1073 | "hasown": "^2.0.2", 1074 | "math-intrinsics": "^1.1.0" 1075 | }, 1076 | "engines": { 1077 | "node": ">= 0.4" 1078 | }, 1079 | "funding": { 1080 | "url": "https://github.com/sponsors/ljharb" 1081 | } 1082 | }, 1083 | "node_modules/get-proto": { 1084 | "version": "1.0.1", 1085 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 1086 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 1087 | "dev": true, 1088 | "license": "MIT", 1089 | "dependencies": { 1090 | "dunder-proto": "^1.0.1", 1091 | "es-object-atoms": "^1.0.0" 1092 | }, 1093 | "engines": { 1094 | "node": ">= 0.4" 1095 | } 1096 | }, 1097 | "node_modules/gopd": { 1098 | "version": "1.2.0", 1099 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 1100 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 1101 | "dev": true, 1102 | "license": "MIT", 1103 | "engines": { 1104 | "node": ">= 0.4" 1105 | }, 1106 | "funding": { 1107 | "url": "https://github.com/sponsors/ljharb" 1108 | } 1109 | }, 1110 | "node_modules/has-symbols": { 1111 | "version": "1.1.0", 1112 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 1113 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 1114 | "dev": true, 1115 | "license": "MIT", 1116 | "engines": { 1117 | "node": ">= 0.4" 1118 | }, 1119 | "funding": { 1120 | "url": "https://github.com/sponsors/ljharb" 1121 | } 1122 | }, 1123 | "node_modules/has-tostringtag": { 1124 | "version": "1.0.2", 1125 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 1126 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 1127 | "dev": true, 1128 | "license": "MIT", 1129 | "dependencies": { 1130 | "has-symbols": "^1.0.3" 1131 | }, 1132 | "engines": { 1133 | "node": ">= 0.4" 1134 | }, 1135 | "funding": { 1136 | "url": "https://github.com/sponsors/ljharb" 1137 | } 1138 | }, 1139 | "node_modules/hasown": { 1140 | "version": "2.0.2", 1141 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1142 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1143 | "dev": true, 1144 | "license": "MIT", 1145 | "dependencies": { 1146 | "function-bind": "^1.1.2" 1147 | }, 1148 | "engines": { 1149 | "node": ">= 0.4" 1150 | } 1151 | }, 1152 | "node_modules/laravel-vite-plugin": { 1153 | "version": "1.2.0", 1154 | "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.2.0.tgz", 1155 | "integrity": "sha512-R0pJ+IcTVeqEMoKz/B2Ij57QVq3sFTABiFmb06gAwFdivbOgsUtuhX6N2MGLEArajrS3U5JbberzwOe7uXHMHQ==", 1156 | "dev": true, 1157 | "license": "MIT", 1158 | "dependencies": { 1159 | "picocolors": "^1.0.0", 1160 | "vite-plugin-full-reload": "^1.1.0" 1161 | }, 1162 | "bin": { 1163 | "clean-orphaned-assets": "bin/clean.js" 1164 | }, 1165 | "engines": { 1166 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 1167 | }, 1168 | "peerDependencies": { 1169 | "vite": "^5.0.0 || ^6.0.0" 1170 | } 1171 | }, 1172 | "node_modules/math-intrinsics": { 1173 | "version": "1.1.0", 1174 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 1175 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 1176 | "dev": true, 1177 | "license": "MIT", 1178 | "engines": { 1179 | "node": ">= 0.4" 1180 | } 1181 | }, 1182 | "node_modules/mime-db": { 1183 | "version": "1.52.0", 1184 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1185 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1186 | "dev": true, 1187 | "license": "MIT", 1188 | "engines": { 1189 | "node": ">= 0.6" 1190 | } 1191 | }, 1192 | "node_modules/mime-types": { 1193 | "version": "2.1.35", 1194 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1195 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1196 | "dev": true, 1197 | "license": "MIT", 1198 | "dependencies": { 1199 | "mime-db": "1.52.0" 1200 | }, 1201 | "engines": { 1202 | "node": ">= 0.6" 1203 | } 1204 | }, 1205 | "node_modules/nanoid": { 1206 | "version": "3.3.8", 1207 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 1208 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 1209 | "dev": true, 1210 | "funding": [ 1211 | { 1212 | "type": "github", 1213 | "url": "https://github.com/sponsors/ai" 1214 | } 1215 | ], 1216 | "license": "MIT", 1217 | "bin": { 1218 | "nanoid": "bin/nanoid.cjs" 1219 | }, 1220 | "engines": { 1221 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1222 | } 1223 | }, 1224 | "node_modules/node-releases": { 1225 | "version": "2.0.19", 1226 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", 1227 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", 1228 | "dev": true, 1229 | "license": "MIT" 1230 | }, 1231 | "node_modules/normalize-range": { 1232 | "version": "0.1.2", 1233 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 1234 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 1235 | "dev": true, 1236 | "license": "MIT", 1237 | "engines": { 1238 | "node": ">=0.10.0" 1239 | } 1240 | }, 1241 | "node_modules/picocolors": { 1242 | "version": "1.1.1", 1243 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1244 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1245 | "dev": true, 1246 | "license": "ISC" 1247 | }, 1248 | "node_modules/picomatch": { 1249 | "version": "2.3.1", 1250 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1251 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1252 | "dev": true, 1253 | "license": "MIT", 1254 | "engines": { 1255 | "node": ">=8.6" 1256 | }, 1257 | "funding": { 1258 | "url": "https://github.com/sponsors/jonschlinkert" 1259 | } 1260 | }, 1261 | "node_modules/postcss": { 1262 | "version": "8.5.3", 1263 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 1264 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1265 | "dev": true, 1266 | "funding": [ 1267 | { 1268 | "type": "opencollective", 1269 | "url": "https://opencollective.com/postcss/" 1270 | }, 1271 | { 1272 | "type": "tidelift", 1273 | "url": "https://tidelift.com/funding/github/npm/postcss" 1274 | }, 1275 | { 1276 | "type": "github", 1277 | "url": "https://github.com/sponsors/ai" 1278 | } 1279 | ], 1280 | "license": "MIT", 1281 | "dependencies": { 1282 | "nanoid": "^3.3.8", 1283 | "picocolors": "^1.1.1", 1284 | "source-map-js": "^1.2.1" 1285 | }, 1286 | "engines": { 1287 | "node": "^10 || ^12 || >=14" 1288 | } 1289 | }, 1290 | "node_modules/postcss-value-parser": { 1291 | "version": "4.2.0", 1292 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1293 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 1294 | "dev": true, 1295 | "license": "MIT" 1296 | }, 1297 | "node_modules/proxy-from-env": { 1298 | "version": "1.1.0", 1299 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1300 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 1301 | "dev": true, 1302 | "license": "MIT" 1303 | }, 1304 | "node_modules/rollup": { 1305 | "version": "4.34.9", 1306 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.9.tgz", 1307 | "integrity": "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==", 1308 | "dev": true, 1309 | "license": "MIT", 1310 | "dependencies": { 1311 | "@types/estree": "1.0.6" 1312 | }, 1313 | "bin": { 1314 | "rollup": "dist/bin/rollup" 1315 | }, 1316 | "engines": { 1317 | "node": ">=18.0.0", 1318 | "npm": ">=8.0.0" 1319 | }, 1320 | "optionalDependencies": { 1321 | "@rollup/rollup-android-arm-eabi": "4.34.9", 1322 | "@rollup/rollup-android-arm64": "4.34.9", 1323 | "@rollup/rollup-darwin-arm64": "4.34.9", 1324 | "@rollup/rollup-darwin-x64": "4.34.9", 1325 | "@rollup/rollup-freebsd-arm64": "4.34.9", 1326 | "@rollup/rollup-freebsd-x64": "4.34.9", 1327 | "@rollup/rollup-linux-arm-gnueabihf": "4.34.9", 1328 | "@rollup/rollup-linux-arm-musleabihf": "4.34.9", 1329 | "@rollup/rollup-linux-arm64-gnu": "4.34.9", 1330 | "@rollup/rollup-linux-arm64-musl": "4.34.9", 1331 | "@rollup/rollup-linux-loongarch64-gnu": "4.34.9", 1332 | "@rollup/rollup-linux-powerpc64le-gnu": "4.34.9", 1333 | "@rollup/rollup-linux-riscv64-gnu": "4.34.9", 1334 | "@rollup/rollup-linux-s390x-gnu": "4.34.9", 1335 | "@rollup/rollup-linux-x64-gnu": "4.34.9", 1336 | "@rollup/rollup-linux-x64-musl": "4.34.9", 1337 | "@rollup/rollup-win32-arm64-msvc": "4.34.9", 1338 | "@rollup/rollup-win32-ia32-msvc": "4.34.9", 1339 | "@rollup/rollup-win32-x64-msvc": "4.34.9", 1340 | "fsevents": "~2.3.2" 1341 | } 1342 | }, 1343 | "node_modules/source-map-js": { 1344 | "version": "1.2.1", 1345 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1346 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1347 | "dev": true, 1348 | "license": "BSD-3-Clause", 1349 | "engines": { 1350 | "node": ">=0.10.0" 1351 | } 1352 | }, 1353 | "node_modules/update-browserslist-db": { 1354 | "version": "1.1.3", 1355 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", 1356 | "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", 1357 | "dev": true, 1358 | "funding": [ 1359 | { 1360 | "type": "opencollective", 1361 | "url": "https://opencollective.com/browserslist" 1362 | }, 1363 | { 1364 | "type": "tidelift", 1365 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1366 | }, 1367 | { 1368 | "type": "github", 1369 | "url": "https://github.com/sponsors/ai" 1370 | } 1371 | ], 1372 | "license": "MIT", 1373 | "dependencies": { 1374 | "escalade": "^3.2.0", 1375 | "picocolors": "^1.1.1" 1376 | }, 1377 | "bin": { 1378 | "update-browserslist-db": "cli.js" 1379 | }, 1380 | "peerDependencies": { 1381 | "browserslist": ">= 4.21.0" 1382 | } 1383 | }, 1384 | "node_modules/vite": { 1385 | "version": "6.2.0", 1386 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", 1387 | "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", 1388 | "dev": true, 1389 | "license": "MIT", 1390 | "dependencies": { 1391 | "esbuild": "^0.25.0", 1392 | "postcss": "^8.5.3", 1393 | "rollup": "^4.30.1" 1394 | }, 1395 | "bin": { 1396 | "vite": "bin/vite.js" 1397 | }, 1398 | "engines": { 1399 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 1400 | }, 1401 | "funding": { 1402 | "url": "https://github.com/vitejs/vite?sponsor=1" 1403 | }, 1404 | "optionalDependencies": { 1405 | "fsevents": "~2.3.3" 1406 | }, 1407 | "peerDependencies": { 1408 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 1409 | "jiti": ">=1.21.0", 1410 | "less": "*", 1411 | "lightningcss": "^1.21.0", 1412 | "sass": "*", 1413 | "sass-embedded": "*", 1414 | "stylus": "*", 1415 | "sugarss": "*", 1416 | "terser": "^5.16.0", 1417 | "tsx": "^4.8.1", 1418 | "yaml": "^2.4.2" 1419 | }, 1420 | "peerDependenciesMeta": { 1421 | "@types/node": { 1422 | "optional": true 1423 | }, 1424 | "jiti": { 1425 | "optional": true 1426 | }, 1427 | "less": { 1428 | "optional": true 1429 | }, 1430 | "lightningcss": { 1431 | "optional": true 1432 | }, 1433 | "sass": { 1434 | "optional": true 1435 | }, 1436 | "sass-embedded": { 1437 | "optional": true 1438 | }, 1439 | "stylus": { 1440 | "optional": true 1441 | }, 1442 | "sugarss": { 1443 | "optional": true 1444 | }, 1445 | "terser": { 1446 | "optional": true 1447 | }, 1448 | "tsx": { 1449 | "optional": true 1450 | }, 1451 | "yaml": { 1452 | "optional": true 1453 | } 1454 | } 1455 | }, 1456 | "node_modules/vite-plugin-full-reload": { 1457 | "version": "1.2.0", 1458 | "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", 1459 | "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", 1460 | "dev": true, 1461 | "license": "MIT", 1462 | "dependencies": { 1463 | "picocolors": "^1.0.0", 1464 | "picomatch": "^2.3.1" 1465 | } 1466 | } 1467 | } 1468 | } 1469 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "dev": "vite", 6 | "build": "vite build" 7 | }, 8 | "devDependencies": { 9 | "vite": "^6.0.0", 10 | "axios": "^1.6.4", 11 | "autoprefixer": "^10.4.16", 12 | "laravel-vite-plugin": "^1.0.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | tests/Feature 10 | 11 | 12 | 13 | 14 | app 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /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 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Send Requests To Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevebauman/curlwind/9a38a7c0a80d8e311a12bf980fd678d66b1558a7/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevebauman/curlwind/9a38a7c0a80d8e311a12bf980fd678d66b1558a7/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevebauman/curlwind/9a38a7c0a80d8e311a12bf980fd678d66b1558a7/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #da532c 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevebauman/curlwind/9a38a7c0a80d8e311a12bf980fd678d66b1558a7/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevebauman/curlwind/9a38a7c0a80d8e311a12bf980fd678d66b1558a7/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevebauman/curlwind/9a38a7c0a80d8e311a12bf980fd678d66b1558a7/public/favicon.ico -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class); 50 | 51 | $response = $kernel->handle( 52 | $request = Request::capture() 53 | )->send(); 54 | 55 | $kernel->terminate($request, $response); 56 | -------------------------------------------------------------------------------- /public/logo-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/logo-mini.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevebauman/curlwind/9a38a7c0a80d8e311a12bf980fd678d66b1558a7/public/mstile-150x150.png -------------------------------------------------------------------------------- /public/og_facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevebauman/curlwind/9a38a7c0a80d8e311a12bf980fd678d66b1558a7/public/og_facebook.png -------------------------------------------------------------------------------- /public/og_twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevebauman/curlwind/9a38a7c0a80d8e311a12bf980fd678d66b1558a7/public/og_twitter.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.14, written by Peter Selinger 2001-2017 9 | 10 | 12 | 26 | 64 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /public/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Curlwind", 3 | "short_name": "Curlwind", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /resources/examples/additional-parameters.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/examples/attach-parameters.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/examples/enable-plugins.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/examples/exclude-preflight.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/examples/insert-tag.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /resources/examples/prefixed-utilities.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/examples/receive-stylesheet.css: -------------------------------------------------------------------------------- 1 | /* output.css */ 2 | 3 | .p-0 { 4 | padding: 0px; 5 | } 6 | 7 | .p-1 { 8 | padding: 0.25rem; 9 | } 10 | 11 | /* ... */ 12 | 13 | .m-0 { 14 | margin: 0px; 15 | } 16 | 17 | .m-1 { 18 | margin: 0.25rem; 19 | } 20 | 21 | /* ... */ 22 | -------------------------------------------------------------------------------- /resources/examples/unminified-css.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | import './bootstrap'; 2 | -------------------------------------------------------------------------------- /resources/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | /** 2 | * We'll load the axios HTTP library which allows us to easily issue requests 3 | * to our Laravel back-end. This library automatically handles sending the 4 | * CSRF token as a header based on the value of the "XSRF" token cookie. 5 | */ 6 | 7 | import axios from 'axios'; 8 | window.axios = axios; 9 | 10 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 11 | 12 | /** 13 | * Echo exposes an expressive API for subscribing to channels and listening 14 | * for events that are broadcast by Laravel. Echo and event broadcasting 15 | * allows your team to easily build robust real-time web applications. 16 | */ 17 | 18 | // import Echo from 'laravel-echo'; 19 | 20 | // import Pusher from 'pusher-js'; 21 | // window.Pusher = Pusher; 22 | 23 | // window.Echo = new Echo({ 24 | // broadcaster: 'pusher', 25 | // key: import.meta.env.VITE_PUSHER_APP_KEY, 26 | // cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1', 27 | // wsHost: import.meta.env.VITE_PUSHER_HOST ? import.meta.env.VITE_PUSHER_HOST : `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`, 28 | // wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80, 29 | // wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443, 30 | // forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https', 31 | // enabledTransports: ['ws', 'wss'], 32 | // }); 33 | -------------------------------------------------------------------------------- /resources/views/components/error.blade.php: -------------------------------------------------------------------------------- 1 | @props(['title', 'code', 'exception']) 2 | 3 | 4 |
5 |
6 |
7 | Curlwind Logo 8 |
9 | 10 |
11 |

{{ $code }} - {{ $title }}

12 |
13 | 14 | @isset($exception) 15 |
16 | {{ $exception->getMessage() }} 17 |
18 | @endisset 19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /resources/views/components/layout.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Curlwind | Tailwind Utility Generator 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 80 | 81 | 93 | 94 | 95 | 96 | {{ $slot }} 97 | 98 | -------------------------------------------------------------------------------- /resources/views/components/step.blade.php: -------------------------------------------------------------------------------- 1 | @props([ 2 | 'title', 3 | 'number', 4 | 'example', 5 | 'language', 6 | 'description', 7 | 'end' => false, 8 | ]) 9 | 10 |
merge(['class' => 'relative mx-auto w-full max-w-3xl px-5']) }}> 11 |
12 |
13 |
14 | {{ $number }} 15 |
16 | 17 |
{{ $title }}
18 |
19 | 20 |
21 |
!$end ?? true 24 | ])>
25 | 26 |
27 |
28 | {{ $description }} 29 |
30 | 31 |
32 |
33 |
34 |
35 |
36 | -------------------------------------------------------------------------------- /resources/views/errors/401.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/errors/402.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/errors/403.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/errors/404.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/errors/419.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/errors/422.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/errors/429.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/errors/500.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/errors/503.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/welcome.blade.php: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | 5 | Curlwind Logo 6 | 7 |
8 | 9 |
10 |

11 | No-build Tailwind. 12 |

13 | 14 |

15 | Get the CSS utilities you want. Nothing you don't. 16 |

17 | 18 |

19 | Curlwind allows you to generate Tailwind stylesheets on demand to get only the CSS utilities you need. Generated stylesheets are cached indefinitely so your site stays fast. 20 |

21 | 22 | 46 | 47 | 55 | 56 | 64 | 65 | 74 | 75 | 84 | 85 | 94 | 95 | 104 | 105 | 114 | 115 | 124 |
125 |
126 | 127 |
128 |
129 | Made with ❤️ by Steve Bauman 130 |
131 | 132 |
133 | Code styled beautifully using Torchlight by Aaron Francis 134 |
135 |
136 |
137 | -------------------------------------------------------------------------------- /routes/api.php: -------------------------------------------------------------------------------- 1 | get('/user', function (Request $request) { 18 | return $request->user(); 19 | }); 20 | -------------------------------------------------------------------------------- /routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 18 | }); 19 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 19 | })->purpose('Display an inspiring quote'); 20 | -------------------------------------------------------------------------------- /routes/web.php: -------------------------------------------------------------------------------- 1 | name('cdn')->get('/', GenerateController::class); 23 | 24 | Route::get('/', function () { 25 | return view('welcome'); 26 | }); 27 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/css/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | compiled.php 2 | config.php 3 | down 4 | events.scanned.php 5 | maintenance.php 6 | routes.php 7 | routes.scanned.php 8 | schedule-* 9 | services.json 10 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/js/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 18 | 19 | return $app; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/Feature/GenerateTest.php: -------------------------------------------------------------------------------- 1 | get(route('cdn'))->assertHeader('Content-Type', 'text/css; charset=UTF-8'); 10 | }); 11 | 12 | test('it returns error when given invalid characters', function (string $classes) { 13 | $this->get(route('cdn', ['classes' => $classes]))->assertUnprocessable(); 14 | })->with([ 15 | '&', 16 | '$', 17 | '%', 18 | '^', 19 | '@', 20 | '(', 21 | ')', 22 | '_', 23 | '#', 24 | '"', 25 | "'", 26 | '!', 27 | '[', 28 | ']', 29 | '{', 30 | '}', 31 | '\\', 32 | '=', 33 | ';', 34 | ':', 35 | '<', 36 | '>', 37 | '?', 38 | '`', 39 | '~', 40 | 'a b', 41 | ]); 42 | 43 | test('it only allows specific characters', function (string $classes) { 44 | $this->get(route('cdn', ['classes' => $classes]))->assertSuccessful(); 45 | })->with([ 46 | '-', 47 | 'a', 48 | '/', 49 | '-*-', 50 | ]); 51 | 52 | test('it generates preflight by default', function () { 53 | $response = $this->get(route('cdn')) 54 | ->assertSuccessful() 55 | ->streamedContent(); 56 | 57 | expect(Str::is('* tailwindcss v*.*.*', $response))->toBeTrue(); 58 | }); 59 | 60 | 61 | test('it omits preflight when disabled', function () { 62 | $response = $this->get(route('cdn', ['preflight' => false])) 63 | ->assertSuccessful() 64 | ->streamedContent(); 65 | 66 | expect(Str::is('* tailwindcss v*.*.*', $response))->toBeFalse(); 67 | }); 68 | 69 | test('it caches js and css', function () { 70 | artisan('cache:wipe'); 71 | 72 | expect(Storage::disk('js')->allFiles())->toHaveCount(1); 73 | expect(Storage::disk('css')->allFiles())->toHaveCount(1); 74 | 75 | $this->get(route('cdn'))->assertSuccessful(); 76 | 77 | expect(Storage::disk('js')->allFiles())->toHaveCount(2); 78 | expect(Storage::disk('css')->allFiles())->toHaveCount(2); 79 | }); 80 | 81 | test('it can generate tailwind utilities unminified', function () { 82 | $content = $this->get(route('cdn', ['minify' => false, 'classes' => 'p-0'])) 83 | ->assertSuccessful() 84 | ->streamedContent(); 85 | 86 | expect($content)->toContain(<<get(route('cdn', ['classes' => 'p-0,m-0'])) 95 | ->assertSuccessful() 96 | ->streamedContent(); 97 | 98 | expect($content)->toContain('.p-0{padding:0}'); 99 | expect($content)->toContain('.m-0{margin:0}'); 100 | }); 101 | 102 | test('it can generate tailwind utilities with forward slashes', function () { 103 | $content = $this->get(route('cdn', ['classes' => 'w-1/3'])) 104 | ->assertSuccessful() 105 | ->streamedContent(); 106 | 107 | expect($content)->toContain('.w-1\\/3{width:33.333333%}'); 108 | }); 109 | 110 | test('it can generate tailwind utilities with an asterisk to match multiple', function () { 111 | $content = $this->get(route('cdn', ['classes' => 'w-*/*'])) 112 | ->assertSuccessful() 113 | ->streamedContent(); 114 | 115 | $classes = [ 116 | 'w-1\/2', 117 | 'w-1\/3', 118 | 'w-2\/3', 119 | 'w-1\/4', 120 | 'w-2\/4', 121 | 'w-3\/4', 122 | 'w-1\/5', 123 | 'w-2\/5', 124 | 'w-3\/5', 125 | 'w-4\/5', 126 | 'w-1\/6', 127 | 'w-2\/6', 128 | 'w-3\/6', 129 | 'w-4\/6', 130 | 'w-5\/6', 131 | 'w-1\/12', 132 | 'w-2\/12', 133 | 'w-3\/12', 134 | 'w-4\/12', 135 | 'w-5\/12', 136 | 'w-6\/12', 137 | 'w-7\/12', 138 | 'w-8\/12', 139 | 'w-9\/12', 140 | 'w-10\/12', 141 | 'w-11\/12', 142 | ]; 143 | 144 | foreach ($classes as $class) { 145 | expect($content)->toContain(".$class"); 146 | } 147 | }); 148 | 149 | test('it can generate tailwind utilities with an asterisk to match multiple with variants', function () { 150 | $content = $this->get(route('cdn', ['classes' => 'w-0:sm|md|hover'])) 151 | ->assertSuccessful() 152 | ->streamedContent(); 153 | 154 | expect($content)->toContain("w-0:hover"); 155 | expect($content)->toContain("sm\:w-0"); 156 | expect($content)->toContain("md\:w-0"); 157 | }); 158 | 159 | 160 | test('it can generate tailwind utility with variant having hyphen', function () { 161 | $content = $this->get(route('cdn', ['classes' => 'p-0:group-hover'])) 162 | ->assertSuccessful() 163 | ->streamedContent(); 164 | 165 | expect($content)->toContain("group-hover\:p-0"); 166 | }); 167 | 168 | test('it can generate with built-in plugins', function (string $plugin, string $classes, string $expected) { 169 | $content = $this->get(route('cdn', ['classes' => $classes, 'plugins' => $plugin])) 170 | ->assertSuccessful() 171 | ->streamedContent(); 172 | 173 | expect($content)->toContain($expected); 174 | })->with([ 175 | ['forms', '', 'select'], 176 | ['typography', 'prose', '.prose'], 177 | ['aspect-ratio', 'aspect-w-16', '.aspect-w-16'], 178 | ['container-queries', 'container', '.container'], 179 | ]); 180 | -------------------------------------------------------------------------------- /tests/Feature/WelcomeTest.php: -------------------------------------------------------------------------------- 1 | get('/')->assertSuccessful(); 5 | }); 6 | -------------------------------------------------------------------------------- /tests/Pest.php: -------------------------------------------------------------------------------- 1 | in('Feature'); 18 | 19 | /* 20 | |-------------------------------------------------------------------------- 21 | | Expectations 22 | |-------------------------------------------------------------------------- 23 | | 24 | | When you're writing tests, you often need to check that values meet certain conditions. The 25 | | "expect()" function gives you access to a set of "expectations" methods that you can use 26 | | to assert different things. Of course, you may extend the Expectation API at any time. 27 | | 28 | */ 29 | 30 | expect()->extend('toBeOne', function () { 31 | return $this->toBe(1); 32 | }); 33 | 34 | /* 35 | |-------------------------------------------------------------------------- 36 | | Functions 37 | |-------------------------------------------------------------------------- 38 | | 39 | | While Pest is very powerful out-of-the-box, you may have some testing code specific to your 40 | | project that you don't want to repeat in every file. Here you can also expose helpers as 41 | | global functions to help you to reduce the number of lines of code in your test files. 42 | | 43 | */ 44 | 45 | function something() 46 | { 47 | // .. 48 | } 49 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 |